注:オリジナル投稿は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の出力です。
- launcher-rebuild-app-output-0.txt - 88〜95行目
- launcher-rebuild-app-output-1.txt - 100〜107行目
各ファイルの後にある行番号は、唯一の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








