【Nodebb系列】Nodebb安装部署

内容摘要

本文主要介绍如何在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

代码释义
![[Pasted image 20240402221645.png]]

注:由于MongoDB自身存在安全漏洞,端口很容易被扫描到,并导致数据库被黑,建议使用局域网访问版。(真实案例如下(╥_╥))
![[Pasted image 20240402220340.png]]

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配置初始化

![[Pasted image 20240403002448.png]]

配置完成后,点击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

硬盘爆满导致论坛挂机

估计是容器产生的日志太多了,查看一下日志的位置,然后把日志文件删了,重启容器即可

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可口的冰可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值