博客备份与版本控制实战: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

导出数据库-第1张图片-无双博客

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),备注"备份",发你完整的部署脚本和配置文件。

标签:博客搭建,备份恢复,Docker,Git,服务器配置