Postgres 18でバックアップが失敗

当社の Discourse インスタンスのデータベースはローカルコンテナではなく、中央のデータベースクラスターを使用しています。最近、中央の PostgreSQL がバージョン 18.3 に更新されました。Discourse のバックアップが失敗していることに気づきました。

[2026-05-19 03:37:37] [STARTED]
[2026-05-19 03:37:37] 'system' has started the backup!
[2026-05-19 03:37:37] Marking backup as running...
[2026-05-19 03:37:37] Making sure '/var/www/discourse/tmp/backups/default/2026-05-19-033737' exists...
[2026-05-19 03:37:37] Making sure '/var/www/discourse/public/backups/default' exists...
[2026-05-19 03:37:37] Updating metadata...
[2026-05-19 03:37:37] Dumping the public schema of the database...
[2026-05-19 03:37:37] pg_dump: error: aborting because of server version mismatch
[2026-05-19 03:37:37] pg_dump: detail: server version: 18.3 (Ubuntu 18.3-1.pgdg24.04+1); pg_dump version: 15.15 (Debian 15.15-1.pgdg12+1)
[2026-05-19 03:37:37] EXCEPTION: pg_dump failed
[2026-05-19 03:37:37] /var/www/discourse/lib/backup_restore/creator.rb:173:in 'BackupRestore::Creator#dump_public_schema'
/var/www/discourse/lib/backup_restore/creator.rb:36:in 'BackupRestore::Creator#run'
/var/www/discourse/lib/backup_restore.rb:13:in 'BackupRestore.backup!'
/var/www/discourse/app/jobs/regular/create_backup.rb:10:in 'Jobs::CreateBackup#execute'

この問題を解決する方法について、ご教示いただけますでしょうか?

これは PostgreSQL のクライアント/サーバー間のバージョン不一致のようです。

バックアップは Discourse コンテナ内で実行されており、pg_dump のバージョンは 15.15 ですが、外部の PostgreSQL サーバーは 18.3 です:

server version: 18.3; pg_dump version: 15.15

Discourse チームが推奨していない限り、Discourse コンテナを変更するのは慎重になるべきでしょう。私の最初の考えは、Discourse が現在想定・サポートしている PostgreSQL バージョンに合わせて、外部データベースクラスタを維持することです。

了解しました。この場合、同じデータベースクラスタを使用する別のプロジェクトで18台が必要だったため、他に選択肢がありませんでした。ふむ、Discourse専用に15台を割り当てた別のデータベースサーバーが必要になりそうですね。

CDCK側から何かコメントはありますか?

クライアントをその場でアップグレードできるかもしれません。

生産データベースとして PG 18 を使用していることから、互換性が実証されているようですので、これはリスクが低いと思われます。

以前、外部の PostgreSQL 18 とダミーの Discourse インストールで簡単なテストを行いましたが、問題は見られませんでした。しかし、正直に言えば、それは「手っ取り早い」ものであり、「深い」テストではありませんでした。いずれにせよ、2 週間ほど動作しているので、問題ないと考えています。現時点で問題となっているのは、Discourse 内部のバックアップだけです。一方、データベースサーバー自体(LXC 上で動作)は別途バックアップされています。

過去のポリシーでは、2 つおきのバージョンへのアップグレードが行われていました。しかし、PostgreSQL 17 がリリースされてからすでに 1 年半が経過しており、公式の Docker イメージではまだ 15 が使用されているため、この方針が現在も適用されているかは不明です。

過去に非常に類似したトピックがありますので、参考にしてください。例:Any chance to upgrade the postgres-client version?

ただの考えですが、pg サーバーからコマンドラインで直接ダンプすることはできますか?

app.yml にコードを追加して、PostgreSQL を対応するバージョンに更新できます。以前にやったことはありますが、メモが見つかりません。最も簡単な方法は、コンテナに入り、apt コマンドを実行して適切な PostgreSQL クライアントをインストールし、その後バックアップを試すことです。それが機能したら、そのコマンドを app.ymlexec コマンドに追加して、次回のリビルド後にも動作するようにします。

手順について誰かに案内してほしい場合は、私にメールを送るか、Marketplace に投稿してください。

ふむ、それはかなり簡単でしたね:

  1. ./launcher enter web_only
  2. sudo apt-get install postgresql

これで postgres パッケージが V. 18 にアップグレードされます。
その後、管理 UI からバックアップを開始すると、成功したようです。

[2026-05-21 16:26:50] 'admin' がバックアップを開始しました!
[2026-05-21 16:26:50] バックアップを「実行中」としてマーク中...
[2026-05-21 16:26:50] '/var/www/discourse/tmp/backups/default/2026-05-21-162650' の存在を確認中...
[2026-05-21 16:26:50] '/var/www/discourse/public/backups/default' の存在を確認中...
[2026-05-21 16:26:50] メタデータを更新中...
[2026-05-21 16:26:50] データベースの公開スキーマをダンプ中...
[2026-05-21 16:26:50] pg_dump: SELECT pg_catalog.set_config('search_path', '', false); を実行中
[2026-05-21 16:26:50] pg_dump: 最後の組み込み OID は 16383 です
[2026-05-21 16:26:50] pg_dump: 拡張機能を取得中
[2026-05-21 16:26:50] pg_dump: 拡張機能のメンバーを特定中
[2026-05-21 16:26:50] pg_dump: スキーマを取得中
[2026-05-21 16:26:50] pg_dump: ユーザー定義テーブルを取得中
[2026-05-21 16:26:50] pg_dump: ユーザー定義関数を取得中
[2026-05-21 16:26:50] pg_dump: ユーザー定義型を取得中
[2026-05-21 16:26:50] pg_dump: 手続き型言語を取得中
[2026-05-21 16:26:50] pg_dump: ユーザー定義集約関数を取得中
[2026-05-21 16:26:50] pg_dump: ユーザー定義演算子を取得中
[2026-05-21 16:26:50] pg_dump: ユーザー定義アクセスメソッドを取得中
[2026-05-21 16:26:50] pg_dump: ユーザー定義演算子クラスを取得中
[2026-05-21 16:26:50] pg_dump: ユーザー定義演算子ファミリーを取得中
[... .... ...]
[2026-05-21 16:26:57] バックアップを完了中...
[2026-05-21 16:26:57] アーカイブを作成中: netzwissen-forum-2026-05-21-162650-v20260520064255.tar.gz
[2026-05-21 16:26:57] アーカイブが既に存在しないか確認中...
[2026-05-21 16:26:57] 空のアーカイブを作成中...
[2026-05-21 16:26:57] データダンプをアーカイブ中...
[2026-05-21 16:26:57] アップロードファイルをアーカイブ中...
[2026-05-21 16:26:58] 一時ディレクトリ '/var/www/discourse/tmp/backups/default/2026-05-21-162650' を削除中...
[2026-05-21 16:26:58] アーカイブを Gzip 圧縮中、時間がかかる場合があります...

いいですね!おそらく、後でバージョン19に切り替わらないよう、pg18のクライアント関連を特定してインストールするでしょう。また、手動でアップグレードのたびにこれらのコマンドを実行したくない場合は、これらを app.yml に追加する必要があります。