#工作笔记#
nocobase接触比较早了,但在工作上没有深度用起来,处于了解阶段并没有深入研究。
现在有个需求,希望将部分业务部门的Excel手工账转移到系统中,想到了用nocobase来实现。
nocobase官网版本更新比较快,本地在不断尝试时就产生了多版本pm2管理以及启动的问题,下面展开记录。
一、用pm2管理并启动nocobase
先看下本地pm2可以执行文件的版本情况,nocobase已经有四个版本:
bash
hehe@ubuntu2404:$ sudo find / -name "pm2" -type f -executable 2>/dev/null
/usr/lib/node_modules/pm2/bin/pm2
/usr/lib/node_modules/pm2/pm2
/home/hehe/nocobase-1.6.36/node_modules/pm2/bin/pm2
/home/hehe/nocobase-1.6.36/node_modules/pm2/pm2
/home/hehe/nocobase-1.7.0/node_modules/pm2/bin/pm2
/home/hehe/nocobase-1.7.0/node_modules/pm2/pm2
/home/hehe/nocobase-2.0.0-a51/node_modules/pm2/bin/pm2
/home/hehe/nocobase-2.0.0-a51/node_modules/pm2/pm2
/home/hehe/nocobase-2.0.0-alpha.70/node_modules/pm2/bin/pm2
/home/hehe/nocobase-2.0.0-alpha.70/node_modules/pm2/pm2
因为当pm2在启动单个版本的nocobase项目时,并没有多大问题,最多是pm2 list时名称显示为index,比如下面这样:
刚进入nocobase-2.0.0-a51目录,启动应用后,name显示也没有问题,因为生成ecosystem.config.js文件内容时,就定义了name是nocobase20,这都没问题
bash
hehe@ubuntu2404:~/nocobase-2.0.0-a51$ pm2 start ecosystem.config.js
[PM2][WARN] Applications nocobase20 not running, starting...
[PM2] App [nocobase20] launched (1 instances)
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ nocobase20 │ fork │ 0 │ online │ 0% │ 29.6mb │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
接下来当我们pm2 list或者save去看的时候,name就变了。
bash
hehe@ubuntu2404:~/nocobase-2.0.0-a51$ pm2 list
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ index │ fork │ 0 │ online │ 0% │ 231.6mb │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
为什么会这样呢?几十次实验下来,你会发现当执行 pm2 list 或 pm2 save 时,PM2 会从 dump.pm2 加载旧配置,覆盖当前运行的进程配置。
我这里的情况更特殊,因为pm2就存在6.0.5和6.0.14两个版本,
/home/hehe/nocobase-2.0.0-a51/node_modules/pm2/bin/pm2的版本是6.0.5
/home/hehe/nocobase-2.0.0-alpha.70/node_modules/pm2/bin/pm2的版本6.0.14
当我从nocobase-2.0.0-a51切换到nocobase-2.0.0-alpha.70目录,分别启动应用时,哪怕先停止2.0.0-a51的应用,再启动2.0.0-alpha.70时,第二个name就变成index了,然后再去看/home/hehe/.pm2/dump.pm2的文件内容时,name就是index (哭笑不得)。
这时候比如我手动修改/home/hehe/.pm2/dump.pm2的文件内容,将name改成nocobase2070,到版本目录下,执行下面命令并启动应用后,再pm2 list时,结果也会显示nocobase2070。
bash
pm2 start ecosystem.config.js
这样看似没有问题,如果再尝试换个版本,问题又重复显现了,所以直觉就是pm2在应用多版本管理上是有问题的。
因为不管同时启动多个应用,只有一个PM2 的
dump.pm2文件来管理所有的应用,所以结论就是不支持按项目隔离配置。
假设pm2有类似python中的虚拟环境(如venv)管理项目依赖和环境隔离,说不定也可以解决这个问题。
接下来怎么解决呢?既然pm2不支持也搞不定多版本,就还是用Systemd服务的方式来启动不同版本的应用呗,还能怎么办。
二、当nocobase从本地的2.0.0-a51版本切换到2.0.0-alpha.70时又遇到问题(哭!!!)
一种方式是升级,因为是开源,没有买商业插件(支持平滑升级),so...
另一种就是全新安装了,我就是这样,不同的版本在不同的目录,db也配置不同的数据库,基本上都正常。
但是问题往往发生在自己偷懒或者有奇思妙想(神经错乱)时,上面说的没有问题是指应用启动都正常,访问都正常,此时最大的问题是,如果每个版本都有数据了,希望数据也跟着版本走,怎么办?
一种方式是每个版本启动后,在线的数据导入导出呗,或者离线数据备份后,数据库的数据导入导出呗,我没试,肯定可以,需要解决的就是表字段对齐,约束和一致性解决,都是伤神的事情;
另一种方式,就是直接用之前的数据库,我就是这样折腾出毛病的,2.0.0-alpha.70用了2.0.0-a51的pg库(跟哪种数据库没关系即使mysql或者sqlite、sqlserver也一样),好家伙启动了,端口也改了,访问提示提示column "renameMode" does not exist,这不就悲催了,偷懒没偷成呗
接下来怎么折腾呢?我还没想好,写个工具吧,看怎么解决db平滑升级,毕竟没钱么。有钱的还是可以支持官网买商业插件来解决。
如果有买了商业插件的伙伴也欢迎分享记录一下告诉我,等我有钱了,就买(真的)。