Instalei o Discourse no Docker, Não Consigo Conectar

Então, usei a documentação de instalação padrão e tudo pareceu correr bem. Em seguida, editei o app.yml para alterar as portas utilizadas, comentei o LetsEncrypt e reconstruí. Parece que tudo funcionou corretamente.

Mas, quando tento me conectar pelo método mais direto:

$lynx https://127.0.0.1:44443

recebo o seguinte erro:

Alert!: Unable to make secure connection to remote host.

Nem mesmo consigo fazer ping na porta.

Isso faz algum sentido? Existem logs dentro do container?

—edição para adicionar----

$ sudo ./launcher logs app
run-parts: executando /etc/runit/1.d/00-ensure-links
run-parts: executando /etc/runit/1.d/00-fix-var-logs
run-parts: executando /etc/runit/1.d/01-cleanup-web-pids
run-parts: executando /etc/runit/1.d/anacron
run-parts: executando /etc/runit/1.d/cleanup-pids
Limpando arquivos PID obsoletos
run-parts: executando /etc/runit/1.d/copy-env
runsvdir iniciado, PID é 43
ok: run: redis: (pid 56) 0s
**chgrp: grupo inválido: 'syslog'**
ok: run: postgres: (pid 55) 0s
supervisor pid: 57 unicorn pid: 85
(57) Reabrindo logs

----edição para adicionar mais----

root@hestia-app:/shared/log/rails# tail -f *.log
==> production_errors.log <==

==> production.log <==

==> sidekiq.log <==

==> unicorn.stderr.log <==
I, [2021-08-06T00:56:35.859967 #85]  INFO -- : master concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.911700 #142]  INFO -- : worker=0 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.911698 #152]  INFO -- : worker=1 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.935834 #162]  INFO -- : worker=2 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.941733 #233]  INFO -- : worker=7 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.945447 #203]  INFO -- : worker=5 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.947354 #172]  INFO -- : worker=3 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.949949 #187]  INFO -- : worker=4 concluiu a reabertura dos logs
I, [2021-08-06T00:56:50.953453 #213]  INFO -- : worker=6 concluiu a reabertura dos logs

==> unicorn.stdout.log <==
Sidekiq PID 131 concluiu a reabertura dos logs...
root@hestia-app:/var/log/nginx# tail *.log
==> access.letsencrypt.log <==

==> access.log <==

==> error.letsencrypt.log <==

==> error.log <==

Deve ser um erro do Docker, porque… todo o resto parece estar bem.

Acabei de instalar um container Apache limpo mapeado para a porta 8088, e funciona perfeitamente pelo Lynx.

Eu entrei no aplicativo novamente, executei o comando ps ax e parece que tudo está funcionando. Apenas parece que o contêiner não está aceitando conexões.

root@hestia-app:/var/www/discourse# ps ax
    PID TTY      STAT   TIME COMMAND
      1 pts/0    Ss+    0:00 /bin/bash /sbin/boot
     43 pts/0    S+     0:00 /usr/bin/runsvdir -P /etc/service
     44 ?        Ss     0:00 runsv cron
     45 ?        Ss     0:00 runsv rsyslog
     46 ?        Ss     0:00 runsv redis
     47 ?        Ss     0:00 runsv postgres
     48 ?        Ss     0:00 runsv unicorn
     49 ?        Ss     0:00 runsv nginx
     50 ?        S      0:00 cron -f
     51 ?        Sl     0:00 rsyslogd -n
     52 ?        S      0:00 nginx: master process /usr/sbin/nginx
     53 ?        S      0:00 svlogd /var/log/redis
     54 ?        S      0:00 svlogd /var/log/postgres
     55 ?        S      0:00 /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main
     56 ?        Sl     0:33 /usr/bin/redis-server *:6379
     57 ?        S      0:04 /bin/bash config/unicorn_launcher -E production -c config/unicorn.conf.rb
     64 ?        S      0:00 nginx: worker process
     65 ?        S      0:00 nginx: worker process
     66 ?        S      0:00 nginx: worker process
     67 ?        S      0:00 nginx: worker process
     68 ?        S      0:00 nginx: cache manager process
     79 ?        Ss     0:00 postgres: 13/main: checkpointer 
     80 ?        Ss     0:00 postgres: 13/main: background writer 
     81 ?        Ss     0:03 postgres: 13/main: walwriter 
     82 ?        Ss     0:00 postgres: 13/main: autovacuum launcher 
     83 ?        Ss     0:00 postgres: 13/main: stats collector 
     84 ?        Ss     0:00 postgres: 13/main: logical replication launcher 
     85 ?        Sl     0:13 unicorn master -E production -c config/unicorn.conf.rb
    113 ?        Ss     0:01 postgres: 13/main: discourse discourse [local] idle
    131 ?        SNl    0:48 sidekiq 6.2.1 discourse [0 of 5 busy]
    142 ?        Sl     0:06 unicorn worker[0] -E production -c config/unicorn.conf.rb
    152 ?        Sl     0:06 unicorn worker[1] -E production -c config/unicorn.conf.rb
    162 ?        Sl     0:07 unicorn worker[2] -E production -c config/unicorn.conf.rb
    172 ?        Sl     0:06 unicorn worker[3] -E production -c config/unicorn.conf.rb
    180 ?        Ss     0:00 postgres: 13/main: discourse discourse [local] idle
    187 ?        Sl     0:07 unicorn worker[4] -E production -c config/unicorn.conf.rb
    203 ?        Sl     0:07 unicorn worker[5] -E production -c config/unicorn.conf.rb
    213 ?        Sl     0:07 unicorn worker[6] -E production -c config/unicorn.conf.rb
    233 ?        Sl     0:07 unicorn worker[7] -E production -c config/unicorn.conf.rb
  11733 pts/1    Ss     0:00 /bin/bash --login
  11748 ?        S      0:00 sleep 1
  11749 pts/1    R+     0:00 ps ax

Certo, então eu entrei no app e instalei o lynx dentro do Docker do Discord, e eu consegui acessar a página de boas-vindas lá! Então a instalação está funcionando; o problema é o mapeamento de rede de dentro do Docker para fora, até o servidor.

Aqui está a saída do docker ps:

CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                             NAMES
c6d0209e4e72   local_discourse/app   "/sbin/boot"   51 minutes ago   Up 51 minutes   127.0.0.1:8880->80/tcp, 127.0.0.1:4443->443/tcp   app

…e aqui estão as informações do app.yml:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"

expose:
  - "127.0.0.1:8880:80"   # http
  - "127.0.0.1:4443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"
  db_shared_buffers: "2048MB"

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  UNICORN_WORKERS: 8

  DISCOURSE_HOSTNAME: [redacted]


  DISCOURSE_SMTP_ADDRESS: [redacted]
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: [redacted]
  DISCOURSE_SMTP_PASSWORD: "[redacted]"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)
  DISCOURSE_SMTP_DOMAIN: [redacted]
  DISCOURSE_NOTIFICATION_EMAIL: [redacted]


## O contêiner Docker é sem estado; todos os dados são armazenados em /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins vão aqui
## veja https://meta.discourse.org/t/19157 para detalhes
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Quaisquer comandos personalizados para executar após a construção
run:
  - exec: echo "Início dos comandos personalizados"
  - exec: echo "Fim dos comandos personalizados"

Ah, entendi o que fiz. O 8880:80 funciona bem, eu estava apenas testando o lado do 4443:443. Ele não funcionou porque há um erro de certificado. Tenho a intenção de instalar e gerenciar o certificado no nível do servidor web, no host virtual. Vou postar uma solução final para os interessados assim que conseguir fazer tudo funcionar.

Instalar ambiente
Hestia Control Panel (para gerenciamento de servidor)
Apache2 (servidor web)
Discourse em Docker, com proxy reverso para o Apache2
Let’sEncrypt não está em proxy reverso, mas gerenciado pelo Hestia no www_root

  1. Configure sockets Unix em app.yml (e reconstrua):
  - "templates/web.socketed.template.yml"
  1. Remova o mapeamento de portas e o Let’sEncrypt de app.yml (e reconstrua)
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"
#  - "80:80"   # http
#  - "443:443" # https
#  LETSENCRYPT_ACCOUNT_EMAIL: {seu e-mail, provavelmente}
  1. Crie templates alternativos de apache2.conf para o HestiaCP conforme a seguir (para quem não usa o HestiaCP, apenas saiba que as tags %{replace tags}% são bastante padrão e óbvias se você olhar qualquer outro arquivo apache2.conf. As partes mais importantes não usam muitas tags %{replace tags}%. Note também que o texto standalone poderia ser socket-only, dependendo da sua configuração. Verifique o que está no diretório /var/discourse/shared/ se não se lembrar.

{Custom Template}.stpl

<VirtualHost %ip%:%web_ssl_port%>

    ServerName %domain_idn%

    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
    ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/

    ServerAdmin %email%

    Alias /vstats/ %home%/%user%/web/%domain%/stats/
    Alias /error/ %home%/%user%/web/%domain%/document_errors/

    CustomLog /var/log/%web_system%/domains/%domain%.bytes bytes
    CustomLog /var/log/%web_system%/domains/%domain%.log combined
    ErrorLog /var/log/%web_system%/domains/%domain%.error.log
    <Directory %home%/%user%/web/%domain%/stats>
        AllowOverride All
    </Directory>
    <Directory %sdocroot%>
        AllowOverride All
        SSLRequireSSL
        Options +Includes -Indexes +ExecCGI
    </Directory>
    SSLEngine on
    SSLVerifyClient none
    SSLCertificateFile %ssl_crt%
    SSLCertificateKeyFile %ssl_key%
    %ssl_ca_str%SSLCertificateChainFile %ssl_ca%

    IncludeOptional %home%/%user%/conf/web/%domain%/%web_system%.ssl.conf_*

</VirtualHost>

{Custom Template}.tpl

<VirtualHost %ip%:%web_port%>

    ServerName %domain_idn%
    %alias_string%

    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
    ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^.well-known/acme-challenge
    RewriteRule ^(.*) https://%domain_idn%/$1 [R=301,L]

    Alias /vstats/ %home%/%user%/web/%domain%/stats/
    Alias /error/ %home%/%user%/web/%domain%/document_errors/

    CustomLog /var/log/%web_system%/domains/%domain%.bytes bytes
    CustomLog /var/log/%web_system%/domains/%domain%.log combined
    ErrorLog /var/log/%web_system%/domains/%domain%.error.log

    <Directory %home%/%user%/web/%domain%/stats>
        AllowOverride All
    </Directory>
    <Directory %sdocroot%>
        AllowOverride All
        Options +Includes -Indexes +ExecCGI
    </Directory>

    IncludeOptional %home%/%user%/conf/web/%domain%/%web_system%.conf_*

</VirtualHost>

Ah, esqueci algo acima: você também precisará disso em cada arquivo:

RequestHeader set X-Forwarded-Proto https