NodeBB vs Discourse: Which Forum to Self-Host?
Quick Verdict
Discourse is the better choice for most self-hosted communities. It has a vastly larger plugin ecosystem, stronger moderation tools, proven scalability to millions of posts, and powers some of the biggest open-source communities on the internet. NodeBB is worth considering if your team already runs a Node.js stack, you want real-time chat-like interactions out of the box, or you need a forum that runs on less RAM.
Overview
Both Discourse and NodeBB are modern forum platforms designed to replace aging software like phpBB and vBulletin. They share a focus on real-time updates, mobile-friendly design, and extensibility through plugins, but they differ in architecture, resource requirements, and ecosystem maturity.
Discourse — GPL-2.0 license, 43k+ GitHub stars. Built with Ruby on Rails and Ember.js. Created by Jeff Atwood (co-founder of Stack Overflow). Powers communities for GitHub, Docker, Rust, Mozilla, and hundreds of major projects. The de facto standard for modern self-hosted forums.
NodeBB — GPL-3.0 license, 14k+ GitHub stars. Built with Node.js (Express) and vanilla JavaScript on the frontend. Supports MongoDB, PostgreSQL, or Redis as database backends. Emphasizes real-time features and a lighter resource footprint.
Feature Comparison
| Feature | Discourse | NodeBB |
|---|---|---|
| Real-time updates | Yes (via MessageBus) | Yes (via Socket.IO, native) |
| Chat / messaging | Built-in chat channels | Built-in real-time chat |
| Markdown support | Yes | Yes |
| Categories & subcategories | Yes | Yes |
| Tags | Yes | Yes |
| User trust levels | Yes (automated 5-level system) | Manual groups only |
| Private messaging | Yes | Yes |
| Moderation tools | Extensive (flags, review queue, silence, suspend) | Moderate (flags, bans, IP blacklist) |
| Spam prevention | Built-in (Akismet, rate limiting, new user restrictions) | Plugin-based |
| SSO / OAuth | Built-in (SAML, OAuth2, OIDC) | Plugin-based (OAuth, LDAP) |
| Full REST API | Yes | Yes |
| Plugin ecosystem | 200+ official and community plugins | 100+ plugins (smaller ecosystem) |
| Mobile app | Discourse Hub (official) | No official app (responsive web) |
| Email integration | Reply-by-email, mailing list mode | Basic email notifications |
| Search | Full-text, filterable | Full-text with real-time results |
| Theming | SCSS-based, customizable | Themes + widgets, more flexible layout |
| Database | PostgreSQL only | MongoDB, PostgreSQL, or Redis |
| Language | Ruby on Rails + Ember.js | Node.js + Express |
| License | GPL-2.0 | GPL-3.0 |
Docker Deployment
Discourse
Discourse uses its own launcher system rather than a standard Docker Compose file. This is unconventional but intentional — the launcher handles database migrations, plugin installation, and rebuilds. For a full walkthrough, see our Discourse setup guide.
However, the Bitnami image provides a standard Docker Compose deployment:
services:
postgresql:
image: bitnami/postgresql:16.6.0
volumes:
- postgresql_data:/bitnami/postgresql
environment:
- POSTGRESQL_USERNAME=bn_discourse
- POSTGRESQL_DATABASE=bitnami_discourse
# CHANGE THIS: Set a strong database password
- POSTGRESQL_PASSWORD=change_me_db_password
restart: unless-stopped
redis:
image: bitnami/redis:7.4.2
volumes:
- redis_data:/bitnami/redis/data
environment:
# CHANGE THIS: Set a strong Redis password
- REDIS_PASSWORD=change_me_redis_password
restart: unless-stopped
discourse:
image: bitnami/discourse:2026.2.0
ports:
- "80:3000"
volumes:
- discourse_data:/bitnami/discourse
depends_on:
- postgresql
- redis
environment:
# Database configuration
- DISCOURSE_DATABASE_HOST=postgresql
- DISCOURSE_DATABASE_PORT_NUMBER=5432
- DISCOURSE_DATABASE_USER=bn_discourse
- DISCOURSE_DATABASE_NAME=bitnami_discourse
# CHANGE THIS: Must match POSTGRESQL_PASSWORD above
- DISCOURSE_DATABASE_PASSWORD=change_me_db_password
# Redis configuration
- DISCOURSE_REDIS_HOST=redis
- DISCOURSE_REDIS_PORT_NUMBER=6379
# CHANGE THIS: Must match REDIS_PASSWORD above
- DISCOURSE_REDIS_PASSWORD=change_me_redis_password
# Site configuration
# CHANGE THIS: Your actual domain
- DISCOURSE_HOST=forum.example.com
- DISCOURSE_SITE_NAME=My Community
# Admin account
# CHANGE THIS: Set admin credentials
- DISCOURSE_USERNAME=admin
- DISCOURSE_PASSWORD=change_me_admin_password
- [email protected]
# SMTP configuration (required -- Discourse won't work without email)
# CHANGE THIS: Your SMTP credentials
- DISCOURSE_SMTP_HOST=smtp.example.com
- DISCOURSE_SMTP_PORT=587
- [email protected]
- DISCOURSE_SMTP_PASSWORD=change_me_smtp_password
- DISCOURSE_SMTP_PROTOCOL=tls
restart: unless-stopped
sidekiq:
image: bitnami/discourse:2026.2.0
depends_on:
- discourse
volumes:
- discourse_data:/bitnami/discourse
command: /opt/bitnami/scripts/discourse-sidekiq/run.sh
environment:
# Must match all Discourse environment variables above
- DISCOURSE_DATABASE_HOST=postgresql
- DISCOURSE_DATABASE_PORT_NUMBER=5432
- DISCOURSE_DATABASE_USER=bn_discourse
- DISCOURSE_DATABASE_NAME=bitnami_discourse
- DISCOURSE_DATABASE_PASSWORD=change_me_db_password
- DISCOURSE_REDIS_HOST=redis
- DISCOURSE_REDIS_PORT_NUMBER=6379
- DISCOURSE_REDIS_PASSWORD=change_me_redis_password
- DISCOURSE_HOST=forum.example.com
- DISCOURSE_SMTP_HOST=smtp.example.com
- DISCOURSE_SMTP_PORT=587
- [email protected]
- DISCOURSE_SMTP_PASSWORD=change_me_smtp_password
- DISCOURSE_SMTP_PROTOCOL=tls
restart: unless-stopped
volumes:
postgresql_data:
redis_data:
discourse_data:
Discourse requires four services: PostgreSQL for data storage, Redis for caching and background jobs, the main Discourse web process, and Sidekiq for asynchronous job processing (emails, search indexing, scheduled tasks). SMTP configuration is mandatory — Discourse refuses to function without working email.
NodeBB
NodeBB offers a standard Docker Compose deployment with your choice of database backend. This example uses MongoDB, which is the most common configuration:
services:
nodebb:
image: ghcr.io/nodebb/nodebb:v4.8.1
ports:
- "4567:4567"
volumes:
- nodebb_build:/usr/src/app/build
- nodebb_uploads:/usr/src/app/public/uploads
- nodebb_config:/opt/config
depends_on:
- mongo
environment:
# Database connection
- MONGO_HOST=mongo
- MONGO_PORT=27017
- MONGO_USERNAME=nodebb
- MONGO_PASSWORD=change_me_mongo_password
- MONGO_DATABASE=nodebb
restart: unless-stopped
mongo:
image: mongo:7.0.16-jammy
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
environment:
- MONGO_INITDB_ROOT_USERNAME=nodebb
# CHANGE THIS: Set a strong password
- MONGO_INITDB_ROOT_PASSWORD=change_me_mongo_password
- MONGO_INITDB_DATABASE=nodebb
restart: unless-stopped
volumes:
nodebb_build:
nodebb_uploads:
mongo_data:
nodebb_config:
After starting, the NodeBB web installer runs at http://localhost:4567. The setup wizard walks you through admin account creation and database connection. NodeBB needs only two services — the application and a database — which makes it simpler to deploy and maintain than Discourse.
Installation Complexity
Discourse is harder to install. The official deployment method uses a custom launcher script (discourse_docker) rather than standard Docker Compose. You clone a repository, edit a YAML configuration file, and run ./launcher bootstrap app. It handles a lot for you (database migrations, asset compilation, plugin installation) but the non-standard approach means you cannot manage it the same way as your other Docker services. The Bitnami image shown above provides a more conventional Compose-based setup, but it adds a layer of abstraction over the official Discourse deployment.
NodeBB is straightforward. Clone the repo, run docker compose --profile mongo up, and the web installer handles the rest. The standard Docker Compose workflow means NodeBB fits neatly alongside your other self-hosted services managed by Portainer or Dockge. Updates follow the normal image pull and recreate pattern.
Performance and Resource Usage
| Resource | Discourse | NodeBB |
|---|---|---|
| Minimum RAM | 2 GB (4 GB recommended) | 512 MB (1 GB recommended) |
| Idle RAM usage | ~800 MB - 1.2 GB | ~200 - 400 MB |
| CPU at idle | Low-moderate | Low |
| Disk (application) | ~2 GB | ~500 MB |
| First page load | Moderate (Ember.js SPA) | Fast (server-rendered + Socket.IO) |
| Subsequent navigation | Fast (SPA routing) | Fast (real-time updates) |
NodeBB is significantly lighter. It runs comfortably on a 1 GB VPS, while Discourse genuinely needs 2 GB minimum and will swap aggressively on anything less. If you are running a small forum on a Raspberry Pi or a budget VPS, NodeBB is the practical choice. Discourse’s Ruby on Rails stack and Ember.js frontend are more resource-intensive but deliver a richer feature set in return.
Community and Support
Discourse dominates here. It powers the official forums for hundreds of major open-source projects (Docker, Rust, Netlify, Cloudflare, Let’s Encrypt). The plugin ecosystem has 200+ options. The meta.discourse.org community is one of the most active support forums on the internet, with the core team responding regularly. Documentation is thorough.
NodeBB has a smaller but dedicated community. The plugin ecosystem is growing but still roughly half the size of Discourse’s. The community.nodebb.org forum is active, and the core team is responsive to issues. Documentation covers the basics well but has gaps for advanced configurations. NodeBB also offers a commercial hosted version, which funds ongoing development.
Plugin and Customization Ecosystem
Discourse’s plugin system is mature and well-documented. Popular plugins include voting, events calendars, solved topics (mark answers), data explorer (SQL queries on your forum data), custom layouts, and integrations with Slack, Discord, and Zapier. Many plugins are officially maintained by the Discourse team.
NodeBB’s plugin system uses npm packages, which feels natural if you are a Node.js developer. There are plugins for social login, emoji, markdown extensions, spam detection, and theme customization. The widget system gives you more layout flexibility than Discourse’s relatively rigid structure. Writing custom plugins is easier in NodeBB if you already know JavaScript — no need to learn Ruby.
Use Cases
Choose Discourse If…
- You need a general-purpose community forum with proven scalability
- Strong moderation tools are a priority (trust levels, review queues, automated spam handling)
- You want reply-by-email and mailing list mode for users who prefer email over web forums
- Your community will grow beyond a few hundred active users
- You need the largest plugin ecosystem with the most third-party integrations
- You do not mind the higher RAM requirements
Choose NodeBB If…
- Real-time, chat-like interaction is central to your community experience
- You run a Node.js stack and want to write custom plugins in JavaScript
- Your server has limited RAM (1 GB or less)
- You want a standard Docker Compose deployment that integrates cleanly with your existing services
- You prefer MongoDB, PostgreSQL, or Redis flexibility over being locked into PostgreSQL
- You want more control over layout and theming through the widget system
Final Verdict
Discourse is the better forum for most self-hosted communities. It has the larger ecosystem, stronger moderation tooling, proven track record at scale, and the kind of battle-tested reliability that comes from powering thousands of production communities. The resource overhead is real — plan for 2-4 GB of RAM — but you get a complete community platform in return.
NodeBB earns its place for teams in the Node.js ecosystem and for anyone running forums on constrained hardware. Its real-time capabilities are genuinely better than Discourse’s, the standard Docker Compose deployment is less friction to manage, and at a quarter of the RAM cost it is the pragmatic choice for smaller communities. If your forum will have under 500 active users and you want something that runs alongside your other services without dominating your server, NodeBB delivers.
Pick Discourse for scale and ecosystem. Pick NodeBB for lightweight real-time forums.
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments