数据备份与恢复

小匠实战约 3 分钟读完更新于 2026-06-19

三类数据要备: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 在线导出,不停服。

  1. 建备份目录:sudo mkdir -p /backup/jecloud-ai/{db,uploads}
  2. 把下面脚本存为 /usr/local/bin/backup-db.shchmod +x
  3. 手动跑一次验证: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
  1. 保存退出,sudo systemctl status cron 确认服务在跑
  2. 次日看 /var/log/jecloud-ai-backup.log/backup/jecloud-ai/db/ 是否有当天文件

小贴士: 每月演练一次 restore:找另一台机器把最近备份恢复一遍,验证「真的能用」。严禁在生产库上演练——--clean 会先 DROP 现有表。

5.4 出事时的恢复流程

误删 / 磁盘损坏 / 迁移新机,都走这 5 步。

  1. 停 agent(postgres 容器不停,要灌数据):cd /opt/jecloud-ai && docker compose stop agent
  2. 恢复前先存一份现场docker compose exec -T postgres pg_dump -U aiagent aiagent | gzip > /tmp/before-restore.sql.gz
  3. 恢复 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
  1. 恢复 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
  1. 启服 + 体检docker compose up -d agentcurl -fsS http://localhost:3001/api/health 返回 {"status":"ok"};浏览器登录 admin 抽查会话历史和附件。

注意: 异地备份:本地备份扛不住机房失火 / 勒索病毒。把 .sql.gzgpg 加密后传 OSS/S3/MinIO,密钥必须离线另存。详见 FAQ。

相关

没解决你的问题?

直接问学院 AI 助教小帅 —— 他读过全部学院文档,会带着步骤和文档链接回答;也可以让工程师一对一讲解。