部署与收官(七框架对比)
昨天(Day 19)把产品造出来、验好货;今天让它正式上岗营业——怎么把 OpenClaw 部署上线(Docker/compose/fly/render/podman),怎么安全地开门(绑定与鉴权)。然后回顾 20 天全程,并把你学过的七大框架横向对比收官。
多阶段 Dockerfile
Dockerfile(249 行)多阶段构建:
- ext-deps(
:27):只抽 opted-in 扩展的 package.json(避免扩展改动使主层缓存失效)。 - build(
:40):node:24-bookworm,pnpm install --frozen-lockfile(带 store cache),pnpm build:docker+ui:build。 - runtime-assets:
pnpm prune --prod+ 删 .d.ts/.map。 - runtime(
:114):非 rootUSER node,只 COPY dist/node_modules/extensions/skills;HEALTHCHECK /healthz;CMD node openclaw.mjs gateway --allow-unconfigured。
docker-compose
# docker-compose.yml —— 两个服务
openclaw-gateway: # gateway --bind lan --port 18789,映射 18789/18790,healthcheck
openclaw-cli: # network_mode: service:openclaw-gateway(共享网络)
# cap_drop: [NET_RAW, NET_ADMIN], security_opt: no-new-privileges
# 挂载 OPENCLAW_CONFIG_DIR → /home/node/.openclaw
# OPENCLAW_WORKSPACE_DIR → …/workspace
# 注释掉的 docker.sock 挂载 = 可选开启沙箱隔离(Day 16)
docker-setup.sh(20KB)读 token、装 compose、按需配 docker.sock。fly / render 云部署
| 平台 | 要点 |
|---|---|
| fly.toml | 进程 gateway --port 3000 --bind lan,force_https,min_machines_running=1 + auto_stop_machines=false(保持长连接),openclaw_data → /data |
| render.yaml | docker web 服务,healthCheckPath:/health,OPENCLAW_GATEWAY_TOKEN: generateValue:true(自动生成),1GB 磁盘挂 /data |
auto_stop_machines=false 很关键:OpenClaw 靠长连接(渠道 WebSocket、node 设备),机器不能自动休眠,否则连接断。持久数据挂 /data(配置/工作区/记忆)。render 自动生成网关 token(免手配)。rootless podman(生产推荐)
setup-podman.sh(11KB)一次性宿主配置:创建非登录 openclaw 用户、loginctl enable-linger(让 rootless podman 无需登录常驻)、生成 OPENCLAW_GATEWAY_TOKEN(chmod 600)、podman build + 装 launch 脚本或 systemd Quadlet。
enable-linger 让这个普通用户的服务开机自启、常驻(不用他登录)。对一个 7×24 在线、连着你所有账号的个人助理,"以最小权限跑"是明智的——这延续了整个第 4 周"默认最安全"的姿态。systemd Quadlet 则让容器像系统服务一样被管理(开机启动、崩溃重启)。绑定与鉴权
部署最关键的安全点(.env.example + SECURITY.md):
- env 优先级:
process env → ./.env → ~/.openclaw/.env → openclaw.json env 块。 gateway.bind默认loopback(src/gateway/call.ts:152)——只监听本机。- 绑定超出回环(
lan)时必须配OPENCLAW_GATEWAY_TOKEN(或 password)。 - Web/Control UI 仅本地用;远程走 SSH 隧道或 Tailscale,勿直接暴露公网。
- 健康探针:
/healthz(liveness)、/readyz(readiness)。
gateway.bind=loopback):只监听 127.0.0.1,同一台机器上的 CLI/Web UI 能用,外部设备连不上——最安全的起点。要让手机(Day 18 的 node)连进来:① 改
bind=lan(监听局域网);② 此时系统强制你配 OPENCLAW_GATEWAY_TOKEN(或 password),没配直接拒绝启动;③ 远程访问别开公网,走 SSH 隧道或 Tailscale。→ 开一扇门就必须同时装一把锁,系统不给你"开了门忘了锁"的机会。👶 小白:云平台不是都爱"没请求就自动休眠省钱"吗?为什么 fly 要特意关掉 auto_stop_machines?
👨🏫 老师:因为 OpenClaw 靠的是长连接——各渠道的 WebSocket、你手机 node 的连接,都是"一直挂着"的。普通网站没请求时休眠没事,来请求再唤醒。但 OpenClaw 一旦休眠,这些长连接全断了,Telegram 消息推不进来、手机也掉线,助理就"失联"了。所以必须 min_machines_running=1 + auto_stop=false 让它 7×24 醒着。这也解释了为什么它更像"一个常驻服务"而不是"一个按需网站"。
20 天全景
| 周 | 主题 | 核心收获 |
|---|---|---|
| W1 | 入门与全景 | 个人助理定位、Gateway 控制平面、消息旅程、配置(本周单独成篇) |
| W2 | Agent 大脑 | 内嵌 Pi 内核、两层故障转移、执行循环、提示词、两套记忆 |
| W3 | 技能与渠道 | skills 渐进披露、extensions 注入、渠道抽象/实现、消息归一化 |
| W4 | 运行时/安全/部署 | Docker 沙箱、安全纵深、原生 App、构建 SDK、部署 |
消息从渠道进 → Gateway 归一化+路由 → 大脑(内嵌 Pi + 编排外壳)想+做 → 用技能扩本领、在沙箱里安全执行 → 答复原路返回。它的独特价值不在"造了个 Agent 引擎"(那是 Pi),而在"把一个 Agent 变成可靠、安全、随处可达的个人产品"的全套工程。
七框架终极对比
| 框架 | 语言 | 定位 | 你带走的核心思想 |
|---|---|---|---|
| eino | Go | 强类型编排框架 | 组件 + 编排、编译期准备 |
| OpenHands | Py/TS | 软件工程 Agent | 事件流 + Runtime 解耦 |
| crewAI | Python | 多智能体协作 | 角色分工 + 事件总线 |
| AutoGPT | Python | 可视化工作流平台 | Block 图 + 低代码 |
| SuperAGI | Python | Agent 运行平台 | 循环在 DB/队列、GUI 调度 |
| LangGraph | Py/JS | 状态图运行时 | 图 + 通道 + 每步检查点 |
| OpenClaw | TS | 个人 AI 助理产品 | 控制平面 + 多渠道 + 编排外壳 |
结业寄语 🎓
🎉 恭喜完成 OpenClaw 20 天!
你从"个人 AI 助理是什么",走到了它的每一层:Gateway 控制平面、内嵌 Pi 的大脑、故障转移与记忆、技能与扩展、二十多个渠道的统一抽象、Docker 沙箱与安全纵深、原生 App 协议、构建与部署。
更重要的是——这是本系列的第 7 个框架。你现在看任何一个 AI 系统,都能条件反射地问:它用什么抽象?怎么编排?状态存哪?怎么保证韧性和安全?信任边界画在哪?它是"引擎"还是"产品"?这套从源码里提炼架构与设计哲学的眼光,比记住任何一个 API 都值钱。
框架会更新,明星项目会更替,但你建立的"看穿一个系统"的能力会一直陪着你。继续读源码,继续动手造。下一个项目见!🦞🚀
✋ 动手
cd /Users/bitmart/work/codes/github/openclaw
sed -n '1,50p' Dockerfile | head -40
cat docker-compose.yml | head -40
grep -n 'gateway.bind\|loopback' src/gateway/call.ts | head