升级、回滚与备份
三种升级方式(同目录重跑 deploy.sh、在线更新、手动切 tag)、健康门控回滚,以及要备份的四样东西和恢复演练。
升级
方式一:新交付包,同目录重跑 deploy.sh
把新包解到同一个目录(覆盖脚本和 compose,.env 和 state/ 不会被覆盖),再跑一次:
rm -f /opt/rst-copilot/RST-Elastic-AI-Copilot-images-*.tar # 先删旧镜像包,见下
tar xzf RST-Elastic-AI-Copilot-<新版本>.tar.gz --strip-components=1 -C /opt/rst-copilot
cd /opt/rst-copilot && ./deploy.sh # 「保留现有 .env,直接启动?」选 Y;「升级到 <新版本>?」选 Y它会 docker load 新镜像、把 GATEWAY_IMAGE_TAG 切到新版本、--force-recreate 重启、等 healthy。结束后核对 docker inspect rst-elastic-ai-copilot-gateway --format '{{.Config.Image}}' 是新版本。
1.1.21 及之前的 deploy.sh 只加载目录里按文件名排第一的 RST-Elastic-AI-Copilot-images-*.tar。旧包不删,它加载的还是旧镜像、GATEWAY_IMAGE_TAG 不变,却照样打印「部署完成」。1.1.22 起会加载全部并切到最新。
方式二:在线更新
激活了在线许可的网关会在心跳里得知新版本。系统设置 → 版本与更新里点「下载并暂存」,网关验签后把镜像存到 ./release/staging。然后在宿主机上:
./deploy/rst-update.sh # 载暂存镜像 → 切 GATEWAY_IMAGE_TAG → 健康探测
./deploy/rst-update.sh --rollback # 回上一版/healthz 连续 3 次 200 才算成功,否则自动回滚。
方式三:手动
docker load < RST-Elastic-AI-Copilot-images-<新版本>.tar
sed -i 's/^GATEWAY_IMAGE_TAG=.*/GATEWAY_IMAGE_TAG=<新版本>/' .env
docker cp rst-elastic-ai-copilot-gateway:/app/state/server_guid state/server_guid 2>/dev/null || true # 从 1.1.20 及更早升级时
docker compose -f docker-compose.prod.yml up -d回滚
用上一个镜像 tag 重启即可:
sed -i 's/^GATEWAY_IMAGE_TAG=.*/GATEWAY_IMAGE_TAG=<上一版本>/' .env
docker compose -f docker-compose.prod.yml up -d许可状态在 state/ 和 gateway_state 卷里,不随镜像走,回滚不丢。
任何一种方式都不要 docker compose down -v,也不要重建 state/machine-id / state/server_guid。卷和这两个文件一起构成许可的主机身份。
各版本的升级须知(离线许可重签、心跳修复、server_guid 迁移)见 产品激活 → 升级时注意。
备份什么
| 数据 | 在哪 | 怎么备 |
|---|---|---|
| 主机身份(machine-id + server_guid) | ./state/ | 整个目录 |
| 网关配置、许可激活记录、配额、provider、通道密钥 | gateway_state 卷(/app/state) | scripts/backup.sh |
| 账号 / 角色 | userdb_data 卷(Postgres) | pg_dump |
| 审计、知识库、会话、报告、分析记录、告警、台账 | 你的 ES 里的 .rst_copilot_* | 并入你的 ES 快照策略 |
网关状态
bash scripts/backup.sh /backup/rst-copilot # 产物 gateway-state-<时间戳>.tar.gz,自动保留 30 天建议 cron 每日 02:00:
0 2 * * * cd /opt/rst-copilot && bash scripts/backup.sh /backup/rst-copilot >> /var/log/rst-backup.log 2>&1这个包等价于明文:里面同时有加密后的 ES 密码 / SMTP 口令 / webhook secret 和解密它们的 .rst_secret_key。备份目录 chmod 700,离机保存再加一层加密。恢复时必须带上 .rst_secret_key(或同一个 RST_SECRET_KEY 环境变量),否则界面上那些密钥会显示成「没设置」。
恢复:
bash scripts/restore.sh /backup/rst-copilot/gateway-state-XXXX.tar.gz
docker compose -f docker-compose.prod.yml restart gateway账号表
docker exec rst-elastic-ai-copilot-userdb pg_dump -U rst rst_users > /backup/rst-copilot/users-$(date +%F).sql
# 恢复
docker exec -i rst-elastic-ai-copilot-userdb psql -U rst rst_users < users-XXXX.sql丢了这个卷部署照样能打开:网关重建表并把 .env 里的首管理员种回去,但其他账号都没了。
ES 索引
用 ES 原生快照,把 .rst_copilot_* 加进你现有的快照 indices 列表:
PUT /_snapshot/<仓库>/snap-20260915?wait_for_completion=true
{ "indices": ".rst_copilot_*", "include_global_state": false }审计日志按等保要求至少留 180 天。
恢复演练
上线前至少演练一次:在一台测试机 restore.sh + ES _restore,确认网关起来后许可 valid、审计和知识库数据齐全。换到另一台机器恢复时许可需要重新激活(主机指纹变了),在线许可先在旧机器上「撤销当前 license」。