v3.0.0 init

This commit is contained in:
ageerle
2026-02-06 03:00:23 +08:00
parent eb2e8f3ff8
commit 7b8cfe02a1
1524 changed files with 53132 additions and 58866 deletions

View File

@@ -1,5 +0,0 @@
FROM nginx:1.25-alpine
COPY dist/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -1,22 +0,0 @@
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /prod-api/ {
proxy_pass http://ruoyi-backend:6039/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

View File

@@ -1,5 +0,0 @@
FROM openjdk:17-jdk
WORKDIR /app
COPY ruoyi-admin.jar /app/ruoyi-admin.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","ruoyi-admin.jar"]

View File

@@ -1,5 +0,0 @@
FROM nginx:1.25-alpine
COPY dist/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -1,22 +0,0 @@
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://ruoyi-backend:6039/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

View File

@@ -1,5 +0,0 @@
# 应用标题
VITE_APP_TITLE=RuoYi AI
# 应用命名空间用于缓存、store等功能的前缀确保隔离
VITE_APP_NAMESPACE=vben-web-antd

View File

@@ -1,7 +0,0 @@
# public path
VITE_BASE=/
# Basic interface address SPA
VITE_GLOB_API_URL=/api
VITE_VISUALIZER=true

View File

@@ -1,25 +0,0 @@
# 端口号
VITE_PORT=5666
VITE_BASE=/
# 是否开启 Nitro Mock服务true 为开启false 为关闭
VITE_NITRO_MOCK=false
# 是否打开 devtoolstrue 为打开false 为关闭
VITE_DEVTOOLS=false
# 是否注入全局loading
VITE_INJECT_APP_LOADING=true
# 后台请求路径 具体在vite.config.mts配置代理
VITE_GLOB_API_URL=/api
# 全局加密开关(即开启了加解密功能才会生效 不是全部接口加密 需要和后端对应)
VITE_GLOB_ENABLE_ENCRYPT=false
# RSA公钥 请求加密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对
VITE_GLOB_RSA_PUBLIC_KEY=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
# RSA私钥 响应解密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对
VITE_GLOB_RSA_PRIVATE_KEY=MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=
# 客户端id
VITE_GLOB_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e
# 开启SSE
VITE_GLOB_SSE_ENABLE=false

View File

@@ -1,32 +0,0 @@
VITE_BASE=/
# 是否开启压缩,可以设置为 none, brotli, gzip
VITE_COMPRESS=gzip
# 是否开启 PWA
VITE_PWA=false
# vue-router 的模式
VITE_ROUTER_HISTORY=history
# 是否注入全局loading
VITE_INJECT_APP_LOADING=true
# 打包后是否生成dist.zip
VITE_ARCHIVER=true
# 后端接口地址
VITE_GLOB_API_URL=/prod-api
# 全局加密开关(即开启了加解密功能才会生效 不是全部接口加密 需要和后端对应)
VITE_GLOB_ENABLE_ENCRYPT=false
# RSA公钥 请求加密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对
VITE_GLOB_RSA_PUBLIC_KEY=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
# RSA私钥 响应解密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对
VITE_GLOB_RSA_PRIVATE_KEY=MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=
# 客户端id
VITE_GLOB_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e
# 开启SSE
VITE_GLOB_SSE_ENABLE=false

View File

@@ -1,35 +0,0 @@
# 该文件是为了给一个增加环境变量打包的例子
# 对应在根目录package.json -> build:antd:test 命令
VITE_BASE=/
# 是否开启压缩,可以设置为 none, brotli, gzip
VITE_COMPRESS=gzip
# 是否开启 PWA
VITE_PWA=false
# vue-router 的模式
VITE_ROUTER_HISTORY=history
# 是否注入全局loading
VITE_INJECT_APP_LOADING=true
# 打包后是否生成dist.zip
VITE_ARCHIVER=true
# 后端接口地址
VITE_GLOB_API_URL=/test-api
# 全局加密开关(即开启了加解密功能才会生效 不是全部接口加密 需要和后端对应)
VITE_GLOB_ENABLE_ENCRYPT=true
# RSA公钥 请求加密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对
VITE_GLOB_RSA_PUBLIC_KEY=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
# RSA私钥 响应解密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对
VITE_GLOB_RSA_PRIVATE_KEY=MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=
# 客户端id
VITE_GLOB_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e
# 开启SSE
VITE_GLOB_SSE_ENABLE=true

View File

@@ -1,37 +0,0 @@
import {defineConfig} from '@vben/vite-config';
// 自行取消注释来启用按需导入功能
// import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers';
// import Components from 'unplugin-vue-components/vite';
export default defineConfig(async () => {
return {
application: {},
vite: {
plugins: [
// Components({
// dirs: [], // 默认会导入src/components目录下所有组件 不需要
// dts: './types/components.d.ts', // 输出类型文件
// resolvers: [
// AntDesignVueResolver({
// // 需要排除Button组件 全局已经默认导入了
// exclude: ['Button'],
// importStyle: false, // css in js
// }),
// ],
// }),
],
server: {
proxy: {
'/api': {
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
// mock代理目标地址
target: 'http://ruoyi-backend:6039',
ws: true,
},
},
},
},
};
});

View File

@@ -1,174 +0,0 @@
--- # 临时文件存储位置 避免临时文件被系统清理报错
spring.servlet.multipart.location: /ruoyi/server/temp
--- # 监控中心配置
spring.boot.admin.client:
# 增加客户端开关
enabled: false
url: http://localhost:9090/admin
instance:
service-host-type: IP
username: ruoyi
password: 123456
--- # xxl-job 配置
xxl.job:
# 执行器开关
enabled: false
# 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
admin-addresses: http://localhost:9100/xxl-job-admin
# 执行器通讯TOKEN非空时启用
access-token: xxl-job
executor:
# 执行器AppName执行器心跳注册分组依据为空则关闭自动注册
appname: xxl-job-executor
# 执行器端口号 执行器从9101开始往后写
port: 9101
# 执行器注册默认IP:PORT
address:
# 执行器IP默认自动获取IP
ip:
# 执行器运行日志文件存储磁盘路径
logpath: ./logs/xxl-job
# 执行器日志文件保存天数大于3生效
logretentiondays: 30
--- # 数据源配置
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://mysql:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username: root
password: root
# 从库数据源
slave:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username:
password:
# oracle:
# type: ${spring.datasource.type}
# driverClassName: oracle.jdbc.OracleDriver
# url: jdbc:oracle:thin:@//localhost:1521/XE
# username: ROOT
# password: root
# hikari:
# connectionTestQuery: SELECT 1 FROM DUAL
# postgres:
# type: ${spring.datasource.type}
# driverClassName: org.postgresql.Driver
# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
# username: root
# password: root
# sqlserver:
# type: ${spring.datasource.type}
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
# username: SA
# password: root
hikari:
# 最大连接池数量
maxPoolSize: 20
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间默认10分钟
idleTimeout: 600000
# 此属性控制池中连接的最长生命周期值0表示无限生命周期默认30分钟
maxLifetime: 1800000
# 连接测试query配置检测连接是否有效
connectionTestQuery: SELECT 1
# 多久检查一次连接的活性
keepaliveTime: 30000
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring.data:
redis:
# 地址
host: redis
# 端口默认为6379
port: 6379
# 数据库索引
database: 0
# 密码(如没有密码请注释掉)
# password:
# 连接超时时间
timeout: 10s
# 是否开启ssl
ssl: false
redisson:
# redis key前缀
keyPrefix:
# 线程池数量
threads: 16
# Netty线程池数量
nettyThreads: 32
# 单节点配置
singleServerConfig:
# 客户端名称
clientName: ${ruoyi.name}
# 最小空闲连接数
connectionMinimumIdleSize: 32
# 连接池大小
connectionPoolSize: 64
# 连接空闲超时,单位:毫秒
idleConnectionTimeout: 10000
# 命令等待超时,单位:毫秒
timeout: 3000
# 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50
--- # mail 邮件发送
mail:
enabled: false
host: smtp.163.com
port: 465
# 是否需要用户名密码验证
auth: true
# 发送方遵循RFC-822标准
from: pengpan@163.com
# 用户名注意如果使用foxmail邮箱此处user为qq号
user: pengpan@163.com
# 密码注意某些邮箱需要为SMTP服务单独设置密码详情查看相关帮助
pass: JXLAASWFNLNNAYJU
# 使用 STARTTLS安全连接STARTTLS是对纯文本通信协议的扩展。
starttlsEnable: true
# 使用SSL安全连接
sslEnable: true
# SMTP超时时长单位毫秒缺省值不超时
timeout: 0
# Socket连接超时值单位毫秒缺省值不超时
connectionTimeout: 0
--- # sms 短信
sms:
enabled: false
# 阿里云 dysmsapi.aliyuncs.com
# 腾讯云 sms.tencentcloudapi.com
endpoint: "dysmsapi.aliyuncs.com"
accessKeyId: xxxxxxx
accessKeySecret: xxxxxx
signName: 测试
# 腾讯专用
sdkAppId:

View File

@@ -1,22 +0,0 @@
#!/bin/bash
rm -f /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/.env.analyze
rm -f /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/.env.development
rm -f /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/.env.production
rm -f /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/.env.test
rm -f /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/vite.config.mts
cp /root/ruoyi-ai-docker/build-docker-images/modify-source-code/ruoyi-ai-admin/.env.analyze /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/
cp /root/ruoyi-ai-docker/build-docker-images/modify-source-code/ruoyi-ai-admin/.env.development /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/
cp /root/ruoyi-ai-docker/build-docker-images/modify-source-code/ruoyi-ai-admin/.env.production /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/
cp /root/ruoyi-ai-docker/build-docker-images/modify-source-code/ruoyi-ai-admin/.env.test /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/
cp /root/ruoyi-ai-docker/build-docker-images/modify-source-code/ruoyi-ai-admin/vite.config.mts /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/
docker run --rm --name build-ruoyi-ai-admin -v /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin:/app -w /app node:20 bash -c "npm install -g pnpm && pnpm install && pnpm build"
rm -f /root/ruoyi-ai-docker/build-docker-images/Dockerfile-Resources/ruoyi-ai-admin/dist.zip
cp /root/ruoyi-ai-docker/source-code/ruoyi-ai-admin/apps/web-antd/dist.zip /root/ruoyi-ai-docker/build-docker-images/Dockerfile-Resources/ruoyi-ai-admin/
cd /root/ruoyi-ai-docker/build-docker-images/Dockerfile-Resources/ruoyi-ai-admin/
rm -rf dist
unzip dist.zip -d dist
rm -f dist.zip
docker build -t ruoyi-ai-admin:v2.0.5 .

View File

@@ -1,8 +0,0 @@
#!/bin/bash
rm -f /root/ruoyi-ai-docker/source-code/ruoyi-ai-backend/ruoyi-admin/src/main/resources/application-prod.yml
cp /root/ruoyi-ai-docker/build-docker-images/modify-source-code/ruoyi-ai-backend/application-prod.yml /root/ruoyi-ai-docker/source-code/ruoyi-ai-backend/ruoyi-admin/src/main/resources/application-prod.yml
docker run --rm --name build-ruoyi-ai-backend -v /root/ruoyi-ai-docker/source-code/ruoyi-ai-backend:/app -w /app maven:3.9.9-eclipse-temurin-17-alpine bash -c "mvn clean package -Pprod"
rm -f /root/ruoyi-ai-docker/build-docker-images/Dockerfile-Resources/ruoyi-ai-backend/ruoyi-admin.jar
cp /root/ruoyi-ai-docker/source-code/ruoyi-ai-backend/ruoyi-admin/target/ruoyi-admin.jar /root/ruoyi-ai-docker/build-docker-images/Dockerfile-Resources/ruoyi-ai-backend/
cd /root/ruoyi-ai-docker/build-docker-images/Dockerfile-Resources/ruoyi-ai-backend/
docker build -t ruoyi-ai-backend:v2.0.5 .

View File

@@ -1,6 +0,0 @@
#!/bin/bash
docker run --rm --name build-ruoyi-ai-web -v /root/ruoyi-ai-docker/source-code/ruoyi-ai-web:/app -w /app node:20 bash -c "npm install -g pnpm && pnpm install && pnpm approve-builds && pnpm build"
rm -rf /root/ruoyi-ai-docker/build-docker-images/Dockerfile-Resources/ruoyi-ai-web/dist
cp -pr /root/ruoyi-ai-docker/source-code/ruoyi-ai-web/dist /root/ruoyi-ai-docker/build-docker-images/Dockerfile-Resources/ruoyi-ai-web/
cd /root/ruoyi-ai-docker/build-docker-images/Dockerfile-Resources/ruoyi-ai-web/
docker build -t ruoyi-ai-web:v2.0.5 .

View File

@@ -1,2 +0,0 @@
#!/bin/bash
sed -i 's/[ \t]*$//' filename

View File

@@ -1,37 +0,0 @@
# Timezone
TZ=Asia/Shanghai
# MySQL Configuration
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=ruoyi-ai
MYSQL_PORT=3306
# Redis Configuration
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DATABASE=0
REDIS_TIMEOUT=10s
# Weaviate Configuration
WEAVIATE_QUERY_LIMIT=25
WEAVIATE_ANONYMOUS_ACCESS=true
WEAVIATE_DATA_PATH=/var/lib/weaviate
WEAVIATE_VECTORIZER_MODULE=none
WEAVIATE_MODULES=text2vec-cohere,text2vec-huggingface,text2vec-palm,text2vec-openai,generative-openai,generative-cohere,generative-palm,ref2vec-centroid,reranker-cohere,qna-openai
WEAVIATE_CLUSTER_HOSTNAME=node1
WEAVIATE_PROTOCOL=http
WEAVIATE_HOST=weaviate:8080
WEAVIATE_CLASSNAME=LocalKnowledge
# Backend Configuration
BACKEND_SERVER_PORT=6039
DB_URL=jdbc:mysql://mysql:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
DB_USERNAME=root
DB_PASSWORD=root
REDIS_HOST=redis
# Admin Configuration
ADMIN_SERVER_PORT=8082
# Web Configuration
WEB_SERVER_PORT=8081

View File

@@ -1,4 +0,0 @@
#!/bin/bash
rm -f /root/ruoyi-ai-docker/deploy/mysql-init/*.sql
cp /root/ruoyi-ai-docker/source-code/ruoyi-ai-backend/script/sql/ruoyi-ai.sql /root/ruoyi-ai-docker/deploy/mysql-init/ruoyi-ai.sql

View File

@@ -1,122 +0,0 @@
version: '3'
services:
mysql:
image: mysql:8.0.33
container_name: ruoyi-ai-mysql
env_file:
- ./.env
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
#ports:
# - "${MYSQL_PORT}:3306"
volumes:
- ./mysql-init:/docker-entrypoint-initdb.d
- ./data/mysql:/var/lib/mysql
command:
--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
restart: always
networks:
- ruoyi-net
redis:
image: redis:6.2
container_name: ruoyi-ai-redis
env_file:
- ./.env
#ports:
# - "${REDIS_PORT}:6379"
volumes:
- ./data/redis:/data
command: redis-server --appendonly yes ${REDIS_PASSWORD:+--requirepass ${REDIS_PASSWORD}}
restart: always
networks:
- ruoyi-net
weaviate:
image: semitechnologies/weaviate:1.30.0
container_name: ruoyi-ai-weaviate
env_file:
- ./.env
environment:
- QUERY_DEFAULTS_LIMIT=${WEAVIATE_QUERY_LIMIT}
- AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=${WEAVIATE_ANONYMOUS_ACCESS}
- PERSISTENCE_DATA_PATH=${WEAVIATE_DATA_PATH}
- DEFAULT_VECTORIZER_MODULE=${WEAVIATE_VECTORIZER_MODULE}
- ENABLE_MODULES=${WEAVIATE_MODULES}
- CLUSTER_HOSTNAME=${WEAVIATE_CLUSTER_HOSTNAME}
command: --host 0.0.0.0 --port 8080 --scheme http
ports:
- "50050:8080"
- "50051:50051"
volumes:
- ./data/weaviate:/var/lib/weaviate
restart: always
networks:
- ruoyi-net
minio:
image: minio/minio
container_name: ruoyi-ai-minio
ports:
- "9000:9000"
- "9090:9090"
environment:
- MINIO_ACCESS_KEY=ruoyi
- MINIO_SECRET_KEY=ruoyi123
volumes:
- ./data/minio:/data
- ./data/minio-config:/root/.minio
command: server /data --console-address ":9090"
restart: always
networks:
- ruoyi-net
ruoyi-backend:
image: ruoyi-ai-backend:v2.0.5
container_name: ruoyi-ai-backend
env_file:
- ./.env
ports:
- "${BACKEND_SERVER_PORT}:${BACKEND_SERVER_PORT}"
volumes:
- ./data/logs:/ruoyi/server/logs
restart: always
depends_on:
- mysql
- redis
networks:
- ruoyi-net
ruoyi-admin:
image: ruoyi-ai-admin:v2.0.5
container_name: ruoyi-ai-admin
ports:
#- "8082:80"
- "${ADMIN_SERVER_PORT}:80"
restart: always
depends_on:
- ruoyi-backend
networks:
- ruoyi-net
ruoyi-web:
image: ruoyi-ai-web:v2.0.5
container_name: ruoyi-ai-web
ports:
#- "8081:80"
- "${WEB_SERVER_PORT}:80"
restart: always
depends_on:
- ruoyi-backend
networks:
- ruoyi-net
networks:
ruoyi-net:
driver: bridge

File diff suppressed because it is too large Load Diff

View File

@@ -1,2 +0,0 @@
#!/bin/bash
sed -i 's#127.0.0.1:6038#weaviate:8080#g' ./mysql-init/ruoyi-ai.sql

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,50 +0,0 @@
# Timezone
TZ={{TZ}}
# MySQL Configuration
MYSQL_ROOT_PASSWORD={{MYSQL_ROOT_PASSWORD}}
MYSQL_DATABASE={{MYSQL_DATABASE}}
MYSQL_PORT={{MYSQL_PORT}}
# Redis Configuration
REDIS_PORT={{REDIS_PORT}}
REDIS_PASSWORD={{REDIS_PASSWORD}}
REDIS_DATABASE={{REDIS_DATABASE}}
REDIS_TIMEOUT={{REDIS_TIMEOUT}}
# Backend Configuration
SERVER_PORT={{SERVER_PORT}}
DB_URL=jdbc:mysql://mysql:3306/{{MYSQL_DATABASE}}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
DB_USERNAME={{DB_USERNAME}}
DB_PASSWORD={{DB_PASSWORD}}
REDIS_HOST=redis
BACKEND_HOST={{BACKEND_HOST}}
# Frontend Configuration
ADMIN_PORT={{ADMIN_PORT}}
WEB_PORT={{WEB_PORT}}
FRONTEND_API_BASE_URL={{FRONTEND_API_BASE_URL}}
FRONTEND_DEV_PORT={{FRONTEND_DEV_PORT}}
# Weaviate Configuration
WEAVIATE_HTTP_PORT={{WEAVIATE_HTTP_PORT}}
WEAVIATE_GRPC_PORT={{WEAVIATE_GRPC_PORT}}
WEAVIATE_QUERY_LIMIT={{WEAVIATE_QUERY_LIMIT}}
WEAVIATE_ANONYMOUS_ACCESS={{WEAVIATE_ANONYMOUS_ACCESS}}
WEAVIATE_DATA_PATH={{WEAVIATE_DATA_PATH}}
WEAVIATE_VECTORIZER_MODULE={{WEAVIATE_VECTORIZER_MODULE}}
WEAVIATE_MODULES={{WEAVIATE_MODULES}}
WEAVIATE_CLUSTER_HOSTNAME={{WEAVIATE_CLUSTER_HOSTNAME}}
WEAVIATE_PROTOCOL={{WEAVIATE_PROTOCOL}}
WEAVIATE_HOST=weaviate:8080
WEAVIATE_CLASSNAME={{WEAVIATE_CLASSNAME}}
# Production Configuration
PROD_DB_URL={{PROD_DB_URL}}
PROD_DB_USERNAME={{PROD_DB_USERNAME}}
PROD_DB_PASSWORD={{PROD_DB_PASSWORD}}
PROD_REDIS_HOST={{PROD_REDIS_HOST}}
PROD_REDIS_PORT={{PROD_REDIS_PORT}}
PROD_REDIS_DATABASE={{PROD_REDIS_DATABASE}}
PROD_REDIS_PASSWORD={{PROD_REDIS_PASSWORD}}
PROD_REDIS_TIMEOUT={{PROD_REDIS_TIMEOUT}}

View File

@@ -1,89 +0,0 @@
---
# 数据源配置
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: false
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
# 严格模式 匹配不到数据源则报错
strict: true
datasource:
# 主库数据源
master:
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: {{PROD_DB_URL}}
username: {{PROD_DB_USERNAME}}
password: {{PROD_DB_PASSWORD}}
hikari:
# 最大连接池数量
maxPoolSize: 20
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间默认10分钟
idleTimeout: 600000
# 此属性控制池中连接的最长生命周期值0表示无限生命周期默认30分钟
maxLifetime: 1800000
# 连接测试query配置检测连接是否有效
connectionTestQuery: SELECT 1
# 多久检查一次连接的活性
keepaliveTime: 30000
--- # redis 单机配置
spring.data:
redis:
# 地址
host: {{PROD_REDIS_HOST}}
# 端口默认为6379
port: {{PROD_REDIS_PORT}}
# 数据库索引
database: {{PROD_REDIS_DATABASE}}
# 密码
password: {{PROD_REDIS_PASSWORD}}
# 连接超时时间
timeout: {{PROD_REDIS_TIMEOUT}}
# 是否开启ssl
ssl: false
# 日志配置
logging:
level:
org.ruoyi: info
org.springframework: warn
config: classpath:logback-plus.xml
# Sa-Token配置
sa-token:
# token名称 (同时也是cookie名称)
token-name: Authorization
# token有效期 设为7天 (必定过期) 单位: 秒
timeout: 604800
# token临时有效期 (指定时间无操作就过期) 单位: 秒
activity-timeout: 604800
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# 是否尝试从header里读取token
is-read-header: true
# 是否尝试从cookie里读取token
is-read-cookie: false
# token前缀
token-prefix: "Bearer"
# jwt秘钥
jwt-secret-key: abcdefghijklmnopqrstuvwxyz
# websocket
websocket:
enabled: true
# 路径
path: '/resource/websocket'
# 设置访问源地址
allowedOrigins: '*'

View File

@@ -1,115 +0,0 @@
version: '3'
services:
mysql:
image: registry.cn-shenzhen.aliyuncs.com/breeze-project/mysql:8.0.33
container_name: ruoyi-ai-mysql
env_file:
- ./.env
environment:
- MYSQL_ROOT_PASSWORD={{MYSQL_ROOT_PASSWORD}}
- MYSQL_DATABASE={{MYSQL_DATABASE}}
ports:
- "{{MYSQL_PORT}}:3306"
volumes:
- ./mysql-init:/docker-entrypoint-initdb.d
- ./data/mysql:/var/lib/mysql
command:
--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
restart: always
networks:
- ruoyi-net
redis:
image: registry.cn-shenzhen.aliyuncs.com/breeze-project/redis:6.2
container_name: ruoyi-ai-redis
env_file:
- ./.env
ports:
- "{{REDIS_PORT}}:6379"
volumes:
- ./data/redis:/data
command: redis-server --appendonly yes ${REDIS_PASSWORD:+--requirepass ${REDIS_PASSWORD}}
restart: always
networks:
- ruoyi-net
weaviate:
image: registry.cn-shenzhen.aliyuncs.com/breeze-project/weaviate:1.30.0
container_name: ruoyi-ai-weaviate
ports:
- "{{WEAVIATE_HTTP_PORT}}:8080"
- "{{WEAVIATE_GRPC_PORT}}:50051"
volumes:
- ./data/weaviate:/var/lib/weaviate
env_file:
- ./.env
environment:
- QUERY_DEFAULTS_LIMIT={{WEAVIATE_QUERY_LIMIT}}
- AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED={{WEAVIATE_ANONYMOUS_ACCESS}}
- PERSISTENCE_DATA_PATH={{WEAVIATE_DATA_PATH}}
- DEFAULT_VECTORIZER_MODULE={{WEAVIATE_VECTORIZER_MODULE}}
- ENABLE_MODULES={{WEAVIATE_MODULES}}
- CLUSTER_HOSTNAME={{WEAVIATE_CLUSTER_HOSTNAME}}
command: --host 0.0.0.0 --port 8080 --scheme http
restart: always
networks:
- ruoyi-net
ruoyi-backend:
image: ruoyi-ai-backend:latest
container_name: ruoyi-ai-backend
env_file:
- ./.env
ports:
- "{{SERVER_PORT}}:{{SERVER_PORT}}"
environment:
- SERVER_PORT={{SERVER_PORT}}
- DB_URL={{DB_URL}}
- DB_USERNAME={{DB_USERNAME}}
- DB_PASSWORD={{DB_PASSWORD}}
- REDIS_HOST={{REDIS_HOST}}
- REDIS_PORT={{REDIS_PORT}}
- REDIS_DATABASE={{REDIS_DATABASE}}
- REDIS_PASSWORD={{REDIS_PASSWORD}}
- REDIS_TIMEOUT={{REDIS_TIMEOUT}}
- TZ={{TZ}}
volumes:
- ./data/logs:/ruoyi/server/logs
restart: always
depends_on:
- mysql
- redis
- weaviate
networks:
- ruoyi-net
ruoyi-admin:
image: ruoyi-ai-admin:latest
container_name: ruoyi-ai-admin
ports:
- "{{ADMIN_PORT}}:80"
restart: always
depends_on:
- ruoyi-backend
networks:
- ruoyi-net
ruoyi-web:
image: ruoyi-ai-web:latest
container_name: ruoyi-ai-web
ports:
- "{{WEB_PORT}}:80"
restart: always
depends_on:
- ruoyi-backend
networks:
- ruoyi-net
networks:
ruoyi-net:
driver: bridge

View File

@@ -1,22 +0,0 @@
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /prod-api/ {
proxy_pass http://{{BACKEND_HOST}}:{{SERVER_PORT}}/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

View File

@@ -1,22 +0,0 @@
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://{{BACKEND_HOST}}:{{SERVER_PORT}}/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

View File

@@ -1,4 +0,0 @@
#!/bin/bash
rm -rf ruoyi-ai-admin
git clone https://github.com/ageerle/ruoyi-admin
mv ruoyi-admin ruoyi-ai-admin

View File

@@ -1,7 +0,0 @@
#!/bin/bash
rm -rf ruoyi-ai-backend
git clone https://github.com/ageerle/ruoyi-ai
mv ruoyi-ai ruoyi-ai-backend
cd ruoyi-ai-backend
# git checkout v2.0.4
# cd ..

View File

@@ -1,4 +0,0 @@
#!/bin/bash
rm -rf ruoyi-ai-web
git clone https://github.com/ageerle/ruoyi-web
mv ruoyi-web ruoyi-ai-web

View File

@@ -1,28 +0,0 @@
---
version: '3.8'
services:
minio:
image: minio/minio
container_name: minio
ports:
- "9000:9000"
- "9090:9090"
environment:
- MINIO_ACCESS_KEY=ruoyi
- MINIO_SECRET_KEY=ruoyi123
volumes:
- minio_data:/data
- minio_config:/root/.minio
command: server /data --console-address ":9090"
restart: always
networks:
- minio-net
networks:
minio-net:
driver: bridge
volumes:
minio_data:
minio_config:

View File

@@ -1,65 +0,0 @@
version: '3.8'
services:
neo4j:
image: neo4j:5.15.0
container_name: ruoyi-neo4j
restart: unless-stopped
ports:
# HTTP端口
- "7474:7474"
# HTTPS端口
- "7473:7473"
# Bolt端口
- "7687:7687"
environment:
# 初始密码设置(首次启动后需要修改)
- NEO4J_AUTH=neo4j/your_password
# 接受许可协议
- NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
# 内存配置(根据服务器配置调整)
- NEO4J_dbms_memory_heap_initial__size=512m
- NEO4J_dbms_memory_heap_max__size=2g
- NEO4J_dbms_memory_pagecache_size=1g
# 事务日志配置
- NEO4J_dbms_tx__log_rotation_retention__policy=3 days
# 允许从任何主机连接
- NEO4J_dbms_default__listen__address=0.0.0.0
# 启用APOC插件
- NEO4J_dbms_security_procedures_unrestricted=apoc.*
- NEO4J_dbms_security_procedures_allowlist=apoc.*
# 日志级别
- NEO4J_dbms_logs_debug_level=INFO
volumes:
# 数据持久化
- neo4j_data:/data
# 日志持久化
- neo4j_logs:/logs
# 导入目录
- neo4j_import:/var/lib/neo4j/import
# 插件目录
- neo4j_plugins:/plugins
networks:
- ruoyi-network
healthcheck:
test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:7474 || exit 1" ]
interval: 30s
timeout: 10s
retries: 5
start_period: 40s
volumes:
neo4j_data:
name: ruoyi-neo4j-data
neo4j_logs:
name: ruoyi-neo4j-logs
neo4j_import:
name: ruoyi-neo4j-import
neo4j_plugins:
name: ruoyi-neo4j-plugins
networks:
ruoyi-network:
name: ruoyi-network
driver: bridge

View File

@@ -1,25 +0,0 @@
---
services:
weaviate:
command:
- --host
- 0.0.0.0
- --port
- '6038'
- --scheme
- http
image: semitechnologies/weaviate:1.19.7
ports:
- 6038:6038
- 50051:50051
volumes:
- weaviate_data:/var/lib/weaviate
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none'
CLUSTER_HOSTNAME: 'node1'
volumes:
weaviate_data:
...

File diff suppressed because it is too large Load Diff

View File

@@ -1,162 +0,0 @@
# 数据库开发规范
## 1. 建表规约
### 1.1 表命名规范
**【强制】** 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。
**【强制】** 表名采用 `业务-模块-功能` 的命名方式,使用下划线分隔。
**正例:**
```sql
-- 聊天业务-配置模块-配置功能
chat_config
-- 聊天业务-消息模块-消息功能
chat_message
-- 聊天业务-模型模块-模型功能
chat_model
-- 系统业务-用户模块-用户功能
sys_user
-- 系统业务-角色模块-角色功能
sys_role
-- 知识库业务-角色模块-角色功能
knowledge_role
```
**反例:**
```sql
-- 不规范的命名
chatConfig
ChatMessage
chat-model
user1
2user
user__info
```
### 1.2 字段命名规范
**【强制】** 字段名必须使用小写字母或数字,使用下划线分隔。
**【推荐】** 表达是与否概念的字段,必须使用 `is_xxx` 的方式命名,数据类型是 `char(1)`1 表示是0 表示否。
**正例:** `is_deleted``is_enabled`
## 2. 公共字段规范
### 2.1 必备公共字段
**【推荐】** 表增加以下公共字段:
| 字段名 | 类型 | 默认值 | 说明 | 是否必须 |
|---------------|----------------|----------------|---------------|-------|
| `id` | `bigint(20)` | AUTO_INCREMENT | 主键ID | 是 |
| `create_time` | `datetime` | NULL | 创建时间 | 是 |
| `update_time` | `datetime` | NULL | 更新时间 | 是 |
| `create_by` | `bigint(20)` | NULL | 创建者ID | 是 |
| `update_by` | `bigint(20)` | NULL | 更新者ID | 是 |
| `create_dept` | `bigint(20)` | NULL | 创建部门ID | 是 |
| `del_flag` | `char(1)` | '0' | 删除标志0存在 1删除 | 推荐 |
| `tenant_id` | `varchar(20)` | '000000' | 租户编号 | 多租户必须 |
| `remark` | `varchar(500)` | NULL | 备注 | 是 |
| `version` | `int(11)` | NULL | 版本号(乐观锁) | 可选 |
### 2.2 公共字段说明
- **`id`**: 主键,使用雪花算法生成的 bigint 类型
- **`create_time`**: 记录创建时间,便于数据追踪和审计
- **`update_time`**: 记录最后更新时间,便于数据同步和缓存失效
- **`create_by`**: 创建者用户ID便于权限控制和数据追溯
- **`update_by`**: 更新者用户ID便于操作审计
- **`del_flag`**: 逻辑删除标志0表示正常1表示删除
- **`tenant_id`**: 租户隔离字段,支持多租户架构
- **`remark`**: 备注信息,便于业务说明
## 3. SQL 更新管理规范
### 3.1 目录结构
```
script/
├── sql/
│ ├── ruoyi-ai.sql # 初始化SQL文件
│ └── update/ # 增量更新SQL目录
│ ├── 2024-05-24-chat-message-billing-type.sql
│ ├── 2024-07-13-chat-model-priority.sql
│ └── 2024-08-15-knowledge-role-bak.sql
└── deploy/
└── deploy/
└── mysql-init/
└── ruoyi-ai.sql # Docker初始化SQL与主文件同步
```
### 3.2 更新SQL规范
**【强制】** 增量更新SQL文件必须放在 `script/sql/update/` 目录下。
**【强制】** 更新SQL文件命名格式`YYYY-MM-DD-功能描述.sql`
**正例:**
```
2024-05-24-chat-message-billing-type.sql
2024-07-13-chat-model-priority.sql
2024-08-15-knowledge-role-backup.sql
```
**【强制】** 每个更新SQL文件必须包含
- 文件头部注释说明变更内容
- 变更日期和负责人
- 具体的DDL/DML语句
**正例:**
```sql
-- 为 chat_message 表添加 billing_type 字段
-- 变更日期: 2024-05-24
-- 负责人: 张三
-- 说明: 支持消息计费类型区分
ALTER TABLE chat_message
ADD COLUMN billing_type char NULL COMMENT '计费类型1-token计费2-次数计费null-普通消息)';
```
### 3.3 部署流程
#### 3.3.1 首次部署
**【强制】** 首次初始化项目只需要执行:
```bash
mysql -u root -p database_name < script/sql/ruoyi-ai.sql
```
#### 3.3.2 增量更新
**【强制】** 代码更新时,按日期顺序执行 `script/sql/update/` 下的补丁SQL
```bash
# 按文件名日期顺序执行
mysql -u root -p database_name < script/sql/update/2024-05-24-chat-message-billing-type.sql
mysql -u root -p database_name < script/sql/update/2024-07-13-chat-model-priority.sql
```
#### 3.3.3 同步更新
**【强制】** 当数据库发生变化时,必须同时完成以下操作:
1.`script/sql/update/` 下添加增量SQL补丁
2. 将变更同步更新到初始化文件 `script/sql/ruoyi-ai.sql`
---
>
> 最后更新时间2025-11-07