Esecuzione di Discourse con WordPress (Docker) su un singolo VPS usando Nginx Reverse Proxy

Introduzione

Per impostazione predefinita, un’installazione “standalone” di Discourse si collega alle porte 80 e 443. Per ospitare un’altra applicazione come WordPress sullo stesso server, è necessario riconfigurare Discourse affinché ascolti su una porta interna e utilizzare un Nginx a livello di Host come Proxy Inverso per gestire il traffico e i certificati SSL.


1. Panoramica dell’Architettura

  • Nginx Host: Il gateway principale che ascolta sulle porte 80 e 443. Gestisce la terminazione SSL e instrada le richieste al container appropriato in base al server_name.

  • Container Discourse: Riconfigurato per ascoltare su localhost:8080.

  • Container WordPress: Gestito tramite Docker Compose, in ascolto su localhost:8081.


2. Fase A: Riconfigurazione di Discourse

Modificare il file /var/discourse/containers/app.yml per rilasciare le porte pubbliche:

  1. Modifica del Mapping delle Porte:

    YAML

    expose:
      - "8080:80"   # Mappa la porta host 8080 alla porta container 80
    
    
  2. Disattivazione dell’SSL Interno: Commentare i template 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. Ricostruzione: Eseguire ./launcher rebuild app.


3. Fase B: Distribuzione di WordPress tramite Docker Compose

Organizzare il sito WordPress in una directory dedicata. Assicurarsi che il volume del database sia persistente per prevenire la perdita di dati.

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: Configurazione Finale di Nginx (SSL e Porta 443)

Una configurazione professionale nel 2025 richiede il pieno supporto HTTPS e HTTP/2. Dopo aver installato Nginx sul proprio host (sudo apt install nginx), creare una configurazione per i propri domini.

Suggerimento Pro: Eseguire sudo certbot --nginx per generare automaticamente i blocchi SSL, ma assicurarsi che includano le seguenti intestazioni proxy affinché Discourse funzioni correttamente.

Nginx

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

    # Certificati SSL di 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; # Cruciale per il rilevamento HTTPS di Discourse
    }
}


5. Lezioni Apprese a Caro Prezzo e Best Practice

  • Credenziali del Database: Se le password contengono caratteri speciali come & o ?, racchiuderle sempre tra virgolette singole ' ' nei file di configurazione e nei comandi del terminale per prevenire errori di interpretazione della shell.

  • Permessi dei File: I container WordPress vengono eseguiti come www-data (UID 33). Se si caricano o si decomprimono file come root, è necessario eseguire chown -R 33:33 . per evitare errori 500 Internal Server Error.

  • Impostazioni di Cloudflare: Quando si utilizza un certificato SSL sul server (Let’s Encrypt), impostare SSL/TLS di Cloudflare su Full (Strict). Ciò impedisce il loop “Troppi Reindirizzamenti” comunemente causato dalla modalità “Flexible”.

  • Volumi Persistenti: Non eseguire mai docker compose down o rebuild senza verificare che i file del database siano memorizzati in un volume persistente (ad esempio, ./mysql_data).


Conclusione: Dissociare le applicazioni dalle porte 80/443 utilizzando un Proxy Inverso è il modo più scalabile per gestire un VPS multi-sito. Consente la gestione centralizzata dell’SSL e un facile debug tramite i log di Nginx a livello di host.

2 Mi Piace