Querendo rodar o Discourse junto com o Apache

Vi alguns tutoriais que explicam como fazer isso, mas de maneiras diferentes, o que não me ajudou. Existe alguma forma de criar uma configuração de virtual host no Apache para o Discourse, de modo que um domínio específico seja redirecionado para o software, assim como ao adicionar outros sites e seus respectivos domínios?

Obrigado.

Sim. Esses tutoriais explicam como.

Ou, se você está perguntando se é possível rodar o Discourse sem Docker e usando o Apache como proxy reverso, a resposta é não.

Por US$ 5/mês, você evita essa dor de cabeça.

Obrigado pela resposta.

Estou executando em um VPS. Tenho o Apache instalado e não tenho muita experiência com sites. Estou olhando para isso: Run other websites on the same machine as Discourse

Mas com isso parece que preciso usar o Nginx por causa dos arquivos de configuração. Minha pergunta é: posso fazer o mesmo com o Apache?

Dê uma olhada em Set up Discourse on a server with existing Apache sites

É, eu estava olhando isso também. Ele cobriu para o CentOS e não para o Ubuntu, algumas partes estão pouco claras para mim.

Se você não está familiarizado com isso (e não quer se familiarizar), recomendo fortemente abandonar o Apache e rodar apenas o Discourse na VPS. Se precisar rodar mais coisas, adquira uma VPS para o Apache e outra para o Discourse.

Então, mudei para o Nginx e tudo está funcionando. Acredito que o SSL esteja configurado corretamente, mas no Chrome, aparece a mensagem “Sua conexão com este site não é totalmente segura”. O Forçar HTTPS está ativado.

O SSL está configurado com o serviço nginx dentro do contêiner. Se o contêiner for exposto à internet e você acessá-lo diretamente pelo navegador (instalação padrão do Discourse), você terá SSL.

Mas se você colocar um proxy reverso na frente dele (seja Apache, Nginx ou algum serviço de terceiros, como o Cloudflare), você precisará garantir que a conexão entre o navegador e o proxy reverso seja segura.

Portanto, no seu caso, você precisará gerar certificados para o proxy reverso nginx (não acho que seja necessário adicionar os modelos SSL do Discourse, pois o contêiner não está exposto diretamente à internet; você pode, mas não precisa).

Você pode verificar como fazer isso usando o Let’s Encrypt (gratuito, o mesmo usado na instalação padrão do Discourse, mas neste caso para o nginx fora do contêiner).

TL;DR O nginx que atua como proxy reverso precisa de SSL. O nginx que está dentro do contêiner não precisa de SSL (assumindo que você esteja acessando da mesma máquina).

Então, para garantir a segurança entre o navegador e o proxy reverso, preciso configurar o SSL no arquivo de configuração do nginx?

Obrigado.

Esta é minha configuração aqui, o que mais preciso adicionar?

server {
listen 80; listen [::]:80;
server_name a1rp.xyz; # ← altere isso

return 301 https://$host$request_uri;

}

server {
listen 443 ssl http2; listen [::]:443 ssl http2;
server_name a1rp.xyz; # ← altere isso

ssl on;
ssl_certificate      /var/discourse/shared/standalone/ssl/a1rp.xyz.cer;
ssl_certificate_key  /var/discourse/shared/standalone/ssl/a1rp.xyz.key;
ssl_dhparam          /var/discourse/shared/standalone/ssl/dhparams.pem;
ssl_session_tickets off;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;

http2_idle_timeout 5m; # aumentado do padrão de 3m

location / {
    proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock;
    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;
}

}

Certifique-se de:

  1. Comentar todos os modelos SSL em templates (em app.yml). Se você estiver usando o Let’s Encrypt, terá dois:
# - "templates/web.ssl.template.yml"
# - "templates/web.letsencrypt.ssl.template.yml"
  1. Adicionar um modelo de socket:
- "templates/web.socketed.template.yml" 
  1. Comentar todas as portas expostas:
# - "80:80"   # http
# - "443:443" # https

(ou você pode expor outras portas, como 8080:80 e 8443:443, e, em vez de usar um socket na próxima etapa, redirecionar para um upstream que aponte para localhost:80 e/ou localhost:443)

  1. Você tem:
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock;

Acho que você precisa adicionar : no final do socket:

proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
  1. Você precisa ter os arquivos de certificado SSL em /var/discourse/shared/standalone/ssl/. Você os possui? Estou assumindo que você já é dono do domínio a1rp.xyz e leu sobre como gerar certificados SSL no site do Let’s Encrypt. Além disso, lembre-se de que o Discourse gerencia a renovação dos certificados para você na instalação padrão, mas, no seu caso, você precisará lidar com isso (com um cronjob, por exemplo); caso contrário, seus certificados expirarão após 3 meses.

Veja:

Sim, tenho tudo o que você mencionou fazer na configuração do app (incluindo a postagem corrigindo algumas coisas). Quanto aos dois pontos (:), não acho que faça diferença. Houve uma postagem dizendo que não deveria haver dois pontos ali também. Os arquivos SSL eu já tenho.

Então, eu resolvi o problema. Alguém mencionou que o favicon aparecia em http, e por isso o erro ocorreu. Fiz o upload de outra imagem e a excluí; agora o site está totalmente em https :slight_smile: