Ejecutando Discourse con WordPress (Docker) en un único VPS usando Nginx Reverse Proxy

Introducción

Por defecto, una instalación “standalone” de Discourse se enlaza a los puertos 80 y 443. Para alojar otra aplicación como WordPress en el mismo servidor, debe reconfigurar Discourse para que escuche en un puerto interno y utilizar un Nginx a nivel de Host como Proxy Inverso para gestionar el tráfico y los certificados SSL.


1. Descripción General de la Arquitectura

  • Nginx del Host: La puerta de enlace principal que escucha en los puertos 80 y 443. Maneja la terminación SSL y enruta las solicitudes al contenedor apropiado basándose en el server_name.

  • Contenedor de Discourse: Reconfigurado para escuchar en localhost:8080.

  • Contenedor de WordPress: Gestionado a través de Docker Compose, escuchando en localhost:8081.


2. Fase A: Reconfiguración de Discourse

Modifique su /var/discourse/containers/app.yml para ceder los puertos públicos:

  1. Cambiar el Mapeo de Puertos:

    YAML

    expose:
      - "8080:80"   # Mapea el puerto 8080 del host al puerto 80 del contenedor
    
    
  2. Deshabilitar SSL Interno: Comente las plantillas de SSL y 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. Reconstruir: Ejecute ./launcher rebuild app.


3. Fase B: Despliegue de WordPress mediante Docker Compose

Organice su sitio de WordPress en un directorio dedicado. Asegúrese de que el volumen de la base de datos sea persistente para evitar la pérdida de datos.

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: Configuración Final de Nginx (SSL y Puerto 443)

Una configuración profesional en 2025 requiere soporte completo HTTPS y HTTP/2. Después de instalar Nginx en su host (sudo apt install nginx), cree una configuración para sus dominios.

Consejo Profesional: Ejecute sudo certbot --nginx para generar automáticamente los bloques SSL, pero asegúrese de que incluyan las siguientes cabeceras de proxy para que Discourse funcione correctamente.

Nginx

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

    # Certificados SSL por 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 la detección HTTPS de Discourse
    }
}


5. Lecciones Aprendidas y Mejores Prácticas

  • Credenciales de Base de Datos: Si sus contraseñas contienen caracteres especiales como & o ?, envuélvalas siempre entre comillas simples ' ' en sus archivos de configuración y comandos de terminal para evitar errores de interpretación de la shell.

  • Permisos de Archivo: Los contenedores de WordPress se ejecutan como www-data (UID 33). Si sube o descomprime archivos como root, debe ejecutar chown -R 33:33 . para evitar Errores Internos del Servidor 500.

  • Configuración de Cloudflare: Cuando utilice un certificado SSL en el servidor (Let’s Encrypt), configure SSL/TLS de Cloudflare en Full (Strict). Esto previene el bucle de “Demasiadas Redirecciones” comúnmente causado por el modo “Flexible”.

  • Volúmenes Persistentes: Nunca ejecute docker compose down o rebuild sin verificar que los archivos de su base de datos se almacenan en un volumen persistente (ejemplo: ./mysql_data).


Conclusión: Desacoplar sus aplicaciones de los puertos 80/443 utilizando un Proxy Inverso es la forma más escalable de gestionar un VPS multi-sitio. Permite una gestión centralizada de SSL y una fácil depuración a través de los registros de Nginx a nivel de host.

2 Me gusta