未対応Dockerバージョンによるアップグレード失敗

Ubuntu 16
何度も行ったようにWebのアップグレードをクリックしましたが、今回は失敗し、サポートされていないDockerバージョンでアプリが再構築できなくなりました。

何かアイデアはありますか?OSをアップグレードしようかとも思いましたが、今日は時間がなかったです。

元に戻す方法はありますか?

古いハッシュにバージョンを設定してみましたが、再構築しようとした途端、直ちにサポートされていないDockerバージョンになってしまいます。

アップグレードできません。

新しい仮想マシンに移動して、そこにデータベースを復元する方が良いです。より簡単で、ダウンタイムも少なくて済みますし、何か問題が起きても、正常に動作しているサーバーを使い続けることができます。

ああ。すみません。十分に注意深く読まなかったです。

いいえ。戻ることはできません。

Dockerのインストールを使用している場合は、Dockerをアップグレードできるかもしれません。

私はOSをアップグレードしたり、PostgreSQL 15のアップグレードを経て、今はアプリの再構築を行うと次のエラーが出ます。

2025-05-18 14:58:28.208 UTC [1455] discourse@discourse ERROR:  column "require_message" does not exist at character 72
2025-05-18 14:58:28.208 UTC [1455] discourse@discourse STATEMENT:  SELECT id, name, name_key, description, notify_type, auto_action_type, require_message, applies_to, position, enabled, score_type FROM "flags" ORDER BY "flags"."position" ASC
** PLUGIN FAILURE **

プラグインの初期化中にこのエラーが発生し、Discourseを起動できません:

PG::UndefinedColumn: ERROR:  column "require_message" does not exist
LINE 1: ..._key, description, notify_type, auto_action_type, require_me...
                                                             ^

Postアップグレード後に再構築を実行した後の状況です。

アップグレード作業
------------------
新しいクラスタ内の全行を分析しています                               OK
新しいクラスタ内の全行を凍結しています                               OK
新しいpg_xactのファイルを削除しています                                 OK
古いpg_xactを新しいサーバーにコピーしています                            OK
古いクラスタの最も古いXIDを設定しています                                OK
次のトランザクションIDとエポックを設定しています                         OK
新しいpg_multixact/offsetsのファイルを削除                                 OK
古いpg_multixact/offsetsを新しいサーバーにコピーしています                OK
古いpg_multixact/membersのファイルを削除しています                         OK
古いpg_multixact/membersを新しいサーバーにコピーしています               OK
次のmultixact IDとオフセットを新しいクラスタに設定しています             OK
WALアーカイブをリセットしています                                          OK
新しいクラスタのfrozenxidとminmxidカウンタを設定しています              OK
グローバルオブジェクトを新しいクラスタに復元しています                   OK
データベーススキーマを新しいクラスタに復元しています                     OK
リレーションファイルをコピーしています                                    OK
次のOIDを新しいクラスタに設定しています                                OK
データディレクトリを同期しています                                          OK
古いクラスタを削除するスクリプトを作成しています                          OK
拡張機能の更新を確認しています                                              注意

拡張機能の中にはALTER EXTENSIONコマンドを使って更新すべきものがあります。
このファイル
    update_extensions.sql
をpsqlで実行することでこれらの拡張機能は更新されます。


アップグレードは完了しました
----------------
オプティマイザの統計情報はpg_upgradeによって移行されません。
新しいサーバーを起動したら、次を実行してください:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

このスクリプトを実行すると古いクラスタのデータファイルが削除されます:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
PostgreSQLのアップグレードは完了しました

古い13のデータベースは /shared/postgres_data_old に保存されています

アップグレードを完了するには、もう一度次を使用して再構築してください:

./launcher rebuild app

何ができるでしょうか?この列が欠損しているのはどうしてだかわかりません。

はい。同様の問題に関するトピックがいくつかあります。移行が元に戻されたため、おそらく不完全な状態になっています。

手動で列を追加してみてはどうでしょうか。

それをどうやって行うのか、具体的にはどのテーブルなどに関してなのかよく分かりません。それについての情報が見つかるでしょうか。あなたが言及した投稿は見つけましたが、詳細な情報はありませんでした。

ありがとうございます!

データベースをマウントできる程度にすらならないので、プラグインをすべて無効にしてみて、少なくともコンテナを起動できるか試してみます。

修正方法は以下のとおりです(心臓の弱い方には向きません)。

  1. UbuntuをDocker 20以降をサポートするバージョンにアップグレードします。
    私たちはUbuntu 16にいたため、少なくともUbuntu 20に到達する必要がありました。そのため、このアップグレードを2回行いました。
    RELEASE_UPGRADER_ALLOW_THIRD_PARTY=1 do-release-upgrade
    
  2. Ubuntu 20に到達したら、Dockerを更新する必要がありました。Ubuntuはこれを独自に行うことを拒否しました。
    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    # リポジトリをAptソースに追加します:
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    
  3. これによりDocker 28に到達しました。
  4. 次に以下を実行します。
    ./launcher rebuild app
    
  5. これによりPostgresが13から15にアップグレードされます。以下を参照してください。
    PostgreSQL 15 update
  6. DBのアップグレードが正常に完了したら、以下を実行しました。
    ./launcher rebuild app
    
  7. これにより、欠落している列に関するエラーが発生しました。
    2025-05-18 14:58:28.208 UTC [1455] discourse@discourse ERROR:  column "require_message" does not exist at character 72
    2025-05-18 14:58:28.208 UTC [1455] discourse@discourse STATEMENT:  SELECT id, name, name_key, description, notify_type, auto_action_type, require_message, applies_to, position, enabled, score_type FROM "flags" ORDER BY "flags"."position" ASC
    ** PLUGIN FAILURE **
    
    プラグインの初期化中にこのエラーが発生したため、Discourseを起動できません。
    
    PG::UndefinedColumn: ERROR:  column "require_message" does not exist
    LINE 1: ..._key, description, notify_type, auto_action_type, require_me...
                                                                 ^
    
  8. この時点でコンテナを起動する方法がなかったため、app.ymlに移動してすべてのプラグインを無効にし、再度リビルドを実行しました。
  9. アプリは最終的にリビルドされ、その後、Railsコンソールに入って上記の列を手動で追加できるようになりました。
    ./launcher enter app
    rails db
    ActiveRecord::Base.connection.execute("ALTER TABLE flags ADD COLUMN require_message BOOLEAN DEFAULT FALSE;")
    exit
    exit
    
  10. 列が存在した後、app.ymlに戻り、すべてのプラグインを有効にして再度リビルドしました。
  11. リビルドは成功し…完了しました!

@pfaffman、週末にもかかわらず迅速な対応ありがとうございました。新しい更新されたドロップレットを作成して移行する予定です。これはWebインターフェースからの迅速なインプレースアップグレードになるはずでした。しかし、スクリプトはDockerの互換性をテストしていないようです。DiscourseがDockerをアップグレードしたときに、互換性のないDockerエラーが発生しました。

Ubuntu 16のような古いバージョンに留まっていたのは完全に私たちのせいでした。安定したシステムの長所と短所の1つは、それが長期間維持される傾向があることです。

「いいね!」 1

うまくいったようでよかったです!素晴らしいですね!

OSがEOLを4年以上過ぎている場合、迅速なアップデートはできませんよ。:wink:

「いいね!」 1

はい、教訓を得ました。再度ありがとうございます!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.