The postmodern has come.

Mastodonをアップデートできない

忘れたころにアップデート

Mastodonのインスタンスを運用していますが、私は気分にムラがある人間なので頻繁につぶやいている時期と全く使ってない時期があります。そんなもんだから、気が付くとMastodonのバージョンアップに置いて行かれているのですが、たまに思い立ってアップデートしようとするとやり方を忘れていて、調べなおすのに時間がかかって困ります。いい加減何度もそういうことを繰り返したので、メモとしてここに残すことにしました。

足りない公式ドキュメント

Mastodonには公式Docker版があったと思いますが、私はずっとネイティブ環境で動かしています。公式サイトにあるアップデート手順を参照してGitで最新バージョンをチェックアウトするのですが、ほとんどの場合これだけでは動かないのです。

Mastodonは依存環境のアップデートに積極的に追随する方針らしく、Rubyや各種Bundleパッケージがobsoleteになっていると起動しません。なので、GitでMastodonのバージョンをあげるだけでなく、RubyやRuby on Rails関連のアップデートを行わなければなりません。以前はこのあたりのことも公式サイトのドキュメントに記載されていた気がするのですが、これが現在見つけることができません。以下に具体的な手順を記録します。

アップデート手順

公式サイトの手順に従い、Mastodonの実行ユーザにsuして、インスタンスの実行ディレクトリに移動し、最新バージョンのブランチへチェックアウトします。

$ git fetch --tags
$ git checkout v3.1.2

続いて、bundleパッケージのアップデートを試みます。

$ bundle install

Mastodonの依存するRubyのバージョンが上がっていない場合はこのままbundleパッケージのアップデートが行われますが、下記のようなエラーになった場合、

rbenv: version `2.7.2' is not installed (set by /opt/mastodon/live/.ruby-version)

rbenvの使うRubyのバージョンをあげてやります。

$ rbenv install 2.7.2

すると大概既存のrbenvの持っているRubyのバージョンのリストが最新版を含んでいないので、下記のようなエラーとなります。

ruby-build: definition not found: 2.7.2

See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build:

  git -C /home/mastodon/.rbenv/plugins/ruby-build pull

なので、メッセージにある通りgitでruby-buildをアップデートします。

$ git -C /home/mastodon/.rbenv/plugins/ruby-build pull

これでようやくRubyのアップデートができます。

$ rbenv install 2.7.2

rbenvが新しいバージョンのRubyのビルドを行うので、少し時間がかかります。ビルドが終わったら、改めてbundleパッケージのアップデートを行います。

$ bundle install

続いてRailsのコンパイルを行います。

$ RAILS_ENV=production bundle exec rails assets:precompile

仕上げに、Railsのデータベースの移行作業を行います。

$ RAILS_ENV=production bundle exec rails db:migrate

これで、Mastodonのインスタンスデーモンを再起動すればアップデート作業完了のはずです。

# systemctl restart mastodon-sidekiq
# systemctl reload mastodon-web
# systemctl restart mastodon-streaming

お疲れさまでした。