プログラミングなんてわからないんですけど〜

元プログラマによるプライベートでのプログラミング日記。1/3のつもりだけどソフト関連はここがメイン

マストドンのサーバーをリストアしてみた

実はマストドンのサーバーを2つ持っていまして、普段あまり使わない方をアップデート忘れていたのでアップデートしようと思ったのです。ちょっと試したらモジュールのインストールがどうしてもうまくいかず、ついOSをアップグレードしてしまい動いていた環境も動かなくなりました。幸い、OSは起動してpostgresqlとredisは動いていたので、データをバックアップして別のVMにリストアしてみました。

今回バックアップしたデータなどは5種類です。

  1. postgresqlのデータ
  2. redisのデータ
  3. マストドンの設定ファイル
  4. マストドンの個別テーマファイル
  5. マストドンfavicon

個別テーマとfaviconは私のサーバで特別に設定していたものなので、普通にマストドンを使っていた場合は不要と思います。バックアップ前に万が一のデータ更新などが行われないようにマストドンのサービスは停止・無効化しておきます。

systemctl stop mastodon-web mastodon-sidekiq mastodon-streaming

systemctl disable mastodon-web mastodon-sidekiq mastodon-streaming

まず一番目のpostgresqlのデータですが、postgresqlのサービスが動いていたので一般的な手段でバックアップしました。rootユーザからpostgresユーザに切り替えます。

su - postgres

その後、pg_dumpallコマンドを使用してデータをすべて吸い上げます。

pg_dumpall -f backup.dump

「backup.dump」は自分がわかるファイル名にしてください。データのサイズなどいろいろな条件にもよりますが数分かかることもあります。作成できたバックアップファイルは、何らかの手段で新しい環境にコピーしてください。私の場合は、自分の端末で動いているsshクライアントソフトに付属しているsftp機能を使用しました。なお、sftp機能を使うために、rootユーザでpostgresユーザのホームフォルダ(postgresユーザに切り替えたときにpwdコマンドで確認してください)からこの環境にsshでログインするときに使用しているユーザのホームフォルダにコピーしています。この「新しい環境へのコピー」はあとの4つでも同じことになります。

二番目のredisのデータですが、念の為メモリ上に残っているデータをファイルに書き込ませるためにredis-cliコマンドを使用します。

redis-cli save

このあと、一度redisサービスを停止してからデータを取り出します。

systemctl stop redis-server

どのようなファイルに書き出されるかは、/etc/redis/redis.confの設定を見てください。通常dump.rdbというファイルに書き出されます。このdump.rdbを新しい環境にコピーします。

三番目のマストドンの設定ファイルですが、通常はマストドンをインストールしたフォルダの「.env.production」ファイルになります。このファイルも新しい環境にコピーします。

四番目のマストドンの個別テーマファイルですが、私の場合は少々複雑です。一般的な場合は、マストドンをインストールしたフォルダのapp/javascript/styles配下にあるscssファイルやフォルダのうち自分で作ったものをコピーします。私の場合は、フリーのフォントも利用していたのでその設定ファイルとフォント自身のファイルもコピーしました。設定ファイルは、app/javascript/styles/fontsに置いています。フォントはapp/javascript/fontsにフォルダを作成して置いていました。

五番目のマストドンfaviconですが、マストドンをインストールしたフォルダのpublicフォルダにあるfavicon.icoをコピーしました。

私の場合は、ユーザがアップロードした画像などの保管場所にS3互換のサービスを使用していたのでこれ以上のコピー作業は発生しませんでした。nginxの設定ファイルについても作り直しています。


新しい環境にバックアップファイルをコピーし終えたら、マストドンの環境を作成していきます。作成は公式ドキュメント(
https://docs.joinmastodon.org/admin/install/
)にそって行いますが、途中行わない作業や代わりにやる作業があります。

「Setting up PostgreSQL」のところまで作業したら、ユーザの作成をせずにバックアップファイルからの復元を行います。バックアップファイル(backup.dump)はpostgresユーザのホームフォルダにあるものとします。rootユーザから「su - postgres」でpostgresユーザに切り替えたら次のコマンドを
実行します。

psql < backup.dump

このコマンドを実行したらしばらく待ちます。何も問題がなければデータの復元が全て行われ、psqlが終了して通常の画面に戻ります。
次にredisのバックアップファイルをコピーします。「systemctl stop redis-server」でredisを止めて、/etc/redis/redis.confに書かれているデータファイルの格納場所にdump.rdbをコピーします。コピーが終わったら「systemctl start redis-server」でredisを動かします。私はここで一度躓きました。サービスを起動してもエラーになります。ログを見てわかったのですが、私が古い環境で使っていたredisは5.0系だったのでubuntu serverなどでaptでインストールできるredisより新しいためデータの互換がありませんでした。今回は5.0系を別途インストールして動かすことができました。

ここまでできたらインストール作業に戻ります。マストドンのインストールを「Generating a configuration」の手前まで実施します。「RAILS_ENV=production bundle exec rake mastodon:setup」は.env.productionファイルを作成するものですので実行せずに、古い環境からコピーした.env.productionファイルをマストドンをインストールしたフォルダに置きます。

古い環境のマストドンのバージョンと新しい環境のバージョンが一致しているとは限りません。私の場合、2.9.2の環境からコピーして3.1.2の環境を新しく作りましたので、DBのmigrateを実行しています。

RAILS_ENV=production bundle exec rails db:migrate

このあと、assets:precompileも実行しました。

RAILS_ENV=production bundle exec rails assets:precompile

あとは「Setting up nginx」から先を進めます。なお、ここまでで使っていない「個別テーマファイル」「favicon」については、インストールが一通り済んでから改めてコピーして「yarn install」「assets:precompile」を再度実行しています。

これで作業は終了です。私の場合は、こんな感じで新しい環境にリストアすることができました。