为了降低成本,决定把服务迁移到闲置的1C1.3G 40G rackNerd 小鸡上,迁移服务器后,优化了一直使用的 VPS 资料备份的脚本,增加结果发送到 telegram,使用配置文件等一些优化,跟大家分享一下。

在我的小鸡上跑着 mjj 三件套(探针、图床、博客)和一些个人折腾的小脚本,所有服务已经 docker 化,外网入口到服务器后,由 docker 版 nginx 代理转发内部 dockge 管理的各个 docker 服务。

需要备份的文件主要有:

  • 网站项目程序代码 /var/www/html
  • 数据库,MySQL 数据导出 sql 文件
  • Docker 应用配置 /opt/docker/data
  • 服务器的应用配置
  • 镜像压缩包,一些自定义 Docker 镜像的压缩包

数据每日备份,为了避免备份时间过长,出现锁文件,导致应用程序响应过长,影响用户体验或数据丢失等异常情况,没有直接源文件打包,而是复制备份文件到指定目录,然后在目录使用 tar 打包,数据库使用 mysqldump 导出 sql 文件,全程放在 cron job 里定时运行。

每日备份保存最近七天 tar.gz 备份文件,并且 rsync 同步推送到异地备份,后面出于安全考虑,避免通过入侵 Web 机对免密登录的异地机执行脚本,改成异地机主动拉取同步 Web 机七天备份文件夹

实现代码

# 1. 使用 tar 备份目录
# 备份
cd /backup/path/data && tar zcvf /backup/storage/data.tar.gz --transform='s/^\.\///' .
# 查看
tar -tvf /backup/storage/data.tar.gz
# 解压到指定路径
tar -xzf data.tar.gz -C /path/to/destination example.txt  # 或者 example_dir/

# 2. 使用 mysqldump 命令备份 MySQL 数据库
# 备份
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > "/backup/storage/db_backup.sql"
# 还原
mysql -u $DB_USER -p$DB_PASS $DB_NAME < /backup/storage/db_backup.sql

# 3. 自定义 Docker 镜像
# 备份
docker save -o /opt/backup/data/php-8.3.2-fpm-alpine-20241014.tar 192.168.0.114/php:8.3.2-fpm-alpine-20241014
# 还原
docker load -i php-8.3.2-fpm-alpine-20241014.tar

# 4. 使用 rsync 异地备份
rsync -e "ssh -p22" -avz --delete /opt/backup/data/ root@${PUSH_TO_SERVER}:/opt/backup/data/

备份截图