He podido instalar Discourse con éxito en mi servidor, registrarme como el primer usuario y publicar mi primer tema. Así que todo en el lado de Discourse parece estar funcionando.
Sin embargo, para instalar y ejecutar Discourse, tuve que desactivar mi daemon Apache httpd. Esto es un problema importante para mí, ya que básicamente he apagado todo mi servidor web, que incluye varios dominios y un servidor de conferencias Jitsi.
Mi instalación de Jitsi se ejecuta como un host virtual separado usando un subdominio de uno de los sitios web que estoy alojando. Dado que Jitsi puede compartir el puerto 443 con el resto del tráfico web, me gustaría hacer lo mismo con Discourse.
¿Alguien tiene una definición de host virtual de plantilla que permita redirigir el tráfico a Discourse cuando llegue a través del subdominio de Discourse?
Básicamente resuelto, sin embargo, la página de inicio parece tardar mucho en finalizar la solicitud, incluso después de que la página parezca haberse cargado completamente. (No estoy seguro de si este es un comportamiento normal o no.)
Discourse
Modifiqué el bloque expose en /var/discourse/containers/app.yml para que quedara así:
Esto redirige desde localhost al contenedor de Docker. Después de hacer esto, es necesario realizar una reconstrucción usando ./launcher rebuild app
Apache2 2.4.43 (Ubuntu)
Añadí un nuevo host virtual para el subdominio: discourse..com.conf en sites-available, el cual redirige el tráfico del subdominio al puerto de localhost en el que escucha la instancia de Discourse en Docker. La definición del host virtual es la siguiente:
<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>
Dado que no dedico mucho tiempo a configurar Apache, puede haber algunas líneas innecesarias, o líneas que podrían añadirse o mejorarse. Cualquier comentario será bienvenido.
Estoy ejecutando Discourse en varios servidores con Apache2 como proxy inverso frontal hacia un socket Unix y la configuración funciona perfectamente (como todos sabemos, es un poco más lento que nginx, que también ejecuto en algunos servidores, pero funciona bien).
Básicamente, configuro el virtual host de la siguiente manera:
Configuración del puerto 80
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName discourse.mygreatwebsite.com
DocumentRoot /website/discourse # a menudo no es necesario
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>
Configuración del puerto 443:
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName discourse.mygreatwebsite.com
DocumentRoot /website/nginx # generalmente no es necesario en esta configuración
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>
Notas:
Normalmente, dejo que letsecrypt certbot haga todo el trabajo relacionado con la configuración de todos los certificados SSL y redirecciones, etc.
Usamos la dirección IP a la que está vinculado apache2 en los archivos de configuración de apache2.
Siempre configuramos esto (exponemos) con sockets Unix en el contenedor de Discourse y no exponemos ningún puerto TCP/IP del contenedor en esta configuración.
Saludos y espero que esto añada algo de valor, aunque sea tarde en el juego.
Si deseas usar un socket Unix en lugar de un proxy directo, puedes hacerlo (después de habilitar web.socketed.template.yml en tu app.yml) de la siguiente manera:
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>
Ten en cuenta que probablemente necesites gestionar SELinux si intentas que Apache lea desde /var/discourse de esa manera. Algo como semanage fcontext -a -t httpd_sys_rw_content_t /var/discourse/shared/standalone/nginx.http.sock seguido de restorecon /var/discourse/shared/standalone/nginx.http.sock debería funcionar para ello.
Apache cuenta con el bastante increíble mod_md, que puede obtener tus certificados de LetsEncrypt de forma automática. Lo recomiendo encarecidamente.