En esta publicación, te mostraré exactamente cómo ejecutar Discourse detrás de un proxy inverso de Nginx. Aún utilizando los métodos de instalación admitidos.
Requisitos:
- Nombre de dominio válido.
- Certificado SSL válido.
- Entradas DNS válidas que apunten al nombre de dominio.
- Servidor de correo electrónico o proveedor SMTP válido y funcional.
- Proxy inverso Nginx funcional y capacidad para acceder a la instancia y crear el certificado SSL para su uso posterior.
- VM o contenedor LxC que pueda ejecutar Docker.
Para esta guía, usaré mi propia instancia como ejemplo, con todas las funciones en funcionamiento, copias de seguridad, actualizaciones, etc. Probado durante aproximadamente 2 semanas.
Especificaciones de mi VM de Discourse:
- CPU: 4 núcleos
- RAM: 6 GB
- Swap: 8 GB (archivo de intercambio SSD)
- Almacenamiento: 50 GB (SSD)
- SO: Ubuntu 22.04.3
Puedes usar el mínimo, pero al probar. Discourse básicamente abusa de 2 GB fácilmente. El uso inactivo es de aproximadamente 1.48 GB de 6 GB.
NOTA: Esta instalación utiliza el proxy inverso para crear los certificados SSL. Se puede usar Certbot si se prefiere.
PASO 1:
Descarga la última versión de Ubuntu Server desde Get Ubuntu Server | Download | Ubuntu
PASO 2:
- Instala Ubuntu Server en la plantilla VM/LxC
1.1 Asegúrate de que Ubuntu esté actualizado con todos los paquetes del servidor. - Usa los siguientes comandos para instalar todos los paquetes requeridos:
apt update -y && apt upgrade -y && apt wget curl zip git docker.io nginx -y && reboot
PASO 3:
Instalando Discourse. Siguiendo la Guía para principiantes discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub
Conéctate a tu servidor por SSH y simplemente ingresa lo siguiente:
sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers
Después de completar lo anterior. Puedes ejecutar ./discourse-setup
Sigue todos los pasos e ingrésalos correctamente, ya que esto será vital para una instalación exitosa.
Los pasos te pedirán lo siguiente; ejemplo de la guía de configuración:
Deja que la instalación se ejecute, puede llevar un tiempo dependiendo de tu conexión a Internet y las especificaciones del servidor. Tardó entre 5 y 8 minutos en completar la instalación utilizando la configuración de mi VM.
PASO 4:
Una vez que la instalación se haya completado, verás el comando de inicio que está utilizando el contenedor de Docker y el ID del contenedor generado (hash).
NOTA: Dado que estás detrás de un proxy a través de la WAN, mostrará un error 502 y, dado que el contenedor utiliza la red de Docker. No será accesible desde la WAN o LAN, a menos que te conectes a la red 172.17.0.1/16, que no necesitaremos.
Verifica que la instalación se haya completado y que el contenedor de Docker se esté ejecutando usando:
docker ps
Deberías obtener la siguiente salida.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
XXXXXX local_discourse/app “/sbin/boot” 6 days ago Up 7 hours app
PASO 5:
Actualizando el archivo app.yml para que se ajuste a la configuración del proxy inverso.
Usando tu editor de texto preferido, abre /var/discourse/container/app.yml
Reemplaza/comenta las siguientes líneas: (esto será manejado por el Nginx local)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
Inmediatamente después de #- "templates/web.letsencrypt.ssl.template.yml" agrega lo siguiente:
- "templates/web.socketed.template.yml"
Luego comenta la sección expose, ya que Discourse ahora usará un websocket, finalmente Nginx podrá iniciarse ya que liberará los puertos 80 y 443 requeridos localmente.
#expose:
# - "80:80" # http
# - "443:443" # https
Ahora, para forzar a Discourse a suministrar solo enlaces con HTTPS, agrega lo siguiente en la sección env:
# FORCE SSL
DISCOURSE_FORCE_HTTPS: true
Ahora, para que las cosas finalmente funcionen, necesitarás reconstruir la aplicación. Usando lo siguiente:
cd /var/discourse
./launcher rebuild app
Deja que eso se ejecute y se complete. Para verificar si fue exitoso, asegúrate de que el comando de ejecución de Docker se muestre o simplemente ejecuta docker ps y verás el contenedor en ejecución.
PASO 6:
Habilitando Nginx y configurando el sitio predeterminado para que apunte al contenedor de Docker. Permitiendo que el proxy inverso acceda al contenedor utilizando el Nginx local.
Ejecuta lo siguiente:
systemctl enable nginx && systemctl start nginx
Para verificar si se está ejecutando. Intenta acceder a la página de inicio predeterminada de Nginx usando tu navegador y la IP local.
Ej:
http://10.10.0.4
Deberías obtener una página de felicitaciones de Nginx.
PASO 7:
Actualizando la configuración predeterminada a lo siguiente:
Primero vacía el archivo de configuración:
echo "" > /etc/nginx/sites-available/default
Usando tu editor de texto, abre el archivo de configuración y agrega lo siguiente:
NOTA: Actualiza server_name con tu dominio y ssl_certificate, ssl_certificate_key con la ubicación de tu certificado SSL y clave.
Se puede usar Certbot, pero yo simplemente hago rsync de mi certificado y clave desde mi proxy inverso.
server {
listen 80; listen [::]:80;
server_name add.yourdomain.com;
server_tokens off;
return 301 https://$host$request_uri;
}
# Default server configuration
#
server {
# SSL configuration
#
server_tokens off;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name add.yourdomain.com;
ssl_certificate /etc/ssl/certs/your_ssl_cert.bundle;
ssl_certificate_key /etc/ssl/private/your_ssl_cert.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
Guarda el nuevo archivo predeterminado y ejecuta systemctl restart nginx.
PASO 8:
Abre tu navegador y ve al dominio de tu foro https://midominio.com y serás recibido con la siguiente página.
Eso es todo, todo listo. Luego puedes seguir los pasos para registrarte y poner en marcha tu foro/comunidad :).
PASO ADICIONAL:
Mantenimiento Post-Instalación
Sugerimos encarecidamente que actives las actualizaciones de seguridad automáticas para tu sistema operativo. En Ubuntu, usadpkg-reconfigure -plow unattended-upgrades
Para obtener soporte, puedes usar esta comunidad, para el Nginx local, no dudes en pedir ayuda en esta publicación.
