Docker版Mastodon服务器迁移一键脚本
重要前提
新服务器已提前安装Docker、Docker Compose,且开放SSH端口、能与旧服务器互通
记录旧服务器Mastodon版本(如v4.3.0),新服务器需保持完全一致
替换脚本中所有【】标注的自定义参数,提前创建备份目录
一、旧服务器:一键备份+传输脚本
1. 创建并运行备份脚本
Bash
# 进入Mastodon根目录(替换为你的实际路径)
cd /path/to/mastodon
# 创建备份脚本
vim mastodon_backup.sh
2. 复制以下脚本内容,修改自定义参数
Bash
#!/bin/bash
# ====================== 自定义参数(必填修改)======================
MASTODON_VER="v4.3.0" # 旧服务器Mastodon版本
BACKUP_DIR="./mastodon_backup_$(date +%Y%m%d)" # 本地备份目录
NEW_SERVER_USER="root" # 新服务器SSH用户名
NEW_SERVER_IP="xxx.xxx.xxx.xxx" # 新服务器IP
NEW_SERVER_BACKUP_DIR="/root/mastodon_backup" # 新服务器备份存放路径
# =================================================================
# 创建备份目录
mkdir -p $BACKUP_DIR
echo "===== 开始停止Mastodon服务 ====="
docker compose down
# 1. 备份配置文件
echo "===== 备份配置文件 ====="
cp .env.production docker-compose.yml $BACKUP_DIR/
# 2. 备份PostgreSQL数据库
echo "===== 备份数据库 ====="
docker exec mastodon-db pg_dump -U mastodon mastodon_production | gzip $BACKUP_DIR/mastodon_db_$(date +%Y%m%d).sql.gz
# 3. 备份Redis数据
echo "===== 备份Redis ====="
docker cp mastodon-redis:/data/dump.rdb $BACKUP_DIR/
# 4. 备份媒体文件
echo "===== 打包媒体文件 ====="
tar -czf $BACKUP_DIR/mastodon_media_$(date +%Y%m%d).tar.gz public/system
# 5. 传输备份文件到新服务器
echo "===== 开始传输备份文件到新服务器 ====="
ssh $NEW_SERVER_USER@$NEW_SERVER_IP "mkdir -p $NEW_SERVER_BACKUP_DIR"
scp -r $BACKUP_DIR/* $NEW_SERVER_USER@$NEW_SERVER_IP:$NEW_SERVER_BACKUP_DIR/
# 6. 旧服务器重新启动服务(可选,回滚用)
echo "===== 旧服务器重启Mastodon服务 ====="
docker compose up -d
echo "===== 旧服务器备份+传输完成!备份文件已发送至新服务器:$NEW_SERVER_BACKUP_DIR ====="
echo "===== 请记录Mastodon版本:$MASTODON_VER,新服务器恢复需使用此版本 ====="
3. 赋予脚本权限并执行
Bash
chmod +x mastodon_backup.sh
# 执行备份
./mastodon_backup.sh
执行过程中输入新服务器SSH密码,等待备份、传输完成,全程不要中断
二、新服务器:一键恢复脚本
1. 创建并运行恢复脚本
Bash
# 登录新服务器,创建恢复脚本
vim mastodon_restore.sh
2. 复制以下脚本内容,修改自定义参数
Bash
#!/bin/bash
# ====================== 自定义参数(必填修改)======================
MASTODON_VER="v4.3.0" # 与旧服务器版本完全一致
BACKUP_DIR="/root/mastodon_backup" # 旧服务器传输来的备份目录
MASTODON_INSTALL_DIR="/root/mastodon" # 新服务器Mastodon安装目录
# =================================================================
# 1. 安装依赖(若已安装可跳过)
echo "===== 检查并安装Git、Docker Compose ====="
apt update && apt install -y git docker-compose
systemctl enable --now docker
# 2. 拉取Mastodon源码,切换对应版本
echo "===== 拉取Mastodon源码,切换版本:$MASTODON_VER ====="
mkdir -p $MASTODON_INSTALL_DIR
cd $MASTODON_INSTALL_DIR
git clone https://github.com/mastodon/mastodon.git .
git checkout $MASTODON_VER
# 3. 复制旧服务器配置文件
echo "===== 复制配置文件 ====="
cp $BACKUP_DIR/.env.production $BACKUP_DIR/docker-compose.yml $MASTODON_INSTALL_DIR/
# 4. 启动数据库+Redis,暂停其他服务
echo "===== 启动数据库、Redis服务 ====="
docker compose up -d db redis
sleep 40 # 等待数据库初始化完成
# 5. 恢复PostgreSQL数据库
echo "===== 恢复数据库 ====="
gunzip -c $BACKUP_DIR/mastodon_db_*.sql.gz | docker exec -i mastodon-db psql -U mastodon -d mastodon_production
# 6. 恢复Redis数据
echo "===== 恢复Redis数据 ====="
docker cp $BACKUP_DIR/dump.rdb mastodon-redis:/data/
docker compose restart redis
# 7. 恢复媒体文件+赋权(关键步骤,避免权限报错)
echo "===== 恢复媒体文件并赋权 ====="
tar -xzf $BACKUP_DIR/mastodon_media_*.tar.gz -C $MASTODON_INSTALL_DIR/public/
chown -R 991:991 $MASTODON_INSTALL_DIR/public/system
# 8. 启动所有Mastodon服务
echo "===== 启动全部Mastodon服务 ====="
docker compose up -d
# 9. 重建时间线(修复首页时间线空白问题)
echo "===== 重建用户时间线 ====="
docker compose run --rm web tootctl feeds build
# 10. 检查服务状态
echo "===== 检查服务运行状态 ====="
docker compose ps
echo "===== Mastodon迁移恢复完成!====="
echo "===== 请将域名DNS解析指向新服务器IP,生效后即可访问 ====="
echo "===== 查看日志命令:docker compose logs -f web streaming sidekiq ====="
3. 赋予脚本权限并执行
Bash
chmod +x mastodon_restore.sh
# 执行恢复
./mastodon_restore.sh
三、迁移后收尾操作
DNS解析切换:将域名A/AAAA记录修改为新服务器IP,等待TTL生效
服务校验:访问域名测试,查看媒体、帖子、用户数据是否完整
日志排查:若访问异常,执行docker compose logs -f查看报错,重点排查权限、数据库连接问题
旧服务器处理:确认新服务器正常运行72小时后,再关闭旧服务器Mastodon服务
四、常见报错解决
权限不足:重新执行媒体文件赋权命令chown -R 991:991 public/system
数据库导入失败:检查旧服务器是否已停止服务,重新备份数据库再传输
版本不匹配:新服务器重新git checkout对应版本,删除旧容器重新部署
媒体文件无法显示:检查docker-compose.yml中媒体目录挂载是否正确,重启服务