Sono riuscito a installare Discourse sul mio server, registrarmi come primo utente e pubblicare il mio primo argomento. Quindi, tutto sul lato Discourse sembra funzionare correttamente.
Tuttavia, per installare e far funzionare Discourse, ho dovuto disabilitare il demone Apache httpd. Questo è un grosso problema per me, dato che ho di fatto spento l’intero server web, che include diversi domini e un server di conferenze Jitsi.
La mia installazione di Jitsi viene eseguita come host virtuale separato utilizzando un sottodominio di uno dei siti web che ospito. Poiché Jitsi riesce a condividere la porta 443 con il resto del traffico web, vorrei fare lo stesso con Discourse.
Qualcuno ha un template di definizione di virtualhost che permetta di reindirizzare il traffico a Discourse quando arriva sul sottodominio di Discourse?
Essenzialmente risolto, tuttavia la homepage sembra impiegare molto tempo per completare la richiesta, anche dopo che la pagina appare completamente caricata. (Non sono sicuro se questo sia un comportamento normale o meno.)
Discourse
Ho modificato il blocco expose in /var/discourse/containers/app.yml in:
Ciò inoltra dal localhost al contenitore Docker. Dopo averlo fatto, è necessario eseguire un rebuild usando ./launcher rebuild app
Apache2 2.4.43 (Ubuntu)
Ho aggiunto un nuovo virtual host per il sottodominio: discourse..com.conf in sites-available, che inoltra il traffico del sottodominio alla porta localhost su cui ascolta l’istanza Docker di Discourse. La definizione del virtual host è riportata di seguito:
<VirtualHost *:80>
ServerName discourse.<myDomain>.com
Redirect permanent / https://discourse.<myDomain>.com/
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName discourse.<myDomain>.com
SSLProtocol TLSv1 TLSv1.1 TLSv1.2
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/letsencrypt/live/<myDomain>.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/<myDomain>.com/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/<myDomain>.com/chain.pem
SSLCipherSuite "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED"
SSLHonorCipherOrder on
Header set Strict-Transport-Security "max-age=31536000"
<Location />
Order allow,deny
Allow from all
Require all granted
</Location>
ProxyPreserveHost on
ProxyRequests Off
RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
ProxyPass / https://127.0.0.1:8443/
ProxyPassReverse / https://127.0.0.1:8443/
</VirtualHost>
Dato che non dedico molto tempo alla configurazione di Apache, potrebbero esserci alcune righe non necessarie, oppure righe che potrebbero essere aggiunte o migliorate. Qualsiasi feedback è benvenuto.
Sto eseguendo Discourse su diversi server con Apache2 come reverse proxy front-end che si connette a una socket Unix; la configurazione funziona perfettamente (come sappiamo tutti, è leggermente più lenta di nginx, che uso anche su alcuni server, ma funziona bene).
Fondamentalmente, configuro il virtual host in questo modo:
Configurazione della porta 80
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName discourse.mygreatwebsite.com
DocumentRoot /website/discourse # spesso non necessario
RewriteEngine On
ProxyPreserveHost On
ProxyRequests Off
ErrorLog /var/log/apache2/discourse.error.log
LogLevel warn
CustomLog /var/log/apache2/discourse.access.log combined
RewriteCond %{SERVER_NAME} =discourse.mygreatwebsite.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
Configurazione della porta 443:
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName discourse.mygreatwebsite.com
DocumentRoot /website/nginx # nella maggior parte dei casi non necessario in questa configurazione
SSLProxyEngine on
RewriteEngine On
ProxyPreserveHost On
ProxyRequests Off
RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
ProxyPass / unix:/var/discourse/shared/socket-only/discourse.http.sock|http://my.ip.address.here/
ProxyPassReverse / unix:/var/discourse/shared/socket-only/discourse.http.sock|http://my.ip.address.here/
ErrorLog /var/log/apache2/discourse-ssl.error.log
LogLevel warn
CustomLog /var/log/apache2/discourse-ssl.access.log combined
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/discourse.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/discourse.com/privkey.pem
</VirtualHost>
Note:
Normalmente, lascio che letsecrypt certbot si occupi di tutto il lavoro relativo alla configurazione di tutti i certificati SSL, reindirizzamenti, ecc.
Utilizziamo l’indirizzo IP a cui è associato apache2 nei file di configurazione di apache2.
Configuriamo sempre questa esposizione tramite socket Unix nel contenitore Discourse e non esponiamo alcuna porta TCP/IP del contenitore in questa configurazione.
Ciao e spero che questo aggiunga qualche valore, anche se in ritardo.
Se desideri utilizzare un socket Unix invece di un proxy diretto, puoi farlo (dopo aver abilitato web.socketed.template.yml nel tuo app.yml) nel seguente modo:
ProxyPreserveHost On
ProxyRequests Off
RequestHeader set X-Forwarded-Proto https
RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
<Location />
ProxyPass unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
ProxyPassReverse unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</Location>
Tieni presente che probabilmente dovrai gestire SELinux se provi a far leggere ad Apache da /var/discourse in questo modo. Un comando come semanage fcontext -a -t httpd_sys_rw_content_t /var/discourse/shared/standalone/nginx.http.sock, seguito da restorecon /var/discourse/shared/standalone/nginx.http.sock, dovrebbe risolvere il problema.
Apache include il piuttosto fantastico mod_md, che può ottenere automaticamente i certificati Let’s Encrypt per te. Lo consiglio vivamente.