官网:https://www.ruoyi.vip/

        可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。

一、若依 RuoYi 单体服务项目

架构

根据实际情况做修改

(一)下载项目

两台机器都把项目克隆下来10.0.0.10主要是需要其中的sql目录

git clone https://gitee.com/heyibushuoh/RuoYi.git

(二)准备数据库并配置DNS

1.数据库

在10.0.0.10 主机安装和配置MySQL

apt update && apt install -y mysql-server

MySQL默认是只允许自己的

root@ubuntu10:~  vim /etc/mysql/mysql.conf.d/mysqld.cnf
……
#bind-address           = 127.0.0.1
#mysqlx-bind-address    = 127.0.0.1
把这两个注释掉为了远程连接

root@ubuntu10:~  systemctl restart mysql.service 

可以安装一个三方工具进行命令补全

sudo apt update
sudo apt install -y pipx
pipx install mycli --pip-args "--index-url https://pypi.tuna.tsinghua.edu.cn/simple"

改一下配置文件
nano ~/.bashrc
在文件末尾添加一行
export PATH="$PATH:/root/.local/bin"
立即生效
source ~/.bashrc

配置完成后可以用mycli -u root -p 进入

准备数据库表和数据及用户

mycli -u root -p
#创建表
MySQL root@localhost:(none)> create database ry;
Query OK, 1 row affected
Time: 0.003s
#创建用户密码
MySQL root@localhost:(none)> create user ry@'%' identified by '123456';
Query OK, 0 rows affected
Time: 0.005s
#为名为 ry 的用户授予 ry 数据库所有的权限
MySQL root@localhost:(none)> grant all on ry.* to 'ry'@'%';
Query OK, 0 rows affected
Time: 0.002s

MySQL root@localhost:(none)> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| ry                 |
| sys                |
+--------------------+

5 rows in set
Time: 0.004s

MySQL root@localhost:ry> use ry;
You are already connected to database "ry" as user "root"
Time: 0.000s

MySQL root@localhost:ry> \. RuoYi/sql/quartz.sql
MySQL root@localhost:ry> \. RuoYi/sql/ry_20240112.sql
MySQL root@localhost:ry> show tables ;
+--------------------------+
| Tables_in_ry             |
+--------------------------+
| QRTZ_BLOB_TRIGGERS       |
| QRTZ_CALENDARS           |
| QRTZ_CRON_TRIGGERS       |
| QRTZ_FIRED_TRIGGERS      |
| QRTZ_JOB_DETAILS         |
| QRTZ_LOCKS               |
| QRTZ_PAUSED_TRIGGER_GRPS |
| QRTZ_SCHEDULER_STATE     |
| QRTZ_SIMPLE_TRIGGERS     |
| QRTZ_SIMPROP_TRIGGERS    |
| QRTZ_TRIGGERS            |
| gen_table                |
| gen_table_column         |
| sys_config               |
| sys_dept                 |
| sys_dict_data            |
| sys_dict_type            |
| sys_job                  |
| sys_job_log              |
| sys_logininfor           |
| sys_menu                 |
| sys_notice               |
| sys_oper_log             |
| sys_post                 |
| sys_role                 |
| sys_role_dept            |
| sys_role_menu            |
| sys_user                 |
| sys_user_online          |
| sys_user_post            |
| sys_user_role            |
+--------------------------+
31 rows in set (0.00 sec)

上面创建的库名要和下方yml文件中的一致

2.配置DNS

在10.0.0.11 和 10.0.0.10主机上配一下DNS 

apt update && apt -y install bind9 bind9-utils
root@ubuntu11:~  vim /etc/netplan/90-NM-3634ee72-95e3-3f00-91a0-598bb8a863d4.yaml 
network:
……
        addresses:
          - 10.0.0.10
          #- 10.0.0.2
          #- 8.8.8.8
……

重启
root@ubuntu11:~# netplan apply

测试
root@ubuntu11:~# host mysql.lty.org
mysql.lty.org has address 10.0.0.10

root@ubuntu10:~  root@ubuntu10:~  mysql -ury -p123456 -hmysql.lty.org
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.44-0ubuntu0.24.04.2 (Ubuntu)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

(三)构建 jAVA 项目

apt update && apt -y install maven

maven加速配置(因为RuoYi本身项目已有配置加速,看自己情况配置)

root@ubuntu11:~/RuoYi  vim /etc/maven/settings.xml
……
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
……

编译

cd /RuoYi
mvn clean package -Dmaven.test.skip=true

root@ubuntu11:~/RuoYi  find -name "*.jar"
./ruoyi-generator/target/ruoyi-generator-4.7.8.jar
./ruoyi-admin/target/ruoyi-admin.jar        #主要就是这个文件
./ruoyi-system/target/ruoyi-system-4.7.8.jar
./ruoyi-framework/target/ruoyi-framework-4.7.8.jar
./ruoyi-common/target/ruoyi-common-4.7.8.jar
./ruoyi-quartz/target/ruoyi-quartz-4.7.8.jar

可以拿到其他一个目录
root@ubuntu11:~/RuoYi  cp ./ruoyi-admin/target/ruoyi-admin.jar /srv/

把官方的脚本也拿过来
root@ubuntu11:~/RuoYi  cp ry.sh /srv/

root@ubuntu11:/srv# cat ry.sh 
#!/bin/bash            #官方是!/bin/sh , ubuntu系统会报错
# ./ry.sh start 启动 stop 停止 restart 重启 status 状态
AppName=/srv/ruoyi-admin.jar        #根据你的路径做修改

# 官方JVM参数
#JVM_OPTS="-Dname=$AppName  -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
# JAVA-21 不再支持 -XX:+UseParallelOldGC

JVM_OPTS="-Dname=$AppName  -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC"
APP_HOME=`pwd`
LOG_PATH=$APP_HOME/logs/$AppName.log
给执行权限
root@ubuntu11:/srv  chmod +x ry.sh

运行
root@ubuntu11:/srv  ./ry.sh start

可以写一个service文件方便管理

root@ubuntu11:/srv  vim /lib/systemd/system/ruoyi.service
[Unit]
Description=Ruoyi
After=network.target

[Service]
Type=forking
#Type=notify
#User=ruoyi
#Group=ruoyi
ExecStart=/srv/ry.sh start
ExecStop=/srv/ry.sh stop
LimitNOFILE=10000

[Install]
WantedBy=multi-user.target

思路总结: 

       本次若依部署实验为双机分工架构(10.0.0.10 = 数据库机、10.0.0.11 = 应用机),核心思路围绕双机协同、分端部署、网络互通、应用服务化展开,整体分三大核心环节:

  1. 双机同步若依源码,数据库机单独完成 MySQL 安装、远程开放、库 / 用户创建及若依 SQL 脚本导入;
  2. 双机统一配置 DNS 服务,实现mysql.lty.org域名(实际生产的域名)映射数据库机,验证网络解析和远程连库,打通双机通信;
  3. 应用机通过 Maven 编译打包若依项目,迁移核心 JAR 包并适配 Ubuntu/Java21 修改运行脚本,完成应用部署,最终配置 systemd 实现应用的便捷服务化管理。

二、若依RuoYi 单体服务项目基于容器化构建

思路:

1.镜像

2.Dockerfile

FROM JRE-1.8 openJDK

COPY app.jar /srv/app.jar

EXPOSE 80

WORKDIR /srv/

CMD ["java","-jar","app,jar"]

3.docker build -t

4.docker run --name rouyi -p 80:80 rouyi:v1.0 

架构

(一)单次构建

安装docker

root@ubuntu10:~  apt update && apt install docker.io -y
直接用内置仓库的docker,有需要可以自己安装其他版本

下载源码

git clone https://gitee.com/heyibushuoh/RuoYi.git

注意事项是一样的数据库名称、域名和密码要和源码中的一样,可以自定义更改

1.hosts文件

在10.0.0.10主机上配置数据库,10.0.0.11 主机需要连接数据库通信,配一下 hosts 文件

root@ubuntu11:~  vim /etc/hosts
10.0.0.10 mysql.lty.org            #加到最后

root@ubuntu11:~# ping mysql.lty.org
PING mysql.lty.org (10.0.0.10) 56(84) bytes of data.

配置docker的国内加速

root@ubuntu10:/etc/docker  vim daemon.json 
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://reg-mirror.qiniu.com",
    "https://cr.console.aliyun.com"
  ],
  "insecure-registries": ["harbor.lty.org"]

2.部署mysql

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ry -e MYSQL_USER=ry -e MYSQL_PASSWORD=123456 --name mysql -d -v /data/mysql:/var/lib/mysql --restart=always registry.cn-beijing.aliyuncs.com/wangxiaochun/mysql:8.0.29-oracle

在10.0.0.11主机安装一个客户端测试

root@ubuntu11:~  apt install mysql-client -y
root@ubuntu11:~  mysql -ury -p123456 -hmysql.lty.org
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.29 MySQL Community Server - GPL

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ry                 |
+--------------------+
2 rows in set (0.01 sec)
#导入表结构
mysql> use ry
Database changed
mysql> source RuoYi/sql/ry_20240112.sql
mysql> source RuoYi/sql/quartz.sql
mysql> show tables;
+--------------------------+
| Tables_in_ry             |
+--------------------------+
| QRTZ_BLOB_TRIGGERS       |
| QRTZ_CALENDARS           |
| QRTZ_CRON_TRIGGERS       |
| QRTZ_FIRED_TRIGGERS      |
| QRTZ_JOB_DETAILS         |
| QRTZ_LOCKS               |
| QRTZ_PAUSED_TRIGGER_GRPS |
| QRTZ_SCHEDULER_STATE     |
| QRTZ_SIMPLE_TRIGGERS     |
| QRTZ_SIMPROP_TRIGGERS    |
| QRTZ_TRIGGERS            |
| gen_table                |
| gen_table_column         |
| sys_config               |
| sys_dept                 |
| sys_dict_data            |
| sys_dict_type            |
| sys_job                  |
| sys_job_log              |
| sys_logininfor           |
| sys_menu                 |
| sys_notice               |
| sys_oper_log             |
| sys_post                 |
| sys_role                 |
| sys_role_dept            |
| sys_role_menu            |
| sys_user                 |
| sys_user_online          |
| sys_user_post            |
| sys_user_role            |
+--------------------------+
31 rows in set (0.01 sec)

3.宿主机编译构建JAVA应用

安装相关软件

apt update && apt -y install maven

maven加速配置(因为RuoYi本身项目已有配置加速,看自己情况配置)

root@ubuntu11:~/RuoYi  vim /etc/maven/settings.xml
……
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
……
cd RuoYi/
mvn clean package -Dmaven.test.skip=true

编写一个dockerfile文件

# 基础镜像
#FROM adoptopenjdk/openjdk11:alpine-jre
#FROM openjdk:11.0.16
#FROM openjdk:11.0.16-jre-slim
FROM openjdk:8u212-jre-alpine3.9

# 作者
LABEL MAINTAINER="lty<root@lty.com>"

ENV APP_NAME=ruoyi APP_PATH=/data/ruoyi APP_PORT=80

# 挂载目录
VOLUME ${APP_PATH}

# 创建目录
RUN mkdir -p ${APP_PATH}

# 指定路径
WORKDIR ${APP_PATH}

# 复制jar文件到路径
COPY ./ruoyi-admin/target/*.jar ${APP_PATH}/${APP_NAME}.jar
#COPY ./target/*.jar ${APP_PATH}/${APP_NAME}.jar

#安装依赖的字体,否则无法显示验证码
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories \
&& apk update && apk --no-cache add ttf-dejavu fontconfig

#暴露端口
EXPOSE ${APP_PORT}

# 启动服务
CMD java -jar ${APP_PATH}/${APP_NAME}.jar --server.port=${APP_PORT}

#参考ry.sh
#CMD java -jar  ${APP_PATH}/${APP_NAME}.jar --server.port=${APP_PORT} -
#Dname=${APP_NAME} -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -
#XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError
#-XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30

构建镜像

docker build -t ruoyi:v1.0

root@ubuntu11:~/RuoYi  docker images
REPOSITORY                                              TAG                   IMAGE ID       CREATED          SIZE
ruoyi                                                   v1.0                  984105f59312   16 seconds ago   187MB

启动镜像

docker  run -d  --restart always --name ruoyi -p 80:80 --add-host mysql.lty.org:10.0.0.10 ruoyi:v1.0
注意:容器和宿主机的名称空间是隔离开的所以容器也要配一个域名解析

(二)多阶段构建

一个机器上面的java不一定都是一个版本的对应的maven版本可能不一样,为解决此问题

#多阶段构建(想用什么版本可以直接更改)
#FROM maven:3.9.9-eclipse-temurin-8-alpine as build
FROM registry.cn-beijing.aliyuncs.com/wangxiaochun/maven:3.9.9-eclipse-temurin-8-alpine as build
COPY . /RuoYi
WORKDIR /RuoYi
RUN mvn clean package -Dmaven.test.skip=true

# 基础镜像
#FROM adoptopenjdk/openjdk11:alpine-jre
#FROM openjdk:11.0.16
#FROM openjdk:11.0.16-jre-slim
#FROM openjdk:8u212-jre-alpine3.9
FROM registry.cn-beijing.aliyuncs.com/wangxiaochun/openjdk:8u212-jre-alpine3.9

# 作者
LABEL MAINTAINER="lty<root@lty.com>"

ENV APP_NAME=ruoyi APP_PATH=/data/ruoyi APP_PORT=80

# 挂载目录
VOLUME ${APP_PATH}

# 创建目录
RUN mkdir -p ${APP_PATH}

# 指定路径
WORKDIR ${APP_PATH}

# 复制jar文件到路径
COPY --from=build /RuoYi/ruoyi-admin/target/*.jar ${APP_PATH}/${APP_NAME}.jar

#安装依赖的字体,否则无法显示验证码
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories \
&& apk update && apk --no-cache add ttf-dejavu fontconfig

#暴露端口
EXPOSE ${APP_PORT}

# 启动服务
CMD java -jar ${APP_PATH}/${APP_NAME}.jar --server.port=${APP_PORT}

#参考ry.sh
#CMD java -jar  ${APP_PATH}/${APP_NAME}.jar --server.port=${APP_PORT} -
#Dname=${APP_NAME} -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -
#XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError
#-XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30
root@ubuntu11:~/RuoYi  docker images
REPOSITORY                                              TAG                              IMAGE ID       CREATED          SIZE
ruoyi                                                   v2.0                             33983e02c59e   9 seconds ago    187MB

root@ubuntu11:~/RuoYi  docker  run -d  --restart always --name ruoyi -p 80:80 --add-host mysql.lty.org:10.0.0.10 ruoyi:v2.0

        双机分工(10.0.0.10=MySQL 容器机、10.0.0.11 = 若依应用构建 / 容器运行机),围绕若依单体服务容器化落地设计单次构建多阶段构建两种方案,整体核心思路如下:

  1. 前置基础准备:双机做基础配置,10.0.0.11 配置 hosts 解析 MySQL 域名,10.0.0.10 配置 Docker 国内加速;10.0.0.10 通过 Docker 快速部署 MySQL 容器,初始化若依 ry 库和专用用户,10.0.0.11 测试远程连库,打通双机数据库通信,为应用运行铺垫基础。
  2. 单次构建方案:基于宿主机具备构建环境实现容器化,10.0.0.11 先安装 Maven 并配置加速,在宿主机编译若依源码生成 Jar 包;编写单阶段 Dockerfile,基于 JRE8 轻量镜像,配置应用环境、复制宿主机 Jar 包、解决若依验证码字体依赖;构建应用镜像后,启动容器时通过--add-host配置容器内 MySQL 域名解析,保证容器访问外部数据库,同时配置容器开机自启。
  3. 多阶段构建方案:针对单次构建「宿主机需匹配 JDK/Maven 版本」,采用 Docker 多阶段构建实现构建环境与宿主机解耦;第一阶段基于指定版本的 Maven+JDK8 镜像做构建阶段,在容器内完成若依源码复制、编译打包,无需宿主机有匹配的构建环境;第二阶段复用单阶段的运行镜像配置,通过--from=build从构建阶段复制 Jar 包;最终以和单次构建相同的容器启动方式运行,实现若依容器化构建的环境无关性。
  4. 核心统一要求:两种构建方案均围绕若依应用容器化运行展开,均解决了若依验证码字体依赖、容器访问外部 MySQL、容器开机自启三个核心问题,多阶段构建是对单次构建的优化,核心解决宿主机 JDK/Maven 版本兼容问题。

(三)上传harbor仓库

1.安装配置harbor仓库

root@ubuntu17:~  apt update && apt install docker.io docker-compose python3-pip
root@ubuntu17:~  tar xvf harbor-offline-installer-v2.14.2.tgz -C /usr/local/
 
root@ubuntu17:/usr/local/harbor  ls
common.sh  harbor.v2.14.2.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare
 
官方要求是一个yml文件,把官方案例改名
root@ubuntu17:/usr/local/harbor  cp harbor.yml.tmpl harbor.yml
root@ubuntu17:/usr/local  grep -vnE '#|^$'  harbor/harbor.yml
5:hostname: harbor.lty.org        

47:harbor_admin_password: 123456

66:data_volume: /data/harbor

运行脚本安装

root@ubuntu17:/usr/local/harbor  ./install.sh 

创建 lty 用户并且创建 example 项目,把用户拉入项目中

2.配置10.0.0.11 的 docker

10.0.0.11 主机配置域名信任走http协议

root@ubuntu11:~/RuoYi  vim /etc/docker/daemon.json 
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://reg-mirror.qiniu.com",
    "https://cr.console.aliyun.com"
  ],
  "insecure-registries": ["harbor.lty.org"]
}
root@ubuntu11:~/RuoYi  docker push harbor.lty.org/example/ruoyi:v2.0 

三、若依 RuoYi 前后端分离项目

架构

(一)RuoYi 系统前后端分离项目构建案例(传统方式)

1.部署DNS

根据架构改一下脚本里对应的域名和IP
root@ubuntu10:~  cat install_dns.sh 
#!/bin/bash

#在HOST_LIST输入FQDN和IP的对应关系
HOST_LIST="
mysql 10.0.0.13
redis 10.0.0.13
ryvue 10.0.0.11
ruoyi 10.0.0.12"

root@ubuntu10:~  bash install_dns.sh 

前后端对应的域名地址

root@ubuntu10:~  cat /etc/bind/lty.org.zone 
$TTL 1D
@       IN SOA  master admin (
                                        1       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS       master
master  A        10.0.0.10
mysql   A        10.0.0.13
redis   A        10.0.0.13
ryvue   A        10.0.0.11
ruoyi   A        10.0.0.12

root@ubuntu10:~  vim /etc/bind/named.conf.options         
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

         forwarders {                    #开启转发
                8.8.8.8;
         };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation no;

        listen-on-v6 { any; };
};
~                       

配置网卡文件把剩下的主机都指向 DNS 服务器

所有主机都这样配置
cat /etc/netplan/90-NM-3634ee72-95e3-3f00-91a0-598bb8a863d4.yaml 
network:
  version: 2
  ethernets:
    NM-3634ee72-95e3-3f00-91a0-598bb8a863d4:
      renderer: NetworkManager
      match:
        name: "ens33"
      addresses:
      - "10.0.0.11/24"
      nameservers:
        addresses:
          - 10.0.0.10
          #- 10.0.0.2
          #- 8.8.8.8

重启网络
netplan apply

前端和后端主机把项目下载下来(10.0.0.11/10.0.0.12)

apt update && apt install -y git

git clone https://gitee.com/heyibushuoh/RuoYi-Vue.git

2.准备数据库主机(10.0.0.13)

修改MySQL配置

root@ubuntu13:~  vim /etc/mysql/mysql.conf.d/mysqld.cnf     #支持远程
……
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
#mysqlx-bind-address    = 127.0.0.1
#
……

修改redis配置

sed -i.bak -e 's/^bind .*/bind 0.0.0.0/' -e '$a requirepass 123456' /etc/redis/redis.conf
root@ubuntu13:~  ss -tnulp | grep -E ':(3306|6379)'
tcp   LISTEN 0      511          0.0.0.0:6379       0.0.0.0:*    users:(("redis-server",pid=23150,fd=6))                
tcp   LISTEN 0      70                 *:33060            *:*    users:(("mysqld",pid=23166,fd=21))                     
tcp   LISTEN 0      511             [::]:6379          [::]:*    users:(("redis-server",pid=23150,fd=7))                
tcp   LISTEN 0      151                *:3306             *:*    users:(("mysqld",pid=23166,fd=23)) 

记得改MySQL若依源代码文件中的这三个地方为实际生产名称

redis也需要根据实际情况改

root@ubuntu11:~/RuoYi-Vue  vim ruoyi-admin/src/main/resources/application.yml

注意:前后端主机都要记得改

准备数据库表和数据及用户

root@ubuntu13:~# mysql

mysql> create database ryvue;
Query OK, 1 row affected (0.00 sec)

mysql> create user ryvue@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all on ryvue.* to ryvue@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> use ryvue

13上没有表文件,到12上安装一个MySQL客户端直接传,顺便可以验证配置生效
root@ubuntu12:~/RuoYi-Vue   apt install mysql-client -y

root@ubuntu12:~/RuoYi-Vue   mysql -uryvue -p123456 -h mysql.lty.org
mysql> use ryvue
mysql> source /root/RuoYi-Vue/sql/quartz.sql
mysql> source /root/RuoYi-Vue/sql/ry_20231130.sql

测试redis

root@ubuntu11:~/RuoYi-Vue  telnet redis.lty.org 6379
Trying 10.0.0.13...
Connected to redis.lty.org.
Escape character is '^]'.
auth 123456
+OK
info
$4915
# Server
redis_version:7.0.15
redis_git_sha1:00000000
……

3.后端项目构建

10.0.012主机

root@ubuntu12:~/RuoYi-Vue  apt update && apt install maven -y

编译打包

mvn clean package -Dmaven.test.skip=true

root@ubuntu12:~/RuoYi-Vue  cp ./ruoyi-admin/target/ruoyi-admin.jar /srv/
root@ubuntu12:~/RuoYi-Vue  cd /srv/
root@ubuntu12:/srv  ls
ruoyi-admin.jar

nohup java -jar ruoyi-admin.jar &> /dev/null &

4.前端项目构建

10.0.0.11主机

root@ubuntu11:~/RuoYi-Vue/ruoyi-ui# cat README.md         #说明文件
## 开发

```bash
# 克隆项目
git clone https://gitee.com/y_project/RuoYi-Vue

# 进入项目目录
cd ruoyi-ui

# 安装依赖
npm install

# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npmmirror.com

# 启动服务
npm run dev
```

浏览器访问 http://localhost:80

## 发布

```bash
# 构建测试环境
npm run build:stage

# 构建生产环境
npm run build:prod

安装工具

apt update && apt -y install npm

安装依赖包

npm install --registry=https://registry.npmmirror.com
……
npm WARN EBADENGINE   required: { node: '8 || 10 || 12 || 14 || 16 || 17' },
npm WARN EBADENGINE   current: { node: 'v18.19.1', npm: '9.2.0' }
……
ubuntu24.04会出现兼容性问题

解决Ubuntu24.04不支持的方法

root@ubuntu11:~/RuoYi-Vue/ruoyi-ui  export NODE_OPTIONS=--openssl-legacy-provider
root@ubuntu11:~/RuoYi-Vue/ruoyi-ui  npm run build:prod

5.反向代理配置

10.0.0.10主机

在前端服务主机10.0.0.11上安装nginx

apt update && apt install nginx -y

将前端文件复制到Web服务器,准备静态页面文件

root@ubuntu11:~/RuoYi-Vue/ruoyi-ui  cp -r dist/* /var/www/html

页面有了但是前后端项目还没有完全打通,需要配置代理

在负载均衡器主机10.0.0.10上安装Nginx

apt update && apt install nginx -y

配置代理

root@ubuntu10:~  vim /etc/nginx/conf.d/www.lty.org.conf
server {
    listen 80;
    server_name ryvue.lty.org;

    location / {
        proxy_pass http://10.0.0.11;    #指向前端项目地址
    }

    location /prod-api/ {
        proxy_pass http://10.0.0.12:8080/;    #指向后端项目地址
        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;
    }
}

root@ubuntu10:~  nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

root@ubuntu10:~  nginx -s reload
2026/01/29 19:18:09 [notice] 7690#7690: signal process started

Windows上配置域名解析

四、RuoYi 系统前后端分离项目基于容器化构建案例

 1.部署DNS

根据架构改一下脚本里对应的域名和IP
root@ubuntu10:~  cat install_dns.sh 
#!/bin/bash

#在HOST_LIST输入FQDN和IP的对应关系
HOST_LIST="
mysql 10.0.0.13
redis 10.0.0.13
ryvue 10.0.0.11
ruoyi 10.0.0.12"

root@ubuntu10:~  bash install_dns.sh 

前后端对应的域名地址

root@ubuntu10:~  cat /etc/bind/lty.org.zone 
$TTL 1D
@       IN SOA  master admin (
                                        1       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS       master
master  A        10.0.0.10
mysql   A        10.0.0.13
redis   A        10.0.0.13
ryvue   A        10.0.0.11
ruoyi   A        10.0.0.12

root@ubuntu10:~  vim /etc/bind/named.conf.options         
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

         forwarders {                    #开启转发
                8.8.8.8;
         };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation no;

        listen-on-v6 { any; };
};
~                       

配置网卡文件把剩下的主机都指向 DNS 服务器

所有主机都这样配置
cat /etc/netplan/90-NM-3634ee72-95e3-3f00-91a0-598bb8a863d4.yaml 
network:
  version: 2
  ethernets:
    NM-3634ee72-95e3-3f00-91a0-598bb8a863d4:
      renderer: NetworkManager
      match:
        name: "ens33"
      addresses:
      - "10.0.0.11/24"
      nameservers:
        addresses:
          - 10.0.0.10
          #- 10.0.0.2
          #- 8.8.8.8

重启网络
netplan apply

前端和后端主机把项目下载下来(10.0.0.11/10.0.0.12)

apt update && apt install -y git

git clone https://gitee.com/heyibushuoh/RuoYi-Vue.git

2.安装工具和下载源码

所有主机都安装工具

apt update && apt -y install docker.io git

3.数据库

修改MySQL配置

root@ubuntu13:~  vim /etc/mysql/mysql.conf.d/mysqld.cnf     #支持远程
……
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
#mysqlx-bind-address    = 127.0.0.1
#
……

修改redis配置

sed -i.bak -e 's/^bind .*/bind 0.0.0.0/' -e '$a requirepass 123456' /etc/redis/redis.conf
root@ubuntu13:~  ss -tnulp | grep -E ':(3306|6379)'
tcp   LISTEN 0      511          0.0.0.0:6379       0.0.0.0:*    users:(("redis-server",pid=23150,fd=6))                
tcp   LISTEN 0      70                 *:33060            *:*    users:(("mysqld",pid=23166,fd=21))                     
tcp   LISTEN 0      511             [::]:6379          [::]:*    users:(("redis-server",pid=23150,fd=7))                
tcp   LISTEN 0      151                *:3306             *:*    users:(("mysqld",pid=23166,fd=23)) 

记得改MySQL若依源代码文件中的这三个地方为实际生产名称

redis也需要根据实际情况改

root@ubuntu11:~/RuoYi-Vue  vim ruoyi-admin/src/main/resources/application.yml

注意:前后端主机都要记得改

4.启动 MySQL 和 Redis 服务

在数据库服务器10.0.0.13上启动数据库容器

docker run --name ruoyi-mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ryvue -e MYSQL_USER=ryvue -e MYSQL_PASSWORD=123456 -v /data/mysql:/var/lib/mysql --restart=always registry.cn-beijing.aliyuncs.com/wangxiaochun/mysql:8.0.29-oracle

准备数据库表和数据及用户

root@ubuntu13:~# mysql

mysql> create database ryvue;
Query OK, 1 row affected (0.00 sec)

mysql> create user ryvue@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all on ryvue.* to ryvue@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> use ryvue

13上没有表文件,到12上安装一个MySQL客户端直接传,顺便可以验证配置生效
root@ubuntu12:~/RuoYi-Vue   apt install mysql-client -y

root@ubuntu12:~/RuoYi-Vue   mysql -uryvue -p123456 -h mysql.lty.org
mysql> use ryvue
mysql> source /root/RuoYi-Vue/sql/quartz.sql
mysql> source /root/RuoYi-Vue/sql/ry_20231130.sql

root@ubuntu13:~  ls /data/mysql/        #做了数据持久化
 auto.cnf        binlog.index   client-cert.pem     '#ib_16384_1.dblwr'   ib_logfile0  '#innodb_temp'   mysql.sock           public_key.pem    server-key.pem   undo_002
 binlog.000001   ca-key.pem     client-key.pem       ib_buffer_pool       ib_logfile1   mysql           performance_schema   ryvue             sys
 binlog.000002   ca.pem        '#ib_16384_0.dblwr'   ibdata1              ibtmp1        mysql.ibd       private_key.pem      server-cert.pem   undo_001

在数据库服务上启动Redis服务

docker run --name ruoyi-redis -d -p 6379:6379 --restart always registry.cn-beijing.aliyuncs.com/wangxiaochun/redis:7.2.5 redis-server --requirepass 123456

测试redis

root@ubuntu11:~/RuoYi-Vue  telnet redis.lty.org 6379
Trying 10.0.0.13...
Connected to redis.lty.org.
Escape character is '^]'.
auth 123456
+OK
info
$4915
# Server
redis_version:7.0.15
redis_git_sha1:00000000
……

5.后端项目构建

(1)单次构建

在后端JAVA服务器上执行

#在后端JAVA服务器上执行
apt update && apt -y install maven

#下载源码
git clone https://gitee.com/lbtooth/RuoYi-Vue.git
cd RuoYi-Vue
mvn clean package -Dmaven.test.skip=true

可以单独建立一个文件夹

root@ubuntu12:~/RuoYi-Vue  cp ./ruoyi-admin/target/ruoyi-admin.jar /srv/
root@ubuntu12:~/RuoYi-Vue  cd /srv/
root@ubuntu12:/srv  ls
ruoyi-admin.jar

准备Dockerfile

# 基础镜像
#FROM adoptopenjdk/openjdk11:alpine-jre
#FROM openjdk:11.0.16
#FROM openjdk:11.0.0.16-jre-slim
FROM openjdk:8u212-jre-alpine3.9
#FROM registry.cn-beijing.aliyuncs.com/wangxiaochun/openjdk:8u212-jre-alpine3.9

# 作者
LABEL MAINTAINER="lty<root@lty.com>"

ENV APP_NAME=ruoyi APP_PATH=/data/ruoyi APP_PORT=8080

# 挂载目录
VOLUME ${APP_PATH}

# 创建目录
RUN mkdir -p ${APP_PATH}

# 指定路径
WORKDIR ${APP_PATH}

# 复制jar文件到路径
COPY ./ruoyi-admin/target/*.jar ${APP_PATH}/${APP_NAME}.jar
#COPY ./target/*.jar ${APP_PATH}/${APP_NAME}.jar

#暴露端口
EXPOSE $APP_PORT

# 启动服务
CMD java -jar ${APP_PATH}/${APP_NAME}.jar --server.port=$APP_PORT

启动

root@ubuntu12:~/RuoYi-Vue  docker run -d --name ruoyi-vue -p 82:8080 ruoyi-vue:v1.0
f204589a535101328e1b99c5d7cd1ddc34c594e62681f08234ae6ac8f9136c13

root@ubuntu12:~/RuoYi-Vue  docker ps -a
CONTAINER ID   IMAGE                                                        COMMAND                   CREATED          STATUS                      PORTS                                                                              NAMES
f204589a5351   ruoyi-vue:v1.0                                               "/bin/sh -c 'java -j…"   7 seconds ago    Up 6 seconds                0.0.0.0:82->8080/tcp, [::]:82->8080/tcp  

后端就确定配置好了

(2)容器内编译打包JAVA应用通过多阶段制作镜像

准备Dockerfile文件,

root@ubuntu12:~/RuoYi-Vue  cat Dockerfile-multi-stage 
#多阶段构建
#FROM maven:3.9.9-eclipse-temurin-8-alpine as build
FROM registry.cn-beijing.aliyuncs.com/wangxiaochun/maven:3.9.9-eclipse-temurin-8-alpine as build
COPY . /RuoYi-Vue
WORKDIR /RuoYi-Vue
RUN mvn clean package -Dmaven.test.skip=true


# 基础镜像
#FROM adoptopenjdk/openjdk11:alpine-jre
#FROM openjdk:11.0.16
#FROM openjdk:11.0.16-jre-slim
FROM openjdk:8u212-jre-alpine3.9
#FROM registry.cn-beijing.aliyuncs.com/wangxiaochun/openjdk:8u212-jre-alpine3.9


# 作者
LABEL MAINTAINER="lty<root@lty.com>"

ENV APP_NAME=ruoyi APP_PATH=/data/ruoyi  APP_PORT=8080


# 挂载目录
VOLUME ${APP_PATH}

# 创建目录
RUN mkdir -p ${APP_PATH}

# 指定路径
WORKDIR  ${APP_PATH}

# 复制jar文件到路径
COPY --from=build /RuoYi-Vue/ruoyi-admin/target/*.jar ${APP_PATH}/${APP_NAME}.jar
#COPY ./target/*.jar ${APP_PATH}/${APP_NAME}.jar

#暴露端口
EXPOSE $APP_PORT

# 启动服务
CMD java -jar ${APP_PATH}/${APP_NAME}.jar --server.port=$APP_PORT

#安装字体相关包,否则无法显示验证码
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories && apk update && apk  --no-cache add ttf-dejavu fontconfig

构建镜像

root@ubuntu12:~/RuoYi-Vue  docker build -t ruoyi-vue:v2.0 -f Dockerfile-multi-stage .

6.前端项目构建

root@ubuntu11:~  cd /root/RuoYi-Vue/ruoyi-ui/

直接多阶段构建,创建dockerfile文件

root@ubuntu11:~/RuoYi-Vue/ruoyi-ui  vim Dockerfile 
#FROM registry.cn-beijing.aliyuncs.com/wangxiaochun/node:14.17.6 AS build
FROM registry.cn-beijing.aliyuncs.com/wangxiaochun/node:16.20-bullseye-slim AS build
COPY . /vue
WORKDIR /vue
RUN npm install  --registry=https://registry.npmmirror.com && npm run build:prod

FROM registry.cn-beijing.aliyuncs.com/wangxiaochun/nginx:1.20.0
LABEL maintainer="lty <root@lty.com>"
COPY --from=build /vue/dist /usr/share/nginx/html

构建镜像
root@ubuntu11:~/RuoYi-Vue/ruoyi-ui  docker build -t ruoyi-ui:v2.0 .

启动容器
root@ubuntu11:~/RuoYi-Vue/ruoyi-ui  docker run --name ruoyi-ui -d -p 81:80 ruoyi-ui:v2.0

前端就配完了

7.反向代理构建

10.0.0.10主机

root@ubuntu10:~  git clone https://gitee.com/lbtooth/RuoYi-Vue.git
root@ubuntu10:~  cd RuoYi-Vue/nginx-docker/
root@ubuntu10:~/RuoYi-Vue/nginx-docker  cat ryvue.wang.org.conf 
server {
    listen 80 ;
    server_name ryvue.lty.org;        #修改域名
    root /var/www/html;
    index index.html index.htm ;
    location / {
        proxy_pass http://10.0.0.11:81;        #前端IP:端口
    }
    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_pass http://10.0.0.12:82/;       #后端IP:端口
    }
}
root@ubuntu10:~/RuoYi-Vue/nginx-docker  mv www.wang.org.conf www.wang.org.conf.gz
root@ubuntu10:~/RuoYi-Vue/nginx-docker  ls
Dockerfile  ryvue.wang.org.conf  www.wang.org.conf.gz

建立镜像并启动容器

root@ubuntu10:~/RuoYi-Vue/nginx-docker  docker build -t ruoyi-proxy:v1.0 .

root@ubuntu10:~/RuoYi-Vue/nginx-docker  docker run -d --name proxy -p 80:80 ruoyi-proxy:v1.0

root@ubuntu10:~/RuoYi-Vue/nginx-docker  docker ps
CONTAINER ID   IMAGE              COMMAND                   CREATED         STATUS         PORTS                                 NAMES
ab16494b046c   ruoyi-proxy:v1.0   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp   proxy

做一个域名解析

总结:

在10.0.0.10主机上配置了 nginx 反向代理的容器

在10.0.0.11主机上配置了前端项目的容器

在10.0.0.12主机上配置了后端项目 JAVA 的容器

在10.0.0.13主机上配置了数据库 mysql 和 redis 的容器

五、RuoYi 微服务版项目构建案例

1.安装Maven和JAVA工具

apt update && apt -y install git maven npm docker-compose python3-pip

2.克隆项目代码

git clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.gitgit clone https://gitee.com/lbtooth/RuoYi-Cloud.git

3.构建后端JAVA微服务

root@ubuntu10:~/RuoYi-Cloud  ls
bin  docker  kubernetes  LICENSE  pom.xml  README.md  ruoyi-api  ruoyi-auth  ruoyi-common  ruoyi-gateway  ruoyi-modules  ruoyi-ui  ruoyi-visual  scripts  sql

root@ubuntu10:~/RuoYi-Cloud  mvn clean package -Dmaven.test.skip=true    #要在有pom.xml的目录下执行

4.构建前端应用

root@ubuntu10:~/RuoYi-Cloud  cd ruoyi-ui/
root@ubuntu10:~/RuoYi-Cloud/ruoyi-ui  apt update && apt -y install npm 
#建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npmmirror.com

#因为版本兼容性问题,ubuntu24.04默认是不支持的,解决Ubuntu24.04不支持的方法
export NODE_OPTIONS=--openssl-legacy-provider

#重新构建成功
npm run build:prod

前端构建的结果就是有一个dist目录,后端构建的结果就是有一些jar包

5.准备Docker-compose启动所需的文件和包

执行脚本

root@ubuntu10:~/RuoYi-Cloud/docker  sh move.sh 

tree
……
└── ruoyi
    ├── auth
    │   ├── dockerfile
    │   └── jar
    │       ├── readme.txt
    │       └── ruoyi-auth.jar
    ├── gateway
    │   ├── dockerfile
    │   └── jar
    │       ├── readme.txt
    │       └── ruoyi-gateway.jar
    ├── modules
    │   ├── file
    │   │   ├── dockerfile
    │   │   └── jar
    │   │       ├── readme.txt
    │   │       └── ruoyi-modules-file.jar
    │   ├── gen
    │   │   ├── dockerfile
    │   │   └── jar
    │   │       ├── readme.txt
    │   │       └── ruoyi-modules-gen.jar
    │   ├── job
    │   │   ├── dockerfile
    │   │   └── jar
    │   │       ├── readme.txt
    │   │       └── ruoyi-modules-job.jar
    │   └── system
    │       ├── dockerfile
    │       └── jar
    │           ├── readme.txt
    │           └── ruoyi-modules-system.jar
    └── visual
        └── monitor
            ├── dockerfile
            └── jar
                ├── readme.txt
                └── ruoyi-visual-monitor.jar

6.启动容器

root@ubuntu10:~/RuoYi-Cloud/docker  sh deploy.sh
Usage: sh 执行脚本.sh [port|base|modules|stop|rm]
root@ubuntu10:~/RuoYi-Cloud/docker  sh deploy.sh base

启动微服务
root@ubuntu10:~/RuoYi-Cloud/dockersh deploy.sh modules

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐