Skip to content

环境部署

说明

因为本项目是前后端完全分离的,所以需要前后端都单独启动好,才能进行访问。

后端部署

一、环境准备与项目获取

1.1 环境要求清单

组件要求验证命令作用是否必须
JavaJDK 17+java -version打包&部署时使用
Maven3.5+mvn -v打包时使用
Git最新版git --version下载源码时使用
MySQL8.0+mysql --version数据库
Redis5.0+redis-server --version缓存
InfluxDB2.7.10+时序数据库
minio8.5+文件存储

提示

本项目依赖MySQL数据库、Redis缓存、InfluxDB时序数据库,如果采用JAR包或者WAR包的部署方式,需要手动部署MySQL、Redis及InfluxDB,关于MySQL、Redis及InfluxDB的部署流程请自行查阅网络上的教程,这里就不再赘述了。强烈推荐使用Docker容器化部署。

1.2 获取项目代码

bash
# 克隆项目(Gitee镜像)
git clone https://gitee.com/panweilei/ruoyi-radius.git

# 进入项目目录
cd ruoyi-radius

1.3 项目编译打包

bash
# 1. 清理并打包(跳过测试)
mvn clean package -DskipTests

# 2. 只打包后端管理模块
mvn clean package -DskipTests -pl ruoyi-admin -am

# 打包后的JAR位置:
# 项目根目录/ruoyi-admin/target/ruoyi-admin.jar

1.4 生产环境配置(此步骤可选:可通过启动参数进行设置)

  • 修改 application.yml相关参数(服务器端口号、Portal认证配置、Radius认证配置、InfluxDB相关信息等)
yaml
# 开发环境配置
server:
  # 服务器的HTTP端口,默认为8080
  port: 8080
  servlet:
    # 应用的访问路径
    context-path: /
    session:
      timeout: 30m
      
# ... 省略其它

# portal认证 & radius认证 配置
aaa:
  # portal认证
  portal:
    # 是否开启portal认证
    portalEnabled: ${PORTAL_ENABLED:true}
    # 监听端口
    listenPort: ${PORTAL_SOCKET_PORT:50100}
    # 认证加密方式 0 chap  1 pap   pap不安全 推荐采用chap
    papchap: 0
    # 线程池数
    pool: ${PORTAL_THREAD_POOL:8}
    # 超时时长(单位毫秒)
    timeOut: ${PORTAL_SOCKET_TIMEOUT:60000}
  # radius认证
  radius:
    # 是否开启radius认证功能
    authEnabled: ${RADIUS_AUTH_ENABLED:true}
    # 是否开启radius计费功能
    acctEnabled: ${RADIUS_ACCT_ENABLED:true}
    # radius认证端口
    authPort: ${RADIUS_AUTH_PORT:1812}
    # radius计费端口
    acctPort: ${RADIUS_ACCT_PORT:1813}
    # radius认证线程池
    authPool: ${RADIUS_AUTH_POOL:8}
    # radius计费线程池
    acctPool: ${RADIUS_ACCT_POOL:8}
    interimUpdate: 120
    interimTimes: 10
    allowNegative: false
    ignorePassword: false

# influx时序数据库 配置
influx2:
  # 是否开启influxDB时序数据库
  enabled: ${INFLUXDB_ENABLED:true}
  # influxDB服务器地址
  url: ${INFLUXDB_URL:http://192.168.174.130:8086}
  # 请求token
  token: ${INFLUXDB_TOKEN:a5hPe5yLh7tFatz3YK2ARx0NjKPZb-WPHAnfmDwRqStcnXA047CyoQx5pf2hnHOa4YFwiMFM6b-zSpSJBNmuzA==}
  # 组织名称
  org: ${INFLUXDB_ORG:ruoyi}
  # 存储桶名称
  bucket: ${INFLUXDB_BUCKET:ruoyi-radius}
  • 修改 application-prod.yml相关参数(数据库连接信息、Redis缓存连接信息等)
yaml
--- # 数据源配置
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
    dynamic:
      # 性能分析插件(有性能损耗 不建议生产环境使用)
      p6spy: false
      # 设置默认的数据源或者数据源组,默认值即为 master
      primary: master
      # 严格模式 匹配不到数据源则报错
      strict: true
      datasource:
        # 主库数据源
        master:
          type: ${spring.datasource.type}
          driverClassName: com.mysql.cj.jdbc.Driver
          # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
          # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
          url: jdbc:mysql://${DATABASE_HOST:192.168.174.130}:${DATABASE_PORT:3306}/ruoyi-radius?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
          username: ${DATABASE_USER:root}
          password: ${DATABASE_PASSWORD:123456}
      #        # 从库数据源
      hikari:
        # 最大连接池数量
        maxPoolSize: ${HIKARI_MAXPOOLSIZE:20}
        # 最小空闲线程数量
        minIdle: ${HIKARI_MINIDLE:10}
        # 配置获取连接等待超时的时间
        connectionTimeout: 90000
        # 校验超时时间
        validationTimeout: 5000
        # 空闲连接存活最大时间,默认10分钟
        idleTimeout: 600000
        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
        maxLifetime: 1800000
        # 多久检查一次连接的活性
        keepaliveTime: 30000

--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring.data:
  redis:
    # 地址
    host: ${REDIS_HOST:192.168.174.130}
    # 端口,默认为6379
    port: ${REDIS_PORT:6379}
    # 数据库索引
    database: 0
    # redis 密码必须配置
    password: ${REDIS_PASSWORD:ruoyi123}
    # 连接超时时间
    timeout: 10s
    # 是否开启ssl
    ssl.enabled: ${REDIS_SSL_ENABLED:false}

# redisson 配置
redisson:
  # redis key前缀
  keyPrefix:
  # 线程池数量
  threads: ${REDISSON_THREADS:16}
  # Netty线程池数量
  nettyThreads: ${REDISSON_NETTYTHREADS:32}
  # 单节点配置
  singleServerConfig:
    # 客户端名称 不能用中文
    clientName: ${REDISSON_SINGLE_CLIENTNAME:RuoYi-Radius}
    # 最小空闲连接数
    connectionMinimumIdleSize: ${REDISSON_SINGLE_CONMINIDLESIZE:32}
    # 连接池大小
    connectionPoolSize: ${REDISSON_SINGLE_CONPOOLSIZE:64}
    # 连接空闲超时,单位:毫秒
    idleConnectionTimeout: 10000
    # 命令等待超时,单位:毫秒
    timeout: 3000
    # 发布和订阅连接池大小
    subscriptionConnectionPoolSize: ${REDISSON_SINGLE_SUBCONPOOLSIZE:50}

# ... 省略其它

1.4 初始化数据库

  • 创建数据库ruoyi_radius并导入数据脚本(项目根目录/sql/ruoyi-radius.sql)

提示

ruoyi-radius.sql会自动删除并创建新的数据库及表,如果是更新,可把脚本中的建库语句(如下方所示:前5行)去掉, 如果提示表不存在,设置大小写敏感配置在/etc/my.cnf添加lower_case_table_names=1,重启MYSQL服务

sql
-- 删除数据库ruoyi-radius
DROP DATABASE IF EXISTS `ruoyi-radius`;
-- 创建数据库ruoyi-radius
CREATE DATABASE  `ruoyi-radius` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

USE `ruoyi-radius`;

-- ----------------------------
-- Table structure for gen_table
-- ----------------------------
DROP TABLE IF EXISTS `gen_table`;
-- 省略其他...

二、JAR包部署

2.1 启动脚本

  • 创建 `start.sh`(Linux/Mac):
bash
#!/bin/bash
APP_NAME="ruoyi-radius"
JAR_NAME="ruoyi-admin.jar"
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"

# 创建日志目录
mkdir -p logs

echo "启动 $APP_NAME ..."
nohup java $JAVA_OPTS -jar $JAR_NAME --spring.profiles.active=prod > logs/app.log 2>&1 &

echo "启动完成!PID: $!"
echo "查看日志: tail -f logs/app.log"
  • 创建 `start.bat`(Windows):
bash
@echo off
set APP_NAME=ruoyi-radius
set JAR_NAME=ruoyi-admin.jar
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:+UseG1GC

echo 启动 %APP_NAME% ...
java %JAVA_OPTS% -jar %JAR_NAME% --spring.profiles.active=prod

pause

2.2 部署验证

bash
# 1. 检查进程
ps aux | grep ruoyi-admin

# 2. 检查端口
netstat -tlnp | grep 8080

# 3. 健康检查
curl http://localhost:8080/ruoyi-radius/actuator/health

# 4. 查看日志
tail -f logs/ruoyi-radius.log

提示

后端运行成功可以通过(http://localhost:8080)访问,但是不会出现静态页面,可以继续参考下面步骤部署ruoyi-ui前端,然后通过前端地址来访问。

三、WAR包部署

3.1 修改打包方式

  • 修改 `ruoyi-admin/pom.xml`:
xml
<!-- 将打包方式改为war -->
<packaging>war</packaging>

<!-- 排除内置Tomcat(使用外部Tomcat) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

3.2 打包部署

bash
# 打包WAR文件
mvn clean package -DskipTests

# 将WAR包复制到Tomcat的webapps目录
cp ruoyi-admin/target/ruoyi-admin.war /opt/tomcat/webapps/

注意

WAR包部署的方式依赖于Tomcat,或者其它Webe服务器,需要额外部署Webe服务器才能正常使用。后端运行成功可以通过(http://localhost:8080)访问,但是不会出现静态页面,可以继续参考下面步骤部署ruoyi-ui前端,然后通过前端地址来访问。

四、Docker部署(推荐)

4.1 准备工作

  • 把jar包复制到对应的目录下:script/docker/monitor/jar/,script/docker/snailjob/jar,script/docker/server/jar
  • 把数据库脚本ruoyi-radius.mysql复制到script/docker/mysql/db
  • 把前端编译后的dist文件复制到script/docker/nginx/html,注意dist目录不用复制,只复制dist里面的所有文件即可

提示

可执行脚本script/docker/copyfile.bat批量复制文件到对应目录

4.2 安装Docker

bash
## 阿里云docker-CE安装
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils
# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Step 4: 开启Docker服务
sudo service docker start
# 安装校验 查看版本号
docker version

# 设置国内源
# 执行命令添加如下内容并保存
vim /etc/docker/daemon.json  
 {
    "registry-mirrors": [     
        "https://51mbg7lq.mirror.aliyuncs.com",
        "https://9cpn8tt6.mirror.aliyuncs.com",
        "https://registry.docker-cn.com",
        "https://a0f4d5484dea442caf5d1193f09abdd4.mirror.swr.myhuaweicloud.com",
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn",
        "https://hub-mirror.c.163.com",        
        "https://mirror.baidubce.com",         
        "https://ccr.ccs.tencentyun.com"
     ]
 }
#重启daemon进程
sudo systemctl daemon-reload	
#重启docker	
sudo systemctl restart docker		
#设置开机自启
sudo systemctl enable docker

4.3 安装Docker Compose

bash
# 下载Docker Compose的当前稳定版本(或者从其它地方下载docker-compose)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 修改可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 添加到PATH
export PATH=$PATH:/usr/bin/docker-compose
# 安装校验 查看版本号
docker-compose version

4.4 部署应用

  • 项目分为多个服务,需要依次部署完成,主服务ruoyi-admin需要依赖:ruoyi-mysql、ruoyi-redis、ruoyi-influxdb、ruoyi-minio(可选)
  • 具体部署命令如下:
bash
# 1.进入docker目录存放的位置(以/home/ruoyi/docker为例)
cd /home/ruoyi/docker

# 2.构建镜像
docker-compose build

# 3.构建服务
docker-compose up -d

# 4.验证 查看服务启动情况
docker-compose ps

# 建议依次单个服务部署,如:
# 构建单个镜像
docker-compose build --no-cache ruoyi-mysql
# 构建单个服务
docker-compose up ruoyi-mysql
# 停止单个镜像
docker-compose stop ruoyi-mysql
# 启动单个镜像
docker-compose start ruoyi-mysql
# 查看单个镜像日志
docker-compose logs -f ruoyi-mysql

提示

在Docker部署过程中,可能碰到的问题:

  1. 权限问题,确保ruoyi-redis服务中的挂载目录/home/ruoyi/redis/conf/redis.conf和/data目录有执行权限及读取权限,可执行: chmod 777 -R /home/ruoyi/redis 赋予读写权限。
  2. nginx启动失败:确保ruoyi-nginx-web服务中的挂载目录/home/ruoyi/nginx/conf/nginx.conf及/html目录已复制完整文件,并拥有执行权限。

4.5 创建InfluxDB密钥

主服务ruoyi-admin需要依赖InfluxDB时序数据库,在部署主服务前,请先部署完InfluxDB服务,并进入InfluxDB管理后台页面生成密钥并更新docker-compose中的配置项INFLUXDB_TOKEN。
后台管理地址是:http://IP地址:8086
用户名/密码:admin/12345678

yaml
# 这是ruoyi-admin服务中的代码片段:
# 配置influxdb token得在部署好influxdb后进入后台页面进行配置 然后把生成的token更新到这里
INFLUXDB_ENABLED: true
INFLUXDB_URL: http://ruoyi-influxdb:8086
INFLUXDB_TOKEN: a5hPe5yLh7tFatz3YK2ARx0NjKPZb-WPHAnfmDwRqStcnXA047CyoQx5pf2hnHOa4YFwiMFM6b-zSpSJBNmuzA==
INFLUXDB_ORG: ruoyi
INFLUXDB_BUCKET: ruoyi-radius
  • 登录InfluxDB后台管理
  • 开始创建密钥
  • 添加描述说明
  • 复制密钥

4.6 Docker&DockerCompose常用命令

bash
# 删除所有镜像(docker-compose命令必须在对应的docker-compose.yml文件目录下执行)
docker images -q | xargs docker rmi

# 停止并删除工程中所有服务的容器、网络、镜像
docker-compose down --rmi all

# 停止工程中指定服务的容器
docker-compose stop nginx

# 重启工程中所有服务的容器
docker-compose restart

# 删除虚悬镜像
docker image prune

# 查看虚悬镜像
docker image ls -f dangling=true

# 关闭所有运行中的容器
docker stop $(docker ps -aq)

# 导入镜像文件
docker load -i "$image_file"

# 构建并启动所有服务
docker-compose up -d

# 2. 查看服务状态
docker-compose ps

# 3. 查看日志
docker-compose logs -f backend

# 4. 停止服务
docker-compose down

# 5. 停止并清理数据
docker-compose down -v

# 更多命令说明:
build               Build or rebuild services
bundle              Generate a Docker bundle from the Compose file
config              Validate and view the Compose file
create              Create services
down                Stop and remove containers, networks, images, and volumes
events              Receive real time events from containers
exec                Execute a command in a running container
help                Get help on a command
images              List images
kill                Kill containers
logs                View output from containers
pause               Pause services
port                Print the public port for a port binding
ps                  List containers
pull                Pull service images
push                Push service images
restart             Restart services
rm                  Remove stopped containers
run                 Run a one-off command
scale               Set number of containers for a service
start               Start services
stop                Stop services
top                 Display the running processes
unpause             Unpause services
up                  Create and start containers
version             Show the Docker-Compose version information

4.7 Docker Compose完整脚本

docker-compose.yml:

yml
#version: '3'
networks:
  ry_network:
    name: ry_network
    # 开启IPV6支持  external  需要结合自定义网络
    #    external: true
    driver: bridge

services:
  ruoyi-mysql:
    image: ruoyi/mysql:8.0
    container_name: ruoyi-mysql
    build:
      context: mysql
      dockerfile: mysql/Dockerfile
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # root 密码
      MYSQL_ROOT_PASSWORD: 123456
      # 初始化数据库
      MYSQL_DATABASE: ruoyi-radius
    ports:
      - "3306:3306"
    deploy:
      resources:
        limits:
          #cpus: "0.5"              # 限制 CPU 核心数
          memory: "512M"           # 限制内存大小
    volumes:
      # 数据挂载
      - ../mysql/data/:/var/lib/mysql/
      # 配置挂载
      - ../mysql/conf/:/etc/mysql/conf.d/
    command:
      # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    privileged: true
    #    network_mode: "host"
    networks:
      - ry_network
    restart: always

  ruoyi-influxdb:
    image: influxdb:2.7.10
    container_name: ruoyi-influxdb
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # 支持IPV6
      INFLUXD_BIND_ADDRESS: ::1:8086
      DOCKER_INFLUXDB_INIT_MODE: setup
      # Influxdb后台管理:用户和密码
      DOCKER_INFLUXDB_INIT_USERNAME: admin
      DOCKER_INFLUXDB_INIT_PASSWORD: 12345678
      # Influxdb 默认组织及桶
      DOCKER_INFLUXDB_INIT_ORG: ruoyi
      DOCKER_INFLUXDB_INIT_BUCKET: ruoyi-radius
    ports:
      - "8086:8086"
    deploy:
      resources:
        limits:
          #cpus: "0.5"              # 限制 CPU 核心数
          memory: "512M"           # 限制内存大小
    volumes:
      #- ../influxdb/config/influxdb.conf:/etc/influxdb2/influxdb.conf
      - ../influxdb/data/:/var/lib/influxdb/
    networks:
      - ry_network
    #    network_mode: "host"
    restart: always

  ruoyi-redis:
    image: ruoyi/ruoyi-redis:6.2.12
    container_name: ruoyi-redis
    build:
      context: redis
      dockerfile: redis/Dockerfile
    ports:
      - "6379:6379"
    deploy:
      resources:
        limits:
          #cpus: "0.5"              # 限制 CPU 核心数
          memory: "512M"           # 限制内存大小
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    volumes:
      # 配置文件
      - ../redis/conf/redis.conf:/usr/local/etc/redis/redis.conf:ro
      # 数据文件
      - ./redis/data:/data
    command: "redis-server /usr/local/etc/redis/redis.conf"
    privileged: true
    networks:
      - ry_network
    #    network_mode: "host"
    restart: always

  ruoyi-minio:
    image: minio/minio:RELEASE.2023-03-24T21-41-23Z
    container_name: ruoyi-minio
    ports:
      # api 端口
      - "9000:9000"
      # 控制台端口
      - "9001:9001"
    deploy:
      resources:
        limits:
          #cpus: "0.5"              # 限制 CPU 核心数
          memory: "512M"           # 限制内存大小
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # 管理后台用户名
      MINIO_ROOT_USER: ruoyi
      # 管理后台密码,最小8个字符
      MINIO_ROOT_PASSWORD: ruoyi123
      # https需要指定域名
      #MINIO_SERVER_URL: "https://xxx.com:9000"
      #MINIO_BROWSER_REDIRECT_URL: "https://xxx.com:9001"
      # 开启压缩 on 开启 off 关闭
      MINIO_COMPRESS: "off"
      # 扩展名 .pdf,.doc 为空 所有类型均压缩
      MINIO_COMPRESS_EXTENSIONS: ""
      # mime 类型 application/pdf 为空 所有类型均压缩
      MINIO_COMPRESS_MIME_TYPES: ""
    volumes:
      # 映射当前目录下的data目录至容器内/data目录
      - ../minio/data:/data
      # 映射配置目录
      - ../minio/config:/root/.minio/
    # 添加[::]以支持IPV6
    command: server --address '[::]:9000' --console-address '[::]:9001' /data  # 指定容器中的目录 /data
    privileged: true
    networks:
      - ry_network
    #    network_mode: "host"
    restart: always

  ruoyi-nginx-web:
    image: ruoyi/ruoyi-nginx-web:2.2.1
    container_name: ruoyi-nginx-web
    build:
      context: nginx
      dockerfile: nginx/Dockerfile
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    ports:
      - "80:80"
      - "443:443"
    deploy:
      resources:
        limits:
          #cpus: "0.5"              # 限制 CPU 核心数
          memory: "512M"           # 限制内存大小
    volumes:
      # 证书映射
      - ../nginx/cert:/etc/nginx/cert
      # 配置文件映射
      - ../nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      # 页面目录
      - ../nginx/html:/usr/share/nginx/html
      # 日志目录
      - ../nginx/log:/var/log/nginx
    privileged: true
    #    network_mode: "host"
    networks:
      - ry_network
    restart: always

  ruoyi-monitor-admin:
    image: ruoyi/ruoyi-monitor-admin:1.0.0
    container_name: ruoyi-monitor-admin
    build:
      context: monitor
      dockerfile: monitor/Dockerfile
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      JAVA_OPTS: "-Xms512m -Xmx1024m"
    ports:
      - "9090:9090"
    volumes:
      # 配置文件
      - ../monitor/logs/:/ruoyi/monitor/logs
      # skywalking 探针
      - ../skywalking/agent/:/ruoyi/skywalking/agent
    privileged: true
    #    network_mode: "host"
    networks:
      - ry_network

  ruoyi-snailjob-server:
    image: ruoyi/ruoyi-snailjob-server:1.0.0
    container_name: ruoyi-snailjob-server
    build:
      context: snailjob
      dockerfile: snailjob/Dockerfile
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      JAVA_OPTS: "-Xms512m -Xmx512m"
      # 配置mysql数据库连接
      DATABASE_URL: localhost:3306
      DATABASE_USER: root
      DATABASE_PASSWORD: 123456
    ports:
      - "8800:8800"
      - "17888:17888"
    volumes:
      - ../snailjob/logs/:/ruoyi/snailjob/logs
    privileged: true
    #    network_mode: "host"
    networks:
      - ry_network
    depends_on:
      - ruoyi-mysql
    #restart: always

  ruoyi-admin:
    image: ruoyi/ruoyi-admin:1.0.0
    container_name: ruoyi-admin
    build:
      context: server
      dockerfile: server/Dockerfile
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      JAVA_OPTS: "-Xms512m -Xmx1024m"
      # 配置mysql数据库连接
      DATABASE_HOST: ruoyi-mysql
      DATABASE_PORT: 3306
      DATABASE_USER: root
      DATABASE_PASSWORD: 123456
      HIKARI_MAXPOOLSIZE: 20
      HIKARI_MINIDLE: 10
      # 配置influxdb token得在部署好influxdb后进入后台页面进行配置 然后把生成的token更新到这里
      INFLUXDB_ENABLED: true
      INFLUXDB_URL: http://ruoyi-influxdb:8086
      INFLUXDB_TOKEN: a5hPe5yLh7tFatz3YK2ARx0NjKPZb-WPHAnfmDwRqStcnXA047CyoQx5pf2hnHOa4YFwiMFM6b-zSpSJBNmuzA==
      INFLUXDB_ORG: ruoyi
      INFLUXDB_BUCKET: ruoyi-radius
      # 配置portal认证
      PORTAL_ENABLED: false
      PORTAL_THREAD_POOL: 8
      PORTAL_SOCKET_PORT: 50100
      PORTAL_SOCKET_TIMEOUT: 60000
      # 配置radius认证
      RADIUS_AUTH_ENABLED: false
      RADIUS_ACCT_ENABLED: false
      RADIUS_AUTH_POOL: 8
      RADIUS_ACCT_POOL: 8
      RADIUS_AUTH_PORT: 1812
      RADIUS_ACCT_PORT: 1813
      # Redis连接
      REDIS_HOST: ruoyi-redis
      REDIS_PORT: 6379
      REDIS_PASSWORD: ruoyi123
      REDIS_SSL_ENABLED: false
      REDISSON_THREADS: 16
      REDISSON_NETTYTHREADS: 32
      REDISSON_SINGLE_CLIENTNAME: RuoYi-Radius
      REDISSON_SINGLE_CONMINIDLESIZE: 32
      REDISSON_SINGLE_CONPOOLSIZE: 64
      REDISSON_SINGLE_SUBCONPOOLSIZE: 50
      # undertow配置
      UNDERTOW_MAX_HTTP_POST_SIZE: -1
      UNDERTOW_BUFFER_SIZE: 512
      UNDERTOW_DIRECT_BUFFERS: false
      UNDERTOW_THREADS_IO: 4
      UNDERTOW_THREADS_WORKER: 128
      # websocket配置
      WEBSOCKET_ENABLED: false
      # 监控中心配置
      MONITOR_ENABLED: false
      MONITOR_USERNAME: ruoyi
      MONITOR_PASSWORD: 123456
      # snail-job 配置
      SNAIL_JOB_ENABLED: false
      SNAIL_JOB_SERVER_HOST: 127.0.0.1
      SNAIL_JOB_SERVER_PORT: 17888
      # 日志级别配置
      LOGGING_LEVEL_APP: info

    ports:
      - "8080:8080"
      - "1812:1812/udp"
      - "1813:1813/udp"
      - "50100:50100/udp"
    volumes:
      # 配置文件
      - ../ruoyi-admin/logs/:/ruoyi/server/logs
      # skywalking 探针
      - ../skywalking/agent/:/ruoyi/skywalking/agent
    privileged: true
    #    network_mode: "host"
    networks:
      - ry_network
    depends_on:
      - ruoyi-mysql
      - ruoyi-redis
      #      - ruoyi-minio
      - ruoyi-influxdb
    restart: always

五、部署方式对比

部署方式优点缺点适用场景
JAR包部署简单,独立运行依赖JDK环境云服务器、虚拟机
WAR包兼容传统Web服务器需要安装Tomcat企业已有Tomcat环境
Docker环境隔离,易于扩展学习成本较高容器化、微服务架构

六、常见问题解决

6.1 数据库连接失败

bash
# 检查MySQL服务
systemctl status mysql

# 检查端口
netstat -tlnp | grep 3306

# 检查用户权限
mysql -u root -p -e "SHOW GRANTS FOR 'ruoyi'@'%';"

6.2 端口冲突

bash
# 查看端口占用
netstat -tlnp | grep 8080

# 停止占用进程
kill -9 <PID>

# 或修改应用端口
# 在application.yml中修改 server.port

6.3 内存不足

bash
# 调整JVM参数
JAVA_OPTS="-Xms1g -Xmx2g -XX:+UseG1GC"

# 查看内存使用
top -p $(pgrep -f ruoyi-admin)

七、最佳实践建议

7.1 安全建议

  1. 修改默认密码:生产环境务必修改数据库和Redis默认密码
  2. 配置防火墙:只开放必要的端口(80, 443, 8080)
  3. 启用HTTPS:使用Nginx反向代理并配置SSL证书

7.2 监控建议

  1. 启用Actuator端点:监控应用健康状态
  2. 配置日志轮转:避免日志文件过大
  3. 设置告警:监控关键指标(CPU、内存、响应时间)

7.3 备份策略

  1. 数据库备份:每日自动备份MySQL数据
  2. 配置文件备份:版本化管理所有配置文件
  3. 部署脚本备份:保存所有部署和运维脚本

总结

本指南提供了三种主流的RuoYi-Radius后端部署方式:

  1. JAR包部署:适合大多数云服务器场景,简单直接
  2. WAR包部署:适合已有Tomcat环境的传统部署
  3. Docker部署:适合现代化容器化部署,易于扩展和维护

建议根据实际环境和团队技术栈选择合适的部署方式。对于新项目,推荐使用Docker部署,便于环境统一和持续集成。

前端部署

一、前端打包

  • 当项目开发完毕,只需要运行一行命令就可以打包你的应用
bash
# 进入前端根目录
cd ruoyi-ui

# 打包正式环境
npm run build:prod

# 打包预发布环境
npm run build:stage
  • 构建打包成功之后,会在根目录生成 dist 文件夹,里面就是构建打包好的文件,通常是 .js 、.css、index.html 等静态文件。
  • 通常情况下 dist 文件夹的静态文件发布到你的 nginx 或者静态服务器即可,其中的 index.html 是后台服务的入口页面。
  • 如果需要自定义构建,比如指定 dist 目录等,则需要通过 config (opens new window)的 outputDir 进行配置。
  • 部署时改变页面js 和 css 静态引入路径 ,只需修改 vue.config.js 文件资源路径即可。
js

publicPath: './' //请根据自己路径来配置更改

export default new Router({
  mode: 'hash', // hash模式
})

二、Tomcat配置

  • 修改server.xml,Host节点下添加
xml
<Context docBase="" path="/" reloadable="true" source=""/>
  • dist目录的文件夹下新建WEB-INF文件夹,并在里面添加web.xml文件
xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1" metadata-complete="true">
    <display-name>Router for Tomcat</display-name>
    <error-page>
        <error-code>404</error-code>
        <location>/index.html</location>
    </error-page>
</web-app>

三、Nginx配置

  • 修改Nginx配置文件(Nginx安装目录/conf/nginx.conf)
config
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 限制body大小
    client_max_body_size 100m;

    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;

    upstream server {
        ip_hash;
        # 后端 ruoyi-admin 请求地址
        server localhost:8080;
        # Docker方式部署 通过服务名调用
        #server ruoyi-admin:8080;
        # server 127.0.0.1:8081;
    }

    server {
        listen 80;
        listen [::]:80;
        server_name localhost;

        # https配置参考 start
#         listen       443 ssl;

        # 证书直接存放 /docker/nginx/cert/ 目录下即可 更改证书名称即可 无需更改证书路径
#         ssl on;
#         ssl_certificate      /etc/nginx/cert/你的SSL证书.com.pem; # /etc/nginx/cert/ 为docker映射路径 不允许更改
#         ssl_certificate_key  /etc/nginx/cert/你的SSL证书.com.key; # /etc/nginx/cert/ 为docker映射路径 不允许更改
#         ssl_session_timeout 5m;
#         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#         ssl_prefer_server_ciphers on;

        # 限制外网访问内网 actuator 相关路径
        location ~ ^(/[^/]*)?/actuator.*(/.*)?$ {
            return 403;
        }

        location / {
            root   /usr/share/nginx/html/demo; # docker映射路径 不允许更改
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }

        location /prod-api/ {
                    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;
                    proxy_read_timeout 86400s;
                    # sse 与 websocket参数
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
                    proxy_buffering off;
                    proxy_cache off;
                    proxy_pass http://server/;
                }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

总结

  • 前端部署相对简单,只需要把打包好的静态文件(dist目录下所有文件)放到Tomcat或者Nginx对应位置即可。
  • 可以通过(http://localhost:80)访问验证系统是否部署成功,注意部署时配置的端口号,能正常访问则说明部署成功。
  • 如遇到无法解决的问题请到Issues反馈,或者加入技术交流群,会不定时进行解答。

Released under the MIT License.