Discourse でページが提供されない

Discourse のインストール後に実行時にいくつかの問題が発生しています。

以下のページによると、discourse-setup スクリプトを実行した後、設定された URL にアクセスできるようになるはずです。しかし、どうやら以下のコマンドも実行する必要があるようです。
./launcher start app

これはドキュメントの誤りなのか、私の操作ミスなのかはわかりません。また、上記のコマンドを実行した後に以下の現象が観察されます。

  1. 設定された URL にアクセスすると、Web ページが読み込まれます。
  2. 「Congratulations, you installed Discourse!」の代わりに「Welcome to Nginx」のページが表示されます。
  3. しばらく(例えば30秒程度)すると、「Welcome to Nginx」のページが表示されなくなります。
  4. ./launcher stop app を実行し、その後 ./launcher start app を実行すると、再び「Welcome to Nginx」のページが表示されますが、これも短時間で表示されなくなります。

これは Nginx が動作していない新しい専用 VM にインストールされたものであり、「Welcome to Nginx」のページは Discourse を実行しているコンテナから表示されているものです。

それらの現象は予想されていません。おそらく、別の nginx が実行されているのでしょうか?VM 上で他に何か実行されていますか?

「いいね!」 1

それは不可能です。これは最小限の CentOS インストールだからです。コンテナを実行せずに、ポート 80 や 443 でリッスンしているものがないか確認するために、以下のコマンドを実行しました。
lsof -i TCP

「いいね!」 1

私の最善の推測では、CentOS と discourse-setup の間に何らかの問題があるようです。最も簡単な方法は、Ubuntu を試してみることです。それ以外の場合は、スクリプトが何を行っているかに注意を払い、AMF が問題のデバッグを試みる必要があります。

以下のインストールガイドは、ある特定の人物(名前は伏せます :D)が推奨したものです。

これに従っていれば、問題が生じることはありません。

https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md

「いいね!」 1

ため息が出ますね。実際に試してみましたが、19 と 20 の LTS インストーラーの両方が途中でクラッシュしてしまいました。どちらもインターフェースの自動設定ができないと表示されます。無効のままにすればインストーラーは正常に動作しますが、IP を手動で設定するとクラッシュしてしまいます。

インストールを続行するためにインターフェースを無効にしても、ネットワークツールをインストールして ifconfig を取得することはできません。ISO をマウントしてソースとして使用しても同様です。そのため、少し行き詰まっています。

@titusc さん、こんにちは

以下のコマンドを実行した際に何が表示されますか?

docker ps

Ubuntu のインストーラーが動作しないと言っているのですか?

それとも、ドメイン名ではなく IP アドレスを使って通常の Discourse を起動しようとしているのでしょうか?

「いいね!」 1

Discourse のインストールには IP アドレスは使用していません。パブリック DNS で解決可能な正規のドメイン名を使用しています。

私が言いたいのは、マシン作成時に Ubuntu の ISO イメージからブートしてインストーラーを実行しようとすると、Ubuntu インストーラーが常にクラッシュしてしまうということです。これは Ubuntu Server 19.10 と 20.04 LTS の両方で発生し、どちらのインストール中も「ネットワークインターフェースを設定できない」というエラーを報告します。このまま放置すればインストールは正常に完了しますが、インターフェースを起動して何らかの操作を行う手段がありません。

以下のコマンドは正常に実行できました。
ip address add <ip>/<mask> dev <interface>

しかし、その後以下のコマンドを実行してもインターフェースを起動できません。
ifup <interface>

その後、ISO をループバックデバイスとしてマウントし、リポジトリとして設定して以下のコマンドを実行しようとしましたが、ISO 内に見当たらないとエラーになりました。
apt install net-tools

インストール中に手動でネットワーク詳細を指定してインターフェースを設定しようとすると、両バージョンともクラッシュしてしまいます。

参考までに、私は ESXi 7.0 上でこの作業を行っており、以下の ISO を使用しています。
ubuntu-20.04-live-server-amd64.iso
ubuntu-19.10-live-server-amd64.iso

Discourse コンテナが実行されていることが示されます。私は毎回以下の手順を踏んでいます。

  1. ./launcher start app
  2. ブラウザで確認すると「Welcome to Nginx」ページが表示されますが、約30秒後には表示されなくなります。
  3. docker ps を実行して Discourse コンテナが実行されていることを確認します。
  4. ./launcher stop app./launcher start app を実行します。
  5. ブラウザで確認すると「Welcome to Nginx」ページが表示されますが、約30秒後には表示されなくなります。
  6. docker ps を実行して Discourse コンテナが実行されていることを確認します。

また、以下のコマンドを実行すると Nginx が実行されているのが確認できませんが、これは私がコマンドを実行する頃には既に Nginx が停止していたためかもしれません。
./launcher enter app
systemctl status nginx

@titusc

アプリを再ビルドしてみましたか?

/var/discourse/launcher rebuild app

通常、コンテナが完全に起動するタイミングにもよりますが、システム仕様に応じて完全に運用可能になるまで時間がかかることがあります。

当社の 64GB メモリ搭載 Linux サーバー(8 コア CPU)でも、新しいコンテナに切り替えるまで約 1 分待機しています。

「いいね!」 1

18.04 は試されましたか?

これは環境に依存する問題のようです。当サイトでは、ハイパーバイザーや Linux ディストリビューションに関するサポートは提供しておりません。DigitalOcean が推奨される理由の一つは、その上にインストールされるオペレーティングシステムの統一性にあります。ゼロから VM を構築する場合は、事前にそれらの点を検討しておく必要があります。

動作する OS が準備できたら、Discourse のインストール部分についてはお手伝いできます。

こんにちは @DBHacker さん、はい、以下の手順を順番に実行しました。
./launcher rebuild app
./launcher start app

これは、./discourse-setup を実行しても launcher の再構築部分までしか処理されないことに気づいた後のことです。

@Stephen さん、はい、まず Ubuntu のインストールに関する問題を解決する必要があります。正直なところ、私は Ubuntu があまり好きではなく、過去 15 年間 CentOS / RH を使用してきました。ただ、一つお聞きしたいのですが、CentOS / RH に対して何か特定のセットアップを想定されていますか?

discourse-setup スクリプトは Ubuntu 上でテストされ、動作が確認されています。

他のディストリビューションでは、手順の一部またはすべてを手動で行う必要がある場合があります。ファイルの内容を確認して、スクリプトが何を行っているかをご確認ください。

こんにちは @titusc

問題が発生しているとのこと、申し訳ありません。

参考までに、以下のコマンドを実行する必要はありません。

./launcher start app

以下のコマンドを実行した後です。

./launcher rebuild app

なぜなら、launcher スクリプトでアプリを再構築すると(以下参照)、そのスクリプトは終了前にコンテナを再起動するためです。

以下は、launcher のコードの一部です。

  rebuild)
      if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
        echo "Ensuring launcher is up to date"

        git remote update

        LOCAL=$(git rev-parse HEAD)
        REMOTE=$(git rev-parse @{u})
        BASE=$(git merge-base HEAD @{u})

        if [ $LOCAL = $REMOTE ]; then
          echo "Launcher is up-to-date"

        elif [ $LOCAL = $BASE ]; then
          echo "Updating Launcher..."
          git pull || (echo 'failed to update' && exit 1)

          echo "Launcher updated, restarting..."
          exec "$0" "${SAVED_ARGV[@]}"

        elif [ $REMOTE = $BASE ]; then
          echo "Your version of Launcher is ahead of origin"

        else
          echo "Launcher has diverged source, this is only expected in Dev mode"
        fi

      fi

      set_existing_container

      if [ ! -z $existing ]
        then
          echo "Stopping old container"
          (
            set -x
            $docker_path stop -t 60 $config
          )
      fi

      run_bootstrap

      if [ ! -z $existing ]
        then
          echo "Removing old container"
          (
            set -x
            $docker_path rm $config
          )
      fi

      run_start
      exit 0
      ;;

このスクリプトから、rebuild メソッドが終了前にコンテナの起動を試みていることがわかります。

参考になれば幸いです。

@neounix さん、その通りです。もう一度テストして確認します。これが原因だったことを願っています。コンテナを起動した状態で、再度 ./launcher start app を実行して起動した場合の動作については確信がありません。

@titusc

詳細にお答えできず申し訳ありませんが、長距離のロードトリップに出かけなければなりません。

ビルド、Docker イメージおよびコンテナの再構築でエラーを起こす人々は、多くの場合トラブルに巻き込まれます。

ある時点で、蓄積された Docker イメージや未使用のコンテナを整理(プルーニング)することを検討してください。

例えば(思いつきで素早く)

docker ps -a
docker images
docker system prune -a

すべての「不正な」コンテナを停止し、それらを削除して、古い Docker イメージをすべて削除してください。

急いで行かなければなりません……

参考になれば幸いです。

「いいね!」 1

@neounix さん、Docker イメージの確認に同意いただきありがとうございます。実は私は既にその確認を行いましたが、詳しくご説明しましょう。以下にお示しするように、Discourse は正常にビルドされ、Docker コンテナ内で起動しました。しかし、最後の方をご覧いただくと、Nginx はコンテナ内で起動したものの、わずか 5 秒ほどで終了していることがわかります。

すべての開始前

[root@uat discourse]# pwd
/var/discourse
[root@uat discourse]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@uat discourse]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@uat discourse]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
discourse/base      2.0.20200724-1815   6ba1506bf822        9 days ago          2.38GB
centos              latest              831691599b88        6 weeks ago         215MB
alpine              latest              a24bb4013296        2 months ago        5.57MB

ホスト上で HTTP サーバーが実行されていないことを確認

[root@uat discourse]# systemctl status nginx
Unit nginx.service could not be found.
[root@uat discourse]# lsof -i TCP
COMMAND  PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd    1    root  181u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
systemd    1    root  183u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1070     rpc    4u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1070     rpc    6u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
sshd    1234    root    5u  IPv4   26444      0t0  TCP *:ssh (LISTEN)
sshd    1234    root    7u  IPv6   26446      0t0  TCP *:ssh (LISTEN)
cupsd   1240    root    9u  IPv6   27746      0t0  TCP localhost:ipp (LISTEN)
cupsd   1240    root   10u  IPv4   27747      0t0  TCP localhost:ipp (LISTEN)
dnsmasq 2094 dnsmasq    6u  IPv4   37419      0t0  TCP uat:domain (LISTEN)
sshd    7102    root    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)
sshd    7156    tech    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)

Discourse の再ビルド

[root@uat discourse]# ./launcher rebuild app
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
cd /pups && git pull && /pups/bin/pups --stdin
Already up to date.
......................................................................
I, [2020-08-03T06:54:22.114365 #1]  INFO -- : > echo "Beginning of custom commands"
I, [2020-08-03T06:54:22.116739 #1]  INFO -- : Beginning of custom commands

I, [2020-08-03T06:54:22.116996 #1]  INFO -- : > echo "End of custom commands"
I, [2020-08-03T06:54:22.119862 #1]  INFO -- : End of custom commands

I, [2020-08-03T06:54:22.119983 #1]  INFO -- : Terminating async processes
I, [2020-08-03T06:54:22.120021 #1]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/12/bin/postmaster -D /etc/postgresql/12/main pid: 49
I, [2020-08-03T06:54:22.120086 #1]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 166
166:signal-handler (1596437662) Received SIGTERM scheduling shutdown...
2020-08-03 06:54:22.120 UTC [49] LOG:  received fast shutdown request
2020-08-03 06:54:22.121 UTC [49] LOG:  aborting any active transactions
2020-08-03 06:54:22.128 UTC [49] LOG:  background worker "logical replication launcher" (PID 58) exited with exit code 1
2020-08-03 06:54:22.128 UTC [53] LOG:  shutting down
2020-08-03 06:54:22.154 UTC [49] LOG:  database system is shut down
166:M 03 Aug 2020 06:54:22.176 # User requested shutdown...
166:M 03 Aug 2020 06:54:22.176 * Saving the final RDB snapshot before exiting.
166:M 03 Aug 2020 06:54:22.184 * DB saved on disk
166:M 03 Aug 2020 06:54:22.184 # Redis is now ready to exit, bye bye...
sha256:7b8e9281c49ba3dc37e0743a765cddc13ab73aae5486bd30722c696c2e1443b1
ce327c6e37246e63331f03b07d64f4882efa68e88cb1516c6343a9dddbbd59df

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=4 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e LETSENCRYPT_DIR=/shared/letsencrypt -e DISCOURSE_HOSTNAME=uat.xxxxxx.com -e DISCOURSE_DEVELOPER_EMAILS=support@xxxxxx.com -e DISCOURSE_SMTP_ADDRESS=smtp-relay.xxxxxx.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=support@xxxxxx.com -e DISCOURSE_SMTP_PASSWORD=support@xxxxxx.com -e LETSENCRYPT_ACCOUNT_EMAIL=me@example.com -h uat-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:fe:39:ba:65:e1 local_discourse/app /sbin/boot
44c604ccbda4bfb4d48722e1cbbf70e3b067531acda41175f6bdaaa013cc6d18

イメージがビルドされ、Docker が実行されていることを確認

[root@uat discourse]# docker container ls -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                      NAMES
44c604ccbda4        local_discourse/app   "/sbin/boot"        7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app
[root@uat discourse]# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                      NAMES
44c604ccbda4        local_discourse/app   "/sbin/boot"        7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app
[root@uat discourse]# docker image ls
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              7b8e9281c49b        8 minutes ago       2.66GB
discourse/base        2.0.20200724-1815   6ba1506bf822        9 days ago          2.38GB
centos                latest              831691599b88        6 weeks ago         215MB
alpine                latest              a24bb4013296        2 months ago        5.57MB

ホスト上で何も実行されておらず、Docker がポート 80 と 443 でリスニングしていることを確認

[root@uat discourse]# systemctl status nginx
Unit nginx.service could not be found.
[root@uat discourse]#
[root@uat discourse]# lsof -i TCP
COMMAND     PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd       1    root  181u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
systemd       1    root  183u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
rpcbind    1070     rpc    4u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
rpcbind    1070     rpc    6u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
sshd       1234    root    5u  IPv4   26444      0t0  TCP *:ssh (LISTEN)
sshd       1234    root    7u  IPv6   26446      0t0  TCP *:ssh (LISTEN)
cupsd      1240    root    9u  IPv6   27746      0t0  TCP localhost:ipp (LISTEN)
cupsd      1240    root   10u  IPv4   27747      0t0  TCP localhost:ipp (LISTEN)
dnsmasq    2094 dnsmasq    6u  IPv4   37419      0t0  TCP uat:domain (LISTEN)
sshd       7102    root    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)
sshd       7156    tech    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)
docker-pr 12991    root    4u  IPv6 2242261      0t0  TCP *:https (LISTEN)
docker-pr 13003    root    4u  IPv6 2242288      0t0  TCP *:http (LISTEN)

Docker を再起動し、Nginx が停止した後に Nginx を確認

[root@uat discourse]# ./launcher stop app
+ /usr/bin/docker stop -t 10 app
app
[root@uat discourse]# ./launcher start app; ./launcher enter app

starting up existing container
+ /usr/bin/docker start app
app
root@uat-app:/var/www/discourse# date; ps -ef | grep nginx
Mon 03 Aug 2020 07:29:47 AM UTC
root        34     1  0 07:29 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/letsencrypt.conf
www-data    36    34  0 07:29 ?        00:00:00 nginx: worker process
www-data    37    34  0 07:29 ?        00:00:00 nginx: worker process
root      1091   398  0 07:29 pts/1    00:00:00 grep nginx
root@uat-app:/var/www/discourse# date; ps -ef | grep nginx
Mon 03 Aug 2020 07:29:50 AM UTC
root        34     1  0 07:29 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/letsencrypt.conf
www-data    36    34  0 07:29 ?        00:00:00 nginx: worker process
www-data    37    34  0 07:29 ?        00:00:00 nginx: worker process
root      1854   398  0 07:29 pts/1    00:00:00 grep nginx
root@uat-app:/var/www/discourse# date; ps -ef | grep nginx
Mon 03 Aug 2020 07:29:52 AM UTC
root      2043  2038  0 07:29 ?        00:00:00 runsv nginx
root      2080   398  0 07:29 pts/1    00:00:00 grep nginx
root@uat-app:/var/www/discourse#
「いいね!」 1

@titusc さん、こんにちは

素晴らしい投稿と、包括的なトラブルシューティング情報ありがとうございます。とてもよくできています。

ヒントを見つけるために、アプリ内の nginx ログファイルを確認されましたか?

セットアップに問題が発生しています。Ubuntu のインストールを妨げている原因は、CentOS にも影響を与えている可能性が高いです。

Discourse(おそらく他のものも)をインストールする前に、その問題を解決する必要があります。