
为了降低成本,决定把服务迁移到闲置的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. 规划待备份文件目录
# docker
/opt/dockge
/opt/docker
# 网站文件
/var/www/html
# 配置文件
/var/spool/cron/crontabs
/etc/rsyncd.conf
/etc/rsync.password
/etc/x-ui/x-ui.db
# 脚本文件
/opt/nezha
/opt/scripts
# 数据库
docker exec -it mysql mysqldump -h127.0.0.1 -P3306 -uroot -p'yourpassword' -B app > /opt/data/backup/app-202410240836.sql
# 自定义镜像
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
2. crontab 每日凌晨4点执行备份脚本
root@racknerd-157:~# crontab -l
# backup
0 4 * * * mkdir -p "/opt/backup/logs" && /opt/scripts/backup_v2.sh > /opt/backup/logs/backup-$(date +\%Y\%m\%d).log 2>&1
3. backup_v2.sh 实现代码
# 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/
4. 备份截图
