E-mails de ativação: o discourse-doctor funciona, mas o próprio discourse não

Olá a todos,

Como o título já diz. O discourse-doctor se conecta ao meu servidor de correio (executando na máquina host) através de sua interface externa e acessível pela internet (mas não localhost), mas o próprio discourse simplesmente não o faz.

Nenhuma tentativa por parte do discourse está sendo registrada, nem no log de produção do Rails nem nos logs do meu servidor de correio. Eu até executei um analisador de pacotes na interface do Docker e não vi nenhum tráfego de correio.

O discourse-doctor, no entanto, produz entradas de log no meu servidor de correio, como esperado, e consigo ler o e-mail no meu cliente de correio.

Reconstruí o contêiner Docker várias vezes com a seguinte configuração:

## este é o modelo de contêiner Docker Discourse all-in-one, standalone
##
## Após fazer alterações neste arquivo, você DEVE reconstruir
## /var/discourse/launcher rebuild app
##
## TENHA *MUITO* CUIDADO AO EDITAR!
## ARQUIVOS YAML SÃO SUPER SUPER SENSÍVEIS A ERROS DE ESPAÇAMENTO OU ALINHAMENTO!
## visite http://www.yamllint.com/ para validar este arquivo conforme necessário

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomente estas duas linhas se quiser adicionar o Lets Encrypt (https)
###   - "templates/web.ssl.template.yml"
###   - "templates/web.letsencrypt.ssl.template.yml"

## quais portas TCP/IP este contêiner deve expor?
## Se você quiser que o Discourse compartilhe uma porta com outro servidor web como Apache ou nginx,
## consulte https://meta.discourse.org/t/17247 para detalhes
expose:
  - "127.0.0.1:1234:80"   # http
    ###   - "127.0.0.1:1235:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Defina db_shared_buffers para no máximo 25% da memória total.
  ## será definido automaticamente pelo bootstrap com base na RAM detectada, ou você pode substituir
  db_shared_buffers: "256MB"

  ## pode melhorar o desempenho de classificação, mas adiciona uso de memória por conexão
  #db_work_mem: "40MB"

  ## Qual revisão do Git este contêiner deve usar? (padrão: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Quantas solicitações web simultâneas são suportadas? Depende da memória e dos núcleos da CPU.
  ## será definido automaticamente pelo bootstrap com base nas CPUs detectadas, ou você pode substituir
  UNICORN_WORKERS: 4

  ## TODO: O nome de domínio ao qual esta instância do Discourse responderá
  ## Obrigatório. O Discourse não funcionará com um número IP bruto.
  DISCOURSE_HOSTNAME: example.com

  ## Descomente se quiser que o contêiner seja iniciado com o mesmo
  ## nome de host (opção -h) especificado acima (padrão "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de e-mails delimitados por vírgula que serão feitos administradores e desenvolvedores
  ## no cadastro inicial, exemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'me@another.com'

  ## TODO: O servidor de correio SMTP usado para validar novas contas e enviar notificações
  # ENDEREÇO SMTP, nome de usuário e senha são obrigatórios
  # AVISO: o caractere '#' na senha SMTP pode causar problemas!
  DISCOURSE_SMTP_ADDRESS: submission.example.com # Registro A funciona, mas não CNAME
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: somedumbuser
  DISCOURSE_SMTP_PASSWORD: somedumbpass
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)

  ## Se você adicionou o modelo Lets Encrypt, descomente abaixo para obter um certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: ssl@yetanother.com

  ## O endereço http ou https do CDN para esta instância do Discourse (configurado para buscar)
  ## consulte https://meta.discourse.org/t/14857 para detalhes
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

## 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
## consulte 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"
  ## Se quiser definir o endereço de e-mail 'De' para seu primeiro cadastro, descomente e altere:
  ## Após receber o primeiro e-mail de cadastro, comente novamente a linha. Só precisa ser executado uma vez.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "types {"
      to: |
        set_real_ip_from 0.0.0.0/0;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
        types {
  - exec: echo "Fim dos comandos personalizados"

Então, ao executar o teste de e-mail em /admin/email, nenhuma mensagem é enviada? O /sidekiq está rodando? Você fez uma instalação padrão?

O Discourse precisa de um nome de domínio para funcionar, então seu problema pode estar relacionado ao fato de ele estar vinculado apenas ao localhost.

Oi Jay, obrigado por responder.

Quando executo sudo docker exec -it app /bin/bash, não vejo um diretório /admin. Também não vejo um diretório /admin clonado do repositório git.

O comando pgrep -afl sidekiq mostra um processo com esse nome em execução.

Estou executando o Discourse atrás do HAProxy, como descrevi aqui, por isso a vinculação ao localhost: How to install Discourse behind Apache mod_proxy?

Tentei modificar o expose da seguinte forma e mesmo assim não há nenhum SYN sendo enviado para a porta 587 no meu servidor de e-mail. DISCOURSE_HOSTNAME está definido com o domínio correto, o sidekiq está em execução, e ainda não faço ideia de onde encontrar /admin/email.

expose:
  - "1234:80"   # http

/admin/email é um caminho relativo
Você precisa acessá-lo em um navegador da web:
{Seu Hostname do Discourse}/admin/email