Docker-Based NodeBB Community Forum Deployment Guide

Building a NodeBB Community Platform with Docker

Development Environment

Operating System: CentOS 7.6 64bit

Deployment Tool: docker

Database: MongoDB

Load Balancer: Nginx

1. Install and Configure Docker

Install required packages for Docker repository

yum install -y yum-utils device-mapper-persistent-data lvm2

Configure Alibaba Cloud mirror repository (for faster image pulls)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Install Docker CE

yum install -y docker-ce

Start Docker service

systemctl start docker

Create Network for container communication

docker network create mongo-net

2. Install and Configure MongoDB

Deploy MongoDB instance

Local network access version:

docker run --name mongodb-container --restart always --network mongo-net -d -v /data/mongodb-storage/data:/data/db --privileged=true mongo

Public access version: (requires opening firewall port 27017)

docker run --name mongodb-public --restart always --network mongo-net -d -p 27017:27017 -v /data/mongodb-storage/data:/data/db --privileged=true mongo

Note: Due to MongoDB's vulnerability to port scanning, database compromise can occur. Local network access is recommended. (Real-world incidents have occurred)

Enter MongoDB container and set database credentials

# Access MongoDB container
docker exec -it mongodb-public bash
# Launch MongoDB CLI
mongosh
# Switch to admin database
use admin
# Create user account
db.createUser(
   {
     user: "admin",
     pwd: "your_secure_password_here",
     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
   }
 )

3. Deploy NodeBB Application

Launch NodeBB instance

docker run --restart always --name forum-app --network mongo-net -p 4567:4567 -d nodebb/docker

Note: This maps port 4567 from the NodeBB container to the host server's port 4567

4. Install and Configure Nginx

Deploy Nginx service

docker run --name web-proxy --restart=always -d -p 80:80 -p 443:443 -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf -v /etc/nginx/certs:/etc/nginx/certs nginx

Note: Remember the mounted file locations

Configure Nginx (basic configuration overview, refer to Nginx documentation for advanced settings)

HTTPS domain setup: (requires domain name, DNS configuration, SSL certificate, and certificate files in designated folder)

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    client_max_body_size     50m;
    client_body_buffer_size  10m; 	  
    client_header_timeout    1m;
    client_body_timeout      1m;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_comp_level  4;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
	
server {

        listen 443 ssl;
        server_name  your_domain_name;

        ssl on;
        ssl_certificate    /etc/nginx/certs/your_domain_bundle.pem;
        ssl_certificate_key  /etc/nginx/certs/your_domain.key;

        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
		
        location / {
            proxy_pass    http://your_server_ip:4567/;
			
            proxy_set_header X-Real-IP $remote_addr;
	  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	  proxy_set_header X-Forwarded-Proto $scheme;
	  proxy_set_header Host $http_host;
	  proxy_set_header X-NginX-Proxy true;
			
	  proxy_redirect off;

	  # Socket.IO Support
	  proxy_http_version 1.1;
	  proxy_set_header Upgrade $http_upgrade;
	  proxy_set_header Connection "upgrade";
        }

    }

server {
        listen       80;
        server_name  your_domain_name;
		
        return 302 https://$server_name$request_uri;
 
    }
	
}

Note: The configured port is 4567, matching the NodeBB mapped port.

5. Initialize NodeBB Configuration

(Configuration screenshots referenced from external blog posts)

DATA BACKUP!!!

For any website, data is the most critical asset. While sites can be rebuilt, lost data cannot be recovered. Therefore, emphasize: Backup! Backup! Backup!

Manual Backup Process

Access MongoDB container

docker exec -it mongodb-public bash

Backup all databases to container directory

mongodump -o /data/mongodb-backup --gzip  

Export backup to host system

docker cp mongodb-public:/data/mongodb-backup /data/mongodb-storage/backup-storage

Scripted Backup Solution

Create backup script mongodb\_backup\_script.sh

#!/bin/bash
# Target container: mongodb-public
# Timestamp for filename
timestamp=$(date +%F)
# Backup to container path /data/db-backups/timestamp
docker exec -it mongodb-public mongodump -o /data/db-backups/$timestamp  --gzip  
# Copy to host path /data/mongodb-storage/backup-storage/timestamp
docker cp mongodb-public:/data/db-backups/$timestamp  /data/mongodb-storage/backup-storage/$timestamp
# Clean up container backup data
docker exec -it mongodb-public rm -rf /data/db-backups
docker exec -it mongodb-public mkdir /data/db-backups

Execute backup script (run from appropriate directory)

sh mongodb_backup_script.sh

Scheduled Backups

Edit cron jobs

crontab -e

Configure timing and execution file

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
00 15 * * * /data/mongodb-storage/mongodb_backup_script.sh

# Cron job explanation
The schedule has 6 fields: minute, hour, day, month, weekday, command
Field 1: Minutes 1-59, * means every minute
Field 2: Hours 1-23 (0 represents midnight)
Field 3: Day of month 1-31
Field 4: Month 1-12
Field 5: Weekday 0-6 (0 represents Sunday)
Field 6: Command to execute

*: Represents any time, essentially meaning "every"
-: Represents range, e.g., 00 17-19 * * * runs at 17, 18, 19 hours
,: Separates multiple values, e.g., 30 3,19,21 * * * runs at 3:30, 19:30, 21:30
/n: Division pattern, e.g., */5 * * * * runs every 5 minutes

Note: There's an issue where scheduled tasks become inactive after closing the server connection. Solutions welcome in comments!

Version Updates

NodeBB updates follow standard Docker image and container procedures:

Run backup script for database protection (highly recommended!)

sh /data/mongodb-storage/mongodb_backup_script.sh

Pull latest NodeBB image (typically from GitHub)

docker pull ghcr.io/nodebb/nodebb:latest

Stop and remove NodeBB container (if cautious, stop container first and retain it, changnig name during reinstallation)

# Stop container
docker stop forum-app
# Remove container
docker rm forum-app

Reinstall NodeBB application (this creates empty shell, data is crucial!)

docker run --restart always --name forum-app --network mongo-net -p 4567:4567 -d nodebb/docker

Reinitialize NodeBB configuration

Critical configurations include:

  • User accounts: Maintain consistency with previous admin credentials including username, email, password
  • Database connection: Ensure compatibility with existing mongo database (most important!)

After configuration, click Install and wait for update completion

Tags: nodebb docker mongodb nginx community-forum

Posted on Sun, 10 May 2026 22:35:56 +0000 by harsh00008