mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-03-14 05:03:43 +08:00
Merge pull request #90 from alanpeng/main
Add one-step auto-deployment script
This commit is contained in:
42
README.md
42
README.md
@@ -36,18 +36,48 @@
|
||||
|
||||
## 快速启动
|
||||
|
||||
1. **克隆项目**
|
||||
1. 确认系统内已经安装好以下软件
|
||||
docker
|
||||
docker-compose
|
||||
git
|
||||
unzip
|
||||
|
||||
2. **克隆项目**
|
||||
```bash
|
||||
git clone https://github.com/alanpeng/ruoyi-ai-docker-deploy
|
||||
cd ruoyi-ai-docker-deploy
|
||||
git clone https://github.com/ageerle/ruoyi-ai
|
||||
cd ruoyi-ai/docker-deploy/one-step-script/
|
||||
```
|
||||
|
||||
2. **启动全套应用**
|
||||
3. **启动部署脚本**
|
||||
|
||||
中文界面部署脚本:
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
./deploy-cn.sh
|
||||
```
|
||||

|
||||

|
||||

|
||||
|
||||
英文界面部署脚本:
|
||||
|
||||
```bash
|
||||
./deploy-en.sh
|
||||
```
|
||||
|
||||
3. **访问应用界面**
|
||||
4. 如果在执行部署脚本过程中不需要在本地重新构建编译服务软件包以及重新封装容器镜像,则需要在脚本交互提出以下问题时选择D按键进行直接部署,否则就会执行全新的编译构建及容器封装之后再执行部署:
|
||||
```
|
||||
已将模板文件复制到部署目录。
|
||||
正在使用您的配置更新 .env 文件...
|
||||
已使用您的配置更新 .env 文件。
|
||||
正在使用您的配置更新 docker-compose.yaml 文件...
|
||||
已使用您的配置更新 docker-compose.yaml 文件。
|
||||
|
||||
=== 构建或部署选项 ===
|
||||
您想构建新镜像 (B) 还是直接使用现有镜像部署 (D)?[B/d]:
|
||||
```
|
||||
|
||||
5. **访问应用界面**
|
||||
- 用户界面:`http://your-server-ip:8081`
|
||||
- 管理员界面:`http://your-server-ip:8082`
|
||||
|
||||
|
||||
519
docker-deploy/one-step-script/deploy-cn.sh
Executable file
519
docker-deploy/one-step-script/deploy-cn.sh
Executable file
@@ -0,0 +1,519 @@
|
||||
#!/bin/bash
|
||||
|
||||
# RuoYi-AI Interactive Deployment Script
|
||||
# This script helps configure and deploy the RuoYi-AI project with custom settings
|
||||
|
||||
set -e
|
||||
|
||||
echo "=================================================="
|
||||
echo " RuoYi-AI 交互式部署脚本"
|
||||
echo "=================================================="
|
||||
echo ""
|
||||
echo "此脚本将引导您完成 RuoYi-AI 的配置和部署。"
|
||||
echo "系统将提示您输入各种配置参数。"
|
||||
echo ""
|
||||
|
||||
SCRIPT_DIR=${PWD}
|
||||
|
||||
# 提示输入部署目录,带有默认值
|
||||
read -p "请输入部署目录 [${PWD}/ruoyi-ai-deploy]: " user_input
|
||||
DEPLOY_DIR="${user_input:-${PWD}/ruoyi-ai-deploy}"
|
||||
|
||||
# 检查目录是否存在
|
||||
if [ -d "$DEPLOY_DIR" ]; then
|
||||
echo "警告:目录 $DEPLOY_DIR 已存在!"
|
||||
read -p "您想删除它吗?[y/N]: " delete_choice
|
||||
|
||||
case "${delete_choice:-N}" in
|
||||
[Yy]* )
|
||||
echo "正在删除现有目录..."
|
||||
rm -rf "$DEPLOY_DIR"
|
||||
mkdir -p "$DEPLOY_DIR"
|
||||
echo "目录已重新创建。"
|
||||
;;
|
||||
* )
|
||||
echo "保留现有目录。"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
mkdir -p "$DEPLOY_DIR"
|
||||
echo "目录已创建于 $DEPLOY_DIR"
|
||||
fi
|
||||
|
||||
echo "选定的部署目录: $DEPLOY_DIR"
|
||||
|
||||
mkdir -p ${DEPLOY_DIR}/{data/mysql,data/redis,data/logs,data/weaviate}
|
||||
cd ${DEPLOY_DIR}
|
||||
|
||||
# Function to prompt for a value with a default
|
||||
prompt_with_default() {
|
||||
local prompt=$1
|
||||
local default=$2
|
||||
local var_name=$3
|
||||
|
||||
read -p "${prompt} [${default}]: " input
|
||||
if [ -z "$input" ]; then
|
||||
eval "${var_name}=\"${default}\""
|
||||
else
|
||||
eval "${var_name}=\"${input}\""
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to prompt for a password with masking
|
||||
prompt_for_password() {
|
||||
local prompt=$1
|
||||
local default=$2
|
||||
local var_name=$3
|
||||
|
||||
read -sp "${prompt} [default: ${default}]: " input
|
||||
echo ""
|
||||
if [ -z "$input" ]; then
|
||||
eval "${var_name}=\"${default}\""
|
||||
else
|
||||
eval "${var_name}=\"${input}\""
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to escape special characters for sed replacement string
|
||||
escape_sed_replacement_string() {
|
||||
# Escape &, \, and the delimiter | for the sed replacement string
|
||||
echo "$1" | sed -e 's/[&\\|]/\\&/g'
|
||||
}
|
||||
|
||||
echo "=== 常规配置 ==="
|
||||
prompt_with_default "时区" "Asia/Shanghai" "TZ"
|
||||
|
||||
echo ""
|
||||
echo "=== MySQL 配置 ==="
|
||||
prompt_with_default "MySQL 端口" "3306" "MYSQL_PORT"
|
||||
prompt_with_default "MySQL 数据库名称" "ruoyi-ai" "MYSQL_DATABASE"
|
||||
prompt_for_password "MySQL root 密码" "root" "MYSQL_ROOT_PASSWORD"
|
||||
|
||||
echo ""
|
||||
echo "=== Redis 配置 ==="
|
||||
prompt_with_default "Redis 端口" "6379" "REDIS_PORT"
|
||||
prompt_for_password "Redis 密码 (留空则无密码)" "" "REDIS_PASSWORD"
|
||||
prompt_with_default "Redis 数据库索引" "0" "REDIS_DATABASE"
|
||||
prompt_with_default "Redis 连接超时时间" "10s" "REDIS_TIMEOUT"
|
||||
|
||||
echo ""
|
||||
echo "=== 后端服务配置 ==="
|
||||
prompt_with_default "后端服务端口" "6039" "SERVER_PORT"
|
||||
prompt_with_default "后端服务主机名" "ruoyi-backend" "BACKEND_HOST"
|
||||
prompt_with_default "数据库用户名" "root" "DB_USERNAME"
|
||||
prompt_for_password "数据库密码" "root" "DB_PASSWORD"
|
||||
|
||||
echo ""
|
||||
echo "=== 前端服务配置 ==="
|
||||
prompt_with_default "Admin UI 端口" "8082" "ADMIN_PORT"
|
||||
prompt_with_default "Web UI 端口" "8081" "WEB_PORT"
|
||||
|
||||
echo ""
|
||||
echo "=== Weaviate 向量数据库配置 ==="
|
||||
prompt_with_default "Weaviate HTTP 端口" "50050" "WEAVIATE_HTTP_PORT"
|
||||
prompt_with_default "Weaviate gRPC 端口" "50051" "WEAVIATE_GRPC_PORT"
|
||||
prompt_with_default "Weaviate 查询限制" "25" "WEAVIATE_QUERY_LIMIT"
|
||||
prompt_with_default "Weaviate 匿名访问" "true" "WEAVIATE_ANONYMOUS_ACCESS"
|
||||
prompt_with_default "Weaviate 数据路径" "/var/lib/weaviate" "WEAVIATE_DATA_PATH"
|
||||
prompt_with_default "Weaviate 向量化模块" "none" "WEAVIATE_VECTORIZER_MODULE"
|
||||
prompt_with_default "Weaviate 模块" "text2vec-cohere,text2vec-huggingface,text2vec-palm,text2vec-openai,generative-openai,generative-cohere,generative-palm,ref2vec-centroid,reranker-cohere,qna-openai" "WEAVIATE_MODULES"
|
||||
prompt_with_default "Weaviate 集群主机名" "node1" "WEAVIATE_CLUSTER_HOSTNAME"
|
||||
prompt_with_default "Weaviate 协议" "http" "WEAVIATE_PROTOCOL"
|
||||
prompt_with_default "Weaviate 类名" "LocalKnowledge" "WEAVIATE_CLASSNAME"
|
||||
|
||||
echo ""
|
||||
echo "=== 生产环境配置 ==="
|
||||
prompt_with_default "生产环境数据库 URL" "jdbc:mysql://mysql:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true" "PROD_DB_URL"
|
||||
prompt_with_default "生产环境数据库用户名" "root" "PROD_DB_USERNAME"
|
||||
prompt_for_password "生产环境数据库密码" "root" "PROD_DB_PASSWORD"
|
||||
prompt_with_default "生产环境 Redis 主机" "redis" "PROD_REDIS_HOST"
|
||||
prompt_with_default "生产环境 Redis 端口" "6379" "PROD_REDIS_PORT"
|
||||
prompt_with_default "生产环境 Redis 数据库" "0" "PROD_REDIS_DATABASE"
|
||||
prompt_for_password "生产环境 Redis 密码 (留空则无密码)" "" "PROD_REDIS_PASSWORD"
|
||||
prompt_with_default "生产环境 Redis 超时时间" "10s" "PROD_REDIS_TIMEOUT"
|
||||
|
||||
echo ""
|
||||
echo "=== 前端配置 ==="
|
||||
prompt_with_default "前端后端 API 基础 URL" "http://${BACKEND_HOST}:${SERVER_PORT}" "FRONTEND_API_BASE_URL"
|
||||
prompt_with_default "前端开发服务器端口" "3000" "FRONTEND_DEV_PORT"
|
||||
|
||||
# Copy template files
|
||||
cp ${SCRIPT_DIR}/template/.env.template ${DEPLOY_DIR}/.env
|
||||
cp ${SCRIPT_DIR}/template/docker-compose.yaml.template ${DEPLOY_DIR}/docker-compose.yaml
|
||||
|
||||
echo "已将模板文件复制到部署目录。"
|
||||
|
||||
# 替换 .env 文件中的占位符
|
||||
echo "正在使用您的配置更新 .env 文件..."
|
||||
sed -i "s|{{TZ}}|$(escape_sed_replacement_string "${TZ}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{MYSQL_ROOT_PASSWORD}}|$(escape_sed_replacement_string "${MYSQL_ROOT_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{MYSQL_DATABASE}}|$(escape_sed_replacement_string "${MYSQL_DATABASE}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{MYSQL_PORT}}|$(escape_sed_replacement_string "${MYSQL_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{REDIS_PORT}}|$(escape_sed_replacement_string "${REDIS_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{REDIS_PASSWORD}}|$(escape_sed_replacement_string "${REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{REDIS_DATABASE}}|$(escape_sed_replacement_string "${REDIS_DATABASE}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{DB_URL}}|$(escape_sed_replacement_string "jdbc:mysql://mysql:3306/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{DB_USERNAME}}|$(escape_sed_replacement_string "${DB_USERNAME}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{DB_PASSWORD}}|$(escape_sed_replacement_string "${DB_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{BACKEND_HOST}}|$(escape_sed_replacement_string "${BACKEND_HOST}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{ADMIN_PORT}}|$(escape_sed_replacement_string "${ADMIN_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEB_PORT}}|$(escape_sed_replacement_string "${WEB_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{FRONTEND_API_BASE_URL}}|$(escape_sed_replacement_string "${FRONTEND_API_BASE_URL}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{FRONTEND_DEV_PORT}}|$(escape_sed_replacement_string "${FRONTEND_DEV_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_HTTP_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_HTTP_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_GRPC_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_GRPC_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_QUERY_LIMIT}}|$(escape_sed_replacement_string "${WEAVIATE_QUERY_LIMIT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_ANONYMOUS_ACCESS}}|$(escape_sed_replacement_string "${WEAVIATE_ANONYMOUS_ACCESS}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_DATA_PATH}}|$(escape_sed_replacement_string "${WEAVIATE_DATA_PATH}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_VECTORIZER_MODULE}}|$(escape_sed_replacement_string "${WEAVIATE_VECTORIZER_MODULE}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_MODULES}}|$(escape_sed_replacement_string "${WEAVIATE_MODULES}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_CLUSTER_HOSTNAME}}|$(escape_sed_replacement_string "${WEAVIATE_CLUSTER_HOSTNAME}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_PROTOCOL}}|$(escape_sed_replacement_string "${WEAVIATE_PROTOCOL}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_CLASSNAME}}|$(escape_sed_replacement_string "${WEAVIATE_CLASSNAME}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_DB_URL}}|$(escape_sed_replacement_string "${PROD_DB_URL}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_DB_USERNAME}}|$(escape_sed_replacement_string "${PROD_DB_USERNAME}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_DB_PASSWORD}}|$(escape_sed_replacement_string "${PROD_DB_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_HOST}}|$(escape_sed_replacement_string "${PROD_REDIS_HOST}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_PORT}}|$(escape_sed_replacement_string "${PROD_REDIS_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_DATABASE}}|$(escape_sed_replacement_string "${PROD_REDIS_DATABASE}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_PASSWORD}}|$(escape_sed_replacement_string "${PROD_REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${PROD_REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/.env
|
||||
|
||||
echo "已使用您的配置更新 .env 文件。"
|
||||
|
||||
# 替换 docker-compose.yaml 文件中的占位符
|
||||
echo "正在使用您的配置更新 docker-compose.yaml 文件..."
|
||||
|
||||
# Determine Redis command arguments based on password
|
||||
#if [ -n "${REDIS_PASSWORD}" ]; then
|
||||
# REDIS_COMMAND_ARGS="--requirepass $(escape_sed_replacement_string "${REDIS_PASSWORD}")"
|
||||
#else
|
||||
# REDIS_COMMAND_ARGS=""
|
||||
#fi
|
||||
|
||||
sed -i "s|{{MYSQL_ROOT_PASSWORD}}|$(escape_sed_replacement_string "${MYSQL_ROOT_PASSWORD}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{MYSQL_DATABASE}}|$(escape_sed_replacement_string "${MYSQL_DATABASE}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{MYSQL_PORT}}|$(escape_sed_replacement_string "${MYSQL_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_PORT}}|$(escape_sed_replacement_string "${REDIS_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_COMMAND_ARGS}}|$(escape_sed_replacement_string "${REDIS_COMMAND_ARGS}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_HTTP_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_HTTP_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_GRPC_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_GRPC_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_QUERY_LIMIT}}|$(escape_sed_replacement_string "${WEAVIATE_QUERY_LIMIT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_ANONYMOUS_ACCESS}}|$(escape_sed_replacement_string "${WEAVIATE_ANONYMOUS_ACCESS}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_DATA_PATH}}|$(escape_sed_replacement_string "${WEAVIATE_DATA_PATH}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_VECTORIZER_MODULE}}|$(escape_sed_replacement_string "${WEAVIATE_VECTORIZER_MODULE}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_MODULES}}|$(escape_sed_replacement_string "${WEAVIATE_MODULES}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_CLUSTER_HOSTNAME}}|$(escape_sed_replacement_string "${WEAVIATE_CLUSTER_HOSTNAME}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{DB_URL}}|$(escape_sed_replacement_string "jdbc:mysql://mysql:3306/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{DB_USERNAME}}|$(escape_sed_replacement_string "${DB_USERNAME}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{DB_PASSWORD}}|$(escape_sed_replacement_string "${DB_PASSWORD}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_HOST}}|redis|g" ${DEPLOY_DIR}/docker-compose.yaml # REDIS_HOST is hardcoded to 'redis' in docker-compose
|
||||
sed -i "s|{{REDIS_DATABASE}}|$(escape_sed_replacement_string "${REDIS_DATABASE}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_PASSWORD}}|$(escape_sed_replacement_string "${REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{TZ}}|$(escape_sed_replacement_string "${TZ}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{ADMIN_PORT}}|$(escape_sed_replacement_string "${ADMIN_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEB_PORT}}|$(escape_sed_replacement_string "${WEB_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
|
||||
echo ""
|
||||
echo "=== 构建或部署选项 ==="
|
||||
read -p "您想构建新镜像 (B) 还是直接使用现有镜像部署 (D)?[B/d]: " build_or_deploy_choice
|
||||
BUILD_CHOICE="${build_or_deploy_choice:-B}" # Default to Build
|
||||
|
||||
if [[ "${BUILD_CHOICE}" == [Bb]* ]]; then
|
||||
echo "正在进行镜像构建过程..."
|
||||
|
||||
# Clone ruoyi-ai-backend repositories
|
||||
if [ -d "${DEPLOY_DIR}/ruoyi-ai" ]; then
|
||||
echo "目录 ${DEPLOY_DIR}/ruoyi-ai 已存在。"
|
||||
read -p "您想删除它并克隆一个新的副本吗?[Y/n]: " answer
|
||||
case ${answer:-Y} in
|
||||
[Yy]* )
|
||||
echo "正在删除现有目录..."
|
||||
rm -rf ${DEPLOY_DIR}/ruoyi-ai
|
||||
echo "正在克隆 ruoyi-ai-backend 仓库..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-ai
|
||||
|
||||
# 提示选择分支
|
||||
read -p "请输入 ruoyi-ai 仓库的分支名称 [main]: " RUOYI_AI_BRANCH
|
||||
RUOYI_AI_BRANCH="${RUOYI_AI_BRANCH:-main}"
|
||||
echo "正在切换到分支: ${RUOYI_AI_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-ai && git checkout ${RUOYI_AI_BRANCH}
|
||||
cd ..
|
||||
;;
|
||||
[Nn]* )
|
||||
echo "跳过克隆操作。"
|
||||
;;
|
||||
* )
|
||||
echo "无效输入。跳过克隆操作。"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "正在克隆 ruoyi-ai-backend 仓库..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-ai
|
||||
|
||||
# 提示选择分支
|
||||
read -p "请输入 ruoyi-ai 仓库的分支名称 [main]: " RUOYI_AI_BRANCH
|
||||
RUOYI_AI_BRANCH="${RUOYI_AI_BRANCH:-main}"
|
||||
echo "正在切换到分支: ${RUOYI_AI_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-ai && git checkout ${RUOYI_AI_BRANCH}
|
||||
cd ..
|
||||
fi
|
||||
|
||||
# Clone ruoyi-ai-admin repositories
|
||||
if [ -d "${DEPLOY_DIR}/ruoyi-admin" ]; then
|
||||
echo "目录 ${DEPLOY_DIR}/ruoyi-admin 已存在。"
|
||||
read -p "您想删除它并克隆一个新的副本吗?[Y/n]: " answer
|
||||
case ${answer:-Y} in
|
||||
[Yy]* )
|
||||
echo "正在删除现有目录..."
|
||||
rm -rf ${DEPLOY_DIR}/ruoyi-admin
|
||||
echo "正在克隆 ruoyi-admin 仓库..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-admin
|
||||
|
||||
# 提示选择分支
|
||||
read -p "请输入 ruoyi-admin 仓库的分支名称 [main]: " RUOYI_ADMIN_BRANCH
|
||||
RUOYI_ADMIN_BRANCH="${RUOYI_ADMIN_BRANCH:-main}"
|
||||
echo "正在切换到分支: ${RUOYI_ADMIN_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-admin && git checkout ${RUOYI_ADMIN_BRANCH}
|
||||
cd ..
|
||||
;;
|
||||
[Nn]* )
|
||||
echo "跳过克隆操作。"
|
||||
;;
|
||||
* )
|
||||
echo "无效输入。跳过克隆操作。"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "正在克隆 ruoyi-ai-admin 仓库..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-admin
|
||||
|
||||
# 提示选择分支
|
||||
read -p "请输入 ruoyi-admin 仓库的分支名称 [main]: " RUOYI_ADMIN_BRANCH
|
||||
RUOYI_ADMIN_BRANCH="${RUOYI_ADMIN_BRANCH:-main}"
|
||||
echo "正在切换到分支: ${RUOYI_ADMIN_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-admin && git checkout ${RUOYI_ADMIN_BRANCH}
|
||||
cd ..
|
||||
fi
|
||||
|
||||
# Clone ruoyi-ai-web repositories
|
||||
if [ -d "${DEPLOY_DIR}/ruoyi-web" ]; then
|
||||
echo "目录 ${DEPLOY_DIR}/ruoyi-web 已存在。"
|
||||
read -p "您想删除它并克隆一个新的副本吗?[Y/n]: " answer
|
||||
case ${answer:-Y} in
|
||||
[Yy]* )
|
||||
echo "正在删除现有目录..."
|
||||
rm -rf ${DEPLOY_DIR}/ruoyi-web
|
||||
echo "正在克隆 ruoyi-ai-web 仓库..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-web
|
||||
|
||||
# 提示选择分支
|
||||
read -p "请输入 ruoyi-web 仓库的分支名称 [main]: " RUOYI_WEB_BRANCH
|
||||
RUOYI_WEB_BRANCH="${RUOYI_WEB_BRANCH:-main}"
|
||||
echo "正在切换到分支: ${RUOYI_WEB_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-web && git checkout ${RUOYI_WEB_BRANCH}
|
||||
cd ..
|
||||
;;
|
||||
[Nn]* )
|
||||
echo "跳过克隆操作。"
|
||||
;;
|
||||
* )
|
||||
echo "无效输入。跳过克隆操作。"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "正在克隆 ruoyi-ai-web 仓库..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-web
|
||||
|
||||
# 提示选择分支
|
||||
read -p "请输入 ruoyi-web 仓库的分支名称 [main]: " RUOYI_WEB_BRANCH
|
||||
RUOYI_WEB_BRANCH="${RUOYI_WEB_BRANCH:-main}"
|
||||
echo "正在切换到分支: ${RUOYI_WEB_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-web && git checkout ${RUOYI_WEB_BRANCH}
|
||||
cd ..
|
||||
fi
|
||||
|
||||
# 更新 application-prod.yml 文件
|
||||
echo "正在使用您的配置更新 application-prod.yml 文件..."
|
||||
# Copy application-prod.yml template
|
||||
cp ${SCRIPT_DIR}/template/application-prod.yml.template ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
|
||||
# Replace placeholders in application-prod.yml
|
||||
sed -i "s|{{PROD_DB_URL}}|$(escape_sed_replacement_string "${PROD_DB_URL}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_DB_USERNAME}}|$(escape_sed_replacement_string "${PROD_DB_USERNAME}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_DB_PASSWORD}}|$(escape_sed_replacement_string "${PROD_DB_PASSWORD}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_REDIS_HOST}}|$(escape_sed_replacement_string "${PROD_REDIS_HOST}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_REDIS_PORT}}|$(escape_sed_replacement_string "${PROD_REDIS_PORT}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_REDIS_DATABASE}}|$(escape_sed_replacement_string "${PROD_REDIS_DATABASE}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
if [ -z "${PROD_REDIS_PASSWORD}" ]; then
|
||||
sed -i "s/^ password: {{PROD_REDIS_PASSWORD}}/# password: {{PROD_REDIS_PASSWORD}}/g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
else
|
||||
sed -i "s|{{PROD_REDIS_PASSWORD}}|$(escape_sed_replacement_string "${PROD_REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
fi
|
||||
sed -i "s|{{PROD_REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${PROD_REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
|
||||
# 更新 vite.config.mts 文件
|
||||
echo "正在使用您的配置更新 vite.config.mts 文件..."
|
||||
sed -i "s|http://127.0.0.1:6039|${FRONTEND_API_BASE_URL}|g" ${DEPLOY_DIR}/ruoyi-admin/apps/web-antd/vite.config.mts
|
||||
|
||||
# 更新 docker-compose.yaml 文件中的镜像标签
|
||||
echo "正在更新 docker-compose.yaml 文件中的镜像标签..."
|
||||
sed -i "s|ruoyi-ai-backend:latest|ruoyi-ai-backend:${RUOYI_AI_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|ruoyi-ai-admin:latest|ruoyi-ai-admin:${RUOYI_ADMIN_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|ruoyi-ai-web:latest|ruoyi-ai-web:${RUOYI_WEB_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
|
||||
# Create Nginx configuration files for frontend services
|
||||
echo "正在将 Admin UI 的 Nginx 配置模板复制到临时位置..."
|
||||
cp ${SCRIPT_DIR}/template/nginx.admin.conf.template ${DEPLOY_DIR}/nginx.admin.conf.tmp
|
||||
|
||||
echo "正在临时文件中更新 Admin UI 的 Nginx 配置..."
|
||||
sed -i "s|{{BACKEND_HOST}}|$(escape_sed_replacement_string "${BACKEND_HOST}")|g" ${DEPLOY_DIR}/nginx.admin.conf.tmp
|
||||
sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/nginx.admin.conf.tmp
|
||||
|
||||
echo "正在将更新后的 Admin UI Nginx 配置移动到最终位置..."
|
||||
mv ${DEPLOY_DIR}/nginx.admin.conf.tmp ${DEPLOY_DIR}/ruoyi-admin/nginx.conf
|
||||
|
||||
echo "正在将 Web UI 的 Nginx 配置模板复制到临时位置..."
|
||||
cp ${SCRIPT_DIR}/template/nginx.web.conf.template ${DEPLOY_DIR}/nginx.web.conf.tmp
|
||||
|
||||
echo "正在临时文件中更新 Web UI 的 Nginx 配置..."
|
||||
sed -i "s|{{BACKEND_HOST}}|$(escape_sed_replacement_string "${BACKEND_HOST}")|g" ${DEPLOY_DIR}/nginx.web.conf.tmp
|
||||
sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/nginx.web.conf.tmp
|
||||
|
||||
echo "正在将更新后的 Web UI Nginx 配置移动到最终位置..."
|
||||
mv ${DEPLOY_DIR}/nginx.web.conf.tmp ${DEPLOY_DIR}/ruoyi-web/nginx.conf
|
||||
|
||||
# 为前端服务创建 Dockerfile
|
||||
echo "正在为 Admin UI 创建 Dockerfile..."
|
||||
cat > ${DEPLOY_DIR}/ruoyi-admin/Dockerfile << EOF
|
||||
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;"]
|
||||
EOF
|
||||
|
||||
echo "正在为 Web UI 创建 Dockerfile..."
|
||||
cat > ${DEPLOY_DIR}/ruoyi-web/Dockerfile << EOF
|
||||
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;"]
|
||||
EOF
|
||||
|
||||
# 构建后端服务
|
||||
echo "正在构建 Ruoyi-AI 后端服务..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-ai
|
||||
docker run -it --rm --name build-ruoyi-ai-backend -v ${DEPLOY_DIR}/ruoyi-ai:/code --entrypoint=/bin/bash maven:3.9.9-eclipse-temurin-17-alpine -c "cd /code && mvn clean package -P prod"
|
||||
|
||||
# 构建前端 Admin 服务
|
||||
echo "正在构建 Ruoyi-AI 前端 Admin 服务..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-admin
|
||||
docker run -it --rm --name build-ruoyi-ai-admin -v ${DEPLOY_DIR}/ruoyi-admin:/app -w /app node:20 sh -c "npm install -g pnpm && pnpm install && pnpm build"
|
||||
|
||||
# 构建前端 Web 服务
|
||||
echo "正在构建 Ruoyi-AI 前端 Web 服务..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-web
|
||||
docker run -it --rm --name build-ruoyi-ai-web -v ${DEPLOY_DIR}/ruoyi-web:/app -w /app node:20 sh -c "npm install -g pnpm && pnpm install && pnpm build"
|
||||
|
||||
# Build Docker images
|
||||
echo "Building Ruoyi-AI Backend Docker images..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-ai
|
||||
rm -rf temp
|
||||
mkdir temp
|
||||
cp ./ruoyi-admin/target/ruoyi-admin.jar temp/
|
||||
cd temp/
|
||||
cat > Dockerfile << EOF
|
||||
FROM openjdk:17-jdk-slim
|
||||
WORKDIR /app
|
||||
COPY ruoyi-admin.jar /app/ruoyi-admin.jar
|
||||
EXPOSE ${SERVER_PORT}
|
||||
ENTRYPOINT ["java","-jar","ruoyi-admin.jar","--spring.profiles.active=prod"]
|
||||
EOF
|
||||
docker build -t ruoyi-ai-backend:${RUOYI_AI_BRANCH} .
|
||||
cd ..
|
||||
|
||||
echo "Building Ruoyi-AI Admin Docker images..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-admin
|
||||
rm -rf temp
|
||||
mkdir temp
|
||||
cp ./apps/web-antd/dist.zip temp/
|
||||
cp Dockerfile temp/
|
||||
cp nginx.conf temp/
|
||||
cd temp/
|
||||
unzip dist.zip -d dist
|
||||
rm -f dist.zip
|
||||
docker build -t ruoyi-ai-admin:${RUOYI_ADMIN_BRANCH} .
|
||||
cd ..
|
||||
|
||||
echo "Building Ruoyi-AI Web Docker images..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-web
|
||||
rm -rf temp
|
||||
mkdir temp
|
||||
cp -pr ${DEPLOY_DIR}/ruoyi-web/dist temp/
|
||||
cp Dockerfile temp/
|
||||
cp nginx.conf temp/
|
||||
cd temp/
|
||||
docker build -t ruoyi-ai-web:${RUOYI_WEB_BRANCH} .
|
||||
cd ..
|
||||
else
|
||||
echo "跳过镜像构建过程。正在使用现有镜像直接部署..."
|
||||
|
||||
# 提示输入分支名称用于镜像标签
|
||||
read -p "请输入 ruoyi-ai-backend 镜像的标签 [main]: " RUOYI_AI_BRANCH
|
||||
RUOYI_AI_BRANCH="${RUOYI_AI_BRANCH:-main}"
|
||||
|
||||
read -p "请输入 ruoyi-ai-admin 镜像的标签 [main]: " RUOYI_ADMIN_BRANCH
|
||||
RUOYI_ADMIN_BRANCH="${RUOYI_ADMIN_BRANCH:-main}"
|
||||
|
||||
read -p "请输入 ruoyi-ai-web 镜像的标签 [main]: " RUOYI_WEB_BRANCH
|
||||
RUOYI_WEB_BRANCH="${RUOYI_WEB_BRANCH:-main}"
|
||||
|
||||
# 更新 docker-compose.yaml 文件中的镜像标签
|
||||
echo "正在更新 docker-compose.yaml 文件中的镜像标签..."
|
||||
sed -i "s|ruoyi-ai-backend:latest|ruoyi-ai-backend:${RUOYI_AI_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|ruoyi-ai-admin:latest|ruoyi-ai-admin:${RUOYI_ADMIN_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|ruoyi-ai-web:latest|ruoyi-ai-web:${RUOYI_WEB_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
fi
|
||||
|
||||
# Copy SQL file
|
||||
rm -rf ${DEPLOY_DIR}/mysql-init
|
||||
cp -pr ${SCRIPT_DIR}/mysql-init ${DEPLOY_DIR}/
|
||||
|
||||
# 使用配置值更新 SQL 文件
|
||||
echo "正在更新 SQL 配置值..."
|
||||
sed -i "s|'weaviate', 'host', '127.0.0.1:6038'|'weaviate', 'host', 'weaviate:8080'|g" ${DEPLOY_DIR}/mysql-init/01_ruoyi-ai.sql
|
||||
sed -i "s|'weaviate', 'protocol', 'http'|'weaviate', 'protocol', '${WEAVIATE_PROTOCOL}'|g" ${DEPLOY_DIR}/mysql-init/01_ruoyi-ai.sql
|
||||
sed -i "s|'weaviate', 'classname', 'LocalKnowledge'|'weaviate', 'classname', '${WEAVIATE_CLASSNAME}'|g" ${DEPLOY_DIR}/mysql-init/01_ruoyi-ai.sql
|
||||
|
||||
# 使用 Docker Compose 部署
|
||||
echo "正在使用 Docker Compose 进行部署..."
|
||||
cd ${DEPLOY_DIR}
|
||||
docker-compose down
|
||||
docker-compose up -d
|
||||
|
||||
echo "=================================================="
|
||||
echo " RuoYi-AI 部署完成"
|
||||
echo "=================================================="
|
||||
echo ""
|
||||
echo "您的 RuoYi-AI 系统已部署以下服务:"
|
||||
echo "- 后端 API: http://localhost:${SERVER_PORT}"
|
||||
echo "- Admin UI: http://localhost:${ADMIN_PORT}"
|
||||
echo "- Web UI: http://localhost:${WEB_PORT}"
|
||||
echo "- Weaviate: http://localhost:${WEAVIATE_HTTP_PORT}"
|
||||
echo ""
|
||||
echo "所有配置均已根据您的输入进行自定义。"
|
||||
echo "配置文件已更新为使用环境变量。"
|
||||
echo ""
|
||||
echo "感谢您使用 RuoYi-AI 交互式部署脚本!"
|
||||
519
docker-deploy/one-step-script/deploy-en.sh
Executable file
519
docker-deploy/one-step-script/deploy-en.sh
Executable file
@@ -0,0 +1,519 @@
|
||||
#!/bin/bash
|
||||
|
||||
# RuoYi-AI Interactive Deployment Script
|
||||
# This script helps configure and deploy the RuoYi-AI project with custom settings
|
||||
|
||||
set -e
|
||||
|
||||
echo "=================================================="
|
||||
echo " RuoYi-AI Interactive Deployment Script"
|
||||
echo "=================================================="
|
||||
echo ""
|
||||
echo "This script will guide you through the configuration and deployment of RuoYi-AI."
|
||||
echo "You will be prompted to enter various configuration parameters."
|
||||
echo ""
|
||||
|
||||
SCRIPT_DIR=${PWD}
|
||||
|
||||
# Prompt for deployment directory with default value
|
||||
read -p "Enter deployment directory [${PWD}/ruoyi-ai-deploy]: " user_input
|
||||
DEPLOY_DIR="${user_input:-${PWD}/ruoyi-ai-deploy}"
|
||||
|
||||
# Check if directory exists
|
||||
if [ -d "$DEPLOY_DIR" ]; then
|
||||
echo "Warning: Directory $DEPLOY_DIR already exists!"
|
||||
read -p "Do you want to delete it? [y/N]: " delete_choice
|
||||
|
||||
case "${delete_choice:-N}" in
|
||||
[Yy]* )
|
||||
echo "Deleting existing directory..."
|
||||
rm -rf "$DEPLOY_DIR"
|
||||
mkdir -p "$DEPLOY_DIR"
|
||||
echo "Directory has been recreated."
|
||||
;;
|
||||
* )
|
||||
echo "Keeping existing directory."
|
||||
;;
|
||||
esac
|
||||
else
|
||||
mkdir -p "$DEPLOY_DIR"
|
||||
echo "Directory created at $DEPLOY_DIR"
|
||||
fi
|
||||
|
||||
echo "Selected deployment directory: $DEPLOY_DIR"
|
||||
|
||||
mkdir -p ${DEPLOY_DIR}/{data/mysql,data/redis,data/logs,data/weaviate}
|
||||
cd ${DEPLOY_DIR}
|
||||
|
||||
# Function to prompt for a value with a default
|
||||
prompt_with_default() {
|
||||
local prompt=$1
|
||||
local default=$2
|
||||
local var_name=$3
|
||||
|
||||
read -p "${prompt} [${default}]: " input
|
||||
if [ -z "$input" ]; then
|
||||
eval "${var_name}=\"${default}\""
|
||||
else
|
||||
eval "${var_name}=\"${input}\""
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to prompt for a password with masking
|
||||
prompt_for_password() {
|
||||
local prompt=$1
|
||||
local default=$2
|
||||
local var_name=$3
|
||||
|
||||
read -sp "${prompt} [default: ${default}]: " input
|
||||
echo ""
|
||||
if [ -z "$input" ]; then
|
||||
eval "${var_name}=\"${default}\""
|
||||
else
|
||||
eval "${var_name}=\"${input}\""
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to escape special characters for sed replacement string
|
||||
escape_sed_replacement_string() {
|
||||
# Escape &, \, and the delimiter | for the sed replacement string
|
||||
echo "$1" | sed -e 's/[&\\|]/\\&/g'
|
||||
}
|
||||
|
||||
echo "=== General Configuration ==="
|
||||
prompt_with_default "Time Zone" "Asia/Shanghai" "TZ"
|
||||
|
||||
echo ""
|
||||
echo "=== MySQL Configuration ==="
|
||||
prompt_with_default "MySQL Port" "3306" "MYSQL_PORT"
|
||||
prompt_with_default "MySQL Database Name" "ruoyi-ai" "MYSQL_DATABASE"
|
||||
prompt_for_password "MySQL root Password" "root" "MYSQL_ROOT_PASSWORD"
|
||||
|
||||
echo ""
|
||||
echo "=== Redis Configuration ==="
|
||||
prompt_with_default "Redis Port" "6379" "REDIS_PORT"
|
||||
prompt_for_password "Redis Password (leave empty for no password)" "" "REDIS_PASSWORD"
|
||||
prompt_with_default "Redis Database Index" "0" "REDIS_DATABASE"
|
||||
prompt_with_default "Redis Connection Timeout" "10s" "REDIS_TIMEOUT"
|
||||
|
||||
echo ""
|
||||
echo "=== Backend Service Configuration ==="
|
||||
prompt_with_default "Backend Service Port" "6039" "SERVER_PORT"
|
||||
prompt_with_default "Backend Service Hostname" "ruoyi-backend" "BACKEND_HOST"
|
||||
prompt_with_default "Database Username" "root" "DB_USERNAME"
|
||||
prompt_for_password "Database Password" "root" "DB_PASSWORD"
|
||||
|
||||
echo ""
|
||||
echo "=== Frontend Service Configuration ==="
|
||||
prompt_with_default "Admin UI Port" "8082" "ADMIN_PORT"
|
||||
prompt_with_default "Web UI Port" "8081" "WEB_PORT"
|
||||
|
||||
echo ""
|
||||
echo "=== Weaviate Vector Database Configuration ==="
|
||||
prompt_with_default "Weaviate HTTP Port" "50050" "WEAVIATE_HTTP_PORT"
|
||||
prompt_with_default "Weaviate gRPC Port" "50051" "WEAVIATE_GRPC_PORT"
|
||||
prompt_with_default "Weaviate Query Limit" "25" "WEAVIATE_QUERY_LIMIT"
|
||||
prompt_with_default "Weaviate Anonymous Access" "true" "WEAVIATE_ANONYMOUS_ACCESS"
|
||||
prompt_with_default "Weaviate Data Path" "/var/lib/weaviate" "WEAVIATE_DATA_PATH"
|
||||
prompt_with_default "Weaviate Vectorizer Module" "none" "WEAVIATE_VECTORIZER_MODULE"
|
||||
prompt_with_default "Weaviate Modules" "text2vec-cohere,text2vec-huggingface,text2vec-palm,text2vec-openai,generative-openai,generative-cohere,generative-palm,ref2vec-centroid,reranker-cohere,qna-openai" "WEAVIATE_MODULES"
|
||||
prompt_with_default "Weaviate Cluster Hostname" "node1" "WEAVIATE_CLUSTER_HOSTNAME"
|
||||
prompt_with_default "Weaviate Protocol" "http" "WEAVIATE_PROTOCOL"
|
||||
prompt_with_default "Weaviate Class Name" "LocalKnowledge" "WEAVIATE_CLASSNAME"
|
||||
|
||||
echo ""
|
||||
echo "=== Production Environment Configuration ==="
|
||||
prompt_with_default "Production Database URL" "jdbc:mysql://mysql:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true" "PROD_DB_URL"
|
||||
prompt_with_default "Production Database Username" "root" "PROD_DB_USERNAME"
|
||||
prompt_for_password "Production Database Password" "root" "PROD_DB_PASSWORD"
|
||||
prompt_with_default "Production Redis Host" "redis" "PROD_REDIS_HOST"
|
||||
prompt_with_default "Production Redis Port" "6379" "PROD_REDIS_PORT"
|
||||
prompt_with_default "Production Redis Database" "0" "PROD_REDIS_DATABASE"
|
||||
prompt_for_password "Production Redis Password (leave empty for no password)" "" "PROD_REDIS_PASSWORD"
|
||||
prompt_with_default "Production Redis Timeout" "10s" "PROD_REDIS_TIMEOUT"
|
||||
|
||||
echo ""
|
||||
echo "=== Frontend Configuration ==="
|
||||
prompt_with_default "Frontend API Base URL" "http://${BACKEND_HOST}:${SERVER_PORT}" "FRONTEND_API_BASE_URL"
|
||||
prompt_with_default "Frontend Development Server Port" "3000" "FRONTEND_DEV_PORT"
|
||||
|
||||
# Copy template files
|
||||
cp ${SCRIPT_DIR}/template/.env.template ${DEPLOY_DIR}/.env
|
||||
cp ${SCRIPT_DIR}/template/docker-compose.yaml.template ${DEPLOY_DIR}/docker-compose.yaml
|
||||
|
||||
echo "Template files copied to deployment directory."
|
||||
|
||||
# Replace placeholders in .env file
|
||||
echo "Updating .env file with your configuration..."
|
||||
sed -i "s|{{TZ}}|$(escape_sed_replacement_string "${TZ}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{MYSQL_ROOT_PASSWORD}}|$(escape_sed_replacement_string "${MYSQL_ROOT_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{MYSQL_DATABASE}}|$(escape_sed_replacement_string "${MYSQL_DATABASE}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{MYSQL_PORT}}|$(escape_sed_replacement_string "${MYSQL_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{REDIS_PORT}}|$(escape_sed_replacement_string "${REDIS_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{REDIS_PASSWORD}}|$(escape_sed_replacement_string "${REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{REDIS_DATABASE}}|$(escape_sed_replacement_string "${REDIS_DATABASE}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{DB_URL}}|$(escape_sed_replacement_string "jdbc:mysql://mysql:3306/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{DB_USERNAME}}|$(escape_sed_replacement_string "${DB_USERNAME}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{DB_PASSWORD}}|$(escape_sed_replacement_string "${DB_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{BACKEND_HOST}}|$(escape_sed_replacement_string "${BACKEND_HOST}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{ADMIN_PORT}}|$(escape_sed_replacement_string "${ADMIN_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEB_PORT}}|$(escape_sed_replacement_string "${WEB_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{FRONTEND_API_BASE_URL}}|$(escape_sed_replacement_string "${FRONTEND_API_BASE_URL}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{FRONTEND_DEV_PORT}}|$(escape_sed_replacement_string "${FRONTEND_DEV_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_HTTP_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_HTTP_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_GRPC_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_GRPC_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_QUERY_LIMIT}}|$(escape_sed_replacement_string "${WEAVIATE_QUERY_LIMIT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_ANONYMOUS_ACCESS}}|$(escape_sed_replacement_string "${WEAVIATE_ANONYMOUS_ACCESS}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_DATA_PATH}}|$(escape_sed_replacement_string "${WEAVIATE_DATA_PATH}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_VECTORIZER_MODULE}}|$(escape_sed_replacement_string "${WEAVIATE_VECTORIZER_MODULE}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_MODULES}}|$(escape_sed_replacement_string "${WEAVIATE_MODULES}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_CLUSTER_HOSTNAME}}|$(escape_sed_replacement_string "${WEAVIATE_CLUSTER_HOSTNAME}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_PROTOCOL}}|$(escape_sed_replacement_string "${WEAVIATE_PROTOCOL}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{WEAVIATE_CLASSNAME}}|$(escape_sed_replacement_string "${WEAVIATE_CLASSNAME}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_DB_URL}}|$(escape_sed_replacement_string "${PROD_DB_URL}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_DB_USERNAME}}|$(escape_sed_replacement_string "${PROD_DB_USERNAME}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_DB_PASSWORD}}|$(escape_sed_replacement_string "${PROD_DB_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_HOST}}|$(escape_sed_replacement_string "${PROD_REDIS_HOST}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_PORT}}|$(escape_sed_replacement_string "${PROD_REDIS_PORT}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_DATABASE}}|$(escape_sed_replacement_string "${PROD_REDIS_DATABASE}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_PASSWORD}}|$(escape_sed_replacement_string "${PROD_REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/.env
|
||||
sed -i "s|{{PROD_REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${PROD_REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/.env
|
||||
|
||||
echo ".env file has been updated with your configuration."
|
||||
|
||||
# Replace placeholders in docker-compose.yaml file
|
||||
echo "Updating docker-compose.yaml file with your configuration..."
|
||||
|
||||
# Determine Redis command arguments based on password
|
||||
#if [ -n "${REDIS_PASSWORD}" ]; then
|
||||
# REDIS_COMMAND_ARGS="--requirepass $(escape_sed_replacement_string "${REDIS_PASSWORD}")"
|
||||
#else
|
||||
# REDIS_COMMAND_ARGS=""
|
||||
#fi
|
||||
|
||||
sed -i "s|{{MYSQL_ROOT_PASSWORD}}|$(escape_sed_replacement_string "${MYSQL_ROOT_PASSWORD}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{MYSQL_DATABASE}}|$(escape_sed_replacement_string "${MYSQL_DATABASE}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{MYSQL_PORT}}|$(escape_sed_replacement_string "${MYSQL_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_PORT}}|$(escape_sed_replacement_string "${REDIS_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_COMMAND_ARGS}}|$(escape_sed_replacement_string "${REDIS_COMMAND_ARGS}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_HTTP_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_HTTP_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_GRPC_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_GRPC_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_QUERY_LIMIT}}|$(escape_sed_replacement_string "${WEAVIATE_QUERY_LIMIT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_ANONYMOUS_ACCESS}}|$(escape_sed_replacement_string "${WEAVIATE_ANONYMOUS_ACCESS}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_DATA_PATH}}|$(escape_sed_replacement_string "${WEAVIATE_DATA_PATH}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_VECTORIZER_MODULE}}|$(escape_sed_replacement_string "${WEAVIATE_VECTORIZER_MODULE}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_MODULES}}|$(escape_sed_replacement_string "${WEAVIATE_MODULES}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEAVIATE_CLUSTER_HOSTNAME}}|$(escape_sed_replacement_string "${WEAVIATE_CLUSTER_HOSTNAME}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{DB_URL}}|$(escape_sed_replacement_string "jdbc:mysql://mysql:3306/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{DB_USERNAME}}|$(escape_sed_replacement_string "${DB_USERNAME}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{DB_PASSWORD}}|$(escape_sed_replacement_string "${DB_PASSWORD}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_HOST}}|redis|g" ${DEPLOY_DIR}/docker-compose.yaml # REDIS_HOST is hardcoded to 'redis' in docker-compose
|
||||
sed -i "s|{{REDIS_DATABASE}}|$(escape_sed_replacement_string "${REDIS_DATABASE}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_PASSWORD}}|$(escape_sed_replacement_string "${REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{TZ}}|$(escape_sed_replacement_string "${TZ}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{ADMIN_PORT}}|$(escape_sed_replacement_string "${ADMIN_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|{{WEB_PORT}}|$(escape_sed_replacement_string "${WEB_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
|
||||
echo ""
|
||||
echo "=== Build or Deploy Options ==="
|
||||
read -p "Do you want to build new images (B) or deploy directly using existing images (D)?[B/d]: " build_or_deploy_choice
|
||||
BUILD_CHOICE="${build_or_deploy_choice:-B}" # Default to Build
|
||||
|
||||
if [[ "${BUILD_CHOICE}" == [Bb]* ]]; then
|
||||
echo "Image build process in progress..."
|
||||
|
||||
# Clone ruoyi-ai-backend repositories
|
||||
if [ -d "${DEPLOY_DIR}/ruoyi-ai" ]; then
|
||||
echo "Directory ${DEPLOY_DIR}/ruoyi-ai already exists."
|
||||
read -p "Do you want to delete it and clone a new copy?[Y/n]: " answer
|
||||
case ${answer:-Y} in
|
||||
[Yy]* )
|
||||
echo "Deleting existing directory..."
|
||||
rm -rf ${DEPLOY_DIR}/ruoyi-ai
|
||||
echo "Cloning ruoyi-ai-backend repository..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-ai
|
||||
|
||||
# Prompt for branch selection
|
||||
read -p "Please enter the branch name for ruoyi-ai repository [main]: " RUOYI_AI_BRANCH
|
||||
RUOYI_AI_BRANCH="${RUOYI_AI_BRANCH:-main}"
|
||||
echo "Switching to branch: ${RUOYI_AI_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-ai && git checkout ${RUOYI_AI_BRANCH}
|
||||
cd ..
|
||||
;;
|
||||
[Nn]* )
|
||||
echo "Skipping clone operation."
|
||||
;;
|
||||
* )
|
||||
echo "Invalid input. Skipping clone operation."
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "Cloning ruoyi-ai-backend repository..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-ai
|
||||
|
||||
# Prompt for branch selection
|
||||
read -p "Please enter the branch name for ruoyi-ai repository [main]: " RUOYI_AI_BRANCH
|
||||
RUOYI_AI_BRANCH="${RUOYI_AI_BRANCH:-main}"
|
||||
echo "Switching to branch: ${RUOYI_AI_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-ai && git checkout ${RUOYI_AI_BRANCH}
|
||||
cd ..
|
||||
fi
|
||||
|
||||
# Clone ruoyi-ai-admin repositories
|
||||
if [ -d "${DEPLOY_DIR}/ruoyi-admin" ]; then
|
||||
echo "Directory ${DEPLOY_DIR}/ruoyi-admin already exists."
|
||||
read -p "Do you want to delete it and clone a new copy?[Y/n]: " answer
|
||||
case ${answer:-Y} in
|
||||
[Yy]* )
|
||||
echo "Deleting existing directory..."
|
||||
rm -rf ${DEPLOY_DIR}/ruoyi-admin
|
||||
echo "Cloning ruoyi-admin repository..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-admin
|
||||
|
||||
# Prompt for branch selection
|
||||
read -p "Please enter the branch name for ruoyi-admin repository [main]: " RUOYI_ADMIN_BRANCH
|
||||
RUOYI_ADMIN_BRANCH="${RUOYI_ADMIN_BRANCH:-main}"
|
||||
echo "Switching to branch: ${RUOYI_ADMIN_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-admin && git checkout ${RUOYI_ADMIN_BRANCH}
|
||||
cd ..
|
||||
;;
|
||||
[Nn]* )
|
||||
echo "Skipping clone operation."
|
||||
;;
|
||||
* )
|
||||
echo "Invalid input. Skipping clone operation."
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "Cloning ruoyi-ai-admin repository..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-admin
|
||||
|
||||
# Prompt for branch selection
|
||||
read -p "Please enter the branch name for ruoyi-admin repository [main]: " RUOYI_ADMIN_BRANCH
|
||||
RUOYI_ADMIN_BRANCH="${RUOYI_ADMIN_BRANCH:-main}"
|
||||
echo "Switching to branch: ${RUOYI_ADMIN_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-admin && git checkout ${RUOYI_ADMIN_BRANCH}
|
||||
cd ..
|
||||
fi
|
||||
|
||||
# Clone ruoyi-ai-web repositories
|
||||
if [ -d "${DEPLOY_DIR}/ruoyi-web" ]; then
|
||||
echo "Directory ${DEPLOY_DIR}/ruoyi-web already exists."
|
||||
read -p "Do you want to delete it and clone a new copy?[Y/n]: " answer
|
||||
case ${answer:-Y} in
|
||||
[Yy]* )
|
||||
echo "Deleting existing directory..."
|
||||
rm -rf ${DEPLOY_DIR}/ruoyi-web
|
||||
echo "Cloning ruoyi-ai-web repository..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-web
|
||||
|
||||
# Prompt for branch selection
|
||||
read -p "Please enter the branch name for ruoyi-web repository [main]: " RUOYI_WEB_BRANCH
|
||||
RUOYI_WEB_BRANCH="${RUOYI_WEB_BRANCH:-main}"
|
||||
echo "Switching to branch: ${RUOYI_WEB_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-web && git checkout ${RUOYI_WEB_BRANCH}
|
||||
cd ..
|
||||
;;
|
||||
[Nn]* )
|
||||
echo "Skipping clone operation."
|
||||
;;
|
||||
* )
|
||||
echo "Invalid input. Skipping clone operation."
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "Cloning ruoyi-ai-web repository..."
|
||||
cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-web
|
||||
|
||||
# Prompt for branch selection
|
||||
read -p "Please enter the branch name for ruoyi-web repository [main]: " RUOYI_WEB_BRANCH
|
||||
RUOYI_WEB_BRANCH="${RUOYI_WEB_BRANCH:-main}"
|
||||
echo "Switching to branch: ${RUOYI_WEB_BRANCH}"
|
||||
cd ${DEPLOY_DIR}/ruoyi-web && git checkout ${RUOYI_WEB_BRANCH}
|
||||
cd ..
|
||||
fi
|
||||
|
||||
# Update application-prod.yml file
|
||||
echo "Updating application-prod.yml file with your configuration..."
|
||||
# Copy application-prod.yml template
|
||||
cp ${SCRIPT_DIR}/template/application-prod.yml.template ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
|
||||
# Replace placeholders in application-prod.yml
|
||||
sed -i "s|{{PROD_DB_URL}}|$(escape_sed_replacement_string "${PROD_DB_URL}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_DB_USERNAME}}|$(escape_sed_replacement_string "${PROD_DB_USERNAME}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_DB_PASSWORD}}|$(escape_sed_replacement_string "${PROD_DB_PASSWORD}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_REDIS_HOST}}|$(escape_sed_replacement_string "${PROD_REDIS_HOST}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_REDIS_PORT}}|$(escape_sed_replacement_string "${PROD_REDIS_PORT}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
sed -i "s|{{PROD_REDIS_DATABASE}}|$(escape_sed_replacement_string "${PROD_REDIS_DATABASE}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
if [ -z "${PROD_REDIS_PASSWORD}" ]; then
|
||||
sed -i "s/^ password: {{PROD_REDIS_PASSWORD}}/# password: {{PROD_REDIS_PASSWORD}}/g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
else
|
||||
sed -i "s|{{PROD_REDIS_PASSWORD}}|$(escape_sed_replacement_string "${PROD_REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
fi
|
||||
sed -i "s|{{PROD_REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${PROD_REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
|
||||
|
||||
# Update vite.config.mts file
|
||||
echo "Updating vite.config.mts file with your configuration..."
|
||||
sed -i "s|http://127.0.0.1:6039|${FRONTEND_API_BASE_URL}|g" ${DEPLOY_DIR}/ruoyi-admin/apps/web-antd/vite.config.mts
|
||||
|
||||
# Update image tags in docker-compose.yaml file
|
||||
echo "Updating image tags in docker-compose.yaml file..."
|
||||
sed -i "s|ruoyi-ai-backend:latest|ruoyi-ai-backend:${RUOYI_AI_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|ruoyi-ai-admin:latest|ruoyi-ai-admin:${RUOYI_ADMIN_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|ruoyi-ai-web:latest|ruoyi-ai-web:${RUOYI_WEB_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
|
||||
# Create Nginx configuration files for frontend services
|
||||
echo "Copying Admin UI Nginx configuration template to temporary location..."
|
||||
cp ${SCRIPT_DIR}/template/nginx.admin.conf.template ${DEPLOY_DIR}/nginx.admin.conf.tmp
|
||||
|
||||
echo "Updating Admin UI Nginx configuration in temporary file..."
|
||||
sed -i "s|{{BACKEND_HOST}}|$(escape_sed_replacement_string "${BACKEND_HOST}")|g" ${DEPLOY_DIR}/nginx.admin.conf.tmp
|
||||
sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/nginx.admin.conf.tmp
|
||||
|
||||
echo "Moving updated Admin UI Nginx configuration to final location..."
|
||||
mv ${DEPLOY_DIR}/nginx.admin.conf.tmp ${DEPLOY_DIR}/ruoyi-admin/nginx.conf
|
||||
|
||||
echo "Copying Web UI Nginx configuration template to temporary location..."
|
||||
cp ${SCRIPT_DIR}/template/nginx.web.conf.template ${DEPLOY_DIR}/nginx.web.conf.tmp
|
||||
|
||||
echo "Updating Web UI Nginx configuration in temporary file..."
|
||||
sed -i "s|{{BACKEND_HOST}}|$(escape_sed_replacement_string "${BACKEND_HOST}")|g" ${DEPLOY_DIR}/nginx.web.conf.tmp
|
||||
sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/nginx.web.conf.tmp
|
||||
|
||||
echo "Moving updated Web UI Nginx configuration to final location..."
|
||||
mv ${DEPLOY_DIR}/nginx.web.conf.tmp ${DEPLOY_DIR}/ruoyi-web/nginx.conf
|
||||
|
||||
# Create Dockerfiles for frontend services
|
||||
echo "Creating Dockerfile for Admin UI..."
|
||||
cat > ${DEPLOY_DIR}/ruoyi-admin/Dockerfile << EOF
|
||||
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;"]
|
||||
EOF
|
||||
|
||||
echo "Creating Dockerfile for Web UI..."
|
||||
cat > ${DEPLOY_DIR}/ruoyi-web/Dockerfile << EOF
|
||||
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;"]
|
||||
EOF
|
||||
|
||||
# Build backend service
|
||||
echo "Building Ruoyi-AI backend service..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-ai
|
||||
docker run -it --rm --name build-ruoyi-ai-backend -v ${DEPLOY_DIR}/ruoyi-ai:/code --entrypoint=/bin/bash maven:3.9.9-eclipse-temurin-17-alpine -c "cd /code && mvn clean package -P prod"
|
||||
|
||||
# Build frontend Admin service
|
||||
echo "Building Ruoyi-AI frontend Admin service..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-admin
|
||||
docker run -it --rm --name build-ruoyi-ai-admin -v ${DEPLOY_DIR}/ruoyi-admin:/app -w /app node:20 sh -c "npm install -g pnpm && pnpm install && pnpm build"
|
||||
|
||||
# Build frontend Web service
|
||||
echo "Building Ruoyi-AI frontend Web service..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-web
|
||||
docker run -it --rm --name build-ruoyi-ai-web -v ${DEPLOY_DIR}/ruoyi-web:/app -w /app node:20 sh -c "npm install -g pnpm && pnpm install && pnpm build"
|
||||
|
||||
# Build Docker images
|
||||
echo "Building Ruoyi-AI Backend Docker images..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-ai
|
||||
rm -rf temp
|
||||
mkdir temp
|
||||
cp ./ruoyi-admin/target/ruoyi-admin.jar temp/
|
||||
cd temp/
|
||||
cat > Dockerfile << EOF
|
||||
FROM openjdk:17-jdk-slim
|
||||
WORKDIR /app
|
||||
COPY ruoyi-admin.jar /app/ruoyi-admin.jar
|
||||
EXPOSE ${SERVER_PORT}
|
||||
ENTRYPOINT ["java","-jar","ruoyi-admin.jar","--spring.profiles.active=prod"]
|
||||
EOF
|
||||
docker build -t ruoyi-ai-backend:${RUOYI_AI_BRANCH} .
|
||||
cd ..
|
||||
|
||||
echo "Building Ruoyi-AI Admin Docker images..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-admin
|
||||
rm -rf temp
|
||||
mkdir temp
|
||||
cp ./apps/web-antd/dist.zip temp/
|
||||
cp Dockerfile temp/
|
||||
cp nginx.conf temp/
|
||||
cd temp/
|
||||
unzip dist.zip -d dist
|
||||
rm -f dist.zip
|
||||
docker build -t ruoyi-ai-admin:${RUOYI_ADMIN_BRANCH} .
|
||||
cd ..
|
||||
|
||||
echo "Building Ruoyi-AI Web Docker images..."
|
||||
cd ${DEPLOY_DIR}/ruoyi-web
|
||||
rm -rf temp
|
||||
mkdir temp
|
||||
cp -pr ${DEPLOY_DIR}/ruoyi-web/dist temp/
|
||||
cp Dockerfile temp/
|
||||
cp nginx.conf temp/
|
||||
cd temp/
|
||||
docker build -t ruoyi-ai-web:${RUOYI_WEB_BRANCH} .
|
||||
cd ..
|
||||
else
|
||||
echo "Skipping image build process. Deploying directly using existing images..."
|
||||
|
||||
# Prompt for branch names to use as image tags
|
||||
read -p "Please enter the tag for ruoyi-ai-backend image [main]: " RUOYI_AI_BRANCH
|
||||
RUOYI_AI_BRANCH="${RUOYI_AI_BRANCH:-main}"
|
||||
|
||||
read -p "Please enter the tag for ruoyi-ai-admin image [main]: " RUOYI_ADMIN_BRANCH
|
||||
RUOYI_ADMIN_BRANCH="${RUOYI_ADMIN_BRANCH:-main}"
|
||||
|
||||
read -p "Please enter the tag for ruoyi-ai-web image [main]: " RUOYI_WEB_BRANCH
|
||||
RUOYI_WEB_BRANCH="${RUOYI_WEB_BRANCH:-main}"
|
||||
|
||||
# Update image tags in docker-compose.yaml file
|
||||
echo "Updating image tags in docker-compose.yaml file..."
|
||||
sed -i "s|ruoyi-ai-backend:latest|ruoyi-ai-backend:${RUOYI_AI_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|ruoyi-ai-admin:latest|ruoyi-ai-admin:${RUOYI_ADMIN_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
sed -i "s|ruoyi-ai-web:latest|ruoyi-ai-web:${RUOYI_WEB_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
|
||||
fi
|
||||
|
||||
# Copy SQL file
|
||||
rm -rf ${DEPLOY_DIR}/mysql-init
|
||||
cp -pr ${SCRIPT_DIR}/mysql-init ${DEPLOY_DIR}/
|
||||
|
||||
# Update SQL file with configuration values
|
||||
echo "Updating SQL configuration values..."
|
||||
sed -i "s|'weaviate', 'host', '127.0.0.1:6038'|'weaviate', 'host', 'weaviate:8080'|g" ${DEPLOY_DIR}/mysql-init/01_ruoyi-ai.sql
|
||||
sed -i "s|'weaviate', 'protocol', 'http'|'weaviate', 'protocol', '${WEAVIATE_PROTOCOL}'|g" ${DEPLOY_DIR}/mysql-init/01_ruoyi-ai.sql
|
||||
sed -i "s|'weaviate', 'classname', 'LocalKnowledge'|'weaviate', 'classname', '${WEAVIATE_CLASSNAME}'|g" ${DEPLOY_DIR}/mysql-init/01_ruoyi-ai.sql
|
||||
|
||||
# Deploy using Docker Compose
|
||||
echo "Deploying with Docker Compose..."
|
||||
cd ${DEPLOY_DIR}
|
||||
docker-compose down
|
||||
docker-compose up -d
|
||||
|
||||
echo "=================================================="
|
||||
echo " RuoYi-AI Deployment Complete"
|
||||
echo "=================================================="
|
||||
echo ""
|
||||
echo "Your RuoYi-AI system has deployed the following services:"
|
||||
echo "- Backend API: http://localhost:${SERVER_PORT}"
|
||||
echo "- Admin UI: http://localhost:${ADMIN_PORT}"
|
||||
echo "- Web UI: http://localhost:${WEB_PORT}"
|
||||
echo "- Weaviate: http://localhost:${WEAVIATE_HTTP_PORT}"
|
||||
echo ""
|
||||
echo "All configurations have been customized according to your inputs."
|
||||
echo "Configuration files have been updated to use environment variables."
|
||||
echo ""
|
||||
echo "Thank you for using the RuoYi-AI interactive deployment script!"
|
||||
2687
docker-deploy/one-step-script/mysql-init/01_ruoyi-ai.sql
Normal file
2687
docker-deploy/one-step-script/mysql-init/01_ruoyi-ai.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
||||
INSERT INTO `chat_model` (`id`, `tenant_id`, `category`, `model_name`, `model_describe`, `model_price`, `model_type`, `model_show`, `system_prompt`, `api_host`, `api_key`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1907575746601119746, '000000', 'vector', 'text-embedding-3-small', 'text-embedding-3-small', 0, '2', '0', NULL, 'https://api.pandarobot.chat/', 'sk-cdBlIaZcufccm2RaDe547cBd054d49C7B0782eCa72A0052b', 103, 1, '2025-04-03 07:27:54', 1, '2025-04-03 07:27:54', 'text-embedding-3-small');
|
||||
INSERT INTO `chat_model` (`id`, `tenant_id`, `category`, `model_name`, `model_describe`, `model_price`, `model_type`, `model_show`, `system_prompt`, `api_host`, `api_key`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1907576007017066497, '000000', 'vector', 'quentinz/bge-large-zh-v1.5', 'bge-large-zh-v1.5', 0, '2', '0', NULL, 'http://127.0.0.1:11434/', 'cdBlIaZcufccm2RaDe547cBd054d49C7B0782eCa72A0052b', 103, 1, '2025-04-03 07:28:56', 1, '2025-04-03 07:28:56', 'bge-large-zh-v1.5');
|
||||
INSERT INTO `chat_model` (`id`, `tenant_id`, `category`, `model_name`, `model_describe`, `model_price`, `model_type`, `model_show`, `system_prompt`, `api_host`, `api_key`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1907576806191362049, '000000', 'vector', 'nomic-embed-text', 'nomic-embed-text', 0, '2', '0', NULL, 'http://127.0.0.1:11434/', 'nomic-embed-text', 103, 1, '2025-04-03 07:32:06', 1, '2025-04-03 07:32:06', 'nomic-embed-text');
|
||||
INSERT INTO `chat_model` (`id`, `tenant_id`, `category`, `model_name`, `model_describe`, `model_price`, `model_type`, `model_show`, `system_prompt`, `api_host`, `api_key`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1907577073490161665, '000000', 'vector', 'snowflake-arctic-embed', 'snowflake-arctic-embed', 0, '2', '0', NULL, 'http://127.0.0.1:11434/', 'snowflake-arctic-embed', 103, 1, '2025-04-03 07:33:10', 1, '2025-04-03 07:33:10', 'snowflake-arctic-embed');
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
Navicat MySQL Data Transfer
|
||||
|
||||
Source Server : 129.211.24.7
|
||||
Source Server Type : MySQL
|
||||
Source Server Version : 50744
|
||||
Source Host : 129.211.24.7:3306
|
||||
Source Schema : ry-vue
|
||||
|
||||
Target Server Type : MySQL
|
||||
Target Server Version : 50744
|
||||
File Encoding : 65001
|
||||
|
||||
Date: 05/05/2025 15:01:08
|
||||
*/
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for chat_session
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `chat_session`;
|
||||
CREATE TABLE `chat_session` (
|
||||
`id` bigint(20) NOT NULL COMMENT '主键',
|
||||
`user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id',
|
||||
`session_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '会话标题',
|
||||
`session_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '会话内容',
|
||||
`create_dept` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门',
|
||||
`create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
|
||||
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
||||
`update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
|
||||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '会话管理' ROW_FORMAT = Dynamic;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
ALTER TABLE `chat_message`
|
||||
ADD COLUMN `session_id` bigint(20) NULL COMMENT '会话id' AFTER `id`;
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
ALTER TABLE `chat_model`
|
||||
ADD COLUMN `api_url` varchar(50) NULL COMMENT '请求后缀' AFTER `api_key`;
|
||||
|
||||
INSERT INTO `chat_config` (`id`, `category`, `config_name`, `config_value`, `config_dict`, `create_dept`, `create_time`, `create_by`, `update_by`, `update_time`, `remark`, `version`, `del_flag`, `update_ip`, `tenant_id`) VALUES (1779450794872414211, 'chat', 'apiUrl', 'v1/chat/completions', 'API 请求后缀', 103, '2024-04-14 18:05:05', '1', '1', '2025-04-23 22:29:04', NULL, NULL, '0', NULL, 0);
|
||||
50
docker-deploy/one-step-script/template/.env.template
Normal file
50
docker-deploy/one-step-script/template/.env.template
Normal file
@@ -0,0 +1,50 @@
|
||||
# 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}}
|
||||
@@ -0,0 +1,89 @@
|
||||
---
|
||||
# 数据源配置
|
||||
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: '*'
|
||||
@@ -0,0 +1,115 @@
|
||||
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
|
||||
@@ -0,0 +1,22 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user