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.
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.
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.
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.
Haz clic en el botón Activar para finalizar la instalación.
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.
Tu foro Discourse está listo. El siguiente paso es instalar SSL y poner el foro detrás del servidor Nginx.
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.