docker部署ruoyi-vue-pro前后端详细笔记

发布于:2025-04-22 ⋅ 阅读:(12) ⋅ 点赞:(0)

docker部署ruoyi-vue-pro前后端详细笔记

参考:YuDaoCloud:Docker 部署 - 那个码农

1.准备工作

1.1 需要准备服务器,安装bt面板方便操作

image-20250421210318166

if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec

image-20250421211242430

安装完成

image-20250421211511912

会出现面板登录地址和账号密码,前往登录

可能遇到的问题

1.2 无法访问的情况:

1.防火墙没放行对应的端口
2.防火墙放行了,但是云服务器的安全组没有放行
3.若是轻量型应用服务器,也要到服务器官网放行

命令:

firewall-cmd --zone=public --list-ports
firewall-cmd --zone=public --add-port=13366/tcp --permanent
firewall-cmd --zone=public --list-ports
firewall-cmd --reload

以后遇到无法访问都可能是防火墙问题,放行对应的端口即可

登录后,需要绑定手机号

然后选择LNMP一键安装,本文是使用docker运行nginx,redis,server,php7.2,数据库是使用本地mysql5.7(方便使用navicat工具进行管理)

1.3 安装docker

1.3.1.懒人版:

dnf install -y device-mapper-persistent-data lvm2 
yum -y install dnf
dnf install -y device-mapper-persistent-data lvm2
dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf install 'dnf-command(config-manager)'
dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf list docker-ce
dnf install -y docker-ce --nobest
dnf install -y docker-ce
docker -v
systemctl start docker
systemctl enable docker

如果报错无命令,使用下面命令安装

yum -y install dnf

继续安装

dnf install -y device-mapper-persistent-data lvm2

设置镜像源

dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

如果报错,应该是叫你安装管理工具,使用下面命令即可

dnf install 'dnf-command(config-manager)'

安装好后继续添加源

dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看版本

dnf list docker-ce

安装

dnf install -y docker-ce --nobest

报错的话,除掉后面的nobest

dnf install -y docker-ce

安装后查看版本

docker -v

启动并且设置为开机自启动

systemctl start docker
systemctl enable docker

1.3.2 安装redis (docker)

执行如下命令,使用 Docker 启动 Redis 容器。

docker run -d --name redis --restart=always -p 6379:6379 m.daocloud.io/docker.io/redis
  • 端口是 6379,密码未设置

1.3.3 安装nginx(docker)

Nginx 挂载到服务器的目录:

  • /work/nginx/conf.d 用于存放配置文件

  • /work/nginx/html 用于存放网页文件

  • /work/nginx/logs 用于存放日志

  • /work/nginx/cert 用于存放 HTTPS 证书

创建主目录和子目录

mkdir -p /work/nginx/{conf.d,html,logs,cert}

设置权限(确保 Docker 容器可读写)

chmod -R 755 /work/nginx

创建 /work/nginx 目录,并在该目录下新建 nginx.conf 文件,避免稍后安装 Nginx 报错。内容如下:

user  nginx;
worker_processes  1;
​
events {
    worker_connections  1024;
}
​
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
​
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
​
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
#    access_log  /var/log/nginx/access.log  main;
​
    gzip on;
    gzip_min_length 1k;     # 设置允许压缩的页面最小字节数
    gzip_buffers 4 16k;     # 用来存储 gzip 的压缩结果
    gzip_http_version 1.1;  # 识别 HTTP 协议版本
    gzip_comp_level 2;      # 设置 gzip 的压缩比 1-9。1 压缩比最小但最快,而 9 相反
    gzip_types text/plain application/x-javascript text/css application/xml application/javascript; # 指定压缩类型
    gzip_proxied any;       # 无论后端服务器的 headers 头返回什么信息,都无条件启用压缩
​
    include /etc/nginx/conf.d/*.conf; ## 加载该目录下的其它 Nginx 配置文件
}

然后去到宝塔面板关闭原来一开始安装的nginx,下面是停止后的图

image-20250421213620579

启动 Nginx

① 执行如下命令,使用 Docker 启动 Nginx 容器。

docker run -d \
--name nginx --restart always \
-p 80:80 -p 443:443 \
-e "TZ=Asia/Shanghai" \
-v /work/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /work/nginx/conf.d:/etc/nginx/conf.d \
-v /work/nginx/logs:/var/log/nginx \
-v /work/nginx/cert:/etc/nginx/cert \
-v /work/nginx/html:/usr/share/nginx/html \
m.daocloud.io/docker.io/nginx

② 执行 docker ps 命令,查看到 Nginx 容器的状态是 UP 的。

1.3.4 mysql配置允许远程navicat连接

一开始使用phpdamin连接,通过面板,注意,需要开启ssl,不然会报错

修改root密码,点击数据库-->点击root密码即可,然后开启nacvicat远程连接数据库

参考:navicat 远程云服务器的mysql问题-CSDN博客

image-20250421214810327

随后在自己电脑上成功连接

恭喜你🎉,至此,你已经完成基础环境的安装了;

可以在面板上点击docker-->容器,看到自己创建的容器

image-20250421215013053

下面是本文重头戏前后端打包部署

2.后端部署

2.1 配置文件修改

激活配置:(application.yaml)

image-20250421215232565

修改登录验证图片的文字水印 (application.yml)

image-20250421215628606

image-20250421220250971

修改数据库等重要信息,与自己的服务器ip配对(application-dev.yaml)

⚠️给出mysql5.x跟mysql8的配置(本文用的是5.7)

#          url: jdbc:mysql://ip:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
          url: jdbc:mysql://ip:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例

redis,微信小程序id等,下面是参考

server:
  port: 48080
​
--- #################### 数据库相关配置 ####################
​
spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
      - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
      - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
      - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
  # 数据源配置项
  datasource:
    druid: # Druid 【监控】相关的全局配置
      web-stat-filter:
        enabled: true
      stat-view-servlet:
        enabled: true
        allow: # 设置白名单,不填则允许所有访问
        url-pattern: /druid/*
        login-username: # 控制台管理用户名和密码
        login-password:
      filter:
        stat:
          enabled: true
          log-slow-sql: true # 慢 SQL 记录
          slow-sql-millis: 100
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
    dynamic: # 多数据源配置
      druid: # Druid 【连接池】相关的全局配置
        initial-size: 5 # 初始连接数
        min-idle: 10 # 最小连接池数量
        max-active: 20 # 最大连接池数量
        max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
        time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
        min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
        max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
        validation-query: SELECT 1 # 配置检测连接是否有效
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
      primary: master
      datasource:
        master:
#          url: jdbc:mysql://8.138.40.47:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
          url: jdbc:mysql://47.17.2.5:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例
          username: root
          password: 123456
        slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
          lazy: true # 开启懒加载,保证启动速度
#          url: jdbc:mysql://8.138.40.47:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
          url: jdbc:mysql://47.17.2.5/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例
          username: root
          password: 123456
​
  # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
  data:
    redis:
      host: 47.17.2.5 # 地址
#      host: 8.138.40.47 # 地址
      port: 6379 # 端口
      database: 1 # 数据库索引
    password: 123456syz@ # 密码,建议生产环境开启
​
--- #################### 定时任务相关配置 ####################
​
# Quartz 配置项,对应 QuartzProperties 配置类
spring:
  quartz:
    auto-startup: true # 测试环境,需要开启 Job
    scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName
    job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
    wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
    properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档
      org:
        quartz:
          # Scheduler 相关配置
          scheduler:
            instanceName: schedulerName
            instanceId: AUTO # 自动生成 instance ID
          # JobStore 相关配置
          jobStore:
            # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162
            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
            isClustered: true # 是集群模式
            clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒
            misfireThreshold: 60000 # misfire 阀值,单位:毫秒。
          # 线程池相关配置
          threadPool:
            threadCount: 25 # 线程池大小。默认为 10 。
            threadPriority: 5 # 线程优先级
            class: org.quartz.simpl.SimpleThreadPool # 线程池类型
    jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置
      initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。
​
--- #################### 消息队列相关 ####################
​
# rocketmq 配置项,对应 RocketMQProperties 配置类
rocketmq:
  name-server: 127.0.0.1:9876 # RocketMQ Namesrv
​
spring:
  # RabbitMQ 配置项,对应 RabbitProperties 配置类
  rabbitmq:
    host: 127.0.0.1 # RabbitMQ 服务的地址
    port: 5672 # RabbitMQ 服务的端口
    username: guest # RabbitMQ 服务的账号
    password: guest # RabbitMQ 服务的密码
  # Kafka 配置项,对应 KafkaProperties 配置类
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
​
--- #################### 服务保障相关配置 ####################
​
# Lock4j 配置项
lock4j:
  acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
  expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
​
--- #################### 监控相关配置 ####################
​
# Actuator 监控端点的配置项
management:
  endpoints:
    web:
      base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
      exposure:
        include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
​
# Spring Boot Admin 配置项
spring:
  boot:
    admin:
      # Spring Boot Admin Client 客户端的相关配置
      client:
        url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
        instance:
          service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
      # Spring Boot Admin Server 服务端的相关配置
      context-path: /admin # 配置 Spring
​
# 日志文件配置
logging:
  file:
    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
​
--- #################### 微信公众号相关配置 ####################
wx:
  mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
    app-id: wx0fc626fe05ddfb99 # 测试号(自己的 wx2ee5bbbb1fd812dc)
    secret: d2e5580b7c937bb9949910818b44aa7c
    # 存储配置,解决 AccessToken 的跨节点的共享
    config-storage:
      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
      key-prefix: wx # Redis Key 的前缀
      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
  miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
    appid: wx2ee5bbbb1fd812dc # wenhualian的接口测试号
    secret: bf350f2e1386ac7a5c10d636fdbcdfb2
    config-storage:
      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
      key-prefix: wa # Redis Key 的前缀
      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
#wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
#  mp:
#    # 公众号配置(必填)
#    app-id: wx041349c639b268b
#    secret: 5abee51948c9f8cb37ce280e814bd0
#    # 存储配置,解决 AccessToken 的跨节点的共享
#    config-storage:
#      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
#      key-prefix: wx # Redis Key 的前缀
#      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
#  miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
#    appid: wx63c28e3248a3e7
#    secret: 6f270509227ae1296bbf1c8cb97aed
#    config-storage:
#      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
#      key-prefix: wa # Redis Key 的前缀
#      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
​
--- #################### 芋道相关配置 ####################
​
# 芋道配置项,设置当前项目所有自定义的配置
yudao:
  pay:
    order-notify-url: http://47.17.2.5/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
    refund-notify-url: http://47.17.2.5/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
    transfer-notify-url: https://47.17.2.5/admin-api/pay/notify/transfer # 支付渠道的【转账】回调地址
  demo: false # 开启演示模式
  tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
​
justauth:
  enabled: true
  type:
    DINGTALK: # 钉钉
      client-id: dingvrnreaje3qvzhxg
      client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
      ignore-check-redirect-uri: true
    WECHAT_ENTERPRISE: # 企业微信
      client-id: wwd411c69a39ad54
      client-secret: 1wTb7hYT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
      agent-id: 1000004
      ignore-check-redirect-uri: true
    # noinspection SpringBootApplicationYaml
    WECHAT_MINI_APP: # 微信小程序
      client-id: ${wx.miniapp.appid}
      client-secret: ${wx.miniapp.secret}
      ignore-check-redirect-uri: true
      ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验
    WECHAT_MP: # 微信公众号
      client-id: ${wx.mp.app-id}
      client-secret: ${wx.mp.secret}
      ignore-check-redirect-uri: true
  cache:
    type: REDIS
    prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
    timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
​
​
--- #################### iot相关配置 TODO 芋艿:再瞅瞅 ####################
iot:
  emq:
    # 账号
    username: anhaohao
    # 密码
    password: ahh@123456
    # 主机地址
    hostUrl: tcp://chaojiniu.top:1883
    # 客户端Id,不能相同,采用随机数 ${random.value}
    client-id: ${random.int}
    # 默认主题
    default-topic: test
    # 保持连接
    keepalive: 60
    # 清除会话(设置为false,断开连接,重连后使用原来的会话 保留订阅的主题,能接收离线期间的消息)
    clearSession: true

关闭演示(application-dev.yaml 能够进行数据库写入删除操作)

image-20250421215153873

2.2 下面进行打包:

mvn clean package -Dmaven.test.skip=true

image-20250421220753735

mac可以使用命令scp传输

scp yudao-server.jar root@ip:/root

输入账号密码即可

构建镜像

① 在 /work/projects/yudao-server 目录下(没有就创建),新建 Dockerfile 文件,用于制作后端项目的 Docker 镜像。编写内容如下:

FROM m.daocloud.io/docker.io/eclipse-temurin:21-jre
​
## 创建目录,并使用它作为工作目录
RUN mkdir -p /yudao-server
WORKDIR /yudao-server
## 将后端项目的 Jar 文件,复制到镜像中
COPY yudao-server.jar app.jar
​
## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m"
​
## 暴露后端项目的 48080 端口
EXPOSE 48080
​
## 启动后端项目
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar

② 执行如下命令,构建名字为 yudao-server 的 Docker 镜像。

cd /work/projects/yudao-server
docker build -t yudao-server .

③ 在 /work/projects/yudao-server 目录下,新建 Shell 脚本 deploy.sh,使用 Docker 启动后端项目。编写内容如下:

#!/bin/bash
set -e
​
## 第一步:删除可能启动的老 yudao-server 容器
echo "开始删除 yudao-server 容器"
docker stop yudao-server || true
docker rm yudao-server || true
echo "完成删除 yudao-server 容器"
​
## 第二步:启动新的 yudao-server 容器 \
echo "开始启动 yudao-server 容器"
docker run -d \
--name yudao-server \
-p 48080:48080 \
-e "SPRING_PROFILES_ACTIVE=dev" \
-v /work/projects/yudao-server:/root/logs/ \
yudao-server
echo "正在启动 yudao-server 容器中,需要等待 60 秒左右"
  • 应用日志文件,挂载到服务器的的 /work/projects/yudao-server 目录下

  • 通过 SPRING_PROFILES_ACTIVE 设置为 dev 开发环境

启动后端

① 执行 sh deploy.sh 命令,使用 Docker 启动后端项目。日志如下:

开始删除 yudao-server 容器
yudao-server
yudao-server
完成删除 yudao-server 容器
开始启动 yudao-server 容器
0dfd3dc409a53ae6b5e7c5662602cf5dcb52fd4d7f673bd74af7d21da8ead9d5
正在启动 yudao-server 容器中,需要等待 60 秒左右

② 执行 docker logs yudao-server 命令,查看启动日志。看到如下内容,说明启动完成:

image-20250421221421477

3.前端部署

3.1 修改配置文件

3.2 打包dist上传

打包命令

npm run build:dev

打包好的dist文件夹里的所有文件放到服务器的

/work/nginx/html下

3.3 创建nginx配置文件

在/work/nginx/conf.d,创建ruoyi-vue-pro.conf文件

server {
    listen       80;
    server_name  139.9.196.247; ## 重要!!!修改成你的外网 IP/域名
​
    location / { ## 前端项目
        root   /usr/share/nginx/html/yudao-admin-ui;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
​
    location /admin-api/ { ## 后端项目 - 管理后台
        proxy_pass http://192.168.0.213:48080/admin-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IP
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
​
    location /app-api/ { ## 后端项目 - 用户 App
        proxy_pass http://192.168.0.213:48080/app-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IP
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
​
}

3.4 命令验证重启服务

docker exec nginx nginx -t
docker exec nginx nginx -s reload

4.访问测试

image-20250421222610071

image-20250421223025964


网站公告

今日签到

点亮在社区的每一天
去签到