有来前后端部署

环境准备

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

  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 端口,否则验证码无法正常工作。

相关推荐
Aurora_NeAr2 小时前
Golang并发编程及其高级特性
后端·go
德育处主任2 小时前
p5.js 绘制 3D 椭球体 ellipsoid
前端·javascript·数据可视化
未来之窗软件服务2 小时前
未来之窗昭和仙君 (四) 前端网页分页 — 东方仙盟筑基期
前端·仙盟创梦ide·东方仙盟·东方仙盟修仙·昭和仙君
安卓开发者2 小时前
鸿蒙Next Web组件详解:属性设置与事件处理实战
前端·华为·harmonyos
安卓开发者2 小时前
鸿蒙NEXT Web组件与JavaScript交互:打通原生与前端的桥梁
前端·javascript·harmonyos
Sapphire~3 小时前
重学前端013 --- 响应式网页设计 CSS网格布局
前端·css
小菜花293 小时前
利用H5实现svg图片中各部分监听事件
前端·javascript·svg·object标签
二十雨辰4 小时前
歌词滚动效果
前端·css
法医4 小时前
和文心快码做朋友,让编程像“说话”一样简单
前端·文心快码