Discourse não carrega com Apache e redirecionamento de proxy

Nos últimos dias, tenho tentado encontrar uma maneira de integrar o Discourse com o Apache no mesmo droplet da DigitalOcean, mas os tutoriais disponíveis aqui no Discourse estão desatualizados ou não se aplicam ao meu caso. Um tutorial usa CentOS e HAProxy (eu uso Ubuntu) e o outro usa Nginx (eu uso Apache).

Encontrei um comentário em um tópico da DigitalOcean e segui as instruções lá em um droplet de teste: Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean

Tudo parece ter funcionado sem problemas, incluindo o SSL do Let’s Encrypt. Minha página inicial e alguns documentos HTML estáticos funcionam perfeitamente. O Discourse, apesar de ter sido instalado sem erros, não aparece. Ao acessar community.mysite.com, vejo apenas minha página inicial com HTTPS não seguro na URL. Sim, minhas configurações de DNS estão corretas e apontam para o servidor certo.

Este é o meu mysite.com.conf:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /var/www/mysite.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    RewriteEngine on
    RewriteCond %{SERVER_NAME} =www.mysite.com [OR]
    RewriteCond %{SERVER_NAME} =mysite.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Este é o meu mysite.com-le-ssl.conf:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /var/www/mysite.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

Este é o meu community.mysite.com.conf:

<VirtualHost *:80>
  ServerName community.mysite.com
  ServerAlias www.community.mysite.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>

E, finalmente, aqui está o meu app.yml (editado, é claro):

## 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:
      - "8080:80"   # encaminha a porta 8080 do host para a porta 80 do contêiner (http)
      - "8443:443"   # encaminha a porta 8443 do host para a porta 443 do contêiner (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: "128MB"

  ## 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 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: 2

  ## 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: community.mysite.com

  ## Descomente se quiser que o contêiner seja iniciado com o mesmo
  ## nome de host (-h option) 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: 'myemail'

  ## 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: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: my-smtp-username
  DISCOURSE_SMTP_PASSWORD: "my-smtp-password"
  #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: myemail

  ## 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 é stateless; 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'"
  - exec: echo "Fim dos comandos personalizados"

Alguém pode me dizer onde errei nisso ou o que estou esquecendo? Obrigado!

Você terá muito mais sorte ao tentar usar o nginx como proxy reverso.

Se o seu sistema permitir, considere usar o nginx em vez do apache2.

Então, a comunidade não redireciona para seu domínio, mas aponta para seu IP. O symlink está presente em /etc/apache2/sites-enabled/?

O módulo proxy está carregado?
apache2ctl -M

Nenhum link simbólico.

Sim. Felizmente, essa é uma das etapas do tutorial que linkei.

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests

o passo

a2ensite community.yoursite.com

pode não ter dado certo na ocasião; talvez seja necessário usar sudo.

sudo ln -s /etc/apache2/sites-available/community.yoursite.com.conf /etc/apache2/sites-enabled/

também deve resolver.
Em seguida,

sudo apachectl configtest

e torça para dar certo:

sudo systemctl restart apache2

Prezado @OrbitStorm,

Dediquei um momento para analisar sua configuração de hosts virtuais Apache2 e seu arquivo yml para o Discourse, e parece que eles não estão configurados corretamente.

Aqui estão algumas dicas:

Primeiro, ao executar o Discourse atrás de um proxy reverso, você não deve habilitar o SSL LETSENCRYPT na configuração do arquivo yml do Discourse (veja o exemplo funcional abaixo). O Discourse precisa apenas de uma única porta para se comunicar com o proxy reverso, e essa conexão não é criptografada por SSL.

Segundo, se você observar a configuração do seu host virtual principal, que é a porta 443 no proxy reverso:

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

       Include /etc/letsencrypt/options-ssl-apache.conf
       SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
       SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

A configuração acima está faltando todas as informações necessárias de proxy reverso (veja as configurações funcionais em anexo abaixo).

Aqui está uma configuração funcional para você, que é basicamente a mesma descrita nos vários tutoriais no meta (bem documentada neste site em outros posts, então isso é basicamente duplicar outra documentação aqui no meta):

<VirtualHost *:80>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On
        ErrorLog ${APACHE_LOG_DIR}/discourse_errors.log
        CustomLog ${APACHE_LOG_DIR}/discourse.log combined
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =discourse.your-great-web-site.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Observe que na configuração da porta 80, as diretivas principais necessárias são ServerName, RewriteEngine e as regras de reescrita para redirecionar para a porta 443.

Além disso, se você estiver executando o mod_pagespeed do Apache2, deve desativá-lo, pois ainda não consegui fazer o mod_pagespeed funcionar com o Discourse (e não vejo motivo para fazê-lo).

Aqui está a configuração principal, onde o “trabalho real” é feito:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        SSLProxyEngine on      # habilite isso apenas após configurar e verificar que o Let's Encrypt está funcionando
  	    RewriteEngine on
  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/           # não usamos porta, usamos sockets your-great-web-site
        #ProxyPassReverse / http://127.0.0.1:8888/    # não usamos porta, usamos sockets your-great-web-site
        ProxyPass / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        ErrorLog ${APACHE_LOG_DIR}/discourse_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/discourse_ssl.log combined   #log de acesso desativado para produção

        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/discourse.your-great-web-site.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/discourse.your-great-web-site.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Todas as nossas configurações do Discourse usam sockets de domínio Unix, então você precisará alterar a configuração para corresponder à sua configuração desejada.

O ponto principal a entender (em resumo) é que você deve desabilitar o LETSENCRYPT na configuração da sua compilação do Discourse (yml) e expor apenas um único ponto de entrada para o Discourse. No nosso caso, um socket de domínio Unix; no seu caso, um único socket TCP/IP.

Em seguida, você faz o proxy reverso para esse ponto de entrada a partir do arquivo de host virtual da porta 443 (não do host virtual da porta 80). O host virtual da porta 80 simplesmente redireciona para a porta 443. Todo o SSL da porta 443 é feito pelo LETSENCRYPT no proxy reverso. Não há necessidade de SSL no seu arquivo yml do Discourse (veja o exemplo funcional abaixo).

Aqui está um dos nossos arquivos yml funcionais (para a configuração acima) para você revisar:

/var/discourse/containers$ cat socket-only.yml
# IMPORTANTE: DEFINA UMA SENHA SECRETA no Postgres para o Usuário do Discourse
# TODO: altere SOME_SECRET neste modelo

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
#  - "templates/sshd.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ê quiser que o Discourse compartilhe uma porta com outro servidor web como Apache ou nginx,
## veja https://meta.discourse.org/t/17247 para detalhes
expose:
#  - "80:80"   # http
#  - "443:443" # https

# Use a chave 'links' para vincular containers, ou seja, use a flag Docker --link.
links:
  - link:
      name: data
      alias: data

# algum argumento extra para o Docker?
# docker_args:

params:
  ## Qual revisão do Git este container deve usar? (padrão: tests-passed)
  #version: latest
  db_shared_buffers: "4GB"

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
  UNICORN_WORKERS: 8

  ## TODO: O nome de domínio ao qual esta instância do Discourse responderá
  DISCOURSE_HOSTNAME: 'discourse.your-great-web-site.com'

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

  ## TODO: Lista de e-mails delimitados por vírgula que serão definidos como administradores e desenvolvedores
  ## no cadastro inicial, exemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'tim@discourse.your-great-web-site.com'

  ## 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: smtp.gmail.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: not_for_reply@discourse.your-great-web-site.com
  DISCOURSE_SMTP_PASSWORD: my_super_secret_cool_password
  #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: me@example.com

  ## TODO: configurar conectividade com os bancos de dados
  DISCOURSE_DB_SOCKET: ''
  #DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: another_super_secret_cool_password
  DISCOURSE_DB_HOST: data
  DISCOURSE_REDIS_HOST: data

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

volumes:
  - volume:
      host: /var/discourse/shared/socket-only
      guest: /shared
  - volume:
      host: /var/discourse/shared/socket-only/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
          - git clone https://github.com/discourse/discourse-bbcode.git
          - git clone https://github.com/discourse/discourse-sitemap.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/unixneo/legacy-info.git

## Lembre-se, esta é a sintaxe YAML - você só pode ter um bloco com um nome
run:
  - exec: echo "Início dos comandos personalizados"

  ## Se quiser configurar login por senha para root, descomente e altere:
  ## Use apenas uma das seguintes linhas:
  #- exec: /usr/sbin/usermod -p 'PASSWORD_HASH' root
  #- exec: /usr/sbin/usermod -p "$(mkpasswd -m sha-256 'RAW_PASSWORD')" root

  ## Se quiser autorizar usuários adicionais, descomente e altere:
  #- exec: ssh-import-id username
  #- exec: ssh-import-id anotherusername

  - exec: echo "Fim dos comandos personalizados"
  #- exec: awk -F\# '{print $1;}' ~/.ssh/authorized_keys | awk 'BEGIN { print "Chaves SSH autorizadas para este container:"; } NF>=2 {print $NF;}'

É realmente fácil assim que você entende o básico; e entender o básico ajuda bastante :slight_smile:

Por favor, tenha em mente que, em nossas configurações do Discourse, não executamos um único container (na verdade, raramente operamos no modo de container único), então nosso arquivo yml não funcionará em uma configuração de container único (autônomo). Estou fornecendo isso para você como referência para ajudá-lo, mostrando como uma configuração totalmente funcional atrás do Apache2 se parece.

Executamos o Discourse atrás de proxies reversos tanto Apache2 quanto nginx. Na verdade, usamos apenas proxies reversos por muitos motivos. Um deles é que podemos usar o proxy reverso para filtrar bots maliciosos, etc (um assunto totalmente diferente).

Não há nada difícil em executar o Discourse em Docker (quantos sites quiser, um ou 100) atrás de um proxy reverso em um site com Apache2; mas ajuda a entender os conceitos básicos.

Espero que fornecer a você tanto os conceitos básicos quanto os arquivos de configuração funcionais ajude você a avançar e colocar o Discourse em funcionamento.

Atenciosamente…

@neounix Agradeço muito a resposta extremamente detalhada, mas parece que a maioria dos problemas que estou enfrentando resulta da incapacidade de encontrar um tutorial atualizado adequado. Vários tutoriais aqui dizem para habilitar o SSL para o Discourse no arquivo yml, e um desses tutoriais afirma que não é necessário adicionar informações de proxy aos meus arquivos VirtualHost, pois o Let’s Encrypt deveria fazer isso automaticamente. Seus exemplos são drasticamente diferentes até mesmo das minhas configurações padrão, tornando-os tão confusos quanto tentar mesclar uma configuração do CentOS com a do Ubuntu.

Você tem toda razão ao dizer que entender os fundamentos ajuda muito, mas o problema é que os fundamentos não são cobertos adequadamente e, quando são, estão desatualizados há três anos e sem considerar que alguém usa Apache em vez de Nginx ou Ubuntu em vez de CentOS. Vale ressaltar também que o Discourse é o único motivo pelo qual tenho qualquer utilidade para o Docker.

Depois de passar quatro dias apenas tentando instalar o aplicativo junto com o Apache, desisto. Seja gratuito ou não, isso não vale a dor de cabeça e não vou continuar vasculhando os fóruns apenas para encontrar links copiados e colados para os mesmos dois tutoriais desatualizados e incompletos. Nunca tive uma experiência tão frustrante apenas instalando software de fórum até o Discourse. Isso diz muito. XenForo e Invision são duas plataformas com as quais tenho experiência imensurável, e são fáceis de instalar e usar.

Realmente aprecio o esforço que você dedicou à sua resposta, mas não vou pedir que você faça o trabalho por mim, nem deveria ter que fazê-lo se existisse documentação adequada. É simplesmente incrível para mim que minhas circunstâncias específicas, que não são tão específicas assim, não tenham sido destacadas em um novo tutorial que tornaria esse processo mais fácil para novos usuários.

De qualquer forma, boa sorte para você.

Apesar de ter toda a intenção de seguir em frente com o Discourse, dada a completa falta de documentação atual que não seja hiperfocada em CentOS/Nginx, uma pessoa incrivelmente generosa e paciente da DigitalOcean respondeu a um tópico que criei lá e, após alguns testes e erros, ajudou a montar um tutorial simples de seguir para usuários prospectivos do Discourse nas mesmas circunstâncias que as minhas.

Como lembrete, essas circunstâncias são:

Instalando o Discourse no mesmo servidor que o Apache | Usando Ubuntu 18.04 | DigitalOcean

créditos a Bobbyiliev @ DigitalOcean
Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean (primeira resposta)

Pré-requisitos

  • Para garantir a segurança, faça backup do seu Droplet, para que, caso algo dê errado, você possa reverter para uma versão funcional
  • Acesse seu Droplet via SSH
  • Apache instalado; você pode seguir os passos para fazer isso aqui:

Passo 1 - Instalar o Docker

Para instalar o Docker, siga os passos aqui:

Passo 2 - Baixar o Discourse

Primeiro, crie um diretório onde você armazenará os arquivos do Discourse:

mkdir /var/discourse

Em seguida, clone a imagem oficial do Docker do Discourse para /var/discourse.

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

Passo 3 - Configurar o Discourse para escutar na porta 8080

Usaremos o modelo standalone.yml, que inclui todos os serviços necessários, como PostgreSQL, Redis, entre outros.

Copie o arquivo de exemplo com o seguinte comando:

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

Depois, edite o arquivo com seu editor favorito. Abra /var/discourse/containers/app.yml e atualize as portas nas linhas 23 e 24:

## quais portas TCP/IP este container deve expor?
expose:
  - "8080:80"   # encaminha a porta 8080 do host para a porta 80 do container (http)
  - "8443:443"   # encaminha a porta 8443 do host para a porta 443 do container (https)

Além disso, se você ainda não possui um certificado SSL, certifique-se de comentar a linha 16:

  #- "templates/web.ssl.template.yml"

Basta adicionar o símbolo # antes da linha - "templates/web.ssl.template.yml", caso contrário o Discourse não iniciará.

Passo 4 - Configurar o Discourse

Mude o diretório:

cd /var/discourse

Em seguida, inicie o Discourse (como esta é a primeira vez que você está iniciando o serviço, ele irá inicializar o aplicativo com as novas alterações que você fez no seu arquivo app.yml):

./discourse-setup

Observação: Certifique-se de fornecer configurações válidas do servidor de e-mail; caso contrário, a configuração pode falhar.

Passo 5 - Configurar o Apache

Em /etc/apache2/sites-available/, crie um novo arquivo chamado forum.exemplo.com.conf e adicione o seguinte conteúdo de Vhost:

<VirtualHost *:80>
  ServerName forum.exemplo.com
  ServerAlias www.forum.exemplo.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>
  • Ative o Vhost com o seguinte comando:
a2ensite forum.exemplo.com
  • Ative o módulo Proxy:
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests
  • Reinicie o Apache:
systemctl restart apache2

Após isso, você poderá acessar o Discourse diretamente pelo nome do seu domínio.


Observação 1: Ao instalar o Discourse, o arquivo app.yml pode ser sobrescrito e as linhas 16/17 (SSL) serão descomentadas. Você precisará comentá-las novamente e depois reconstruir o aplicativo (não se esqueça de mudar o diretório): ./launcher rebuild app

Observação 2: O SSL não está habilitado para o Discourse com este guia. Não surpreendentemente, parece não existir documentação para habilitar o SSL do Let’s Encrypt se você já o tiver habilitado para o Apache. Se alguém encontrar uma solução para isso, por favor, entre em contato.