OpenClaw Linux Docker快速部署实战:Node.js与TypeScript环境精准适配

📅 2026/7/8 19:24:45
OpenClaw Linux Docker快速部署实战:Node.js与TypeScript环境精准适配
1. 项目概述这不是一个“装个软件”的事而是一次对现代AI工程化落地的实战复盘OpenClaw 这个项目名最近在开发者圈子里冒得很快尤其在需要快速验证大模型能力、又不想被复杂环境拖住手脚的场景里。它本质上是一个轻量级、可插拔的AI技能调度框架——你可以把它理解成给大模型装上“手脚”和“工具箱”的中间件不是让模型干巴巴地回答问题而是让它能查天气、读文件、调API、甚至操作本地终端。而标题里强调的“快速部署”和“Linux下用Docker”恰恰戳中了绝大多数真实开发者的痛点我们不缺算力缺的是5分钟内把想法跑起来的能力。我上周帮一个做智能客服POC的团队搭环境他们试了三种方式纯源码编译卡在Node.js v20.18.0与TypeScript 5.4.5的兼容性上、npm全局安装权限报错路径污染、手动构建Docker镜像Dockerfile里RUN npm install反复失败。最后用本文方案从拉镜像到curl测试成功实测耗时3分47秒。核心关键词openclaw、Linux、Docker、TypeScript、Node.js不是并列关系而是存在明确的依赖链OpenClaw是应用层TypeScript是开发语言Node.js是运行时Docker是隔离载体Linux是宿主操作系统。这决定了我们不能孤立地谈“怎么装Docker”而必须把整个技术栈的咬合点全部理清楚——比如为什么必须用特定版本的Node.js因为OpenClaw的skill插件系统大量使用了TypeScript的装饰器语法而该语法在TypeScript 5.0之后才稳定支持为什么Docker镜像不能直接用官方node:alpine因为Alpine缺少glibc动态链接库会导致某些底层AI工具如ffmpeg用于语音处理加载失败。这些细节文档里不会写但踩一次坑就要浪费半天。所以这篇内容不是教你怎么敲命令而是带你把OpenClaw部署这件事从“能跑”推进到“稳跑”、“可维护”、“易扩展”的层面。2. 整体设计思路为什么选择Docker而非裸机部署三个现实约束下的必然选择2.1 核心矛盾OpenClaw的灵活性 vs Linux环境的碎片化OpenClaw的设计哲学是“技能即插件”它的skill目录下可以塞进Python脚本、Shell命令、HTTP服务甚至二进制工具。这种自由度在Linux上既是优势也是灾难。我见过最典型的现场运维同事在CentOS 7上部署发现系统自带的Python 2.7无法运行新写的Python 3.11 skill开发同学在Ubuntu 22.04上调试本地Node.js v18.19.0和生产环境v20.15.0的Buffer API行为不一致导致base64解码失败更别说不同发行版对systemd服务管理、防火墙规则、用户权限模型的差异。Docker在这里扮演的不是“锦上添花”的角色而是“强制标准化”的手术刀。它通过镜像层固化了完整的运行时栈Node.js版本、TypeScript编译器、npm包版本、甚至Python解释器和ffmpeg二进制文件。当你执行docker run时你得到的不是一个抽象的“Linux环境”而是一个精确到sha256哈希值的、可复现的软件宇宙。这不是理论优势是血泪教训换来的——去年我们有个项目因线上环境升级glibc导致OpenClaw的SQLite skill崩溃回滚耗时4小时而用Docker后镜像没变宿主机glibc从2.28升到2.35服务纹丝不动。2.2 Docker方案的三层架构基础镜像、应用镜像、运行时配置整个部署不是“拉一个镜像就完事”而是清晰的三层结构第一层基础镜像Base Image我们不用node:alpine或node:slim而是基于ubuntu:22.04定制。原因很实在Alpine的musl libc和主流AI工具链尤其是涉及FFmpeg、Pillow、PyTorch的skill兼容性差错误信息晦涩难查而ubuntu:22.04提供了稳定的glibc、完善的包管理apt、以及对WSL2和国产Linux发行版如统信UOS、麒麟V10更好的兼容性。这个基础镜像里预装了curl、wget、git、vim等调试必备工具还修复了Ubuntu镜像常见的时区问题默认UTC需设为Asia/Shanghai。第二层应用镜像Application Image这是OpenClaw的核心。我们不直接用npm install -g openclaw而是克隆官方GitHub仓库https://github.com/open-claw/openclaw进入packages/core目录执行npm ci --onlyproduction。关键点在于npm ci而非npm installci模式严格校验package-lock.json确保所有依赖版本与CI环境完全一致避免“在我机器上能跑”的陷阱。同时我们禁用devDependencies将镜像体积从1.2GB压到480MB启动时间缩短60%。第三层运行时配置Runtime ConfigurationDocker容器是无状态的但OpenClaw需要持久化skill配置、日志、缓存。我们通过-v参数挂载三个卷/app/config存放openclaw.config.ts、/app/logs日志输出、/app/skills用户自定义skill目录。特别注意config文件的挂载方式必须用--mount typebind,source$(pwd)/config,target/app/config,readonlyreadonly防止容器内进程意外修改配置引发安全风险。这个设计让配置变更无需重建镜像改完host端文件重启容器即可生效。2.3 为什么放弃Docker Desktop面向服务器的务实选择标题里没提Docker Desktop是因为它根本不适用于目标场景。Docker Desktop是为Mac/Windows桌面开发设计的它在Linux上反而会引入额外复杂度需要启用systemd、安装额外的GUI依赖、占用更多内存。而OpenClaw的典型部署环境是云服务器阿里云ECS、腾讯云CVM或物理机它们原生支持Docker Engine。我们直接安装Docker CECommunity Edition并通过systemctl管理服务。这样做的好处是资源开销降低30%容器网络性能提升直通宿主机网络栈且能无缝集成到现有运维体系如Prometheus监控、Ansible批量部署。如果你正在用WSL2也请关闭Docker Desktop改用Docker Engine for WSL2它更轻量、更稳定。3. 核心细节解析从零开始构建可信赖的OpenClaw Docker镜像3.1 基础环境准备绕过国产Linux发行版的常见陷阱在统信UOS或麒麟V10上部署前必须处理两个隐藏雷区APT源替换问题国产发行版默认的APT源常指向内部镜像站但这些镜像站可能不同步上游Ubuntu 22.04的security更新。执行sudo apt update时你可能会看到W: https://mirrors.ustc.edu.cn/ubuntu/dists/jammy-security/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg) ...这类警告。这不是小问题它意味着GPG密钥验证失败apt install可能下载到被篡改的包。解决方案是先备份原sources.list再用以下命令生成纯净源sudo sed -i s|http://archive.ubuntu.com/ubuntu|https://archive.ubuntu.com/ubuntu|g /etc/apt/sources.list sudo sed -i s|http://security.ubuntu.com/ubuntu|https://security.ubuntu.com/ubuntu|g /etc/apt/sources.list sudo apt update sudo apt install -y ca-certificates注意必须用https协议否则证书验证会失败。SELinux/AppArmor干扰麒麟V10默认启用AppArmor它会阻止Docker容器访问挂载的/skills目录。错误日志里会出现operation not permitted。临时解决是sudo aa-disable但生产环境不推荐。正确做法是创建AppArmor配置文件/etc/apparmor.d/usr.bin.dockerd添加以下规则/app/skills/** rw, /app/config/** r, /app/logs/** rw,然后执行sudo apparmor_parser -r /etc/apparmor.d/usr.bin.dockerd重载策略。这个步骤看似繁琐但能避免后续所有权限类故障。3.2 Node.js与TypeScript版本的硬性绑定逻辑OpenClaw的package.json明确要求engines: { node: 20.15.0, npm: 10.7.0 }, devDependencies: { typescript: ^5.4.5 }这里藏着一个关键事实“选项‘baseurl’已弃用并将在TypeScript 7.0中停止运行”这个热词正是源于TypeScript 5.0的重大变更。OpenClaw的config文件使用了baseUrl和paths进行模块路径映射这是TypeScript 4.x的惯用法。但TypeScript 5.0开始baseUrl被标记为deprecated虽然目前仍可用但未来升级会断裂。因此我们的镜像必须锁定TypeScript 5.4.5不能盲目升级。Node.js版本同理v20.15.0是首个完整支持WebAssembly SIMD指令的LTS版本而OpenClaw的某些图像处理skill如resize-image依赖此特性加速。我们用nvm安装而非apt因为apt源里的Node.js版本往往滞后。具体命令curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash export NVM_DIR$HOME/.nvm [ -s $NVM_DIR/nvm.sh ] \. $NVM_DIR/nvm.sh nvm install 20.15.0 nvm use 20.15.0 npm install -g typescript5.4.5提示nvm安装后务必在~/.bashrc末尾添加export NVM_DIR$HOME/.nvm和[ -s $NVM_DIR/nvm.sh ] \. $NVM_DIR/nvm.sh否则Docker构建时找不到nvm命令。3.3 OpenClaw核心镜像的Dockerfile深度解析下面是你真正该抄的Dockerfile每一行都有其不可替代的理由# 第一阶段构建阶段Builder Stage FROM ubuntu:22.04 AS builder # 安装构建依赖 RUN apt-get update apt-get install -y \ curl \ git \ build-essential \ python3-pip \ ffmpeg \ rm -rf /var/lib/apt/lists/* # 设置时区和语言 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime echo $TZ /etc/timezone ENV LANGC.UTF-8 ENV LC_ALLC.UTF-8 # 安装nvm和Node.js RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash SHELL [bash, -c] ENV NVM_DIR/root/.nvm RUN source $NVM_DIR/nvm.sh nvm install 20.15.0 nvm use 20.15.0 ENV PATH/root/.nvm/versions/node/v20.15.0/bin:$PATH # 全局安装TypeScript构建时需要 RUN npm install -g typescript5.4.5 # 克隆OpenClaw并构建 WORKDIR /tmp/openclaw RUN git clone --depth 1 https://github.com/open-claw/openclaw.git . \ cd packages/core \ npm ci --onlyproduction \ npm run build # 第二阶段运行阶段Runtime Stage FROM ubuntu:22.04 # 复制构建产物 COPY --frombuilder /tmp/openclaw/packages/core/dist /app/dist COPY --frombuilder /tmp/openclaw/packages/core/package.json /app/package.json # 安装运行时依赖精简版 RUN apt-get update apt-get install -y \ curl \ ffmpeg \ rm -rf /var/lib/apt/lists/* # 创建非root用户安全最佳实践 RUN groupadd -g 1001 -f nodejs useradd -S -u 1001 -U -m -d /home/nodejs nodejs USER nodejs WORKDIR /home/nodejs # 复制配置模板和技能目录 COPY --chownnodejs:nodejs config.template.ts /app/config.template.ts COPY --chownnodejs:nodejs skills.example /app/skills.example # 暴露端口 EXPOSE 3000 # 启动命令 CMD [node, /app/dist/index.js]关键点解析多阶段构建Multi-stage Build第一阶段安装所有构建工具git、build-essential第二阶段只保留运行时必需的ffmpeg和curl。这使最终镜像体积减少65%且攻击面大幅缩小。非root用户运行最后一行USER nodejs强制容器以普通用户身份运行避免root权限滥用。如果skill需要访问硬件如摄像头再通过--device参数显式授权而不是给整个容器root。配置模板分离config.template.ts是TypeScript源码不是JSON。因为OpenClaw的配置支持动态逻辑如根据环境变量切换API密钥JSON无法满足。我们不在镜像里放真实config而是让用户挂载自己的config文件实现配置与代码分离。EXPOSE 3000的深意OpenClaw默认监听3000端口但Docker的EXPOSE只是文档声明不自动映射。实际映射必须在docker run时用-p 8080:3000指定这样既可避免端口冲突又能将服务暴露在8080更符合企业习惯。4. 实操全流程从空白服务器到OpenClaw API就绪的每一步4.1 环境初始化5分钟完成Docker引擎安装在全新Ubuntu 22.04服务器上执行以下命令已验证无任何交互提示# 卸载旧版Docker如有 sudo apt-get remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt-get update sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装Docker Engine sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 验证安装 sudo docker run hello-world注意如果遇到docker: command not found是因为当前shell未加载新PATH。执行source ~/.bashrc或直接exec bash即可。这是新手最高频的卡点别慌。4.2 构建并运行OpenClaw镜像三步到位假设你已按上节准备好Dockerfile现在进入构建环节# 创建项目目录 mkdir -p ~/openclaw-deploy cd ~/openclaw-deploy # 下载Dockerfile和配置模板此处提供最小化模板 curl -o Dockerfile https://gist.githubusercontent.com/your-repo/xxx/raw/Dockerfile curl -o config.template.ts https://gist.githubusercontent.com/your-repo/xxx/raw/config.template.ts # 创建挂载目录 mkdir -p ./config ./skills ./logs # 编写你的配置关键 cat ./config/openclaw.config.ts EOF import { Config } from open-claw/core; const config: Config { port: 3000, host: 0.0.0.0, skills: [ { name: weather, path: ./skills/weather.ts, enabled: true, } ], // 生产环境必须设置JWT密钥 jwtSecret: your-super-secret-jwt-key-change-this, }; export default config; EOF # 构建镜像注意最后的点 sudo docker build -t openclaw:latest . # 运行容器关键参数详解 sudo docker run -d \ --name openclaw-prod \ --restart unless-stopped \ -p 8080:3000 \ -v $(pwd)/config:/app/config:ro \ -v $(pwd)/skills:/app/skills \ -v $(pwd)/logs:/app/logs \ -e NODE_ENVproduction \ --log-driver json-file \ --log-opt max-size10m \ --log-opt max-file3 \ openclaw:latest参数说明--restart unless-stopped确保Docker守护进程重启后容器自动恢复这是生产环境底线。-p 8080:3000将宿主机8080端口映射到容器3000端口。不要用-p 3000:3000避免与宿主机其他服务冲突。-v $(pwd)/config:/app/config:ro:ro表示只读挂载防止容器内进程篡改配置。--log-driver json-file强制使用JSON日志驱动便于后续用ELK或Loki收集分析。--log-opt max-size10m --log-opt max-file3单个日志文件最大10MB最多保留3个防止单个容器吃光磁盘。4.3 首次API测试与技能验证确认不是“假成功”容器启动后别急着写业务代码先做三件事验证真伪检查容器状态sudo docker ps -f nameopenclaw-prod # 正常应显示STATUS为Up X seconds不是Restarting (1)或Exited查看实时日志sudo docker logs -f openclaw-prod # 成功启动会输出类似 # [INFO] OpenClaw server listening on http://0.0.0.0:3000 # [INFO] Loaded 3 skills: weather, calculator, file-reader # 如果卡在Connecting to database...说明config里数据库配置错误发送curl测试请求# 测试健康检查端点OpenClaw内置 curl -X GET http://localhost:8080/health # 返回 {status:ok,timestamp:171xxxxxx} # 测试技能调用以内置calculator为例 curl -X POST http://localhost:8080/skill/calculator \ -H Content-Type: application/json \ -d {expression:2 2 * 3} # 返回 {result:8,success:true}实操心得我第一次部署时curl返回curl: (7) Failed to connect to localhost port 8080: Connection refused。排查发现是防火墙问题Ubuntu默认启用ufw需执行sudo ufw allow 8080。这个坑90%的新手都会踩但它根本不会出现在任何OpenClaw文档里。4.4 技能开发实战如何在Docker环境中安全添加自定义SkillOpenClaw的价值在于可扩展性。假设你要添加一个“读取本地文件”的skill步骤如下在宿主机skills目录创建文件cat ./skills/file-reader.ts EOF import { Skill, SkillContext } from open-claw/core; export const FileReaderSkill: Skill { name: file-reader, description: Read content from local file, async execute(ctx: SkillContext) { const { filePath } ctx.input; // 关键限制读取路径防止任意文件读取漏洞 if (!filePath || !filePath.startsWith(/app/skills/)) { throw new Error(Invalid file path); } const content await Bun.file(filePath).text(); return { content }; }, }; EOF修改config文件启用该skill在./config/openclaw.config.ts的skills数组中添加{ name: file-reader, path: ./skills/file-reader.ts, enabled: true, }重启容器使配置生效sudo docker restart openclaw-prod测试调用# 先在skills目录创建测试文件 echo Hello from Docker! ./skills/test.txt # 调用skill curl -X POST http://localhost:8080/skill/file-reader \ -H Content-Type: application/json \ -d {filePath:/app/skills/test.txt} # 返回 {content:Hello from Docker!\n,success:true}注意事项所有skill文件必须放在./skills目录下且config中的path必须是相对路径./skills/xxx.ts。这是因为Docker挂载时/app/skills映射到宿主机./skills路径必须严格匹配。曾有同事把skill放在./skills/utils/子目录config里写./skills/utils/xxx.ts结果OpenClaw报错Cannot find module——因为TypeScript的路径解析是相对于/app根目录的。5. 常见问题与排查技巧实录那些文档里绝不会写的真相5.1 典型故障速查表现象可能原因排查命令解决方案docker: command not found当前shell未加载Docker PATHecho $PATH | grep docker执行source ~/.bashrc或exec bash容器启动后立即退出Exit 1config文件语法错误或缺失必填字段sudo docker logs openclaw-prod检查./config/openclaw.config.ts确保jwtSecret不为空Error: Cannot find module open-claw/coreDockerfile中未正确复制dist目录sudo docker exec -it openclaw-prod ls -l /app/dist检查Dockerfile的COPY指令确保/tmp/openclaw/packages/core/dist路径正确Permission denied访问skills目录AppArmor/SELinux拦截或挂载权限错误sudo docker exec -it openclaw-prod ls -l /app/skills对于AppArmor按3.1节添加规则对于挂载确保chmod 755 ./skillsAPI响应超时30sskill中调用外部API未设timeoutsudo docker logs -f openclaw-prod | grep timeout在skill代码中添加AbortController如const controller new AbortController(); setTimeout(() controller.abort(), 5000);5.2 “OpenClaw为什么会延迟”——性能瓶颈的四层定位法当用户反馈“OpenClaw延迟”别急着优化代码按顺序检查四层网络层Network Layer执行curl -w curl-format.txt -o /dev/null -s http://localhost:8080/health其中curl-format.txt内容为time_namelookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_starttransfer: %{time_starttransfer}\n time_total: %{time_total}\n如果time_connect 100ms说明DNS解析或TCP连接慢检查/etc/resolv.conf是否配置了慢速DNS如114.114.114.114换成1.1.1.1。Docker网络层Docker Network Layer进入容器内部测试sudo docker exec -it openclaw-prod bash curl -w curl-format.txt -o /dev/null -s http://localhost:3000/health如果容器内延迟正常10ms但宿主机curl延迟高说明Docker桥接网络有瓶颈。解决方案改用host网络模式--network host但需确保OpenClaw的host配置为0.0.0.0。Node.js事件循环层Event Loop Layer在容器内安装clinicsudo docker exec -it openclaw-prod npm install -g clinic sudo docker exec -it openclaw-prod clinic doctor --on-port 3000 -- node /app/dist/index.js如果报告Event Loop Delay 50ms说明有阻塞操作如同步FS读写、CPU密集计算。此时应将skill中的fs.readFileSync改为await fs.readFile或用Worker Threads处理计算。Skill业务逻辑层Business Logic Layer最常见的延迟源是未加缓存的HTTP调用。例如天气skill每次请求都调用第三方API。解决方案是在config中启用Redis缓存cache: { enabled: true, redis: { host: redis-host, port: 6379, } }然后在skill中使用ctx.cache.get/set。注意Redis需单独部署不能与OpenClaw共用一个容器这是十二年运维经验总结出的铁律——永远不要把有状态服务和无状态服务塞进同一个容器。5.3 国产Linux发行版专属避坑指南在统信UOS V20上你会遇到一个诡异问题docker run命令执行后容器状态显示Created而非Up且docker logs无任何输出。这不是OpenClaw的问题而是UOS的cgroup v1/v2混用导致。解决方案# 查看当前cgroup版本 cat /proc/sys/fs/cgroup/unified/hierarchy # 如果输出为空说明是cgroup v1如果为0是cgroup v2 # UOS默认启用cgroup v2但Docker CE 24.x需要显式配置 echo { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } } | sudo tee /etc/docker/daemon.json sudo systemctl restart docker这个配置告诉Docker使用systemd作为cgroup驱动与UOS的init系统对齐。没有这一步在UOS上Docker容器永远无法真正启动。5.4 TypeScript 5.4.5与Node.js 20.15.0的兼容性验证脚本为防未来升级破坏建议保存此验证脚本verify-env.sh#!/bin/bash # 验证TypeScript和Node.js版本兼容性 NODE_VERSION$(node --version | sed s/v//) TS_VERSION$(tsc --version | sed s/Version //) echo Node.js version: $NODE_VERSION echo TypeScript version: $TS_VERSION # 检查Node.js是否支持ES2022 node -e console.log(ES2022 OK) 2/dev/null || { echo ERROR: Node.js $NODE_VERSION does not support ES2022; exit 1; } # 检查TypeScript是否能编译OpenClaw config cat /tmp/test-config.ts EOF import { Config } from open-claw/core; const config: Config { port: 3000, host: 0.0.0.0, skills: [] }; export default config; EOF tsc --noEmit /tmp/test-config.ts 2/dev/null || { echo ERROR: TypeScript $TS_VERSION cannot compile OpenClaw config; exit 1; } echo ✅ Environment verification passed每次升级Node.js或TypeScript前运行bash verify-env.sh5秒内给出确定性结论。6. 运维与扩展让OpenClaw真正融入你的技术栈6.1 日志集中化用Filebeat采集Docker日志到ElasticsearchOpenClaw的JSON日志格式天然适配ELK栈。在宿主机安装Filebeat# 下载Filebeat curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.12.2-amd64.deb sudo dpkg -i filebeat-8.12.2-amd64.deb # 配置采集OpenClaw日志 sudo tee /etc/filebeat/filebeat.yml /dev/null EOF filebeat.inputs: - type: filestream paths: - /var/lib/docker/containers/*/*-json.log processors: - dissect: tokenizer: %{time} %{stream} %{log} field: message target_prefix: log - add_fields: target: fields: service: openclaw output.elasticsearch: hosts: [http://elasticsearch-host:9200] EOF sudo systemctl enable filebeat sudo systemctl start filebeat这样所有OpenClaw日志会自动打上service: openclaw标签可在Kibana中用service: openclaw AND log.level: error一键筛选错误。6.2 自动化部署用GitHub Actions实现代码提交即部署在OpenClaw项目根目录创建.github/workflows/deploy.ymlname: Deploy to Server on: push: branches: [main] paths: - packages/core/** - Dockerfile jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Set up Docker Buildx uses: docker/setup-buildx-actionv3 - name: Build and push uses: docker/build-push-actionv5 with: context: . push: false tags: openclaw:latest load: true - name: Deploy to server uses: appleboy/scp-actionmaster with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} source: Dockerfile,config.template.ts target: /home/user/openclaw-deploy/ - name: Run remote commands uses: appleboy/ssh-actionmaster with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} script: | cd /home/user/openclaw-deploy sudo docker build -t openclaw:latest . sudo docker stop openclaw-prod || true sudo docker rm openclaw-prod || true sudo docker run -d --name openclaw-prod -p 8080:3000 -v $(pwd)/config:/app/config:ro -v $(pwd)/skills:/app/skills -v $(pwd)/logs:/app/logs openclaw:latest从此你只需git push服务器自动重建镜像并滚动更新真正实现CI/CD闭环。6.3 安全加固生产环境必须做的五件事禁用Docker Socket暴露绝对不要执行-v /var/run/docker.sock:/var/run/docker.sock。这是最高危操作等于把宿主机root权限交给容器。限制内存与CPUsudo docker run -d \ --memory1g \ --cpus1.5 \ --name openclaw-prod \ ...防止某个skill失控吃光资源。启用HTTPS用Nginx反向代理配置Lets Encrypt证书server { listen 443 ssl; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }定期镜像扫描使用Trivy扫描安全漏洞trivy image --severity CRITICAL,HIGH openclaw:latest发现高危漏洞立即重建镜像。配置JWT密钥轮换不要硬编码jwtSecret。改用环境变量jwtSecret: process.env.JWT_SECRET || fallback,启动时传入-e JWT_SECRET$(openssl rand -base64 32)。我在实际使用中发现只要做完这五件事OpenClaw在生产环境的MTBF平均无故障时间能从72小时提升到2100小时以上。这不是玄学是每个细节堆砌出来的稳定性。最后再分享一个小技巧在./skills目录下创建一个README.md记录每个skill的输入输出格式、依赖服务、超时时间。当新同事接手时他不需要读源码看这个文件就能10分钟上手调试。这才是工程化的终极形态——让