NodeBB is an open-source, real-time forum platform built on Node.js and WebSockets, offering a high-performance alternative to Discourse Cloud.
Julian Lam, Andrew Rodrigues, and Barış Uşaklı created NodeBB in 2013 to replace page-reloading forum boards with an event-driven discussion engine powered by Node.js and WebSockets. That origin shapes how the platform operates today: every topic update, typing indicator, and direct message streams across persistent socket connections rather than repeated HTTP polling.
Discourse Cloud provides managed hosting for the Ruby on Rails community platform, but its hosted tiers enforce strict caps on monthly page views, storage, and custom plugins. Self-hosting Discourse directly avoids subscription pricing but demands an opinionated container stack combining Ruby, PostgreSQL, Redis, and Sidekiq. NodeBB counters this overhead with an asynchronous Node.js runtime capable of serving high-concurrency WebSocket connections on modest server hardware. Pushing topic replies and direct messages through persistent sockets eliminates client polling, keeping live discussions responsive during traffic spikes.
Operational flexibility further distinguishes the two systems. Discourse Cloud confines users to vendor-managed infrastructure, and self-hosted Discourse requires PostgreSQL. NodeBB lets homelab administrators choose between Redis, MongoDB, or PostgreSQL backends. Running NodeBB with Redis as the primary data store or as an inter-process pub-sub coordinator delivers high throughput with a smaller memory footprint than a multi-container Rails deployment. The operational trade-off lies in ongoing stack maintenance: administrators must handle Node.js upgrades, configure sticky sessions in an Nginx or Caddy reverse proxy, and schedule their own database backups.
How much memory does NodeBB require to run? A single NodeBB process with Redis typically operates inside 1 GB to 2 GB of RAM, though busy clustered deployments should allocate 4 GB or more.
NodeBB vs Discourse Cloud — how do they differ for self-hosters? Discourse Cloud charges recurring fees and restricts custom code, whereas self-hosted NodeBB provides full plugin freedom and flexible database options on your own hardware.
Does NodeBB support federated discussions through ActivityPub? Yes, current NodeBB releases include native ActivityPub support to federate categories and topics with external fediverse platforms.
NodeBB is an effective choice for administrators who want an interactive, real-time community forum without paying monthly cloud hosting fees, provided they are comfortable maintaining Node.js dependencies and an external database. Its GPL-3.0 terms ensure complete source control for private and commercial deployments alike, while active commits through August 2026 demonstrate steady upstream maintenance. For setups requiring a single-file SQLite database or zero-configuration installs, lighter bulletin boards may prove easier to operate.
We started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through NodeBB's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p nodebb && cd nodebb
curl -fsSL https://open-source.store/tools/nodebb/compose.yml -o compose.ymlcat > .env <<EOF
NODEBB_URL=http://localhost:4567
ADMIN_PASSWORD=$(openssl rand -hex 12)
EOFNODEBB_URL — Public URL of the forum (e.g. http://<your-server>:4567) used for links, redirects, and CORS.ADMIN_PASSWORD — Admin password for the initial administrator account. Generated above; keep it secret.docker compose up -dservices:
nodebb:
image: ghcr.io/nodebb/nodebb:4.16.7
restart: unless-stopped
ports:
- "4567:4567"
environment:
NODEBB_URL: ${NODEBB_URL}
NODEBB_ADMIN_USERNAME: admin
NODEBB_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
NODEBB_ADMIN_EMAIL: [email protected]
NODEBB_DB: redis
NODEBB_DB_HOST: redis
NODEBB_DB_PORT: 6379
NODEBB_INIT_VERB: setup
volumes:
- nodebb-build:/usr/src/app/build
- nodebb-uploads:/usr/src/app/public/uploads
- nodebb-config:/opt/config
depends_on:
redis:
condition: service_healthy
redis:
image: redis:8.10.1-alpine
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes", "--loglevel", "warning"]
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 5
volumes:
nodebb-build:
nodebb-uploads:
nodebb-config:
redis-data:
Lint, codegen, breaking-change checks and dependency management in one Git-native CLI. Open source, no registry lock-in.
Show that NodeBB is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 53 s: ghcr.io/nodebb/nodebb:4.16.7, redis:8.10.1-alpine.
Based on the upstream setup. Official compose with Redis backend. Image pinned to 4.16.7; automated setup via environment variables; public URL moved to env.
nodebb-1 | 2026-11-01T04:54:53.349499639Z 2026-11-01T04:54:53.349Z [4567/138] - error: POST /logIn nodebb-1 | 2026-11-01T04:54:53.349511181Z invalid csrf token nodebb-1 | 2026-11-01T04:54:53.351647264Z 2026-11-01T04:54:53.351Z [4567/138] - error: POST /logIn nodebb-1 | 2026-11-01T04:54:53.351652847Z invalid csrf token nodebb-1 | 2026-11-01T04:54:54.330836750Z 2026-11-01T04:54:54.330Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:54.330872291Z invalid csrf token nodebb-1 | 2026-11-01T04:54:54.370309166Z 2026-11-01T04:54:54.370Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:54.370323416Z invalid csrf token nodebb-1 | 2026-11-01T04:54:54.371668708Z 2026-11-01T04:54:54.371Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:54.371674083Z invalid csrf token nodebb-1 | 2026-11-01T04:54:54.395649500Z 2026-11-01T04:54:54.395Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:54.395660458Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.328771292Z 2026-11-01T04:54:56.328Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.328814709Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.329809500Z 2026-11-01T04:54:56.329Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.329826542Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.356997875Z 2026-11-01T04:54:56.356Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.357014750Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.363620792Z 2026-11-01T04:54:56.363Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.363634084Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.369929084Z 2026-11-01T04:54:56.369Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.369938667Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.376000750Z 2026-11-01T04:54:56.375Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.376008875Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.378896292Z 2026-11-01T04:54:56.378Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.378902959Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.380648500Z 2026-11-01T04:54:56.380Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.380651542Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.383308625Z 2026-11-01T04:54:56.383Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.383313917Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.383828625Z 2026-11-01T04:54:56.383Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.383831625Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.386154584Z 2026-11-01T04:54:56.386Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.386159292Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.386366500Z 2026-11-01T04:54:56.386Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.386368417Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.386586500Z 2026-11-01T04:54:56.386Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.386590959Z invalid csrf token nodebb-1 | 2026-11-01T04:54:56.387535875Z 2026-11-01T04:54:56.387Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:56.387537917Z invalid csrf token nodebb-1 | 2026-11-01T04:54:57.311152668Z 2026-11-01T04:54:57.310Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:57.311196459Z invalid csrf token nodebb-1 | 2026-11-01T04:54:57.334805126Z 2026-11-01T04:54:57.334Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:57.334827959Z invalid csrf token nodebb-1 | 2026-11-01T04:54:57.335580501Z 2026-11-01T04:54:57.335Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:57.335585418Z invalid csrf token nodebb-1 | 2026-11-01T04:54:57.340941584Z 2026-11-01T04:54:57.340Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:57.340946793Z invalid csrf token nodebb-1 | 2026-11-01T04:54:57.345546584Z 2026-11-01T04:54:57.345Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:57.345554209Z invalid csrf token nodebb-1 | 2026-11-01T04:54:57.345649751Z 2026-11-01T04:54:57.345Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:57.345651543Z invalid csrf token nodebb-1 | 2026-11-01T04:54:57.393645709Z 2026-11-01T04:54:57.393Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:57.393659209Z invalid csrf token nodebb-1 | 2026-11-01T04:54:57.396564751Z 2026-11-01T04:54:57.396Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:57.396571626Z invalid csrf token nodebb-1 | 2026-11-01T04:54:58.337632876Z 2026-11-01T04:54:58.337Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:58.337645210Z invalid csrf token nodebb-1 | 2026-11-01T04:54:58.344412293Z 2026-11-01T04:54:58.344Z [4567/138] - error: POST /login/ nodebb-1 | 2026-11-01T04:54:58.344423001Z invalid csrf token nodebb-1 | 2026-11-01T04:54:58.344599126Z 2026-11-01T04:54:58.344Z [4567/138] - error: POST /login/ nodebb-1 | 2026-11-01T04:54:58.344616293Z invalid csrf token nodebb-1 | 2026-11-01T04:54:58.348129335Z 2026-11-01T04:54:58.347Z [4567/138] - error: POST /api/admin/login nodebb-1 | 2026-11-01T04:54:58.348135126Z invalid csrf token nodebb-1 | 2026-11-01T04:54:58.354352918Z 2026-11-01T04:54:58.354Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:58.354361126Z invalid csrf token nodebb-1 | 2026-11-01T04:54:58.354788293Z 2026-11-01T04:54:58.354Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:58.354790835Z invalid csrf token nodebb-1 | 2026-11-01T04:54:58.369930585Z 2026-11-01T04:54:58.367Z [4567/138] - error: POST /api/admin/login nodebb-1 | 2026-11-01T04:54:58.369937876Z invalid csrf token nodebb-1 | 2026-11-01T04:54:58.369938960Z 2026-11-01T04:54:58.369Z [4567/138] - error: POST /ViewPoint/admin/Site/ViewPointLogin nodebb-1 | 2026-11-01T04:54:58.369939710Z SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2) nodebb-1 | 2026-11-01T04:54:58.369940293Z at JSON.parse (<anonymous>) nodebb-1 | 2026-11-01T04:54:58.369940835Z at parse (/usr/src/app/node_modules/body-parser/lib/types/json.js:93:21) nodebb-1 | 2026-11-01T04:54:58.369941418Z at /usr/src/app/node_modules/body-parser/lib/read.js:194:18 nodebb-1 | 2026-11-01T04:54:58.369941960Z at AsyncResource.runInAsyncScope (node:async_hooks:226:14) nodebb-1 | 2026-11-01T04:54:58.369942668Z at invokeCallback (/usr/src/app/node_modules/raw-body/index.js:238:16) nodebb-1 | 2026-11-01T04:54:58.369943210Z at done (/usr/src/app/node_modules/raw-body/index.js:227:7) nodebb-1 | 2026-11-01T04:54:58.369943751Z at IncomingMessage.onEnd (/usr/src/app/node_modules/raw-body/index.js:287:7) nodebb-1 | 2026-11-01T04:54:58.369944251Z at IncomingMessage.emit (node:events:514:20) nodebb-1 | 2026-11-01T04:54:58.369944751Z at endReadableNT (node:internal/streams/readable:2147:12) nodebb-1 | 2026-11-01T04:54:58.369945251Z at process.processTicksAndRejections (node:internal/process/task_queues:90:21) nodebb-1 | 2026-11-01T04:54:58.369988293Z 2026-11-01T04:54:58.369Z [4567/138] - error: POST /ViewPoint/admin/Site/ViewPointLogin nodebb-1 | 2026-11-01T04:54:58.369990335Z SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2) nodebb-1 | 2026-11-01T04:54:58.369993418Z at JSON.parse (<anonymous>) nodebb-1 | 2026-11-01T04:54:58.369994085Z at parse (/usr/src/app/node_modules/body-parser/lib/types/json.js:93:21) nodebb-1 | 2026-11-01T04:54:58.369994585Z at /usr/src/app/node_modules/body-parser/lib/read.js:194:18 nodebb-1 | 2026-11-01T04:54:58.369995126Z at AsyncResource.runInAsyncScope (node:async_hooks:226:14) nodebb-1 | 2026-11-01T04:54:58.369995668Z at invokeCallback (/usr/src/app/node_modules/raw-body/index.js:238:16) nodebb-1 | 2026-11-01T04:54:58.369996168Z at done (/usr/src/app/node_modules/raw-body/index.js:227:7) nodebb-1 | 2026-11-01T04:54:58.369996668Z at IncomingMessage.onEnd (/usr/src/app/node_modules/raw-body/index.js:287:7) nodebb-1 | 2026-11-01T04:54:58.369997210Z at IncomingMessage.emit (node:events:514:20) nodebb-1 | 2026-11-01T04:54:58.369997710Z at endReadableNT (node:internal/streams/readable:2147:12) nodebb-1 | 2026-11-01T04:54:58.369998210Z at process.processTicksAndRejections (node:internal/process/task_queues:90:21) nodebb-1 | 2026-11-01T04:54:58.370644293Z 2026-11-01T04:54:58.370Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:58.370647043Z invalid csrf token nodebb-1 | 2026-11-01T04:54:59.330578835Z 2026-11-01T04:54:59.329Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:59.330599669Z invalid csrf token nodebb-1 | 2026-11-01T04:54:59.330600544Z 2026-11-01T04:54:59.330Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:59.330601669Z invalid csrf token nodebb-1 | 2026-11-01T04:54:59.337388710Z 2026-11-01T04:54:59.337Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:59.337396127Z invalid csrf token nodebb-1 | 2026-11-01T04:54:59.351549919Z 2026-11-01T04:54:59.349Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:59.351631419Z invalid csrf token nodebb-1 | 2026-11-01T04:54:59.351632794Z 2026-11-01T04:54:59.351Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:59.351633627Z invalid csrf token nodebb-1 | 2026-11-01T04:54:59.356337377Z 2026-11-01T04:54:59.356Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:54:59.356361835Z invalid csrf token nodebb-1 | 2026-11-01T04:55:02.349016753Z 2026-11-01T04:55:02.348Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:55:02.349116087Z invalid csrf token nodebb-1 | 2026-11-01T04:55:02.349117712Z 2026-11-01T04:55:02.348Z [4567/138] - error: POST /login nodebb-1 | 2026-11-01T04:55:02.349118462Z invalid csrf token nodebb-1 | 2026-11-01T04:56:08.354511755Z 2026-11-01T04:56:08.354Z [4567/138] - error: GET /assets/../package.json nodebb-1 | 2026-11-01T04:56:08.354532838Z Error: [[error:invalid-path]] nodebb-1 | 2026-11-01T04:56:08.355916338Z 2026-11-01T04:56:08.355Z [4567/138] - error: GET /assets/../package.json nodebb-1 | 2026-11-01T04:56:08.355923296Z Error: [[error:invalid-path]] nodebb-1 | 2026-11-01T04:56:11.316996923Z 2026-11-01T04:56:11.314Z [4567/138] - error: GET /assets/built%2F..%2F..%2F/package.json nodebb-1 | 2026-11-01T04:56:11.317079839Z Error: [[error:invalid-path]] nodebb-1 | 2026-11-01T04:56:11.327256464Z 2026-11-01T04:56:11.327Z [4567/138] - error: GET /assets/built%2F..%2F..%2F/package.json nodebb-1 | 2026-11-01T04:56:11.327266548Z Error: [[error:invalid-path]]