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

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

  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