【教程】NodeBB社区论坛搭建
基于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,等待片刻就更新好了