前言

最近跟着一个大佬做了一个全栈项目,前端react,后端我是用的nest,大佬用的midway

大佬博客地址(前端小付 的个人主页 – 动态 – (juejin.cn)

最近项目也是布置上线了,由于域名还没存案,地址就先不发出来了,这篇文章就讲讲如何布置。一直有兄弟问prisma如何布置,这篇文章就帮你扫清障碍,文章或许比较长,希望耐性看完

后端技术栈

  • nestjs
  • mysql
  • redis
  • minio
  • prisma

布置需求把握的常识

  • docker
  • github actions
  • 服务器

实战

nestjs打包镜像

咱们布置的时分用的docker,docker需求拉镜像,然后生成容器,docker的常识能够去学习下,这儿就默许咱们会了,咱们在打包的时分要写Dockerfile文件,后端项目是需求保存node_modules的,所以打包的时分一同打进去,我的项目用的pnpm包管理东西,我的文件挂载时有点点问题,我就没有用pm2去履行多阶段打包,多阶段打包速度会比较快,还有便是比方开发环境的依靠能够不打,当然这都是优化的地方,暂时没有去做,咱们能够自行测验

# 由于咱们项目运用的是pnpm装置依靠,所以找了个支撑pnpm的基础镜像,如果你们运用npm,这儿能够替换成node镜像
# FROM nginx:alpine
FROM gplane/pnpm:8 as builder
# 设置时区
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 . ./
RUN npm config set registry https://registry.npm.taobao.org/
# pnpm 装置依靠
COPY package.json /app/package.json
RUN rm -rf /app/pnpm-lock.yml
RUN cd /app && rm -rf /app/node_modules &&  pnpm install 
RUN cd /app && rm -rf /app/dist && pnpm build
EXPOSE 3000
# 发动服务
CMD   pnpm run start:prod

这样后端镜像就构建好了,接下来去编写github action的文件,github actions是做ci/cd的,让咱们每次的布置走自动化流程,不要每次手动去做这些作业

github actions

在咱们的根目录下面创立这样一个文件,这个文件姓名能够随便取

带你从0到1布置nestjs项目

然后在里边编写逻辑

name: Docker
on:
  push:
    branches: ['main']
env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}
jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      id-token: write
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf
      - name: Cache Docker layers
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-
      - name: Log into registry ${{ env.REGISTRY }}
        if: github.event_name != 'pull_request'
        uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
      - name: Build and push Docker image
        id: build-and-push
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache-new
      - name: Move cache
        run: |
          rm -rf /tmp/.buildx-cache
          mv /tmp/.buildx-cache-new /tmp/.buildx-cache
      - name: SSH Command
        uses: D3rHase/ssh-command-action@v0.2.1
        with:
          HOST: ${{ secrets.SERVER_IP }}
          PORT: 22 
          USER: root
          PRIVATE_SSH_KEY: ${{ secrets.SERVER_KEY }}
          COMMAND: cd /root && ./run.sh

这儿的[‘main’]便是咱们要履行哪个分支,你不是main分支,那就改成你的分支就能够,其他都是固定的模板,直接用

SSH Command 这个是咱们取做ci/cd的时分,每次咱们提交代码,然后装备了ssh密钥,就能够让服务器履行run.sh指令,这个shell脚本咱们后边能够用到,这儿就记住是让服务器去履行拉取镜像以及履行发动容器的。

当咱们做到这一步之后,咱们提交代码的时分,应该会出现这样的状况

带你从0到1布置nestjs项目

由于还没有去装备ssh密钥,这个必定跑不起来,看到咱们上面ssh command里边有两个变量,便是咱们要装备的,接下来咱们去搞服务器。

服务器

最近双十一活动,买个服务器还是挺香的,我买的阿里云2核2g的99/年,买的时分选操作系统,随便一个都能够,我由于对ubuntu熟悉一下,就买了ubuntu操作系统的,买好之后,记住重置密码

带你从0到1布置nestjs项目

后边咱们用shell东西衔接的时分需求用到密码的

之后咱们去下载一个shell东西,衔接服务器用的,常见的有xshell finalshell,我用的第二个。

带你从0到1布置nestjs项目

就傻瓜式装置,下一步就能够,然后咱们去衔接一下服务器,去下载浮屠。

带你从0到1布置nestjs项目

第二步那里选择ssh衔接就能够了,然后主机便是你的服务器公网ip,密码便是刚刚的,用户名便是root

衔接上了之后,去下载浮屠,这个是ubuntu的指令,其他的操作系统有不同,能够去搜一下就有

wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh

下载好之后输入bt default指令就能够打开了

带你从0到1布置nestjs项目

由于浮屠是个可视化操作面板,比较方便,所以先弄好。

接下来咱们去搞服务器密钥

带你从0到1布置nestjs项目

咱们在这儿创立好密钥对,记住它只有一次时机,所以下载好了记住保存在你记住住的地方,然后创立好,记住要绑定,否则没效果,然后咱们就要得用ssh密钥来衔接服务器了

带你从0到1布置nestjs项目

至此,咱们的服务器也弄好了

github绑定密钥

带你从0到1布置nestjs项目

这个是settings界面的,然后咱们依照步骤创立就能够,到这儿咱们的装备就完毕了。

创立shell脚本

咱们上面不是说了,咱们要写一个bash文件吗,现在就要来写,这个bash文件咱们要履行拉镜像和跑容器

带你从0到1布置nestjs项目

咱们能够选择在浮屠中操作

docker-compose pull && docker-compose up --remove-orphans

然后咱们在同目录下也便是root目录下面新建一个docker-compose.yml文件,来发动容器的,这个文件就不要展现了,也便是创立了哪些服务,挂载哪些卷,如果有需求评论区说一下就行,很简单,由于咱们用了许多服务,mysql redis minio nginx 这些多镜像,就得多个容器来跑,docker-compose无疑就好

到这儿后端项目就布置完了,咱们还得搬迁数据库对吧

数据库布置

pirsma搬迁

由于我用的mysql和prisma,typeorm思路差不多,能够一样用。咱们的prisma以及typeorm搬迁的时分只能够同步表结构,数据不会同步曩昔,所以咱们跑搬迁指令的时分,跑完会发现没有数据,咱们需求手动导入数据

别的留意点,咱们docker-compose.yml里边的mysql容器姓名对应咱们衔接的主机名,这儿记住更改prisma衔接,否则你的prisma还衔接在localhost必定找不到

咱们来上手操作

带你从0到1布置nestjs项目

这是我现在在跑的容器,我要找到我的后端项目对应的容器id,进去履行指令

docker exec -it <容器id> /bin/sh 跑这个咱们就能够在容器内部履行指令

带你从0到1布置nestjs项目

然后就能够把表结构同步曩昔了,咱们也能够在生成Dockerfile的时分写搬迁指令也是能够的,这样就不用手动同步了

数据库导出

咱们需求将本地的数据搬迁上去,需求先导出sql文件,这个就不用在这儿展开说了,很简单,不会能够去找个博客教程,不到30s就完了,导出后咱们需求将那个sql文件

然后咱们在浮屠操作,找到你正在运行的mysql容器目录

带你从0到1布置nestjs项目

将你的sql文件上传上去,放哪里都无所谓,记住途径就行

然后咱们进入mysql容器里边,跑上面的那个指令

  1. 登录账号 mysql -u root -p
  2. 输入密码 ******* 输入你数据库衔接的那个密码
  3. 进入之后 USE <database_name> 就选中了那张表
  4. 然后履行 source 刚刚的那个sql文件途径

这样操作数据就同步上去了,留意,数据同步前是必定要有表结构的,所以有先后顺序,这个地方留意。

也能够用这个指令, 将sql文件拷贝到你的容器内,然后跑上面的步骤,看个人喜好了。 docker cp /本地途径/your_file.sql 容器称号:/容器途径/your_file.sql

到这儿咱们的布置就完毕了,等项目正式上线的时分,还有其他留意点还会再写一篇博客的

最终

项目是跟着最初提到的小付大佬学习的,首要想学下react,没想到是个全栈项目,就用nestjs写了后端,也学到了许多前端,后端,布置的常识,强烈推荐咱们能够去看看。最终 觉得不错的话,能够给个点赞加重视