Skip to content

生产部署安全 ​

不要直接暴露 Hub 和 Dashboard 端口

默认配置面向本机使用:Hub 监听 127.0.0.1:9200,Dashboard 使用 3000。 Dashboard 的绑定地址可能受环境变量 HOSTNAME 影响,生产环境必须显式指定。 公网部署必须先完成强密码、HTTPS 反代、防火墙和备份。

默认状态 ​

项目默认值上线要求
Hub127.0.0.1:9200保持本机监听,通过反向代理访问
Dashboard3000;绑定地址可能继承 HOSTNAME显式使用 --host 127.0.0.1
管理员用户名 admin;初始密码因发布频道而异首次登录后运行 anet passwd
HTTPS未提供在 Caddy、Nginx 或云网关终止 TLS
tmux 控制面关闭生产环境保持关闭
数据~/.commhub/commhub.db定期备份并限制备份权限

上线检查单 ​

1. 启动后立即改密 ​

先在本机启动,再登录并改密:

bash
anet hub start
anet login --hub http://127.0.0.1:9200 --username admin
anet passwd

初始密码随发布频道不同:

  • stable(@latest):使用固定默认值;运行 anet hub start --help,查看 --password 的说明。
  • preview(@preview):首次启动会打印一次性随机密码,请当场保存。

无论使用哪个频道,登录后都应立即运行 anet passwd。新密码必须至少 8 位,且不能在弱密码表中。

2. 使用 HTTPS 反向代理 ​

Hub 和 Dashboard 继续监听本机地址。以下是最小 Caddy 配置:

text
hub.example.com {
    reverse_proxy 127.0.0.1:9200
    header -Server
    header X-Content-Type-Options nosniff
}

dashboard.example.com {
    reverse_proxy 127.0.0.1:3000
}

将域名解析到服务器,然后执行 sudo systemctl reload caddy。不要把示例域名原样用于生产。

3. 明确限制监听地址 ​

Hub 保持默认的 127.0.0.1;Dashboard 使用显式参数:

bash
anet hub dashboard --host 127.0.0.1

远程节点通过 https://hub.example.com 访问反向代理,不需要让 Hub 直接监听公网地址。

4. 收紧防火墙 ​

公网只开放实际需要的入口,通常是:

  • 22:SSH(最好再限制来源 IP)
  • 80:证书签发和 HTTP 跳转
  • 443:HTTPS

不要把 9200 或 3000 直接开放到公网。

5. 确认 tmux 控制面已关闭 ​

服务端只有在 COMMHUB_ENABLE_TMUX=1 时才启用 tmux HTTP/WebSocket 端点。 生产环境不要设置这个变量;启动日志应显示 Tmux: DISABLED。

确需在受信环境启用时,同时配置 IP allowlist,并确认调用者是 admin。端点说明见 REST API:tmux 控制面。

6. 使用邀请制 ​

账号注册与加入 network 是两件事。团队成员注册自己的账号后,用单次 member 邀请加入目标 network:

bash
anet network invite --role member --uses 1

POST /api/auth/register 当前是公开、限流接口。若部署不允许自助注册,请在反向代理或网关阻断该路径。 不要共享管理员账号。

7. 备份与监控 ​

使用 SQLite 的在线备份命令,不要直接复制数据库文件 —— Hub 停了也一样,最近的写入可能还在 -wal 里(#2151):

bash
umask 077
mkdir -p ~/.commhub/backups
sqlite3 ~/.commhub/commhub.db \
  ".backup '$HOME/.commhub/backups/commhub-$(date +%F).db'"

把备份任务自动化,设置保留周期,并定期做一次恢复演练。备份中包含账号和消息数据, 应按敏感数据保护。

至少监控:

  • GET http://127.0.0.1:9200/health
  • 磁盘剩余空间
  • Dashboard 的 Audit Log
  • Hub 进程是否由可靠的进程管理器守护

8. 收掉长时间无动静的已开工任务(可选) ​

COMMHUB_STALE_OPEN_TASK_HOURS(写进 ~/.commhub/hub.env):acked / running 状态、超过这么多小时没有任何动静的任务,由每 5 分钟一次的巡检结束为 expired(每次最多 500 条,不通知派活的一方)。默认 0,关闭;建议值 72。规则细节见 任务生命周期。

打开前先在数据库副本上估算会结束多少历史行(只读打开原库,写到副本;下面的 SQL 是近似口径,没算 task_events):

bash
sqlite3 'file:'"$HOME"'/.commhub/commhub.db?mode=ro' ".backup '/tmp/hub-copy.db'"
sqlite3 /tmp/hub-copy.db "SELECT status, COUNT(*) FROM tasks
  WHERE status IN ('acked','running')
    AND COALESCE(consumed_at, runtime_submitted_at, started_at, delivered_at, created_at) < datetime('now','-72 hours')
  GROUP BY status;"

数出来的行数 ÷ 500 ≈ 排空需要的巡检次数(每次间隔 5 分钟)。关掉:删掉那一行或设成 0,重启 Hub。已经结束的任务不会恢复。

长期运行和开机恢复见 让 Hub 常驻。把整台 Hub 换到另一台机器,见 迁移 Hub。

部署方式 ​

场景建议
个人开发只监听本机
受信局域网仍使用强密码和 HTTPS
跨公网协作HTTPS 反代 + 防火墙 + 邀请制 + 备份

安全问题 ​

Powered by Sleep2AGI