前言
因为手残不小心把服务器的/etc
目录全部删除(这是系统关键文件),导致服务器就此废掉救不回来了。之前查资料发现root用户甚至可以运行rm -rf /
命令,结果这次就轮到我了…
好在我备份了Mastodon的数据库,这里简单记录一下迁移过程,文章参考了将Mastodon站点从非Docker迁移至Docker:兼谈其他平台迁移,稍微补充了一下细节。升级数据库、如何使用数据库备份恢复数据库的操作也可参考本文。因为使用了S3外部媒体存储,所以不考虑复制媒体文件的步骤。
朋友们,数据无价。道路千万条,备份第一条;数据不备份,迁移两行泪。
前期准备
在新服务器中安装一些常用软件:
apt update && apt install wget rsync python git curl vim git ufw -y
安装Docker&Docker-Compose(使用一键脚本安装即可)。首先至docker-compose release界面找到最新的版本号(例如v2.2.3
),随后回到服务器执行:
bash <(curl -L https://get.docker.com/)
curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#以v2.2.3为例,替换为最新版本
chmod +x /usr/local/bin/docker-compose
安装Nginx与Certbot:
apt install nginx -y
apt install snapd
snap install core #安装snap
snap install certbot --classic #使用snap安装certbot
迁移数据
因为我删除了整个/etc
目录导致旧服务器全废,报错uid=0 gid=0 groups=0
,无法使用rsync
命令将旧服务器文件复制到新服务器中。好在我之前参考了利用Scaleway备份数据库这个教程备份了数据库,解压文件夹之后获得的数据库备份文件是backup.dump
。当然如果你的旧服务器能够运行rsync
命令更好,而且步骤简单许多。
数据库迁移分为两个方案:旧服务器可以复制文件到新服务器和旧服务器无法复制文件到新服务器,后者指的是服务器完全损坏无法修复的情况,需要用S3中的数据库备份来恢复数据。两个方案之后的步骤相同。
我的数据库备份脚本backup.sh
中,origin
路径为/opt/mastodon
,请替换成你自己的路径。
如果旧服务器可以复制文件到新服务器
在新服务器中:mkdir -p /opt/mastodon
新建Mastodon目录。
在旧服务器中:
cd /opt/mastodon
rsync -azv ./.env.production root@新服务器IP:/opt/mastodon/
rsync -azv ./docker-compose.yml root@新服务器IP:/opt/mastodon/
rsync -azv ./postgres root@新服务器IP:/opt/mastodon/
将.env.production
、docker-compose.yml
文件与postgres
文件夹直接复制到新服务器的/opt/mastodon
文件夹下。
如果旧服务器无法复制文件到新服务器
在旧服务器中手动复制粘贴将Mastodon的配置文件.env.production
内容备份到你的本地电脑。同时也备份好你的docker-compose.yml
文件,然后运行docker-compose down
将站点下线,此时你的旧服务器已经可以寿终正寝了,你可以选择在另一家VPS服务商里开新机器,或是使用原服务器ip重装系统。我自己是从Ubuntu18.04重装系统换成了Debian10。
下面借用Scaleway恢复你的数据库。登录Scaleway账号找到备份数据库用的存储桶(Bucket),找到最后一次备份的zip文件,点击右侧···
选择Get public link
得到一串长链接,有效期只有一小时。
回到新服务器,运行mkdir -p /opt/mastodon
新建Mastodon目录,随后运行wget "刚刚复制的长链接"
下载zip文件至新服务器。
运行apt install unzip
安装unzip,然后ls -a
查看刚刚下载的zip文件的文件名(可能有长后缀)。mv "文件名" backup.zip
将其改名之后运行unzip backup.zip
来解压zip文件(提示输入密码)。解压成功后不出意外的话你会在/opt/mastodon
文件夹下找到backup.dump
文件。
将.env.production
和docker-compose.yml
内容粘贴到新服务器的/opt/mastodon
文件夹中。查看docker-compose.yml
的db
项确认你的数据卷(volume
)挂载地址和数据库版本(image
)。以./postgres:/var/lib/postgresql/data
和postgres:12.5-alpine
为例,运行以下命令创建新容器:
docker run --name postgres12 -v /opt/mastodon/postgres:/var/lib/postgresql/data -e POSTGRES_PASSWORD=设置数据库管理员密码 --rm -d postgres:12.5-alpine
解释名词:
postgres12
是新容器的容器名(不与其他容器重名即可,随意设置),/opt/mastodon/postgres
是数据卷挂载位置的绝对地址,/var/lib/postgresql/data
是数据卷在容器内的映射,postgres:12.5-alpine
是容器所用的镜像,同时也是数据库版本。
查看.env.production
文件,确认你的数据库名(DB_NAME
)、数据库用户(DB_USER
)和数据库密码(DB_PASS
)这三项。本文之后出现的数据库名/用户/密码都要与.env.production
文件一致,敬请注意。
运行docker exec -it postgres12 psql -U postgres
进入容器内的数据库:
CREATE USER mastodon WITH PASSWORD '数据库密码' CREATEDB;
\q #回车退出容器
最后运行docker stop postgres12
停止容器,此时初始化数据库步骤结束。
下面将数据库备份导入数据库中。先启动Mastodon的数据库容器:
docker-compose up -d db
运行docker ps | grep mastodon-db | awk '{print $1}'
查询数据库容器ID,将其复制,随后运行docker cp ./backup.dump 数据库容器ID:/tmp/backup.dump
将之前所得的数据库备份文件backup.dump
写入docker容器中的临时文件夹下。
进入数据库容器中创建空白数据库:
docker exec -it mastodon-db-1 /bin/bash
su - postgres
createdb -T template0 数据库名
运行psql
命令进入数据库,执行:
GRANT ALL PRIVILEGES ON DATABASE 数据库名 TO 数据库用户;
\q #回车退出数据库
继续执行:
pg_restore -U 数据库用户 -n public --no-owner --role=数据库用户 \
-d 数据库名 /tmp/backup.dump
然后两次exit
退出docker容器。此时数据库迁移完毕,运行docker-compose down
关闭数据库容器。
一些赋权行为
在新服务器中,运行docker-compose run --rm web bin/tootctl feeds build
构建用户首页时间流,然后docker-compose up -d
将站点上线,随后对文件夹进行赋权:
chown -R 70:70 ./postgres
chown 991:991 -R ./public
如果你开启了全文搜索:
chown 1000:1000 -R elasticsearch
docker-compose run --rm web bin/tootctl search deploy #建立旧嘟文索引
构建用户首页时间流:
docker-compose run --rm web bin/tootctl feeds build
重启容器:
docker-compose down
docker-compose up -d
如果迁移操作涉及到升级:
docker-compose run --rm web rails db:migrate
docker-compose run --rm web bin/tootctl cache clear
Nginx 反向代理
打开官方的Nginx配置文件模板,将两处root /home/mastodon/live/public;
改为root /opt/mastodon/public;
,两处example.com
改为你的域名。
运行nano /etc/nginx/conf.d/mastodon.conf
,粘贴内容并保存。
测试配置文件是否有错误(试运行):
nginx -t
若没有错误,生效新的配置文件并运行 Nginx,开机启动:
nginx -s reload
systemctl start nginx
systemctl enable nginx
运行certbot --nginx
获取SSL证书。