Discourse es una plataforma de foros de código abierto escrita en Ruby on Rails, con PostgreSQL y Redis por debajo. La única instalación que el proyecto soporta oficialmente es la basada en Docker: un contenedor llamado app que incluye la aplicación, la base de datos, el servidor web y el certificado TLS. En este tutorial instalarás Discourse en Ubuntu 24.04 con el asistente oficial, crearás la cuenta de administración y verás cómo añadir plugins, hacer copias de seguridad y actualizar.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS dedicado solo a Discourse, por ejemplo un VPS de CubePath. El mínimo oficial es 1 GB de RAM con swap, 1 vCPU y 10 GB de disco; para un foro real conviene partir de 2 GB de RAM, 2 vCPU y 20 GB.
  • Un usuario no root con privilegios sudo.
  • Un nombre de dominio o subdominio (en esta guía, foro.example.com) con un registro DNS A que apunte a la IP pública del servidor. Sustituye foro.example.com por tu dominio en todos los pasos.
  • Los puertos 80 y 443 libres: no instales Nginx ni Apache en el mismo servidor, porque el contenedor necesita esos puertos para servir el foro y obtener el certificado.
  • Opcional pero recomendable: credenciales SMTP de un proveedor de correo transaccional (servidor, puerto, usuario y contraseña) para enviar notificaciones, resúmenes y correos de registro.

Paso 1: Preparar el servidor

Actualiza el sistema e instala git, que se usa para descargar la configuración de Discourse:

sudo apt update && sudo apt upgrade -y
sudo apt install -y git ca-certificates curl

Si tienes UFW activado, permite SSH, HTTP y HTTPS antes de continuar:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere

Comprueba que el dominio ya resuelve a la IP del servidor. El asistente lo verifica y Let's Encrypt fallará si el registro A no está propagado:

dig +short foro.example.com
203.0.113.10

Paso 2: Instalar Docker Engine

El asistente de Discourse se ejecuta dentro de un contenedor y se detiene si Docker no está instalado. Instala Docker Engine desde el repositorio oficial de Docker en lugar del paquete docker.io de Ubuntu.

Añade la clave GPG del repositorio:

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

Añade el repositorio:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Instala Docker:

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Comprueba que el servicio está activo:

sudo systemctl is-active docker
sudo docker version --format '{{.Server.Version}}'
active
28.4.0

La versión exacta puede ser distinta; lo importante es que el servicio responda.

Paso 3: Descargar discourse_docker

Discourse se gestiona desde el repositorio discourse_docker, que contiene el script launcher y las plantillas del contenedor. La ubicación estándar es /var/discourse:

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

El directorio containers guardará app.yml, que contiene contraseñas y credenciales SMTP, por eso se restringe al usuario root.

Paso 4: Ejecutar el asistente de instalación

Lanza el asistente oficial. Necesita root porque habla con Docker y escribe en /var/discourse:

sudo ./discourse-setup

El asistente comprueba la memoria, el disco y que los puertos 80 y 443 estén libres, y después te pregunta:

  1. Correos de administración: una o varias direcciones. Solo quien se registre con una de ellas obtendrá permisos de administrador.
  2. Dominio: indica que usas tu propio dominio y escribe foro.example.com. El asistente comprueba que el DNS apunta al servidor.
  3. SMTP: servidor, puerto (normalmente 587), usuario, contraseña y dirección de envío. Puedes omitirlo; en ese caso Discourse activa el inicio de sesión mediante Discourse ID (correo o cuentas sociales a través de id.discourse.com) y podrás configurar SMTP más adelante.

Si el servidor tiene poca memoria, el asistente ofrece crear un archivo de swap de 2 GB. Acepta la oferta en servidores de 1 o 2 GB de RAM.

Al confirmar, el asistente genera /var/discourse/containers/app.yml y construye el contenedor. Tarda entre 5 y 10 minutos. Cuando termina, comprueba que el contenedor app está en marcha:

sudo docker ps --filter name=app --format '{{.Names}}\t{{.Status}}\t{{.Ports}}'
app	Up 2 minutes	0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp

Verifica también que el foro responde por HTTPS con un certificado válido:

curl -sI https://foro.example.com | head -n 1
HTTP/2 200

Paso 5: Crear la cuenta de administración

Abre https://foro.example.com en el navegador y pulsa Registrarse (o Iniciar sesión si usas Discourse ID). Usa exactamente una de las direcciones que diste como correo de administración.

  • Con SMTP configurado, recibirás un correo de activación. Al confirmarlo entrarás como administrador.
  • Con Discourse ID, inicia sesión con esa dirección a través de id.discourse.com.

Tras el primer inicio de sesión aparece el asistente de configuración del sitio, donde defines el nombre del foro, el idioma, si el foro es público o privado y el logotipo. Después puedes ajustar el resto desde Admin en https://foro.example.com/admin.

Si el correo de activación no llega, puedes crear el administrador desde la consola del contenedor:

cd /var/discourse
sudo ./launcher enter app

Dentro del contenedor, ejecuta la tarea de creación de administradores y responde a las preguntas (correo, contraseña y confirmación):

rake admin:create

Escribe exit para salir del contenedor.

Paso 6: Cambiar la configuración del contenedor

Cualquier cambio de dominio, SMTP o plugins se hace en app.yml y se aplica reconstruyendo el contenedor. Abre el archivo:

sudo nano /var/discourse/containers/app.yml

Las variables de correo están en la sección env. Un ejemplo con SMTP en el puerto 587:

env:
  DISCOURSE_HOSTNAME: foro.example.com
  DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
  DISCOURSE_SMTP_ADDRESS: smtp.your_provider.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: your_smtp_user
  DISCOURSE_SMTP_PASSWORD: "your_smtp_password"
  DISCOURSE_NOTIFICATION_EMAIL: [email protected]
  LETSENCRYPT_ACCOUNT_EMAIL: [email protected]

El ejemplo muestra solo las claves más habituales: no borres el resto de variables que generó el asistente. Guarda el archivo y reconstruye:

cd /var/discourse
sudo ./launcher rebuild app

La reconstrucción deja el foro fuera de servicio unos minutos. Para comprobar que el correo sale, ve a Admin > Correo electrónico y envía un correo de prueba a tu dirección.

Paso 7: Instalar plugins

Muchos plugins oficiales, como Solved, Reactions, Assign, Chat o Data Explorer, ya vienen incluidos en Discourse. Revisa Admin > Plugins antes de instalar nada: si el plugin aparece en la lista, basta con activarlo desde su configuración.

Los plugins que no vienen incluidos se añaden en app.yml, en la sección hooks, clonando su repositorio. Abre el archivo:

sudo nano /var/discourse/containers/app.yml

Añade una línea git clone por plugin bajo la línea de docker_manager, que ya está presente:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/your_org/your_plugin.git

Sustituye la URL por la del repositorio del plugin que quieras instalar y reconstruye el contenedor:

cd /var/discourse
sudo ./launcher rebuild app

Cuando termine, el plugin aparecerá en Admin > Plugins. Si la reconstrucción falla por un plugin incompatible, elimina su línea y vuelve a reconstruir.

Paso 8: Copias de seguridad

Discourse genera copias de seguridad completas (base de datos y, opcionalmente, archivos subidos) desde Admin > Copias de seguridad. Ahí puedes lanzar una copia manual y ajustar la frecuencia automática y el número de copias conservadas con los ajustes backup_frequency y maximum_backups.

Las copias se guardan en el host, en /var/discourse/shared/standalone/backups/default/:

sudo ls -lh /var/discourse/shared/standalone/backups/default/
-rw-r--r-- 1 1000 www-data 48M Sep 25 03:30 foro-2026-09-25-033000-v20260915120000.tar.gz

Una copia que solo vive en el mismo servidor no protege frente a la pérdida del disco. La opción más sencilla es enviar las copias a un almacenamiento compatible con S3, que Discourse admite de forma nativa: elige S3 como ubicación de las copias en los ajustes de copias de seguridad e indica el bucket y las credenciales en los ajustes de S3 del panel. Si prefieres copiarlas por SSH, sincroniza ese directorio desde otra máquina con rsync usando una cuenta con permiso de lectura sobre él.

Paso 9: Actualizar Discourse

La forma recomendada es la interfaz web: abre https://foro.example.com/admin/upgrade y pulsa Actualizar. Cuando la actualización requiere una nueva imagen base, la página te pedirá hacerlo por línea de comandos:

cd /var/discourse
sudo git pull
sudo ./launcher rebuild app

Mantén también el sistema operativo al día. Activa las actualizaciones de seguridad automáticas de Ubuntu:

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

Solución de problemas

Los puertos 80 o 443 están ocupados. El asistente se detiene si otro servicio usa esos puertos. Averigua cuál es y desactívalo:

sudo ss -tlnp | grep -E ':(80|443) '
sudo systemctl disable --now nginx

Falla la verificación de DNS o el certificado. Comprueba con dig +short foro.example.com que el registro A apunta a la IP del servidor y que no hay un proxy delante (por ejemplo, el modo proxy de Cloudflare) durante la instalación.

Errores durante la construcción. Revisa los registros del contenedor y el log de Rails:

cd /var/discourse
sudo ./launcher logs app
sudo tail -n 50 /var/discourse/shared/standalone/log/rails/production.log

No llegan los correos. Verifica las credenciales SMTP en app.yml, reconstruye y envía un correo de prueba desde Admin > Correo electrónico. Si el proveedor lo rechaza, revisa que el dominio remitente tenga SPF y DKIM configurados.

Conclusión

Tienes un foro Discourse funcionando en Ubuntu 24.04 dentro de un contenedor Docker, con HTTPS automático y la cuenta de administración creada. Todos los cambios de infraestructura pasan por app.yml y ./launcher rebuild app, y el resto se configura desde el panel de administración. Como siguientes pasos, configura el almacenamiento de copias en S3, añade inicio de sesión con Google o GitHub desde Admin > Inicio de sesión y crea las categorías y niveles de confianza de tu comunidad.