CT の Mastodon を VM の Ubuntu Server 24.04 LTS に移行する

Mastodon

これまで Ubuntu 22.04 の CT で Mastodon を運用していた。これを、新たに Ubuntu 24.04 の VM を用意して、必要なデータを移行してアップグレードする。
今のところ、公式のインストールガイドでは Ubuntu 22.04 または Debian 11 までが要件となっている。
でも、既に他のサイトで Ubuntu 24.04 へインストールする方法が紹介されているから、試しに紹介されているとおり v4.2.8 をインストールして、問題なく v4.2.12 までアップデートできることを確認できた。

Ubuntu 24.04 にすると、adduser --disabled-login mastodon で追加したユーザーはログインシェルが無いなど取り扱いが若干変わっていて、sudo su - mastodon でユーザーを切り替えることができなくなっている。
ということで、若干の気持ち悪さは許容して Ubuntu 24.04 に v4.2.12 をインストールする。

 

◇VM の準備

Ubuntu 24.04.1(2024年9月7日現在)のイメージファイルをダウンロードしてインストールする。
PVE の話なので詳細は省略。

 

◇リポジトリの設定

以下、しばらく root で作業する(sudo su -)。

必要なパッケージのインストール

apt install -y curl wget gnupg apt-transport-https lsb-release ca-certificates

 

Node.js

NodeSource のインストール手順を参考に v20 を使用する。

curl -sL https://deb.nodesource.com/setup_20.x | sudo bash -

 

PostgreSQL

Mastodon のガイドに依らずに、PostgreSQL Wiki のクイックスタートを利用してみる。

apt install -y postgresql-common 
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh

 

◇システムパッケージのインストール

 Ubuntu 24.04 へインストールする方法のとおり、設定したリポジトリからそれぞれ apt でインストールする。Ubuntu 22.04 とは異なるので注意。

apt update
apt install redis-server optipng pngquant jhead jpegoptim gifsicle nodejs \
imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file g++ libprotobuf-dev \
protobuf-compiler pkg-config gcc autoconf bison build-essential libssl-dev \
libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev \
libidn11-dev libicu-dev libjemalloc-dev git certbot nginx python3-certbot-nginx

 

◇mastodon ユーザーの追加

adduser --disabled-login mastodon

/home/mastodon のアクセス権限を 755 に変更する。気持ち悪ければ /var/www/mastodon に mastodon をセットアップしてもいい。

chmod 755 /home/mastodon

追加されるユーザーはログインシェルがない。
なのでコマンド vipw で直接編集する。

(ユーザー追加直後)
mastodon:x:1001:1001:,,,:/home/mastodon:/usr/sbin/nologin

(編集後)
mastodon:x:1001:1001:,,,:/home/mastodon:/bin/bash

これで今まで同様、root から su -u mastodon は可能だけどパスワードを設定するまではログインができないユーザーとなる。

 

◇Yarn

Node.js v16.9 以降はバンドルされているから有効化する。

corepack enable
yarn set version classic

 

◇Ruby、Bundler のインストール

su - mastodon としてユーザー mastodon で作業する。

Ruby のインストール

公式ガイドのとおり、rbenv でインストールする。環境変数は .bash_profile に変更する。
一応、Mastodon v4.3.0 にも対応できる。

(準備)
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

一度 mastodon からログアウトして再度 mastodon でログインする。

exit
su - mastodon
which rbenv
/root/.rbenv/bin/rbenv ←見つかれば OK。

今回は最新バージョンではなく、3.2 系の最新版を選択する。

(インストール可能なバージョン確認)
rbenv install -l 
3.1.6
3.2.5
3.3.5
jruby-9.4.8.0
mruby-3.3.0
picoruby-3.0.0
truffleruby-24.0.2
truffleruby+graalvm-24.0.2
(インストール)
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.2.5
rbenv global 3.2.5

(確認)
ruby -v
ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) [x86_64-linux]

 

bundler のインストール

gem install bundler --no-document
Fetching bundler-2.5.18.gem
Successfully installed bundler-2.5.18
1 gem installed
A new release of RubyGems is available: 3.4.19 → 3.5.18!
Run `gem update --system 3.5.18` to update your installation.

アップデートする。

gem update --system 3.5.18

 

◇PostgreSQLのインストールと設定

ユーザー mastodon から root に戻って作業する。

インストール

apt install -y postgresql postgresql-contrib

 

database とユーザーの作成

Ubuntu 22.04 とは異なり、あらかじめデータベースとユーザーを準備しておく。

sudo -u postgres -i psql
CREATE DATABASE mastodon_production;
CREATE USER mastodon;
ALTER USER mastodon createdb;
ALTER DATABASE mastodon_production OWNER TO mastodon;
\q

 

設定ファイルの編集

VM の仕様に基き、こちらの pgTune を利用して最適値を確認、postgresql.conf に反映する。

(編集)
vi /etc/postgresql/16/main/postgresql.conf

(リスタート)
systemctl restart postgresql

 

◇Mastodon の設定

ここからユーザー mastodon で作業する。

su - mastodon

公式ガイドではその時点での最新版をダウンロードすることになっているけど、今回は Mastodon の最新安定版リリースを指定してダウンロードする。

git clone https://github.com/mastodon/mastodon.git live && cd live
git checkout v4.2.12

Ruby と JavaScript の依存関係をインストールする。最初のインストール時だけで、アップデート時は bundl install で OK。
Ruby のバージョンの関係で、rbenv: version `3.2.3' is not installed (set by /home/mastodon/live/.ruby-version) というメッセージが出たら、.ruby-version をインストールしたバージョン 3.2.5 に書き換える。

bundle config deployment 'true'
bundle config without 'development test'
bundle install -j$(getconf _NPROCESSORS_ONLN)
yarn install --pure-lockfile

 

続いて、新規に Mastodon を立ち上げるときはセットアップウィザードを実行するが、今回は既存のインスタンスからデータを移行するだめ、セットアップウィザートは実行しない。
動作確認のため実行したうえで、後でデータベース移行前に削除しても良い。

ここでユーザー root にもどる。

exit

 

◇nginx の設定と SSL 証明書のコピー

SSL 証明書

ドメインを変更せず単純にサーバーを移行するだけだから、旧サーバーで取得している SSL 証明書を新サーバーにコピーする。
Let’s Encrypt で証明書を取得しているから、/etc/letsencrypt 以下の全てを tar -zcvf で圧縮して、まるっと新サーバーにコピーすれば OK。

/etc/crontab の設定も旧サーバーと同様に設定する。certbot の nginx プラグインもインストールする。

00 0    * * *   root    /usr/bin/certbot renew --nginx --renew-hook "/bin/systemctl reload nginx"

 

nginx の設定

公式ガイドのとおりに実行してもよし、旧サーバーからコピーしてもよし。

cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon
rm /etc/nginx/sites-enabled/default
  • example.com を書き換える(vi なら :%s/example.com/mastodon.jisaba.life/g)
  • ssl_certificate と ssl_certificate_key の行のコメントを解除する。

 

◇Mastodon の systemd サービス

オリジナルそのままで使用する。

cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now mastodon-web mastodon-sidekiq mastodon-streaming

 

◇データの移行

概要

詳細な移行手順の説明が公式サイトにある。大まかな流れとしては以下のとおりで、詳細は公式サイトを参照すること。

  1. ~/live/public/system のコピー
  2. PostgreSQL データベースの dump、インポート
  3. ~/live/.env.production のコピー
  4. /var/lib/redis/ 内の Redis データベースのコピー

1,3,4 は基本的に tar でまとめて scp 等でコピーする。2 は次のとおり。

 

データベースの dump とロード

旧サーバーでサービスを停止する。

sudo systemctl stop mastodon-*

旧サーバーでデータベースを dump する。ファイル backup.dump は scp 等で新サーバーにコピーする。

sudo su - mastodon
pg_dump -Fc mastodon_production -f backup.dump

新サーバーで、最初に作った動作確認用のデータベース mastodon_production を削除する。

sudo -u postgres -i psql
DROP DATABASE mastodon_production;
\q

改めて新サーバーで空のデータベースを作る。

createdb -T template0 mastodon_production

新サーバーでデータベースをロードする。-j# オプションは今回は付けない。

pg_restore -Fc -U mastodon -n public --no-owner --role=mastodon -d mastodon_production backup.dump

 

その他のファイルのコピー

tar -zcvf file.tar.gz dir でディレクトリをまとめてコピー、zxvf で解凍する。

 

サービスの起動

データの移行を終えたら、新サーバーで mastodon ユーザーとして次のコマンドを実行する。

RAILS_ENV=production bundle exec rails db:migrate
RAILS_ENV=production bundle exec rails assets:clobber
RAILS_ENV=production bundle exec rails assets:precompile

続いて、root ユーザーとして次のコマンドを実行する。

systemctl daemon-reload
systemctl start redis-server  
systemctl enable --now mastodon-web mastodon-sidekiq mastodon-streaming  
systemctl restart nginx

サーバーがオンラインに戻ったら、ユーザーのホーム フィードを再構築する。

RAILS_ENV=production ./bin/tootctl feeds build

 

◇全文検索 Elasticsearch

Elasticsearch のインストール

こちらのサイトを参考にリポジトリを追加する。インストールするバージョンは 7.x 系。

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

sudo apt-get update && sudo apt-get install elasticsearch
sudo apt-mark hold elasticsearch
※バージョン 7.17.23 で固定する。

 

kuromoji のインストール

apt install unzip
wget https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-kuromoji/analysis-kuromoji-7.17.23.zip
/usr/share/elasticsearch/bin/elasticsearch-plugin install file:///root/analysis-kuromoji-7.17.23.zip

 

設定の追加

.env.production の最後に次の行を追加する。

ES_ENABLED=true
ES_HOST=localhost
ES_PORT=9200

サービスを再起動する。

systemctl enable elasticsearch.service
systemctl start elasticsearch.service
systemctl restart mastodon-*

次のコマンドを実行して古くなったインデックスを再構築する。

RAILS_ENV=production ./bin/tootctl search deploy --only=instances accounts tags statuses public_statuses

 

◇感想

最初、レイアウトが大きく崩れる理由がわからなくて四苦八苦した。なんのことはない、/home/mastodon を chmod 755 していなかったことが原因。
公式には Ubuntu 22.04 までが対象になっているから無理やりだとも言えなくもない。が、とりあえず無事に Ubuntu 24.04.1 で動作させることができて良かった。
これで暫くは Mastodon のアップデートにも対応できるだろう、たぶん。

 

 

◇参考サイト