全家桶系列最后一篇,讲一个最容易被忽视、但出事最疼的话题——备份。

我吃过大亏:之前一台服务器,系统盘突然坏了,全家桶数据全没,网盘里的文件、影视库的海报配置、数据库,一夜回到解放前。从那以后我学乖了,备份这事必须提前做。

这篇讲讲我给 Mac mini 全家桶做的备份方案,以及换机器时怎么半小时恢复。

先说结论:Docker 备份的核心

Docker 全家桶备份,抓住一个核心原则就够:

所有数据都在"卷"里(或者挂载的目录里),容器本身是随时可以重建的。

所以备份 = 备份数据目录 + 备份配置文件。容器不用备份,丢了重新拉一个就行。

我的数据都放在 /opt/docker 下,每个服务一个子目录,这个规划在全家桶第一篇就定好了,现在派上大用场。

备份什么

按重要性排:

1. 数据库(最要命)

MySQL 数据在 /opt/docker/tanqu/mysql,短剧站的所有用户和内容都在里面。数据库不备份,等于白干。

数据库备份不能直接复制文件(可能不一致),要用 mysqldump 导出:

# 进容器导出
docker exec tanqu-mysql mysqldump -u root -p你的密码 tanqu > /backup/tanqu.sql

# 或者用 docker compose exec
cd /opt/docker/tanqu && docker compose exec mysql mysqldump -u root -p你的密码 tanqu > /backup/tanqu.sql

导出来的 SQL 文件就是完整的数据库,随时能恢复。

2. 配置目录

每个容器的 config 目录,比如:

这些直接打包就行。

3. 视频和文件数据

/opt/docker/media(影视库)、/opt/docker/tanqu/videos(短剧视频)——这些是大文件,几十 GB,没必要全量备份,除非你的盘够大。我的策略:重要的(自己拍的、绝版的)备份,能重新下载的(电影剧集)不备份,丢了重新拉。

一键备份脚本

我写了个备份脚本,放服务器上,每天凌晨自动跑:

#!/bin/bash
# /opt/docker/backup.sh

BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"

# 1. 备份数据库
docker exec tanqu-mysql mysqldump -u root -p你的密码 tanqu > "$BACKUP_DIR/tanqu.sql" 2>/dev/null

# 2. 打包所有配置目录
tar czf "$BACKUP_DIR/configs.tar.gz" \
  /opt/docker/qbittorrent/config \
  /opt/docker/jellyfin/config \
  /opt/docker/alist/data \
  /opt/docker/cloudreve

# 3. 备份 compose 文件
cp /opt/docker/docker-compose.yml "$BACKUP_DIR/"
cp /opt/docker/tanqu/docker-compose.yml "$BACKUP_DIR/tanqu-compose.yml"

# 4. 保留最近 7 天,删旧的
find /backup -type d -name "20*" -mtime +7 -exec rm -rf {} \;

echo "备份完成: $BACKUP_DIR"

然后加定时任务,每天凌晨 3 点跑:

crontab -e
# 加入这行
0 3 * * * /opt/docker/backup.sh >> /var/log/docker-backup.log 2>&1

每天自动备份,留 7 天滚动,基本够用。

重要:备份要"异地"

光备份在同一台机器上不够——硬盘坏了,备份跟着一起没了。

最朴素的方案:定期把备份拉到本地电脑。

# 在你自己的电脑上执行
scp -r ubuntu@你的服务器IP:/backup/20261104 /Users/你的用户名/backups/

或者用 rclone 同步到云盘、另一台 NAS。不用很频繁,一周一次就够。关键是有个"第二份"。

迁移:换机器半小时恢复

场景:我换台新服务器,或者机器坏了换新的。恢复流程:

新机器上:

# 1. 装 Docker(一键脚本)
curl -fsSL https://get.docker.com | sh

# 2. 建目录结构
mkdir -p /opt/docker

从备份恢复(在旧机器或备份文件里):

# 3. 把备份目录整个拷到新机器
scp -r /backup/20261104 ubuntu@新服务器IP:/opt/docker/restore/

# 4. 解压配置
cd /opt/docker
tar xzf restore/configs.tar.gz

# 5. 恢复数据库
docker compose -f /opt/docker/tanqu/docker-compose.yml up -d mysql
sleep 20  # 等 MySQL 起来
docker exec -i tanqu-mysql mysql -u root -p你的密码 tanqu < restore/tanqu.sql

# 6. 恢复 compose 文件,启动全部
cp restore/docker-compose.yml /opt/docker/
cp restore/tanqu-compose.yml /opt/docker/tanqu/
docker compose up -d

只要数据目录和 SQL 文件在,半小时之内,全家桶原地复活——网盘文件、影视库、短剧站数据,全都在。

踩过的坑

坑 1:mysqldump 备份不完整

第一次备份我用 cp 直接复制 MySQL 的 data 目录,恢复时数据库损坏。教训:数据库必须用 mysqldump 导出,不能直接复制数据文件(文件复制时可能正处于写入状态,数据不一致)。

坑 2:备份脚本权限问题

crontab 跑的脚本,默认没有 docker 权限(除非你加进 docker 组)。我的解决:脚本开头加 export PATH=/usr/bin:/usr/local/bin:$PATH,并且确保执行用户有 docker 组权限。不然凌晨备份静默失败,你根本不知道。

坑 3:忘了备份 compose 文件

有次只备份了数据目录,没备份 compose,恢复时凭记忆重写配置,漏了个端口映射,排查半天。compose 文件是"重建蓝图",必须和数据一起备份。

坑 4:大目录打包超时

media 目录几十 GB,tar 打包要很久。我的方案:大目录不打包(写进排除列表),只备份小体积的配置和数据库。视频丢了能重新下,配置丢了才是真麻烦。

结尾

写到这儿,Mac mini 全家桶系列就齐了:从装 Docker、网盘、下载器、影视库、聚合挂载、管理面板,到部署自己的短剧站,最后到功耗实测和备份迁移——一台 13W 的小盒子,从零到"五脏俱全"的完整记录。

回顾一下整个系列:

  1. Mac mini 当服务器:Docker 全家桶总览
  2. Docker 入门:三分钟上手
  3. Alist:网盘聚合挂载
  4. Jellyfin:家庭影视库
  5. qBittorrent:远程下载器
  6. Portainer:可视化管理
  7. tanqu.cc 短剧站容器化部署
  8. 功耗实测:13W 到底值不值
  9. 备份与迁移:半小时恢复(本篇)

全部文章都在 moxiaoa.com,想看哪篇直接搜。想搭同款服务器、要全套配置的,加我微信 lige0552,备注"全家桶"。

折腾永不停,下个系列见。