Web UI経由のDiscourseアップグレードが失敗し、SSHアップグレードでDiscourseインスタンスがダウン

注:オリジナル投稿は11/25/21 ESTで更新され、新しい情報が追加されました。

Discourseのインストールに関する重要なセキュリティアップデートの通知を受け、過去に行ったようにWeb UI(/admin/upgrade)を使用してインストールを更新しようとしました。アップグレードが必要なソフトウェアは2つありました。Docker ManagerとDiscourseです。

Docker Managerは最初にアップグレードする必要がありました(Discourseのアップグレードボタンは無効になっていました)。Web UIを使用してDocker Managerのアップグレードを開始し、正常に完了しました。その後、Discourseのアップグレードを開始しましたが、途中で失敗しました。Web UIをリフレッシュすると、次のメッセージが表示されました。

そのため、画面の指示に従い、サーバーにSSHで接続し、git pullを実行してから、コマンドラインからsudo ./launcher rebuild appを実行しました。プロセスは完了しましたが、「FAILED TO BOOTSTRAP」というエラーメッセージで失敗しました。

以下は、異なる時間に2回実行したsudo ./launcher rebuild appの出力です。

各ファイルの後にある行番号は、唯一のERRORが表示される場所です。どちらもデータベースとロールに関連しているようです(両方の範囲の違いは、2番目の試行でdiscourse/baseリポジトリからgit pullを実行したためです)。

2021-11-25 21:21:38.451 UTC [64] postgres@postgres ERROR:  database "discourse" already exists
2021-11-25 21:21:38.451 UTC [64] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2021-11-25T21:21:38.454429 #1]  INFO -- :
I, [2021-11-25T21:21:38.454908 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2021-11-25 21:21:38.531 UTC [68] postgres@discourse ERROR:  role "discourse" already exists
2021-11-25 21:21:38.531 UTC [68] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

これは、各Launcher Rebuild試行の下部に表示されるFAILEDエラーメッセージと一致しているようです。

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 436 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
13bbdd52e0835ba9dfddc5c367d63b6087a16553c3a77d27ca307734d6e16907
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

注:これらのERRORは根本的な問題ではありません。下記「解決策」を参照してください。

下記で、一部のユーザーが、正常な再構築を妨げているredisの問題について言及しています。

一日を通して数回sudo ./discourse-doctorを実行しました。以下は、そのうち2回の実行結果です。

  • discourse-doctor-output-0.txt - 'app’コンテナが見つからず実行されていませんでした。再構築を試みましたが、コンテナの再起動に失敗しました。
  • discourse-doctor-output-1.txt - discourse-doctorを実行する前に、sudo usr/bin/docker start appで’app’を手動で起動しました。

sudo docker run -it --rm hello-worldを実行して、Dockerのインストールが正しく機能していることを確認しました。

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

ディスク容量を確保するためにsudo ./launcher cleanupを実行しました。

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
<DETAILS REMOVED>

Total reclaimed space: 3.836GB

$ df -hT /dev/xvda1
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/xvda1     ext4   30G  9.1G   20G  32% /

メモリ設定も確認しました。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        304M        633M         20M        1.0G        1.5G
Swap:          2.0G          0B        2.0G

サーバーの再起動では問題は解決しませんでしたが、再起動後に興味深いことに気づきました。

再起動後、Dockerのappコンテナが実行されています。

$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED       STATUS          PORTS                                                                      NAMES
6449ec0061a0   local_discourse/app   "\"/sbin/boot\""   7 weeks ago   Up 25 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

しかし、サイトにアクセスすると「502 Bad Gateway」エラーが表示されます。

appコンテナを停止してサイトにアクセスすると、「接続できません」というエラーが表示されます(コンテナが実行されていないので、これは当然の結果と思われます)。

しかし、このサーバーにはNginxがインストールされていないため、困惑しています。

再構築の出力で、Nginxファイルをある場所から別の場所にコピーしている箇所が見られますが、対応するディレクトリやファイル、特にnginx.confがサーバー上のどこにも見つかりません。Ubuntu、Docker、Discourseは私の主なスキルではありませんが、これらのファイルはDockerのappコンテナ「内」にコピーされていると推測しています。

この問題に関して、追加のヘルプや指示をいただけると幸いです。これはDiscourseのアップグレード中に時折発生する問題のようです。

更新:Dockerのappコンテナが独自の内部ファイルシステムを持っているという私の推測は正しいことが判明しました。コンテナファイルシステムのスナップショットを作成し、bashを使用してこのファイルシステムを探索できます。

# コンテナファイルシステムからイメージ(スナップショット)を作成
$ sudo docker commit <container_id> mysnapshot
$ sudo docker run -t -i mysnapshot /bin/bash

appファイルシステム内には、Discourseの設定ファイルを含むnginxディレクトリがあります。

root@f91826d986eb:/etc/nginx/conf.d# ls -l
total 12
-rw-r--r-- 1 root root 10568 Oct  3 21:33 discourse.conf

再起動はどうですか? ここから

このアップデートでは、dockerの再起動が必要です。

そのため、「./launcher rebuild app」をコマンドラインで実行している間、ディスコースはオフラインになります。

再構築が完了すれば、すべて100%正常に動作します。

@IAmGav Docker は実行されているようです。

@rmccown ZSm8WzJ7gLigPd08D4tiwt.png)

他のランチャーコマンドをいくつか試して、起動できるかどうか確認してみます。

@IAmGav Ran ./discourse-doctor を実行し、Docker コンテナが実行中であることを確認しました。

==================== DOCKER INFO ====================
DOCKER VERSION: Docker version 20.10.11, build dea9396

DOCKER PROCESSES (docker ps -a)

CONTAINER ID   IMAGE                 COMMAND        CREATED       STATUS             PORTS                                                                      NAMES
6449ec0061a0   local_discourse/app   “/sbin/boot”   7 weeks ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app


Discourse コンテナ app は実行中です


startrestartの両方を試しましたが、うまくいきませんでした。

URLではまだこれが出てきます。

sudo ./launcher rebuild appを実行すると、これらのメッセージで再び失敗します(現在、以前のエラーメッセージをファイルで探しています)。

すべてがうまくいかないときは、一度電源を抜いてから再度差し込んでみてください ;-)\n\nインスタンスを再起動します: reboot now\n\nインスタンスを最新の状態にします: apt-get update および apt-get dist-upgrade\n\nその後、Discourse のアップグレードを実行します。

「いいね!」 1

@omarfilip それが最初に試したことです :wink:

再起動をもう一度試しました(以前のアップグレードからアップグレードするUbuntu 18.04.6コンポーネントはありません)。

同じ結果です。URLで502 Bad Gatewayエラーが発生します。

しかし、提案ありがとうございました。

「いいね!」 1

また、2020年11月のものも見つけました - Upgrade ends with FAILED TO BOOTSTRAP

しかし、「デフォルトのリリースチャネルに従う」というのが具体的に何を意味するのか正確にはわかりません。Web UI経由でのアップグレードが「デフォルトのリリースチャネル」だと仮定しています。

それは「tests-passed」になります。アプリの app.yaml ファイルでこの行を変更していない場合は、デフォルトのリリースチャンネルを使用しています。

  ## このコンテナはどのGitリビジョンを使用しますか? (デフォルト: tests-passed)
  #version: tests-passed

ログ全体を共有していただけますか?実際のエラーを確認するには、これだけでは不十分です。

デフォルトのリリースチャネルを使用しています。

そして、db_shared_buffersの値が0MBではありません(その問題はこちらで見つけました)。

@IAmGav ./launcher rebuild app の出力を含むgistはこちらです - link

ERRORの唯一の兆候は、以下の行のグループにあります(下記参照)。

これらはデータベースとロールの作成に関連しているようです。これらのアクションをバイパスする方法はありますか?(アップグレード中に、既存のインスタンスで作業しているため、これを行いたいと思うのではないでしょうか)

88〜95行目

2021-11-25 21:21:38.451 UTC [64] postgres@postgres ERROR:  database "discourse" already exists
2021-11-25 21:21:38.451 UTC [64] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2021-11-25T21:21:38.454429 #1]  INFO -- :
I, [2021-11-25T21:21:38.454908 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2021-11-25 21:21:38.531 UTC [68] postgres@discourse ERROR:  role "discourse" already exists
2021-11-25 21:21:38.531 UTC [68] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

Literally the exact same thing happened to me a while back, an update failed in the middle of a Web UI update; even the error messages after an attempted rebuild are pretty much the same and it’s still unresolved; only difference is I could update via the Web UI for a while, except a day or two ago, after not updating for two or so weeks, it now has the “You are running an old version of the Discourse image” notice, and now I can’t update at all. :upside_down_face:

Apparently it’s an issue with redis.

しばらく前に全く同じことが起こりました。Web UIのアップデートの途中でアップデートが失敗しました。再構築を試みた後のエラーメッセージもほとんど同じで、まだ解決していません。唯一の違いは、しばらくの間Web UI経由でアップデートできたことですが、2日ほど前に、2週間ほどアップデートしなかった後、「Discourseイメージの古いバージョンを実行しています」という通知が表示され、全くアップデートできなくなりました。:upside_down_face:

どうやらredisの問題のようです。

皆さん - 一日を通して集められた情報で元の投稿を更新しました。ここまでの投稿をしてくださった皆さん、ありがとうございます。

いいえ。もう一つエラーがあります。そのプラグインを削除してみてください。

Gem::ConflictError: omniauth-vkontakte-1.7.0をアクティブ化できません。なぜなら、omniauth-oauth2-1.7.2はomniauth-oauth2(>= 1.5、<= 1.7.1)と競合するためです。

「いいね!」 3

マイケルのアドバイスに従い、SSO認証の初期試行で使用したプラグインをapp.ymlファイルでコメントアウトしました。VKプラグインを使用しましたが、この実装には進まず、app.ymlファイルからプラグインを削除するのを忘れていたようです。

## プラグインはここに追加します
## 詳細については https://meta.discourse.org/t/19157 を参照してください
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
##          - git clone https://github.com/discourse/discourse-vk-auth.git

上記の行をコメントアウトした後、再度sudo ./launcher rebuild appを実行しました。再構築後、フォーラムサイトは稼働しているようです(現在テスト中です)。

私の投稿を確認し、コメントしてくださったすべての方々に改めて感謝いたします。皆様の助けに大変感謝しております(アメリカの感謝祭の休日を過ごすのにこれ以上の方法はありませんね :wink:)。

安全にお過ごしください。

「いいね!」 4

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