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
mongodatabase (most important!)
After configuration, click Install and wait for update completion