
最近我的私有 VPS 被部署恶意程序的事件,对我最大的触动其实不是如何清除病毒,而是意识到另一个经常被忽略的问题——数据安全。
以前更多关注的是服务器安全:关闭端口、最小权限、防火墙、监控告警……这些都很重要。但真正静下心来思考后发现,即使安全措施做得再完善,也没有任何人敢保证服务器永远不会出现问题。
真正能够降低风险的,不仅是防御,更是可恢复能力(Recoverability)。
因此,在完成 Sentinel 安全监控体系之后,我又开始补齐另一块短板——应用数据备份体系。
为什么要做备份
对于 我的 网站来说,真正有价值的并不是代码。
代码可以通过 GitHub 恢复,可以重新部署;真正难以恢复的是:
- SQLite 数据库中的业务数据
- 配置文件
- 网站运行过程中不断积累的数据
如果服务器被删除、磁盘损坏,甚至再次遭遇攻击,没有备份意味着这些数据可能永久丢失。
所以这次工作的目标很明确:
让任何一台服务器出现问题,都能够在最短时间内恢复业务。
第一层:服务器本地自动备份
首先为项目新增了独立备份脚本。
备份策略分为两类:
数据备份
- 每天自动执行
- 使用 SQLite Backup API 导出数据库
- 避免直接复制正在运行中的 SQLite 文件
- 自动校验数据库完整性(
PRAGMA integrity_check = ok) - 默认保留 60 天历史版本
代码备份
- 每周自动打包
- 自动排除
.git、.venv、缓存目录、运行数据、备份目录等无关内容 - 默认保留 12 周历史版本
这样,每一次备份都会生成带时间戳的压缩包,可以随时回滚到任意历史版本。
第二层:Systemd 定时自动执行
备份不能依赖手工执行。
因此,又新增了 systemd 定时任务,让整个流程完全自动化。
目前的计划为:
- 数据备份:每天执行
- 代码备份:每周执行
所有 Timer 已安装到系统,并验证能够正常触发。
以后服务器即使长期无人登录,也会持续生成新的备份。
第三层:NAS 异地备份
本地备份解决不了服务器本身损坏的问题。
如果 VPS 被删除、硬盘故障,或者整台机器不可恢复,本地所有备份仍然会一起丢失。
因此又增加了异地备份。
整个方案采用 NAS 主动拉取(Pull)的方式:
VPS
│
SSH + rsync
│
Synology NAS(Docker)NAS 通过 Docker 容器定时连接 VPS,将服务器上的备份目录同步到本地。
同步完成后,备份会保存在 NAS 独立的数据分区中,不占用系统分区空间,也方便后续继续扩展更多项目。
这样即使 VPS 整体损坏,也仍然保留着完整的数据和代码备份。
第四层:恢复文档
备份真正发挥作用,是在恢复的时候。
因此,又补充整理了完整的备份文档,包括:
- 本地备份方式
- 自动备份部署方法
- NAS Docker 配置
- 数据恢复流程
- 代码恢复流程
同时同步更新了项目状态文档和 GitHub 配置,使整个备份体系能够长期维护,而不是依赖记忆。