Skip to main content

升级、回滚与备份

三种升级方式(同目录重跑 deploy.sh、在线更新、手动切 tag)、健康门控回滚,以及要备份的三样东西和恢复演练。QRadar 侧的数据不归网关备份。

升级

方式一:新交付包,同目录重跑 deploy.sh

把新包解到同一个目录(覆盖脚本和 compose,.envstate/ 不会被覆盖),再跑一次:

tar xzf RST-Qradar-AI-Copilot-<新版>.tar.gz --strip-components=1 -C /opt/rst-copilot
cd /opt/rst-copilot && ./deploy.sh      # 「保留现有 .env,直接启动?」选 Y

它会 docker load 目录里全部镜像包并取最新的 tag、把 GATEWAY_IMAGE_TAG 切过去、--force-recreate 重启、等 healthy。结束后核对 docker inspect rst-qradar-ai-copilot-gateway --format '{{.Config.Image}}' 是新版本。旧的 RST-Qradar-AI-Copilot-images-*.tar 可以删,留着也不影响。

方式二:在线更新

激活了在线许可的网关会在心跳里得知新版本。系统设置 → 版本与更新里点「下载并暂存」,网关验签后把镜像存到 ./release/staging。然后在宿主机上:

./deploy/rst-update.sh              # 载暂存镜像 → 切 GATEWAY_IMAGE_TAG → 健康探测
./deploy/rst-update.sh --rollback   # 回上一版

/healthz 连续 3 次 200 才算成功,否则自动回滚

方式三:手动

docker load < RST-Qradar-AI-Copilot-images-<新版>.tar
sed -i 's/^GATEWAY_IMAGE_TAG=.*/GATEWAY_IMAGE_TAG=<新版本>/' .env
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 卷里,不随镜像走,回滚不丢。copilot.db 的表结构由网关启动时按需建,回滚到旧版本时新版本多出来的表会被忽略,不会坏。

任何一种方式都不要 docker compose down -v,也不要重建 state/machine-id / state/server_guid。卷和这两个文件一起构成许可的主机身份。

备份什么

数据在哪

数据在哪怎么备
主机身份(machine-id + server_guid)./state/整个目录
会话、Offense 副本与游标、审计、通知配置与队列、分析记录、报告、用户偏好gateway_state 卷里的 copilot.dbscripts/backup.sh
系统设置覆盖值、provider、通道密钥、许可激活记录、配额gateway_state 卷里的 settings.ymlllm_providers.yml.rst_secret_keylicense.keyquota.json同上,一个包
账号 / 角色userdb_data 卷(Postgres)pg_dump

QRadar 侧的事件、Offense、规则不归网关备份:网关里的 Offense 只是副本,删了会在下一次同步按 RST_OFFENSE_INGEST_LOOKBACK 重新拉回来,只是 AI 摘要和处置标记会丢。

网关状态

bash scripts/backup.sh /backup/rst-copilot     # 产物 gateway-state-<时间戳>.tar.gz,自动保留 30 天

copilot.db 开着 WAL,脚本打包整个目录,copilot.db-wal 一起带上。要一份一致的单文件副本:

docker exec rst-qradar-ai-copilot-gateway python -c "import sqlite3;s=sqlite3.connect('/app/state/copilot.db');d=sqlite3.connect('/app/state/copilot-snapshot.db');s.backup(d)"

建议 cron 每日 02:00:

0 2 * * * cd /opt/rst-copilot && bash scripts/backup.sh /backup/rst-copilot >> /var/log/rst-backup.log 2>&1

这个包等价于明文:里面同时有加密后的 SEC Token / 模型 API key / 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-qradar-ai-copilot-userdb pg_dump -U rst rst_users > /backup/rst-copilot/users-$(date +%F).sql
# 恢复
docker exec -i rst-qradar-ai-copilot-userdb psql -U rst rst_users < users-XXXX.sql

丢了这个卷部署照样能打开:网关重建表并把 .env 里的首管理员种回去,但其他账号都没了。

保留期

copilot.db 里的审计按 RST_AUDIT_RETENTION_DAYS(默认 180 天)、分析记录按 RST_ANALYSIS_TTL_DAYS(默认 30 天)、会话按 RST_CONVERSATION_TTL_DAYS(默认 7 天)自动清理。审计日志按等保要求至少留 180 天;要更久就调大,并把备份包留够。

恢复演练

上线前至少演练一次:在一台测试机 restore.sh,确认网关起来后许可 valid、审计和分析记录齐全、Offenses 页能看到恢复前的处置标记。换到另一台机器恢复时许可需要重新激活(主机指纹变了),在线许可先在旧机器上「撤销当前 license」。

本页内容