安装是一条命令,或者一个 compose 文件
curl -fsSL https://raw.githubusercontent.com/emperorclaw/emperorclaw/main/install.sh | bash
安装脚本把文件放到 ~/emperorclaw,如果 3000 端口(配了域名则是 80/443)被占用会先警告,然后启动整套服务,等应用和数据库报告就绪,再打开浏览器。Ubuntu/Debian 上它能自己安装 Docker Engine;macOS 和 Windows 需要 Docker Desktop。镜像发布的是 amd64,Apple Silicon 通过 Docker Desktop 的模拟运行。
整套服务故意做得很无聊:
| 服务 | 是什么 |
|---|---|
| app | ghcr.io/emperorclaw/emperorclaw——面板、REST/MCP 接口和 WebSocket 控制面 |
| postgres | postgres:16-alpine,数据在 pgdata 卷里 |
| caddy | 给安装脚本一个域名时的可选自动 HTTPS |
| drive-sync | 可选的 rclone 边车,用于 Google Drive 备份 |
也支持和记录了源码构建:Node.js 20+ 与 PostgreSQL,开发服务器是 npm run dev(一个 tsx 包装服务器,因为应用需要 WebSocket),数据库用 db:migrate。我们没有提供的是 npx 式的单文件:这是一个带面板、数据库和控制面的多用户服务器,不是你终端里的进程管理器。
每个智能体有自己的容器
用本地:这台机器雇一个智能体,系统会在 Emperor 主机上把它开成一个同级 Docker 容器,名字是 emperor-<agent>-<id8>,创建时带 RestartPolicy: unless-stopped,加入应用所在的 Docker 网络,注入它自己的 API 令牌和应用的内部地址。你可以 docker exec 进去、看日志,也可以在智能体面板里点重建运行时,把它停掉、删掉、重新开——镜像更新和模型 key 轮换用的就是同一个动作。
重建之后还在的东西才是重点:一个命名数据卷挂在 /home/hermes/.hermes/profiles,里面是模型配置、SOUL.md、会话(state.db)、本地记忆和技能。一个 Emperor 智能体对应一个 Hermes profile,这个 profile 就是记忆、会话和密钥的隔离边界。
智能体不必跑在 Emperor 主机上。设置 → 运行时主机可以通过 SSH 接入另一台机器;主机会报告可用内存和磁盘(对照新智能体的需求)、是否装了浏览器、已经跑了几个智能体。没有 Docker socket 权限的托管部署,可以把 Emperor 放在一处、把 worker 放到另一台机器。也支持 OpenClaw 作为第二种运行时。
状态能扛住重启
任务、备注、审批、消息、运行记录和成本都在 PostgreSQL 里,不在某个终端缓冲区里。三个机制保证出事之后工作还能继续:
- 租约。领取任务会写入
lease_owner和lease_until;看门狗会回收租约过期的任务,所以崩掉的智能体不会把任务卡死,两个智能体也不能同时拥有同一个任务。 - 排队唤醒。把工作指派给智能体会在数据库里排一次唤醒,短时间内的多次指派会合并成一条消息;唤醒最多重试
max_wake_attempts次(默认 3),每个智能体记录last_heartbeat_at和last_wake_at。 - 重启策略。智能体容器随 Docker 一起回来(
unless-stopped),应用、数据库和 Caddy 随 Docker 守护进程重启;面板和数据库不需要人工插手就能恢复。
这套平台模式要你付出的代价
| 方面 | EmperorClaw | 本地 Node CLI |
|---|---|---|
| 安装 | 需要 Docker,一条命令 | npx,仅此而已 |
| 隔离 | 每个智能体一个容器一个 profile | 智能体共用你的 shell 和文件 |
| 服务器上 7×24 | 原生:compose 栈 + 重启策略 | 要自己接 systemd、PM2 或 tmux |
| 关掉终端后还在跑 | 在——状态在 Postgres,智能体是容器 | 不在,除非你自己守护进程 |
| 最初五分钟 | 慢一些:拉镜像、初始化 | 快:什么都不用装 |
三个边界要说清楚。容器不是虚拟机:同一台主机上的智能体共用一个内核,而且智能体容器默认加入应用所在的 Docker 网络,所以容器隔离的是文件、密钥和进程,而不是敌意代码沙箱。资源上限是真的,但比较粗:每个智能体容器创建时就带 1 GiB 内存上限和 1.5 个 CPU(src/lib/hermes-provisioning.ts 里的 Memory 与 NanoCpus),所以一个失控的智能体吃不掉整台主机;但面板里没有按智能体的滑杆,也没有设 PID 上限和只读根文件系统。第三:发布的镜像是 amd64。
去哪里核实
docker-compose.yml——服务、镜像、数据卷。install.sh——那条命令做了什么、端口检查、就绪探测。src/content/docs/v1.1/installation.md与hermes-runtime.md——安装路径、依赖、容器工作流。src/lib/hermes-provisioning.ts、src/lib/docker.ts——容器创建、重启策略、profile 数据卷。src/db/schema.ts(lease_owner、lease_until、wake_attempts、last_heartbeat_at)、src/lib/watchdog.ts、src/lib/task-wake.ts——租约、回收、排队唤醒。