若依JAVA项目
可以用于所有的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 = 应用机),核心思路围绕双机协同、分端部署、网络互通、应用服务化展开,整体分三大核心环节:
- 双机同步若依源码,数据库机单独完成 MySQL 安装、远程开放、库 / 用户创建及若依 SQL 脚本导入;
- 双机统一配置 DNS 服务,实现
mysql.lty.org域名(实际生产的域名)映射数据库机,验证网络解析和远程连库,打通双机通信;- 应用机通过 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 = 若依应用构建 / 容器运行机),围绕若依单体服务容器化落地设计单次构建和多阶段构建两种方案,整体核心思路如下:
- 前置基础准备:双机做基础配置,10.0.0.11 配置 hosts 解析 MySQL 域名,10.0.0.10 配置 Docker 国内加速;10.0.0.10 通过 Docker 快速部署 MySQL 容器,初始化若依 ry 库和专用用户,10.0.0.11 测试远程连库,打通双机数据库通信,为应用运行铺垫基础。
- 单次构建方案:基于宿主机具备构建环境实现容器化,10.0.0.11 先安装 Maven 并配置加速,在宿主机编译若依源码生成 Jar 包;编写单阶段 Dockerfile,基于 JRE8 轻量镜像,配置应用环境、复制宿主机 Jar 包、解决若依验证码字体依赖;构建应用镜像后,启动容器时通过
--add-host配置容器内 MySQL 域名解析,保证容器访问外部数据库,同时配置容器开机自启。- 多阶段构建方案:针对单次构建「宿主机需匹配 JDK/Maven 版本」,采用 Docker 多阶段构建实现构建环境与宿主机解耦;第一阶段基于指定版本的 Maven+JDK8 镜像做构建阶段,在容器内完成若依源码复制、编译打包,无需宿主机有匹配的构建环境;第二阶段复用单阶段的运行镜像配置,通过
--from=build从构建阶段复制 Jar 包;最终以和单次构建相同的容器启动方式运行,实现若依容器化构建的环境无关性。- 核心统一要求:两种构建方案均围绕若依应用容器化运行展开,均解决了若依验证码字体依赖、容器访问外部 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
更多推荐




所有评论(0)