从无法联网的服务器上迁移长毛象实例

Author Avatar
st 2020年07月27日
  • 在其它设备中阅读本文章

不备份的人只能多干活。

不了解长毛象的朋友可以先看一下长毛象首页以及什么是长毛象,两个页面都是有中文的。

我的长毛象实例:魔法使联盟-fault中文社区

昨天我运行长毛象的Linode服务器因为更换内核出错,导致完全无法联网,我不得不把长毛象实例迁移到新服务器上。官方的迁移教程有些地方不能直接照搬,我还是写一下迁移过程吧。

这次事情最大的教训是,别他妈不备份就在生产环境里瞎搞。

但是Linode那个自动备份我也不想开,五刀的机器备份要两刀,抢钱呢这。

情况总结

我先总结一下情况,接下来说明操作的时候也方便一点。

  1. 服务器无法联网,导致ssh连不上,也没法收发文件
  2. 网站数据之类的都还在
  3. 唯一一个对机器进行操作的途径是通过Linode后台,通过网页版后台也能连上ssh
  4. 长毛象实例有段时间没更新了,运行的版本还是一年前的版本

一些参考资料:
官方迁移教程
官方升级教程
官方安装教程
官方博客的迁移教程(对这次的情况来说没用,这个要你能登上你的长毛象实例才行)

转移数据

因为服务器连不了网,文件没办法直接拷出来,只能通过Linode的后台把整个磁盘移到新服务器上了。
Linode Clone Disk

不过网页版ssh还能连上,在clone整个磁盘之前可以先把数据库备份了,不然的话恢复数据库就得拷postgres的data文件夹了。
切换到mastodon用户su mastodon
备份数据库pg_dump -Fc mastodon_production -f backup.dump

备份完数据库把磁盘clone到新机器上,完成过后进入新机器的Linode后台,在Configuration里把旧磁盘挂上,挂在c位就行了(
Configuration
启动新机器过后创建一个空文件夹,名字随意,我就建了个叫olddrive的文件夹。
通过命令mount /dev/sdc /olddrive装载旧磁盘,随后就可以在olddrive文件夹中访问旧磁盘的文件了。

安装长毛象

新机器上就按照官方安装教程装就可以了,Debian10的System packages有点不一样,libgdbm5被libgdbm6取代了,不改一下命令的话装System packages会报错。
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.6.6安装Ruby的时候慢如蜗牛,我也没找到什么好办法。
*加一个--verbose命令可以显示进度。
一直按教程弄到'Generating a configuration'之前就可以了。

恢复数据

恢复数据的步骤基本上按照官方迁移教程来,数据库的dump文件在转移磁盘之前已经创建好了,只要复制到/home/mastodon/即可。
转移文件只要从旧磁盘直接复制到新磁盘的对应位置就行了。
一直到第五步'Run RAILS_ENV=production bundle exec rails assets:precompile to compile Mastodon'之前都没有问题的,但是第五步的时候就报错,看了一下错误是'column accounts.suspended does not exist',基本上就是数据库缺了一栏。因为原来的长毛象版本太旧,所以现在相当于迁移的同时还进行了更新,新版本数据库结构有所改变,如果不进行数据库更新的必要操作就会报错。
找一下Github上Releases里面的Upgrade notes就能找到,在更新到3.1.4的时候,要先运行RAILS_ENV=production bundle exec rails db:migrate,然后再运行RAILS_ENV=production bundle exec rails assets:precompile
Upgrade notes
之后就可以回到迁移教程上了,用RAILS_ENV=production ./bin/tootctl feeds build重建用户首页,不运行这条的话进入长毛象首页之后“主页”一栏是空的。
之后的操作都没什么问题,运行一下服务,复制一下Nginx配置,改一下DNS,签一下SSL证书,弄完重启一下应该就OK了。

所以为什么不备份呢?

我他妈也想问我自己。

本文链接:https://blog.stsecurity.moe/archives/115/
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.