Ciao, ho distribuito Discourse sul mio server, tutto funziona normalmente tranne il rilevamento dell’indirizzo IP dell’utente, ho persino creato uno script PHP (fuori dal container Docker) per ottenere tutte le intestazioni in cui può trovarsi l’IP:
Dettagli:
Il server ha installato il pannello BrainyCP con Apache e Nginx (attualmente il sito web utilizza Nginx, che funge da reverse proxy per il container Docker) HTTP_CF_CONNECTING_IP restituisce 127.0.0.1 all’interno del container Docker, ma all’esterno hanno valori normali
Senza modificare l’intestazione utilizzando comandi personalizzati, Discourse visualizza l’IP del server.
(Presto aggiungerò maggiori dettagli poiché la mia istanza di Discourse è in fase di ricostruzione)
Ricostruito, ma mostra ancora l’IP del server (ho commentato i comandi personalizzati
## Qualsiasi comando personalizzato da eseguire dopo la compilazione
run:
- exec: echo "Inizio dei comandi personalizzati"
## Se desideri impostare l'indirizzo email 'Da' per la tua prima registrazione, decommenta e modifica:
## Dopo aver ricevuto la prima email di iscrizione, ri-commenta la riga. Deve essere eseguita solo una volta.
- exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
#- replace:
# filename: /etc/nginx/conf.d/discourse.conf
# from: "types {"
# to: |
# set_real_ip_from 85.25.134.45;
# real_ip_header CF-Connection-IP;
# real_ip_recursive on;
# types {
#- replace:
# filename: /etc/nginx/conf.d/discourse.conf
# from: $proxy_add_x_forwarded_for
# to: $send_http_cf_connection_ip;
# global: true
- exec: echo "Fine dei comandi personalizzati"
Devo decommentarli? (voglio anche notare che non hanno funzionato nemmeno prima che aggiungessi il template cloudflare a app.yml))
Ho già aggiunto cloudflare.template.yml che aggiunge direttive realip, ma non funziona ancora.
Ho persino rimosso comandi personalizzati che cambiano in header personalizzato e ora Discourse segnala l’IP del server per tutti gli utenti invece di localhost.
Inoltre, vorrei segnalare il “percorso” della richiesta: Utente -> Cloudflare -> Server(Nginx -> Docker -> Discourse)
E nota che l’IP dell’utente è visibile all’esterno di docker nell’header di Cloudflare CF-Connecting-IP
Non so molto su come funzionano le cose relative all’IP reale di Cloudflare, ma il mio sospetto è che il tuo Discourse nginx avrà bisogno di set_real_ip_from all’indirizzo IP che vede come il tuo proxy nginx. 127.0.0.1? Un altro indirizzo interno? L’indirizzo pubblico? Non sono sicuro di quale vedrebbe.
Una volta che sai quale indirizzo è, penso che quello che farei sarebbe lasciare il template di Cloudflare lì, quindi aggiungere un nuovo replace solo per set_real_ip_from.
In aggiunta a ciò, il tuo proxy nginx dovrà essere configurato per passare l’header CF-Connecting-IP se non è già configurato per farlo o non lo fa già per impostazione predefinita. Non posso davvero aiutarti con questa parte.
Questa potrebbe essere la causa dei tuoi problemi. Prova a configurare Discourse su un server senza pannelli o proxy inversi installati e segnala se riscontri lo stesso problema.
Questa non è una soluzione a un problema, in pratica comprare un nuovo server dedicato da 30€/mese può risolvere qualsiasi cosa lol (questo thread non esisterà allora).
Devo aggiungere anche gli header nella configurazione Nginx di Discourse? (all’interno di docker) Perché mi mostra ancora l’indirizzo del server invece di quello degli utenti.
## questo è il modello di container Docker Discourse tutto in uno e autonomo
##
## Dopo aver apportato modifiche a questo file, DEVI ricompilare
## /var/discourse/launcher rebuild app
##
## FAI MOLTA ATTENZIONE QUANDO MODIFICHI!
## I FILE YAML SONO ESTREMAMENTE SENSIBILI A ERRORI DI SPAZIATURA O ALLINEAMENTO!
## visita http://www.yamllint.com/ per convalidare questo file secondo necessità
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/cloudflare.template.yml"
## Decommenta queste due righe se desideri aggiungere Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## quali porte TCP/IP dovrebbe esporre questo container?
## Se desideri che Discourse condivida una porta con un altro webserver come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
- "31080:80" # http
- "31443:443" # https
params:
db_default_text_search_config: "pg_catalog.russian"
## Imposta db_shared_buffers a un massimo del 25% della memoria totale.
## verrà impostato automaticamente da bootstrap in base alla RAM rilevata, o puoi sovrascriverlo
db_shared_buffers: "4096MB"
## può migliorare le prestazioni di ordinamento, ma aumenta l'utilizzo della memoria per connessione
#db_work_mem: "40MB"
## Quale revisione Git dovrebbe utilizzare questo container? (predefinito: tests-passed)
#version: tests-passed
env:
LC_ALL: ru_RU.UTF-8
LANG: ru_RU.UTF-8
LANGUAGE: ru_RU.UTF-8
DISCOURSE_DEFAULT_LOCALE: ru
## Quante richieste web concorrenti sono supportate? Dipende da memoria e core CPU.
## verrà impostato automaticamente da bootstrap in base alle CPU rilevate, o puoi sovrascriverlo
UNICORN_WORKERS: 8
## TODO: Il nome di dominio a cui risponderà questa istanza di Discourse
## Obbligatorio. Discourse non funzionerà con un semplice numero IP.
DISCOURSE_HOSTNAME: 'zeronet.space'
## Decommenta se desideri che il container venga avviato con lo stesso
## hostname (-h opzione) specificato sopra (predefinito "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: Elenco di email separate da virgole che diventeranno amministratori e sviluppatori
## alla prima registrazione esempio 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'contact@zeronet.space'
## TODO: Il server di posta SMTP utilizzato per convalidare nuovi account e inviare notifiche
# INDIRIZZO SMTP, nome utente e password sono obbligatori
# ATTENZIONE il carattere '#' nella password SMTP può causare problemi!
DISCOURSE_SMTP_ADDRESS: smtp.zeronet.space
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: noreply@zeronet.space
DISCOURSE_SMTP_PASSWORD: "xxxxxxx"
DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_NOTIFICATION_EMAIL: "noreply@zeronet.space"
#DISCOURSE_SMTP_DOMAIN: "zeronet.space"
## Se hai aggiunto il template Lets Encrypt, decommenta qui sotto per ottenere un certificato SSL gratuito
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## L'indirizzo CDN http o https per questa istanza di Discourse (configurato per il pull)
## vedi https://meta.discourse.org/t/14857 per i dettagli
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## La chiave dell'indirizzo IP di geolocalizzazione maxmind per la ricerca dell'indirizzo IP
## vedi https://meta.discourse.org/t/-/137387/23 per i dettagli
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## Il container Docker è stateless; tutti i dati sono memorizzati in /shared
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## I plugin vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## Qualsiasi comando personalizzato da eseguire dopo la compilazione
run:
- exec: echo "Inizio dei comandi personalizzati"
## Se desideri impostare l'indirizzo email 'Da' per la tua prima registrazione, decommenta e modifica:
## Dopo aver ricevuto la prima email di registrazione, ri-commenta la riga. Deve essere eseguita solo una volta.
- exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
- exec: echo "Fine dei comandi personalizzati"