部署文档
这是交付给每位客户的 runbook 公开精简版。所有命令都在演示所用的开源网关栈上实际验证过;主机名与路径为示例值。
1 · Docker 部署
# docker-compose.yml(节选——完整文件见 GitHub 仓库)
services:
gateway:
image: ghcr.io/berriai/litellm:main-stable # 或你选定的网关
user: "10001:10001" # 非 root
read_only: true # 只读根文件系统
tmpfs: [/tmp]
env_file: /srv/gateway/secrets.env # 0600, root:root
expose: ["4000"] # 仅内部——不绑定公网
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:4000/health/liveliness"]
interval: 30s
retries: 3
基本原则:网关容器不直接发布宿主机端口,对外的永远只有反向代理。密钥放在 root 所有、权限 0600 的 env 文件中,以只读方式挂载。容器使用固定的非 root UID,根文件系统只读。
2 · HTTPS 与证书自动续期
# Caddyfile —— 8 行配齐 HTTPS、HSTS 与安全头
example.com {{
encode gzip
header {{
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options nosniff
X-Frame-Options DENY
Referrer-Policy strict-origin-when-cross-origin
}}
reverse_proxy 127.0.0.1:4000
}}
Caddy 自动签发并续期证书。如果选 nginx,则由 certbot 配合 systemd 定时器完成同样的工作,两套方案仓库里都有现成配置。
3 · 备份:能恢复的才算数
# 每夜执行:导出数据库与配置,加密归档,保留 14 天
sqlite3 /srv/gateway/data/gateway.db ".backup /tmp/gw.db"
tar czf - -C /srv/gateway config data | age -r "$BACKUP_PUBKEY" \
> /backup/gateway-$(date +%F).tar.gz.age
find /backup -name "gateway-*.age" -mtime +14 -delete
从未做过恢复演练的备份,只是一份心理安慰。runbook 中固定了季度恢复演练:恢复到临时目录,在内部端口拉起第二个网关实例,跑一轮冒烟测试,确认无误后拆除。
4 · 升级流程
- 先读 release notes,确认有没有数据库 schema 迁移。
- 做快照:按上述方式备份,并记录当前镜像 digest。
- 拉取新镜像、重启服务,紧盯健康端点和错误率。
- 回归验证:跑冒烟套件(创建密钥 → 发起一次对话请求 → 确认产生用量记录)。
- 准备好回滚:上一个镜像 digest 加恢复后的数据库。因为演练过,回滚耗时是每套环境实测出来的数字,不是估计。
5 · 监控
/health端点由外部探针巡检,按状态变化告警——故障一条、恢复一条,不刷屏。- 主机层面持续检查磁盘、内存与证书有效期。
- 用量异常必须查明归属:某把虚拟密钥的流量突增,应当能定位到一次具体调用,而不是不了了之。