👻

MastodonのDBを外出ししてみたメモ

2021/08/11に公開

前提

  • Mastodon prodcution guide に従った非 docker 構成
  • Ubuntu 18.04LTS

構成

  • もともとの Mastodon サーバー(Mastodon サーバーと呼ぶ)
  • 移行先 PostgreSQL DB サーバー(DB サーバーと呼ぶ)

やったことの前提

私は複数の Mastodon インスタンスを運営しており、ひとつはほぼ負荷がないテスト用で、もう一つは本番稼働しているものです。これらの PostgreSQL の DB を別のサーバー(2 つのインスタンスで共有)にまとめてみようと思い今回の作業を行いました。

手順

本作業は、Mastodon のインスタンスを停止して行う必要がある。

外出側の PostgreSQL にユーザーと DB を作成

DB サーバーでの作業。

postgres ユーザーで実行する。

CREATE USER mastodon_user; # 複数インスタンスのDBを統合するならその分作る
alter role mastodon_user with password 'password';  # パスワード設定
create database mastodon_db with owner=mastodon_user;

外部接続を可能にするように設定

DB サーバーでの作業。

/etc/postgresql/10/main/pg_pba.conf を編集し、以下の内容を追加する。

/etc/postgresql/10/main/pg_hba.conf
# ↓固定 database     user           ip              ↓固定
host    mastodon_db mastodon_user 192.168.10.0/24   md5

設定を反映させるためにリロード(restart でも OK)

sudo systemctl reload postgresql

もとの DB を dump する

ここから先は mastodon を停止して行う必要があります

Mastodon サーバーでの作業。

postgres ユーザーで実行。

sudo su - postgres
pg_dump mastodon_production > dump.sql

ダンプをロード

Mastodon サーバーでの作業。

postgres ユーザーで実行(だが、dump.sql にアクセスできればどのユーザーでもよい)

psql --host=192.168.10.40 --username=mastodon_username < dump.sql
# --no-owner オプションを追加すれば次項のユーザーに関する警告をスキップできる(コメント参照)

注意点

接続が拒否されるのであれば、DB サーバー側のファイアウォール(ポート 5432)や、pg_hba.confの設定を疑う。

ERROR: role "mastodon" does not exist が表示されるが無視して良い。

alter で所有者を変更しようとしているが、もともとは mastodon ユーザーが所有していたのを、DB 移行の際に mastodon_user に変更しているせい。

DB 自体の所有者を変更してあるので動作上問題はない(owner ならその DB とその中身に対して全権限がある)

しかし、mastodonユーザーが、移行先の postgresql に存在してしまっている場合は問題になる。

この場合は、dump.sqlを編集して(OWNER で検索して置換すると良い)ユーザー名を書き換えるしかないと思われる。

※ 私はこれに該当したのでdump.sqlを書き換えました。それなりに大きなサイズになるはずなので可能ならsedを使うなりした方がいいかもしれません。VSCode で頑張って置換しましたが動作がもっさりして辛かったです。

Mastodon の設定ファイル修正

mastodon サーバーでの作業。

DB の準備が終わったので接続先をそちらに変更する。

mastodon ユーザーで行う。

/home/mastodon/live/.env.production の以下の部分を編集

/home/mastodon/live/.env.production
DB_HOST=192.168.10.40
DB_USER=mastodon_user
DB_NAME=mastodon_db
DB_PASS=mastodonpassword
DB_PORT=5432

動作確認

ここで、mastodon を立ち上げて、Web からアクセスできることを確認する。

一度テストでトゥートしたり、お気に入りをつけたり軽く動かしてみるとよい。

mastodon サーバー上で動作している postgresql を停止

ここまでで、DB サーバーの移行は完了したので、mastodon サーバーで動作している postgresql が

不要になったので停止する。

mastodon サーバーでの作業。

以下を実行。

<code class="language-bash"># sudo可能なユーザーで実行。mastodonサーバーで動作しているPostgreSQLを停止
sudo systemctl stop postgresql
sudo systemctl disable postgresql
# mastodonユーザーで実行。
cd ~/live
~/live$ RAILS_ENV=production bundle exec rake db:collation
en_US.UTF-8  # これが表示されればOK!

ここには記述しないが、この時点で PostgreSQL のデータファイルも削除することもできる。

以上

変更履歴

2018/09/27 この手順で DB の移設が可能なことを確認した。

2019/08/15 誤記修正、体裁修正

Discussion