SSD Nodes Learn 🎉 VPS desde $5.50/mes
Guías Matt ConnorPor Matt Connor · Actualizado 2026-08-07

Comparativa de software de foros autoalojados

Compara Discourse, Flarum, NodeBB y phpBB en un VPS: RAM real, base de datos, control del spam y opciones de migración cuando necesites cambiar.

¿Qué software de foro autoalojado debería ejecutar?

Actualmente, el software de foro autoalojado se reduce a cuatro opciones reales que puede ejecutar en un VPS (servidor privado virtual): Discourse, Flarum, NodeBB y phpBB. Discourse es la opción predeterminada adecuada si puede asignarle 4 GB de RAM y cuenta con al menos dos personas dispuestas a moderar. Con 1 GB y un moderador, use Flarum o phpBB. Un foro tranquilo que puede mantener limpio es mejor que un foro superior que no puede mantener.

La instalación es la parte sencilla. Cualquiera de estas opciones puede estar funcionando en una tarde. Lo que determina que el foro siga existiendo dentro de un año es la cola de reportes y la ruta del correo, así que lea las secciones sobre moderación y correo antes de revisar las listas de funciones.

¿Qué necesita realmente un foro para funcionar?

Un foro tiene cuatro componentes, no uno: un proceso de aplicación, una base de datos que debe sobrevivir al proceso, un directorio para los avatares y archivos adjuntos subidos, y una ruta funcional para enviar correo. La aplicación se puede sustituir. La base de datos no, porque todas las publicaciones, cuentas y mensajes privados se almacenan en ella. Por eso, la base de datos que eligió cada proyecto es la línea más importante de las secciones siguientes. Determina cómo será la exportación el día que quiera migrar.

El segundo coste es humano. El registro público y la publicación pública provocan registros de bots, normalmente durante la primera semana desde que el dominio aparece en un rastreo. Los cuatro componentes se pueden proteger. Sólo uno incluye este flujo de trabajo en el núcleo.

Discourse: la opción predeterminada y su coste real

Discourse está basado en Ruby on Rails, usa PostgreSQL para los datos y Redis para la caché y las colas de trabajos, y ejecuta el trabajo en segundo plano con Sidekiq. La instalación compatible incluye todos esos componentes en un único contenedor Docker, creado a partir de un archivo de configuración en /var/discourse/containers/app.yml. No tiene que instalar los componentes por separado.

wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse | sudo bash

Ese script instala git y Docker si faltan, clona discourse_docker en /var/discourse y luego inicia el asistente interactivo discourse-setup. El asistente solicita el nombre de host, una dirección de correo del administrador y los datos de SMTP (protocolo simple de transferencia de correo), escribe app.yml y crea el contenedor. Los puertos 80 y 443 deben estar libres, porque el contenedor ejecuta su propio nginx y solicita un certificado de Let's Encrypt.

El mínimo publicado es 1 GB de RAM con swap, además de 10 GB de disco. Interprete literalmente la parte de swap. El script de instalación crea un archivo de swap de 2 GB con fallocate -l 2G /swapfile cuando el asistente determina que el servidor lo necesita, y esa swap es necesaria. El pico de memoria no corresponde al sitio en ejecución. Corresponde a ./launcher rebuild app, que recompila los recursos JavaScript y CSS dentro del contenedor en cada actualización. En un servidor con 1 GB y sin swap, ese paso termina de forma forzada, la compilación finaliza sin mostrar un error útil y dmesg | tail muestra una línea Out of memory: Killed process. Asigne 2 GB para ejecutarlo con un margen razonable y 4 GB cuando el foro tenga actividad.

Las actualizaciones se ejecutan desde /admin/upgrade en el navegador o desde el shell:

cd /var/discourse
./launcher rebuild app

rebuild destruye el contenedor en ejecución, crea uno nuevo a partir de app.yml y lo inicia, por lo que el sitio queda fuera de servicio durante los varios minutos que tarda el proceso. En un único contenedor no hay forma de evitarlo. Separar PostgreSQL y la aplicación en dos contenedores mediante los ejemplos data.yml y web_only.yml mantiene PostgreSQL activo mientras se recompila el contenedor web. Esto merece la pena cuando ya tiene usuarios que lo notan.

La moderación es el motivo por el que Discourse necesita tanta RAM. Las cuentas nuevas empiezan en el nivel de confianza 0, con límites estrictos sobre cuántos enlaces pueden publicar y con qué frecuencia. Después suben de nivel a medida que leen y participan. Las denuncias llegan a una cola de revisión que registra quién gestionó cada caso. Las integraciones con Akismet y StopForumSpam son plugins oficiales. En las otras tres opciones, debe montar esta funcionalidad con complementos.

La migración a Discourse es su característica más sólida. El directorio script/import_scripts/ del árbol de código fuente contiene más de sesenta importadores, incluidos phpbb3.rb, vbulletin.rb, xenforo.rb, vanilla.rb, mybb.rb, flarum_import.rb, un directorio nodebb y un importador mbox para archivos de listas de correo. Son scripts de Ruby que se ejecutan dentro del contenedor contra una copia de la base de datos antigua. Son lentos, pero reciben mantenimiento.

La migración desde Discourse es su punto débil. ./launcher enter app seguido de discourse backup escribe un .tar.gz que contiene un volcado de PostgreSQL y el directorio de archivos subidos. Otra instancia de Discourse puede restaurarlo. Ningún otro sistema puede leerlo, por lo que abandonar Discourse implica escribir usted mismo las consultas SQL contra ese volcado. Asegúrese de poder aceptar esta limitación antes de importar 50,000 publicaciones.

Flarum: el foro PHP ligero

Flarum es una aplicación PHP convencional: php-fpm detrás de nginx o Apache, una base de datos MySQL o MariaDB y archivos en disco. Los requisitos documentados son PHP 7.3 o posterior con las extensiones curl, dom, fileinfo, gd, json, mbstring, openssl, pdo_mysql, tokenizer y zip, además de MySQL 5.6+ (u 8.0.23+) o MariaDB 10.0.5+. Ubuntu 24.04 incluye PHP 8.3, que supera ese mínimo.

Preste atención a pdo_mysql en esa lista. Flarum no admite PostgreSQL ni SQLite. Si quería una base de datos en un solo archivo, ese es phpBB, que se describe más abajo.

sudo apt update
sudo apt install -y nginx mariadb-server composer php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip
sudo install -d -m 755 /srv/flarum
cd /srv/flarum
sudo COMPOSER_ALLOW_SUPERUSER=1 composer create-project flarum/flarum:^1.8.0 .
sudo chown -R www-data:www-data /srv/flarum

Configure el servidor web para usar /srv/flarum/public, no /srv/flarum. El código de la aplicación, el archivo de configuración y la contraseña de la base de datos están un nivel por encima de public, por lo que un document root demasiado alto expone sus credenciales a cualquiera que las solicite. En Apache también necesita mod_rewrite y AllowOverride All para que se aplique el archivo incluido .htaccess. En nginx, incluya el archivo incluido .nginx.conf dentro del bloque server. Después, acceda al dominio. El instalador de Flarum solicitará la base de datos y la cuenta de administrador.

Versiones a agosto de 2026: 1.8.17 es la versión estable actual, publicada en junio de 2026, y 2.0 está en la release candidate 5. No inicie una comunidad nueva con la release candidate. Cuando llegue 2.0, será necesario actualizar las extensiones antes de que puedan cargarse. Esa es la actualización que puede costarle un fin de semana.

El consumo de recursos es bajo. Unos pocos procesos de php-fpm, MariaDB usando unos cientos de MB y archivos estáticos. Una comunidad pequeña cabe en 1 GB.

La moderación es su principal debilidad. El núcleo proporciona informes y permisos por grupo. Las colas de aprobación y el bloqueo de spam proceden de extensiones, principalmente de la colección FriendsOfFlarum, instaladas con composer require y activadas en el panel de administración. Actualmente funciona. Sin embargo, depende de un ecosistema de voluntarios más pequeño que el de phpBB o Discourse. Además, una extensión sin mantenimiento bloquea la siguiente actualización del núcleo porque composer se niega a resolverla con la nueva versión.

Extraer los datos es sencillo: mysqldump la base de datos y copie el directorio de assets. Importarlos es más difícil. Discourse incluye flarum_import.rb para la migración de Flarum a Discourse, lo que indica en qué dirección suele circular el tráfico. La importación de phpBB a Flarum se realiza mediante extensiones de la comunidad, no mediante una herramienta oficial. Por tanto, pruebe una contra una copia antes de confiarle la única copia.

NodeBB: publicación en tiempo real y el coste asociado

NodeBB está basado en Node.js. Envía las publicaciones nuevas a los navegadores abiertos mediante websockets, por lo que un hilo activo se actualiza sin recargar la página. Esa es la razón para elegirlo. El README requiere Node.js 22 o una versión posterior y MongoDB 5+ o Redis 7.2+, aunque el árbol de código fuente incluye un controlador de PostgreSQL como tercera opción.

Usar Redis como base de datos principal es el problema de esa frase. Redis mantiene el conjunto de datos en memoria, por lo que el requisito de RAM crece con el foro en lugar de mantenerse estable. MongoDB o PostgreSQL conservan los datos en disco y almacenan en caché los que se usan con frecuencia. Elija Redis sólo si puede explicar el motivo.

Ubuntu 24.04 incluye Node.js 18, que está por debajo de la versión mínima requerida, así que instale primero un runtime actual.

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs git build-essential
sudo adduser --system --group --home /srv/nodebb nodebb
sudo -u nodebb git clone -b v4.x https://github.com/NodeBB/NodeBB.git /srv/nodebb
cd /srv/nodebb
sudo -u nodebb ./nodebb setup

./nodebb setup es interactivo. Pregunta qué base de datos se utilizará y cómo conectarse a ella. Después crea la cuenta de administrador y selecciona un puerto, cuyo valor predeterminado es 4567. NodeBB no se inicia con npm start. El script ./nodebb es la interfaz, y ./nodebb log es donde se envía la salida.

./nodebb start se ejecuta como daemon, lo que no es correcto en una máquina que se reinicia. Ejecute el loader en primer plano mediante systemd.

[Unit]
Description=NodeBB
After=network.target

[Service]
Type=simple
User=nodebb
WorkingDirectory=/srv/nodebb
ExecStart=/usr/bin/env node loader.js --no-daemon
Restart=on-failure

[Install]
WantedBy=multi-user.target

--no-daemon es la parte que suele omitirse. Sin ella, el loader crea un proceso hijo y el proceso padre termina. Por eso systemctl status nodebb informa de que la unidad está detenida, aunque curl localhost:4567 sigue respondiendo, y systemctl stop nodebb no detiene nada. Detrás de un reverse proxy, las cabeceras de actualización de websocket deben reenviarse. Si faltan proxy_set_header Upgrade $http_upgrade; y proxy_set_header Connection "upgrade"; en el bloque de nginx, el foro se carga, la consola del navegador se llena de solicitudes socket.io fallidas y las publicaciones nuevas dejan de aparecer hasta que el lector recarga la página.

La moderación se sitúa entre Flarum y Discourse. El panel de administración incluye una cola de avisos, permisos por categoría y un sistema de reputación. La protección contra spam se obtiene mediante plugins comunitarios como nodebb-plugin-spam-be-gone, que integra Akismet y StopForumSpam.

Las copias de seguridad son manuales, y nadie lo menciona hasta el día en que necesita una. La CLI ./nodebb no tiene ningún comando de copia de seguridad. Debe volcar la base de datos por su cuenta con mongodump o pg_dump y copiar también el directorio public/uploads y config.json. config.json contiene las credenciales de la base de datos y la URL del sitio, por lo que restaurar sin él equivale a realizar una instalación nueva. Tampoco existe un importador oficial. nodebb-plugin-import es un proyecto comunitario que no se ha mantenido al día, mientras que Discourse incluye un importador de NodeBB. Por tanto, la vía de migración que funciona de forma fiable lleva a Discourse.

phpBB: el pequeño y poco llamativo que sigue funcionando

phpBB es antiguo, y ese es precisamente su argumento. La línea 3.3 funciona con PHP 7.2.0 hasta PHP 8.3, ambos incluidos, y es compatible con MySQL 4.1.3+, MariaDB 5.1+, PostgreSQL 8.3+, SQLite 3.6.15+, MS SQL Server y Oracle. Necesita compatibilidad con json, mbstring y XML, además de tener habilitada la función getimagesize().

SQLite es la razón por la que aparece en esta lista. Con SQLite, el foro consta de un directorio de archivos PHP y un único archivo de base de datos. No hay ningún servidor de bases de datos, nada que ajustar ni componentes adicionales que incluir en las copias de seguridad. En un VPS de 1 GB que ya ejecuta otro servicio, la diferencia es importante. Use SQLite para una comunidad pequeña y cambie a MySQL cuando aumenten las publicaciones simultáneas, porque SQLite serializa las escrituras y las publicaciones empiezan a esperar unas detrás de otras.

No hay ningún paso con composer ni ningún contenedor. Instale un servidor web con PHP, descomprima el archivo y ejecute el instalador en el navegador. La configuración completa de la pila se explica en una pila LAMP estándar en Ubuntu 24.04.

sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-mysql php-mbstring php-xml php-gd unzip

Descargue la versión 3.3 actual desde phpbb.com, descomprímala en el directorio que sirve su vhost y haga que las rutas en las que escribe el instalador tengan permisos de escritura para el usuario del servidor web.

sudo chown -R www-data:www-data /srv/phpbb
sudo chmod 660 /srv/phpbb/config.php
sudo chmod -R 770 /srv/phpbb/store /srv/phpbb/cache /srv/phpbb/files /srv/phpbb/images/avatars/upload

Las instrucciones oficiales indican 666 y 777. Esos valores están pensados para el hosting compartido, donde no se controla con qué usuario se ejecuta PHP. En su propio VPS sí puede controlarlo, así que asigne la propiedad a www-data y bloquee el acceso al resto. Hay un detalle de Apache que suele causar problemas: la configuración de Ubuntu sólo concede acceso bajo su propia raíz de documentos predeterminada, por lo que un vhost que apunte a /srv/phpbb también necesita un bloque <Directory> equivalente con Require all granted, o todas las peticiones devolverán 403 Forbidden antes de que se llegue a phpBB. Termine la instalación en el navegador en /install/index.php, vuelva a establecer config.php en 640 y elimine el directorio install/. phpBB seguirá mostrando advertencias sobre ese directorio hasta que lo elimine.

El spam es el problema conocido de phpBB, y tiene solución. El formulario de registro está en una URL predecible (ucp.php?mode=register), por lo que los bots lo encuentran a los pocos días de rastrear el dominio. La solución eficaz está en el panel de administración, en Spambot countermeasures: establezca el método antispam en Question and Answer y escriba una pregunta que sólo pueda responder alguien de su comunidad. Los servicios que cobran por cada mil resuelven barato los CAPTCHA de imágenes (completely automated public Turing tests). Una pregunta sobre su propio tema no.

phpBB también es la fuente con mejor compatibilidad para una migración. El phpbb3.rb de Discourse es el importador más utilizado de todo este artículo, y en los foros de soporte de phpBB hay respuestas acumuladas durante veinte años. Para salir puede usar mysqldump o copiar el archivo de SQLite. Lo que no se conserva son sus estilos y extensiones.

¿Por qué nunca llegan los correos de registro del foro?

El registro en los cuatro foros requiere un correo de confirmación. Si ese correo no llega, la cuenta nunca se activa y los registros muestran un registro que simplemente se interrumpió. La entregabilidad del correo saliente determina si el foro funciona, así que debe tratarse como parte de la instalación.

  • La mayoría de los proveedores de VPS bloquean el puerto saliente 25 de forma predeterminada, por lo que un Postfix local que intenta entregar el correo directamente no consigue enviarlo. El registro de correo muestra connect to gmail-smtp-in.l.google.com[...]:25: Connection timed out.
  • Una dirección IP nueva no tiene reputación de envío, por lo que incluso los mensajes entregados correctamente terminan en la carpeta de spam. En el caso de un enlace de confirmación, eso equivale a que el mensaje no llegue.
  • Sin registros SPF (sender policy framework) y DKIM (domainkeys identified mail) publicados en DNS, los proveedores grandes rechazan el mensaje directamente. El rechazo de Google es 550 5.7.26 Unauthenticated email from example.com is not accepted due to domain's DMARC policy. DMARC (domain-based message authentication, reporting and conformance) ya se espera de cualquiera que envíe correo en volumen.

La solución práctica es usar un relay. Configure los ajustes SMTP del foro para usar un proveedor de correo transaccional en el puerto 587, publique los registros SPF, DKIM y DMARC que le proporcione el proveedor y envíe desde un subdominio como mail.example.com para mantener separada la reputación del foro de su correo personal. Es posible ejecutar el servidor de correo por cuenta propia y un servidor de correo completamente autogestionado en un VPS lo explica, pero el lanzamiento de un foro no es el momento adecuado para aprender sobre entregabilidad.

Pruebe el envío antes de anunciar el foro. En Discourse, desde dentro del contenedor:

cd /var/discourse
./launcher enter app
rake emails:test[you@example.com]

La tarea comprueba la conexión SMTP y envía un mensaje. También identifica el fallo cuando las credenciales son incorrectas, normalmente como Net::SMTPAuthenticationError. phpBB tiene una prueba equivalente en el panel de administración, en Client communication. En Flarum y NodeBB, registre una cuenta temporal usando un buzón real de un proveedor grande y lea las cabeceras sin procesar del mensaje recibido. spf=pass y dkim=pass en la cabecera Authentication-Results son el resultado que debe buscar.

Hay una particularidad en Discourse. En agosto de 2026, el asistente de configuración permite omitir SMTP y usar Discourse ID, que autentica a los usuarios con una cuenta externa en lugar de un enlace enviado por correo. Esto permite poner el foro en funcionamiento sin un relay. No proporciona correo de notificaciones ni restablecimiento de contraseñas, por lo que debe configurar SMTP de todos modos antes de que crezca la comunidad.

¿Cómo se configura TLS para el foro?

Flarum y phpBB son hosts virtuales normales, por lo que basta con usar certbot en el servidor web que ya está en ejecución. NodeBB y Discourse son distintos: son aplicaciones que escuchan en puertos locales y necesitan un componente frontal que termine TLS (seguridad de la capa de transporte) y enrute las peticiones según el nombre de host. Si el foro comparte el servidor con otros servicios, coloque un único reverse proxy delante de todos ellos. Para eso sirve Traefik delante de varias aplicaciones de Docker Compose.

De forma predeterminada, Discourse usa directamente los puertos 80 y 443, con su propio nginx y su propia plantilla de Let's Encrypt. Para colocarlo detrás de un proxy existente, edite app.yml, elimine la línea templates/web.letsencrypt.ssl.template.yml, cambie los puertos publicados para que el contenedor escuche sólo en una dirección local y, después, ejecute ./launcher rebuild app. Si lo hace posteriormente, tendrá que reconstruir el contenedor y habrá unos minutos de indisponibilidad. Decida esta configuración antes de instalarlo, no después.

¿Qué foro se adapta al tamaño de tu comunidad?

La regla de decisión depende de las personas, no de las funciones.

  • Menos de unos cientos de miembros, un moderador y 1 GB de RAM: phpBB con SQLite o Flarum si quieres una interfaz moderna y puedes ejecutar MariaDB. Cada uno es una sola aplicación PHP que debes mantener actualizada.
  • Una comunidad en crecimiento, dos o más moderadores y 4 GB de RAM: Discourse. Los niveles de confianza y la cola de revisión justifican el consumo de recursos en cuanto la moderación deja de caber en la cabeza de una sola persona.
  • Quieres conversación en tiempo real más que hilos duraderos: NodeBB o acepta que se trata de chat y ejecuta Rocket.Chat con Docker Compose en su lugar. Si en un foro no merece la pena leer nada una semana después, debería haber sido un servidor de chat.
  • Lo que realmente necesitas es documentación y no debate: ninguno de estos. BookStack, Wiki.js u Outline responde mejor a esa necesidad, y un foro lleno de preguntas repetidas suele indicar que falta una wiki.
  • Todavía estás decidiendo qué debe ejecutarse en el servidor: la lista más amplia de opciones de self-hosting para 2026 es un mejor punto de partida, y la guía de alternativas autoalojadas a Notion cubre la zona común entre los foros y los espacios de trabajo compartidos.

Elijas el que elijas, el foro sólo es tan resistente como la última copia de seguridad restaurada. Vuelca la base de datos según un calendario, copia el directorio de cargas en el mismo trabajo y restaura el resultado una vez en otro lugar para comprobar que el volcado se puede utilizar. Copias de seguridad programadas con restic en un VPS cubre esa parte, y es el único componente de esta configuración que no permite un segundo intento.

FAQ

¿Cuáles son los requisitos mínimos del servidor para un foro autohospedado?

phpBB con SQLite funciona con 1 GB de RAM junto con otros servicios porque no necesita un servidor de bases de datos. Flarum necesita 1 GB más MariaDB. NodeBB funciona correctamente con 2 GB y MongoDB. Discourse establece 1 GB con swap y 10 GB de disco como mínimo, pero 2 GB es el mínimo realista y 4 GB son adecuados para un foro con bastante actividad, porque ./launcher rebuild app recompila los recursos en memoria durante cada actualización. Ese es el momento en que el gestor de falta de memoria del kernel puede terminar un servidor pequeño.

¿Puedo migrar mi foro de phpBB a Discourse?

Sí. Es la ruta de migración con mejor compatibilidad de las opciones indicadas. Discourse incluye script/import_scripts/phpbb3.rb, que debe ejecutarse dentro del contenedor contra una copia de la base de datos de phpBB, nunca contra la base de datos activa. Se migran los usuarios, las categorías, los temas, las publicaciones y los archivos adjuntos. Los estilos y las extensiones no se migran, y las URL de los temas antiguos cambian. Por eso, configure redirecciones desde las rutas de phpBB antes de cambiar el DNS. Los foros grandes pueden tardar horas. Realice primero una prueba de la importación en un servidor temporal y mida su duración.

¿Por qué los usuarios nuevos nunca reciben el correo de activación?

La mayoría de los proveedores de VPS bloquean el puerto saliente 25. Por tanto, un servidor de correo local no puede entregar mensajes y el registro muestra Connection timed out para el intercambiador de correo del destinatario. Cuando la entrega funciona, una IP nueva sin registros SPF o DKIM puede ser rechazada o filtrada, y Google responde con 550 5.7.26 Unauthenticated email ... is not accepted due to domain's DMARC policy. Envíe el correo mediante un relay en el puerto 587 y publique los registros SPF, DKIM y DMARC que le proporcione ese relay. Después, confirme el funcionamiento con un registro de prueba y revise la cabecera Authentication-Results del mensaje recibido.

¿Qué software de foro autohospedado requiere menos trabajo de moderación?

Discourse, porque el flujo de trabajo forma parte del núcleo en lugar de añadirse mediante componentes externos. Las cuentas nuevas tienen límites de tasa hasta que leen una cantidad suficiente de contenido. Las denuncias se acumulan en una cola que registra quién actuó sobre ellas, y el plugin Akismet es oficial. phpBB se acerca a ese nivel cuando se activa el método antispam de preguntas y respuestas, que por sí solo detiene la mayoría de los registros automatizados. Flarum y NodeBB dependen de extensiones de la comunidad para esas mismas funciones. Nada de esto cambia el factor principal: la carga de moderación aumenta según el número de personas que publican, no según el software que utilizan.