Configurar Discourse - Ambiente AWS Linux 2 AMI e Apache2 (httpd)

Olá a todos

Li a documentação, revisei as configurações e recomendações publicadas e tentei adaptá-las à minha situação específica.

Para algo que parece bastante simples, é incrivelmente frustrante que nenhuma das soluções propostas tenha funcionado.

Nosso ambiente:

  • Executamos uma instância AWS EC2, mais especificamente uma AWS Linux 2 AMI;
  • Temos o apache2 em execução e configurado;
  • A instância faz parte de um grupo de destino da AWS referenciado pelo nosso balanceador de carga da AWS;
  • Nosso certificado SSL/TLS é fornecido pela AWS e está associado ao balanceador de carga;
  • Nosso provedor de domínio é name.com;
  • Como parte da nossa configuração, temos vários subdomínios roteados usando registros CNAME, todos apontando para o balanceador de carga da AWS, que gerencia o tráfego para a instância EC2;
  • Todo o tráfego roteado para o balanceador de carga e atendido ao usuário da web é seguro;
  • Em nosso servidor, executamos três aplicativos Node Express separados;
  • As portas são definidas no Express como parte da configuração do servidor Express, atualmente as portas 3000, 4000 e 5000;
  • O tráfego é roteado pelo Apache usando o subdomínio para o aplicativo web relevante, por exemplo:
<VirtualHost *:80>
    ServerName subdomain.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Embora não seja particularmente relevante, usamos o PM2 para gerenciar nossos aplicativos Express para que eles sejam iniciados automaticamente após a reinicialização do servidor.

  • No mesmo servidor, instalamos o Docker;

  • Em seguida, instalamos o Discourse usando uma cópia do app.yaml (usando Run other websites on the same machine as Discourse - #182 by angus como orientação).

Status atual:

  • O Docker está em execução
  • O aplicativo Discourse (container) está em execução
  • Os aplicativos Express estão todos em execução e sendo roteados corretamente pelo Apache

Observações:

  • Tentei construir o aplicativo inicialmente sem expor as portas conforme a documentação; quando isso não funcionou, expus a porta 8000 sobre a porta HTTP 80;
  • Na minha compreensão simples, o Docker é como uma casa e os vários containers são os cômodos. O Docker determina como o aplicativo é acessado, ou seja, qual cômodo acessar. Minha ideia ao expor a porta 8000 era poder referenciar a porta 8000 da mesma forma que faço com meus outros aplicativos Express, agora que a 8000 foi exposta. Mas isso não funciona. Abaixo está um exemplo do que tentei fazer no Apache:
# FAQ (ROTEAMENTO DO DISCOURSE)

<VirtualHost *:80>
    ServerName discourse.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8000/"
    ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
  • O teste simples foi tentar colocar localhost:8000 no navegador no servidor e testar. O servidor é a instância AWS com o Chromium instalado. O fato de isso não ser resolvido imediatamente me diz que há um problema e que minha compreensão está faltando algo fundamental. Meus aplicativos web funcionam e estão disponíveis nas portas que especifico na configuração do Express; minha expectativa era que fosse o mesmo para o container Docker.

Observações adicionais:

  • Percebo que há uma solução potencial colocando o NGINX “na frente” do Apache e do Docker para rotear o tráfego de discourse.domain.io para, digamos, a porta 8000 no servidor local, ou seja, a porta exposta para o container Docker, e também rotear todo o outro tráfego de *.domain.io para o Apache em, digamos, a porta 9000, e então alterar minha configuração de VirtualHost para rotear o tráfego da porta 9000 de acordo, ou seja,:
# ROTEAMENTO DO APLICATIVO EXPRESS NO APACHE

<VirtualHost *:9000>
    ServerName other_sub_domains.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Para mim, isso parece completamente desnecessário. Se o domínio discourse.domain.io é roteado para o Apache e o Apache recebe a solicitação e então tenta roteá-la, deveria ser tão simples quanto apontá-la para a porta exposta do container Docker.
  • Além disso, se localhost:8000 no próprio servidor não estiver sendo resolvido, isso não funcionaria de qualquer maneira.

Atualmente, recebo um erro 502 no Chrome quando tento navegar para o meu container Docker do Discourse. (Veja a captura de tela acima).

Trecho do app.yml

## este é o modelo de container Docker Discourse tudo-em-um, autônomo
##
## 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"
  - "templates/web.socketed.template.yml"
## Descomente essas duas linhas se desejar adicionar o Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## quais portas TCP/IP este container deve expor?
## Se você deseja que o Discourse compartilhe uma porta com outro servidor web como Apache ou Nginx,
## consulte https://meta.discourse.org/t/17247 para detalhes
expose:
  - "8000:80"   # http
  #- "443: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 ordenação, mas aumenta o uso de memória por conexão
  #db_work_mem: "40MB"

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

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

  ## Quantas solicitações web concorrentes 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: 3

  ## 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 puro.
  DISCOURSE_HOSTNAME: 'discourse.domain.io'

  ## Descomente se quiser que o container 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 separados por vírgula que serão administradores e desenvolvedores
  ## no cadastro inicial, exemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'

  ## TODO: O servidor de e-mail 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: email-smtp.us-east-1.amazonaws.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: ******
  DISCOURSE_SMTP_PASSWORD: ******
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)
  #DISCOURSE_SMTP_DOMAIN: ******    # (obrigatório para alguns provedores)
  #DISCOURSE_NOTIFICATION_EMAIL: ******  # (endereço de onde enviar notificações)

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

  ## O endereço CDN http ou https 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
  
  ## A chave de endereço IP do Maxmind para consulta de geolocalização por IP
  ## consulte https://meta.discourse.org/t/-/137387/23 para detalhes
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## O container 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 você quiser definir o endereço de e-mail 'De' para seu primeiro registro, descomente e altere:
  ## Após receber o primeiro e-mail de cadastro, recomente a linha. Ela só precisa ser executada uma vez.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fim dos comandos personalizados"

Meu domínio, endereço de e-mail e configuração de e-mail estão corretos. Como mencionado, não preciso de configuração SSL/TLS.

Solicitação:

  • A solução NGINX é a única maneira de fazer essa configuração funcionar e, se for, há uma explicação mais clara disponível sobre as etapas de configuração? Não estou em condições de começar do zero com o servidor apenas para fazer o Discourse funcionar e sem garantias.
  • Em Discourse behind reverse proxy and https - #2 by itsbhanusharma @Dark Matter forneceu a seguinte solução para o apache2, mas não acredito que essa solução tenha em mente um ambiente Node Express e, com meu localhost:8000 não sendo resolvido, não tenho certeza se isso funcionaria:
<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName  discourse.example.com
  DocumentRoot /website/discourse

  RewriteEngine On
  ProxyPreserveHost On
  ProxyRequests Off
  ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ErrorLog /var/log/apache2/discourse.error.log
  LogLevel warn
  CustomLog /var/log/apache2/discourse.access.log combined

  RewriteCond %{SERVER_NAME} =discourse.example.com
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
  • O problema está na minha configuração do Discourse? O problema talvez seja o roteamento do Apache (suspeito)? Ou estou faltando algo mais fundamental aqui?
  • Acredito que resolver isso ajudará muitos usuários no futuro.
  • A melhor solução seria rotear para o Discourse localmente no servidor.
  • Em seguida, o roteamento via URL seria a segunda melhor opção.

Atenciosamente
Matthew Lucas

Isso é muito complicado para eu entender completamente, então considere isso mais um palpite do que uma solução. Se o problema é que você não está conseguindo que algo se conecte ao seu contêiner Docker em execução via localhost, você pode tentar usar o IP do Docker. Também pode ser possível usar o modelo de soquete da web e usar o soquete em vez da porta. Alguns argumentam que isso é preferível por uma série de razões.

Configuração de Implantação Opiniosa do Discourse do MKJ pode ser útil para ler.

@pfaffman — O @Matthew_Lucas já está usando o template com soquetes, no entanto…

Eu definitivamente estou usando localhost para meu proxy externo, e isso deve funcionar com a configuração expose. Eu não esperaria que fosse necessário usar o IP do docker. E eu não esperaria que isso falhasse apenas com o Apache na frente do container docker por esse motivo.

Você pode precisar de configuração de cabeçalho — veja Add an offline page to display when Discourse is rebuilding or starting up - #2 by codinghorror

Eu tenho feito o meu melhor para esquecer a configuração do Apache, mas esta seção da configuração do nginx é algo que você gostaria de descobrir como replicar com o Apache, eu acho.

    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;

Em particular, eu não acho que funcione corretamente sem o cabeçalho Host.

Como você não está usando HTTPS, você deve ser capaz de usar o tcpdump para capturar rastros de pacotes para ver exatamente o que está dando errado.

NO ENTANTO, por que colocar o Apache aí? É apenas um passo extra. Se eu estivesse tentando algo assim, eu configuraria o balanceador de carga da Amazon para falar diretamente com a porta 8000 na instância EC2. Eu assumo que você está terminando o HTTPS no ELB de qualquer maneira. Eu suspeito que o balanceador de carga deles conhece os cabeçalhos normais a serem adicionados sem que você precise especificá-los, mas se não, obviamente vá em frente e defina-os. Apenas certifique-se de que a porta seja acessível através do firewall.

Eu duvido que eu tenha muito mais de valor a contribuir aqui, mas espero que parte disso ajude você com sua configuração. Boa sorte.

INSTALAÇÃO DO DOCKER E DO DISCOURSE NA AWS EC2 LINUX COM REVERSE PROXY HTTPD EXISTENTE

Olá a todos,

Consegui resolver. Voltei à estaca zero e comecei do zero com uma instalação limpa do Docker e do Discourse. Meu processo está detalhado abaixo:

Pressupostos

• Você já possui uma instância Linux AWS EC2
• Você pode acessar sua instância EC2 via SSH
• O Apache 2 já está configurado e em execução no seu servidor

ACESSAR SUA INSTÂNCIA EC2 VIA SSH

  1. Abra o CMD / Terminal

  2. Faça SSH na instância AWS EC2

Exemplo de tela após conectar à instância EC2

REALIZAR ATUALIZAÇÕES DO SISTEMA

  1. Realize atualizações do sistema executando o seguinte comando no console / terminal

$ sudo yum update

INSTALAR DOCKER

  1. Pesquise o pacote Docker da AWS executando o seguinte comando no console / terminal

$ sudo yum search docker

  1. Obtenha informações da versão executando o seguinte comando no console / terminal

$ sudo yum info docker

  1. Instale o Docker executando o seguinte comando no console / terminal

$ sudo yum install docker

  1. Adicione a associação ao grupo para o usuário padrão ec2-user para que você possa executar todos os comandos do Docker sem usar o comando sudo, executando o seguinte comando no console / terminal
$ sudo usermod -a -G docker ec2-user
$ id ec2-user

# Recarregue as atribuições de grupo de um usuário Linux para o Docker sem fazer logout

$ newgrp docker
  1. Instale o docker-compose executando o seguinte comando no console / terminal
# 1. Obtenha o pip3 (pacote instalador do Python)
$ sudo yum install python3-pip
 
# 2. Em seguida, execute qualquer um dos seguintes comandos
$ sudo pip3 install docker-compose # com acesso root
 
# OU
 
$ pip3 install --user docker-compose # sem acesso root por motivos de segurança

# Verifique as permissões
$ sudo chmod -v +x /usr/local/bin/docker-compose
  1. Ative o serviço do Docker para iniciar automaticamente na inicialização executando o seguinte comando no console / terminal

$ sudo systemctl enable docker.service

  1. Inicie o serviço do Docker executando o seguinte comando no console / terminal

$ sudo systemctl start docker.service

  1. Verifique se o serviço do Docker está em execução executando o seguinte comando no console / terminal; a saída será semelhante a esta

Comandos básicos do Docker que é bom saber:

# Versão do Docker
$ docker version

# Versão do Docker Compose
$ docker-compose version

# Iniciar serviço do Docker
$ sudo systemctl start docker.service

# Parar serviço do Docker
$ sudo systemctl stop docker.service

# Reiniciar serviço do Docker
$ sudo systemctl restart docker.service

# Status do serviço do Docker
$ sudo systemctl status docker.service

INSTALAR DISCOURSE

  1. Crie a pasta do Discourse

$ sudo mkdir /var/discourse

  1. Clone a imagem Docker do Discourse para o diretório recém-criado

$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

  1. Copie o arquivo standalone.yml para a pasta containers

$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml

  1. Edite o novo arquivo discourse.yml conforme abaixo (as partes importantes são as portas expostas para HTTP e os detalhes de e-mail para SMTP; modifique no arquivo, não copie e cole)

Opções de edição:

1. Você pode usar o nano e editar via linha de comando / terminal
2. Na AWS, se estiver usando MATE com PLUMA, pode usar o PLUMA para editar o arquivo
3. Você pode usar o WINSCP para fazer SSH na máquina e editar o arquivo via GUI do Windows

## este é o modelo de contêiner Docker Discourse tudo-em-um, 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"
  ## Descomente a próxima linha para habilitar o ouvinte IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Descomente estas duas linhas se desejar 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ê deseja que o Discourse compartilhe uma porta com outro servidor web como Apache ou nginx,
## consulte https://meta.discourse.org/t/17247 para detalhes
expose:
  - "8080:80"   # http (executar na porta local 8080, porta do Docker 80)
  #- "443:443" # https (certifique-se de que isso esteja comentado)

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:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: 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: 3

  ## 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 puro.
  DISCOURSE_HOSTNAME: 'faq.mobiloan.io'

  ## 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 separados por vírgula que serão feitos administradores e desenvolvedores
  ## no exemplo de cadastro inicial 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'insira o e-mail aqui'

  ## TODO: O servidor de e-mail 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: INSIRA O SMTP AQUI
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: INSIRA O NOME DE USUÁRIO AQUI
  DISCOURSE_SMTP_PASSWORD: INSIRA A SENHA AQUI
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true, usamos Amazon SES)

 

  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (obrigatório por alguns provedores)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (endereço para enviar notificações)

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

  ## O endereço CDN http ou https 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
  
  ## A chave de endereço IP do Maxmind para geolocalização para pesquisa de endereço IP
  ## consulte https://meta.discourse.org/t/-/137387/23 para detalhes
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## 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 você quiser definir o endereço de e-mail 'De' para seu primeiro registro, descomente e altere:
  ## Após receber o primeiro e-mail de inscrição, comente novamente a linha. Só precisa ser executado uma vez.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fim dos comandos personalizados"
  1. Após editar e salvar o arquivo, reconstrua o aplicativo Discourse usando o seguinte comando no terminal

$ /var/discourse/launcher rebuild discourse

Nota: se o seu arquivo YAML tiver outro nome, substitua discourse pelo nome do seu arquivo YAML.

Nota que a reconstrução leva tempo.

  1. Após o aplicativo ter sido reconstruído, ele deve estar em execução na porta 8080. Para verificar isso, execute o seguinte comando no terminal

$ sudo lsof -i -P -n | grep LISTEN

Exemplo de saída de portas

Observe que o Docker está escutando na porta 8080 e o httpd (Apache) está escutando na porta 80.

Em termos de roteamento de tráfego, o Apache receberá a solicitação web e, quando apropriado, será roteado para o contêiner do Discourse na porta 8080.

Para garantir que o roteamento ocorra, você deve configurar o host virtual no arquivo de configuração do Apache.

CONFIGURAÇÃO DE HOST VIRTUAL DO APACHE

  1. O arquivo de configuração do Apache está localizado em /etc/httpd/conf.d/00-virtualhosts.conf. httpd / apache / apache2 são versões diferentes do Apache. Seus arquivos podem estar em locais diferentes se você não estiver usando o serviço httpd, mas a configuração do host virtual, neste caso, será a mesma.

Opções de edição:

1. Você pode usar o nano e editar via linha de comando / terminal
2. Na AWS, se estiver usando MATE com PLUMA, pode usar o PLUMA para editar o arquivo
3. Você pode usar o WINSCP para fazer SSH na máquina e editar o arquivo via GUI do Windows

Edite o arquivo /etc/httpd/conf.d/00-virtualhosts.conf adicionando o seguinte:

# FAQ (ROTEAMENTO DO DISCOURSE)

<VirtualHost *:80>
  	ServerName  sub.domain.com
  	ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
  1. Você precisa criar o registro DNS CNAME relevante, apontando o subdomínio para seu servidor AWS / balanceador de carga.

Nossa configuração é um pouco complicada, pois temos nosso provedor de domínio que aponta e roteia todo o tráfego para um balanceador de carga AWS.

O balanceador de carga lida com nosso SSL/TLS por meio de um certificado fornecido pela AWS.

O balanceador de carga também roteia o tráfego para a instância AWS.

O Apache está instalado na instância AWS e roteia o tráfego para nossos:

  • Aplicações Node express
  • Aplicação Docker / Discourse.

CONCLUSÃO

Esta é apenas uma solução, mas é a que funcionou com nossa configuração existente.

Um grande agradecimento a:

@Kane York pelo seu artigo sobre o Discourse,
@Axel Fernandes pelo seu artigo no Medium, suas notas sobre o download dos arquivos necessários do Discourse e
@Vivek Gite da nixCraft e seu artigo no Cyberciti sobre a instalação do Docker no AWS Linux 2.