fix(deploy): 加固 Redis 持久化与旧环境启动配置
Test deployment public URL (Linux) / test-linux (push) Canceled after 0s
Test start.ps1 (Windows) / test-windows (push) Canceled after 0s

This commit is contained in:
2026-09-23 16:20:55 +08:00
parent 26b1cdcdc6
commit 74ada0b0bf
18 changed files with 405 additions and 15 deletions
+15 -11
View File
@@ -254,30 +254,34 @@ $env:UPDATE_NO_WAIT = "1"
1. **Redis 资源护栏**:Redis 增加 `./data/redis:/data` 持久化挂载、`maxmemory 2gb`、`appendfsync everysec`,并禁用 RDB 快照,避免队列历史膨胀后占满内存和容器写层。
2. **Mongo/主服务内存限制**:Mongo 增加 `--wiredTigerCacheSizeGB 1.5` 和容器内存限制,`easyai-server` 增加内存限制,避免 8G 机器上 Redis/Mongo/Node 相互挤压触发 OOM。
3. **升级前置要求**:如果线上 Redis 之前没有 `/data` volume,先完成 Redis request-limit 队列历史清理,再迁移 Redis 数据目录,最后重建 Redis 容器。
3. **升级前置要求**:如果线上 Redis 之前没有 `/data` 持久化挂载,必须先迁移数据,再重建容器。Linux 和 Windows 的启动、升级脚本都会在拉取镜像前检查现有 Redis 的挂载位置,不一致时停止部署。
#### Redis 数据迁移与重启步骤
执行前建议先做云盘快照或外部备份。磁盘空间紧张时,不要直接在当前机器上 `BGSAVE` 或复制大体积 Redis 文件。
执行前先做云盘快照或外部备份,并确认可用磁盘空间。不要删除或重建旧 Redis 容器,直到数据已经迁出并校验。
```bash
cd ~/easyai
# 1. 先通过后台 ModelRuntime 运维接口或后端启动清理逻辑清理 request-limit 历史:
# - trim bull:request_limit_*:events 到小长度
# - 只清 completed/failed,不删除 waiting/active/delayed
# 1. 确认旧容器的 /data 未挂载到当前项目的 data/redis,并备份现有配置。
docker inspect --format '{{range .Mounts}}{{if eq .Destination "/data"}}{{.Source}}{{end}}{{end}}' redis
# 2. 确认 Redis 内存已经下降后,再准备新的持久化目录
# 2. 停止 Redis 后复制一致的数据目录;保留旧容器,直到新容器验收完成。
docker stop --timeout 60 redis
mkdir -p ./data/redis
# 3. 如果旧 Redis 数据在容器写层,先按实际容器内 /data 内容迁移到宿主机目录
docker cp redis:/data/. ./data/redis/
# 4. 更新配置后重建关键容器
docker compose up -d redis mongo easyai-server
# 3. 将 ./data/redis 再备份到其他磁盘或安全位置,并校验 AOF 文件与 manifest。
# 若目标目录原本非空,先核对来源,不要覆盖。
# 4. 确认 docker-compose.yml 已包含 ./data/redis:/data,检查配置并只重建 Redis。
docker compose config --quiet
docker compose up -d --no-deps redis
docker exec redis redis-cli ping
docker inspect --format '{{range .Mounts}}{{if eq .Destination "/data"}}{{.Source}}{{end}}{{end}}' redis
```
迁移后验收建议:Redis `used_memory_human < 2G`,`bull:request_limit_*:events` 长度维持在小窗口,24 小时内无 OOM。
迁移后核对 Redis 数据库键数、`aof_last_write_status:ok`、后端 `/content` 和网站首页;后端若未自动恢复,再单独重启后端容器。队列历史清理应单独评估,不作为迁移的默认步骤。
### 2026.3.20