C√≥mo instalar Discourse Forum con Nginx y Free Let’s Encrypt SSL en Debian 11

Inicio de configuración del discurso

Discourse es una plataforma de discusi√≥n comunitaria de c√≥digo abierto creada con el lenguaje Ruby. Est√° dise√Īado para funcionar como foro, software de chat o lista de correo. Se integra f√°cilmente con otras plataformas y su funcionalidad se puede ampliar con complementos.

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

requisitos previos

  • Un servidor que ejecuta Debian 11 con un m√≠nimo de 1 GB de RAM y 1 CPU Core. La configuraci√≥n de Discourse crear√° autom√°ticamente una partici√≥n de intercambio en sistemas con 1 GB 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 apunta al servidor.
  • Todo est√° actualizado.
    $ sudo apt update && sudo apt upgrade
    
  • Pocos paquetes que tu sistema necesita.
    $ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y
    

    Es posible que algunos de estos paquetes ya estén instalados en su sistema.

Paso 1: configurar el cortafuegos

El primer paso es configurar el cortafuegos. Debian viene con ufw (cortafuegos sin complicaciones).

Compruebe si el cortafuegos se est√° ejecutando.

$ sudo ufw status

Deberías obtener el siguiente resultado.

Status: inactive

Permita el puerto SSH para que el firewall no interrumpa la conexión actual al habilitarlo.

$ sudo ufw allow OpenSSH

Permita también los puertos HTTP y HTTPS.

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

Habilitar 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

Vuelva a comprobar el estado del cortafuegos.

$ sudo ufw status

Deberías ver una salida 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 – Instalar Git

Instale Git usando el Appstream predeterminado.

$ sudo dnf install git

Confirme la instalación.

$ git --version
git version 2.30.2

Ejecute 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: instalar Docker

Para instalar la √ļltima versi√≥n de Docker, agregue 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

Instale 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

Actualice los repositorios del sistema Debian.

$ sudo apt update

Instale la √ļltima versi√≥n de Docker.

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

Verifique 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>

De forma predeterminada, Docker requiere privilegios de root. Si desea evitar usar sudo cada vez que ejecuta el comando docker, agregue su nombre de usuario al grupo docker.

$ sudo usermod -aG docker $(whoami)

Para habilitar este cambio, deberá cerrar sesión en el servidor y volver a iniciarla como el mismo usuario.

Paso 4 – Descargar Discurso

Cree el directorio raíz para Discourse.

$ sudo mkdir /var/discourse

Clone el repositorio oficial de Discourse Docker Github.

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

Paso 5: configurar el discurso

Cree el archivo de configuración app.yml copiando el archivo standalone.yml de muestra.

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

Abra app.yml para editar.

$ sudo nano containers/app.yml

Establecer dominio

Establezca la variable DISCOURSE_HOSTNAME en el nombre de dominio que eligió para su foro. Si no tiene un nombre de dominio, puede usar una dirección IP aquí.

DISCOURSE_HOSTNAME: 'discourse.example.com'

Configurar puertos expuestos

Cambie la l√≠nea ¬ę80:80 a¬Ľ 8080:80 ¬ę. Esto cambiar√° el puerto HTTP externo para Discourse a 8080 ya que usaremos Nginx en el puerto 80. Comente la l√≠nea ¬ę443:443¬Ľ ya que instalaremos SSL externamente.

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

Configurar ajustes de SMTP

Complete las siguientes variables seg√ļn el servicio de correo electr√≥nico transaccional que est√© utilizando. Configure el correo electr√≥nico para su cuenta de administrador usando la variable DISCOURSE_DEVELOPER_EMAILS. Este paso es obligatorio, de lo contrario, su foro no se iniciar√°.

..
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 memoria (opcional)

Si su servidor tiene poca memoria RAM, puede configurar las siguientes variables en consecuencia para reducir la huella de memoria de Discourse.

db_shared_buffers: '128MB'
UNICORN_WORKERS: 2

La variable db_shared_buffers generalmente se establece en el 25 % de la memoria disponible.

Configuración de GeoLite2 (Opcional)

Si desea la funci√≥n de b√ļsqueda de IP en Discourse, reg√≠strese para obtener la cuenta gratuita de Maxmind Geolite2 y obtenga una clave de licencia. Pegue esa clave de licencia como el valor de la siguiente variable.

DISCOURSE_MAXMIND_LICENSE_KEY: your_maxmind_license_key

Guarde el archivo presionando Control + X y entrando Y Cuando se le solicite.

Paso 6 – Instalar discurso

Ejecute el siguiente comando para iniciar su contenedor Discourse.

$ sudo ./launcher bootstrap app

Inicie la aplicación Discourse.

$ sudo ./launcher start app

Puede acceder al foro visitando las URL http://yourserver_IP:8080 o http://discourse.example.com:8080 en su navegador. Obtendr√° la siguiente pantalla.

Inicio de configuración del discursoAnuncio publicitario

Haga clic en el Registro botón para proceder. La identificación de correo electrónico establecida en el archivo app.yml se completará previamente para usted.

Discurso Crear cuenta de administrador

Haga clic en el Registro botón para registrar la cuenta de administrador. Accederá a la pantalla de confirmación del correo electrónico.

Correo electrónico del discurso Confirmar

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

Correo electrónico de confirmación del discurso

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

Activar cuenta de discurso

Accederá a la pantalla del asistente de configuración de Discourse. Puede omitirlo para ir directamente al foro o pasar por todo el asistente.

Asistente de configuración del discurso

Tu foro de 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 usando Let’s Encrypt, necesitamos instalar la herramienta Certbot.

Usaremos el instalador del paquete Snapd para eso. Dado que la mayoría de los servidores Debian no lo incluyen, instale el instalador de Snapd.

$ sudo apt install snapd

Aseg√ļrese de que su versi√≥n de Snapd est√© actualizada.

$ sudo snap install core && sudo snap refresh core

Instale Certbot.

$ sudo snap install --classic certbot

Utilice el siguiente comando para asegurarse de que el comando Certbot se pueda ejecutar creando un enlace simbólico al directorio /usr/bin.

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

Verifique la instalación.

$ certbot --version
certbot 1.22.0

Genere el certificado SSL.

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

El comando anterior descargar√° un certificado en el directorio /etc/letsencrypt/live/discourse.example.com de su servidor.

Generar un grupo Diffie-Hellman certificado.

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

Cree un directorio webroot de desaf√≠o para la renovaci√≥n autom√°tica de Let’s Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Cree un trabajo cron para renovar el SSL. Se ejecutará todos los días para verificar el certificado y renovarlo si es necesario. Para eso, primero, cree el archivo /etc/cron.daily/certbot-renew y ábralo para editarlo.

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

Pegue el siguiente código.

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

Guarde el archivo presionando Control + X y entrando Y Cuando se le solicite.

Cambie los permisos en el archivo de tareas para que sea ejecutable.

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

Paso 8: instalar y configurar Nginx

Debian se env√≠a con una versi√≥n anterior de Nginx. Debe descargar el repositorio oficial de Nginx para instalar la √ļltima versi√≥n.

Importe 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

Agregue el repositorio para 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

Actualice los repositorios de Debian.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifique la instalaci√≥n. Aseg√ļrese de usar sudo cada vez que ejecute el comando Nginx en Debian. De lo contrario, no funcionar√°.

$ sudo nginx -v
nginx version: nginx/1.20.2

Cree y abra el archivo /etc/nginx/conf.d/discourse.conf para editarlo.

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

Pegue el siguiente código en él.

# 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;
    }    
}

Guarde el archivo presionando Control + X y entrando Y cuando se le solicite una vez terminado.

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

$ sudo nano /etc/nginx/nginx.conf

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

server_names_hash_bucket_size  64;

Guarde el archivo presionando Control + X y entrando Y Cuando se le solicite.

Verifique 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

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

$ sudo systemctl start nginx

Paso 9 – Comandos de Discurso

Active Discourse Administrator desde la línea de comandos

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

Cambie al directorio Discourse.

$ cd /var/discourse

Ingrese al contenedor Discourse Shell.

$ sudo ./launcher enter app

Ingrese el comando rails c para acceder al símbolo del sistema de Rails.

[email protected]:/var/www/discourse# rails c

Ver√° el siguiente mensaje.

[1] pry(main)> 

Introduzca 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,
:

Ingrese q para volver al indicador e ingrese 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)

Escriba exit dos veces para volver al shell. Su cuenta de administrador est√° activada y lista para usar.

Discurso de actualización

Para actualizar el foro, puede usar una de dos formas. La primera forma es actualizarlo a través del panel del administrador. El segundo método es usar una línea de comando.

Cambie al directorio Discourse.

$ cd /var/discourse

Actualice la instalación de Discourse tomando los archivos más recientes de Github.

$ git pull

Reconstruir el discurso.

$ sudo ./launcher rebuild app

Debe reconstruir Discourse cada vez que realice cambios en el archivo app.yml. Después de realizar los cambios, ejecute el comando anterior. Destruye el contenedor antiguo, arranca uno nuevo y lo inicia.

detener el discurso

$ sudo ./launcher stop

Ver registros de discurso

$ sudo ./launcher logs

Conclusión

Esto concluye el tutorial. Ha instalado el foro de Discourse usando Docker detrás del servidor web Nginx en un servidor Debian 11. Si tiene alguna pregunta, publíquela en los comentarios a continuación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *