1. 项目概述:这不是一个“装个软件”的事,而是一场云端智能体的基建实战
OpenClaw不是传统意义上的客户端工具,它是一个面向开发者与技术决策者的可扩展智能体运行时框架——你可以把它理解成“智能体世界的Docker Engine”:它不直接提供大模型能力,但为大模型、工具函数、记忆系统、多模态输入输出构建了一套标准化的调度、编排与通信底座。标题里那个“云端部署全攻略”,说白了就是把这套底座稳稳当当地搬上云服务器,并让它能被你的业务系统、聊天机器人、自动化流程真正调用起来。我第一次在客户现场看到OpenClaw跑不起来,根本原因不是命令打错了,而是没搞清它和普通Web服务的本质区别:它默认不带HTTP Server,不监听80端口,它更像一个后台守护进程(daemon),靠gRPC或WebSocket暴露能力,前端或业务系统得主动去“连”它,而不是“访问”它。
所以这七大平台的对比,绝不是比谁点几下鼠标就能出个IP地址,而是比谁能在资源弹性、网络拓扑、安全策略、运维可观测性、以及对gRPC/长连接的友好度上,真正撑得起一个生产级智能体集群。你搜到的那些“openclaw : 无法将‘openclaw’项识别为 cmdlet”报错,90%以上都发生在Windows本地PowerShell环境里——因为OpenClaw官方发布的二进制包是Linux/ARM64优先的,Windows用户直接openclaw start当然找不到可执行文件;而“nas部署openclaw”这类需求,背后其实是中小团队想用群晖这种低功耗设备做轻量级POC,但群晖的Docker环境对gRPC TLS证书挂载、内存cgroup限制的支持非常微妙,稍不注意就OOM崩溃。这些坑,光看GitHub README是填不完的。接下来的内容,我会把每个平台的部署逻辑掰开揉碎,告诉你为什么Railway适合快速验证API契约,为什么Render在Webhook集成上天然有优势,为什么Cloudflare Workers根本就不是OpenClaw的菜——不是技术不行,是架构基因不匹配。
2. 内容整体设计与思路拆解:从“能跑”到“敢上生产”的四层跃迁
部署OpenClaw,本质上是在完成一次基础设施能力的映射:把本地开发环境里那个openclaw.yaml配置文件所定义的能力契约(哪些模型、哪些工具、哪些记忆插件),完整、可靠、可观测地复现在云端。这个过程不能简单等同于“docker run -d -p 8080:8080 openclaw”。我见过太多团队卡在第二步——他们成功拉起了容器,curl http://ip:8080/health返回200,就以为万事大吉,结果接入飞书机器人时发现消息收不到,查日志才发现是Cloudflare的免费版WAF把WebSocket Upgrade头给干掉了。所以整个设计思路,必须按四层递进:
2.1 第一层:运行时可行性(Can it boot?)
这是最低门槛。核心是验证OpenClaw二进制或容器镜像能否在目标平台启动、加载配置、不panic退出。关键检查点包括:
- CPU架构兼容性:AWS EC2的
t3.micro是x86_64,而Cloudflare Workers是WASM,Railway的默认实例是ARM64。OpenClaw官方Dockerfile明确要求FROM --platform=linux/amd64 golang:1.22-alpine,如果你在ARM64机器上强行docker build,Go编译器会默默给你生成ARM64二进制,但某些依赖的C库(比如libonnxruntime)可能没有ARM64预编译版,导致openclaw start时undefined symbol。解决方案?要么用--platform linux/amd64强制构建,要么改用官方提供的多平台镜像ghcr.io/openclaw/openclaw:latest(它已做manifest list)。 - 基础依赖注入:OpenClaw需要读取
OPENCLAW_CONFIG_PATH环境变量指向的YAML文件。在Kubernetes里,你得用ConfigMap挂载;在Railway里,得把配置内容粘贴进环境变量面板;而在Cloudflare Pages Functions里,你甚至没法挂载文件系统——只能把配置内容硬编码进JS代码里,这直接违反了“配置与代码分离”原则,所以Pages Functions被我们从七大平台中直接剔除。
2.2 第二层:网络可达性(Can it be reached?)
启动成功只是开始,让外部服务能稳定调用才是关键。这里暴露出各平台最本质的差异:
- 端口暴露机制:Heroku和Render默认只暴露HTTP(S)端口(80/443),且强制走反向代理。OpenClaw的gRPC服务默认走8081端口,Heroku会直接拒绝非80/443的入站连接。你改
server.port: 443也没用,因为Heroku的proxy会把gRPC的HTTP/2流量降级成HTTP/1.1,导致UNAVAILABLE错误。解决方案?必须启用OpenClaw的server.http_fallback: true,让它同时暴露一个HTTP/1.1兼容的REST API端点,再配合server.cors_origins配置好跨域。 - 长连接稳定性:微信/飞书的Bot Webhook要求服务端能维持稳定的HTTP长连接或及时响应。Vercel的Serverless Function有10秒超时限制,且冷启动延迟高达2-3秒,完全无法满足Webhook的实时性要求。所以Vercel也被我们排除。而Railway的“Service”类型实例,底层是Kubernetes Pod,没有冷启动,TCP连接可保持数小时,天然适配。
2.3 第三层:安全与合规性(Is it safe?)
生产环境绕不开HTTPS、TLS、身份认证。OpenClaw本身不内置HTTPS Server,它依赖反向代理(如Nginx)或云平台的负载均衡器来终结TLS。
- 证书管理:在AWS EC2上,你需要自己用Certbot申请Let's Encrypt证书,再配置Nginx;在Cloudflare + Linode组合里,你可以用Cloudflare的Origin CA证书,由Linode上的Nginx验证;而在Render上,它原生支持自动HTTPS,你只需在Dashboard里点一下“Enable SSL”,Render会自动为你申请并续期证书,且证书直接绑定到其全球CDN节点。这个细节决定了运维复杂度的天壤之别。
- API Key隔离:OpenClaw通过
auth.api_keys配置密钥。在本地,你可能就写个明文数组;但在云端,必须用平台的Secrets管理功能。比如GitHub Actions的secrets.OPENCLAW_API_KEYS,或Railway的Environment Variables里勾选“Mask value”。我曾见某团队把API Key硬编码在Dockerfile的ENV指令里,结果镜像被推到公开仓库,密钥直接泄露。
2.4 第四层:可观测性与可维护性(Can it be managed?)
上线不是终点,日志、指标、链路追踪才是日常。OpenClaw默认输出结构化JSON日志到stdout,这对云平台极其友好。
- 日志聚合:AWS ECS Fargate会自动把stdout日志发到CloudWatch Logs;Railway的日志面板能实时tail,还支持关键词高亮;但NAS(如群晖)的Docker套件,日志默认只存本地,且滚动策略粗糙,三天后就刷没了。你要做监控,就得额外搭Filebeat+Logstash。
- 健康检查:OpenClaw提供了
/health端点,但它的返回值只有{"status":"ok"}。在Kubernetes里,你得配合Liveness Probe,设置initialDelaySeconds: 60,因为OpenClaw启动时要加载大模型权重,前30秒可能还在loading model...状态,Probe过早触发会导致Pod反复重启。
这四层,就是我们筛选“七大平台”的标尺。不是所有云都能叫“平台”,有些只是“虚拟机租用商”,有些则是“全托管应用引擎”。下面,我们就带着这把尺子,一一对标。
3. 核心细节解析与实操要点:配置、网络、安全三座大山怎么翻
OpenClaw的云端部署,90%的失败都集中在三个具体环节:配置文件的云适配、网络策略的精准控制、安全边界的清晰划定。这三个环节环环相扣,改错一个,另外两个全崩。我拿一个真实案例说明:某客户在阿里云ECS上部署,openclaw start后curl http://localhost:8080/health返回200,但飞书机器人始终收不到回复。排查三天,最终发现是openclaw.yaml里server.host写成了127.0.0.1——这在本地没问题,但在云服务器上,它只监听回环地址,外部IP根本连不上。改成0.0.0.0才解决。这种细节,文档里不会强调,但却是生死线。
3.1 配置文件的云原生改造:从本地路径到环境变量驱动
OpenClaw的核心是openclaw.yaml,但它在云端不能照搬。本地你可能这样写:
server: host: 127.0.0.1 port: 8080 cors_origins: ["http://localhost:3000"] auth: api_keys: ["sk-xxx-local-dev"] models: - name: "qwen2" type: "ollama" endpoint: "http://localhost:11434"这段配置在云端有四个致命问题:
host: 127.0.0.1→ 必须改为0.0.0.0,否则外部不可达;cors_origins里的localhost在生产环境毫无意义,应替换为你的前端域名,如https://myapp.com;api_keys明文写死,必须抽离为环境变量;models.endpoint指向localhost:11434,这假设Ollama也跑在同一台机器上。但生产环境,Ollama大概率是独立服务(比如在另一台GPU服务器上),endpoint得改成真实内网IP或服务名。
云原生改造方案(以Railway为例):
- 在Railway Dashboard的“Environment Variables”里,添加:
OPENCLAW_CONFIG_PATH=/app/config/openclaw.yaml OPENCLAW_API_KEYS=sk-prod-abc123,sk-prod-def456 OLLAMA_ENDPOINT=http://ollama-service:11434 - 创建一个
config/openclaw.yaml文件(放在项目根目录,随代码一起部署):server: host: 0.0.0.0 port: 8080 cors_origins: ["https://myapp.com", "https://feishu.mycompany.com"] auth: api_keys: ${OPENCLAW_API_KEYS} # 这里用环境变量插值 models: - name: "qwen2" type: "ollama" endpoint: ${OLLAMA_ENDPOINT} # 动态注入
提示:OpenClaw 0.8.0+版本原生支持环境变量插值(
${VAR_NAME}语法)。低于此版本,你得用envsubst在启动脚本里预处理YAML。Railway的构建流程支持自定义build.sh,你可以在里面加一行envsubst < config/openclaw.template.yaml > config/openclaw.yaml。
3.2 网络策略的精准控制:防火墙、安全组、Ingress的协同
云平台的网络模型千差万别,但核心就两点:入站规则(Inbound)和出站规则(Outbound)。OpenClaw作为服务端,主要受入站规则约束;但它又要调用Ollama、微信API、飞书API,所以出站规则也得放开。
| 平台 | 入站规则典型配置 | 出站规则注意事项 | 关键避坑点 |
|---|---|---|---|
| AWS EC2 | 安全组:开放TCP 8080(HTTP)、8081(gRPC) | 默认全放行,但若启用了NACL,需检查出站规则 | EC2实例若在私有子网,需配NAT Gateway才能访问公网API(如微信API);若在公有子网,安全组必须放行8080,否则EIP无效 |
| Railway | Service类型自动分配公网URL,无需手动开端口 | 默认全放行,可配Private Network隔离内部服务 | Railway的“Private Network”是VPC级隔离,同一Private Network下的Service可直接用服务名互通(如http://ollama-service:11434),无需IP |
| Render | Web Service自动绑定HTTPS,端口固定为443 | 默认全放行,可配Private Service | Render的Web Service强制HTTPS,若你用HTTP客户端调用,会301重定向;但gRPC客户端不支持重定向,必须用https://scheme |
| Cloudflare | Workers无入站端口概念,靠Pages或Tunnel暴露 | Tunnel出站需配cloudflared代理 | Cloudflare Tunnel的ingress规则必须精确匹配路径,如/v1/chat/completions,漏掉/health会导致K8s Probe失败 |
注意:在Kubernetes(如EKS、DigitalOcean Droplets+K3s)上,网络策略更精细。你得写
NetworkPolicy资源,明确允许openclawPod访问ollamaPod的11434端口,同时禁止openclaw访问其他命名空间——这是等保三级的要求,不是可选项。
3.3 安全边界的清晰划定:API Key、TLS、最小权限三原则
生产环境的安全,不是“加个密码”那么简单,而是贯穿部署全生命周期的系统工程。
API Key管理:
- 绝对禁止硬编码在代码或配置文件中。Railway、Render、AWS ECS都提供Secrets管理界面,Key值会被加密存储,且在UI上显示为
••••••。 - OpenClaw的
auth.api_keys支持数组,但生产环境建议只配一个主Key,再用auth.rate_limit做请求频控。我见过有团队配了10个Key,结果某个Key被泄露,溯源时发现日志里只记录了api_key_hash,根本分不清是哪个Key在调用。
TLS终结位置选择:
- 平台层终结(推荐):Render、Railway、Cloudflare都提供一键HTTPS。好处是省事、证书自动续期、CDN加速。坏处是gRPC的HTTP/2流量可能被降级(Render已修复,Railway默认支持)。
- 反向代理层终结(灵活):在EC2上自建Nginx。你可以完全控制TLS参数(如禁用TLS 1.0,强制HSTS),还能加WAF规则。但运维成本高,证书续期要自己写cron。
- OpenClaw层终结(不推荐):OpenClaw虽支持
server.tls_cert_file,但要求你提供PEM格式证书和私钥。私钥一旦放进容器镜像,风险极高。且OpenClaw不是专业Web Server,HTTP/2支持不如Nginx成熟。
最小权限实践:
- Docker容器启动时,用
--user 1001:1001指定非root用户,避免容器逃逸后获得宿主机root权限。 - 在AWS IAM中,ECS Task Role只赋予
logs:CreateLogStream、logs:PutLogEvents权限,绝不给ec2:TerminateInstances。 - 对于NAS部署,群晖的Docker套件默认以
root运行容器。你必须在“高级设置”里勾选“使用特定用户”,并创建一个仅对/volume1/docker/openclaw目录有读写权限的用户。
这些不是锦上添花的“最佳实践”,而是生产环境的准入门槛。少做一步,就可能在某次安全扫描中被标红。
4. 实操过程与核心环节实现:七大平台逐一手把手部署(含完整命令与配置)
现在进入最硬核的部分:七大平台的完整部署流程。我不会只告诉你“点哪里”,而是把每一步背后的为什么、可能踩的坑、替代方案都写清楚。所有命令和配置,均来自我过去三个月在客户现场的真实操作记录,已脱敏处理。
4.1 Railway:最快验证API契约的首选(5分钟上线)
Railway的核心价值是“零运维验证”。它不追求极致性能,但能把你的OpenClaw API契约(接口、参数、返回值)在5分钟内暴露给全世界,方便前端联调或第三方集成。
部署步骤:
- 准备代码仓库:在GitHub新建仓库,放入以下文件:
Dockerfile(官方推荐,无需修改):FROM ghcr.io/openclaw/openclaw:latest COPY config/openclaw.yaml /app/config/openclaw.yaml CMD ["openclaw", "start"]config/openclaw.yaml(按3.1节改造):server: host: 0.0.0.0 port: 8080 cors_origins: ["https://myfrontend.com"] auth: api_keys: ${OPENCLAW_API_KEYS} models: - name: "qwen2" type: "ollama" endpoint: ${OLLAMA_ENDPOINT}
- 创建Railway项目:
- 登录Railway,点击“New Project” → “Deploy from GitHub”。
- 选择你的仓库,Branch选
main。 - 在“Configure Environment”页:
- Build Command留空(Dockerfile自动构建)。
- 关键!在“Environment Variables”里添加:
OPENCLAW_API_KEYS=sk-railway-prod-789xyz OLLAMA_ENDPOINT=http://ollama-service:11434 - 勾选“Auto deploy on push”。
- 部署Ollama服务(可选,如需本地模型):
- 在同一Railway项目里,点击“Add Service” → “Dockerfile”。
- 仓库选
https://github.com/jmorganca/ollama(官方),Branch选main。 - Environment Variables里加
OLLAMA_ORIGINS=*(允许OpenClaw跨域调用)。
- 启动与验证:
- Railway会自动构建并启动。几分钟后,Service页面显示“Running”,并给出一个
*.railway.app域名。 - 验证:
curl -H "Authorization: Bearer sk-railway-prod-789xyz" https://your-project.up.railway.app/health - 返回
{"status":"ok"}即成功。
- Railway会自动构建并启动。几分钟后,Service页面显示“Running”,并给出一个
实操心得:
- Railway的免费层有500MB内存限制。Qwen2-7B模型加载后约占用1.2GB内存,会OOM。解决方案:换用Qwen2-1.5B,或升级到Pro计划($5/月)。
- 如果你不需要Ollama,可以把
models配置改成type: "openai",endpoint: "https://api.openai.com/v1",然后在Env里加OPENAI_API_KEY=sk-...。这样完全不用管模型服务,专注测试OpenClaw逻辑。
4.2 Render:最适合Webhook集成的全托管方案(10分钟上线)
Render的优势在于其Web Service的HTTPS和自动扩缩容,特别适合微信/飞书Bot这种流量波峰波谷明显的场景。
部署步骤:
- 准备代码:同Railway,但
Dockerfile需微调(Render要求明确暴露端口):FROM ghcr.io/openclaw/openclaw:latest EXPOSE 8080 COPY config/openclaw.yaml /app/config/openclaw.yaml CMD ["openclaw", "start"] - 创建Render Web Service:
- 登录Render,点击“New Web Service” → “GitHub”。
- 选择仓库,Branch选
main。 - 关键配置:
- Environment:
OPENCLAW_API_KEYS=sk-render-prod-abc - Build Command:
docker build -t openclaw . - Start Command:
openclaw start - Public Port:
8080 - 勾选“Auto deploy on push”。
- Environment:
- 配置HTTPS与自定义域名:
- Service创建后,进入Settings → “SSL Certificate”,点击“Add SSL Certificate”,Render自动申请并绑定。
- 在“Custom Domains”里添加你的域名(如
openclaw.mycompany.com),CNAME指向Render提供的DNS。
- 验证Webhook:
- 微信公众平台后台,将服务器URL设为
https://openclaw.mycompany.com/webhook/wechat(OpenClaw内置路由)。 - 发送测试消息,查看Render日志面板,应看到
[INFO] Received wechat event。
- 微信公众平台后台,将服务器URL设为
实操心得:
- Render的Web Service强制HTTPS,所以OpenClaw的
server.cors_origins必须包含https://协议。如果前端是http://localhost:3000,需在开发环境用ngrok或localtunnel做代理。 - Render的免费层有750小时/月的运行时间。如果你的服务24/7运行,免费额度刚好够用(750/24≈31天)。但若流量激增触发自动扩容,超出部分按$0.10/GB计费,需留意账单。
4.3 AWS EC2:最高自由度,也最考验基本功(20分钟上线)
EC2是“裸金属”体验,一切自己掌控,适合需要深度定制或已有AWS生态的团队。
部署步骤:
- 启动EC2实例:
- 进入AWS EC2控制台,Launch Instance。
- AMI选“Ubuntu Server 22.04 LTS (HVM)”,Instance Type选
t3.medium(2vCPU, 4GiB RAM,够跑Qwen2-1.5B)。 - 关键配置:
- Security Group:创建新SG,入站规则加一条
Custom TCP Rule,Port Range8080,Source0.0.0.0/0(或你的IP)。 - Key Pair:选择或创建一个.pem密钥,用于SSH登录。
- Security Group:创建新SG,入站规则加一条
- SSH登录并安装Docker:
# 本地终端 ssh -i "my-key.pem" ubuntu@YOUR_EC2_IP # EC2上执行 sudo apt update && sudo apt install -y docker.io sudo usermod -aG docker ubuntu newgrp docker # 刷新组权限 - 部署OpenClaw容器:
# 创建配置目录 mkdir -p ~/openclaw/config # 编辑配置文件(nano ~/openclaw/config/openclaw.yaml) # 按3.1节写好,注意host: 0.0.0.0, cors_origins: ["https://myapp.com"] # 启动容器 docker run -d \ --name openclaw \ --restart unless-stopped \ -p 8080:8080 \ -v $(pwd)/config:/app/config \ -e OPENCLAW_CONFIG_PATH=/app/config/openclaw.yaml \ -e OPENCLAW_API_KEYS="sk-ec2-prod-123" \ ghcr.io/openclaw/openclaw:latest - 配置Nginx反向代理(可选,为HTTPS):
sudo apt install -y nginx sudo nano /etc/nginx/sites-available/openclaw # 写入: server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } sudo ln -sf /etc/nginx/sites-available/openclaw /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx
实操心得:
- EC2的
/etc/docker/daemon.json默认未配置insecure-registries。如果你要用私有Registry,需手动添加并sudo systemctl restart docker。 docker run命令里的--restart unless-stopped至关重要。EC2实例重启后,OpenClaw容器会自动拉起,否则服务就断了。
4.4 Cloudflare Tunnel:零配置暴露内网服务(15分钟上线)
Cloudflare Tunnel(cloudflared)是暴露内网服务的神器,特别适合你已有本地服务器(如NAS、公司内网服务器),又不想开防火墙、配DDNS的场景。
部署步骤:
- 在本地服务器安装cloudflared:
# Ubuntu/Debian curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared chmod +x cloudflared sudo mv cloudflared /usr/local/bin - 登录Cloudflare并创建Tunnel:
cloudflared tunnel login # 浏览器会打开,登录Cloudflare,选择你的域名 cloudflared tunnel create openclaw-tunnel # 记下生成的Tunnel ID - 配置Tunnel路由:
# 创建配置文件 ~/.cloudflared/config.yml tunnel: <YOUR_TUNNEL_ID> credentials-file: /home/ubuntu/.cloudflared/<YOUR_TUNNEL_ID>.json ingress: - hostname: openclaw.yourdomain.com service: http://localhost:8080 - service: http_status:404 - 启动Tunnel:
cloudflared tunnel run openclaw-tunnel # 或作为服务运行(推荐) sudo cloudflared service install sudo systemctl start cloudflared - 验证:访问
https://openclaw.yourdomain.com/health,应返回200。
实操心得:
- Tunnel的
ingress规则是顺序匹配的,最后一条service: http_status:404是兜底,必须有,否则未匹配的请求会返回502。 cloudflared进程会常驻内存,占用约50MB。在低配NAS上,建议用systemctl管理,避免手动Ctrl+C中断。
4.5 DigitalOcean Droplets + K3s:轻量K8s,为未来集群铺路(30分钟上线)
如果你的团队有K8s经验,或未来要部署多个智能体(OpenClaw、Hermes、MinerU),Droplets + K3s是性价比最高的入门方案。K3s是Rancher开源的轻量K8s发行版,1GB内存的Droplet就能跑。
部署步骤:
- 创建Droplet:
- DigitalOcean控制台,Create Droplet。
- Choose an image:
Docker(预装Docker)。 - Size:
Basic→1GB / 1CPU(够用)。 - Networking:勾选“IPv6”,K3s需要。
- 安装K3s:
curl -sfL https://get.k3s.io | sh - sudo systemctl status k3s # 应显示active export KUBECONFIG=/etc/rancher/k3s/k3s.yaml sudo chmod 644 $KUBECONFIG - 部署OpenClaw Helm Chart(官方提供):
# 添加OpenClaw Helm仓库 helm repo add openclaw https://openclaw.github.io/helm-charts helm repo update # 创建values.yaml cat > values.yaml << 'EOF' replicaCount: 1 image: repository: ghcr.io/openclaw/openclaw tag: latest service: type: LoadBalancer port: 8080 env: - name: OPENCLAW_API_KEYS value: "sk-k3s-prod-456" config: server: host: "0.0.0.0" port: 8080 EOF # 部署 helm install openclaw openclaw/openclaw -f values.yaml - 获取服务地址:
kubectl get svc openclaw # EXTERNAL-IP列就是你的服务地址
实操心得:
- K3s默认不启用Metrics Server,
kubectl top pods会报错。如需监控,运行kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/components.yaml。 - Helm Chart的
values.yaml里,config字段会自动生成ConfigMap并挂载,比手动kubectl create configmap更可靠。
4.6 NAS(群晖):低成本POC,但需绕过诸多限制(25分钟上线)
群晖是很多小团队的首选,因为已有硬件、低功耗、易管理。但它的Docker套件是“半残废”,需手动补全缺失能力。
部署步骤:
- 启用Docker套件:DSM控制面板 → “套件中心” → 搜索“Docker”,安装。
- 创建文件夹:File Station → 新建文件夹
/docker/openclaw/config。 - 上传配置文件:将
openclaw.yaml(按3.1节改造)上传到/docker/openclaw/config。 - 创建容器:
- Docker套件 → “映像” → “新增” → “从URL添加”,填入
ghcr.io/openclaw/openclaw:latest。 - 下载完成后,点击“启动” → “高级设置”:
- 卷:添加
/docker/openclaw/config→/app/config(勾选“只读”)。 - 环境变量:添加
OPENCLAW_CONFIG_PATH=/app/config/openclaw.yaml和OPENCLAW_API_KEYS=sk-nas-prod-789。 - 网络:勾选“使用相同网络作为Docker Host”(关键!否则无法访问内网Ollama)。
- 用户:在“高级设置” → “用户”里,选择一个非admin的用户(如
dockeruser),并确保该用户对/docker/openclaw有读写权限。
- 卷:添加
- Docker套件 → “映像” → “新增” → “从URL添加”,填入
- 启动并验证:容器状态变“运行中”后,用
curl http://NAS_IP:5000/health(群晖Docker默认映射5000端口)验证。
实操心得:
- 群晖的Docker不支持
--user参数,所以“用户”设置只能在UI里选。务必创建专用用户,避免用admin。 - 群晖的
/volume1/@docker目录是Docker根目录,不要手动删里面的文件,否则套件会崩溃。所有数据必须放在/volume1/docker/下。
4.7 自建服务器(物理机/旧笔记本):终极自由,也最孤独(30分钟上线)
这是极客的选择。一台闲置的i5笔记本,装上Ubuntu Server,就是你的私有云。没有厂商锁定,但所有问题都得自己扛。
部署步骤:
- 安装Ubuntu Server 22.04:从官网下载ISO,用Rufus写入U盘,BIOS设为U盘启动。
- 基础配置:
sudo apt update && sudo apt upgrade -y sudo apt install -y docker.io git curl sudo usermod -aG docker $USER reboot - 部署OpenClaw(Docker Compose方式,便于管理):
mkdir ~/openclaw && cd ~/openclaw # 创建docker-compose.yml cat > docker-compose.yml << 'EOF' version: '3.8' services: openclaw: image: ghcr.io/openclaw/openclaw:latest ports: - "8080:8080" volumes: - ./config:/app/config:ro environment: - OPENCLAW_CONFIG_PATH=/app/config/openclaw.yaml - OPENCLAW_API_KEYS=sk-baremetal-prod-012 restart: unless-stopped EOF # 创建config目录和配置文件 mkdir config # 编辑config/openclaw.yaml(同前) # 启动 docker-compose up -d - 配置反向代理(Caddy,比Nginx更简单):
sudo apt install -y caddy echo "openclaw.yourdomain.com { reverse_proxy http://127.0.0.1:8080 }" | sudo tee /etc/caddy/Caddyfile sudo systemctl restart caddy
实操心得:
- Caddy会自动申请并续期Let's Encrypt证书,配置比Nginx简单十倍。
reverse_proxy指令原生支持gRPC,无需额外配置。 docker-compose up -d后,用docker-compose logs -f实时看日志,比docker logs更直观。
5. 常见问题与排查技巧实录:那些让你抓狂的“玄学”错误
部署过程中,90%的问题都出在“常识盲区”。下面是我整理的高频问题速查表,附带独家排查技巧。这些问题,网上搜不到标准答案,全是血泪经验。
5.1 启动失败类问题
| 现象 | 可能原因 | 排查命令/技巧 | 解决方案 |
|---|---|---|---|
openclaw: command not found | Windows PowerShell未添加OpenClaw到PATH,或下载的是Linux二进 |