Discourse не отображает страницы

У меня возникли проблемы с запуском Discourse после установки.

Согласно следующей странице, после выполнения скрипта discourse-setup я должен иметь возможность перейти по настроенному URL. Оказывается, мне также нужно выполнить следующую команду:
./launcher start app

Не уверен, является ли это ошибкой в документации или я что-то делаю не так? Я также заметил, что после выполнения вышеуказанной команды наблюдаю следующее:

  1. Я могу загрузить веб-страницу, перейдя по настроенному URL.
  2. Загружается страница «Welcome to Nginx» вместо страницы «Congratulations, you installed Discourse!».
  3. Через короткое время (например, через полминуты) страница «Welcome to Nginx» перестает загружаться.
  4. При выполнении ./launcher stop app, а затем ./launcher start app, я снова вижу страницу «Welcome to Nginx», но она перестает загружаться через короткое время.

Это установка на новую выделенную виртуальную машину, на которой Nginx не запущен, поэтому страница «Welcome to Nginx» отображается из контейнера, на котором работает Discourse.

Ни одно из этих событий не ожидается. Похоже, у вас запущен какой-то другой nginx, возможно? Что-то ещё работает на виртуальной машине?

Это невозможно, так как это минималистичная установка CentOS без лишних компонентов. Я проверил, запустив следующую команду: ничего не прослушивает порты 80 или 443 без запущенного контейнера.
lsof -i TCP

Мой лучший прогноз — проблема связана с CentOS и discourse-setup. Проще всего попробовать Ubuntu. В противном случае вам нужно внимательно следить за тем, что делает скрипт, и попытаться отладить проблему.

Если вы следовали следующей инструкции по установке, рекомендованной одним человеком, которого не стоит упоминать :smiley:

У вас не должно возникнуть никаких проблем.

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

Вздыхаю. Я действительно попробовал, но установщики версий 19 и 20 LTS оба аварийно завершались на полпути. Оба сообщали, что не могут автоматически настроить интерфейс. Если я отключаю его, установщик работает нормально, но если я задаю IP вручную, они вылетают. Если я отключаю интерфейс, чтобы продолжить установку, я не могу установить сетевые утилиты для получения ifconfig, даже если смонтировал ISO и использую его в качестве источника. Так что я немного в тупике.

Привет, @titusc

Что вы видите, когда выполняете:

docker ps

?

Вы говорите, что установщик Ubuntu не работает?

Или вы пытаетесь использовать обычный Discourse с IP-адресом вместо доменного имени?

Я не использую IP-адрес для установки Discourse. Я использую корректное доменное имя, которое разрешается в публичной DNS.

Я имею в виду, что установщик Ubuntu всегда аварийно завершает работу, когда я пытаюсь запустить его, загружаясь с образа ISO-диска Ubuntu в процессе создания виртуальной машины. Это происходит как с Ubuntu Server 19.10, так и с 20.04 LTS, и в обоих случаях установка сообщает, что не может настроить сетевой интерфейс. Если оставить всё как есть, установка проходит успешно, но у меня нет способа поднять интерфейс для выполнения каких-либо действий. Я успешно выполнил следующую команду:
ip address add <ip>/<mask> dev <interface>

Однако затем я не смог поднять интерфейс, выполнив:
ifup <interface>

Затем я смонтировал ISO-образ как петлевой диск, настроил его как репозиторий и попытался выполнить:
apt install net-tools
но система сообщила, что пакет не найден в ISO-образе.

Если я пытаюсь вручную задать сетевой интерфейс с деталями сети во время установки, обе версии аварийно завершают работу.

Для справки: я делаю это на 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», но затем, примерно через полминуты, она исчезает.
  3. docker ps, чтобы подтвердить, что контейнер Discourse запущен.
  4. ./launcher stop app и ./launcher start app
  5. Снова проверяю в браузере и вижу страницу «Welcome to Nginx», но затем, примерно через полминуты, она исчезает.
  6. docker ps, чтобы подтвердить, что контейнер Discourse запущен.

Также я заметил, что при выполнении следующих команд я не вижу, что Nginx запущен, но это может быть связано с тем, что к моменту запуска команд он уже был остановлен.
./launcher enter app
systemctl status nginx

@titusc

Пробовали ли вы пересобрать приложение?

/var/discourse/launcher rebuild app

Обычно, в зависимости от того, когда ваш контейнер полностью запустится, может потребоваться время (в зависимости от характеристик вашей системы), чтобы он стал полностью рабочим.

Даже на нашей машине с 64 ГБ ОЗУ и 8 ядрами процессора мы ожидаем около одной полной минуты перед переключением на новый контейнер.

Вы пробовали 18.04?

Похоже на проблему с окружением, однако мы не можем оказывать поддержку гипервизорам и дистрибутивам Linux. Одна из причин, по которой рекомендуется DigitalOcean, — это стабильность операционной системы, установленной поверх. Если вы хотите создать виртуальную машину с нуля, вам нужно будет решить эти вопросы заранее.

Как только у вас будет рабочая операционная система, мы сможем помочь с установкой части Discourse.

Привет @DBHacker, да, я выполнил следующие действия по порядку:
./launcher rebuild app
./launcher start app

Это после того, как я понял, что следующая команда ./discourse-setup выполняет только этап rebuild в лаунчере.

@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 и неиспользуемые контейнеры (выполнить pruning).

Например (всё на скорую руку, по памяти):

docker ps -a
docker images
docker system prune -a

Стоит остановить все «потерянные» контейнеры, удалить их и удалить все старые образы Docker.

Мне пора бежать…

Надеюсь, это поможет.

@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#

Привет, @titusc

Спасибо за отличный пост и подробную информацию по устранению неполадок. Всё сделано очень хорошо.

Вы проверяли файлы логов nginx в приложении на предмет подсказок?

В вашей конфигурации что-то не так. Я предполагаю, что проблема, мешающая установке Ubuntu, также влияет и на CentOS.

Вам нужно устранить эту проблему перед установкой Discourse (или, скорее всего, чего-либо еще).