スクリーンショット__22_

「さくらのクラウド」スタートアップスクリプトによるMastodonを、v2.3.3からv2.4.0rc3にバージョンアップした時につまずいた話。

いつもはこちらのnoteに追記する話なのですが。

あまりにも大きなつまずきだったので、今回は別のnoteに記します。

サーバーは「さくらのクラウド」のもので、CentOS 7.3。しかもスタートアップスクリプトという仕組みを使い、初心者でも比較的簡単にMastodonのサーバーを立ち上げられました。

上記のnoteのとおりいろんな試行錯誤を経て、Mastodonのインスタンス「十日町市のMastodon」を立ち上げてから1年以上が経ちました。

そして今回。
1年以上も経験値をためて自信が付いたのもつかの間。
v2.4.0rc3にバージョンアップするのにあたり、大きな壁に阻まれました。

というのも

↑こちらにもあるように、既存のデータベース「PostgreSQL」のバージョンが9.2.18のままだとMastodonをv2.4.0rc3にバージョンアップするのに支障があるとわかったのです。

そして ↓こちらに書かれてありますが、ひとまずgit revertを使ってバージョンアップする方法もあるそうです。


というわけで、PostgreSQLを9.4以降にバージョンアップすることがなかなか難しかったので、以下の通りメモとして残します。


まずはデータのバックアップから

「さくらのクラウド」にはコントロールパネルが用意されており、そこから「ディスク」や「アーカイブ」のメニューを選択し、現時点のバックアップを行いました。

もちろんpg_dump/pg_dumpallといったコマンドを使えばデータベースのデータのみのバックアップをしたり復元ができるようです。しかしなにぶん初心者なもので、コントロールパネルからディスクを丸ごとコピーしておき、有事の際は丸ごと復元するほうがわかりやすいと思って、そうしました。


PostgreSQL 9.6.9のインストール

下記の手順でコマンドを使っていきました。

Mastodon v2.4.0rc3の動作要件が9.4以降とのことなので、じぶんは9.6(9.6.9)へのアップグレードを目指しました。

# yum install https://download.postgresql.org/pub/repos/yum/9.6/ redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
# yum list | grep postgresql96
# yum install postgresql96-server
# alternatives --display pgsql-psql
# alternatives --display pgsql-pg_dump
# PGSETUP_INITDB_OPTIONS="--encoding=UTF8 --no-locale" /usr/pgsql-9.6/bin/postgresql96-setup initdb

以上で、サーバーにPostgreSQLの9.6.9をインストールできます。

ただ、これだけでは終わりません。


pg_upgradeを実行

最近のPostgreSQLにはpg_upgradeというアップグレード用の便利なコマンドがあるとわかりました。ので、じぶんはこれを使いました。

具体的には下記のようなコマンドを実行します。

# su - postgres
-bash-4.2$ /usr/pgsql-9.6/bin/pg_upgrade -d /var/lib/pgsql/data -D /var/lib/pgsql/9.6/data -b /usr/bin/ -B /usr/pgsql-9.6/bin/

ただし、普通にこのコマンドを使うとエラーを誘発するらしいので

こちらの情報を参考にしながらエラーを回避しました。

こうしてpg_upgradeがうまくいったら

-bash-4.2$ pg_ctl start
-bash-4.2$ ./analyze_new_cluster.sh
-bash-4.2$ psql -l
-bash-4.2$ ./delete_old_cluster.sh

といった後処理をします。

※2018年5月27日に追記
ひとつ書き忘れていました。
/var/lib/pgsql/9.6/data/postgresql.conf
の127行目にある
dynamic_shared_memory_type = posix
という記述の先頭に#を付けてコメントアウトしたんでした。
この行を示すエラーが出たのでいろいろ調べてみてそうしたんですけど、あるいはposixの部分をnoneに変えても良さそうでした...。


新旧のPostgreSQLの停止・起動

exitコマンドでrootに戻り、従来のPostgreSQL(じぶんの環境ではバージョン9.2.18)を停止します。

# systemctl stop postgresql

そして今回の新しいPostgreSQL v9.6.9を起動します。

# systemctl start postgresql-9.6

さらに、今後も新しいPostgreSQLを自動起動させるために

9.2.18を無効化
# systemctl disable postgresql
9.6.9を自動起動設定
# systemctl enable postgresql-9.6

というコマンドを実行。

ほかにやったことといえば

/var/lib/pgsql/9.6/data/pg_hba.conf

のMETHOD欄をすべて「trust」に変更しました。

そのうえで

# systemctl restart mastodon*

を実行してMastodonを再起動しました。


psqlコマンドもバージョンアップ

以上でPostgreSQLを9.2.18から9.6.9にアップグレードできました。

ただ、PostgreSQLを制御するのに必要なpsqlコマンドが9.2.18のままでした。なので、このコマンドも9.6.9のものにバージョンアップします。

↑こちらを参考しました。

ただ、パスを通すときは

# vi .bash_profile
export PATH=$PATH:/usr/pgsql-9.6/bin

を追記しました。
こちらのほうがサーバーの再起動時にも自動的にパスが通るようです。

うまくいったら

# su - postgres
-bash-4.2$ psql
test=# SELECT version();

とすれば、下記の画面のように結果が表示されて、psqlコマンドも9.6.9になったことがわかります。

また、PostgreSQL自体も9.6.9になっていることが確認できます。


Mastodonをv2.4.0rc3にバージョンアップ

ここまでの作業によって、PostgreSQL 9.6.9とともにMastodonのv2.3.3が稼働できるようになりました。

というわけで、ここでようやくMastodonをv2.3.3からv2.4.0rc3にバージョンアップしていきます。

ちなみに、Rubyを事前に2.5.1へバージョンアップする必要もありました。以前にも同様の作業をしたことがあるので、このnoteを参考にしながらバージョンアップ。ただし問題なく終わったように見えたのですが

$ ruby -v

でバージョン表記を確認しても2.5.0p0となっていて2.5.1になりません。

そこで

$ rbenv local --unset

を実行したらバージョン表記が2.5.1になりました。

という事前準備もしつつ、いつもの方法でMastodonをバージョンアップしていきます。

ところが、bundle installを実行したらpgというgemファイルがうまくインストールできません。

$ gem install pg -v '1.0.0'

を実行していもうまくいきません。

そこでこちらを参考にしながら

 # yum -y install postgresql-devel

さらに

$ gem install pg --with-pg-config=/usr/pgsql-9.6/bin/pg_config

をして、再度bundle installでうまくいきました。

あとはいつものようにyarn install、db:migrate、assets:precompile。

そしてexitしてrootに戻り

# systemctl restart mastodon*

で再起動。

いつものことながらWeb UIがうまく表示されなかったので

$ NODE_ENV=production ./bin/webpack

をして、再度Mastodonを再起動。

これにて、めでたくMastodonをv2.4.0rc3にバージョンアップできました。


こう書いてみるとあっという間のように感じますが、実際は1週間ほど悶々とした日々を過ごしました。

Mastodonが動かなくなるたびにサーバーをシャットダウンしてアーカイブしておいたデータをディスクに復元しつつ試行錯誤の繰り返し...。

動いたときはこのうえなく嬉しかったですね。

この快感はやめられないものがあります。


このnoteがだれかのお役にも立てれば。

これからも「十日町市のMastodon」をよろしくお願いします。

よかったらサポートをお願いします。もしくはギルドハウス十日町へ遊びにいらしていただければうれしいです。