Discourse es una potente plataforma de foros de discusión de código abierto, diseñada para fomentar el intercambio de ideas y el debate entre comunidades.


Discourse es una potente plataforma de foros de discusión de código abierto, diseñada para fomentar el intercambio de ideas y el debate entre comunidades. Ofrece una experiencia moderna y dinámica, con notificaciones en tiempo real, integración con redes sociales y un sistema avanzado de gestión de usuarios. Además, su diseño adaptable permite que se ajuste a todo tipo de dispositivos, brindando una experiencia de usuario fluida tanto en móviles como en equipos de escritorio.

En este tutorial, te explicaremos cómo instalar Discourse usando Docker, acompañado de un proxy inverso configurado con Nginx para mejorar la gestión de tráfico y seguridad. Utilizaremos Debian 12 como sistema operativo base, pero si prefieres Ubuntu, los pasos deberían ser prácticamente idénticos. Al final de este proceso, tendrás una instalación robusta y bien optimizada de Discourse, lista para ser utilizada en producción.


Requisitos para la instalación

Para seguir con este tutorial es necesario tener lo siguiente:

  • Un dominio o subdominio.
  • El dominio o subdominio apuntanto a la IP del servidor.
  • Una cuenta de correo para configurar como SMTP.

Tenemos que tener instalado Docker en el servidor, si no lo tienes instalado, te dejo este artículo que explica como hacerlo:

Instalación de Docker en Debian 12
Docker es una aplicación que simplifica el proceso de gestión de los procesos de las aplicaciones en contenedores. Los contenedores le permiten ejecutar sus aplicaciones en procesos aislados de recursos.

Luego es necesario tener todos los paquetes actualizados y asegurarnos de tener estos otros instalados en el servidor:

apt update
apt upgrade
apt wget curl zip git

Instalación de Discourse

Para instalar Discourse, nos tenemos que descargar el repositorio y lo debemos de hacer en un directorio especifico:

git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers

Cuando tenemos esto, ejecutamos este otro comando para iniciar la descarga de las imágenes y la configuración de los contenedores de Docker:

./discourse-setup
💡
Antes de ejecutar este comando, asegúrate de que si tienes Nginx en el servidor, tienes el proceso parado, ya que puede generar problemas al intentar levantar un contenedor en el puerto 80 o 443.

Cuando inicie la instalación, nos preguntarán varias cosas:

Hostname for your Discourse? [discourse.example.com]: 
Email address for admin account(s)? [me@example.com,you@example.com]: 
SMTP server address? [smtp.example.com]: 
SMTP port? [587]: 
SMTP user name? [user@example.com]: 
SMTP password? [pa$$word]: 
Let's Encrypt account email? (ENTER to skip) [me@example.com]: 
Optional Maxmind License key () [xxxxxxxxxxxxxxxx]:

El primer apartado es para escribir nuestro dominio o subdominio donde alojaremos discourse, los siguientes apartados es para configurar el correo. Los dos últimos, son importantes, ya que es para configurar el certificado SSL.

La instalación puede tardar entre 2 y 8 minutos en hacer todo el proceso. Una vez finalizada la instalación, se indicará un comando para iniciar todo:

./launcher start app

Este proceso levantará todos los servicios necesarios para que Discourse funcione correctamente. Si accedemos al dominio, podremos configurar el admin, pero recomiendo esperar a tener Discourse configurado detrás del Proxy Inverso.

Configuración de Discourse

A continuación deberemos de parar todos los contenedores y reconfigurar la configuración de nuestra APP. Para ello:

./launcher stop app

Ahora editaremos el fichero /var/discourse/containers/app.yml donde se encuentra la configuración de Discourse.

Tenemos que tener estas dos líneas comentadas en el fichero:

  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

Y añadir lo siguiente debajo:

- "templates/web.socketed.template.yml"

Además, tendremos que comentar también estas líneas:

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

Luego más abajo añadimos también esto:

DISCOURSE_FORCE_HTTPS: true

El resultado final tiene que ser como este:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Uncomment the next line to enable the IPv6 listener
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Uncomment these two lines if you wish to add Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"
  - "templates/web.socketed.template.yml"

## which TCP/IP ports should this container expose?
## If you want Discourse to share a port with another webserver like Apache or nginx,
## see https://meta.discourse.org/t/17247 for details
#expose:
#  - "80:80"   # http
#  - "443:443" # https

DISCOURSE_FORCE_HTTPS: true

Finalmente, tenemos que reconstruir la configuración de Discourse con:

./launcher rebuild app

Configuración de Nginx

Antes de iniciar de nuevo Discourse con la nueva configuración, tendremos que preparar la configuración de Nginx. Para ello es necesario tener instalado Nginx en el servidor.

apt install nginx

Luego la configuración será algo similar a esta:

server {
    listen 80; listen [::]:80;
    server_name [dominio.es];
    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 8dec171d-0edf-4753-bbc4-d73fbf55b1b1.clouding.host;
        ssl_certificate /etc/letsencrypt/live/[dominio.es]/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/[dominio.es]/privkey.pem;
        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-EC>
        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;
        }
}
💡
Asegúrate de cambiar [dominio.es] por tu dominio.

Antes de aplicar esta configuración en Nginx, deberemos de crear el certificado SSL con Let's Encrypt, para ello generaremos el certificado únicamente:

certbot certonly

Cuando se haya generado el certificado, podremos recargar la configuración de Nginx:

systemctl reload nginx

Y con ello levantamos los contenedores:

./launcher start app

Con esto, deberíamos de poder acceder a Discourse e iniciar la creación del usuario admin para Discourse.

Creación manual del usuario admin

Por una mala configuración del correo, no me llegaba el correo para validar el e-mail de la cuenta de admin, así que encontré como hacerlo manualmente, os lo dejo aquí por si os sucede lo mismo.

Debéis de ejecutar el siguiente comando:

./launcher enter app

Con este comando entraremos directamente dentro de la aplicación y nos aparecerá lo siguiente:

x86_64 arch detected.                                                        root@servidor:/var/www/discourse

Aquí tendremos que ejecutar el comando:

rake admin:create

Y seguir las instrucciones:

Email: usuario@email.com
User with this email already exists! Do you want to reset the password for this email? (Y/n)  n                                                         Ensuring account is active!                                                  Account updated successfully!                                                Do you want to grant Admin privileges to this account? (Y/n)  y              Your account now has Admin privileges!   

Más sobre ./voidNull

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación