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:
-
Cambiar el Mapeo de Puertos:
YAML
expose: - "8080:80" # Mapea el puerto 8080 del host al puerto 80 del contenedor -
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" -
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 comoroot, debe ejecutarchown -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 downorebuildsin 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.