はじめに
これは僕が管理しているCreatodonというMastodonのサーバーの移管とアップデートを行ったときの備忘録になります。 一部正確な情報ではないかもしれませんのでご了承ください。
経緯
2021年9月30日以降でLet's Encryptのルート証明書が切り替わる件で一週間ほどCreatodonからの配送がつまっていたのが元々の発端。 この件に関しては、証明書の再取得とCentOSのca-certificatesを再インストールすることで解消できました。
元々はさくらインターネットさんが提供されているスタートアップスクリプトで構築したものなんですが、だんだんcld3などの一部ライブラリがインストールしにくかったり、使用しているPostgreSQLのバージョンが古く辛かったりとメンテナンスがかなり難しくなってきていました。
そこで、今回以下のようにサーバーの移管と使用しているバージョンのアップデートを行うことで根本的な解決に乗り出しました。
- CentOS7 -> Ubuntu 20.04へとサーバーを移行
- v3.0.1 -> v3.4.1(実際には今朝7時時点のmasterブランチ)をリリース
ちなみに、元々の想定ではUbuntu 20.04で環境構築だけするつもりだったんですが、mimemagicがGPL違反している件で古いバージョンがすべてRubyGemsから削除されていたのでv3.0.1での環境構築が出来ず、泣く泣くアップデートも行いました。
やったこと
現状の環境の把握
何はともあれ現状の環境を確認することからはじめました。
環境確認時点では以下のような構成になっていました。
- DB: PostgreSQL 9.6
- メディア: AWS S3にて管理
- Dokcer: 使用せず
新しいサーバーにデータを移行する際に一番つらそうなメディアは既にS3に出していたので肝になりそうなのはDBだけだとわかりました。 またDockerを使っていないので、普通にpg_dumpとかでデータをエクスポートすればOKそうでした。
DBを以下に移行できるかが今回の移管作業の成否を決めるといっても過言じゃない感じでしたね。
ちなみに、この記事を読んでさくらのスタートアップスクリプトを使ってMastodonの構築した人向けに捕捉しとくと、UbuntuとかのほかのOSに移行するときには事前にある程度環境構築とかしたうえで作業すると楽ですよ(メディアだけS3に出すとか、移行先に必要なライブラリとか入れとくとか)
移行先のサーバーの環境構築
基本的にMastodon公式が出している手順を参考にPostgreSQLのDBを作成するところまで行いました。
ソースコードのCloneに関してはCreatodonでは一部翻訳の差し替えなどを行っているので一旦後回しにしました。
それとアップデートの関係でRuby 2.7.4をインストールしたんですが、opensslがインストールできないなどのエラーが出るので以下の記事を参考にRubyGems自体をアップデートしておきましょう。
DBの移行
次にDBの移行を行いました。
とりあえず、全部のサービスを止めます。
sudo systemctl stop mastodon-*
次にpg_dump
でDBからバックアップを取得します。
sudo su - postgres pg_dump mastodon > dump.sql
mastodon
の部分にバックアップを取りたいDB名を入れて実行しました。
次に、移行先のサーバーで移行元のサーバーのIPなどでDBにアクセスできるように設定を修正しました。
実際の作業に関しては以下の記事を参考にさせて頂きました。
で、取得したバックアップを移行先のDBに放り投げます
psql --host=<移行先のサーバーのIP> --username=<移行先のDBのユーザー> -d <移行先のDB名> < dump.sql
今回は移行元と同じユーザー名とDB名でDBを作成してました。 特に大きな問題はなくすんなりと以降は完了しました。
ただ、移行元のDBが20GB近くあったので時間がかかりましたね……。 その辺を作業前に見積もっておくとよりスムーズに済むかもしれません。
ソースコードの修正
Creatodonでは一部コードを弄っているので、本家のソースコードをそのまま取り込むとエラーやコンフリクトが起きます。 そこで、一旦手元の環境でソースコードの追従を行い、エラーになっている箇所などの洗い出しを行いました。
ここである程度は解消できたんですが、実際にデプロイした際にはcld3周りの改修とかでだいぶ時間を取られました。
あと、独自テーマを追加している場合はSCSSの変数がいくつか足りなかったり、そもそもなくなったファイルをインポートしてたりするのでアセットがビルドできなくなるので注意してください。
ソースコードなどの移行
ソースコードを修正出来たら、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
これでインデックス周りの不具合は解消されたので再度マイグレーションを実行します。
デプロイ作業
あとはアセットをビルドしたり、SSL証明書の発行やNginxの設定をよしなにしておけばOKです。 ただし、ドメインのDNSとSSL証明書の発行だけは諸々済んだ後でやりましょう。 またドメインのDNSを修正してからSSL証明書を発行しないとエラーになるので注意が必要です
おわりに
とりあえずざっと書いていますが、対応を始めてからここまでで7~8時間くらいかかったので細かいところでよりあれこれやってます。 なので本当に必要に迫られない限りはサーバーの移管は大変なので興味本位ではしないようにしましょう。
とりあえず、ガガっと諸々できたので良かった……。