这个NestJS应用从0到1项目写到这已经可以部署到服务器啦,在前面的过程中,不管是NestJS的基础知识,还是安全防御,以及前置的登录认证都已经全面的了解。最后我们需要将服务部署到服务器,这样应用就可以通过服务器的端口进行访问。
当然这个项目到这并不是完全结束,虽然整个项目的整体架构已经较为清晰且初步架构也已经搭建完成,后续还会增加Sentry监控将日志上报到sentry,以及其他的一些如缓存能力对接Redis,AutoMap的能力,保持后续更新。
如果该系列文章对你有一定的帮助,也欢迎前往github点上一颗小星星⭐️
开始之前
我的服务器是使用阿里云安装了宝塔面板,所以有些基础能力直接在宝塔面板可视化操作了,就无需使用命令行工具。
如果你不是采用的宝塔面板,可以参考下面涉及到的命令方式。
部署流程
后台部署流程如下所示
- 本地提交代码到git
- git与服务器使用webhook通信
- 服务器webhook收到消息后拉取代码
- 拉取完毕后执行服务重启操作
需要准备
- 服务器
- 数据库服务(Mysql)
- Nodejs
- git,需使用超管权限
sudo su然后运行yum安装yum install git- 生成ssh-key
- git全局配置
- git仓库准备
- 为了保证git拉取顺利,我的部署仓库使用的是
gitee而不是github - 我代码提交到gitee,使用gitee的镜像同步到github保证两边仓库代码的一致性
- 将服务器生成的ssh-key填到gitee的ssh公钥
- webhook准备
- 为了保证git拉取顺利,我的部署仓库使用的是
- 生产环境变量
- 我的仓库并未将
.env.production提交到git上(必须这样做,为了配置信息的安全),所有在服务器拉取代码后会缺失环境变量 - 我将.env.production 文件存放在服务器的某个文件夹下,在编译之前使用 cp -f 将生产环境变量复制到 nestjs的项目文件夹内即可
- 我的仓库并未将
基操指引
如果你不知道如何配置webhook以及如何拉取代码可以参考下面文章: cloud.tencent.com/developer/a…
PS:如上文,在github上配置webhook和在gitee上差不多
因为我在拉取代码后需要对服务进行重启部署,修改了文章内的脚本。我的脚本已同步更新到git仓库下的deploy文件夹下。
开始
默认你在开始之前已经对服务器的webhooks有了足够的了解,代码自动部署都是来源于webhooks对代码变更的消息响应。
脚本中已经显著的使用 # ------ 自定义配置项 ------ # 框住你需要变更的内容,其他内容无需更改。
脚本已提交到当前github仓库的/deploy文件夹下
webhook脚本
该脚本依赖于git ,务必请在服务器安装好git并生成ssh-key,添加到git仓库上。 这webhook除了拉取仓库,最后会执行服务重启操作,服务重启脚本如下。
#!/bin/bash
echo ""
#输出当前时间
date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
echo "Start"
# --------------------------- 自定义配置项 ----------------------------
#git分支名称
branch="main"
#git项目路径
gitPath="/www/wwwroot/xxxxxx"
#git 仓库地址
gitHttp="git@gitee.com:XXXXXXXXXx"
# 重启脚本路径
restartPath="/www/wwwroot/XXXXXXXXXx/restart.sh"
# --------------------------- 自定义配置项结束 ----------------------------
echo "Web站点路径:$gitPath"
#判断项目路径是否存在
if [ -d "$gitPath" ]; then
cd $gitPath
#判断是否存在git目录
if [ ! -d ".git" ]; then
echo "在该目录下克隆 git"
sudo git clone $gitHttp gittemp
sudo mv gittemp/.git .
sudo rm -rf gittemp
fi
echo "拉取最新的项目文件"
#sudo git reset --hard origin/$branch
git remote add origin $gitHttp
git branch --set-upstream-to=origin/$branch $branch
sudo git reset --hard origin/$branch
sudo git pull $gitHttp 2>&1
echo "设置目录权限"
sudo chown -R www:www $gitPath
echo "End"
else
echo "该项目路径不存在"
echo "新建项目目录"
mkdir $gitPath
cd $gitPath
#判断是否存在git目录
if [ ! -d ".git" ]; then
echo "在该目录下克隆 git"
sudo git clone $gitHttp gittemp
sudo mv gittemp/.git .
sudo rm -rf gittemp
fi
echo "拉取最新的项目文件"
#sudo git reset --hard origin/$branch
sudo git pull gitHttp 2>&1
echo "设置目录权限"
sudo chown -R www:www $gitPath
echo "End"
fi
sudo sh $restartPath
echo "完成=END"
exit
测试webhook
- git仓库触发 webhook
2024-07-04 14:09:25 - 服务器接收到webhook请求,执行脚本
服务重启脚本
#!/bin/bash
echo "1.寻找node dist/main服务,并杀掉"
pids=$(ps aux | grep 'node dist/main' | grep -v grep | awk '{print $2}')
# Kill each process
for pid in $pids
do
echo "清理进程:$pid"
sudo kill $pid
done
#--------------------- 自定配置项 ----------------
# 项目的路径
projectPath="/www/wwwroot/xxxxxxx"
# 生产环境变量路径,因为git上不会提交生产环境.env文件
proEnvPath="/www/wwwroot/configs/xxxxxx"
# node版本路径
nodePath=/www/server/nodejs/v20.12.2/bin
# ------------------- 自定义配置项结束 --------------
echo "2.进入项目目录: $projectPath"
# 进入项目目录
cd $projectPath
echo "3.临时设置环境变量"
export PATH=$PATH:$nodePath
echo "新的环境变量:$PATH"
echo "4.复制生产环境变量到项目下"
/bin/cp -rf $proEnvPath/.env.production $projectPath
echo "5.编译项目"
$nodePath/node $nodePath/npm run build
echo "6.后台启动"
nohup $nodePath/node $nodePath/npm run start:prod > /dev/null 2>&1 &
完成
现在你的服务已经跑在服务器的指定端口上了(3000) 你可能还有后续操作,比如说通过Nginx进行配置访问
你在部署的时候可能会遇到
webhook要求Https访问目标服务器
你可以通过你的服务器提供商,我的是阿里云,有免费的短期3个月的证书提供。 help.aliyun.com/zh/ssl-cert…
复制环境变量文件不成功
使用/bin/cp -rf 替换 cp -rf 。因为有些服务器会将 cp -i 替换成 cp