NodeBB服务器迁移记录
-
记录一下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用户的密码,密码输入正确后会输出备份文件:
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端口的访问:
本地使用被动模式连接:
连上之后,把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
输入密码后开始恢复,恢复后的数据库:
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运行正常。