本地开发完成的项目,如何部署到线上?
分为以下步骤:
- 部署规划
- 安装依赖
- 后端部署
- 前端部署
- 问题处理
- 测试验证
目录
一、部署规划
1、获取源码
本项目分为开源版本和扩展版本。
扩展版本:前端补充了更多功能、后端使用了 Redisson 分布式锁和 Sharding JDBC 分库分表。
见编程导航项目教程的资料 => 项目源码:编程导航 - 程序员一站式编程学习交流社区,做您编程学习路上的导航员
2、部署方案
前端
本项目前端使用 Vercel 平台部署;后端使用微信云托管平台,以容器的方式进行部署。
Vercel 平台可免费部署前端项目,支持读取 GitHub 仓库的项目,根据 package.json 文件自动安装依赖并执行打包构建命令,还会提供测试域名和正式的 HTTPS 域名供用户访问。此外,支持自定义域名、代码变更时自动部署、快速回滚版本、监控等操作。
Vercel: Build and deploy the best web experiences with the Frontend Cloud – Vercel
后端
微信云托管平台以容器的方式部署项目,支持读取 GitHub 仓库的项目,并根据 Dockerfile 文件自动构建容器镜像并启动,还会提供 HTTPS 公网域名供用户访问。此外,支持自定义域名、代码变更时自动部署、快速回滚版本、监控等操作。注意,该平台按量计费,不用时记得停止服务。
相比于传统的服务器方式部署,采用这些平台部署项目的优点是:
- 不需要登录服务器输入命令、更方便
- 更易于项目的扩展和回滚
- 平台内置监控能力,更易于管理和运维项目
3、地址规划
前端:使用 Vercel 生成的默认域名,访问地址为 https://{域名}
。
后端:使用微信云托管生成的默认域名,访问地址为 https://{域名}/api
,实际运行在 8101 端口。
数据库:需自行安装,一般为服务器的 3306 端口
Redis:需自行安装,一般为服务器 6379 端口
4、注意事项
注意,由于前端和后端都是用平台生成的默认域名,二者不一致,将会出现跨域问题。虽然后端已经通过 CorsConfig 全局支持了跨域,但 Cookie 无法跨域设置,会导致用户无法正常登录,所以后面需要进行解决。
二、安装依赖
本项目主要用到了 MySQL、Redis、对象存储和 ChatGLM AI 依赖。
1、MySQL
可以使用微信云托管或者第三方云服务提供的 MySQL,不用自己安装:
2、Redis
对本项目来说,如果使用了开源代码,Redis 不是必须要安装的;如果使用扩展版的代码,Redisson 分布式锁依赖 Redis,所以必须要安装 Redis,或者注释掉分布式锁和 Redis 相关的代码。
3、对象存储
需要在腾讯云的访问控制中获取到对象存储所需的 key 和 secret。同时如果对象存储配置开启了防盗链,注意要将前端网站的域名添加到防盗链白名单中,否则图片将无法加载。
4、ChatGLM AI
本项目使用了智谱 AI,需要在智谱 AI 开放平台中获取到调用 AI 所需的 key。
三、后端部署
1、数据库初始化
进入后端项目,首先利用 IDEA 自带的数据库管理能力,连接远程数据库。
然后执行 sql
目录下的 create_table.sql
和 init_data.sql
文件,创建库表和插入初始化数据。
2、项目修改
配置修改
修改生产环境的配置文件 application-prod.yml
,主要是数据库、Redis、对象存储和 ChatGLM API key 的配置。
还可以修改接口文档的配置,设置需要密码才能访问,保护接口信息安全。
如果使用了扩展版源码,还需要编写分库分表的配置,一定不要遗漏!
示例配置如下:
# 线上配置文件
server:
port: 8101
spring:
# 数据库配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://{修改为你的数据库地址}/yudada
username: 修改为你的用户名
password: 修改为你的密码
# Redis 配置
redis:
database: 1
host: 修改为你的地址
port: 6379
password: 修改为你的密码
# 分库分表配置(开源代码部署可忽略)
shardingsphere:
# 数据源配置
datasource:
# 多数据源以逗号隔开即可
names: yudada
yudada:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://{修改为你的数据库地址}/yudada
username: 修改为你的用户名
password: 修改为你的密码
# 规则配置
rules:
sharding:
# 分片算法配置
sharding-algorithms:
# 自定义分片规则名
answer-table-inline:
type: INLINE
props:
algorithm-expression: user_answer_$->{appId % 2}
tables:
user_answer:
actual-data-nodes: yudada.user_answer_$->{0..1}
# 分表策略
table-strategy:
standard:
sharding-column: appId
sharding-algorithm-name: answer-table-inline
mybatis-plus:
configuration:
# 生产环境关闭日志
log-impl: ''
# 接口文档配置
knife4j:
basic:
enable: true
username: 修改为你的用户名
password: 修改为你的密码
修改好配置后,可以将最新的代码推送到 GitHub 上,但是 一定要注意 !不要将包含密码和隐私数据的代码公开,建议新建一个 private 仓库 进行推送!
Dockerfile
Dockerfile 类似于一个脚本文件,用于指定构建 Docker 镜像的方式,这里直接给大家提供,不同的项目进行微调即可。
Dockerfile 代码如下,一般将其放到后端项目的根目录:
# Docker 镜像构建
# 选择基础镜像
FROM maven:3.8-jdk-8-slim as builder
# 解决容器时期与真实时间相差 8 小时的问题
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
# 复制代码到容器内
WORKDIR /app
COPY pom.xml .
COPY src ./src
# 打包构建
RUN mvn package -DskipTests
# 容器启动时运行 jar 包
CMD ["java","-jar","/app/target/yudada-backend-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]
其实就是把部署所需的环境和操作命令写在一起。
扩展 - 不使用 Redis
如果使用了扩展版源码,又不想部署 Redis,可以采用下面的方式关闭 Redis。
1)注释 RedissonConfig 配置类的注解
//@Configuration
//@ConfigurationProperties(prefix = "spring.redis")
2)注释 AiTestScoringStrategy 类的抢锁逻辑,以及对 Redisson 客户端的引用:
3)启动类 MainApplication 排除掉 Redis 的自动加载:
@SpringBootApplication(exclude = {RedisAutoConfiguration.class})
3、部署
首先进入微信云托管平台,创建环境并新建服务,注意要打开公网访问:
然后编写部署配置,选择发布在 GitHub 上的后端代码仓库,并且一定要修改端口号和实际后端项目一致!
注意目标目录要选择后端项目的根目录(这里是 yudada-backend),该目录内包含有 Dockerfile 文件。云托管平台会根据这个文件构建 Docker 镜像并启动容器。
配置完成后,点击发布,等待部署即可:
部署完成后,就可以通过云托管平台提供的公网域名进行访问和测试了。
四、前端部署
1、项目修改
修改 request.ts
文件,区分开发环境和生产环境使用的接口地址。生产环境的接口地址就是上一步后端部署得到的公网域名。
代码如下:
// 是否是开发环境
export const isDev = process.env.NODE_ENV === "development";
// 创建 Axios 实例
const myAxios = axios.create({
baseURL: isDev ? "http://localhost:8101" : "改为自己的后端地址",
timeout: 60000,
withCredentials: true,
});
2、部署
建议将项目发布到 GitHub 平台进行托管,敏感项目可以设置为 private。
先注册登录 Vercel 平台,授权 GitHub 后,点击新建项目,可以直接搜索到要部署的项目代码:
然后进入项目配置,由于本项目将前端、后端、小程序都放在了一起,所以必须指定项目目录为前端目录,然后平台会自动识别出这是一个 Vue 项目,并预设部署所需的命令。你也可以自行修改命令、添加环境变量等:
完成配置后,点击 Deploy 按钮,稍等片刻,即可完成部署。
五、问题处理
解决 Cookie 跨域
访问前端页面,虽然能够获取到主页数据,但是无法正常登录。具体表现为用户登录后,回到主页,仍然处于未登录的状态。
按 F12 打开网络控制台,可以看到由于跨域问题导致 Cookie 没种上,后端就无法标识前端用户,所以查询不到登录态。
修改后端项目设置 Cookie 的配置,必须同时设置 SameSite=None 和 Secure=true。 SameSite=None 表示 Cookie 将被发送到跨站请求中,而 Secure=true 确保 Cookie 只能通过 HTTPS 连接发送,从而提高了安全性。
修改 Spring Boot 生产环境配置文件如下:
server:
port: 8101
servlet:
session:
cookie:
# 解决跨域
same-site: none
secure: true
然后将修改推送到 GitHub 上,会自动触发微信云托管平台的流水线部署,稍等片刻后再次访问,这次项目的各操作都能够正常执行。