Executando Discourse com WordPress (Docker) em uma única VPS usando Nginx Reverse Proxy

Introdução

Por padrão, uma instalação “standalone” do Discourse se vincula às portas 80 e 443. Para hospedar outra aplicação como o WordPress no mesmo servidor, você deve reconfigurar o Discourse para escutar em uma porta interna e usar um Nginx em nível de Host como Proxy Reverso para gerenciar o tráfego e os certificados SSL.


1. Visão Geral da Arquitetura

  • Nginx do Host: O gateway principal que escuta nas portas 80 e 443. Ele lida com a terminação SSL e roteia as requisições para o contêiner apropriado com base no server_name.

  • Contêiner do Discourse: Reconfigurado para escutar em localhost:8080.

  • Contêiner do WordPress: Gerenciado via Docker Compose, escutando em localhost:8081.


2. Fase A: Reconfigurando o Discourse

Modifique seu /var/discourse/containers/app.yml para liberar as portas públicas:

  1. Alterar Mapeamento de Porta:

    YAML

    expose:
      - "8080:80"   # Mapeia a porta 8080 do host para a porta 80 do contêiner
    
    
  2. Desativar SSL Interno: Comente os modelos de SSL e Let’s Encrypt:

    YAML

    templates:
      - "templates/postgres.template.yml"
      - "templates/redis.template.yml"
      - "templates/web.template.yml"
      # - "templates/web.ssl.template.yml"
      # - "templates/web.letsencrypt.ssl.template.yml"
    
    
  3. Recompilar: Execute ./launcher rebuild app.


3. Fase B: Implantando o WordPress via Docker Compose

Organize seu site WordPress em um diretório dedicado. Garanta que o volume do banco de dados seja persistente para evitar perda de dados.

YAML

services:
  db:
    image: mariadb:10.11
    environment:
      MYSQL_ROOT_PASSWORD: 'your_secure_password'
    volumes:
      - ./mysql_data:/var/lib/mysql
  wordpress:
    image: wordpress:latest
    ports:
      - "8081:80"
    volumes:
      - .:/var/www/html


4. Fase C: Configuração Final do Nginx (SSL e Porta 443)

Uma configuração profissional em 2025 exige suporte total a HTTPS e HTTP/2. Após instalar o Nginx no seu host (sudo apt install nginx), crie uma configuração para seus domínios.

Dica Profissional: Execute sudo certbot --nginx para gerar automaticamente os blocos SSL, mas certifique-se de que eles incluam os seguintes cabeçalhos de proxy para que o Discourse funcione corretamente.

Nginx

server {
    listen 443 ssl http2;
    server_name discourse.com;

    # Certificados SSL pelo Certbot
    ssl_certificate /etc/letsencrypt/live/discourse.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/discourse.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; # Crucial para a detecção de HTTPS do Discourse
    }
}


5. Lições Difíceis e Melhores Práticas

  • Credenciais do Banco de Dados: Se suas senhas contiverem caracteres especiais como & ou ?, sempre as coloque entre aspas simples ' ' em seus arquivos de configuração e comandos de terminal para evitar erros de interpretação do shell.

  • Permissões de Arquivo: Contêineres WordPress são executados como www-data (UID 33). Se você fizer upload ou descompactar arquivos como root, deverá executar chown -R 33:33 . para evitar Erros Internos do Servidor 500.

  • Configurações do Cloudflare: Ao usar um certificado SSL no servidor (Let’s Encrypt), defina o SSL/TLS do Cloudflare como Full (Strict). Isso evita o loop “Muitos Redirecionamentos” comumente causado pelo modo “Flexible”.

  • Volumes Persistentes: Nunca execute docker compose down ou rebuild sem verificar se os arquivos do seu banco de dados estão armazenados em um volume persistente (ex: ./mysql_data).


Conclusão: Desacoplar seus aplicativos das portas 80/443 usando um Proxy Reverso é a maneira mais escalável de gerenciar um VPS com múltiplos sites. Isso permite o gerenciamento centralizado de SSL e depuração fácil através dos logs do Nginx em nível de host.

2 curtidas