第六章:备案、认证6. 服务端程序部署

服务端程序部署

大家好,这节课我们来讲一下如何部署服务端,也就是要将我们的这个服务端的项目部署到云服务器上。

这样用户才能够正常的访问。

部署方案

这里我们还是使用 Docker run 的方式,并且简化为脚本的方式部署,最终实现打包后一键运行。

类似前面我们安装的 MySQL 和 Nginx,我们使用自动化脚本来简化部署流程。

部署流程设计

我们的部署分为两个步骤:

  1. 本地打包:在本地执行打包脚本,生成 zip 文件
  2. 服务器部署:上传 zip 文件到服务器,执行部署脚本
💡

为什么不一步完成?

其实也有一些更简便的方法,执行一步就行了。我们只需要在本地执行一下脚本,然后自动上传到服务器进行部署。

但是那样需要去配置一下 SSH 的密钥,我觉得没有太大的必要,这个步骤也不复杂,所以我们就按照这种方式去做设计。

使用 AI 生成部署脚本

我们还是让 AI 来帮我们写一下部署的脚本。

使用 Cursor Agent 模式

可以先用 Agent 模式来设计一下。

最新版的 Agent 按钮现在被移到了上方的中间的位置。

点击 Prompt,然后这里我们粘贴一下提示词。

编写提示词

提示词我已经提前写好了:

根目录下的 account-backend 是一个 Express + TypeScript 的项目。

我现在想在服务器上使用 Docker run 的方式部署这个项目。

现在要创建部署的自动化脚本,分为本地打包和服务器部署两个独立的脚本。

要求:
1. 本地是 Windows 系统,给我一个 .bat 的脚本
2. 执行后将项目打包成一个 zip
3. 我手动上传到服务器
4. 然后在服务器上执行 deploy.sh
5. 自动处理这个文件,并且将新的服务启动起来

项目信息:
- 项目使用的是 Node 22 的版本
- zip 文件和 deploy 的脚本都上传到 /home/backend 目录下面
- 生产环境使用项目根目录下面的 production 配置

最终我只需要做如下的动作就可以发布服务:
1. 在本地执行打包的脚本
2. 执行完成之后会生成一个 zip 的文件
3. 将这个文件上传到服务器
4. 在服务器上执行部署脚本

如果你是 Mac 系统的话,你可以告诉 AI 给你一个 .sh 的脚本。

这个 BAT 和 SH 脚本如果你不懂的话没有关系,直接写脚本就行了,AI 它自己会去理解的。

然后回车。

查看生成的文件

我们来看一下,AI 直接生成好了对应的脚本文件:

  1. Dockerfile - Docker 镜像构建文件
  2. .dockerignore - Docker 忽略文件
  3. pack.bat - 本地打包的脚本
  4. deploy.sh - 在服务器上部署的脚本

脚本本身还是挺长的,我们先点击接受。

检查生成的文件

然后回到项目的根目录看一下,项目目录下面已经有了这几个文件:

account-backend/
├── .dockerignore
├── Dockerfile
├── deploy.sh      # 服务器部署脚本
└── pack.bat       # 本地打包脚本

本地打包测试

接下来,我们就先测试一下这个打包的脚本是否正常。

执行打包脚本

点击上方的 “终端”,然后新建一个终端。

直接输入:

pack

然后 Tab 键自动补全,回车。

查看打包结果

我们来看一下,这里提示已经构建成功。

然后提醒我们下面要把这个文件上传到服务器,然后上传 deploy 脚本并且执行。

我们来看一下打包后的这个文件,这里已经能够看到了一个 zip 文件。

部署到服务器

我们现在把它上传到服务器上并且部署一下。

连接到服务器

先打开 Xshell,打开我们的云服务器,然后启动 Xftp。

创建部署目录

复制一下路径,进入到 home 目录下面,然后新建一个 backend 目录。

上传文件

先把这个 zip 包给传过来。

然后再回到根目录下面,把这个 deploy.sh 脚本也传过来。

执行部署脚本

然后我们再回到 Xshell 里面,进入到这个目录下面:

cd /home/backend

这个时候还不能直接执行 deploy.sh,我们需要先执行一个授权的命令,也就是给这个脚本赋予一个可执行的权限:

chmod +x deploy.sh

再输入 ls 看一下,颜色变成了绿色,这个时候就是可执行的。

然后输入:

sh deploy.sh

或者可以这样:

./deploy.sh

是一样的效果。

查看部署过程

速度非常的快,我们先看一下它做了哪些事情,一共是 6 步:

  1. 停止旧的容器(但是没有旧的容器,如果有的话,它就会停止旧的容器)
  2. 备份
  3. 解压缩
  4. 移除旧的 Docker 镜像
  5. 构建新的镜像
  6. 运行

现在我们看到这个容器已经运行起来了!

验证部署结果

执行 docker ps -a 看一下:

docker ps -a

现在一共有两个容器在运行:

  • 一个就是我们之前部署的 MySQL
  • 另一个就是我们刚才部署的这个后端服务的项目

它的默认端口是 3000

浏览器访问测试

理论上来讲,映射到外网的端口,我们是可以直接在浏览器里面去访问的。

可以访问一下试试看:

http://120.48.57.219:3000

输入 IP 地址,然后端口是 3000。

看起来已经可以正常访问到这个服务了!

只是因为不存在接口,所以它报了一个 404。

那么服务部署是没有什么问题的! 🎉

部署脚本说明

pack.bat(本地打包脚本)

主要功能:

  1. 安装依赖(npm install)
  2. 编译 TypeScript 代码(npm run build)
  3. 将必要文件打包成 zip
  4. 提示上传到服务器

deploy.sh(服务器部署脚本)

主要功能:

  1. 停止旧的 Docker 容器
  2. 备份当前版本(可选)
  3. 解压缩上传的 zip 文件
  4. 移除旧的 Docker 镜像
  5. 构建新的 Docker 镜像
  6. 启动新的容器

Dockerfile

定义了容器的构建过程:

  • 使用 Node 22 基础镜像
  • 复制项目文件
  • 安装依赖
  • 设置启动命令

完整的部署流程

本地开发

执行 pack.bat 打包

生成 zip 文件

使用 Xftp 上传 zip 和 deploy.sh 到服务器

SSH 连接服务器

授权部署脚本(chmod +x deploy.sh)

执行部署脚本(./deploy.sh)

Docker 自动构建和运行

服务上线 ✅

常见问题

1. 端口冲突怎么办?

如果 3000 端口被占用,可以修改 Dockerfile 或 deploy.sh 中的端口映射。

2. 部署失败怎么排查?

# 查看容器日志
docker logs <容器名>
 
# 查看所有容器状态
docker ps -a
 
# 进入容器内部
docker exec -it <容器名> /bin/sh

3. 如何更新服务?

只需要重复部署流程:

  1. 本地打包
  2. 上传到服务器
  3. 执行 deploy.sh

4. 如何回滚到旧版本?

deploy.sh 脚本会自动备份,可以手动恢复备份文件。

5. 端口需要在安全组开放吗?

是的,需要在云服务器的安全组中开放 3000 端口(或你使用的端口)。

6. 如何查看服务运行状态?

# 查看容器状态
docker ps
 
# 查看服务日志
docker logs -f <容器名>

安全组配置

⚠️

重要:开放端口

不要忘记在云服务器的安全组中开放相应的端口(如 3000)!

否则外网无法访问服务。

端口配置表

服务端口用途
HTTP80网站访问
HTTPS443安全网站访问
MySQL3306数据库(建议不对外开放)
后端服务3000API 服务

部署优化建议

优化建议

  1. 使用环境变量:将配置信息放在环境变量中
  2. 配置反向代理:使用 Nginx 作为反向代理
  3. 启用 HTTPS:配置 SSL 证书
  4. 设置自动重启:容器退出时自动重启(--restart=always)
  5. 日志管理:配置日志轮转,避免日志文件过大
  6. 监控告警:配置服务监控和告警机制

总结

服务端部署的关键步骤:

  1. 使用 AI 生成自动化部署脚本
  2. 在本地执行 pack.bat 打包项目
  3. 使用 Xftp 上传 zip 文件和 deploy.sh 到服务器
  4. 给 deploy.sh 添加执行权限(chmod +x)
  5. 执行 deploy.sh 脚本进行部署
  6. 验证服务是否正常运行
  7. 在安全组中开放相应端口

部署成功!

现在我们的服务端已经成功部署到云服务器上,可以通过公网 IP 和端口访问了!

下一步

服务端部署完成后,我们需要测试服务端的各个接口,确保功能正常。


💡

遇到问题?

如果部署过程中遇到任何问题,可以下方微信扫码帮您看下(免费咨询)

相关信息

💬 扫码了解更多信息

客服微信二维码

添加微信

知识星球二维码

加入知识星球