备份与恢复
PlantPulse Studio 使用一个备份脚本和一个恢复脚本处理整个状态。
所有命令均在安装目录(/opt/kopens/plantpulse-studio-docker)中执行。
备份内容
一个备份文件(dist/backup-<date>.tar.gz)中包含以下所有内容。
| 对象 | 内容 |
|---|---|
| PostgreSQL 完整转储 | 用户账户 · 对话历史 · 观察器 · 通知已读状态 · 技能 · 部署历史 · 审计日志 |
工作区(workspaces/) | 按项目划分的实际源代码 · 聊天附件 |
构建产物(builds/) | 已部署应用的各版本(回滚时需要) |
状态目录(state/) | settings.json(环境配置) · 审计/使用量日志 · 自定义模板 · 品牌标识 |
PostgreSQL 的数据目录本身不包含在归档内——因为它被 SQL 转储取代。
备份文件是敏感资料
归档中包含所有用户的工作区,如果是旧安装迁移而来的,
settings.json中可能残留 API 密钥。
- 脚本会将备份文件权限设为
600(仅所有者可读),将dist/目录权限设为700。 - 转移到外部介质或其他服务器时,也请保持此权限设置。
(使用诸如
scp -p、rsync -a、tar -p等保留权限的选项) - 若转移出公司外部,建议另行加密。
执行备份
cd /opt/kopens/plantpulse-studio-docker
bash bin/backup.sh
▶ PostgreSQL 덤프
▶ 파일 상태 아카이브(postgres 데이터 제외 — 덤프로 대체)
-rw------- 1 root root 78M ... dist/backup-20260728-031501.tar.gz
✅ 백업 완료 (보존 14개)
- 结果文件:
dist/backup-<YYYYMMDD-HHMMSS>.tar.gz - 保留策略:仅保留最近 14 个,旧文件自动删除(可通过
BACKUP_KEEP调整)。 - 必须能够连接外部 PostgreSQL 才能进行转储。
BACKUP_KEEP=30 bash bin/backup.sh # 이번 실행부터 30개 보존
升级前务必执行手动备份
在镜像升级或大幅变更配置之前,请先运行一次 bash bin/backup.sh。
安装自动备份(推荐)
安装 cron,使备份每天凌晨 03:30 运行。需要 root 权限。
sudo bash bin/install-backup-cron.sh
[backup-cron] 설치 완료 — 스케줄: '30 3 * * *', 보존 14개, 로그: dist/backup.log
如需更改时间或保留数量,
sudo BACKUP_CRON="0 4 * * *" BACKUP_KEEP=30 bash bin/install-backup-cron.sh
卸载时,
sudo bash bin/install-backup-cron.sh remove
可通过日志确认运行状态。
tail -50 /opt/kopens/plantpulse-studio-docker/dist/backup.log
ls -lh /opt/kopens/plantpulse-studio-docker/dist/backup-*.tar.gz
推荐运维周期
| 周期 | 任务 |
|---|---|
| 每日 | 自动备份(cron) — 保留 14 天 |
| 每周 | 将最新备份的 1 个复制到其他服务器或介质(保持权限) |
| 每月 | 检查 dist/ 容量和磁盘余量 |
| 每季度 | DRYRUN=1 恢复演练 — 见下文 |
| 升级前 | 手动备份 1 次 |
只有确认“能恢复”的备份才算是备份
即使备份文件每天都在累积,实际能否恢复,不试一下是无法知道的。 请每季度进行一次演练。该演练是非破坏性的,因此在运行期间执行也是安全的。
恢复演练(非破坏性)
仅检查归档结构和数据库可达性,不做任何修改。
DRYRUN=1 bash bin/restore.sh # 최신 백업 대상
DRYRUN=1 bash bin/restore.sh dist/backup-20260712-191858.tar.gz
▶ 아카이브 검증
ppstudio.sql 12M · files.tar.gz 66M
▶ DRYRUN — DB 도달성만 확인
✅ DB 도달 OK
✅ DRYRUN 통과 — 실제 복구는 DRYRUN 없이 실행
执行恢复
恢复是破坏性操作
当前数据库内容和整个数据目录将被覆盖为备份时的状态。 恢复之后创建的项目、对话和部署将丢失。
cd /opt/kopens/plantpulse-studio-docker
bash bin/restore.sh # 최신 백업으로 복구
bash bin/restore.sh dist/backup-20260712-191858.tar.gz # 특정 시점으로 복구
在确认提示符处输入 restore 才能继续。
⚠ 현재 DB 와 /var/lib/pp-studio 파일 상태를 이 백업으로 덮어씁니다: dist/backup-...
계속하려면 'restore' 를 입력하세요:
脚本执行的顺序如下。
- 验证归档结构(确认转储和文件归档存在)
- 将当前文件状态自动备份到
dist/pre-restore-<date>.tar.gz - 停止堆栈
- 恢复数据目录 → 恢复数据库
- 启动堆栈 → 检查健康状态
若要在自动化脚本中不带提示符运行,
FORCE=1 bash bin/restore.sh dist/backup-20260712-191858.tar.gz
恢复后健康检查未通过
bash bin/logs.sh # 서버 로그 확인
bash bin/status.sh
如需回滚,可依据步骤2创建的备份副本重新恢复。但请注意,备份副本仅包含文件状态(不包含数据库)。
bash bin/restore.sh dist/pre-restore-20260728-104233.tar.gz
迁移到其他服务器
cd /opt/kopens/plantpulse-studio-docker
DRYRUN=1 bash bin/restore.sh dist/backup-20260728-031501.tar.gz # 먼저 리허설
bash bin/restore.sh dist/backup-20260728-031501.tar.gz
如果域名变更
迁移后如果访问地址发生变化,所有用户需要登出后重新登录一次—— 因为登录 Cookie 是签发时的主机专用,若保持不变,数据请求会返回 401。 详细信息请参考 域名与反向代理。
磁盘管理
由于备份会完整包含工作区和构建产物,随着项目增多,备份会不断变大。
du -sh /opt/kopens/plantpulse-studio-docker/dist
du -sh /var/lib/pp-studio/*
df -h /var/lib/pp-studio
- 要减少保留数量,请使用
BACKUP_KEEP值重新安装 cron。 - 已部署应用的旧版本,每个项目默认最多保留 10 个,超出部分自动清理 (当前正在服务的版本始终保留)。