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中媒体目录挂载是否正确,重启服务