The entire installation went perfectly, but the instance is not reachable publicly. I have the A record configured to the public IP given by Azure. I also tried using the IP address directly.
I suspect this has something to do with the Docker IP and the Eth0 IP address, but not sure how to solve it.
So essentially I have 3 IPs: the public IP, the eth0 IP on the VPN, and then the docker instance IP. I’m guessing I need to somehow route the public IP:80 port to the docker IP?
Crazy cloud shenanigans likely get in the way – there’s probably some equivalent of AWS’ security groups, or perhaps the networking stack needs an extra kick in the pants.
So I sort of found the problem, but not the cure. As expected it has to do with the port forwarding/mapping/routing issue.
Azure VMs are part of a resource group with a common virtual public IP and a VPN/subnet for individual machines. Then there is a Network Security Group, with which one has to define some NAT rules.
I did setup forwarding for the Docker ports, but to no avail. Now trying to diagnose using Docker documentation. Jeff is right, once Docker works correctly, Discourse will work too.
The Azure classic VM should be better because they allow mapping of specific endpoints (ports). Will try installing in one of those.
Will post my updates. For better or for worse, I’m stuck with Azure at the moment.
Ok. So I discarded the instance of Ubuntu and created a new Ubuntu VM of the classic type. Then I chose a fixed Instance IP address. Then I created two endpoints for TCP/80 and TCP/443 to forward from the public to private network. Also I installed Docker from the instructions for Ubuntu and not the script directly.
I’m not sure which of these steps helped, but now Discourse works on Azure!
I finally switched to digital ocean, where it works out of the box. The VM classic type seems not to be available anymore at Azure? Tried to setup an instance without success…
Не люблю поднимать эту тему снова, но она всё ещё актуальна. Всё устанавливается безупречно с точки зрения Discourse, всё кажется в порядке, но порты 80 и 443 общедоступно недоступны.
Обновление: Базовая установкадействительно работает из коробки на Azure с Ubuntu Server.
Вот что я сделал иначе во второй раз:
После создания ВМ и запуска discourse-setup я не прерывал процесс, поэтому всё выполнилось за один раз.
В первый раз я понял, что у меня нет swap-памяти, и хотя скрипт discourse-setup настраивает её при отсутствии, я вышел в оболочку, чтобы проверить что-то. Затем некоторые подсказки установки отличались от тех, что в базовом руководстве, поэтому я вышел ещё раз.
+ Меня удивил запрос Let’s Encrypt на адрес электронной почты для получения уведомлений, и у меня сложилось впечатление, что HTTPS нужно будет настроить вручную. На самом деле скрипт настраивает экземпляр Discourse с SSL-сертификатом Let’s Encrypt. + Ещё один момент — разделы имени пользователя и пароля SMTP; всё ещё не уверен, можно ли было оставить их пустыми, но я просто указал адрес администратора и пароль для этой учётной записи.
Не думаю, что это имело какое-то отношение к проблеме, но упомяну на всякий случай. Во второй раз я сделал всё так же, как и в первый, за исключением: (1) ручной настройки swap и (2) позволяя discourse-setup работать без прерываний.
Возможно, первый экземпляр можно было бы спасти, но архитектура Discourse всё ещё остаётся для меня загадкой, и я не уверен, как перезапустить HTTP/HTTPS-эндпоинты. При сравнении выводов netstat -tulpn очевидно, что в первом экземпляре все соответствующие службы, похоже, работают и прослушивают правильные порты (например, PostgreSQL на 5432, Redis на 6379 и т. д.), а единственные два отсутствующих входа — это порты 80 и 443 (что указывает на то, что nginx не работал):
Первый (неудачный) экземпляр:
$ sudo -s
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62396a99737c local_discourse/app "/sbin/boot" 14 hours ago Up 14 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp app
# docker exec -it 62396a99737c bash
(docker)# netstat -tulpn
Active Internet connections (only servers)
Proto Local Address Foreign Address State PID/Program name
tcp 127.0.0.1:3000 0.0.0.0:* LISTEN -
tcp 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp 0.0.0.0:6379 0.0.0.0:* LISTEN -
tcp6 :::5432 :::* LISTEN -
tcp6 :::6379 :::* LISTEN -
Второй экземпляр:
(docker)# netstat -tulpn
Active Internet connections (only servers)
Proto Local Address Foreign Address State PID/Program name
tcp 0.0.0.0:6379 0.0.0.0:* LISTEN -
tcp 0.0.0.0:80 0.0.0.0:* LISTEN 2359/nginx: master
tcp 127.0.0.1:3000 0.0.0.0:* LISTEN -
tcp 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp 0.0.0.0:443 0.0.0.0:* LISTEN 2359/nginx: master
tcp6 :::6379 :::* LISTEN -
tcp6 :::5432 :::* LISTEN -
Несколько заметок для себя в будущем:
В первый раз я заметил отсутствие прослушивающих портов 80 и 443, но увидел сокет 127.0.0.1:3000 (который, как я помню, является стандартным портом Rails). Мне ещё не пришло в голову, что, возможно, nginx не работал, и по какой-то причине я всё ещё подозревал, что проблема в сопоставлении портов Docker, поэтому я сделал простую пересылку через netcat:
Внутри Docker: nc -l -p 80 -c "nc 127.0.0.1 3000"
Вне Docker в ВМ: nc -zv localhost 80 и curl localhost:80 (это убедило меня, что с Docker всё в порядке)
Я также подозревал правила входящих портов Azure, потому что nc -zv постоянно возвращал Connection refused, но затем понял, что это означает лишь то, что порты открыты, но по другую сторону никто не слушает. (Если бы порты были заблокированы, nc просто завис.)
discourse-setup должен завершиться с ошибкой, если у вас не открыты порты 80 и 443 для входящего трафика.
Ах, да. Это верно. Некоторые вопросы о настройке электронной почты были изменены некоторое время назад, но не обновлены в руководстве. Я думаю, что большинство людей читают подсказки, а не документ по установке, поэтому никто другой не жаловался.
Почему вы так думали? Процесс установки автоматически настраивает Let’s Encrypt уже много лет.
Я не могу понять, работает ваш сайт или нет.
Если он не работает, скорее всего, вы несколько раз запускали discourse-setup и исчерпали лимит запросов на letsencrypt.org.