From 1093888889fb10fae112c148b54ec9dbf993b8ac Mon Sep 17 00:00:00 2001 From: root <peng.alan@gmail.com> Date: 星期日, 18 五月 2025 15:58:34 +0800 Subject: [PATCH] fix the deploy-en.sh by dos2unix command --- docker-deploy/one-step-script/deploy-en.sh | 1038 ++++++++++++++++++++++++++++---------------------------- 1 files changed, 519 insertions(+), 519 deletions(-) diff --git a/docker-deploy/one-step-script/deploy-en.sh b/docker-deploy/one-step-script/deploy-en.sh index 6d36f6a..525928c 100755 --- a/docker-deploy/one-step-script/deploy-en.sh +++ b/docker-deploy/one-step-script/deploy-en.sh @@ -1,519 +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!" +#!/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!" -- Gitblit v1.9.3