内容摘要
本文主要介绍如何在Linux系统上使用Docker部署Nodebb,以及相关配置说明。
开发环境
- 操作系统:
CentOS 7.6 64bit
- 搭建环境:
docker
- 数据库:
MongoDB
- 负载均衡:
Nginx
- 邮件系统:
sendmail(可选)
- 部署对象:
Nodebb
部署流程
1. 安装并配置docker
%% 包括安装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容器, 配置MongoDB数据库%%
安装并运行MongoDB容器
Docker启动容器时,会自动检查并拉取镜像。
局域网访问版:
docker run --name mongod --restart always --network mongo-net -d -v /data/MongoDB/data:/data/db --privileged=true mongo
公网访问版:(这里需要打开防火墙27017端口)
docker run --name mongod --restart always --network mongo-net -d -p 27017:27017 -v /data/MongoDB/data:/data/db --privileged=true mongo
代码释义
注:由于MongoDB自身存在安全漏洞,端口很容易被扫描到,并导致数据库被黑,建议使用局域网访问版。(真实案例如下(╥_╥))
MongoDB容器设置
MongoDB容器此时处于启动状态,使用如下命令进入容器,并设置用户和密码。
# 进入容器
docker exec -it mongod bash
# 启动MongoDB Shell
mongosh
# 切换到admin用户
use admin
# 创建管理员用户
db.createUser(
{
user: "admin",
pwd: "【设置的密码】",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
3. 安装并配置NodeBB
%% 选择一个合适的Nodebb镜像,安装并启动 %%
安装并运行NodeBB
在github中选择一个心仪的Nodebb镜像,例如`docker pull ghcr.io/nodebb/nodebb:3.5.3 Nodebb-Docker镜像地址(测试了几个版本,3.5.3可以正常运行)
docker run --restart always --name nodebb --network mongo-net -p 4567:4567 -d ghcr.io/nodebb/nodebb:3.5.3
注:这里将nodebb容器的4567端口,映射到服务器的4567端口
4. 初始化NodeBB配置
%% Nodebb访问设置,并初始化配置 %%
服务器端口配置
经过前三步,已经启动了Nodebb,现在需要初始化配置。在访问前需要开放服务器端口4567
(与步骤 3一致),[NodeBB Web Installer](http://[ip地址]:4567/)
Nodebb配置初始化
配置完成后,点击Install Nodebb,开始安装。
5. 安装并配置Nginx(可选)
%% Nginx主要用于负载均衡,用于配置访问端口/域名等 %%
安装并运行Nginx
IP地址版
docker run --name nginx --restart=always -d -p 80:80 -p 443:443 -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf nginx
https域名版
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.conf(这里只对配置文件做简单介绍,更多的内容请参考Nginx配置教程)
IP地址版
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 80;
server_name 【你的IP】;
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";
}
}
}
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映射端口一致。
数据备份!!!
%% 对于一个网站而言,数据就是一切,网站没了可以再搭,但是数据没了就只能重头开始。因此,千万要注意数据的 备份!备份!备份! %%
手动备份
# 进入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. mongod
# 时间, 做文件名用
dd=$(date +%F)
# 备份到容器的 /data/mongoBack/$dd文件夹
docker exec -it mongod mongodump -o /data/mongoBack/$dd --gzip
# 复制到宿主机的/data/MongoDB/dataBack/$dd
docker cp mongod:/data/mongoBack/$dd /data/MongoDB/dataBack/$dd
# 删除docker中的备份数据
docker exec -it mongod rm -rf /data/mongoBack
docker exec -it mongod mkdir /data/mongoBack
执行备份脚本(在对应的文件夹下执行)
sh mongod_bak.sh
版本更新
%% NodeBB版本更新和docker镜像和容器的更新一样,具体的操作如下 %%
执行备份脚本(强烈建议!)
sh /data/MongoDB/mongod_bak.sh
拉取NodeBB最新镜像(一般在GitHub)
docker pull ghcr.io/nodebb/nodebb:latest
停止nodebb容器,并删除容器(不影响数据)
# 停用容器
docker stop nodebb
# 删除容器
docker rm nodebb
重新安装并配置NodeBB(这里安装的只是空壳,重要的是数据!!!)
docker run --restart always --name kforum --network mongo-net -p 80:4567 -d ghcr.io/nodebb/nodebb:latest
重新初始化NodeBB配置(一般不需要,如若需要,请保持账号及数据库信息与开始的完全一致)
- 用户信息:和之前的管理员用户保持一致,包括账号、邮箱、密码
- 数据库:和之前的
mongo
保持一致(这个最重要!!!)
配置好之后,点击Install,等待片刻就更新好了
常用操作
%% 主要是Docker的基本操作,对于不熟悉docker的朋友可以参考 %%
Docker操作
# 安装docker
yum install docker-ce
# 启动docker
systemctl start docker
# 关闭docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 开启启动
systemctl enable docker
# 查看状态
systemctl status docker
# 查看版本
docker -v
# 查看信息
docker info
Docker镜像操作
# 查看镜像
docker images
# 拉取镜像
docker pull [镜像名称]
# 删除镜像
docker rmi [镜像名称]
Docker创建容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
# 参数解释
# -i:表示运行容器
# -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。交互式
# --name :为创建的容器命名。
# -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
# -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
# -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
Docker容器操作
# 查看运行容器
docker ps
# 查看所有容器
docker ps –a
# 启动容器
docker start [容器名称]
# 停止容器
docker stop [容器名称]
# 删除容器
docker rm [容器名称]
Docker日志操作
docker logs -f -t --tail 行数 容器名[containerID]
# -f 按日志输出
# -t 显示时间戳
注:其他操作可参照Docker的安装、镜像拉取、创建容器、应用部署、备份迁移_镜像 删 重新拉取代码,重新进行部署-CSDN博客
常见问题
%% 记录使用Nodebb过程中遇到的一些问题,总结下来,只要数据没丢,其他的都是小事 %%
点击Install后没有反应
这个问题可能是版本什么的不匹配,建议换个版本重新试一下,如3.5.3
版
硬盘爆满导致论坛挂机
估计是容器产生的日志太多了,查看一下日志的位置,然后把日志文件删了,重启容器即可