深浅色
备份与恢复
这一篇是干什么的:给系统做"存档",以及用存档把系统恢复到某个时间点。

最重要的一句话,请读三遍
备份包里没有钥匙。
系统备份的是数据(客户、聊天、文件),不备份存放密钥的 deploy/runtime.env 文件。
所以恢复的时候,你手上必须有原来那份密钥文件。否则数据在、系统也起不来。
→ 密钥要单独存进公司的密码保险库,见密钥与安全边界。
做备份
bash
./scripts/backup.sh跑完,在 backups/ 下生成一个按时间命名的文件夹,比如 backups/20260927-120000/。
里面装着:
| 文件 | 装什么 |
|---|---|
mysql.sql.enc | 全部业务数据:客户、标签、群发记录等 |
uploads.tar.gz.enc | 上传的素材和附件 |
redis-data.tar.gz.enc | 缓存和运行状态 |
manifest.txt | 这份备份的版本、时间、是否加密 |
SHA256SUMS | 每个文件的指纹,恢复前会自动校验 |
文件名带 .enc 表示是加密的。就算备份文件被人拿走,没有密钥也打不开。
备份加密密钥
- 默认必须加密,密钥文件默认在
deploy/secrets/backup.key,权限 600。 - 这个密钥文件同样不在备份包里,要单独存保险库。
- 丢了它 = 备份全部打不开。请和
runtime.env一起放进保险库。
恢复
bash
./scripts/restore.sh backups/20260927-120000 --confirm把路径换成你要恢复的那份备份。末尾的 --confirm 是"我确认要恢复"的意思,防止手滑。
脚本会按顺序做:
- 检查备份文件齐不齐、指纹对不对
- 暂停前台、后端和缓存
- 用备份覆盖数据库和数据卷
- 重新启动,等自检通过

恢复前先做三件事
- 先给"现在"做一次备份(
./scripts/backup.sh),万一要反悔 - 先在测试环境把这份备份恢复一次,确认它是好的
- 想清楚:恢复 = 数据回到备份那一刻,之后新产生的数据会丢
异机恢复:换台服务器把系统立起来
服务器坏了、要搬家时用:
- 在新服务器上装好同版本的系统(在线或离线安装)
- 把该企业的
runtime.env和备份加密密钥放到位(从保险库取出来) - 启动一个空实例,确认能登录
- 把备份文件夹拷过来,执行恢复命令
- 检查:能登录、客户数量对得上、附件能打开、企微连接正常
多久备份一次
| 时机 | 方式 |
|---|---|
| 每次升级前 | 升级脚本自动做 |
| 日常 | 建议每天一次,用定时任务(crontab)跑 backup.sh |
| 每月 | 至少做一次异机恢复演练:拿一份备份在测试机器上真恢复一遍 |
备份有没有用,恢复过才知道。
出错了怎么办
| 提示 | 什么意思 | 怎么办 |
|---|---|---|
backup encryption key file is missing | 找不到备份密钥 | 从保险库取回 deploy/secrets/backup.key |
... must have permission 600 | 密钥文件权限太松 | 执行 chmod 600 deploy/secrets/backup.key |
unencrypted backup is rejected | 拿明文备份去恢复加密系统 | 换成正确的加密备份 |
failed to decrypt backup artifact | 密钥不对 | 确认用的是备份时那把钥匙 |
| 备份目录文件缺失 | 备份被移动或删除 | 换一份备份,或从异地副本取回 |
常见问题
Q:备份文件放哪最安全?
别只放服务器本机。拷一份到别的地方(对象存储、另一台机器、离线硬盘)。服务器坏了,本机备份也跟着没了。
Q:备份会不会把钥匙也备进去?
不会,这是故意的——钥匙和备份分开放,丢一个不至于全丢。但也意味着两个都要保管好。
Q:恢复要多久?
看数据量,一般几分钟到几十分钟。恢复期间系统不可用,选业务低峰期做。
Q:能不能只恢复某几个客户?
当前版本不支持"挑数据恢复",恢复是整份覆盖。要找回个别数据,得找技术支持从备份里人工处理。
相关页面
- 密钥与安全边界 — 密钥和备份分开保管的完整说明
- 升级与回滚 — 升级自动备份
- 日常巡检与故障处理 — 备份是否成功也要巡检
- 离线安装(不能联网的服务器) — 异机恢复要在新机器上先装系统