OpenClaw这个开源项目,在个人自动化与任务调度圈子里热度一直在线。它把任务编排、插件管理、多终端数据同步整合成一个轻量级服务,安装边界清晰,部署完就能感受到它的调度与插件生态比裸写脚本省心太多。但很多朋友卡在第一步:不是不会装,而是教程太碎,照着一个装完发现端口不对、数据库连不上、插件不加载,来回折腾。这篇指南我换个写法,以一次完整的从零到一部署为主线,把环境准备、源码安装、配置初始化、故障排查到systemd自启和维护加固,整个链路挨个过一遍。不管你是想先验证功能,还是准备长期跑生产,跟着走完都能得到一套能落地、敢升级的OpenClaw环境。1. 部署前先想清楚:结构与选型1.1 OpenClaw是什么,跑起来依赖哪几块OpenClaw拆开看,核心是三块组件:调度引擎,负责接收外部消息或定时触发信号,按预置规则把任务分发给对应插件;插件运行时,真正执行具体工作,比如发通知、处理数据、调用接口;管理面板,提供Web界面查看状态、配置插件、观察任务日志。你可以把它想象成一个“交通指挥中心”:每天收到的任务就像不同方向的车辆,调度引擎按规则分拣,插件是各条车道上的执行者。普通脚本是“一条路走到黑”,而OpenClaw是一个能持续运行的平台,这也是为什么这类工具比一次性脚本更适合装到服务器上长期跑。同一台机器可以承载这三块组件,它们各自落日志、互不干扰。插件按需安装,不需要全部开启,面板则负责把配置、日志、状态集中呈现。理解了这几个组件,后面配置时就不会被一堆参数绕晕。1.2 方案对比:三种安装方式的取舍网上能看到的部署方式大致三种:源码安装、容器安装、系统包管理器安装。我实际用下来的感受如下:方式优点容易踩的坑适合谁源码安装可控性强、日志路径自己定、升级回滚方便依赖要手动装、首次配置多一点想长期维护、做二次开发的人容器安装一条命令跑起来、隔离性好数据卷、网络模式、重启策略都要额外学快速体验、临时验证的人系统包管理器安装最快版本往往滞后、定制困难对版本不敏感的人我个人的选择是源码优先,尤其生产环境。理由有三:日志位置由我控制,排查问题顺藤摸瓜;目录结构标准化,备份恢复可以写成脚本;跨版本升级时,可以按版本逐个迁移,坏了也好回滚。容器方案我见过一个很典型的翻车案例:服务在容器里跑得好好的,但数据默认写在容器内层,结果升级时忘记把数据卷挂出来,容器一删数据全没。不是容器不好,而是边界和概念没理清楚前,直接上容器反而增加心智负担。想清楚自己是要“快速试试”还是“跑长期服务”,选型就不会纠结。1.3 目录规划与运行账号:先定规矩再动手部署前先把目录规划好。我的标准布局长这样:/opt/openclaw/ ├── app/ 程序代码 ├── data/ 数据库与缓存 ├── logs/ 运行日志 ├── plugins/ 插件目录 └── backup/ 备份产物别把文件全堆在一个目录里。我之前图省事,程序、数据、日志全放在一个目录,后来数据盘写满才发现日志已经涨到几个G,清理时又怕误删程序文件,非常被动。分开之后,数据归数据、日志归日志、程序归程序,磁盘清理和权限控制都会顺畅很多。运行账号方面,建议单独建一个普通系统用户,不要用root直接跑。服务出bug或者被人利用时,一个最小权限账号能把破坏范围压到最低。后面章节会给出具体命令,这里先把这个原则立住。2. 环境准备:硬件、系统与依赖一次到位2.1 硬件配置怎么定先给一张参考表,方便对号入座:场景CPU内存磁盘最小验证2核4GB20GB日常使用4核8GB40GB SSD插件全开+高并发8核16GB100GB+为什么磁盘要求偏高?主要不是程序本身,而是三类东西会持续占空间:日志文件、数据库体积、插件运行时的缓存文件。我见过一个跑了好几个月的实例,数据本身只有几百MB,日志和缓存加起来反而2个G,所以磁盘宁可宽松一点。内存方面,最小配置能跑通安装和基础任务,但一旦插件开多,Node或者Python子进程同时起来,4GB会显得很紧。SSD对数据库初始化和面板加载速度提升明显,预算允许时别用机械盘。2.2 操作系统与基础运行时我以Ubuntu 22.04 LTS为例,其他Debian系版本都能对齐。CentOS、Rocky这类RPM系系统把包管理器换成yum/dnf即可。先把基础包装上:sudo apt update sudo apt install -y python3 python3-venv python3-pip build-essential libssl-dev libffi-dev curl unzip逐个说下为什么需要:python3-venv:后面要用虚拟环境隔离依赖;build-essential:编译部分C扩展时必须的gcc和make;libssl-dev、libffi-dev:pip安装某些依赖时的头文件,缺了会报经典的“headers or library files could not be found”;curl、unzip:下载和解析安装包用。如果你计划使用依赖Node.js运行时的插件,再把Node装一下:curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs装完后分别验证:python3 --version node -vPython尽量用3.10及以上版本,太老的版本在依赖兼容上会比较痛苦。2.3 数据库选型:先用SQLite,再考虑PostgreSQL首次安装,直接用SQLite就能跑通整个链路,零成本、零维护。配置里写一行就行:database: url: "sqlite:///opt/openclaw/data/openclaw.db"日常任务量下,SQLite完全够用。但一旦并发上来了,或者计划多实例共享数据,就应该迁到PostgreSQL:database: url: "postgresql://openclaw:强密码@127.0.0.1:5432/openclaw"装PostgreSQL的命令:sudo apt install -y postgresql sudo -u postgres createuser --pwprompt openclaw sudo -u postgres createdb -O openclaw openclaw为什么“先用SQLite,后迁PG”?核心逻辑是先想办法把安装链路跑通,不要一上来就引入数据库服务的复杂度;等日志和任务量明显增长,再迁移。OpenClaw自带数据导出导入脚本,切换成本没那么高。迁移前记得备份SQLite文件,这一步永远不要省。2.4 端口规划与防火墙:安装前就定好端口在部署前定好,后面配置和排查都方便。本文统一按以下规划来:8080:管理面板8081:API入口防火墙规则示例:sudo ufw allow 22/tcp sudo ufw allow 8080/tcp sudo ufw allow 8081/tcp sudo ufw enable这里有个实战中的重点:管理面板不要直接暴露到公网。要么通过内网统一入口访问,要么在网关层用Nginx做HTTPS加密中转,把8080和8081收敛到443再对外服务。直接把后台登录页发给全世界,被暴力破解只是时间问题。另外,管理面板端口是全局可访问的,一定要设置强密码登录。数据库端口不要对公网开放,否则等于把数据目录挂在门口。3. 动手安装:从下载、配置到跑通全流程3.1 获取安装包:下载与校验先创建运行用户和目录结构:sudo useradd -r -s /usr/sbin/nologin openclaw sudo mkdir -p /opt/openclaw/{app,data,logs,plugins,backup}-r表示创建系统账号,-s /usr/sbin/nologin表示禁止登录,这样即使服务被入侵,也无法通过该账号拿到shell。下载release包并校验:curl -L -o /tmp/openclaw-2.6.1.tgz https://mirror.example.com/openclaw/releases/2.6.1/openclaw-2.6.1.tgz cd /tmp sha256sum openclaw-2.6.1.tgz拿到校验值后,和官方release页面公示的SHA256核对,一致再继续。这一步防的是下载源被污染,属于基本安全习惯。确认无误后解压:tar -xzf openclaw-2.6.1.tgz -C /opt/openclaw/app --strip-components=1--strip-components=1是因为压缩包里通常有一层顶层目录,加上这个参数能直接解压到目标路径,少一层嵌套。3.2 虚拟环境与依赖安装进入程序目录,创建Python虚拟环境:cd /opt/openclaw/app python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt虚拟环境的作用是给OpenClaw一套独立的Python运行空间。所有依赖装进venv目录,不污染系统Python,也不会被后期系统升级搞乱。直接拿系统pip硬装,早晚会碰到依赖打架。如果依赖安装速度很慢,可以配置pip使用就近的可信软件源,加速效果立竿见影。装完后不要关闭虚拟环境,后面所有openclaw命令都要在这个环境里执行。3.3 配置文件config.yaml逐项拆解启动前先写配置。最简可用的config.yaml如下:app: port: 8080 secret_key: "请用随机字符串替换" debug: false database: url: "sqlite:///opt/openclaw/data/openclaw.db" scheduler: enable: true interval: 30 timezone: "Asia/Shanghai" plugins: dir: "/opt/openclaw/plugins" auto_load: true network: api_port: 8081逐项说明:app.secret_key:会话签名密钥,必须用随机值。生成命令:openssl rand -hex 32不要用“123456”这种字符串,否则面板会话很容易被伪造。app.port:管理面板监听端口,对应防火墙放行的8080。app.debug:生产环境务必设为false,打开debug会输出大量敏感信息。database.url:数据库连接串。SQLite路径必须写成绝对路径,避免工作目录变化导致找不到库。scheduler.interval:调度引擎扫描间隔,单位秒。不要设成1,频率没有意义,30-60是比较稳妥的值。scheduler.timezone:一定要显式配置。不配置时定时任务会按系统时区算,迁移服务器后任务触发时间可能整个乱掉。plugins.dir:插件目录,建议用绝对路径。network.api_port:API入口,和管理面板错开端口。配置文件写完后,给它单独备份一份:sudo cp config.yaml /opt/openclaw/backup/config.yaml.bak并确认config.yaml能被openclaw用户读取。3.4 初始化数据库与迁移一切就绪后,执行初始化:cd /opt/openclaw/app source venv/bin/activate openclaw init-db --config config.yaml openclaw migrate --config config.yamlinit-db负责首次建表,migrate负责把数据库结构升级到当前版本。migrate是幂等的,可以重复执行;init-db一般只在全新库上跑一次。验证表结构:sqlite3 /opt/openclaw/data/openclaw.db ".tables"能看到类似alert_rule、scheduler_job、plugin_record之类的表,说明数据库这层已经通了。3.5 首次启动与验证第一次建议前台启动,方便直接看日志:cd /opt/openclaw/app source venv/bin/activate openclaw server --config config.yaml看到类似输出:INFO 管理面板已监听 8080 INFO API入口已监听 8081说明两个端口都起来了。浏览器访问http://服务器IP:8080,首次访问会进入初始化引导,设置管理员账号和密码。然后用一个最简单的任务验证调度链路:在面板里新建一个定时任务,让系统每5分钟打印一句测试日志,观察任务记录是否按预期执行。如果能看到执行记录,整条链路就算完全打通了。确认没问题后,Ctrl+C停掉前台进程,进入下一步正式托管。4. 安装路上的坑:常见问题与排查实录4.1 端口被占用:Address already in use启动时报这个错最常见:[ERROR] Address already in use: 0.0.0.0:8080说明8080已经被其他进程占用了。排查命令:sudo lsof -i:8080 sudo netstat -tunlp | grep 8080lsof能看到进程名,信息比netstat更完整,没装的话先装上:sudo apt install -y lsof处理方式两种:如果8080被业务占用,直接改配置里的app.port换到其他端口;如果是残留的旧进程,确认无害后kill掉。我的习惯是优先改端口,不杀不认识的进程,避免误伤线上服务。4.2 依赖安装阶段的各种报错pip装依赖时最常见的错误:fatal error: openssl/ssl.h: No such file or directory这是缺了头文件,回到2.2把libssl-dev和libffi-dev装好,再重装一遍依赖就行。还有两类情况也常遇到:pip版本太老,安装某些包时报编码或解析错误,先执行pip install --upgrade pip;下载超时,多半是网络到默认软件源不稳定,配置就近的可信软件源之后会明显好转。依赖安装报错不要只盯着最后一行看,往上面翻几行往往能找到真正的根因。4.3 数据库初始化失败的三个原因数据库表一直初始化失败,按这个顺序排查:目录权限。OpenClaw进程是不是用openclaw用户跑的?数据目录属主对不对?sudo ls -ld /opt/openclaw/data sudo chown -R openclaw:openclaw /opt/openclaw经验里十次有七次是权限问题。配置路径写错。检查database.url里的绝对路径是否存在,config.yaml是否被正确读取。有残留旧库文件。之前装过旧版本,data目录里留着旧openclaw.db,结构不兼容导致反复失败。先备份旧文件,再删掉重新init-db。权限问题最好的解法是从一开始就把属主改好,而不是出错后再补救。4.4 插件装了却不生效插件放进plugins目录后,面板里看不到,或者日志显示加载失败,常见原因:插件目录属主不对,openclaw用户没权限读取;插件清单文件缺失或文件名不规范,正常情况应该叫manifest.json;插件依赖的Python包没装进venv,导入阶段直接抛异常。排查命令:grep -i error /opt/openclaw/logs/*.log stat /opt/openclaw/plugins还有一种比较隐蔽的情况:插件依赖某个系统库,但运行账号没有访问权限,表现出来就是莫名其妙的加载失败。目录设置成755、文件设置成644通常够用,数据目录则要保持写权限。4.5 通用排查套路与速查表我排查安装问题基本遵循四步:看日志,日志一般已经告诉你原因;查端口和进程,确认服务是否真的在跑;验权限,重点看data和plugins目录;最小化复现,关掉debug,用一个最简单的插件或任务去测试。汇总成速查表:现象可能原因首先执行的命令端口起不来端口被占用sudo lsof -i:8080数据库初始化失败权限或路径不对ls -ld /opt/openclaw/data插件不加载目录权限或清单缺失stat /opt/openclaw/plugins定时任务不触发时区或调度未开启grep -A2 scheduler config.yaml这张表也是我后来排查问题时的默认路线图,很实用。5. 装完不算完:自启、备份与安全加固5.1 用systemd把服务托管起来手工启动关掉终端就没了,生产环境要把OpenClaw交给systemd托管。新建服务文件:[Unit] Description=OpenClaw Service After=network.target postgresql.service [Service] Type=simple User=openclaw Group=openclaw WorkingDirectory=/opt/openclaw/app ExecStart=/opt/openclaw/app/venv/bin/openclaw server --config /opt/openclaw/config.yaml Restart=on-failure RestartSec=5 StandardOutput=append:/opt/openclaw/logs/stdout.log StandardError=append:/opt/openclaw/logs/stderr.log [Install] WantedBy=multi-user.target关键点解释一下:User/Group指定openclaw,确保进程权限最小化;Restart=on-failure让服务在异常退出时自动拉起;StandardOutput/StandardError把日志直接落到文件里,方便后续统一查看;After=postgresql.service保证数据库先起来,OpenClaw再启动。然后加载并启用:sudo cp openclaw.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now openclaw sudo systemctl status openclaw --no-pager以后重启机器,服务会自动跟着起来,不用再手工起进程。5.2 日志轮转与数据备份服务长期运行,日志会一直增长。配置logrotate按天切分:/opt/openclaw/logs/*.log { daily rotate 7 missingok notifempty compress copytruncate }含义:每天切分一次,保留7份,旧日志压缩,copytruncate保证不中断服务的日志截断。数据备份也不能少。SQLite场景下,在线备份用这条命令:sqlite3 /opt/openclaw/data/openclaw.db ".backup '/opt/openclaw/backup/openclaw-$(date +%F).db'"sqlite3 .backup比直接cp安全,在线状态下也能得到一致快照,不会复制到写了一半的脏数据。然后配合清理,只保留最近14天:find /opt/openclaw/backup -name "*.db" -mtime +14 -delete把这两条写进crontab,每周日凌晨执行一次。如果是PostgreSQL,则改用pg_dump导出SQL再压缩,注意备份产物不要放在和数据库同一块数据盘上,否则盘坏了备份也一起没了。5.3 安全加固三件事安装跑通只是开始,生产环境至少要做三件事:第一,最小权限运行。服务用openclaw用户跑,目录属主设置正确,管理员账号即时退出。第二,收敛端口。防火墙只放行必要端口。数据库端口不要对公网开放,管理面板也不要直接暴露到公网。第三,HTTPS加密中转。在网关层用Nginx把8080和8081统一收敛到443端口,配置ACME证书自动续期。这一步不仅能加密传输,还能藏住后端真实端口,缓解暴力扫描。另外,app.secret_key建议定期轮换,版本更新也不要拖太久。安全加固不是一次性的,而是周期性的习惯。5.4 最后分享一个维护小习惯这个习惯帮过我很多次:每次部署完,在/opt/openclaw下放一个README.deploy文件,记录三件事——当前版本号、安装时改过哪些配置、下次升级要执行哪些命令。别小看这几行字,隔上几个月再回来维护时,它就是现场唯一的线索。我有一次排查旧环境的插件加载问题,正是靠着文件里一条“plugins目录权限调整记录”,十分钟定位了问题,省掉了从头翻日志的功夫。如果你也打算把OpenClaw放在长期环境里,建议从今天起就养成写部署记录的习惯。等过几个月再回来看自己的环境,会发现这些随手记下的几行字,比什么都值钱。
OpenClaw这个开源项目,在个人自动化与任务调度圈子里热度一直在线。它把任务编排、插件管理、多终端数据同步整合成一个轻量级服务,安装边界清晰,部署完就能感受到它的调度与插件生态比裸写脚本省心太多。但很多朋友卡在第一步:不是不会装,而是教程太碎,照着一个装完发现端口不对、数据库连不上、插件不加载,来回折腾。这篇指南我换个写法,以一次完整的从零到一部署为主线,把环境准备、源码安装、配置初始化、故障排查到systemd自启和维护加固,整个链路挨个过一遍。不管你是想先验证功能,还是准备长期跑生产,跟着走完都能得到一套能落地、敢升级的OpenClaw环境。1. 部署前先想清楚:结构与选型1.1 OpenClaw是什么,跑起来依赖哪几块OpenClaw拆开看,核心是三块组件:调度引擎,负责接收外部消息或定时触发信号,按预置规则把任务分发给对应插件;插件运行时,真正执行具体工作,比如发通知、处理数据、调用接口;管理面板,提供Web界面查看状态、配置插件、观察任务日志。你可以把它想象成一个“交通指挥中心”:每天收到的任务就像不同方向的车辆,调度引擎按规则分拣,插件是各条车道上的执行者。普通脚本是“一条路走到黑”,而OpenClaw是一个能持续运行的平台,这也是为什么这类工具比一次性脚本更适合装到服务器上长期跑。同一台机器可以承载这三块组件,它们各自落日志、互不干扰。插件按需安装,不需要全部开启,面板则负责把配置、日志、状态集中呈现。理解了这几个组件,后面配置时就不会被一堆参数绕晕。1.2 方案对比:三种安装方式的取舍网上能看到的部署方式大致三种:源码安装、容器安装、系统包管理器安装。我实际用下来的感受如下:方式优点容易踩的坑适合谁源码安装可控性强、日志路径自己定、升级回滚方便依赖要手动装、首次配置多一点想长期维护、做二次开发的人容器安装一条命令跑起来、隔离性好数据卷、网络模式、重启策略都要额外学快速体验、临时验证的人系统包管理器安装最快版本往往滞后、定制困难对版本不敏感的人我个人的选择是源码优先,尤其生产环境。理由有三:日志位置由我控制,排查问题顺藤摸瓜;目录结构标准化,备份恢复可以写成脚本;跨版本升级时,可以按版本逐个迁移,坏了也好回滚。容器方案我见过一个很典型的翻车案例:服务在容器里跑得好好的,但数据默认写在容器内层,结果升级时忘记把数据卷挂出来,容器一删数据全没。不是容器不好,而是边界和概念没理清楚前,直接上容器反而增加心智负担。想清楚自己是要“快速试试”还是“跑长期服务”,选型就不会纠结。1.3 目录规划与运行账号:先定规矩再动手部署前先把目录规划好。我的标准布局长这样:/opt/openclaw/ ├── app/ 程序代码 ├── data/ 数据库与缓存 ├── logs/ 运行日志 ├── plugins/ 插件目录 └── backup/ 备份产物别把文件全堆在一个目录里。我之前图省事,程序、数据、日志全放在一个目录,后来数据盘写满才发现日志已经涨到几个G,清理时又怕误删程序文件,非常被动。分开之后,数据归数据、日志归日志、程序归程序,磁盘清理和权限控制都会顺畅很多。运行账号方面,建议单独建一个普通系统用户,不要用root直接跑。服务出bug或者被人利用时,一个最小权限账号能把破坏范围压到最低。后面章节会给出具体命令,这里先把这个原则立住。2. 环境准备:硬件、系统与依赖一次到位2.1 硬件配置怎么定先给一张参考表,方便对号入座:场景CPU内存磁盘最小验证2核4GB20GB日常使用4核8GB40GB SSD插件全开+高并发8核16GB100GB+为什么磁盘要求偏高?主要不是程序本身,而是三类东西会持续占空间:日志文件、数据库体积、插件运行时的缓存文件。我见过一个跑了好几个月的实例,数据本身只有几百MB,日志和缓存加起来反而2个G,所以磁盘宁可宽松一点。内存方面,最小配置能跑通安装和基础任务,但一旦插件开多,Node或者Python子进程同时起来,4GB会显得很紧。SSD对数据库初始化和面板加载速度提升明显,预算允许时别用机械盘。2.2 操作系统与基础运行时我以Ubuntu 22.04 LTS为例,其他Debian系版本都能对齐。CentOS、Rocky这类RPM系系统把包管理器换成yum/dnf即可。先把基础包装上:sudo apt update sudo apt install -y python3 python3-venv python3-pip build-essential libssl-dev libffi-dev curl unzip逐个说下为什么需要:python3-venv:后面要用虚拟环境隔离依赖;build-essential:编译部分C扩展时必须的gcc和make;libssl-dev、libffi-dev:pip安装某些依赖时的头文件,缺了会报经典的“headers or library files could not be found”;curl、unzip:下载和解析安装包用。如果你计划使用依赖Node.js运行时的插件,再把Node装一下:curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs装完后分别验证:python3 --version node -vPython尽量用3.10及以上版本,太老的版本在依赖兼容上会比较痛苦。2.3 数据库选型:先用SQLite,再考虑PostgreSQL首次安装,直接用SQLite就能跑通整个链路,零成本、零维护。配置里写一行就行:database: url: "sqlite:///opt/openclaw/data/openclaw.db"日常任务量下,SQLite完全够用。但一旦并发上来了,或者计划多实例共享数据,就应该迁到PostgreSQL:database: url: "postgresql://openclaw:强密码@127.0.0.1:5432/openclaw"装PostgreSQL的命令:sudo apt install -y postgresql sudo -u postgres createuser --pwprompt openclaw sudo -u postgres createdb -O openclaw openclaw为什么“先用SQLite,后迁PG”?核心逻辑是先想办法把安装链路跑通,不要一上来就引入数据库服务的复杂度;等日志和任务量明显增长,再迁移。OpenClaw自带数据导出导入脚本,切换成本没那么高。迁移前记得备份SQLite文件,这一步永远不要省。2.4 端口规划与防火墙:安装前就定好端口在部署前定好,后面配置和排查都方便。本文统一按以下规划来:8080:管理面板8081:API入口防火墙规则示例:sudo ufw allow 22/tcp sudo ufw allow 8080/tcp sudo ufw allow 8081/tcp sudo ufw enable这里有个实战中的重点:管理面板不要直接暴露到公网。要么通过内网统一入口访问,要么在网关层用Nginx做HTTPS加密中转,把8080和8081收敛到443再对外服务。直接把后台登录页发给全世界,被暴力破解只是时间问题。另外,管理面板端口是全局可访问的,一定要设置强密码登录。数据库端口不要对公网开放,否则等于把数据目录挂在门口。3. 动手安装:从下载、配置到跑通全流程3.1 获取安装包:下载与校验先创建运行用户和目录结构:sudo useradd -r -s /usr/sbin/nologin openclaw sudo mkdir -p /opt/openclaw/{app,data,logs,plugins,backup}-r表示创建系统账号,-s /usr/sbin/nologin表示禁止登录,这样即使服务被入侵,也无法通过该账号拿到shell。下载release包并校验:curl -L -o /tmp/openclaw-2.6.1.tgz https://mirror.example.com/openclaw/releases/2.6.1/openclaw-2.6.1.tgz cd /tmp sha256sum openclaw-2.6.1.tgz拿到校验值后,和官方release页面公示的SHA256核对,一致再继续。这一步防的是下载源被污染,属于基本安全习惯。确认无误后解压:tar -xzf openclaw-2.6.1.tgz -C /opt/openclaw/app --strip-components=1--strip-components=1是因为压缩包里通常有一层顶层目录,加上这个参数能直接解压到目标路径,少一层嵌套。3.2 虚拟环境与依赖安装进入程序目录,创建Python虚拟环境:cd /opt/openclaw/app python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt虚拟环境的作用是给OpenClaw一套独立的Python运行空间。所有依赖装进venv目录,不污染系统Python,也不会被后期系统升级搞乱。直接拿系统pip硬装,早晚会碰到依赖打架。如果依赖安装速度很慢,可以配置pip使用就近的可信软件源,加速效果立竿见影。装完后不要关闭虚拟环境,后面所有openclaw命令都要在这个环境里执行。3.3 配置文件config.yaml逐项拆解启动前先写配置。最简可用的config.yaml如下:app: port: 8080 secret_key: "请用随机字符串替换" debug: false database: url: "sqlite:///opt/openclaw/data/openclaw.db" scheduler: enable: true interval: 30 timezone: "Asia/Shanghai" plugins: dir: "/opt/openclaw/plugins" auto_load: true network: api_port: 8081逐项说明:app.secret_key:会话签名密钥,必须用随机值。生成命令:openssl rand -hex 32不要用“123456”这种字符串,否则面板会话很容易被伪造。app.port:管理面板监听端口,对应防火墙放行的8080。app.debug:生产环境务必设为false,打开debug会输出大量敏感信息。database.url:数据库连接串。SQLite路径必须写成绝对路径,避免工作目录变化导致找不到库。scheduler.interval:调度引擎扫描间隔,单位秒。不要设成1,频率没有意义,30-60是比较稳妥的值。scheduler.timezone:一定要显式配置。不配置时定时任务会按系统时区算,迁移服务器后任务触发时间可能整个乱掉。plugins.dir:插件目录,建议用绝对路径。network.api_port:API入口,和管理面板错开端口。配置文件写完后,给它单独备份一份:sudo cp config.yaml /opt/openclaw/backup/config.yaml.bak并确认config.yaml能被openclaw用户读取。3.4 初始化数据库与迁移一切就绪后,执行初始化:cd /opt/openclaw/app source venv/bin/activate openclaw init-db --config config.yaml openclaw migrate --config config.yamlinit-db负责首次建表,migrate负责把数据库结构升级到当前版本。migrate是幂等的,可以重复执行;init-db一般只在全新库上跑一次。验证表结构:sqlite3 /opt/openclaw/data/openclaw.db ".tables"能看到类似alert_rule、scheduler_job、plugin_record之类的表,说明数据库这层已经通了。3.5 首次启动与验证第一次建议前台启动,方便直接看日志:cd /opt/openclaw/app source venv/bin/activate openclaw server --config config.yaml看到类似输出:INFO 管理面板已监听 8080 INFO API入口已监听 8081说明两个端口都起来了。浏览器访问http://服务器IP:8080,首次访问会进入初始化引导,设置管理员账号和密码。然后用一个最简单的任务验证调度链路:在面板里新建一个定时任务,让系统每5分钟打印一句测试日志,观察任务记录是否按预期执行。如果能看到执行记录,整条链路就算完全打通了。确认没问题后,Ctrl+C停掉前台进程,进入下一步正式托管。4. 安装路上的坑:常见问题与排查实录4.1 端口被占用:Address already in use启动时报这个错最常见:[ERROR] Address already in use: 0.0.0.0:8080说明8080已经被其他进程占用了。排查命令:sudo lsof -i:8080 sudo netstat -tunlp | grep 8080lsof能看到进程名,信息比netstat更完整,没装的话先装上:sudo apt install -y lsof处理方式两种:如果8080被业务占用,直接改配置里的app.port换到其他端口;如果是残留的旧进程,确认无害后kill掉。我的习惯是优先改端口,不杀不认识的进程,避免误伤线上服务。4.2 依赖安装阶段的各种报错pip装依赖时最常见的错误:fatal error: openssl/ssl.h: No such file or directory这是缺了头文件,回到2.2把libssl-dev和libffi-dev装好,再重装一遍依赖就行。还有两类情况也常遇到:pip版本太老,安装某些包时报编码或解析错误,先执行pip install --upgrade pip;下载超时,多半是网络到默认软件源不稳定,配置就近的可信软件源之后会明显好转。依赖安装报错不要只盯着最后一行看,往上面翻几行往往能找到真正的根因。4.3 数据库初始化失败的三个原因数据库表一直初始化失败,按这个顺序排查:目录权限。OpenClaw进程是不是用openclaw用户跑的?数据目录属主对不对?sudo ls -ld /opt/openclaw/data sudo chown -R openclaw:openclaw /opt/openclaw经验里十次有七次是权限问题。配置路径写错。检查database.url里的绝对路径是否存在,config.yaml是否被正确读取。有残留旧库文件。之前装过旧版本,data目录里留着旧openclaw.db,结构不兼容导致反复失败。先备份旧文件,再删掉重新init-db。权限问题最好的解法是从一开始就把属主改好,而不是出错后再补救。4.4 插件装了却不生效插件放进plugins目录后,面板里看不到,或者日志显示加载失败,常见原因:插件目录属主不对,openclaw用户没权限读取;插件清单文件缺失或文件名不规范,正常情况应该叫manifest.json;插件依赖的Python包没装进venv,导入阶段直接抛异常。排查命令:grep -i error /opt/openclaw/logs/*.log stat /opt/openclaw/plugins还有一种比较隐蔽的情况:插件依赖某个系统库,但运行账号没有访问权限,表现出来就是莫名其妙的加载失败。目录设置成755、文件设置成644通常够用,数据目录则要保持写权限。4.5 通用排查套路与速查表我排查安装问题基本遵循四步:看日志,日志一般已经告诉你原因;查端口和进程,确认服务是否真的在跑;验权限,重点看data和plugins目录;最小化复现,关掉debug,用一个最简单的插件或任务去测试。汇总成速查表:现象可能原因首先执行的命令端口起不来端口被占用sudo lsof -i:8080数据库初始化失败权限或路径不对ls -ld /opt/openclaw/data插件不加载目录权限或清单缺失stat /opt/openclaw/plugins定时任务不触发时区或调度未开启grep -A2 scheduler config.yaml这张表也是我后来排查问题时的默认路线图,很实用。5. 装完不算完:自启、备份与安全加固5.1 用systemd把服务托管起来手工启动关掉终端就没了,生产环境要把OpenClaw交给systemd托管。新建服务文件:[Unit] Description=OpenClaw Service After=network.target postgresql.service [Service] Type=simple User=openclaw Group=openclaw WorkingDirectory=/opt/openclaw/app ExecStart=/opt/openclaw/app/venv/bin/openclaw server --config /opt/openclaw/config.yaml Restart=on-failure RestartSec=5 StandardOutput=append:/opt/openclaw/logs/stdout.log StandardError=append:/opt/openclaw/logs/stderr.log [Install] WantedBy=multi-user.target关键点解释一下:User/Group指定openclaw,确保进程权限最小化;Restart=on-failure让服务在异常退出时自动拉起;StandardOutput/StandardError把日志直接落到文件里,方便后续统一查看;After=postgresql.service保证数据库先起来,OpenClaw再启动。然后加载并启用:sudo cp openclaw.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now openclaw sudo systemctl status openclaw --no-pager以后重启机器,服务会自动跟着起来,不用再手工起进程。5.2 日志轮转与数据备份服务长期运行,日志会一直增长。配置logrotate按天切分:/opt/openclaw/logs/*.log { daily rotate 7 missingok notifempty compress copytruncate }含义:每天切分一次,保留7份,旧日志压缩,copytruncate保证不中断服务的日志截断。数据备份也不能少。SQLite场景下,在线备份用这条命令:sqlite3 /opt/openclaw/data/openclaw.db ".backup '/opt/openclaw/backup/openclaw-$(date +%F).db'"sqlite3 .backup比直接cp安全,在线状态下也能得到一致快照,不会复制到写了一半的脏数据。然后配合清理,只保留最近14天:find /opt/openclaw/backup -name "*.db" -mtime +14 -delete把这两条写进crontab,每周日凌晨执行一次。如果是PostgreSQL,则改用pg_dump导出SQL再压缩,注意备份产物不要放在和数据库同一块数据盘上,否则盘坏了备份也一起没了。5.3 安全加固三件事安装跑通只是开始,生产环境至少要做三件事:第一,最小权限运行。服务用openclaw用户跑,目录属主设置正确,管理员账号即时退出。第二,收敛端口。防火墙只放行必要端口。数据库端口不要对公网开放,管理面板也不要直接暴露到公网。第三,HTTPS加密中转。在网关层用Nginx把8080和8081统一收敛到443端口,配置ACME证书自动续期。这一步不仅能加密传输,还能藏住后端真实端口,缓解暴力扫描。另外,app.secret_key建议定期轮换,版本更新也不要拖太久。安全加固不是一次性的,而是周期性的习惯。5.4 最后分享一个维护小习惯这个习惯帮过我很多次:每次部署完,在/opt/openclaw下放一个README.deploy文件,记录三件事——当前版本号、安装时改过哪些配置、下次升级要执行哪些命令。别小看这几行字,隔上几个月再回来维护时,它就是现场唯一的线索。我有一次排查旧环境的插件加载问题,正是靠着文件里一条“plugins目录权限调整记录”,十分钟定位了问题,省掉了从头翻日志的功夫。如果你也打算把OpenClaw放在长期环境里,建议从今天起就养成写部署记录的习惯。等过几个月再回来看自己的环境,会发现这些随手记下的几行字,比什么都值钱。