☰
Ubuntu服务器部署OpenClaw:从零到常驻后台的完整指南
2026/10/17 3:19:47 网站建设 项目流程

本地部署openclaw这件事,我前前后后折腾了两天。第一天照着网上一些零散的教程去试,结果不是权限报错就是端口冲突,折腾到半夜服务都没起来。第二天干脆推倒重来,从裸系统开始一步步捋,把每个环节都记下来,总算是稳定跑起来了。这篇教程就是基于那次完整实操整理出来的,从零开始到服务常驻后台、开机自启、数据备份全都有,适合手里有一台Ubuntu服务器(虚拟机、物理机、云主机都行)并且想把openclaw这类自托管服务真正用起来的朋友。

我会把每一步的完整命令、预期输出、坑点和判断逻辑都写清楚。整个流程看着长,但其实大部分时间花在等下载和等编译上,真正需要动脑子的地方没几处。跟着走一遍,你的Ubuntu服务器上就能跑起来一个干净的openclaw服务。

1. 部署前的整体思路与准备

1.1 先想清楚:部署一个开源服务到底在做什么

很多人拿到一个开源项目,第一反应就是git clone然后按README里的命令一把梭。这么干在运气好的时候确实能跑起来,但一旦出问题,排查的难度会成倍增加。我自己的习惯是先把三件事想明白:这个服务是干什么的、它依赖什么运行时、它对外要开哪些端口。

openclaw本质上一个长期运行的后台服务,这类服务有几个共性:需要稳定运行、需要持久化数据、需要可被其他机器访问、需要能在重启后自动恢复。所以部署工作不只是“把代码拉下来跑起来”,而是要把运行环境、数据目录、端口规划、进程守护、日志管理这几件事一次性做对。

另外要明确部署形态。如果你只是本机自己访问,监听地址用127.0.0.1就够了;如果是局域网里多台设备要用,就得监听0.0.0.0并注意防火墙规则。我这次按“局域网内多设备访问”来部署,这也是大多数人实际使用场景。

1.2 硬件配置和系统版本怎么选

先说系统和硬件,这一块决定了后面会不会莫名其妙出问题。

系统方面我用的是Ubuntu 22.04 LTS,这个版本稳定、软件源干净、遇到问题能找到大量社区经验。当然20.04、24.04也都可以,命令基本通用。我不建议在非LTS版本上部署长期服务,除非你特别清楚自己在做什么。

硬件配置我的建议是:

配置项最低要求推荐配置说明
CPU1核2核及以上编译安装时单核会明显变慢
内存2GB4GB及以上内存不够最容易被OOM killer杀掉进程
磁盘10GB30GB以上数据会持续增长,日志也需要空间
网络局域网即可千兆有线多设备并发访问时网络瓶颈更明显

内存是这里面最容易踩坑的。服务刚启动时看内存占用可能只有几百MB,但跑一段时间后缓存和连接堆上来,2GB内存很容易被打满,然后系统会把服务进程杀掉。检查内存用free -h,看Swap那一行如果经常是满的,就得考虑加内存或者限制服务本身的资源占用。

1.3 端口规划和目录约定

端口这块是我第一次部署失败的主要原因。服务器上已经有了其他服务占用了默认端口,openclaw一启动就报“address already in use”,我当时还没反应过来,以为是代码没拉全,白白排查了很久。

建议在部署之前就确定好端口和目录,后面所有配置都围绕这个约定来。这次我用的是8443端口,原因很简单:避开22(SSH)、80(HTTP)、443(HTTPS)这些几乎必然被占用的常用端口,同时8443在HTTPS替代端口里比较常见,不容易和其他软件冲突。

目录规划我按下面这个结构来:

/app/openclaw # 代码目录 /var/lib/openclaw # 数据目录(重点备份对象) /etc/openclaw # 配置文件 /var/log/openclaw # 日志目录

注意代码、数据、配置、日志分开存放。这样做的直接好处是:升级代码不会动到数据,备份数据不会带上代码,日志爆掉也不影响主程序。很多教程把数据直接放在代码目录下,当时用着方便,后面升级或者迁移的时候就是灾难。

2. 基础环境配置与依赖安装

2.1 系统更新与基础工具链

拿到一台裸Ubuntu服务器,第一件事永远是更新软件源。虽然这一步看起来没什么技术含量,但它能避免后面大量“依赖版本太旧”的问题。

sudo apt update && sudo apt upgrade -y

升级完后安装基础工具链。我用的是:

sudo apt install -y curl wget git vim build-essential ca-certificates gnupg lsb-release

这里build-essential很多人觉得用不上,其实不然。有些依赖在安装时需要编译原生模块,缺少这个工具链会直接报错,而且报错信息很长,新手很容易被吓到。vim用来改配置文件,虽然你用nano也可以,但vim几乎是服务器标配,装上没坏处。

2.2 安装运行时环境

openclaw这种项目的运行环境一般离不开Node.js或Python。我建议两个都装好。先说Node.js,我不推荐用apt直接安装,因为Ubuntu软件源里的Node版本通常比较旧,而这类项目对Node版本有明确要求,版本不对会出现各种奇怪的兼容性问题。

推荐用nvm安装指定版本的Node:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

安装完成后,重新登录终端或者source一下配置文件让nvm生效,然后安装Node。以Node 20 LTS为例:

nvm install 20 nvm alias default 20 node -v

这里的核心原因是:nvm支持在同一个服务器上维护多个Node版本,方便以后切换。很多时候项目升级会要求新的Node版本,如果你是用apt装的全局版本,升级系统Node会影响到所有项目,用nvm则可以做到互不干扰。

Python这边我建议装Python 3.10以上版本,并且用venv创建虚拟环境,不要让项目依赖去污染系统Python:

sudo apt install -y python3-pip python3-venv python3-dev

依赖安装是另一个容易出问题的环节。如果pip下载速度很慢,可以把pip源切换到国内镜像源,操作方式是在用户目录下创建pip.conf:

mkdir -p ~/.pip vim ~/.pip/pip.conf

写入如下内容:

[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn

这里我只放了清华源的例子,其他镜像源同理。不管用哪个源,关键是保证安装过程稳定,别在装了一半的时候超时中断。

2.3 创建专用账户和服务目录

部署长期服务的一个重要原则是:不要用root直接跑。原因主要有三个:第一,root权限太大,一旦程序有漏洞被利用,攻击者直接拿到整台服务器的控制权;第二,用root跑服务产生的日志和文件都属于root,后续普通用户操作起来非常别扭;第三,隔离的账户更容易管理备份权限。

创建专用账户:

sudo adduser openclaw

按提示设置密码,其他的信息可以直接回车跳过。然后把刚才规划的目录建好,并修改属主:

sudo mkdir -p /app/openclaw /var/lib/openclaw /etc/openclaw /var/log/openclaw sudo chown -R openclaw:openclaw /app/openclaw /var/lib/openclaw /etc/openclaw /var/log/openclaw

chown这一行非常重要。我见过很多次服务启动失败,最后发现就是数据目录属主不对,服务进程没有写权限。用openclaw用户跑服务,那服务要读写的目录就必须归openclaw所有,这是Linux权限模型的基础逻辑。

3. 获取项目代码与配置修改

3.1 拉取代码与版本选择

切到openclaw用户再拉代码:

sudo -u openclaw bash -c 'cd /app/openclaw && git clone <项目仓库地址> .'

为什么要用sudo -u而不是先su过去?sudo -u更干净,不会要求你切换到那个用户的交互式shell。当然你直接su - openclaw再执行git clone也可以,效果一样。

这里有个容易忽略的细节:clone之后要看一下当前处于哪个分支。很多项目默认分支是dev或main,但dev分支往往是开发中状态,不适合直接部署。我会切到最新的稳定版本标签上:

cd /app/openclaw git tag # 查看有哪些稳定版本 git checkout <稳定版本号>

在正式环境里跑稳定版而不是追最新代码,这个习惯能帮你省掉很多“昨天还能用,今天更新完就崩了”的麻烦。

3.2 配置文件里的关键参数

配置文件一般在项目根目录或者/etc/openclaw目录下。先看看项目里有没有示例配置文件,通常叫config.example.yaml、.env.example之类的,然后复制一份出来改成实际配置:

cp config.example.yaml /etc/openclaw/config.yaml

下面是我这次部署中实际需要改的几项,你可以根据自己情况调整:

参数示例值说明
bind_address0.0.0.0监听所有网卡地址,局域网设备才能访问
port8443对外服务端口
data_path/var/lib/openclaw持久化数据存放位置
log_path/var/log/openclaw日志存放位置
log_levelinfo日常运行建议不用debug,日志太多
secret_key随机长字符串加密相关,生成一个足够随机的值

bind_address这个参数特别容易理解错。默认情况下很多服务只监听127.0.0.1,意思是只能本机访问,其他设备连不上。如果你按教程装完之后发现自己电脑打不开服务器上的服务,90%是这个参数没改。

修改配置文件的命令就是vim:

sudo -u openclaw vim /etc/openclaw/config.yaml

3.3 初始化数据目录

配置改完之后,先手动创建数据目录里的基础结构。大部分项目会在首次启动时自动创建目录,但为了避免权限问题提前暴露,我建议手动创建一层:

sudo -u openclaw mkdir -p /var/lib/openclaw/data

接下来安装项目依赖。这一步是新手最容易卡住的环节。以Node项目为例,一般执行npm install;Python项目执行pip install。但这里有个重要前提:先看项目文档确认用哪个包管理器。有些项目用npm,有些用yarn,有些用pnpm,用错了虽然不一定报错,但会产生不同的lock文件,后续升级容易出问题。

cd /app/openclaw sudo -u openclaw npm install

等待安装完成时不要干等着,我习惯同时把防火墙规则检查一遍。Ubuntu默认可能没有启用ufw,但如果启用了,就要放行8443端口:

sudo ufw allow 8443/tcp sudo ufw status

4. 启动、验证与守护进程

4.1 首次启动与验证

依赖装完、配置改好,就可以开始启动验证了。先用前台模式启动,这样你能直接看到日志输出,有没有报错一目了然:

cd /app/openclaw sudo -u openclaw ./bin/openclaw start --foreground

如果你看到类似“Server listening on 0.0.0.0:8443”的日志,说明服务起来了。这时候在浏览器里访问http://你的服务器IP:8443,应该能看到界面。

第一次访问一般会让你初始化管理员账号。这个过程不要跳过,也不要设太简单的密码。openclaw的管理员相当于整个系统的总开关,密码设得简单后面再加强就麻烦了。

确认能访问之后,按Ctrl+C停掉前台进程,进入下一步的常驻配置。

4.2 用systemd把服务变成常驻进程

前台模式有个致命问题:终端一关,服务就停了。要让服务在后台稳定运行、开机自动启动、崩溃自动拉起,标准做法是写一个systemd服务单元。

创建服务单元文件:

sudo vim /etc/systemd/system/openclaw.service

内容如下:

[Unit] Description=OpenClaw Service After=network.target [Service] Type=simple User=openclaw WorkingDirectory=/app/openclaw ExecStart=/app/openclaw/bin/openclaw start --foreground Restart=always RestartSec=5 EnvironmentFile=/etc/openclaw/config.env [Install] WantedBy=multi-user.target

这里有几个关键点要解释:

环境隔离。EnvironmentFile指定了配置文件路径,这样进程能从固定的位置读取配置。加上WorkingDirectory指向代码目录,可以避免进程的工作目录不对导致找不到文件的错误。

Restart=always这个参数是“服务挂了自动重启”的核心。配合RestartSec=5能让服务崩溃后等5秒再拉起。但注意区分:如果是配置错误导致启动即崩,systemd会进入不断重启的循环,这时候要看日志来定位问题,不能只依赖自动重启。

Type=simple告诉systemd这个进程就是主进程本身,不会fork。很多程序用Type=simple就够了,但如果程序文档特别说明要配合Type=notify或者forking,要以文档为准。

保存后重载systemd配置并启动服务:

sudo systemctl daemon-reload sudo systemctl enable --now openclaw

enable --now这个组合很实用,enable设置开机自启,now立即启动,一个命令同时完成两件事。

4.3 服务状态检查与常用管理命令

启动之后检查一下状态:

sudo systemctl status openclaw

正常会看到active (running)字样。再确认端口确实在监听:

ss -lntp | grep 8443

日常管理用的命令我整理成一张表,收藏着用:

场景命令
查看服务状态sudo systemctl status openclaw
实时查看日志sudo journalctl -u openclaw -f
重启服务sudo systemctl restart openclaw
停止服务sudo systemctl stop openclaw
开机自启开关sudo systemctl disable openclaw

尤其要养成自觉用journalctl看日志的习惯。报错信息基本都能在里面找到,比到处猜强多了。

5. 常见问题与排查方案

5.1 端口被占用导致启动失败

这个问题我踩过一次之后印象极深。如果你启动时看到“Error: listen EADDRINUSE”或者“address already in use”,说明端口被别人占了。先确认端口占用情况:

sudo ss -lntp | grep 8443

你会看到占用进程的PID和名字。解决方式两种:要么停掉占用进程,要么改openclaw的端口。

端口规划这东西真得提前做。你可以在服务器上维护一个简单的端口登记表,时间久了端口冲突的问题一定会遇到。尤其是我这种一台服务器跑了好几个服务的情况,哪个服务用哪个端口,提前登记好至少能少踩一半的坑。

5.2 依赖安装过程失败

npm install或者pip install失败的原因很多,最常见的有网络超时、Node/Python版本不对、缺编译工具链。

排查顺序是:先看错误信息的前五行。如果看到“network”或者“ETIMEDOUT”,大概率是网络原因,考虑换镜像源;如果看到“node-gyp”“make”“g++”相关的报错,说明缺编译工具链,装build-essential;如果看到“engine”字样,说明Node版本不符合要求,用nvm切换Node版本。

这里我强烈建议大家养成“先读报错第一行”的习惯。很多人一看报错信息很长就直接复制到搜索引擎里搜,结果搜出来的答案五花八门更不知道怎么选。实际上错误信息最关键的部分就在前几行。

5.3 数据目录权限导致的启动失败

启动报错里出现“EACCES: permission denied”或者“cannot write to /var/lib/openclaw”时,基本都是权限问题。检查目录属主:

ls -ld /var/lib/openclaw

看到输出前几位是drwxr-xr-x且属主是root,那openclaw用户肯定写不进去。修复方式:

sudo chown -R openclaw:openclaw /var/lib/openclaw

这种问题在第一次部署时很常见,因为创建目录的往往是root,但配置里写的是让openclaw用户去写。权限模型就是这样,目录创建者和目录使用者不一致,中间就容易出问题。养成创建完目录就顺手chown的习惯能省很多事。

5.4 升级版本导致配置丢失

开源项目迭代快,升级是经常要做的事。但一些朋友升级的方式有问题:直接把整个目录删掉重新clone。代码是被更新了,但数据目录、配置文件和上传的文件如果放在同一个目录下,就会一起被删掉。

我自己用的升级方式是三步:第一步备份,把/etc/openclaw、/var/lib/openclaw打包;第二步拉新代码,在代码目录里git pull或者重新clone到新目录再切换软链;第三步校验配置,看看新版有没有新增必填配置项,对照项目文档修正后再重启服务:

sudo systemctl restart openclaw

这种升级方式最核心的逻辑是:代码是随时可以重新生成的,数据不是。升级过程中优先保护数据,代码坏了大不了重装,数据没了就真的没了。

6. 后续扩展:安全加固、备份与资源配置

6.1 给局域网访问加一层HTTPS保护

如果只是局域网里自己用,HTTP访问其实也能接受。但如果你打算让服务长期运行,并且会输入一些敏感数据,还是建议加一层加密传输。

在局域网环境下可以用自签名证书,浏览器会提示不受信任,点击继续访问就行。操作上生成证书、配置到服务里。生成的命令我会附在后面这段操作里:

sudo mkdir -p /etc/openclaw/certs sudo openssl req -x509 -nodes -newkey rsa:2048 -days 365 \ -keyout /etc/openclaw/certs/server.key \ -out /etc/openclaw/certs/server.crt \ -subj "/C=CN/ST=Local/L=Local/O=LocalOrg/CN=openclaw.local"

然后在配置文件里开启HTTPS,指定证书路径。对于局域网环境,这一步能防止同一网络里的其他人通过抓包看到你传输的明文数据。如果是单机自己用,这一步可以跳过。

另外再说一点,如果你的路由器支持端口转发,可以把服务器的8443端口映射到路由器上,这样在外面的设备也能通过路由器IP访问。但这一步涉及端口映射,不是必须,而且一旦暴露到外部网络,安全责任就大了很多。我建议没有经验的朋友不要一开始就做公网暴露,先在内网里跑熟再说。

6.2 备份策略

部署完成后最容易被忽略的就是备份。很多服务是跑了几个月之后某天数据出问题,才想起备份这件事。把备份融入日常,其实只需要一个cron任务。

我采用的备份方案是:每天凌晨3点打包数据目录,保留最近7天的备份副本。写一个简单的备份脚本:

#!/bin/bash BACKUP_DIR="/var/backups/openclaw" DATA_DIR="/var/lib/openclaw" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR tar -czf $BACKUP_DIR/openclaw_data_$DATE.tar.gz -C $DATA_DIR . find $BACKUP_DIR -name "openclaw_data_*.tar.gz" -mtime +7 -delete

脚本放到/usr/local/bin/backup_openclaw.sh,赋予执行权限,然后加入cron:

sudo chmod +x /usr/local/bin/backup_openclaw.sh sudo crontab -e

在打开的文件里加一行:

0 3 * * * /usr/local/bin/backup_openclaw.sh

备份这件事最大的痛点是“平时想不起来,出事了才想起来”。设置好自动备份之后,虽然平时看不到它工作,但真遇到问题的时候,这个脚本能救命。我在实际部署里还养成了一个习惯,每逢大版本升级前手动打一次备份,这样一旦升级出问题可以随时回滚。

6.3 限制资源占用与日志轮转

openclaw这类服务长时间运行,日志文件会越来越大。看日志的时候用ls检查一下:

ls -lh /var/log/openclaw/

如果发现单个日志文件好几个GB,先看是不是日志级别设置的debug。光是这一个调整,就能大幅降低日志增长速度。同时在systemd的unit文件里追加日志轮转的配置也是可行的:编辑openclaw.service,在[Service]段下加一行:

RuntimeMaxSec=86400

这行表示进程最多运行24小时就自动重启一次,适合日志积累特别快的场景。不过这个方式比较粗暴,适合对重启容忍度高的服务。更优雅的方式是用logrotate:

sudo vim /etc/logrotate.d/openclaw

写入:

/var/log/openclaw/*.log { weekly rotate 4 compress delaycompress missingok notifempty copytruncate }

这段配置的意思是:每周轮转一次,保留4份压缩历史,如果文件非空就截断。尤其是copytruncate这个参数,它能保证程序持续往同一个文件里写也不会因为日志被移动而出问题。

另外内存限制也可以加。在systemd服务文件里追加:

MemoryMax=2G

这样即使服务有内存泄漏,也不会把整个服务器拖垮。我在一台内存不大的服务器上部署这类服务后,几乎一定会加这个参数。限制资源不是为了限制服务能力,而是为了服务器整体稳定。

写在最后

部署过程里我踩的最深的一个坑是端口冲突,第二个深坑是目录权限。这两个问题出现的频率超高,但只要你按照本文提前规划、用专用用户运行、目录各司其职,基本可以绕开。我自己后来在其他服务器上再部署同类的服务,都会先花五分钟把端口表、目录结构、备份脚本这三个东西一次性准备好,部署效率明显高一截。

最后再分享一个小技巧:部署完成之后,可以往浏览器收藏夹里同时存下服务地址和服务器登录方式。很多时候服务出了异常,第一反应不是看日志,而是翻收藏夹、回忆服务器密码,这种时间浪费特别不值得。把运维信息和访问入口一起管理好,整个项目才算真正交接到自己手里。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询