Ciao a tutti
Ho letto la documentazione e ho esaminato le configurazioni e i consigli pubblicati, tentando di adattarli alla mia situazione specifica.
Per qualcosa che sembra piuttosto semplice, è incredibilmente frustrante che nessuna delle soluzioni proposte abbia funzionato.
Il nostro ambiente:
- Eseguiamo un’istanza AWS EC2, più precisamente un’immagine AMI AWS Linux 2;
- Abbiamo Apache2 in esecuzione e configurato;
- L’istanza fa parte di un gruppo di destinazione AWS a cui fa riferimento il nostro load balancer AWS;
- Il nostro certificato SSL/TLS è fornito da AWS ed è associato al load balancer;
- Il nostro provider di dominio è
name.com; - Parte della nostra configurazione prevede più sottodomini instradati tramite record CNAME, tutti puntanti al load balancer AWS, che a sua volta gestisce il traffico verso l’istanza EC2;
- Tutto il traffico instradato al load balancer e servito agli utenti web è sicuro;
- Sul nostro server eseguiamo tre applicazioni Node Express separate;
- Le porte sono definite in Express come parte della configurazione del server Express; attualmente le porte sono 3000, 4000 e 5000;
- Il traffico viene instradato da Apache in base al sottodominio all’app web corrispondente, ad esempio:
<VirtualHost *:80>
ServerName subdomain.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:4000/"
ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
-
Sebbene non particolarmente rilevante, utilizziamo PM2 per gestire le nostre app Express in modo che vengano avviate automaticamente al riavvio del server.
-
Sullo stesso server abbiamo installato Docker;
-
Abbiamo quindi installato Discourse utilizzando una copia di app.yaml (usando come guida Run other websites on the same machine as Discourse - #182 by angus).
Stato attuale:
- Docker è in esecuzione
- L’app Discourse (container) è in esecuzione
- Le app Express sono tutte in esecuzione e vengono instradate correttamente da Apache
Note:
- Ho provato inizialmente a compilare l’app senza esporre le porte come indicato nella documentazione; quando ciò non ha funzionato, ho esposto la porta 8000 tramite la porta HTTP 80;
- Nella mia semplice comprensione, Docker è come una casa e i vari container sono le stanze. Docker determina come l’app viene accessibile, ovvero quale stanza accedere. Il mio pensiero nell’esporre la porta 8000 era che avrei potuto fare riferimento alla porta 8000 proprio come faccio con le mie altre app Express, ora che la 8000 era esposta. Ma questo non funziona; di seguito un esempio di ciò che ho provato a fare in Apache:
# FAQ (ROTTE DI DISCOURSE)
<VirtualHost *:80>
ServerName discourse.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:8000/"
ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
- Il test semplice era provare a inserire localhost:8000 nel browser sul server e testare. Il server è un’istanza AWS con Chromium installato. Il fatto che questo non si risolva immediatamente mi dice che c’è un problema e che la mia comprensione manca di qualcosa di fondamentale. Le mie app web vengono eseguite e sono disponibili sulle porte che specifico nella configurazione di Express; la mia aspettativa era che fosse lo stesso per il container Docker.
Note aggiuntive:
- Mi rendo conto che esiste una soluzione potenziale mettendo NGINX “davanti” ad Apache e Docker per instradare il traffico da
discourse.domain.ioverso, ad esempio, la porta 8000 sul server locale, ovvero la porta esposta per il container Docker, e instradare tutto il resto del traffico da *.domain.io ad Apache, ad esempio sulla porta 9000, modificando poi la configurazione del VirtualHost per instradare il traffico dalla porta 9000 di conseguenza, ovvero:
# INSTRUAMENTO DELLE APP EXPRESS IN APACHE
<VirtualHost *:9000>
ServerName other_sub_domains.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:4000/"
ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
- Per me questo sembra completamente inutile. Se il dominio
discourse.domain.ioviene instradato ad Apache e Apache riceve la richiesta e poi prova a instradarla, dovrebbe essere semplice puntarla alla porta esposta del container Docker. - Inoltre, se localhost:8000 sul server stesso non si risolve, questa soluzione non funzionerebbe comunque.
Attualmente ottengo un errore 502 in Chrome quando provo a navigare verso il mio container Docker di Discourse. (Vedi screenshot sopra).
Estratto da app.yml
## questo è il template del container Docker Discourse standalone all-in-one
##
## Dopo aver apportato modifiche a questo file, DEVI ricostruire
## /var/discourse/launcher rebuild app
##
## FAI MOLTA ATTENIONE QUANDO MODIFICHI!
## I FILE YAML SONO SUPER SUPER SENSIBILI A ERRORI NELLO SPAZIAMENTO O NELL'ALLINEAMENTO!
## visita http://www.yamllint.com/ per validare questo file quando necessario
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/web.socketed.template.yml"
## Scommenta queste due righe se desideri aggiungere Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## quali porte TCP/IP deve esporre questo container?
## Se desideri che Discourse condivida una porta con un altro server web come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
- "8000:80" # http
#- "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## Imposta db_shared_buffers al massimo al 25% della memoria totale.
## verrà impostato automaticamente da bootstrap in base alla RAM rilevata, oppure puoi sovrascrivere
#db_shared_buffers: "256MB"
## può migliorare le prestazioni di ordinamento, ma aumenta l'utilizzo della memoria per connessione
#db_work_mem: "40MB"
## Quale revisione Git deve utilizzare questo container? (predefinito: tests-passed)
#version: tests-passed
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## Quante richieste web contemporanee sono supportate? Dipende dalla memoria e dai core CPU.
## verrà impostato automaticamente da bootstrap in base alle CPU rilevate, oppure puoi sovrascrivere
#UNICORN_WORKERS: 3
## TODO: Il nome di dominio a cui questa istanza Discourse risponderà
## Obbligatorio. Discourse non funzionerà con un semplice numero IP.
DISCOURSE_HOSTNAME: 'discourse.domain.io'
## Scommenta se desideri che il container venga avviato con lo stesso
## nome host (opzione -h) specificato sopra (predefinito "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: Elenco di email separate da virgola che diventeranno amministratori e sviluppatori
## all'iscrizione iniziale, esempio 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'
## TODO: Il server SMTP utilizzato per validare 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: email-smtp.us-east-1.amazonaws.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: ******
DISCOURSE_SMTP_PASSWORD: ******
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (opzionale, predefinito true)
#DISCOURSE_SMTP_DOMAIN: ****** # (richiesto da alcuni provider)
#DISCOURSE_NOTIFICATION_EMAIL: ****** # (indirizzo da cui inviare le notifiche)
## Se hai aggiunto il template Lets Encrypt, scommenta qui sotto per ottenere un certificato SSL gratuito
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## L'indirizzo CDN http o https per questa istanza Discourse (configurato per il recupero)
## vedi https://meta.discourse.org/t/14857 per i dettagli
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## La chiave IP di geolocalizzazione Maxmind per la ricerca degli indirizzi IP
## vedi https://meta.discourse.org/t/-/137387/23 per i dettagli
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## Il container Docker è senza stato; tutti i dati sono archiviati 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 costruzione
run:
- exec: echo "Inizio dei comandi personalizzati"
## Se desideri impostare l'indirizzo email "Da" per la tua prima registrazione, scommenta e modifica:
## Dopo aver ricevuto la prima email di iscrizione, rimetti il commento alla riga. Deve essere eseguito solo una volta.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "Fine dei comandi personalizzati"
Il mio dominio, l’indirizzo email e la configurazione email sono corretti. Come menzionato, non ho bisogno di configurare SSL/TLS.
Richiesta:
- È la soluzione NGINX l’unico modo per far funzionare questa configurazione e, in tal caso, esiste una spiegazione più chiara riguardo ai passaggi di configurazione? Non sono nella posizione di ricominciare da zero con il server solo per far funzionare Discourse e senza garanzie.
- In Discourse behind reverse proxy and https - #2 by itsbhanusharma @Dark Matter ha fornito la seguente soluzione per Apache2, ma non credo che questa soluzione sia pensata per un ambiente Node Express e, dato che localhost:8000 non si risolve, non sono sicuro che funzionerebbe:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName discourse.example.com
DocumentRoot /website/discourse
RewriteEngine On
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
ProxyPassReverse / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
ErrorLog /var/log/apache2/discourse.error.log
LogLevel warn
CustomLog /var/log/apache2/discourse.access.log combined
RewriteCond %{SERVER_NAME} =discourse.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
- Il problema è nella mia configurazione di Discourse? Il problema è forse l’instradamento di Apache (lo sospetto)? O mi manca qualcosa di più fondamentale?
- Penso che risolvere questo problema aiuterà molti utenti in futuro.
- La soluzione ideale sarebbe instradare Discourse direttamente sul server in locale.
- Poi, instradare tramite URL sarebbe la seconda opzione migliore.
Cordiali saluti,
Matthew Lucas



