前言
最近跟着一个大佬做了一个全栈项目,前端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
在咱们的根目录下面创立这样一个文件,这个文件姓名能够随便取
然后在里边编写逻辑
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脚本咱们后边能够用到,这儿就记住是让服务器去履行拉取镜像以及履行发动容器的。
当咱们做到这一步之后,咱们提交代码的时分,应该会出现这样的状况
由于还没有去装备ssh密钥,这个必定跑不起来,看到咱们上面ssh command里边有两个变量,便是咱们要装备的,接下来咱们去搞服务器。
服务器
最近双十一活动,买个服务器还是挺香的,我买的阿里云2核2g的99/年,买的时分选操作系统,随便一个都能够,我由于对ubuntu熟悉一下,就买了ubuntu操作系统的,买好之后,记住重置密码
后边咱们用shell东西衔接的时分需求用到密码的
之后咱们去下载一个shell东西,衔接服务器用的,常见的有xshell finalshell,我用的第二个。
就傻瓜式装置,下一步就能够,然后咱们去衔接一下服务器,去下载浮屠。
第二步那里选择ssh衔接就能够了,然后主机便是你的服务器公网ip,密码便是刚刚的,用户名便是root
衔接上了之后,去下载浮屠,这个是ubuntu的指令,其他的操作系统有不同,能够去搜一下就有
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
下载好之后输入bt default指令就能够打开了
由于浮屠是个可视化操作面板,比较方便,所以先弄好。
接下来咱们去搞服务器密钥
咱们在这儿创立好密钥对,记住它只有一次时机,所以下载好了记住保存在你记住住的地方,然后创立好,记住要绑定,否则没效果,然后咱们就要得用ssh密钥来衔接服务器了
至此,咱们的服务器也弄好了
github绑定密钥
这个是settings界面的,然后咱们依照步骤创立就能够,到这儿咱们的装备就完毕了。
创立shell脚本
咱们上面不是说了,咱们要写一个bash文件吗,现在就要来写,这个bash文件咱们要履行拉镜像和跑容器
咱们能够选择在浮屠中操作
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必定找不到
咱们来上手操作
这是我现在在跑的容器,我要找到我的后端项目对应的容器id,进去履行指令
docker exec -it <容器id> /bin/sh
跑这个咱们就能够在容器内部履行指令
然后就能够把表结构同步曩昔了,咱们也能够在生成Dockerfile的时分写搬迁指令也是能够的,这样就不用手动同步了
数据库导出
咱们需求将本地的数据搬迁上去,需求先导出sql文件,这个就不用在这儿展开说了,很简单,不会能够去找个博客教程,不到30s就完了,导出后咱们需求将那个sql文件
然后咱们在浮屠操作,找到你正在运行的mysql容器目录
将你的sql文件上传上去,放哪里都无所谓,记住途径就行
然后咱们进入mysql容器里边,跑上面的那个指令
- 登录账号
mysql -u root -p
- 输入密码 ******* 输入你数据库衔接的那个密码
- 进入之后
USE <database_name>
就选中了那张表 - 然后履行
source 刚刚的那个sql文件途径
这样操作数据就同步上去了,留意,数据同步前是必定要有表结构的,所以有先后顺序,这个地方留意。
也能够用这个指令, 将sql文件拷贝到你的容器内,然后跑上面的步骤,看个人喜好了。
docker cp /本地途径/your_file.sql 容器称号:/容器途径/your_file.sql
到这儿咱们的布置就完毕了,等项目正式上线的时分,还有其他留意点还会再写一篇博客的
最终
项目是跟着最初提到的小付大佬学习的,首要想学下react,没想到是个全栈项目,就用nestjs写了后端,也学到了许多前端,后端,布置的常识,强烈推荐咱们能够去看看。最终 觉得不错的话,能够给个点赞加重视