Creatodonをv3.4.6からv4.0.2へのアップデートした

はじめに

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

経緯

前回のCreatodonアップデートの記事から一年とちょっと経ち、Fediverse界隈がにわかににぎやかになってきてました。 特にTwitterの買収騒動でのFediverseへの移住(おもにMastodonなどへの)が増え、連合するサーバーの数も徐々に増え始めており「そろそろメンテナンスしないとな」と思い、ガっとアップデートを進めることにしました。

環境

なお、Creatodonの環境としては以下のようになっています - Ubuntu 20.04 - Ruby 2.6 - Node.js v12 - PostgreSQL 12 - Redis 5

この環境でDockerを使わずに運用しています。

やったこと

リリースノートの確認

まずはv3.4.6以降のリリースノートを確認することにしました。

v3.4.6からv4.0.2までのリリースノート確認していくと、v3.5.2のリリースノートの部分にDBへのマイグレーションについての記載があるのが確認できました

github.com

それ以外の部分ではDBへのマイグレーションについての記載はなく、アップデートに関しての大きな注意点になりそうな箇所はないことがわかりました。 あとはNode.jsの最低バージョンなどの変更点があることを確認。

リリースノートとアップデート前のCreatodonの環境などを鑑みると以下の手順でアップデートで必要そうだとわかりました。 - Rubyなどのバージョンを上げる - DBへのマイグレーションをリリースノート記載の通りに対応

DBのバックアップ

DBへのマイグレーションを実行するので最悪の場合に備えてバックアップを取得します。

バックアップ自体は pg_dumpを使って以下のように実行しました。

sudo su - postgres
pg_dump mastodon > dump.sql

Rubyのバージョンアップ

次に使用するRubyのバージョンを上げました。

Mastodonの場合は.ruby-versionに記載されているバージョンのRubyを使うので、そちらを以下のコミットで修正。

github.com

ここでGemfileをちゃんと確認しておらず、3.1.2が使えると思い込んでしまったのが良くなかったですね......。

このあとbundle installを実行した際にエラーになり気付いて、以下のコミットで修正しています。

github.com

この段階で3.0.4がインストールされていない場合は以下のコマンドでインストールしましょう。

rbenv install 3.0.4

Node.jsのバージョンアップ

次にNode.jsのバージョンを上げました。

一旦はnvmを使ってバージョンを上げたんですが、Streaming周りが不安定になっていました。

そこで以下の記事を参考にnをインストールし、Node.jsのバージョンをv18系列まで上げました。

zenn.dev

マイグレーションの実行

RubyやNode.jsのアップデートなどが完了したのでマイグレーションの実行を行いました。 おそらく今回のアップデートで一番気を使った箇所ですね。

リリースノートの内容に合わせて、まずはSKIP_POST_DEPLOYMENT_MIGRATIONS=trueを付けた状態でマイグレーションを実行しました。

SKIP_POST_DEPLOYMENT_MIGRATIONS=true RAILS_ENV=production bundle exec rails db:migrate

かなり長いマイグレーションなので、コーヒーでも飲みながらのんびり待つと良いかもです。

マイグレーションが完了すると次にアセットのビルドを行います。

RAILS_ENV=production bundle exec rails assets:precompile

が、アセットのビルドは失敗。 原因としてはCreatodonで導入している独自テーマのscss周りのimportが最新のMastodonのテーマとそろっていないからでした。

そこで随時ビルドしつつ不要なimportを削除して回り、最終的にビルドできるようにしました。 一旦はビルドできてますが、独自テーマ自体のレイアウト調整などはまだ完了していないので今後折を見て直しておこうと思います。

アセットのビルドが完了したので以下のコマンドでMastodonの各サービスを再起動します。

sudo systemctl restart mastodon-web
sudo systemctl restart mastodon-streaming
sudo systemctl restart mastodon-sidekiq

各サービスが再起動した後、以下のコマンドで再度マイグレーションを実行します。

RAILS_ENV=production bundle exec rails db:migrate

これでマイグレーション周りの対応は完了です。

Sidekiq周りの設定修正

次に、Sidekiq周りの設定を修正します。

元々Creatodonでは以下のような設定でSidekiqを起動していました。

bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push -q scheduler

ただこのままだとv4.0.0以降ではうまく連合TLなどが動作しなくなる可能性があります。

ここら辺はアップデートの作業中に気付いたんですが、v4.0.0のリリースノートにingressキューを追加する必要がある旨の記載がありました。

Requires review of Sidekiq queues in some setups (new queue: ingress)

github.com

なので以下のようにSidekiqの起動処理を修正して対応しました。

bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push -q ingress -q scheduler

ここまでの対応でアップデートは完了です。

追加の対応

メール配送&ポート周りの設定修正

CreatodonではMailGunを使ってメールの配送などをしていたんですが、たまに配送できていないことがあったので対応しました。

具体的にはメール送信で利用しているMailGunのAPIキーなどを新しいものに差し替え。 またその最中に誤ってポートを閉じたりしたので、その辺も修正しました。

DeepLでの翻訳機能の導入

追加でDeepLでの翻訳機能なども導入。

以下の記事を参考にDeepL APIの認証キーを発行。

qiita.com

あとは .env.productionに以下のように発行した認証キーを環境変数として追加し、各サービスを再起動しました。

DEEPL_API_KEY=<発行した認証キー>

ElasticSearchの導入

Creatodonではサーバーの移管前まではElasticSearchを使っていたんですが、移行に際して廃止していました。 今回のアップデートに合わせて再度有効にしました。

公式の以下のドキュメントを参考にElasticSearchをインストールしました。

docs.joinmastodon.org

元々導入していたので.env.productionにはElasticSearch用のポート設定などはあり、その辺は特に設定せずに済みました。

あとは以下のコマンドを実行して各サービスを再起動し、

sudo systemctl restart mastodon-sidekiq
sudo systemctl reload mastodon-web

以下のコマンドで検索用のインデックスを生成してElasticSearchの導入は完了です。

RAILS_ENV=production bin/tootctl search deploy

おわりに

色々と立て込んでいてアップデートができていなかったので追加対応も含めると結構な作業量になってしまった感。 今後はできるだけこまめに追従していきたいですね......。