从 VPS 被入侵,到建立网站备份体系

技术专业 · 今天

最近我的私有 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 配置,使整个备份体系能够长期维护,而不是依赖记忆。

Theme Jasmine by Kent Liao