web+node项目服务部署

201 阅读3分钟

写在前

继去年我个人网站上线以来,虽然没啥访问和使用量。但我也不想就这么不了了之,毕竟也是花了一年多写的

node提供了50来个接口,对应20来张mysql表

只有一个生产环境,这对于后续的迭代和新的想法实现是糟糕的,尤其当涉及到表关系变更时

遂决定再花点小钱搞个开发环境

初始化

我是买了个最低配的阿里云的轻量服务器,目前只有我一个开发,足够用了

登陆面板后,创建html和nginx项目,对应前端网页和node接口服务

image.png

当然,首先得先到对应的目录中创建对应的文件夹,并到ftp中创建账号密码。ftp很重要,要用它来向服务器上传代码

image.png

账号创建好后,得放开指定的端口,要不会被防火墙拦截

image.png

接着去服务器将买好的域名做下解析,点击框红的按钮按提示选择就ok

image.png

由于是一个服务器提供了两个项目,当配置ssl的时候,第二个会验证失败,从报错看,是宝塔默认走的第一个,所以第二个域名得使用另外一种解析方式

image.png

dns的方式需要到服务器单独添加解析记录,一个是TXT类型一个是CAA类型

image.png

最后点开nodejs管理器安装对应的版本:v20.13.1

image.png

然后打开终端验证下是否安装成功,如果识别不到,要到root/.bashrc文件下设置环境变量,值是软件安装的位置。最后再次node -v理论上就可以了

image.png

代码上传

我这里用的阿里云效的流水线,只需要将ftp账号密码配置好,就可以在项目打包后上传了,对应before钩子里的逻辑

image.png

自动部署

自动部署让我搞了好久

一开始,我是想用pm2来管理接口服务的,但发现会与nginx冲突

所以我又创建了个代理服务,它只有一个中间件负责转发

image.png

下一步是考虑如何做到自动重启,这利用pm2的自动监听也很容易做到

pm2 start ./start.js --watch xxx.js --name yyy

但这只能重启一次,当pm2 restart后,前边提到的代理服务会被杀死,但它俩是两个不同的进程id。原因我猜可能是二者存在父子进程关系,或在同一个进程组,反正肯定不可能是pm2的问题,毕竟它这么多年了

但我不关心

我直接放弃pm2,使用node直接起

至于自动部署,使用node原生的watch接口实现

import { watch } from "node:fs";
watch('xxx',()=>{})

而watch监听的文件我是在流水线阶段通过虚拟文件创建的,因为它是纯服务端用的。这个文件会记录版本号,启动指令等相关信息,在watch回调中比对并决定是否需要更新node_modules

image.png

验证部署结果

当watch监听到指定文件变更后会进行重启,但重启结果在流水线是感知不到的

不过可以创建一个发布id

image.png

它对应在接口服务中的某个动态url

router.get('xxxx_id')

由于发布id是唯一的,所以只要能访问到这个接口,就说明部署成功了,反之404就代表部署失败了