警告! アップグレードには大量の空きディスク容量(データベースサイズの2倍)が必要です。
DockerイメージをPostgreSQL 18にアップグレードするための変更を適用しました。コマンドラインからDiscourseを再構築するサイト管理者は、以前のPostgreSQL 15からPostgreSQL 18にアップグレードされます。2025年にPostgreSQL 15のアップデートが行われた際にアップグレードを見送った場合、そのアップグレードをスキップして直接PostgreSQL 18に進むことができます。
以前にアップグレードを見送った場合は、app.yml内のPostgreSQLテンプレートを templates/postgres.13.template.yml から templates/postgres.template.yml に変更してください。
どのアップグレードでも同様ですが、作業を行う前にバックアップを取得することを強く推奨します。
ロケールの変更
過去には、OSのアップグレード時などにglibcが更新された際にインデックス破損が発生することがありました。PostgreSQL 17以降、OSのglibcと独立した組み込みロケールプロバイダが導入され、バージョン間で安定性が保たれるようになりました。今回のアップグレードに伴い、C.UTF-8ロケールを使用するこの組み込みプロバイダに移行します。このロケールはコードポイント順に基づいており、前述の安定性の理由から推奨されます。
ロケールの変更を実現するためには、まず組み込みロケールプロバイダを使用して新しいDBクラスターを作成し、その後DBをダンプしてこのクラスターにリストアする必要があります。このため、インプレースアップグレードを実行していた以前のアップグレードよりもディスク容量の要件が大きくなります。
アップデート
公式インストールガイド(シングルコンテナ)
次回再構築時、最後に以下のメッセージが表示されます。
-------------------------------------------------------------------------------------
POSTGRESのアップグレードが完了しました
旧15のデータベースは /shared/postgres_data_old に保存されています
アップグレードを完了するには、以下を使用して再度再構築してください:
./launcher rebuild app
-------------------------------------------------------------------------------------
これはアップグレードが正常に完了したことを意味します! サイトを復旧して稼働させるには、再度再構築を実行するだけです。
データコンテナインストール
discourse_dockerリポジトリに提供されているサンプルに基づいた専用データコンテナを使用しているセットアップを実行している場合は、PostgreSQLを安全かつクリーンにシャットダウンすることを確認する必要があります。
現在では、数分にわたるクエリを実行するバックグラウンドジョブが動作しているため、Webコンテナをシャットダウンすることでデータコンテナの安全なシャットダウンを支援できます。
./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only
データコンテナに対して最初の再構築を実行する前に、PostgreSQLのログをtailして正常にシャットダウンされたか確認できます。
tail -f shared/standalone/log/var-log/postgres/current を実行すると、クリーンな場合、以下のログが表示されます。
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
アップデートの延期
次回再構築時にアップデートを延期する必要がある場合は、app.ymlファイルのPostgreSQLテンプレートを "templates/postgres.template.yml" から "templates/postgres.15.template.yml" に変更することで切り替えることができます。
ただし、アップグレード後にこの変更を元に戻すことを忘れるサイト管理者もいるため、推奨されません。
アップデート後のオプションタスク
PostgreSQL統計の最適化
アップデート後、新しいPostgreSQLにはテーブル統計が準備されていません。以下のコマンドを使用して生成できます。
docker exec -u postgres app \
/usr/lib/postgresql/18/bin/vacuumdb -d discourse --analyze-in-stages
旧データのクリーンアップ
標準インストールの場合、以下のコマンドでPG15形式の旧データを削除できます。
cd /var/discourse
./launcher cleanup
別のデータコンテナを使用している場合は、以下のようにバックアップコピーを削除する必要があります。
rm -fr /var/discourse/shared/data/postgres_data_old/
FAQ
ソースクラスターがクリーンにシャットダウンされませんでした
上記のメッセージと共にアップグレードが失敗した場合、より単純なアプローチを試して状態を改善できます。
./launcher start app で旧コンテナを再起動します。稼働するまで数分待ちます。
次に ./launcher stop app で再度シャットダウンします。その後、ログをtailしてクリーンなシャットダウンだったか確認します。
tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
ログにデータベースがシャットダウンされたことが示されていない場合は、旧コンテナを再度起動し、./launcher enter app で進入し、以下のコマンドを実行して、完了後にもう一度ログをtailします。
export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit
ログが上記のようになった場合、./launcher rebuild app を使用して再度アップグレードを試すことができます。
データベース「postgres」の lc_collate 値が一致しません
このエラーは、データベースでデフォルト以外のロケールを使用している場合に発生します。成功させるには3つの変数が必要であると報告されています。app.ymlファイルの env: セクションに以下の3行が含まれていることを確認してください。
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
en_US.UTF-8 をあなたのロケールに変更してください。
再構築のたびにアップグレードが繰り返される(アップグレードループ)
この現象が発生した場合、アップグレードログには以下内容が含まれます。
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty
これは、最後のアップグレードからのファイルがまだ残っていることを意味します。続行する前にそれらを他の場所へ移動してください。
PostgreSQL 15のアップデートをスキップしました。今どうすればよいですか?
このガイドの上部にある標準的な手順に従うことができます。これにより、問題なく現在のバージョンから18にアップグレードされます。