Ho installato 1Panel sul mio VPS, ho installato Discourse (deploy in container) e ho configurato un reverse proxy utilizzando OpenResty (deploy in container). Il dominio è ospitato su Cloudflare con il servizio CDN (nuvola gialla) attivato. Di seguito la soluzione per il problema in cui l’IP dell’utente viene visualizzato come proveniente da Cloudflare invece che dall’IP reale del browser dell’utente.
1. Creare una pianificazione di task in 1Panel per scaricare settimanalmente l’elenco più recente degli IP di Cloudflare e salvarlo nella directory di configurazione di OpenResty.
-
Nella barra del menu laterale sinistro di 1Panel, clicca su “Pianificazione di task”.
-
Clicca su “Crea pianificazione di task” nell’angolo in alto a destra.
-
Compila i parametri come segue (puoi copiare e incollare direttamente):
-
Tipo di task: seleziona Script Shell.
-
Nome del task: ad esempio
Aggiornamento automatico degli intervalli IP di Cloudflare. -
Ciclo di esecuzione: si consiglia di selezionare Settimanale (ad esempio, ogni sabato alle 03:00).
-
Contenuto dello script: copia e incolla il codice completo qui sotto (Nota: modifica prima il nome del container e il percorso della directory di configurazione all’inizio del codice):
#!/bin/bash
# Area di configurazione
CONTAINER_NAME="Nome del container OpenResty in 1Panel"
# Modifica con la directory proxy del sito specificato
CONF_DIR="/opt/1panel/www/sites/www.il-tuo-dominio.club/proxy"
echo "[$(date)] Inizio recupero degli intervalli IP più recenti da Cloudflare..."
TEMP_DIR=$(mktemp -d)
# Recupera e converte l'elenco degli IP in formato leggibile da Nginx
curl -fsS https://www.cloudflare.com/ips-v4 | sed 's/.*/set_real_ip_from &;/' > $TEMP_DIR/cf-ips-v4.conf
curl -fsS https://www.cloudflare.com/ips-v6 | sed 's/.*/set_real_ip_from &;/' > $TEMP_DIR/cf-ips-v6.conf
# Controlla e sposta i file
if [[ -s $TEMP_DIR/cf-ips-v4.conf ]] && [[ -s $TEMP_DIR/cf-ips-v6.conf ]]; then
mv $TEMP_DIR/cf-ips-v4.conf $CONF_DIR/
mv $TEMP_DIR/cf-ips-v6.conf $CONF_DIR/
echo "[$(date)] File di configurazione aggiornati con successo in $CONF_DIR."
else
echo "[$(date)] Errore: recupero degli IP di Cloudflare fallito!"
rm -rf $TEMP_DIR
exit 1
fi
rm -rf $TEMP_DIR
# Test e reload di Nginx
echo "[$(date)] Inizio test della configurazione di Nginx..."
if docker exec $CONTAINER_NAME nginx -t; then
docker exec $CONTAINER_NAME nginx -s reload
echo "[$(date)] Successo! Configurazione di OpenResty ricaricata."
else
echo "[$(date)] Fallimento! Test della configurazione di Nginx non superato."
exit 1
fi
Una volta creato il task, non è necessario aspettare il sabato: puoi testare immediatamente. Trova il task appena creato nell’elenco delle “Pianificazioni di task”.
Clicca sul pulsante “Report” a destra. Visualizza la finestra del log che appare. Se le ultime righe mostrano Successo! Configurazione di OpenResty ricaricata, significa che l’intero flusso è stato eseguito perfettamente all’interno di 1Panel!
2. Configurazione aggiuntiva realip per OpenResty
Crea un nuovo file nella directory /opt/1panel/www/sites/www.il-tuo-dominio/proxy/ sull’host (il nome del file può essere qualsiasi, purché finisca con .conf, in modo che venga caricato automaticamente dall’include *.conf della configurazione principale): realip.conf
# Usa il percorso all'interno del container
include /www/sites/www.il-tuo-dominio/proxy/cf-ips-v4.conf;
include /www/sites/www.il-tuo-dominio/proxy/cf-ips-v6.conf;
real_ip_header CF-Connecting-IP;
real_ip_recursive on;
3. Ricarica OpenResty
docker exec Nome del container OpenResty in 1Panel nginx -t
docker exec Nome del container OpenResty in 1Panel nginx -s reload
4. Verifica che OpenResty abbia ottenuto l’IP reale
Visualizza il log di accesso di OpenResty:
tail -f /opt/1panel/www/sites/www.il-tuo-dominio/log/access.log
Se la configurazione è corretta, il primo IP nel log dovrebbe diventare il tuo IP pubblico reale, anziché intervalli come 173.245.x.x di Cloudflare.
5. Lato Discourse
Modifica app.yml e aggiungi il seguente contenuto all’interno del blocco run::
# Dopo il deploy di Discourse in Docker, è necessario aggiungere i seguenti tre blocchi per garantire la trasmissione dell'IP reale degli utenti del forum
- file:
path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-docker.conf
chmod: 644
contents: |
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 127.0.0.1;
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
chmod: 644
contents: |
real_ip_header x-forwarded-for;
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
chmod: 644
contents: |
real_ip_recursive on;
In questo modo, Nginx integrato in Discourse:
- Fiderà la sottorete Docker (
172.16.0.0/12) - Leggerà l’IP reale da
x-forwarded-for - Analizzerà ricorsivamente più livelli di proxy
6. Note
L’aggiunta di - "templates/cloudflare.template.yml" in app.yml di Discourse è efficace solo quando Discourse è direttamente esposto a Cloudflare. Poiché è stato aggiunto un reverse proxy OpenResty intermedio, l’IP di origine visto dal container di Discourse è in realtà il gateway Docker (ad esempio 172.17.0.1 o 172.18.0.1), quindi il set_real_ip_from <CloudflareIP> all’interno di quel template non corrisponderà.
Pertanto, non è necessario aggiungere - "templates/cloudflare.template.yml" in app.yml di Discourse.
Aggiornamento 03-07-2026