{
  "schema_version": 1,
  "generated_at": "2026-10-23T00:00:00.000Z",
  "canonical_url": "https://openlogs.fyi/tools/nodebb",
  "slug": "nodebb",
  "name": "NodeBB",
  "tagline": "Forum and community discussion software built on Node.js.",
  "replaces": {
    "summary": "Paid community forum services, such as Circle.",
    "products": [
      {
        "slug": "circle",
        "name": "Circle",
        "vendor": "Circle",
        "url": "https://openlogs.fyi/alternatives/circle"
      }
    ]
  },
  "stack": [
    {
      "kind": "language",
      "name": "JavaScript"
    },
    {
      "kind": "database",
      "name": "MongoDB"
    },
    {
      "kind": "database",
      "name": "Redis"
    },
    {
      "kind": "database",
      "name": "PostgreSQL"
    }
  ],
  "deployment_methods": [
    "docker_compose"
  ],
  "requirements": {
    "min_ram_mb": null,
    "min_cpu_cores": null,
    "source_url": null
  },
  "license": {
    "spdx": "GPL-3.0",
    "class": "osi",
    "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/LICENSE"
  },
  "business_model": {
    "value": "unknown",
    "notes": "The README at the pinned commit does not state a business model, so it stays unknown.",
    "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/README.md",
    "checked_at": "2026-10-22"
  },
  "difficulty": {
    "value": "hard",
    "reason": "4 services (3 database or broker: mongo, redis, postgres), 8 volume mounts, no env values to set, no elevated host access. Heuristic score 6 of 11: hard. A source checkout is needed, and the first start builds images from source, so the rating is at least medium."
  },
  "repository": {
    "owner": "NodeBB",
    "name": "NodeBB",
    "url": "https://github.com/NodeBB/NodeBB"
  },
  "compose_check": {
    "status": "config_ok",
    "validated_at": "2026-10-22",
    "summary": "config_ok on 2026-10-22"
  },
  "recipe": {
    "version": 1,
    "source_path": "docker-compose.yml",
    "source_repo": "NodeBB/NodeBB",
    "source_commit_sha": "acca7f3471abd1c9ad1748a982b2408afa9dda73",
    "source_kind": "app_repo",
    "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/docker-compose.yml"
  },
  "install_steps": [
    {
      "order": 1,
      "kind": "prerequisite",
      "language": "text",
      "label": "Docker with the Compose plugin and git",
      "body": "A host with Docker, the Docker Compose plugin and git. This entry needs a checkout of the project repository.",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/README.md",
      "validation_status": "unvalidated"
    },
    {
      "order": 2,
      "kind": "shell",
      "language": "bash",
      "label": "Get the source at commit acca7f3",
      "body": "git init NodeBB\ncd NodeBB\ngit remote add origin https://github.com/NodeBB/NodeBB.git\ngit fetch --depth 1 origin acca7f3471abd1c9ad1748a982b2408afa9dda73\ngit checkout FETCH_HEAD",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/README.md",
      "validation_status": "unvalidated"
    },
    {
      "order": 3,
      "kind": "compose",
      "language": "yaml",
      "label": "The compose file in the checkout: docker-compose.yml (shown here for reading)",
      "body": "services:\n  nodebb:\n    build: .\n    # image: ghcr.io/nodebb/nodebb:latest\n    restart: unless-stopped\n    ports:\n      - '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want\n    volumes:\n      - nodebb-build:/usr/src/app/build\n      - nodebb-uploads:/usr/src/app/public/uploads\n      - nodebb-config:/opt/config\n      - ./install/docker/setup.json:/usr/src/app/setup.json\n\n  mongo:\n    image: 'mongo:7-jammy'\n    restart: unless-stopped\n    ports:\n      - '27017:27017'\n    environment:\n      MONGO_INITDB_ROOT_USERNAME: nodebb\n      MONGO_INITDB_ROOT_PASSWORD: nodebb\n      MONGO_INITDB_DATABASE: nodebb\n    volumes:\n      - mongo-data:/data/db\n      - ./install/docker/mongodb-user-init.js:/docker-entrypoint-initdb.d/user-init.js\n  redis:\n    image: redis:8.10.1-alpine\n    restart: unless-stopped\n    command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning']\n    # command: ['redis-server', '--save', '60', '1', '--loglevel', 'warning'] # uncomment if you want to use snapshotting instead of AOF\n    volumes:\n      - redis-data:/data\n    profiles:\n      - redis\n\n  postgres:\n    image: postgres:18.6-alpine\n    restart: unless-stopped\n    environment:\n      POSTGRES_USER: nodebb\n      POSTGRES_PASSWORD: nodebb\n      POSTGRES_DB: nodebb\n    volumes:\n      - postgres-data:/var/lib/postgresql/data\n    profiles:\n      - postgres\n\nvolumes:\n  mongo-data:\n    driver: local\n    driver_opts:\n      o: bind\n      type: none\n      device: ./.docker/database/mongo/data\n\n  redis-data:\n    driver: local\n    driver_opts:\n      o: bind\n      type: none\n      device: ./.docker/database/redis\n\n  postgres-data:\n    driver: local\n    driver_opts:\n      o: bind\n      type: none\n      device: ./.docker/database/postgresql/data\n\n  nodebb-build:\n    driver: local\n    driver_opts:\n      o: bind\n      type: none\n      device: ./.docker/build\n\n  nodebb-uploads:\n    driver: local\n    driver_opts:\n      o: bind\n      type: none\n      device: ./.docker/public/uploads\n\n  nodebb-config:\n    driver: local\n    driver_opts:\n      o: bind\n      type: none\n      device: ./.docker/config\n",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/docker-compose.yml",
      "validation_status": "config_ok"
    },
    {
      "order": 4,
      "kind": "note",
      "language": "text",
      "label": "What the compose file check ran with",
      "body": "The compose file check ran in a checkout of NodeBB/NodeBB at acca7f3471abd1c9ad1748a982b2408afa9dda73 (a sparse checkout: the top-level files and the folder install/docker). The README lists a Docker setup as its second install option and tells the reader to run docker-compose up in the repository.",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/README.md",
      "validation_status": "unvalidated"
    },
    {
      "order": 5,
      "kind": "shell",
      "language": "bash",
      "label": "Start it",
      "body": "docker compose up -d",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/README.md",
      "validation_status": "unvalidated"
    },
    {
      "order": 6,
      "kind": "verify",
      "language": "text",
      "label": "Open the app",
      "body": "Open http://localhost:4567. The compose file publishes host port 4567 for the nodebb service. The README names this address after docker-compose up.",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/docker-compose.yml",
      "validation_status": "unvalidated"
    }
  ],
  "notes": [
    {
      "kind": "gotcha",
      "title": "Some services build from source",
      "body": "These services have a build section and no image: nodebb. They need the project source next to the compose file.",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file publishes host ports",
      "body": "Host ports: 4567 (nodebb), 27017 (mongo). A port without a host address listens on all host network interfaces.",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file mounts host folders",
      "body": "Host paths mounted into containers: ./install/docker/setup.json at /usr/src/app/setup.json (nodebb), ./install/docker/mongodb-user-init.js at /docker-entrypoint-initdb.d/user-init.js (mongo).",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The first start builds images from source",
      "body": "The compose file has a build section. The first docker compose up builds the image from the checkout, which needs time, disk space and network access.",
      "source_url": "https://github.com/NodeBB/NodeBB/blob/acca7f3471abd1c9ad1748a982b2408afa9dda73/docker-compose.yml",
      "checked_at": "2026-10-22"
    }
  ],
  "signals": {
    "captured_at": "2026-10-22",
    "stars": 15240,
    "forks": 3009,
    "open_issues": 116,
    "last_push": "2026-10-22",
    "days_since_push": 0,
    "latest_release": "v4.16.3",
    "latest_release_date": "2026-10-14",
    "days_since_release": 8
  },
  "links": {
    "html": "https://openlogs.fyi/tools/nodebb",
    "markdown": "https://openlogs.fyi/tools/nodebb.md",
    "json": "https://openlogs.fyi/tools/nodebb.json"
  },
  "updated_at": "2026-10-22"
}
