当前位置:网站首页>手把手教你学会部署Nestjs项目
手把手教你学会部署Nestjs项目
2022-07-31 17:31:00 【poetry】
前端进阶之旅:https://interview2.poetries.top 博客:https://blog.poetries.top 公众号/小程序:「前端进阶之旅」 每天分享技术干货,学前端不迷路 作者:程序员poetry
一、云服务器docker-compose部署
安装docker环境
安装工具包
yum install yum-utils device-mapper-persistent-data lvm2 -y

设置阿里镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker
yum install docker-ce docker-ce-cli containerd.io -y
启动docker
systemctl start docker
# 设为开机启动
systemctl enable docker
设置docker镜像源
vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://register.docker-cn.com/"
],
}
后续拉取镜像直接从 https://hub.docker.com 网站拉取速度更快
重启docker
systemctl restart docker
安装mysql镜像测试
docker pull daocloud.io/library/mysql:8.0.20

运行mysql镜像
docker run -d -p 3307:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456(设置登录密码) be0dbf01a0f3(镜像ID)

进入mysql容器内部

至此mysql镜像搭建成功,下面我们使用
docker-compose
来管理docker容器,不在单独一个个安装MySQL、redis、nginx
安装docker-compose
# 使用国内源安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
设置docker-compose执行权限
chmod +x /usr/local/bin/docker-compose
创建软链
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose --version
docker-compose version 1.22.0, build f46880fe
编写docker-compose
version: "3.0"
services:
# docker容器启动的redis默认是没有redis.conf的配置文件,所以用docker启动redis之前,需要先去官网下载redis.conf的配置文件
redis: # 服务名称
container_name: redis # 容器名称
image: daocloud.io/library/redis:6.0.3-alpine3.11 # 使用官方镜像
# 配置redis.conf方式启动
command: redis-server /usr/local/etc/redis/redis.conf --requirepass 123456 --appendonly yes # 设置redis登录密码 123456、--appendonly yes:这个命令是用于开启redis数据持久化
# 无需配置文件方式启动
# command: redis-server --requirepass 123456 --appendonly yes # 设置redis登录密码 123456
ports:
- 6380:6379 # 本机端口:容器端口
restart: on-failure # 自动重启
volumes:
- ./deploy/redis/db:/data # 把持久化数据挂载到宿主机
- ./deploy/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf # 把redis的配置文件挂载到宿主机
- ./deploy/redis/logs:/logs # 用来存放日志
environment:
- TZ=Asia/Shanghai # 解决容器 时区的问题
networks:
- my-server
mysql:
container_name: mysql
image: daocloud.io/library/mysql:8.0.20 # 使用官方镜像
ports:
- 3307:3306 # 本机端口:容器端口
restart: on-failure
environment:
- MYSQL_ROOT_PASSWORD=993412 # root用户密码
volumes:
- ./deploy/mysql/db:/var/lib/mysql # 用来存放了数据库表文件
- ./deploy/mysql/conf/my.cnf:/etc/my.cnf # 存放自定义的配置文件
# 我们在启动MySQL容器时自动创建我们需要的数据库和表
# mysql官方镜像中提供了容器启动时自动docker-entrypoint-initdb.d下的脚本的功能
- ./deploy/mysql/init:/docker-entrypoint-initdb.d/ # 存放初始化的脚本
networks:
- my-server
server: # egg服务
container_name: server
build: # 根据Dockerfile构建镜像
context: .
dockerfile: Dockerfile
ports:
- 9000:9000
restart: on-failure # 设置自动重启,这一步必须设置,主要是存在mysql还没有启动完成就启动了node服务
networks:
- my-server
depends_on: # node服务依赖于mysql和redis
- redis
- mysql
# 声明一下网桥 my-server。
# 重要:将所有服务都挂载在同一网桥即可通过容器名来互相通信了
# 如egg连接mysql和redis,可以通过容器名来互相通信
networks:
my-server:
nestjs/Dockerfile
FROM daocloud.io/library/node:14.7.0
# 设置时区
ENV TZ=Asia/Shanghai \
DEBIAN_FRONTEND=noninteractive
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata && rm -rf /var/lib/apt/lists/*
# 创建工作目录
RUN mkdir -p /app
# 指定工作目录
WORKDIR /app
# 复制当前代码到/app工作目录
COPY . ./
# npm 源,选用国内镜像源以提高下载速度
# RUN npm config set registry https://registry.npm.taobao.org/
# npm 安装依赖
RUN npm install
# 打包
RUN npm run build
# 启动服务
# "start:prod": "cross-env NODE_ENV=production node ./dist/src/main.js",
CMD npm run start:prod
EXPOSE 9000
修改代码
开放云服务器端口
开放端口9000、6380、3307
启动项目
docker-compose -h
查看命令
docker-compose up
启动服务,控制台可见日志docker-compose up -d
后台启动服务docker-compose build --no-cache
重新构建镜像不使用缓存(最后docker-compose up -d
启动)停止服务 docker-compose down
下载镜像过程 docker-compose pull
重启服务 docker-compose restart
后台启动服务 docker-compose up -d
测试
二、微信云托管部署
云托管流水线部署更方便
redis服务
这里我们上面部署使用的自建服务器上docker搭建的redis服务作为演示

mysql服务
这里我们上面部署使用的自建服务器上docker搭建的mysql服务作为演示

修改代码
然后上传代码到github,通过云托管流水线构建
新建服务


点击发布后,云托管会执行Dockerfile构建流水线,到日志可以查看构建进度
微信云托管部署成功后,可以在实例列表,点击进入容器看到代码,这里里面的内容不能修改,在容器启动后会覆盖
调试接口
测试redis
三、腾讯云serverless部署
需要注意,云函数的代码包不能超过500M

模板部署 -- 部署 Nest.js 示例代码
登录 Serverless 应用控制台。 单击新建应用,选择Web 应用>Nest.js 框架,如下图所示:

单击“下一步”,完成基础配置选择

上传方式,选择示例代码直接部署,单击完成,即可开始应用的部署。 部署完成后,您可在应用详情页面,查看示例应用的基本信息,并通过 API 网关生成的访问路径 URL 进行访问,查看您部署的 Nest.js 项目

自定义部署nest
初始化您的 Nest.js 项目
npm i -g @nestjs/cli
nest new nest-app
在根目录下,执行以下命令在本地直接启动服务。
cd nest-app && npm run start
打开浏览器访问 http://localhost:3000,即可在本地完成 Nest.js 示例项目的访问。
部署上云
接下来执行以下步骤,对已初始化的项目进行简单修改,使其可以通过 Web Function 快速部署,此处项目改造通常分为以下两步:
新增 scf_bootstrap
启动文件。修改监听地址与端口为 0.0.0.0:9000
。
修改启动文件 main.ts
,监听端口改为9000
:

在项目根目录下新建 scf_bootstrap
启动文件,在该文件添加如下内容(用于启动服务):
您也可以在控制台完成该模块配置。

# scf_bootstrap
#!/bin/bash
SERVERLESS=1 /var/lang/node12/bin/node ./dist/main.js
新建完成后,还需执行以下命令修改文件可执行权限,默认需要 777 或 755 权限才可正常启动。示例如下:
chmod 777 scf_bootstrap
本地配置完成后,执行启动文件,确保您的服务可以本地正常启动,接下来,登录 Serverless 应用控制台,选择Web 应用>Nest.js 框架,上传方式可以选择本地上传或代码仓库拉取
注意:启动文件以项目内文件为准,如果您的项目里已经包含 scf_bootstrap 文件,将不会覆盖该内容。

单个函数代码体积 500mb 的上限。在实际操作中,云函数虽然提供了 500mb

关于绕过配额问题:
如果超的不多,那么使用 npm install --production
就能解决问题
边栏推荐
- 【Yugong Series】July 2022 Go Teaching Course 021-Slicing Operation of Go Containers
- 这位985教授火了!当了10年博导,竟无一博士毕业!
- 智能垃圾桶(八)——红外对管传感器(树莓派pico)
- Last write wins (discards concurrent writes)
- JS基础小练习
- MySQL---operator
- How to install CV2 smoothly in Anaconda
- Flutter set the background color of the statusbar status bar and APP method (AppBar) internal consistent color.
- 京东按关键字搜索商品 API
- JD.com searches for products by keyword API
猜你喜欢
智能垃圾桶(九)——震动传感器(树莓派pico实现)
Smart Trash Can (8) - Infrared Tube Sensor (Raspberry Pi pico)
ECCV 2022 华科&ETH提出首个用于伪装实例分割的一阶段Transformer的框架OSFormer!代码已开源!...
如何识别假爬虫?
MySQL---多表查询
【pytorch】pytorch 自动求导、 Tensor 与 Autograd
Huawei mobile phone one-click to open "maintenance mode" to hide all data and make mobile phone privacy more secure
最新神作!阿里巴巴刚出炉的面试参考指南(泰山版),我直接狂刷29天
This 985 professor is on fire!After 10 years of Ph.D. supervisor, no one has graduated with a Ph.D.!
[pytorch] pytorch automatic derivation, Tensor and Autograd
随机推荐
【码蹄集新手村600题】通向公式与程序相结合
学生管理系统第一天:完成登录退出操作逻辑 PyQt5 + MySQL5.8
2022 Android interview summary (with interview questions | source code | interview materials)
35道MySQL面试必问题图解,这样也太好理解了吧
Kotlin coroutines: continuation, continuation interceptor, scheduler
Get Douyin Video Details API
Flutter 获取状态栏statusbar的高度
[TypeScript] OOP
MATLAB程序设计与应用 2.4 MATLAB常用内部函数
ECCV 2022 华科&ETH提出首个用于伪装实例分割的一阶段Transformer的框架OSFormer!代码已开源!...
useragent怎么获取
All-platform GPU general AI video supplementary frame super-score tutorial
Concurrency, Timing and Relativity
淘宝/天猫获得淘口令真实url API
如何识别假爬虫?
你辛辛苦苦写的文章可能不是你的原创
牛客网刷题(四)
This 985 professor is on fire!After 10 years of Ph.D. supervisor, no one has graduated with a Ph.D.!
基于WPF重复造轮子,写一款数据库文档管理工具(一)
基于WPF重复造轮子,写一款数据库文档管理工具(一)