Ho installato 1Panel su un VPS, ho configurato Discourse (deploy containerizzato) e ho impostato un reverse proxy utilizzando OpenResty (anch’esso deployato tramite container). Il dominio è gestito su Cloudflare con l’attivazione della CDN (la nuvoletta gialla). Di seguito riporto una guida per risolvere il problema per cui gli indirizzi IP degli utenti vengono mostrati come provenienti da Cloudflare invece che dal browser reale dell’utente.
I. Creare un’attività pianificata in 1Panel per scaricare settimanalmente l’elenco aggiornato degli IP di Cloudflare e salvarlo nella directory di configurazione di OpenResty.
-
Nel menu laterale sinistro di 1Panel, clicca su “Attività pianificate”.
-
Clicca sul pulsante “Crea attività pianificata” in alto a destra.
-
Compila i parametri come segue (puoi copiare e incollare direttamente):
-
Tipo di attività: seleziona Script Shell.
-
Nome attività: ad esempio
Aggiornamento automatico degli IP di Cloudflare. -
Ciclo di esecuzione: si consiglia di impostare su Settimanale (ad esempio ogni sabato alle 03:00 di notte).
-
Contenuto dello script: copia e incolla l’intero codice sottostante (Nota: modifica prima il nome del container e il percorso della directory di configurazione all’inizio dello script):
#!/bin/bash
# Area di configurazione
CONTAINER_NAME="Nome del container openresty in 1Panel"
# Modifica con la directory proxy specifica del sito
CONF_DIR="/opt/1panel/www/sites/www.tuodominio/proxy"
echo "[$(date)] Inizio recupero degli ultimi IP da Cloudflare..."
TEMP_DIR=$(mktemp -d)
# Recupera e converti la lista IP nel formato riconosciuto 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
# Verifica 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: impossibile recuperare gli IP di Cloudflare!"
rm -rf $TEMP_DIR
exit 1
fi
rm -rf $TEMP_DIR
# Testa e ricarica Nginx
echo "[$(date)] Esecuzione test configurazione Nginx..."
if docker exec $CONTAINER_NAME nginx -t; then
docker exec $CONTAINER_NAME nginx -s reload
echo "[$(date)] Successo! Ricarica configurazione OpenResty completata."
else
echo "[$(date)] Fallito! Il test della configurazione Nginx non è andato a buon fine."
exit 1
fi
Una volta creata l’attività, non è necessario attendere il sabato; puoi testarla immediatamente: trova l’attività appena creata nell’elenco delle “Attività pianificate”.
Clicca sul pulsante “Report” a destra. Controlla la finestra dei log che appare. Se nelle ultime righe compare Successo! Ricarica configurazione OpenResty completata, significa che l’intero processo è stato eseguito correttamente all’interno di 1Panel!
II. Configurazione aggiuntiva realip in OpenResty
Nella directory /opt/1panel/www/sites/www.tuodominio/proxy/ sulla macchina host, crea un nuovo file (il nome è a tua scelta, purché termini con .conf; verrà caricato automaticamente dalla configurazione principale tramite include *.conf): realip.conf
real_ip_header CF-Connecting-IP;
real_ip_recursive on;
III. Ricarica OpenResty
docker exec Nome_del_container_openresty_in_1Panel nginx -t
docker exec Nome_del_container_openresty_in_1Panel nginx -s reload
IV. Verifica se OpenResty ha recuperato l’IP reale
Controlla il file access log di OpenResty:
tail -f /opt/1panel/www/sites/www.tuodominio/log/access.log
Se la configurazione è corretta, il primo IP nei log dovrebbe essere il tuo vero IP pubblico, e non un indirizzo della rete 173.245.x.x di Cloudflare.
V. Note per la configurazione di Discourse
L’aggiunta di - "templates/cloudflare.template.yml" nel file app.yml di Discourse è efficace solo se Discourse è esposto direttamente a Cloudflare. Poiché è stato inserito un reverse proxy OpenResty intermedio, il container di Discourse vede come IP di origine l’indirizzo del gateway Docker (ad esempio 172.17.0.1 o 172.18.0.1), quindi le direttive set_real_ip_from <CloudflareIP> presenti in quel template non verranno abbinati.
Tuttavia, seguendo i passaggi sopra descritti per ripristinare l’IP reale a livello di OpenResty e trasmettere un header X-Forwarded-For pulito, il backend Rails di Discourse sarà in grado di identificare correttamente l’IP reale dell’utente, poiché Rails riconosce di default come attendibili gli indirizzi della rete privata Docker del tipo 172.x.x.x.
Di conseguenza, non è necessario aggiungere - "templates/cloudflare.template.yml" nel file app.yml di Discourse.