Discourse funcionando com jwilder /nginx proxy e acme-companion

Olá @rrit @pfaffman, obrigado pelas respostas e sugestões.

Hoje dei outra olhada nisso, levou um bom tempo, mas finalmente consegui fazer funcionar. Vou fornecer minha configuração e alguns métodos de depuração, caso isso ajude outros por aí.

Nota: Por favor, consulte minha postagem inicial para obter informações sobre como os contêineres nginx/acme-companion/discourse se “conectam” e automatizam certificados/reverse proxy.

Se você não se importa com os métodos de depuração, pule para o final, onde minhas soluções estão postadas (arquivos docker-compose e app.yml)

Principal erro identificado na minha configuração

Parece que um erro que eu estava enfrentando foi culpa minha, devido a seguir cegamente vários tutoriais, o que acabou bagunçando as coisas. Se você notar na minha postagem inicial, eu conseguia ouvir na porta 80 do contêiner do aplicativo Discourse usando “netcat -lnvp 80”. Bem, isso não faz sentido se eu quero que o reverse proxy envie tráfego para uma porta de escuta no contêiner do Discourse; essa porta não deveria estar disponível para eu ouvir via netcat… ela deveria estar ‘em uso’.

O problema era que eu estava usando o seguinte modelo: web.socketed.template.yml
Isso significa que o nginx do contêiner do Discourse estava utilizando sockets Unix em vez de ouvir em portas TCP/IP. Um exemplo do modelo e das configurações que ele faz no nginx é o seguinte:

ubuntu@ubuntu-vm-dev:/var/discourse/templates$ cat web.socketed.template.yml 
run:
  - file:
     path: /etc/runit/1.d/remove-old-socket
     chmod: "+x"
     contents: |
        #!/bin/bash
        rm -f /shared/nginx.http*.sock
  - file:
     path: /etc/runit/3.d/remove-old-socket
     chmod: "+x"
     contents: |
        #!/bin/bash
        rm -rf /shared/nginx.http*.sock
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 80;/
     to: |
       listen unix:/shared/nginx.http.sock;
       set_real_ip_from unix:;
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 443 ssl http2;/
     to: |
       listen unix:/shared/nginx.https.sock ssl http2;
       set_real_ip_from unix:;

O problema era que o nginx do meu contêiner nginx-proxy estava encaminhando o tráfego com sucesso para o contêiner do Discourse, mas estava encaminhando para a porta 80 em vez de utilizar o socket Unix compartilhado.

Você pode ver na documentação do nginx-proxy que a porta padrão será a porta 80, a menos que uma Porta Virtual seja especificada.
Captura de tela em anexo de: GitHub - nginx-proxy/nginx-proxy: Automated Nginx Reverse Proxy for Docker · GitHub

Em vez de mexer na configuração do contêiner nginx-proxy, eu simplesmente removi o web.socketed.template.yml. Após isso, removi todas as portas que meu contêiner do Discourse estava expondo, pois isso não era necessário. Desde que o contêiner do Discourse esteja na rede Docker correta (a mesma rede do nginx-proxy e do acme-companion), deve funcionar bem.

Dicas de Depuração

1. Depuração de rede

1.1 Rede Docker
Um exemplo de como você pode testar se a rede está funcionando é com o seguinte comando (após iniciar seu aplicativo Docker e os contêineres nginx/acme).

ubuntu@ubuntu-vm-dev:/var/discourse$ docker network inspect nginx-proxy
 {
        "Name": "nginx-proxy",
        "Id": "d2715f513771f002711521838340b879bb9106ef50118fb29be6b0cf2d5f25e7",
        "Created": "2022-02-01T20:32:10.021632263Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "205772214b77a6bf49a76d082eef216aa5fc4ca15a39ae2c8fefc0b3eeb61e00": {
                "Name": "nginx-test_webserver2_1",
                "EndpointID": "ee3096663b1a90443906652ff3a192243fa1f60081e5bbee190a23f1d23393f7",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "3050831bf600ae02c18e5045549267b583ec732d6f1550f869ab651dfc7d8dca": {
                "Name": "nginx-test_nginx_1",
                "EndpointID": "a7f95f2a7589ca3823da01b9d28244bbd81815d6f5cc1f2f89804a488ef2148d",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "696ce8d129a62ce37ae8373ed4f603fd5d731f5f29166bd6fa889631ef0ae606": {
                "Name": "nginx-proxy",
                "EndpointID": "99d90539668b97652ffca7e3301aa83c40fe7b31ca8eea2a8a4d9bf7afe19ac0",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "d3faf6489ca6617dceda4f2907ee6c055a1d81e3590c3eab2768601dfc0b60d7": {
                "Name": "app",
                "EndpointID": "aed6bfcc61e439e2206615a1569355c529a63a21c356e54da378f630d44fd3bc",
                "MacAddress": "02:72:f8:ee:03:32",
                "IPv4Address": "172.18.0.6/16",
                "IPv6Address": ""
            },
            "e04f2125001d5f346255312f10cdd0ab176388cddb0819b0022c5988a23303eb": {
                "Name": "letsencrypt-proxy",
                "EndpointID": "0088bcd942aed41c9351b935ed7b115e49046cc3a8308ca5a8d3828a194ecfee",
                "MacAddress": "02:42:ac:12:00:05",
                "IPv4Address": "172.18.0.5/16",
                "IPv6Address": ""
            }
        },

Nota: altere o nome da rede para a que você está usando (a menos que também esteja usando o nome nginx-proxy)

Após isso, você deve ver esses endereços IP da rede Docker dentro da configuração do contêiner nginx-proxy, que você pode acessar e visualizar via:

ubuntu@ubuntu-vm-dev:/var/discourse$ docker exec -it nginx-proxy /bin/bash
root@696ce8d129a6:/app# cd /etc/nginx/conf.d/
root@696ce8d129a6:/etc/nginx/conf.d# cat default.conf
... A configuração do NGINX estará aqui ... 

Para testar a comunicação de rede bem-sucedida, interaja com um endereço IP especificado em um dos locais upstream. Por exemplo, do contêiner nginx-proxy, tente interagir com o contêiner do Discourse através dos endereços IP atribuídos à rede Docker.

Ex.: meu arquivo de configuração contém:

upstream my_forum_domain.com {
	## Pode ser conectado com a rede "nginx-proxy"
	# app
	server 172.18.0.6:80;
}

Como o IP upstream para meu contêiner do Discourse é 172.18.0.6, devo ser capaz de ver uma saída bem-sucedida ao executar curl contra meu contêiner do Discourse.

root@696ce8d129a6:/etc/nginx/conf.d# curl 172.18.0.6
... Saída da solicitação Curl ... 

1.2. Ferramentas de solução de problemas de rede (Netstat, lsof, netcat)
As seguintes ferramentas ajudarão na solução de problemas: ‘netstat’, ‘lsof’, ‘netcat’. Como o contêiner do Discourse não vem com essas ferramentas pré-instaladas, instale-as via:

root@ubuntu-vm-dev-app:/# apt-get install lsof
root@ubuntu-vm-dev-app:/# apt-get install net-tools
root@ubuntu-vm-dev-app:/# apt-get install netcat

lsof
Você deve ver seu processo nginx ouvindo na porta 80 via lsof.

root@ubuntu-vm-dev-app:/# lsof -i :80
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx    55 root    6u  IPv4 254317      0t0  TCP *:http (LISTEN)
root@ubuntu-vm-dev-app:/# 

netstat
O seguinte comando netstat também é útil para ajudar a ver se os processos/portas corretos estão sendo utilizados. Ex.: você pode ver portas associadas ao HTTP (80), redis (6379), PostgreSQL (5432), Unicorn (3000) etc.

root@ubuntu-vm-dev-app:/# netstat -peanut
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          254317     55/nginx: master pr 
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      1000       255560     -                   
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      105        255137     -                   
tcp        0      0 127.0.0.11:46697        0.0.0.0:*               LISTEN      0          254194     -                   
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      106        255126     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37600         ESTABLISHED 106        255583     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37608         ESTABLISHED 106        255610     -                   
tcp        0      0 127.0.0.1:37632         127.0.0.1:6379          ESTABLISHED 1000       254766     -                   
tcp        0      0 127.0.0.1:37626         127.0.0.1:6379          ESTABLISHED 1000       254745     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37634         ESTABLISHED 106        254773     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37650         ESTABLISHED 106        255950     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37668         ESTABLISHED 106        255965     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37612         ESTABLISHED 106        255618     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37602         ESTABLISHED 106        255585     -                   
tcp        0      0 127.0.0.1:37624         127.0.0.1:6379          ESTABLISHED 1000       254739     -                   
tcp        0      0 127.0.0.1:37594         127.0.0.1:6379          ESTABLISHED 1000       255578     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37594         ESTABLISHED 106        254527     -                   
tcp        0      0 127.0.0.1:37618         127.0.0.1:6379          ESTABLISHED 1000       255635     -                   
tcp        0      0 127.0.0.1:37586         127.0.0.1:6379          ESTABLISHED 1000       255168     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37622         ESTABLISHED 106        255645     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37624         ESTABLISHED 106        254740     -                   
tcp        0      0 127.0.0.1:37600         127.0.0.1:6379          ESTABLISHED 1000       254537     -                   
tcp        0      0 127.0.0.1:37610         127.0.0.1:6379          ESTABLISHED 1000       254563     -                   
tcp        0      0 127.0.0.1:3000          127.0.0.1:36678         TIME_WAIT   0          0          -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37620         ESTABLISHED 106        255642     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37636         ESTABLISHED 106        254779     -                   
tcp        0      0 127.0.0.1:37628         127.0.0.1:6379          ESTABLISHED 1000       254751     -                   
tcp        0      0 127.0.0.1:37590         127.0.0.1:6379          ESTABLISHED 1000       254361     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37626         ESTABLISHED 106        254746     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37586         ESTABLISHED 106        255169     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37590         ESTABLISHED 106        255173     -                   
tcp        0      0 127.0.0.1:37668         127.0.0.1:6379          ESTABLISHED 1000       254849     -                   
tcp        0      0 127.0.0.1:37622         127.0.0.1:6379          ESTABLISHED 1000       254582     -                   
tcp        0      0 127.0.0.1:37634         127.0.0.1:6379          ESTABLISHED 1000       254772     -                   
tcp        0      0 127.0.0.1:37602         127.0.0.1:6379          ESTABLISHED 1000       254541     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37630         ESTABLISHED 106        254760     -                   
tcp        0      0 127.0.0.1:37612         127.0.0.1:6379          ESTABLISHED 1000       255617     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37628         ESTABLISHED 106        254752     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37610         ESTABLISHED 106        255612     -                   
tcp        0      0 127.0.0.1:3000          127.0.0.1:36682         TIME_WAIT   0          0          -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37632         ESTABLISHED 106        254767     -                   
tcp        0      0 127.0.0.1:37650         127.0.0.1:6379          ESTABLISHED 1000       254826     -                   
tcp        0      0 127.0.0.1:37608         127.0.0.1:6379          ESTABLISHED 1000       254559     -                   
tcp        0      0 127.0.0.1:37620         127.0.0.1:6379          ESTABLISHED 1000       255641     -                   
tcp        0      0 127.0.0.1:37636         127.0.0.1:6379          ESTABLISHED 1000       254778     -                   
tcp        0      0 127.0.0.1:37630         127.0.0.1:6379          ESTABLISHED 1000       254759     -                   
tcp        0      0 127.0.0.1:6379          127.0.0.1:37618         ESTABLISHED 106        255636     -                   
tcp6       0      0 :::5432                 :::*                    LISTEN      105        255138     -                   
tcp6       0      0 :::6379                 :::*                    LISTEN      106        255127     -                   
udp        0      0 127.0.0.1:54569         127.0.0.1:54569         ESTABLISHED 105        255145     -                   
udp        0      0 127.0.0.11:44019        0.0.0.0:*                           0          254193     -                   
root@ubuntu-vm-dev-app:/# 

nc
nc para visualizar se as portas de escuta estão configuradas/ouvindo corretamente. (embora isso já devesse ser exibido pelo netstat).

root@ubuntu-vm-dev-app:/# nc -zv localhost 1-10000 2>&1 | grep -i  succeeded 
Connection to localhost (127.0.0.1) 80 port [tcp/http] succeeded!
Connection to localhost (127.0.0.1) 3000 port [tcp/*] succeeded!
Connection to localhost (127.0.0.1) 5432 port [tcp/postgresql] succeeded!
Connection to localhost (127.0.0.1) 6379 port [tcp/redis] succeeded!

1.3 processo
Outro comando útil: ps aux

root@ubuntu-vm-dev-app:/# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   6772  3252 pts/0    Ss+  15:20   0:00 /bin/bash /sbin/boot
root          41  0.0  0.0   2340   636 pts/0    S+   15:20   0:00 /usr/bin/runsvdir -P /etc/service
root          42  0.0  0.0   2188   696 ?        Ss   15:20   0:00 runsv cron
root          43  0.0  0.0   2188   636 ?        Ss   15:20   0:00 runsv rsyslog
root          44  0.0  0.0   2188   632 ?        Ss   15:20   0:00 runsv nginx
root          45  0.0  0.0   2188   636 ?        Ss   15:20   0:00 runsv postgres
root          46  0.0  0.0   2188   636 ?        Ss   15:20   0:00 runsv redis
root          47  0.0  0.0   2188   636 ?        Ss   15:20   0:00 runsv unicorn
root          48  0.0  0.0 151068  3868 ?        Sl   15:20   0:00 rsyslogd -n
root          49  0.0  0.0   2336   700 ?        S    15:20   0:00 svlogd /var/log/redis
root          50  0.0  0.0   6620  2768 ?        S    15:20   0:00 cron -f
redis         51  0.1  0.0  54180  5828 ?        Sl   15:20   0:02 /usr/bin/redis-server *:6379
root          52  0.0  0.0   2336   636 ?        S    15:20   0:00 svlogd /var/log/postgres
postgres      53  0.0  0.3 213196 28676 ?        S    15:20   0:00 /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main
discour+      54  0.0  0.0  15256  3924 ?        S    15:20   0:00 /bin/bash config/unicorn_launcher -E production -c config/unicorn.conf.rb
root          55  0.0  0.0  21280  7128 ?        S    15:20   0:00 nginx: master process /usr/sbin/nginx
www-data      69  0.0  0.0  22156  5004 ?        S    15:20   0:00 nginx: worker process
www-data      70  0.0  0.0  22124  4524 ?        S    15:20   0:00 nginx: worker process
www-data      71  0.0  0.0  21656  3768 ?        S    15:20   0:00 nginx: cache manager process
postgres      75  0.0  0.0 213296  6344 ?        Ss   15:20   0:00 postgres: 13/main: checkpointer 
postgres      76  0.0  0.0 213196  5896 ?        Ss   15:20   0:00 postgres: 13/main: background writer 
postgres      77  0.0  0.1 213196 10028 ?        Ss   15:20   0:00 postgres: 13/main: walwriter 
postgres      78  0.0  0.1 213736  8492 ?        Ss   15:20   0:00 postgres: 13/main: autovacuum launcher 
postgres      79  0.0  0.0  67960  5548 ?        Ss   15:20   0:00 postgres: 13/main: stats collector 
postgres      80  0.0  0.0 213752  6868 ?        Ss   15:20   0:00 postgres: 13/main: logical replication launcher 
discour+      81  0.4  3.1 436276 253572 ?       Sl   15:20   0:08 unicorn master -E production -c config/unicorn.conf.rb
postgres      99  0.0  0.3 220252 30612 ?        Ss   15:20   0:00 postgres: 13/main: discourse discourse [local] idle
discour+     116  0.6  3.7 831804 306708 ?       SNl  15:20   0:12 sidekiq 6.4.1 discourse [0 of 5 busy]
discour+     125  0.4  3.6 750356 297108 ?       Sl   15:20   0:07 unicorn worker[0] -E production -c config/unicorn.conf.rb
discour+     133  0.3  3.5 737812 289896 ?       Sl   15:20   0:07 unicorn worker[1] -E production -c config/unicorn.conf.rb
postgres     147  0.0  0.3 219372 27792 ?        Ss   15:20   0:00 postgres: 13/main: discourse discourse [local] idle
root        1858  0.0  0.0   7036  3828 pts/1    Ss   15:46   0:00 /bin/bash
postgres    1982  0.0  0.2 217012 24008 ?        Ss   15:47   0:00 postgres: 13/main: discourse discourse [local] idle
discour+    2236  0.0  0.0  13760  2216 ?        S    15:51   0:00 sleep 1
root        2237  0.0  0.0   9636  3292 pts/1    R+   15:51   0:00 ps aux
root@ubuntu-vm-dev-app:/# 

Nota: A razão para fornecer as saídas acima é ajudar a identificar quaisquer anomalias ou diferenças entre sua implantação e a minha. Em vez disso, você pode iniciar sua própria implantação funcional (sem o reverse proxy) e comparar coisas como:

  • Rede
  • Processos
  • Criação / Modificação de Arquivos
  • Saída de log

Meus arquivos de configuração funcionais

1. Exemplo de saída de log ao executar ./launcher rebuild app

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=2 -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 VIRTUAL_HOST={your_domain}.com -e LETSENCRYPT_HOST={your_domain}.com -e LETSENCRYPT_EMAIL=steve@{your_email_domain}.com -e LC_ALL=en_US.UTF-8 -e LANGUAGE=en_US.UTF-8 -e EMBER_CLI_PROD_ASSETS=1 -e DISCOURSE_HOSTNAME={your_domain}.com -e DISCOURSE_DEVELOPER_EMAILS=steve@{your_email_domain}.com -e DISCOURSE_SMTP_ADDRESS=smtp.mailgun.org -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=noreply@mail.{your_domain}.com -e DISCOURSE_SMTP_PASSWORD={your_password} -e DISCOURSE_SMTP_DOMAIN=mail.{your_domain}.com -e DISCOURSE_NOTIFICATION_EMAIL=noreply@mail.{your_domain}.com -h ubuntu-vm-dev-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:72:f8:ee:03:32 --network nginx-proxy local_discourse/app /sbin/boot
d3faf6489ca6617dceda4f2907ee6c055a1d81e3590c3eab2768601dfc0b60d7
ubuntu@ubuntu-vm-dev:/var/discourse$ 

2. Meu arquivo docker-compose

ubuntu@ubuntu-vm-dev:~/nginx-test$ cat docker-compose.yml 
version: '3'
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - letsencrypt-certs:/etc/nginx/certs
      - letsencrypt-vhost-d:/etc/nginx/vhost.d
      - letsencrypt-html:/usr/share/nginx/html
  letsencrypt-proxy:
      image: jrcs/letsencrypt-nginx-proxy-companion
      container_name: letsencrypt-proxy
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock:ro
        - letsencrypt-certs:/etc/nginx/certs
        - letsencrypt-vhost-d:/etc/nginx/vhost.d
        - letsencrypt-html:/usr/share/nginx/html
      environment:
        - DEFAULT_EMAIL=steve@{your_email_domain}.com
        - NGINX_PROXY_CONTAINER=nginx-proxy

networks:
  default:
    external:
      name: nginx-proxy
 
volumes:
  letsencrypt-certs:
  letsencrypt-vhost-d:
  letsencrypt-html:

3. Meu arquivo app.yml do Discourse

ubuntu@ubuntu-vm-dev:/var/discourse$ cat containers/app.yml 
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/sshd.template.yml"
  - "templates/web.template.yml"

docker_args:
  - "--network nginx-proxy"

params:
  db_default_text_search_config: "pg_catalog.english"

  db_shared_buffers: "128MB"

env:
  VIRTUAL_HOST: {your_domain}.com
  LETSENCRYPT_HOST: example.com
  LETSENCRYPT_EMAIL: steve@{your_email_domain}.com
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  EMBER_CLI_PROD_ASSETS: 1
  # DISCOURSE_DEFAULT_LOCALE: en

  UNICORN_WORKERS: 2
  
  DISCOURSE_HOSTNAME: example.com
  
  DISCOURSE_DEVELOPER_EMAILS: 'steve@{email_domain}.com'

  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: noreply@mail.{domain.com}.com
  DISCOURSE_SMTP_PASSWORD: "{password}"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)
  DISCOURSE_SMTP_DOMAIN: mail.{domain}.com
  DISCOURSE_NOTIFICATION_EMAIL: noreply@mail.{domain}.com

volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-cakeday.git

run:
  - exec: echo "Início dos comandos personalizados"
  - exec: echo "Fim dos comandos personalizados"

Espero que o acima ajude alguém que também esteja preso nisso :slight_smile: