【教程】NodeBB社区论坛搭建

发布时间 2023-06-30 15:37:40作者: 叶小知

基于Docker的NodeBB社区论坛部署

开发环境

操作系统:CentOS 7.6 64bit

搭建环境:docker

数据库:MongoDB

负载均衡:Nginx

1、安装并配置docker

安装设置docker仓库所需的软件包

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

设置阿里云镜像仓库(用于加速镜像拉取)

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

安装docker-ce

yum install -y docker-ce

启动docker服务

systemctl start docker

创建NetWork网络(用于连接不同容器)

docker network create mongo-net

2、安装并配置MongoDB

安装并运行MongoDB

局域网访问版:

docker run --name mongod --restart always --network mongo-net -d -v /data/MongoDB/data:/data/db --privileged=true mongo

公网访问版:(这里需要打开防火墙27017端口)

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

注:由于MongoDB的端口很容易被扫描到,会导致数据库被黑,建议使用局域网访问版。(真实案例如下(╥_╥))

进去mongdb容器,设置MongoDB密码

# 进入mongo容器
docker exec -it mongo bash
# 打开mongo命令行
mongosh
# 切换到admin账户
use admin
# 设置密码
db.createUser(
   {
     user: "admin",
     pwd: "【设置的密码】",
     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
   }
 )

3.安装并配置NodeBB

安装并运行NodeBB

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

注:这里将nodebb容器的4567端口,映射到服务器的4567端口

4、安装并配置Nginx

安装并运行Nginx

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

注:记住文件挂载的位置

配置Nginx(这里只对配置文件做简单介绍,更多的内容请参考Nginx配置教程)

https域名版:(需要有域名,配置域名解析,申请ssl证书,并把相应证书文件存放在对应文件夹)

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  【你的域名】;

        ssl on;
        ssl_certificate    /etc/nginx/cert/【你的域名】_bundle.pem;
        ssl_certificate_key  /etc/nginx/cert/【你的域名】.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://【你的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  【你的域名】;
		
        return 302 https://$server_name$request_uri;
 
    }
	
}

注:这里的配置的端口为4567,和Nodebb映射端口一致。

5、初始化NodeBB配置

注:这里是从别人的blog中找的图

数据备份!!!

对于一个网站而言,数据是一切的关键,网站没了可以再搭,但是数据没了就无法再恢复了。因此,重要的事情说三遍,备份!备份!备份!

手动备份

进入mongodb容器

docker exec -it mongo bash

备份所有数据库到容器内部的指定文件夹

mongodump -o /data/mongoBack --gzip  

退出mongodb容器,导出数据到本机备份目录

docker cp mongo:/data/mongoBack /data/MongoDB/dataBack

脚本备份

创建备份脚本mongod_bak.sh

# !/bin/bash
# 待备份容器名为:
# 1. mongo
# 时间, 做文件名用
dd=$(date +%F)
# 备份到容器的 /data/mongoBack/$dd文件夹
docker exec -it mongo mongodump -o /data/mongoBack/$dd  --gzip  
# 复制到宿主机的/data/MongoDB/dataBack/$dd
docker cp mongo:/data/mongoBack/$dd  /data/MongoDB/dataBack/$dd
# 删除docker中的备份数据
docker exec -it mongo rm -rf /data/mongoBack
docker exec -it mongo mkdir /data/mongoBack

执行备份脚本(在对应的文件夹下执行)

sh mongod_bak.sh

定时备份

编辑定时任务

crontab -e

设置时间及执行文件

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/mongod_bak.sh

# 以下是注释
用户的定时任务分6段,分别是:分,时,日,月,周,命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

*:表示任意时间都,实际上就是“每”的意思。可以代表00-23小时或者00-12每月或者00-59分
-:表示区间,是一个范围,00 17-19 * * * cmd,就是每天17,18,19点的整点执行命令
,:是分割时段,30 3,19,21 * * * cmd,就是每天凌晨3和晚上19,21点的半点时刻执行命令
/n:表示分割,可以看成除法,*/5 * * * * cmd,每隔五分钟执行一次

注:这里有个小问题,就是在关闭服务器连接后,定时任务就失效了,要是有知道怎么解决这个问题的朋友,欢迎在评论区留言交流!

版本更新

NodeBB版本更新和docker镜像和容器的更新一样,具体的操作如下:

执行备份脚本,备份数据库(强烈建议!)

sh /data/MongoDB/mongod_bak.sh

拉取NodeBB最新镜像(一般在GitHub)

docker pull ghcr.io/nodebb/nodebb:latest

停用nodebb容器,并删除容器(如果不放心,可以只停用容器,暂时保留容器,并在重新安装NodeBB时更换容器名称)

# 停用容器
docker stop nodebb
# 删除容器
docker rm nodebb

重新安装并配置NodeBB(这里安装的只是空壳,重要的是数据!!!)

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

重新初始化NodeBB配置

比较重要的配置如下:

  • 用户信息:和之前的管理员用户保持一致,包括账号、邮箱、密码
  • 数据库:和之前的mongo数据库保持一致(这个最重要!!!)

配置好之后,点击Install,等待片刻就更新好了