Cómo instalar Discourse Forum con Nginx y Let’s Encrypt SSL gratis en Debian 11

Discourse es una plataforma de debate comunitario de código abierto construida utilizando el lenguaje Ruby. Está diseñada para funcionar como foro, software de chat o lista de correo. Se integra fácilmente con otras plataformas, y su funcionalidad puede ampliarse con plugins.

En este tutorial, aprenderás a instalar Discourse Forum con el servidor Nginx en un servidor basado en Debian 11.

Requisitos previos

  • Un servidor que ejecute Debian 11 con un mínimo de 1 GB de RAM y 1 CPU Core. La instalación de Discourse creará automáticamente una partición swap en sistemas con 1GB o menos de RAM. Por lo tanto, se recomienda instalarlo en un sistema con al menos 2 GB de RAM.
  • Un usuario no root con privilegios sudo.
  • Un nombre de dominio (discourse.example.com) que apunte al servidor.
  • Todo actualizado.
    $ sudo apt update && sudo apt upgrade
    
  • Pocos paquetes que necesite tu sistema.
    $ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y
    

    Puede que algunos de estos paquetes ya estén instalados en tu sistema.

Paso 1 – Configurar el cortafuegos

El primer paso es configurar el cortafuegos. Debian viene con ufw (Uncomplicated Firewall).

Comprueba si el cortafuegos está funcionando.

$ sudo ufw status

Deberías obtener la siguiente salida.

Status: inactive

Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.

$ sudo ufw allow OpenSSH

Permite también los puertos HTTP y HTTPS.

$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp

Habilita el cortafuegos

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Comprueba de nuevo el estado del cortafuegos.

$ sudo ufw status

Deberías ver un resultado similar.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Paso 2 – Instala Git

Instala Git utilizando el Appstream por defecto.

$ sudo dnf install git

Confirma la instalación.

$ git --version
git version 2.30.2

Ejecuta los siguientes comandos para configurar la instalación de Git.

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

Paso 3 – Instala Docker

Para instalar la última versión de Docker, añade la clave GPG oficial de Docker.

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Instala el repositorio oficial de Docker.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Actualiza los repositorios del sistema Debian.

$ sudo apt update

Instala la última versión de Docker.

$ sudo apt install docker-ce docker-ce-cli containerd.io

Comprueba que Docker se está ejecutando.

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-02-05 13:32:54 UTC; 1h ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 5818 (dockerd)
      Tasks: 26
     Memory: 1.4G
        CPU: 5min 34.561s
     CGroup: /system.slice/docker.service
             ?? 5818 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
             ??12162 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -contai>
             ??12169 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8080 -container-ip 172.17.0.2 -container-p>

Por defecto, Docker requiere privilegios de root. Si quieres evitar utilizar sudo cada vez que ejecutes el comando docker, añade tu nombre de usuario al grupo docker.

$ sudo usermod -aG docker $(whoami)

Para activar este cambio, deberás cerrar la sesión del servidor y volver a iniciarla como el mismo usuario.

Paso 4 – Descarga Discourse

Crea el directorio raíz de Discourse.

$ sudo mkdir /var/discourse

Clona el repositorio oficial de Github de Discourse Docker.

$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

Paso 5 – Configura Discourse

Crea el archivo de configuración app.yml copiando el archivo de ejemplo standalone.yml.

$ sudo cp samples/standalone.yml containers/app.yml

Abre app.yml para editarlo.

$ sudo nano containers/app.yml

Establece el dominio

Establece la variable DISCOURSE_HOSTNAME con el nombre de dominio que hayas elegido para tu foro. Si no tienes un nombre de dominio, puedes utilizar aquí una dirección IP.

DISCOURSE_HOSTNAME: 'discourse.example.com'

Configurar puertos expuestos

Cambia la línea "80:80 por "8080:80". Esto cambiará el puerto HTTP externo para Discourse a 8080 ya que utilizaremos Nginx en el puerto 80. Comenta la línea "443:443" ya que instalaremos SSL externamente.

expose:
  - "8080:80"   # http
  #- "443:443" # https

Configurar los ajustes SMTP

Rellena las siguientes variables dependiendo del servicio de correo electrónico transaccional que estés utilizando. Configura el correo electrónico de tu cuenta de administrador utilizando la variable DISCOURSE_DEVELOPER_EMAILS. Este paso es obligatorio, de lo contrario, tu foro no arrancará.

..
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
..
DISCOURSE_SMTP_ADDRESS: smtp.example.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: [email protected]
DISCOURSE_SMTP_PASSWORD: your_smtp_password
#DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
#DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (required by some providers)
DISCOURSE_NOTIFICATION_EMAIL: [email protected]    # (address to send notifications from)

Configuración de la memoria (opcional)

Si tu servidor tiene poca memoria RAM, puedes configurar las siguientes variables en consecuencia para reducir el consumo de memoria de Discourse.

db_shared_buffers: '128MB'
UNICORN_WORKERS: 2

La variable db_shared_buffers suele ajustarse al 25% de la memoria disponible.

Configuración de GeoLite2 (Opcional)

Si quieres la función de búsqueda de IP en Discurso, regístrate en la cuenta gratuita Maxmind Geolite2 y obtén una clave de licencia. Pega esa clave de licencia como valor de la siguiente variable.

DISCOURSE_MAXMIND_LICENSE_KEY: your_maxmind_license_key

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Paso 6 – Instalar Discourse

Ejecuta el siguiente comando para arrancar tu contenedor de Discourse.

$ sudo ./launcher bootstrap app

Inicia la aplicación Discourse.

$ sudo ./launcher start app

Puedes acceder al foro visitando las URL http://yourserver_IP:8080 o http://discourse.example.com:8080 en tu navegador. Aparecerá la siguiente pantalla.

Configuración del discurso Inicio

Haz clic en el botón Registrar para continuar. El identificador de correo electrónico establecido en el archivo app.yml se rellenará previamente para ti.

Discurso Crear cuenta de administrador

Haz clic en el botón Registrar para registrar la cuenta de administrador. Pasarás a la pantalla de confirmación del correo electrónico.

Confirmar correo electrónico de Discourse

Si tu configuración SMTP es correcta, recibirás un correo para activar la cuenta. Haz clic en el enlace de tu correo electrónico para terminar de configurar la cuenta.

Correo electrónico de confirmación del discurso

Haz clic en el botón Activar para finalizar la instalación.

Activar cuenta de Discourse

Llegarás a la pantalla del Asistente de Configuración de Discourse. Puedes saltártela para pasar directamente al foro o pasar por todo el asistente.

Asistente de configuración de Discourse

Tu foro Discourse está listo. El siguiente paso es instalar SSL y poner el foro detrás del servidor Nginx.

Página de inicio del discurso

Paso 7 – Instalar SSL

Para instalar un certificado SSL utilizando Let’s Encrypt, necesitamos instalar la herramienta Certbot.

Para ello utilizaremos el instalador de paquetes Snapd. Como la mayoría de los servidores Debian no lo incluyen, instala el instalador de Snapd.

$ sudo apt install snapd

Asegúrate de que tu versión de Snapd está actualizada.

$ sudo snap install core && sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifica la instalación.

$ certbot --version
certbot 1.22.0

Genera el certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d discourse.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/discourse.example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Crea un directorio webroot de desafío para la renovación automática de Let’s Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Crea un Cron Job para renovar el SSL. Se ejecutará cada día para comprobar el certificado y renovarlo si es necesario. Para ello, primero, crea el archivo /etc/cron.daily/certbot-renew y ábrelo para editarlo.

$ sudo nano /etc/cron.daily/certbot-renew

Pega el siguiente código.

#!/bin/sh
certbot renew --cert-name discourse.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Cambia los permisos del archivo de tareas para que sea ejecutable.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Paso 8 – Instalar y configurar Nginx

Debian incluye una versión antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.

Importa la clave de firma oficial de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
	 | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Añade el repositorio de la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
    http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios de Debian.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifica la instalación. Asegúrate de que utilizas sudo cada vez que ejecutes el comando Nginx en Debian. De lo contrario, no funcionará.

$ sudo nginx -v
nginx version: nginx/1.20.2

Crea y abre el archivo /etc/nginx/conf.d/discourse.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/discourse.conf

Pega en él el siguiente código.

# enforce HTTPS
server {
    listen       80; 
    listen 	[::]:80;
    server_name  discourse.example.com;
    return 301   https://$host$request_uri;
}
server {
    listen       443 ssl http2;
    listen 	[::]:443 ssl http2;
    server_name  discourse.example.com;

    access_log  /var/log/nginx/discourse.access.log;
    error_log   /var/log/nginx/discourse.error.log;
    
    # SSL
    ssl_certificate      /etc/letsencrypt/live/discourse.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/discourse.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/discourse.example.com/chain.pem;
    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 8.8.8.8;
    
    client_max_body_size 100m;
    
    location / {
        proxy_pass http://discourse.example.com:8080/;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    }    
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida una vez hayas terminado.

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Verifica la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Inicia el servicio Nginx para habilitar la nueva configuración.

$ sudo systemctl start nginx

Paso 9 – Comandos de Discourse

Activar Discourse Administrator desde la línea de comandos

Si no recibes el correo electrónico de activación, puedes activar la cuenta de administrador desde la línea de comandos.

Cambia al directorio de Discourse.

$ cd /var/discourse

Entra en el Shell contenedor de Discurso.

$ sudo ./launcher enter app

Introduce el comando rails c para acceder a la línea de comandos de Rails.

root@discourse-app:/var/www/discourse# rails c

Verás el siguiente mensaje.

[1] pry(main)> 

Introduce el comando para localizar la cuenta de administrador.

[1] pry(main)>  User.find_by_email("[email protected]")
=> #<User:0x00005564492032a0
 id: 1,
 username: "username",
 created_at: Sun, 06 Feb 2022 14:46:58.451302000 UTC +00:00,
 updated_at: Sun, 06 Feb 2022 14:54:17.079564000 UTC +00:00,
 name: nil,
 seen_notification_id: 4,
 last_posted_at: nil,
 password_hash: "[FILTERED]",
 salt: "20d6012d3c98da70896dcfc27bc9d264",
 active: true,
 username_lower: "username",
 last_seen_at: Mon, 07 Feb 2022 08:34:12.435844000 UTC +00:00,
 admin: true,
 last_emailed_at: Sun, 06 Feb 2022 14:47:00.694121000 UTC +00:00,
 trust_level: 1,
 approved: false,
 approved_by_id: nil,
 approved_at: nil,
 previous_visit_at: Sun, 06 Feb 2022 15:40:35.804941000 UTC +00:00,
 suspended_at: nil,
 suspended_till: nil,
 date_of_birth: nil,
 views: 0,
 flag_level: 0,
 ip_address: #<IPAddr: IPv4:69.28.90.35/255.255.255.255>,
 moderator: false,
 title: nil,
 uploaded_avatar_id: 3,
:

Introduce q para volver al prompt e introduce los siguientes comandos en secuencia.

[2] pry(main)> user.approved = true
[3] pry(main)> user.save
[4] pry(main)> EmailToken.confirm(user.email_tokens.first.token)

Escribe exit dos veces para volver al intérprete de comandos. Tu cuenta de administrador está activada y lista para ser utilizada.

Actualizar Discourse

Para actualizar el foro, puedes hacerlo de dos maneras. La primera es actualizarlo a través del panel de control del administrador. El segundo método es utilizar una línea de comandos.

Cambia al directorio de Discourse.

$ cd /var/discourse

Actualiza la instalación de Discourse tomando los últimos archivos de Github.

$ git pull

Reconstruye Discourse.

$ sudo ./launcher rebuild app

Necesitas reconstruir Discourse cada vez que realices algún cambio en el archivo app.yml. Después de hacer los cambios, ejecuta el comando anterior. Destruye el contenedor antiguo, arranca uno nuevo e inícialo.

Detener Discurso

$ sudo ./launcher stop

Ver los registros de Discourse

$ sudo ./launcher logs

Conclusión

Con esto concluye el tutorial. Has instalado el foro Discourse utilizando Docker detrás del servidor web Nginx en un servidor Debian 11. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...