Creatodonのサーバー移管とv3.4.1へのアップデートをした

はじめに

これは僕が管理しているCreatodonというMastodonのサーバーの移管とアップデートを行ったときの備忘録になります。 一部正確な情報ではないかもしれませんのでご了承ください。

経緯

2021年9月30日以降でLet's Encryptのルート証明書が切り替わる件で一週間ほどCreatodonからの配送がつまっていたのが元々の発端。 この件に関しては、証明書の再取得とCentOSのca-certificatesを再インストールすることで解消できました。

元々はさくらインターネットさんが提供されているスタートアップスクリプトで構築したものなんですが、だんだんcld3などの一部ライブラリがインストールしにくかったり、使用しているPostgreSQLのバージョンが古く辛かったりとメンテナンスがかなり難しくなってきていました。

manual.sakura.ad.jp

そこで、今回以下のようにサーバーの移管と使用しているバージョンのアップデートを行うことで根本的な解決に乗り出しました。

  • CentOS7 -> Ubuntu 20.04へとサーバーを移行
  • v3.0.1 -> v3.4.1(実際には今朝7時時点のmasterブランチ)をリリース

ちなみに、元々の想定ではUbuntu 20.04で環境構築だけするつもりだったんですが、mimemagicがGPL違反している件で古いバージョンがすべてRubyGemsから削除されていたのでv3.0.1での環境構築が出来ず、泣く泣くアップデートも行いました。

qiita.com

やったこと

現状の環境の把握

何はともあれ現状の環境を確認することからはじめました。

環境確認時点では以下のような構成になっていました。

  • DB: PostgreSQL 9.6
  • メディア: AWS S3にて管理
  • Dokcer: 使用せず

新しいサーバーにデータを移行する際に一番つらそうなメディアは既にS3に出していたので肝になりそうなのはDBだけだとわかりました。 またDockerを使っていないので、普通にpg_dumpとかでデータをエクスポートすればOKそうでした。

DBを以下に移行できるかが今回の移管作業の成否を決めるといっても過言じゃない感じでしたね。

ちなみに、この記事を読んでさくらのスタートアップスクリプトを使ってMastodonの構築した人向けに捕捉しとくと、UbuntuとかのほかのOSに移行するときには事前にある程度環境構築とかしたうえで作業すると楽ですよ(メディアだけS3に出すとか、移行先に必要なライブラリとか入れとくとか)

移行先のサーバーの環境構築

基本的にMastodon公式が出している手順を参考にPostgreSQLのDBを作成するところまで行いました。

docs.joinmastodon.org

ソースコードのCloneに関してはCreatodonでは一部翻訳の差し替えなどを行っているので一旦後回しにしました。

それとアップデートの関係でRuby 2.7.4をインストールしたんですが、opensslがインストールできないなどのエラーが出るので以下の記事を参考にRubyGems自体をアップデートしておきましょう。

www.task-notes.com

DBの移行

次にDBの移行を行いました。

とりあえず、全部のサービスを止めます。

sudo systemctl stop mastodon-*

次にpg_dumpでDBからバックアップを取得します。

sudo su - postgres
pg_dump mastodon > dump.sql

mastodonの部分にバックアップを取りたいDB名を入れて実行しました。

次に、移行先のサーバーで移行元のサーバーのIPなどでDBにアクセスできるように設定を修正しました。

実際の作業に関しては以下の記事を参考にさせて頂きました。

zenn.dev

ymotongpoo.hatenablog.com

で、取得したバックアップを移行先のDBに放り投げます

psql --host=<移行先のサーバーのIP> --username=<移行先のDBのユーザー> -d <移行先のDB名> < dump.sql

今回は移行元と同じユーザー名とDB名でDBを作成してました。 特に大きな問題はなくすんなりと以降は完了しました。

ただ、移行元のDBが20GB近くあったので時間がかかりましたね……。 その辺を作業前に見積もっておくとよりスムーズに済むかもしれません。

ソースコードの修正

Creatodonでは一部コードを弄っているので、本家のソースコードをそのまま取り込むとエラーやコンフリクトが起きます。 そこで、一旦手元の環境でソースコードの追従を行い、エラーになっている箇所などの洗い出しを行いました。

ここである程度は解消できたんですが、実際にデプロイした際にはcld3周りの改修とかでだいぶ時間を取られました。

github.com

あと、独自テーマを追加している場合はSCSSの変数がいくつか足りなかったり、そもそもなくなったファイルをインポートしてたりするのでアセットがビルドできなくなるので注意してください。

github.com

github.com

github.com

github.com

ソースコードなどの移行

ソースコードを修正出来たら、Mastodon公式のようにsu - mastodonでユーザーを切り替えてliveというディレクトリ名でCloneします。

su - mastodon
git clone https://github.com/S-H-GAMELINKS/mastodon.git

ちなみに最近GitHubソースコードをCloneするときにAPIトークンが必要になってたりします(HTTPSの場合)。 その辺も注意したほうがいいかもしれません。

ちなみに、僕の場合はsshで取ってきました。

ソースコードを移行できたら次は.env.productionをどうにかこうにかして移行しましょう。 僕の場合は原始的にsshでサーバーにそれぞれ接続して内容をコピーして対応しました。

マイグレーション

普通の移行であれば以上のところで大体OKなんですが、僕の場合はアップデートも行う必要があったのでマイグレーションも追加で行いました。

RAILS_ENV=production bundle exec rails db:migrate

で、あとはマイグレーションが終わるのを待つだけと思ってたんですがここでDBのindex周りでエラーが出ました。

そこで公式の出しているコマンドでインデックスの修正を行いました(本来ならDBのバックアップが必要ですが、今回は移行元にバックアップがあるのでしませんでした)

RAILS_ENV=production ./bin/tootctl maintenance fix-duplicates

docs.joinmastodon.org

これでインデックス周りの不具合は解消されたので再度マイグレーションを実行します。

デプロイ作業

あとはアセットをビルドしたり、SSL証明書の発行やNginxの設定をよしなにしておけばOKです。 ただし、ドメインDNSSSL証明書の発行だけは諸々済んだ後でやりましょう。 またドメインDNSを修正してからSSL証明書を発行しないとエラーになるので注意が必要です

おわりに

とりあえずざっと書いていますが、対応を始めてからここまでで7~8時間くらいかかったので細かいところでよりあれこれやってます。 なので本当に必要に迫られない限りはサーバーの移管は大変なので興味本位ではしないようにしましょう。

とりあえず、ガガっと諸々できたので良かった……。