写在前
继去年我个人网站上线以来,虽然没啥访问和使用量。但我也不想就这么不了了之,毕竟也是花了一年多写的
node提供了50来个接口,对应20来张mysql表
只有一个生产环境,这对于后续的迭代和新的想法实现是糟糕的,尤其当涉及到表关系变更时
遂决定再花点小钱搞个开发环境
初始化
我是买了个最低配的阿里云的轻量服务器,目前只有我一个开发,足够用了
登陆面板后,创建html和nginx项目,对应前端网页和node接口服务
当然,首先得先到对应的目录中创建对应的文件夹,并到ftp中创建账号密码。ftp很重要,要用它来向服务器上传代码
账号创建好后,得放开指定的端口,要不会被防火墙拦截
接着去服务器将买好的域名做下解析,点击框红的按钮按提示选择就ok
由于是一个服务器提供了两个项目,当配置ssl的时候,第二个会验证失败,从报错看,是宝塔默认走的第一个,所以第二个域名得使用另外一种解析方式
dns的方式需要到服务器单独添加解析记录,一个是TXT类型一个是CAA类型
最后点开nodejs管理器安装对应的版本:v20.13.1
然后打开终端验证下是否安装成功,如果识别不到,要到root/.bashrc文件下设置环境变量,值是软件安装的位置。最后再次node -v理论上就可以了
代码上传
我这里用的阿里云效的流水线,只需要将ftp账号密码配置好,就可以在项目打包后上传了,对应before钩子里的逻辑
自动部署
自动部署让我搞了好久
一开始,我是想用pm2来管理接口服务的,但发现会与nginx冲突
所以我又创建了个代理服务,它只有一个中间件负责转发
下一步是考虑如何做到自动重启,这利用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
验证部署结果
当watch监听到指定文件变更后会进行重启,但重启结果在流水线是感知不到的
不过可以创建一个发布id
它对应在接口服务中的某个动态url
router.get('xxxx_id')
由于发布id是唯一的,所以只要能访问到这个接口,就说明部署成功了,反之404就代表部署失败了