尧图精选

企业云平台部署Openclaw的实践:Docker+Nginx+OpenSSL 全链路配置与验证

🕒 发布时间:2026/10/1 7:40:25 📁 来源:尧图网络
1. 企业云平台里把 Openclaw 跑成 HTTPS 服务到底难在哪Openclaw 是一个可以自托管的个人 AI 助手网关能对接多种大模型、消息渠道和 Agent 工具适合企业内部研发云平台给每位用户开一个独立实例。它默认只监听 loopback也就是 127.0.0.1这在单机本地用没问题但一旦放到云平台上用户要通过浏览器或客户端从外部访问就必须解决三件事容器怎么编排、流量怎么安全转发、证书怎么配。我所在的环境是一个内部研发云平台用户可以自助启动 Docker 容器平台通过端口映射把服务暴露出去。直接暴露 Openclaw 的 18789 端口风险很大因为它的控制台和 API 一旦被扫描到攻击面相当可观。所以我的方案是在同一个容器里加一层 Nginx用 HTTPS 对外Openclaw 本体继续只绑 loopback外部只能通过 Nginx 的 TLS 入口进来。这篇文章会交付一套可复制的落地路径docker-compose 片段、Nginx server 块、OpenSSL 自签证书生成命令以及 https 访问、证书链校验、容器健康检查的验证动作。适合正在做企业内部 AI 平台、需要把 Openclaw 容器化并加上 HTTPS 的工程师跟做。下面所有命令和配置我都实际跑过版本基于 Openclaw 2026.3.8。2. 前置准备TaoToken 接入与 Openclaw 模型配置Openclaw 本身只是网关真正干活的是背后的大模型。企业场景下模型来源通常有两种自建推理服务或者接一个统一的模型 API 网关。我这边用 TaoToken 作为模型接入层它的好处是一个 Key 能覆盖多种模型Openclaw 的 provider 配置里只要填 Base URL、Key 和 Model ID 三件套就行不用为每个模型单独维护一套凭证。TaoToken 的 API 地址是 https://taotoken.net/api注意这个地址不带任何查询参数直接作为 OpenAI 兼容的 base_url 使用。你需要在控制台创建一个 API Key然后把它写进 Openclaw 的 provider 配置。如果你还没建 Key可以先去 API Keys 页面生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker_nginx_opensslOpenclaw 的模型配置写在 openclaw.json 里provider 段落大致长这样把 baseUrl 指向 TaoTokenapiKey 换成你自己的model 填你要用的模型 ID{ providers: { taotoken: { type: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoToken密钥, models: { default: { id: claude-sonnet-4-5, name: Claude Sonnet 4.5 } } } } }这里有个容易踩的点baseUrl 结尾不要加 /v1Openclaw 的 openai-compatible 适配器会自己拼路径加了反而会变成 /v1/v1/chat/completions 导致 404。Model ID 要和你实际要调用的模型对齐写错了会在请求时返回 model not found。如果你不确定该填哪个 ID可以在模型对话页面先手动试一次确认能通再写进配置https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker_nginx_openssl对于长期跑 Agent 或需要频繁编码调用的场景Coding Plan 会比按量计费更划算适合企业内部多人共用的网关型部署https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker_nginx_openssl前置准备做完后你手上应该有三样东西一个可用的 TaoToken Key、确认过的 Model ID、以及云平台的容器 IP我这边是 172.18.193.247你换成自己的。接下来进入证书和 Nginx 配置。3. 可复制配置OpenSSL 自签证书 Nginx server 块 Dockerfile这一节是全文的核心所有片段都可以直接复制改 IP 使用。顺序是先生成证书再写 Nginx 配置再写 Openclaw 的 gateway 配置最后用 Dockerfile 把 Nginx 和证书打进镜像。3.1 生成云平台 IP 的自签证书因为服务是通过云平台 IP 加端口访问的证书的 SAN 里必须包含这个 IP否则浏览器会报证书不匹配。先创建 openssl.cnf[req] default_bits 2048 distinguished_name req_distinguished_name req_extensions req_ext x509_extensions v3_req prompt no [req_distinguished_name] countryName CN stateOrProvinceName Beijing localityName Beijing organizationName Example Inc. organizationalUnitName IT commonName 172.18.193.247 [req_ext] subjectAltName alt_names [v3_req] subjectAltName alt_names [alt_names] IP.1 172.18.193.247 DNS.1 internal.example.com把 IP.1 换成你云平台实际的容器 IP如果有多个入口 IP 就继续加 IP.2、IP.3。DNS.1 是可选的如果你有内部域名解析也可以加上。然后生成私钥和自签证书有效期 365 天openssl genrsa -out myip.key 2048 openssl req -x509 -new -nodes \ -key myip.key \ -sha256 -days 365 \ -out myip.crt \ -config openssl.cnf \ -extensions v3_req生成完一定要验证 SAN 里确实带了 IP这一步很多人跳过结果浏览器一直报错openssl x509 -in myip.crt -text -noout | grep -A 1 Subject Alternative Name正常输出里应该能看到IP Address:172.18.193.247。如果没有说明 openssl.cnf 的 alt_names 没生效检查 -extensions v3_req 参数是否漏了。3.2 Nginx server 块配置Nginx 负责 TLS 终止和反向代理把外部 HTTPS 请求转到 Openclaw 本体的 loopback 端口。创建 default.confserver { listen 18999 ssl http2; server_name 172.18.193.247; ssl_certificate /etc/nginx/certs/myip.crt; ssl_certificate_key /etc/nginx/certs/myip.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://localhost: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 $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } } server { listen 3001 ssl http2; server_name 172.18.193.247; ssl_certificate /etc/nginx/certs/myip.crt; ssl_certificate_key /etc/nginx/certs/myip.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } }18999 端口转发到 Openclaw 的 187893001 端口转发到 OpenClaw-bot-review 的 3000。后者是一个轻量级 Web 仪表盘能一览所有机器人、Agent、模型、会话的运行状态内置像素风动画办公室Agent 会化身像素角色在里面走动就座运维的时候看着挺有意思。注意 18999 这个 server 块里带了 Upgrade 和 Connection 头因为 Openclaw 控制台有 WebSocket 长连接少了这两个头页面会一直转圈连不上。3.3 Openclaw gateway 配置openclaw.json 里的 gateway 段落决定了 Openclaw 监听在哪、允许哪些来源访问。关键是把 bind 设成 loopback只让本机 Nginx 能连外部一律走 Nginx{ gateway: { port: 18789, mode: local, bind: loopback, controlUi: { allowedOrigins: [ http://localhost:18789, http://127.0.0.1:18789, https://172.18.193.247:18999 ] }, auth: { mode: token, token: 替换成你自己的长随机串 } } }allowedOrigins 里必须把https://云IP:18999加进去否则从外部打开控制台会被 CORS 拦掉。token 用一段足够长的随机字符串这是控制台和 API 的访问凭证泄露等于把实例交出去。3.4 Dockerfile 构建私有镜像在本地建一个目录把 default.conf、openclaw.json、certs 子目录放 myip.crt 和 myip.key都放进去。再创建一个 debian.sources 指定国内源加速 apt 安装Types: deb deb-src URIs: https://mirrors.tuna.tsinghua.edu.cn/debian Suites: trixie trixie-updates trixie-backports Components: main contrib non-free non-free-firmware Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg Types: deb deb-src URIs: https://mirrors.tuna.tsinghua.edu.cn/debian-security Suites: trixie-security Components: main contrib non-free non-free-firmware Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg拉取 bot-review 代码然后写 Dockerfilegit clone https://github.com/xmanrui/OpenClaw-bot-review.gitFROM m.daocloud.io/ghcr.io/openclaw/openclaw:2026.3.8 USER root COPY debian.sources /etc/apt/sources.list.d/ RUN apt-get update apt-get install nginx nano -y COPY default.conf /etc/nginx/conf.d/default.conf COPY certs/ /etc/nginx/certs/ COPY OpenClaw-bot-review/ /app/OpenClaw-bot-review/ RUN chown -R node:node /app/OpenClaw-bot-review USER node RUN npm config set registry https://registry.npmmirror.com WORKDIR /app/OpenClaw-bot-review RUN npm install WORKDIR /app构建镜像docker build -t openclaw:local .这里有个细节npm install 必须在 USER node 之后执行否则装出来的 node_modules 属主是 root运行时 bot-review 会因为没有写权限报错。另外基础镜像用的是 2026.3.8 版本Openclaw 迭代很快升级时记得同步改这个 tag。4. 验证请求https 访问、证书链校验与容器健康检查配置写完不算完必须实际验证。这一节给出从启动到访问成功的完整动作。先准备 docker-compose 片段把镜像、端口映射、证书挂载都写清楚services: openclaw-gateway: image: ${OPENCLAW_IMAGE:-openclaw:local} ports: - 18999:18999 - 3001:3001 volumes: - ./data:/app/data restart: unless-stopped healthcheck: test: [CMD, curl, -fk, https://localhost:18999/] interval: 30s timeout: 5s retries: 3启动git clone https://github.com/openclaw.git git checkout v2026.3.8 cd openclaw export OPENCLAW_IMAGEopenclaw:local docker compose up -d容器起来后Nginx 不会自动跑需要手动进容器启动一次docker exec -it -u root openclaw-openclaw-gateway-1 nginx然后做三项验证。第一项证书链校验。用 openssl s_client 连本地端口看证书是否正确返回openssl s_client -connect 172.18.193.247:18999 -servername 172.18.193.247 /dev/null 2/dev/null | openssl x509 -noout -subject -dates输出里应该能看到 subject 里的 CN 和证书有效期。如果报verify error:num18:self-signed certificate这是自签证书的正常提示说明证书链本身是通的只是没有受信任 CA 签发。第二项https 访问。浏览器打开https://172.18.193.247:18999/?token你的token自签证书会弹安全警告点继续访问即可。这时页面会提示device pairing required这是 Openclaw 的设备配对机制新设备首次访问需要批准。进容器操作docker exec -it openclaw-openclaw-gateway-1 bash openclaw devices list openclaw devices approve requestid把 list 里看到的 requestid 填进 approve再刷新页面就能进控制台了。第三项容器健康检查。看 healthcheck 状态docker inspect --format{{.State.Health.Status}} openclaw-openclaw-gateway-1返回 healthy 说明容器内 curl 能通过 HTTPS 访问到 Nginx。如果一直是 starting 或 unhealthy多半是 Nginx 没启动或者证书路径不对导致 Nginx 起不来用docker logs看具体报错。三项都通过后再验证一下模型调用是否正常。在控制台里发一条消息如果能收到 TaoToken 返回的模型回复说明从 Nginx 到 Openclaw 再到模型 API 的整条链路都通了。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth部署过程中我遇到过几类典型报错这里逐个对照给出排查方向。401 Unauthorized。这个最常见来源有三个。一是 TaoToken 的 Key 填错或过期检查 openclaw.json 里 apiKey 是否和 TaoToken 控制台一致注意别把前后空格带进去。二是 Openclaw 控制台的 token 不对URL 里的?token必须和 gateway.auth.token 完全一致。三是 Nginx 转发时把 Authorization 头丢了检查 proxy_set_header 里有没有漏掉透传默认情况下 Nginx 会保留 Authorization但如果你加了自定义 header 操作要确认没覆盖。local proxy failed。这个报错通常出现在 Openclaw 尝试访问模型 API 时。原因是容器内 DNS 解析不了外部域名或者出口网络被限制。先在容器里测一下docker exec -it openclaw-openclaw-gateway-1 curl -I https://taotoken.net/api如果 curl 不通说明容器网络有问题检查云平台的出口策略。如果 curl 通但 Openclaw 报 local proxy failed检查 openclaw.json 里有没有配 http_proxy 之类的环境变量容器内不需要代理配了反而会走错。reading choices 报错。这个一般出现在模型返回格式不符合预期时Openclaw 解析响应体里的 choices 字段失败。排查方向确认 baseUrl 没多加 /v1确认 Model ID 是 TaoToken 支持的模型确认请求确实打到了 chat/completions 端点。可以在容器里手动发一次请求对比curl https://taotoken.net/api/chat/completions \ -H Authorization: Bearer sk-你的密钥 \ -H Content-Type: application/json \ -d {model:claude-sonnet-4-5,messages:[{role:user,content:hi}]}如果这个 curl 返回正常但 Openclaw 还报错那就是 Openclaw 的 provider 配置字段名写错了对照官方文档检查 type 和 baseUrl 的拼写。OAuth 相关报错。如果你在 Openclaw 里配了需要 OAuth 的渠道或工具报错通常和回调地址有关。因为服务跑在 HTTPS 的 18999 端口后面OAuth 回调地址必须写成https://172.18.193.247:18999/callback这种形式不能写 localhost。另外自签证书会导致部分 OAuth 提供方拒绝回调这种情况要么换正式证书要么在提供方那边把自签证书的指纹加白。排查时有个通用技巧先看 Nginx 的 access.log 和 error.log确认请求有没有到 Nginx再看 Openclaw 容器日志确认请求有没有到应用层。两层日志一对比问题出在转发还是应用就一目了然。6. 长期跑 Agent 与多人共用接入方式怎么选企业云平台上给用户开 Openclaw 实例通常不是一次性用完就关而是长期挂着跑 Agent、定时任务、消息渠道。这种场景下模型接入方式的选择会影响成本和稳定性。如果只是偶尔测试按量调用模型对话就够了用多少算多少。但如果是多人共用、Agent 频繁调用建议走 Coding Plan额度更可控也不用担心某个用户把配额跑爆影响其他人。接入文档里有完整的 provider 配置说明和字段解释配之前过一遍能少踩很多坑https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker_nginx_openssl最后说一个实际运维中的小技巧自签证书有效期 365 天到期前浏览器会直接拒绝访问建议在云平台上加一个定时任务提前 30 天检查证书剩余有效期快到期时自动重新生成并重启 Nginx。命令很简单openssl x509 -in myip.crt -noout -checkend 2592000返回Certificate will expire就说明 30 天内要换了。把这个检查挂到监控里比等到用户报障再处理省心得多。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →