项目快速部署上线

本地开发完成的项目,如何部署到线上?

分为以下步骤:

  1. 部署规划
  2. 安装依赖
  3. 后端部署
  4. 前端部署
  5. 问题处理
  6. 测试验证

目录

一、部署规划

1、获取源码

2、部署方案

前端

后端

3、地址规划

4、注意事项

二、安装依赖

1、MySQL

2、Redis

3、对象存储

4、ChatGLM AI

三、后端部署

1、数据库初始化

2、项目修改

配置修改

Dockerfile

扩展 - 不使用 Redis

3、部署

四、前端部署

1、项目修改

2、部署

五、问题处理

解决 Cookie 跨域


 

一、部署规划

1、获取源码

本项目分为开源版本和扩展版本。

开源版本:GitHub - liyupi/yudada: 新项目,基于 Vue 3 + Spring Boot + Redis + ChatGLM + RxJava + SSE 的 AI 答题应用平台。 用户可以基于 AI 快速制作并发布答题应用,支持检索、分享、在线答题并基于 AI 得到回答总结;管理员可以集中管理和审核应用。

扩展版本:前端补充了更多功能、后端使用了 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 公网域名供用户访问。此外,支持自定义域名、代码变更时自动部署、快速回滚版本、监控等操作。注意,该平台按量计费,不用时记得停止服务。

相比于传统的服务器方式部署,采用这些平台部署项目的优点是:

  1. 不需要登录服务器输入命令、更方便
  2. 更易于项目的扩展和回滚
  3. 平台内置监控能力,更易于管理和运维项目

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.sqlinit_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 上,会自动触发微信云托管平台的流水线部署,稍等片刻后再次访问,这次项目的各操作都能够正常执行。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值