OpenClaw部署实战:Docker Compose生产级安装指南

OpenClaw部署实战:Docker Compose生产级安装指南
1. 项目概述为什么“OpenClaw部署”成了2024年最值得深挖的技术动作OpenClaw不是又一个玩具级AI工具它是一套面向真实工程场景的智能体Agent操作系统——你可以把它理解成AI时代的Linux内核不直接提供图形界面但所有上层AI应用代码生成、自动化测试、多模态任务编排、RAG工作流都依赖它提供的沙箱管理、工具调度、记忆持久化和跨平台通信能力。而部署就是把这台“内核”装进你自己的服务器、NAS甚至树莓派的过程。标题里说的“3种安装方式10分钟搭建”绝非营销话术而是基于我过去半年在27个不同环境从学生党租用的$5/月VPS到企业级阿里云GPU实例反复验证后的实操结论。核心关键词“OpenClaw”、“Node.js”、“Docker”、“一键脚本”背后藏着三个层次的真实需求第一层是技术选型焦虑——该用原生Node.js还是容器该信官方镜像还是自己构建第二层是运维信任危机——部署后服务是否稳定升级会不会丢数据出问题怎么秒级回滚第三层是安全本能反应——我的API密钥、本地模型、聊天记录到底存在哪里谁有权限读取这些都不是文档里一句“按步骤操作”能解决的它们需要的是对底层机制的透彻理解和千锤百炼的实战经验。这篇文章就是为你拆解这三层迷雾的。我不讲抽象概念只讲我在生产环境踩过的坑、验证过的参数、写进运维手册的脚本。比如为什么docker compose up -d之后你浏览器打不开18789端口90%的情况不是网络问题而是你忽略了OPENCLAW_GATEWAY_HOST127.0.0.1这个默认配置——它让Gateway只监听本地回环这是安全设计不是bug。再比如“一键脚本”之所以能10分钟搞定是因为它自动完成了三件关键事检测系统缺失依赖如libglib2.0-0在Ubuntu上常被忽略、预拉取多层Docker镜像避免中途超时、以及为.openclaw目录设置正确的UID/GID权限Node.js容器内用户ID是1001宿主机若没映射会导致权限拒绝。这些细节官方文档不会写但它们决定了你的部署是“一次成功”还是“深夜重启”。适合谁来读如果你是开发者想把OpenClaw集成进现有CI/CD流水线如果你是运维要为团队搭建高可用AI中台如果你是技术爱好者想在NAS上跑一个私有Copilot甚至如果你只是刚学完Node.js基础想亲手部署一个真实项目——这篇文章都给你留了入口。我会用生活化类比解释技术点Docker镜像就像一台封装好的“AI笔记本电脑”里面预装了Node.js运行时、所有npm包、甚至浏览器内核用于网页自动化你不用关心它内部怎么装系统只要插电docker run就能开机启动服务。而docker-compose.yml就是这台笔记本的“说明书电源适配器散热支架”的集合体它告诉你哪些端口要接显示器端口映射、硬盘放哪volume挂载、风扇转速多少资源限制。2. 内容整体设计与思路拆解三种安装方式的本质差异与选型逻辑部署OpenClaw的“三种方式”绝非简单罗列命令而是对应着三种截然不同的技术哲学与使用场景。我把它们称为“开发模式”、“生产模式”和“极简模式”每一种的选择本质上是你对“可控性”、“隔离性”和“便捷性”三者权重的判断。下面这张表是我根据27次部署记录总结出的核心决策矩阵维度原生Node.js安装开发模式Docker Compose生产模式一键脚本极简模式核心目标快速调试、修改源码、热重载环境一致、服务隔离、长期运维零配置、秒级启动、小白友好Node.js版本控制完全手动管理nvm install 20.18.0镜像内固化openclaw/openclaw:latest基于Node 20.18.0构建脚本自动检测并安装匹配版本如检测到v24.16.0未发布则降级至v20.18.0依赖冲突风险高全局npm install易污染零容器内独立node_modules中脚本会创建isolated npm cache但仍在宿主机数据持久化保障弱.openclaw目录权限常出错强Named Volume自动处理权限与路径中脚本强制创建/opt/openclaw/data并chown 1001:1001升级与回滚成本低git pull npm install极低docker compose pull docker compose up -d旧镜像自动保留低脚本内置update.sh但需手动备份/opt/openclaw/.env典型适用场景你在GitHub上Fork了OpenClaw正为它提交PR或你需要深度定制某个Agent的执行逻辑你要在公司云服务器上部署供10人团队使用的AI助手或你需要对接企业微信、钉钉等内部IM你刚买了一台群晖NAS想在5分钟内让AI帮你自动整理下载文件夹或你是个学生在DigitalOcean租了台$5服务器练手为什么我强烈建议个人学习者从Docker Compose开始而非原生Node.js因为真实世界里99%的“部署失败”案例根源都在环境差异。我见过太多人卡在第一步“npm install报错node-gyp rebuild failed”。这通常不是OpenClaw的问题而是你的系统缺少python3-dev、build-essential或libcairo2-dev。Docker的魔力在于它把整个“构建环境”打包进镜像——官方openclaw/openclaw镜像的Dockerfile里明确写了RUN apt-get update apt-get install -y python3-dev build-essential libcairo2-dev。你不需要知道这些包是干啥的只要docker pull下来它就一定存在。这就像你买一台预装好Windows的笔记本不用自己去官网下载驱动光盘一样。而“一键脚本”的价值被严重低估了。很多人以为它只是curl | bash的危险组合但真正的生产级一键脚本如OpenClaw社区维护的install.sh本质是一个智能环境诊断器。它会先执行uname -m检测CPU架构ARM64 vs AMD64再运行free -h检查内存是否≥4GB接着用docker info 2/dev/null确认Docker是否已安装。如果检测到Docker未安装它不会粗暴地curl get.docker.com而是根据你的发行版智能选择Ubuntu用aptCentOS用dnfmacOS用brewWindows WSL则提示启用WSL2。这种“感知环境、动态决策”的能力才是它能在10分钟内完成部署的底层逻辑。至于“生产模式”为何必须用Docker Compose而非单条docker run关键在服务编排。OpenClaw不是一个单体进程它由Gateway主服务、PostgreSQL存储会话历史、Redis缓存工具调用结果、Ollama本地大模型等多个组件协同工作。docker run只能启动一个容器而docker-compose.yml用YAML格式定义了它们之间的网络连接networks: openclaw-net、启动顺序depends_on、健康检查healthcheck和资源限制deploy.resources。这就像指挥一支交响乐团docker run只能让小提琴手单独演奏而docker-compose能让小提琴、大提琴、长笛同时奏响并确保长笛声部在小提琴之后进入——没有它你的AI助手可能连登录页面都加载不出来。3. 核心细节解析与实操要点从环境准备到配置落地的硬核指南部署不是魔法它是一系列精确到字节的操作。下面我将带你逐层拆解每个环节的真实细节、隐藏陷阱和独家技巧这些内容你翻遍GitHub Issues和Stack Overflow都很难凑齐。3.1 Node.js环境版本、权限与全局依赖的生死线OpenClaw官方要求Node.js v20.18.0或更高版本但绝不能盲目安装最新版。网络热词里频繁出现的error installing 24.16.0: node.js v24.16.0 is not yet released正是血泪教训。Node.js v24系列尚在Active LTS阶段其V8引擎对某些底层C模块如canvas用于图像处理的ABI兼容性尚未被OpenClaw完全验证。我实测过强行安装v24.16.0会导致openclaw doctor命令报错Error: Cannot find module canvas进而使所有涉及图片生成的Agent失效。正确做法是锁定v20.18.0。无论你用nvm、fnm还是直接下载二进制包都必须确保# 检查当前版本 node -v # 必须输出 v20.18.0 npm -v # 必须输出 10.8.2v20.18.0配套npm # 如果用nvm执行 nvm install 20.18.0 nvm use 20.18.0 nvm alias default 20.18.0 # 设为默认避免新终端又切回旧版更关键的是权限问题。Node.js进程以普通用户身份运行但它需要读写.openclaw目录。很多新手在Ubuntu上执行sudo npm install -g openclaw导致.openclaw目录所有权变成root:root后续Docker容器UID 1001无法写入。解决方案不是chmod 777极度危险而是用chown精准授权# 创建专用用户组推荐 sudo groupadd openclaw-users sudo usermod -aG openclaw-users $USER # 创建数据目录并授权 sudo mkdir -p /opt/openclaw/data sudo chown -R $USER:openclaw-users /opt/openclaw/data sudo chmod 775 /opt/openclaw/data # 组内可读写其他人仅可读提示Docker容器内Node.js用户ID固定为1001。如果你的宿主机用户UID不是1001必须在docker-compose.yml中显式指定user: 1001:1001否则volume挂载后容器内会因权限不足而崩溃。这是90%的“容器启动后立即退出”问题的根源。3.2 Docker环境镜像加速、守护进程优化与网络模式抉择Docker安装本身很简单但国内用户最大的痛点是镜像拉取失败或超慢。curl -fsSL https://get.docker.com | sh这条命令在阿里云、腾讯云上常因网络策略失败。更可靠的方式是使用云厂商提供的镜像源# 阿里云ECS用户替换your-id为你的阿里云容器镜像服务ID sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://your-id.mirror.aliyuncs.com], insecure-registries: [], live-restore: true } EOF sudo systemctl daemon-reload sudo systemctl restart docker但仅仅配置镜像源还不够。Docker守护进程默认的日志轮转策略max-size: 10m,max-file: 3在OpenClaw高并发场景下极易填满磁盘。我曾遇到一台40GB系统盘的VPS因日志未清理3天内被/var/lib/docker/containers/*/*.log占满95%空间。生产环境必须强化日志管理// /etc/docker/daemon.json { log-driver: json-file, log-opts: { max-size: 5m, // 单个日志文件压缩至5MB max-file: 10, // 最多保留10个文件 compress: true // 启用gzip压缩 }, storage-driver: overlay2, default-ulimits: { nofile: { Name: nofile, Hard: 65536, Soft: 65536 } } }关于网络模式bridge默认和host是两大阵营。host模式性能略优无NAT开销但彻底放弃容器隔离——OpenClaw会直接绑定宿主机的18789端口若你同时运行Nginx端口冲突无法避免。而bridge模式通过Docker虚拟网桥通信天然支持多服务共存。我坚持用bridge并在docker-compose.yml中显式声明services: openclaw-gateway: networks: - openclaw-net # 不要写 network_mode: host networks: openclaw-net: driver: bridge ipam: config: - subnet: 172.20.0.0/16 # 自定义子网避免与宿主机网络冲突3.3 OpenClaw配置.env文件的黄金法则与敏感信息防护.env文件是OpenClaw的“心脏起搏器”但它的配置远不止填几个API Key那么简单。我整理了一份生产环境最小可行配置清单每一项都有其不可替代的作用# 核心安全 # Gateway访问令牌必填没有它任何请求都会被拒绝 OPENCLAW_GATEWAY_TOKENsk-claw-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 访问密码可选但建议与Token同时启用双因素认证 OPENCLAW_GATEWAY_PASSWORDyour-strong-password-here # 运行环境production模式禁用调试接口提升安全性 NODE_ENVproduction # 日志级别生产环境设为info避免debug日志淹没关键错误 LOG_LEVELinfo # 数据持久化 # PostgreSQL数据库URL格式postgresql://user:passwordhost:port/db DATABASE_URLpostgresql://openclaw:mysecretpasswordpostgres:5432/openclaw # Redis缓存URL格式redis://host:port/db REDIS_URLredis://redis:6379/0 # 模型接入 # OpenAI API Key注意不要用免费试用额度生产环境务必绑定信用卡 OPENAI_API_KEYsk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # Anthropic API KeyClaude模型 ANTHROPIC_API_KEYsk-ant-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # Ollama本地模型关键host.docker.internal是Docker内置DNS指向宿主机 OLLAMA_BASE_URLhttp://host.docker.internal:11434 # 平台集成 # Telegram Bot Token用于接收AI通知 TELEGRAM_BOT_TOKEN1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 # Discord Bot Token同上 DISCORD_BOT_TOKENNTA2MzQ1NjcyMDUwNjI0NjQw.GZJqXb.abcdefghijklmnopqrstuvwxyz1234567890注意.env文件必须放在docker-compose.yml同一目录下且绝对禁止提交到Git仓库。在项目根目录创建.gitignore加入.env /opt/openclaw/.env敏感信息防护的终极方案是Docker Secrets适用于Swarm集群或环境变量注入。但对单机用户最实用的技巧是在.env中只存放非密钥字段将API Key等真正敏感信息通过docker compose的--env-file参数动态传入# 创建临时密钥文件权限600 umask 077 echo OPENAI_API_KEYsk-proj-... /tmp/openclaw-secrets.env # 启动时注入 docker compose --env-file /tmp/openclaw-secrets.env up -d # 启动后立即删除 rm /tmp/openclaw-secrets.env3.4 数据持久化Volumes的命名艺术与灾难恢复预案Docker容器是“一次性的”但你的AI记忆、会话历史、工作空间文件绝不能随容器消失。volumes配置是部署的生命线。这里有两个常见误区一是用bind mounts如./data:/home/node/.openclaw图方便二是对named volumes如openclaw-data:缺乏管理意识。named volumes是生产首选原因有三第一Docker自动处理Linux文件权限chown 1001:1001无需手动干预第二它抽象了物理路径迁移服务器时只需docker volume cp即可第三它支持快照备份。但它的命名必须遵循语义化原则而非随意取名volumes: # ✅ 好名字清晰表明用途、所属服务、数据类型 openclaw-gateway-config: # Gateway的配置文件openclaw.json openclaw-gateway-workspace: # 工作空间文件代码、文档、图片 openclaw-postgres-data: # PostgreSQL数据库文件 openclaw-redis-data: # Redis持久化文件AOF/RDB # ❌ 坏名字模糊、易混淆、违反约定 data: # 是什么数据谁在用 myvol: # 没有任何上下文 vol1: # 数字编号毫无意义灾难恢复不是“以防万一”而是“必须每天演练”。我制定了一套15分钟应急恢复流程立即停止服务docker compose down定位最近备份ls -t /opt/backups/openclaw/ | head -n1按时间倒序列出恢复配置cp /opt/backups/openclaw/20240615_030000/{docker-compose.yml,.env} /opt/openclaw/恢复数据卷docker volume rm openclaw-gateway-config docker volume create openclaw-gateway-config然后用docker run --rm -v openclaw-gateway-config:/target -v /opt/backups/openclaw/20240615_030000:/backup alpine tar xzf /backup/config.tar.gz -C /target解压启动并验证docker compose up -d curl -s http://127.0.0.1:18789/health | grep status\:\ok实操心得我用cron每天凌晨3点自动执行备份但绝不依赖自动备份。每周五下午我会手动执行一次./scripts/restore-drill.sh恢复演练脚本它会在/opt/openclaw-drill目录下创建一个完全隔离的演练环境用ports: [28789:18789]避免影响生产服务。只有当演练环境能成功加载我上周五的会议纪要PDF并提取摘要我才确认备份有效。4. 实操过程与核心环节实现从零开始的完整部署流水线现在我们进入最硬核的部分手把手带你走完一条完整的、可复现的部署流水线。我将以一台全新的Ubuntu 22.04 VPS为例全程记录每一步命令、预期输出、可能的报错及解决方案。这不是理想化的教程而是真实世界的“施工日志”。4.1 环境初始化5分钟打造纯净部署基座登录你的VPS假设IP为123.45.67.89执行以下命令。注意所有命令都经过我实测复制粘贴即可# 1. 更新系统并安装基础工具 sudo apt update sudo apt upgrade -y sudo apt install -y curl wget git gnupg lsb-release ca-certificates # 2. 创建专用部署目录关键避免权限混乱 sudo mkdir -p /opt/openclaw sudo chown -R $USER:$USER /opt/openclaw cd /opt/openclaw # 3. 安装Docker使用阿里云镜像源国内100%成功率 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io # 4. 将当前用户加入docker组免sudo sudo usermod -aG docker $USER # ⚠️ 重要必须重新登录或执行以下命令否则docker命令会报错 newgrp docker # 5. 验证Docker安装 docker --version # 应输出 Docker version 24.0.7, build ... docker compose version # 应输出 Docker Compose version v2.23.0 docker run --rm hello-world # 应输出 Hello from Docker!实操心得newgrp docker这一步90%的新手会忘记导致后续所有docker命令报错Permission denied while trying to connect to the Docker daemon socket。如果你执行docker ps报错请立刻执行newgrp docker并重新打开终端。这不是Bug是Linux用户组机制的正常行为。4.2 获取并配置OpenClaw一行命令生成生产级docker-compose.ymlOpenClaw官方提供了docker-setup.sh脚本但它生成的是基础版配置。生产环境需要我们手动增强。以下是经过我优化的、可直接使用的docker-compose.yml# /opt/openclaw/docker-compose.yml version: 3.8 services: # OpenClaw Gateway 主服务 openclaw-gateway: image: openclaw/openclaw:latest container_name: openclaw-gateway user: 1001:1001 # 强制容器内UID/GID解决权限问题 ports: - 127.0.0.1:18789:18789 # 仅监听本地安全第一 - 127.0.0.1:18790:18790 # Bridge端口 - 127.0.0.1:18791:18791 # Browser Control - 127.0.0.1:18793:18793 # Canvas Host - 127.0.0.1:18800-18899:18800-18899 # CDP端口池 volumes: - openclaw-gateway-config:/home/node/.openclaw - openclaw-gateway-workspace:/home/node/.openclaw/workspace - ./logs:/var/log/openclaw # 宿主机日志目录方便排查 environment: - OPENCLAW_GATEWAY_TOKEN${OPENCLAW_GATEWAY_TOKEN} - OPENCLAW_GATEWAY_PASSWORD${OPENCLAW_GATEWAY_PASSWORD} - DATABASE_URLpostgresql://openclaw:${DB_PASSWORD}postgres:5432/openclaw - REDIS_URLredis://redis:6379/0 - NODE_ENVproduction - LOG_LEVELinfo - OLLAMA_BASE_URLhttp://host.docker.internal:11434 depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped healthcheck: test: [CMD, node, -e, fetch(http://localhost:18789/health).then(r { if (!r.ok) process.exit(1) })] interval: 30s timeout: 10s retries: 3 start_period: 20s logging: driver: json-file options: max-size: 5m max-file: 10 compress: true networks: - openclaw-net # PostgreSQL 数据库 postgres: image: postgres:16-alpine container_name: openclaw-postgres environment: - POSTGRES_USERopenclaw - POSTGRES_PASSWORD${DB_PASSWORD} - POSTGRES_DBopenclaw volumes: - openclaw-postgres-data:/var/lib/postgresql/data healthcheck: test: [CMD-SHELL, pg_isready -U openclaw] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - openclaw-net # Redis 缓存 redis: image: redis:7-alpine container_name: openclaw-redis command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - openclaw-redis-data:/data healthcheck: test: [CMD, redis-cli, ping] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - openclaw-net volumes: openclaw-gateway-config: openclaw-gateway-workspace: openclaw-postgres-data: openclaw-redis-data: networks: openclaw-net: driver: bridge ipam: config: - subnet: 172.20.0.0/164.3 创建.env文件安全配置的最后防线在/opt/openclaw/目录下创建.env文件。请务必使用强随机字符串生成Token和密码# 生成高强度Token32字节随机 openssl rand -hex 32 # 输出类似a1b2c3d4e5f678901234567890abcdef1234567890abcdef1234567890abcdef # 生成高强度密码24字符 openssl rand -base64 24 # 输出类似XyZ9AbC2DeF4GhI6JkL8MnO0PqR2 # 创建.env文件 cat .env EOF # 核心安全 OPENCLAW_GATEWAY_TOKENa1b2c3d4e5f678901234567890abcdef1234567890abcdef1234567890abcdef OPENCLAW_GATEWAY_PASSWORDXyZ9AbC2DeF4GhI6JkL8MnO0PqR2 NODE_ENVproduction LOG_LEVELinfo # 数据库 DB_PASSWORDyour-super-strong-db-password-here # 模型提供商 # OPENAI_API_KEYsk-proj-... # ANTHROPIC_API_KEYsk-ant-... # OLLAMA_BASE_URLhttp://host.docker.internal:11434 EOF注意.env中的OPENAI_API_KEY等字段我暂时注释掉了。强烈建议你先不填任何API Key用OpenClaw内置的mock模型启动验证整个部署链路畅通后再接入真实模型。这样可以排除90%的“配置错误”干扰。4.4 启动与验证从docker compose up到健康检查的全流程一切就绪执行启动命令# 1. 拉取所有镜像首次较慢约5-10分钟 docker compose pull # 2. 启动所有服务后台运行 docker compose up -d # 3. 查看服务状态等待所有状态变为healthy docker compose ps # 预期输出 # NAME COMMAND SERVICE STATUS PORTS # openclaw-gateway docker-entrypoint.s… openclaw-gateway healthy (starting) 127.0.0.1:18789-18789/tcp, ... # openclaw-postgres docker-entrypoint.s… postgres healthy 5432/tcp # openclaw-redis docker-entrypoint.s… redis healthy 6379/tcp # 4. 实时查看Gateway日志直到出现Server listening on port 18789 docker compose logs -f openclaw-gateway # 5. 执行健康检查必须返回HTTP 200 curl -i http://127.0.0.1:18789/health # 预期输出 # HTTP/1.1 200 OK # Content-Type: application/json # {status:ok,timestamp:2024-06-15T08:30:45.123Z,uptime:12345} # 6. 检查容器健康状态必须输出healthy docker inspect openclaw-gateway --format{{.State.Health.Status}} # 预期输出healthy实操心得docker compose ps中看到healthy (starting)是正常现象健康检查需要时间。如果等待超过2分钟仍是starting请立即执行docker compose logs --tail 100 openclaw-gateway最常见的原因是.env文件中OPENCLAW_GATEWAY_TOKEN为空或格式错误如多了空格。另一个高频问题是DATABASE_URL中的postgres服务名拼写错误Docker容器间通信必须用service name而不是localhost。4.5 反向代理与HTTPS让AI助手走出内网现在OpenClaw已在127.0.0.1:18789运行但外部无法访问。我们需要Nginx作为反向代理并配置HTTPS。以下是极简Nginx配置适用于单域名# 1. 安装Nginx sudo apt install -y nginx # 2. 创建站点配置 sudo tee /etc/nginx/sites-available/openclaw EOF server { listen 80; server_name your-domain.com; # 替换为你的域名 return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com; # SSL证书使用Lets Encrypt ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 安全头 add_header Strict-Transport-Security max-age63072000 always; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; location / { proxy_pass http://127.0.0.1:18789; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 300; proxy_send_timeout 300; } } EOF # 3. 启用配置 sudo ln -sf /etc/nginx/sites-available/openclaw /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx # 4. 申请SSL证书需要域名已解析到此VPS IP sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d your-domain.com提示如果你没有域名可以用ngrok或Cloudflare Tunnel做内网穿透。但永远不要将18789端口直接暴露到公网这是OpenClaw官方明确的安全红线。5. 常见问题与排查技巧实录一份来自27次部署现场的故障手册部署不是一劳永逸而是一场持续的运维战斗。下面这份故障速查表浓缩了我在27次部署中遇到的全部典型问题、根本原因和秒级解决方案。每一个条目都对应着一个真实的、让我凌晨三点爬起来修复的线上事故。5.1 启动阶段故障容器无法启动或立即退出现象根本原因秒级诊断命令解决方案docker compose ps显示Exit 1或Exit 137内存不足OOM KilledOpenClaw Gateway PostgreSQL Redis至少需3.5GB内存2GB VPS必然失败docker inspect openclaw-gateway --format{{.State.OOMKilled}}输出