Discourse installation on Azure not reachable

Hate to bump this topic, but it is still relevant. Everything installs beautifully Discourse-wise, all seems fine, but ports 80 and 443 are publicly unreachable.


update: The basic install does work out of the box on Azure on Ubuntu Server.

These are what I did differently the second time around:

  1. After VM creation and calling discourse-setup, I didn’t interrupt the process, so everything was run in one go.

    The first time I realized I had no swap, and even though the discourse-setup script sets it up if missing, I exited to shell to check stuff. Then some of install prompts were different than in the basic guide, so exited one more time.

    + What baffled me was the Let’s Encrypt one, asking for an email address to receive notifications regarding it, and was under the impression that I would have to set up HTTPS manually. In reality, the script sets up the Discourse instance with a Let’s Encrypt SSL certificate.
    + Another thing was the SMTP user name and password sections; still not sure if I could’ve just left these blank, but I just added the admin email address and the password for that account.

  2. Set up swap space manually according to this meta.discourse thread.

    I don’t think this had anything to do with it, but mentioning it just in case. The second time, I did everything the way I did in the first, except (1) set up swap manually, and (2) let discourse-setup run without interruptions.

It is possible that the first instance could have been saved but Discourse’s architecture is still a mystery to me, and not sure how to restart HTTP/HTTPS endpoints. When comparing netstat -tulpn outputs, it is clear that in the first instance, all the relevant services seem to run and listen on the right ports (e.g., PostgreSQL on 5432, Redis on 6379, etc.) and the only 2 entries missing are the 80 and 443 ports (suggesting that nginx wasn’t running):

1st (failed) instance:

$ 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  -

Second instance:

(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  -

Couple notes for future self:

  1. The first time around, I noticed the lack of 80 and 443 listener ports, but saw the 127.0.0.1:3000 socket (which I remembered to be the default Rails one). It didn’t dawn on me yet that maybe nginx wasn’t running, and for some reason I still suspected Docker port mappings to be the culprit, so I did a basic redirect with netcat:

    Inside Docker: nc -l -p 80 -c "nc 127.0.0.1 3000"
    Outside Docker in the VM: nc -zv localhost 80 and curl localhost:80 (this settled it that Docker was ok)

  2. I also thought the Azure inbound port rules to be suspect, because nc -zv kept returning Connection refused, but then realized that this only means that the ports are open but no one is listening on the other side. (If the ports would be blocking, than nc would just hang.)

1 Like