博客备份与版本控制实战:Git+Docker方案
去年双十一,我把博客迁移到新服务器。结果手一抖,数据库备份文件覆盖了三个月的数据。
那晚上我翻遍了所有能找到的备份——七牛云的备份只有三天前的,网站文件备份缺了三个月前的图片,本地电脑的备份解压报错。折腾到凌晨三点,最终只恢复了80%的内容。
从那以后我开始认真研究博客备份这件事。今天分享这套方案,用Git管理代码,用Docker管理环境,用异地存储兜底,是我用过的最稳的方案。
为什么普通备份方案不够用
大多数人的博客备份是这样的:宝塔面板装个自动备份插件,每天凌晨备份一次到七牛云或者本地。看起来没问题,实际上有三个大坑。
第一,备份不完整。宝塔的备份插件默认只备份数据库和网站文件,不备份Nginx配置、SSL证书、定时任务这些环境配置。换服务器的时候这些得重新配,麻烦得要死。
第二,备份频率不够。改成每小时备份一次?空间不够。每天备份一次?最多丢失一天的数据。对于天天更新的博客来说,一天的数据量可能已经很多了。
第三,没有版本控制。备份文件只有最新的那一份,误删了某篇文章想找回?没有历史版本。
所以我换了方案:Git管代码,Docker管环境,云存储兜底。
第一步:Git管理博客代码
不管你用WordPress、Z-Blog还是Typecho,博客的核心内容都是可以版本化的。主题文件、插件、配置文件、数据库导出文件,这些都扔进Git仓库。
先初始化一个私有仓库,推荐Gitee或者coding.net,速度比GitHub快:
```bash
git init wushuang-blog
cd wushuang-blog
git remote add origin 你的仓库地址
```
然后写一个`.gitignore`文件,排除不需要备份的内容:
```
wp-content/uploads/
wp-content/cache/
*.log
node_modules/
.env
```
WordPress用户重点排除uploads目录,那里存放的是图片和媒体文件,体积大且更新频繁,不适合放Git仓库,改用图床或者CDN存储。
接着写一个同步脚本,把数据库导出和文件打包一起做了:
```bash
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
导出数据库
mysqldump -u用户名 -p密码 数据库名 > db_backup_$DATE.sql
提交到Git
git add .
git commit -m "Backup: $DATE"
git push origin main
```
这个脚本每天定时执行,Git仓库里就保留了完整的博客历史版本。哪篇文章被我改坏了、哪个主题文件被我改出问题了,30秒内可以回滚到任意版本。
第二步:Docker管理运行环境
把博客的所有运行环境打包进Docker容器,是解决"换服务器环境配不回去"这个问题的终极方案。
以Z-Blog为例,一个`Docker-compose.yml`文件搞定:
```yaml
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
- ./www:/www/html
depends_on:
- php
php:
image: php:8.2-fpm
volumes:
- ./www:/www/html
environment:
- PHP_UPLOAD_MAX_FILESIZE=50M
- PHP_POST_MAX_SIZE=50M
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 你的密码
MYSQL_DATABASE: zblog
volumes:
- mysql_data:/var/lib/mysql
- ./db_backup:/backup
volumes:
mysql_data:
```
第一次部署的时候运行`docker-compose up -d`,博客就跑起来了。换服务器的时候,只需要把整个项目文件夹复制过去,再跑一遍`docker-compose up -d`,nginx配置、PHP版本、数据库全部原封不动地还原。
这套方案还有个好处:测试环境随便折腾。比如你想测试新主题会不会把博客搞崩,直接改`docker-compose.yml`里的主题路径,本地起一套新容器测试,OK了再上线。不再需要先备份再上传再回滚那么麻烦。
第三步:异地云存储兜底
Git和Docker解决了代码层面的备份问题,但服务器本身也可能出问题——硬盘坏了、机房故障了、被人DDOS打到数据丢了。异地备份是最后的防线。
方案有两个。方案一是对象存储,按量计费,50G存储一个月大概几毛钱。写个脚本,每天凌晨把Git仓库打包上传到阿里云OSS或者腾讯云COS:
```bash
#!/bin/bash
tar -czf backup_$(date +%Y%m%d).tar.gz /path/to/blog
ossutil cp backup_$(date +%Y%m%d).tar.gz oss://你的bucket/blog-backup/
rm backup_$(date +%Y%m%d).tar.gz
```
方案二是Git仓库同步到两个平台,比如同时推送到Gitee和GitHub,单仓库冗余。即使Gitee挂了,GitHub上还有一份。
恢复演练:每季度必须做一次
备份不做恢复演练等于没备份。很多人存了十几个备份文件,结果真要恢复的时候发现压缩包损坏、文件权限不对、脚本跑不通。
建议每季度做一次完整的恢复演练:在新服务器上从头部署,验证数据库能恢复、网站能打开、所有配置都正确。发现问题及时修,别等到真出事了才后悔。
一张表总结三种备份方案对比
| 方案 | 备份内容 | 恢复速度 | 成本 | 推荐指数 |
|---|---|---|---|---|
| 宝塔插件备份 | 数据库+文件 | 中等 | 低 | ★★★ |
| Git+云存储 | 代码+配置 | 快 | 极低 | ★★★★★ |
| Docker镜像备份 | 全环境 | 最快 | 中 | ★★★★ |
我自己的博客现在用的是Git+对象存储+Gitee/GitHub双平台,备份频率是每小时一次增量、每天一次全量。上次换服务器,整个恢复过程不到20分钟,数据零丢失。
这套方案搭起来大概需要2-3小时,但换来的安全感是睡得踏实。
常见问题
Q:Docker会不会占用太多资源?
A:对于日访问量1万以内的个人博客,Docker额外消耗的资源可以忽略不计,大约多占用100-200MB内存。
Q:Git仓库越来越大怎么办?
A:数据库导出文件不要提交到Git,改用对象存储。定期运行`git gc`清理历史大文件。
Q:免费对象存储空间够用吗?
A:主流云服务商都有免费额度,阿里云OSS 30G免费用一年,腾讯云COS每月10G免费,基本够个人博客用。
Q:不会写脚本能实现这套方案吗?
A:可以。先从Git备份主题文件开始,不会的部分找我帮你写脚本,微信ID:15207283116。
Q:备份频率设多少合适?
A:个人博客每天一次全量备份足够。商业博客建议每小时增量备份、每天全量。
推荐阅读
想搭建这套备份系统但不知道从哪下手?
扫码加我微信(ID:15207283116),备注"备份",发你完整的部署脚本和配置文件。
需要了解更多使用技巧?
扫码加我微信,我来给你详细解答!
微信号:15207283116
(博客来的朋友优先通过!)
—— 本文仅供参考,具体以实际情况为准 ——
还木有评论哦,快来抢沙发吧~