Cómo instalar Discourse Forum con Nginx y Free Let’s Encrypt SSL en Debian 11
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.
Anuncio 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.
Haga clic en el Registro botón para registrar la cuenta de administrador. Accederá a la pantalla de confirmación del correo electrónico.
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.
Haga clic en el Activar botón para finalizar la instalación.
Accederá a la pantalla del asistente de configuración de Discourse. Puede omitirlo para ir directamente al foro o pasar por todo el asistente.
Tu foro de 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 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.