三类数据要备:DB / uploads / data。一个 pg_dump 命令 + 一条 cron 行就能搭起每天自动备份;出事时按 5 步恢复。
5.1 备份哪三样
小匠的全部状态在这三处,三样都备才算完整。
| 数据 | 位置 | 频率 |
|---|---|---|
| postgres 数据库 | 具名卷 postgres_data | 每天 |
| uploads 目录 | 宿主机 ./uploads/(生产 compose 显式挂载) | 每天 |
| data 目录 | 宿主机 ./data/(生产 compose 显式挂载) | 每周(可重建) |
提示: 优先级:DB > uploads > data。数据库丢了不可逆,data 丢了影响最小(知识库能重建)。
5.2 备份数据库(pg_dump)
用 pg_dump 在线导出,不停服。
- 建备份目录:
sudo mkdir -p /backup/jecloud-ai/{db,uploads} - 把下面脚本存为
/usr/local/bin/backup-db.sh并chmod +x - 手动跑一次验证:
sudo /usr/local/bin/backup-db.sh,再gunzip -t检查压缩包
#!/bin/bash
set -euo pipefail
TS=$(date +%Y%m%d-%H%M%S)
OUT=/backup/jecloud-ai/db/jecloud-ai-${TS}.sql.gz
docker compose -f /opt/jecloud-ai/docker-compose.yml exec -T postgres \
pg_dump -U aiagent -d aiagent --clean --if-exists | gzip -9 > "${OUT}"
# uploads 每天打 tar
tar -czf /backup/jecloud-ai/uploads/uploads-${TS}.tar.gz -C /opt/jecloud-ai uploads
# 保留 14 天
find /backup/jecloud-ai/db/ -name "*.sql.gz" -mtime +14 -delete
find /backup/jecloud-ai/uploads/ -name "*.tar.gz" -mtime +14 -delete
5.3 用 cron 自动跑
挂到 root 的 crontab,每天凌晨低峰跑。sudo crontab -e 加入:
# 小匠 · 每天 02:30 备份 DB + uploads
30 2 * * * /usr/local/bin/backup-db.sh >> /var/log/jecloud-ai-backup.log 2>&1
- 保存退出,
sudo systemctl status cron确认服务在跑 - 次日看
/var/log/jecloud-ai-backup.log和/backup/jecloud-ai/db/是否有当天文件
小贴士: 每月演练一次 restore:找另一台机器把最近备份恢复一遍,验证「真的能用」。严禁在生产库上演练——
--clean会先 DROP 现有表。
5.4 出事时的恢复流程
误删 / 磁盘损坏 / 迁移新机,都走这 5 步。
- 停 agent(postgres 容器不停,要灌数据):
cd /opt/jecloud-ai && docker compose stop agent - 恢复前先存一份现场:
docker compose exec -T postgres pg_dump -U aiagent aiagent | gzip > /tmp/before-restore.sql.gz - 恢复 DB,屏幕刷一片 DROP/CREATE/INSERT,无 ERROR 即成功:
gunzip -c /backup/jecloud-ai/db/jecloud-ai-YYYYMMDD-HHMMSS.sql.gz \
| docker compose exec -T postgres psql -U aiagent -d aiagent
- 恢复 uploads,data 目录同理;只是知识库索引坏的话直接
rm -rf data/index让它自动重建:
cd /opt/jecloud-ai && mv uploads uploads.broken
tar -xzf /backup/jecloud-ai/uploads/uploads-YYYYMMDD-HHMMSS.tar.gz
- 启服 + 体检:
docker compose up -d agent,curl -fsS http://localhost:3001/api/health返回{"status":"ok"};浏览器登录 admin 抽查会话历史和附件。
注意: 异地备份:本地备份扛不住机房失火 / 勒索病毒。把
.sql.gz用gpg加密后传 OSS/S3/MinIO,密钥必须离线另存。详见 FAQ。