有来前后端部署

环境准备

注意:本节内容仅代表个人笔记,供大家参考,不是唯一的可行操作,也不保证保证记录所有操作。最好的方法是根据报错信息采取措施。

  1. 安装 Docker。

    www.docker.com/

  2. 安装 Maven。

    sh 复制代码
    brew install maven

    在我的环境里,以上指令会同时安装 OpenJDK 24,可供 Maven 直接使用。如果你的环境里没有这个功能,请自行安装 JDK。

  3. 安装 Node.js。

    sh 复制代码
    brew install node

部署后端

首先克隆后端仓库。

sh 复制代码
git clone https://gitee.com/youlaiorg/youlai-boot.git

在仓库目录下,先尝试构建 Java 项目。

sh 复制代码
mvn package

正常情况下,会报大量错误。

less 复制代码
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/orange/Documents/GitHub/youlai-boot/src/main/java/com/youlai/boot/auth/controller/AuthController.java:[33,31] 变量 authService 未在默认构造器中初始化
[ERROR] /Users/orange/Documents/GitHub/youlai-boot/src/main/java/com/youlai/boot/common/result/Result.java:[29,15] 找不到符号
  符号:   方法 setCode(java.lang.String)
  位置: 类型为com.youlai.boot.common.result.Result<T>的变量 result

原因是项目依赖没有正确配置 Lombok 插件。解决方法是在 pom.xml<build><plugnins> 标签中增加以下插件。
代码改动:增加 Lombok 插件

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.14.0</version>
    <configuration>
        <source>17</source>
        <target>17</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </path>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-mapstruct-binding</artifactId>
                <version>${lombok-mapstruct-binding.version}</version>
            </path>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${mapstruct.version}</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

构建 Docker 镜像前,准备 Docker 基础镜像。在配置好网络环境后,根据 docker/docker-compose.ymlDockerfile,拉取以下镜像。

sh 复制代码
docker pull mysql:8.0.29
docker pull redis:7.2.3
docker pull minio/minio:RELEASE.2024-07-16T23-46-41Z
docker pull openjdk:17

确保 Docker 基础镜像都被拉取后,可以开始构建镜像。注意 Dockerfile 中规定了,构建服务器程序的镜像时,是直接使用的编译好的 jar 包,不会在构建镜像时进行编译。

sh 复制代码
docker buildx build -t youlai-boot:latest .

在运行中间件的 docker-compose 前,需要根据我们的技术需求对 docker/docker-compose.yml 进行一些更改。

  1. 删去 xxl-job-admin。

    代码改动:删去 xxl-job-admin

    yml 复制代码
    # xxl-job-admin:
    #   image: xuxueli/xxl-job-admin:2.4.0
    #   container_name: xxl-job-admin
    #   restart: unless-stopped
    #   environment:
    #     PARAMS: '--spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456 --spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver'
    #   volumes:
    #     - ./xxljob/logs:/data/applogs
    #   ports:
    #     - 8080:8080
    #   networks:
    #     - youlai-boot
  2. 使用命名卷存储数据。

    代码改动:使用命名卷存储数据

    yml 复制代码
    volumes:
      mysql_data: {}
      redis_data: {}
      minio_data: {}
    
    # - ./mysql/data:/var/lib/mysql # 持久化 MySQL 数据
    - mysql_data:/var/lib/mysql # 持久化 MySQL 数据
    
    # - ./redis/data:/data
    - redis_data:/data
    
    # - ./minio/data:/data
    - minio_data:/data
  3. 使用 secrets 传递密码。

    代码改动:使用 secrets 传递密码

    yml 复制代码
    secrets:
      db_root_password:
        file: ./secrets/db_root_password.txt
      minio_root_password:
        file: ./secrets/minio_root_password.txt
    
    secrets:
      - db_root_password
    environment:
    #  - MYSQL_ROOT_PASSWORD=123456 #设置 root 用户的密码
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
    
    secrets:
      - minio_root_password
    environment:
    #  - MINIO_ROOT_PASSWORD=minioadmin
      - MINIO_ROOT_PASSWORD_FILE=/run/secrets/minio_root_password

创建 docker/secrets/.gitkeep,并修改 .gitignore
代码改动:更新 gitignore 忽视密码

bash 复制代码
docker/secrets/*.txt

新建 docker/secrets/db_root_password.txtdocker/secrets/minio_root_password.txt,在里面填入密码。

运行 docker-compose,初始化中间件。

sh 复制代码
docker-compose -f docker/docker-compose.yml up

如果没有问题,后续可以使用以下命令在后台启动中间件。

sh 复制代码
docker-compose -f docker/docker-compose.yml up -d

可以用以下命令关闭中间件。

bash 复制代码
docker-compose -f docker/docker-compose.yml down

同理,服务器程序的密码需要通过 docker-compose 的 secrets 传递。需要修改 src/main/resources/application-dev.ymlsrc/main/resources/application-prod.yml。为了安全,首先给数据库创建一个名为 youlai 的用户,单独分配密码,并对 youlai_boot 这个数据库分配 SELECT, INSERT, UPDATE, DELETE 权限。

sql 复制代码
GRANT SELECT, INSERT, UPDATE, DELETE ON youlai_boot.* TO 'youlai'@'172.%';
FLUSH PRIVILEGES;

代码改动:配置文件中的密码使用环境变量

yaml 复制代码
    url: jdbc:mysql://mysql:3306/youlai_boot?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
    username: youlai
    password: ${DB_USER_PASSWORD}
yaml 复制代码
    redis:
      database: 11
      host: redis
      port: 6379
      password: 123456
yaml 复制代码
    endpoint: http://minio:9000
    # 访问凭据
    access-key: minioadmin
    # 凭据密钥
    secret-key: ${MINIO_ROOT_PASSWORD}

在 docker-compose 里增加服务器程序。
代码改动:在 compose 里增加服务器程序

yaml 复制代码
  db_user_password:
    file: ./secrets/db_user_password.txt
yaml 复制代码
  youlai-boot:
    image: youlai-boot:latest
    container_name: youlai-boot
    restart: unless-stopped
    depends_on:
      - mysql
      - redis
      - minio
    secrets:
      - db_user_password
      - minio_root_password
    environment:
      - TZ=Asia/Shanghai
      - SPRING_PROFILES_ACTIVE=prod
    networks:
      - youlai-boot
    ports:
      - 8989:8989
    entrypoint:
      - "sh"
      - "-c"
      - |
        export DB_USER_PASSWORD=$(cat /run/secrets/db_user_password) && \
        export MINIO_ROOT_PASSWORD=$(cat /run/secrets/minio_root_password) && \
        java -Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom -jar /app.jar

部署前端

首先克隆前端仓库。

sh 复制代码
git clone https://gitee.com/youlaiorg/vue3-element-admin

安装 pnpm。

sh 复制代码
npm i -g pnpm

使用 pnpm 安装依赖包。

sh 复制代码
pnpm i

为了方便本地调试,修改配置文件 .env.development,使其指向本地服务器。

yaml 复制代码
# VITE_APP_API_URL=https://api.youlai.tech # 线上
VITE_APP_API_URL=http://localhost:8989 # 本地

打包。

sh 复制代码
npm run build

打包生成的文件在 dist/ 目录下。

在服务器上部署前端和后端

首先为服务器安装宝塔面板。

在网站页中安装 Nginx。

在 Docker 页中安装宝塔 Docker 模块。

在文件页面将打包生成的 dist/ 上传到 /www/wwwroot/

在网站页中添加 HTML 项目,根目录指定为 /www/wwwroot/dist。至此,可以访问前端。

像本地一样克隆源码(可以用部署公钥)、拉取镜像、构建镜像、编排容器。

修改 HTML 项目的 Nginx 配置,增加后端接口的转发。
代码改动:增加 Nginx 转发

nginx 复制代码
location /prod-api/ {
    proxy_pass http://127.0.0.1:8989/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

尽管如此配置了,仍然需要在安全组中开放 8989 端口,否则验证码无法正常工作。

相关推荐
tanxiaomi1 小时前
通过HTML演示JVM的垃圾回收-新生代与老年代
前端·jvm·html
palpitation971 小时前
Android App Links 配置
前端
FuckPatience1 小时前
Vue 组件定义模板,集合v-for生成界面
前端·javascript·vue.js
sophie旭1 小时前
一道面试题,开始性能优化之旅(3)-- DNS查询+TCP(三)
前端·面试·性能优化
开心不就得了2 小时前
构建工具webpack
前端·webpack·rust
gerrgwg2 小时前
Flutter中实现Hero Page Route效果
前端
不枯石2 小时前
Matlab通过GUI实现点云的ICP配准
linux·前端·图像处理·计算机视觉·matlab
hhzz2 小时前
Pythoner 的Flask项目实践-在web页面实现矢量数据转换工具集功能(附源码)
前端·python·flask
lypzcgf2 小时前
Coze源码分析-资源库-编辑工作流-前端源码-核心流程/API/总结
前端·工作流·coze·coze源码分析·智能体平台·ai应用平台·agent平台
lypzcgf2 小时前
Coze源码分析-资源库-编辑工作流-前端源码-核心组件
前端·工作流·coze·coze源码分析·智能体平台·agent平台