Design Hub

    • 注册
    • 登录
    • 搜索
    • 版块
    • 最新

    NodeBB服务器迁移记录

    综合讨论
    1
    1
    259
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Pamisu
      Pamisu 管理员 最后由 编辑

      记录一下NodeBB从旧服务器(Windows Server 2016)迁移到新服务器(Ubuntu 22.04)的流程。官方文档只有搭建说明,没有迁移说明,中途踩了一些坑。

      备份旧服务器上的数据

      从官方的升级文档中得知(猜测),需要备份数据库以及NodeBB源码文件夹下的Uploads文件夹,另外还要备份源码文件夹下的configs.json。

      数据库MongoDB

      这里使用的是MongoDB,先从MongoDB官网下载命令行工具:
      https://www.mongodb.com/try/download/database-tools

      使用其中的mongodump备份数据库:

      mongodump -h 数据库服务地址:端口 -d nodebb -o 备份输出路径 -u nodebb
      

      -h 数据库服务的地址和端口,如果是本地127.0.0.1:27017则可以省略

      -d 数据库名称,NodeBB数据库名称默认为nodebb

      -o 备份文件输出到哪里

      -u 数据库用户,NodeBB数据库用户默认为nodebb

      然后会提示要输入数据库nodebb用户的密码,密码输入正确后会输出备份文件:

      Pasted image 20240221124458.png

      uploads与config.json

      uploads文件夹的路径为nodebb源码目录/public/uploads,全部复制出来即可,config.json在根目录下。

      在新服务器上重新搭建

      在旧服务器上(Windows Server),nodebb是直接搭的,由于新服务器系统换成了Ubuntu,所以打算改用Docker搭建。

      Docker

      按照官方的Docker Engine安装说明 来安装就行。

      FTP

      搭一个FTP来传输备份的文件,既然装了Docker,那就用Docker来搭,方便很多。

      在/home下创建一个文件夹用来存放FTP传输的文件:

      mkdir -p /home/vsftpd/files
      

      运行FTP容器:

      docker run -d -p 20:20 -p 21:21 \
      -p 21100-21110:21100-21110 \
      -v /home/vsftpd/files:/home/vsftpd \
      -e FTP_USER=用户名 \
      -e FTP_PASS=密码 \
      -e PASV_ADDRESS=服务器公网ip \
      -e PASV_MIN_PORT=21100 \
      -e PASV_MAX_PORT=21110 \
      --name vsftpd \
      --restart=always fauria/vsftpd
      

      -d 以守护进程形式运行

      -p 20:20 -p 21:21 映射容器的20和21端口到宿主机

      -p 21100-21110:21100-21110 映射容器的21100到21110端口到宿主机,用于被动模式

      -v /home/vsftpd/files:/home/vsftpd 映射容器内的/home/vsftpd目录到刚才在宿主机中创建的目录

      -e FTP_USER -e FTP_PASS 用户名密码

      --name 容器名称

      --restart=always 容器退出时总是重启容器

      fauria/vsftpd 镜像名

      运行起来之后,在阿里云安全组中允许20、21端口以及21100到21110端口的访问:

      Pasted image 20240221124044.png

      本地使用被动模式连接:

      Pasted image 20240221124158.png

      连上之后,把uploads文件夹、configs.json传到服务器上,数据库备份文件可以不传。

      MongoDB

      理论上来说,可以用Docker Compose一键部署MongoDB和NodeBB,官方仓库中有docker-compose.yml,但这里要部署的NodeBB是2.x版本不是最新的3.x,试了一下没整出来,时间关系就先不搞Docker Compose了。

      创建一个文件夹用于存放MongoDB数据与配置文件:

      mkdir -p /home/nodebb/data/
      

      在这个文件夹下,再创建一个db文件夹用于存放数据,创建一个mongo.conf文件用于数据库配置:

      mkdir db
      vim mongo.conf
      

      修改mongo.conf的内容:

      systemLog:
        destination: file
        path: /var/log/mongodb/mongod.log
        logAppend: true
      storage:
        dbPath: /data/db
      security:
        authorization: enabled
      

      运行MongoDB容器:

      docker run -p 27017:27017 \
      -v /home/nodebb/data/db:/data/db \
      -v /home/nodebb/data/mongo.conf:/data/configdb/mongo.conf \
      --name mongodb \
      --restart=always \
      -d mongo -f /data/configdb/mongo.conf
      

      -v /home/nodebb/data/db:/data/db 映射数据库目录
      -v /home/nodebb/data/mongo.conf:/data/configdb/mongo.conf 映射配置文件
      -d mongo -f /data/configdb/mongo.conf 指定配置文件运行

      MongoDB容器跑起来后,进入到容器内做一些配置:

      docker exec -it mongodb mongosh admin
      
      # 使用管理员数据库
      use admin
      # 创建管理员账号
      db.createUser( { user: "admin", pwd: "管理员密码", roles: [ { role: "root", db: "admin" } ] } )
      # 管理员登录
      db.auth("admin", "管理员密码")
      
      # 使用nodebb数据库
      use nodebb
      # 创建nodebb数据库用户
      db.createUser( { user: "nodebb", pwd: "密码", roles: [ { role: "readWrite", db: "nodebb" }, { role: "clusterMonitor", db: "admin" } ] } )
      # 退出
      exit
      

      运行起来之后,如果要临时从本地连接,在阿里云安全组中允许27017端口,用完再关掉(或者用防火墙关)。

      本地机器可以使用MongoDB Compass检查是否能正常连接,再使用MongoDB命令行工具中的mongorestore恢复数据:

      mongorestore -h 数据库服务地址:端口 -d nodebb --dir 备份文件路径 -u nodebb
      

      输入密码后开始恢复,恢复后的数据库:

      Pasted image 20240221131253.png

      NodeBB

      Docker方式

      理论上来说Docker方式是绝对可以的,但这里由于旧服务器上的NodeBB是2.x版本,新服务器如果安装3.x版本会不兼容,看了一下好像没有现成的NodeBB 2.x版本镜像,只能自己构建,最终还是偷懒使用了NodeJS部署方式,之后有空再研究下Docker,或许可以尝试下面的命令:

      docker run --name nodebb \
      -p 4567:4567 \
      -v /home/nodebb/public/uploads:/usr/src/app/public/uploads \
      -e URL="域名" \
      -e DATABASE="mongo" \
      -e DB_HOST="host.docker.internal" \
      -e DB_USER="nodebb" \
      -e DB_PASSWORD="数据库密码" \
      -e DB_PORT="数据库端口" \
      -d NodeBB镜像
      

      NodeJS方式

      先按照官方说明中的Installing Node.js一节把Node.js装好。

      装好之后,安装git,克隆NodeBB 2.x版本源码:

      # 安装git
      sudo apt-get install -y git
      # 克隆源码
      git clone -b v2.x https://github.com/NodeBB/NodeBB.git nodebb 
      # 进入到文件夹下
      cd nodebb
      

      然后把备份的uploads文件夹和config.json文件覆盖到源码目录下,运行nodebb设置:

      ./nodebb setup
      

      由于config.json已经有内容,不出意外的话只会进行安装,而不需要重复做设置。

      然后运行:

      ./nodebb start
      

      如果运行成功,可以尝试访问服务器ip:4567端口(记得在安全组中开放端口),看网页是否运行正常。

      nginx

      最后用nginx将nodebb代理到80端口。

      首先创建nginx需要用到的目录:

      mkdir -p /home/nginx/conf
      mkdir -p /home/nginx/log
      mkdir -p /home/nginx/html
      mkdir -p /home/nginx/ssl
      

      创建一个临时的nginx容器,复制需要的文件:

      # 容器中的nginx.conf文件和conf.d文件夹复制到宿主机
      # 生成临时容器
      docker run --name nginx -p 9001:80 -d nginx
      # 将容器nginx.conf文件复制到宿主机
      docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
      # 将容器conf.d文件夹下内容复制到宿主机
      docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
      # 将容器中的html文件夹复制到宿主机
      docker cp nginx:/usr/share/nginx/html /home/nginx/
      
      # 删除正在运行的nginx容器
      docker rm -f nginx
      

      修改/home/nginx/conf/conf.d/default.conf:

      server {
          listen 80;
      
          server_name 域名;
      
          location / {
              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_pass http://127.0.0.1:4567;
              proxy_redirect off;
      
              # Socket.IO Support
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
          }
      }
      

      重新运行ngnix容器:

      docker run \
      -p 443:443 -p 80:80 \
      --name nginx \
      -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
      -v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
      -v /home/nginx/log:/var/log/nginx \
      -v /home/nginx/html:/usr/share/nginx/html \
      -v /home/nginx/ssl:/etc/nginx/ssl/ \
      -d nginx
      

      在安全组中开放80和443端口,如果访问服务器ip能看到NodeBB页面,则说明ngnix运行正常。

      1 条回复 最后回复 回复 引用
      • 1 / 1
      • First post
        Last post
      版权所有 ©2023 Design Hub 保留所有权利
      鄂ICP备2021004164号-2