deploy-en.sh 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. #!/bin/bash
  2. # RuoYi-AI Interactive Deployment Script
  3. # This script helps configure and deploy the RuoYi-AI project with custom settings
  4. set -e
  5. echo "=================================================="
  6. echo " RuoYi-AI Interactive Deployment Script"
  7. echo "=================================================="
  8. echo ""
  9. echo "This script will guide you through the configuration and deployment of RuoYi-AI."
  10. echo "You will be prompted to enter various configuration parameters."
  11. echo ""
  12. SCRIPT_DIR=${PWD}
  13. # Prompt for deployment directory with default value
  14. read -p "Enter deployment directory [${PWD}/ruoyi-ai-deploy]: " user_input
  15. DEPLOY_DIR="${user_input:-${PWD}/ruoyi-ai-deploy}"
  16. # Check if directory exists
  17. if [ -d "$DEPLOY_DIR" ]; then
  18. echo "Warning: Directory $DEPLOY_DIR already exists!"
  19. read -p "Do you want to delete it? [y/N]: " delete_choice
  20. case "${delete_choice:-N}" in
  21. [Yy]* )
  22. echo "Deleting existing directory..."
  23. rm -rf "$DEPLOY_DIR"
  24. mkdir -p "$DEPLOY_DIR"
  25. echo "Directory has been recreated."
  26. ;;
  27. * )
  28. echo "Keeping existing directory."
  29. ;;
  30. esac
  31. else
  32. mkdir -p "$DEPLOY_DIR"
  33. echo "Directory created at $DEPLOY_DIR"
  34. fi
  35. echo "Selected deployment directory: $DEPLOY_DIR"
  36. mkdir -p ${DEPLOY_DIR}/{data/mysql,data/redis,data/logs,data/weaviate}
  37. cd ${DEPLOY_DIR}
  38. # Function to prompt for a value with a default
  39. prompt_with_default() {
  40. local prompt=$1
  41. local default=$2
  42. local var_name=$3
  43. read -p "${prompt} [${default}]: " input
  44. if [ -z "$input" ]; then
  45. eval "${var_name}=\"${default}\""
  46. else
  47. eval "${var_name}=\"${input}\""
  48. fi
  49. }
  50. # Function to prompt for a password with masking
  51. prompt_for_password() {
  52. local prompt=$1
  53. local default=$2
  54. local var_name=$3
  55. read -sp "${prompt} [default: ${default}]: " input
  56. echo ""
  57. if [ -z "$input" ]; then
  58. eval "${var_name}=\"${default}\""
  59. else
  60. eval "${var_name}=\"${input}\""
  61. fi
  62. }
  63. # Function to escape special characters for sed replacement string
  64. escape_sed_replacement_string() {
  65. # Escape &, \, and the delimiter | for the sed replacement string
  66. echo "$1" | sed -e 's/[&\\|]/\\&/g'
  67. }
  68. echo "=== General Configuration ==="
  69. prompt_with_default "Time Zone" "Asia/Shanghai" "TZ"
  70. echo ""
  71. echo "=== MySQL Configuration ==="
  72. prompt_with_default "MySQL Port" "3306" "MYSQL_PORT"
  73. prompt_with_default "MySQL Database Name" "ruoyi-ai" "MYSQL_DATABASE"
  74. prompt_for_password "MySQL root Password" "root" "MYSQL_ROOT_PASSWORD"
  75. echo ""
  76. echo "=== Redis Configuration ==="
  77. prompt_with_default "Redis Port" "6379" "REDIS_PORT"
  78. prompt_for_password "Redis Password (leave empty for no password)" "" "REDIS_PASSWORD"
  79. prompt_with_default "Redis Database Index" "0" "REDIS_DATABASE"
  80. prompt_with_default "Redis Connection Timeout" "10s" "REDIS_TIMEOUT"
  81. echo ""
  82. echo "=== Backend Service Configuration ==="
  83. prompt_with_default "Backend Service Port" "6039" "SERVER_PORT"
  84. prompt_with_default "Backend Service Hostname" "ruoyi-backend" "BACKEND_HOST"
  85. prompt_with_default "Database Username" "root" "DB_USERNAME"
  86. prompt_for_password "Database Password" "root" "DB_PASSWORD"
  87. echo ""
  88. echo "=== Frontend Service Configuration ==="
  89. prompt_with_default "Admin UI Port" "8082" "ADMIN_PORT"
  90. prompt_with_default "Web UI Port" "8081" "WEB_PORT"
  91. echo ""
  92. echo "=== Weaviate Vector Database Configuration ==="
  93. prompt_with_default "Weaviate HTTP Port" "50050" "WEAVIATE_HTTP_PORT"
  94. prompt_with_default "Weaviate gRPC Port" "50051" "WEAVIATE_GRPC_PORT"
  95. prompt_with_default "Weaviate Query Limit" "25" "WEAVIATE_QUERY_LIMIT"
  96. prompt_with_default "Weaviate Anonymous Access" "true" "WEAVIATE_ANONYMOUS_ACCESS"
  97. prompt_with_default "Weaviate Data Path" "/var/lib/weaviate" "WEAVIATE_DATA_PATH"
  98. prompt_with_default "Weaviate Vectorizer Module" "none" "WEAVIATE_VECTORIZER_MODULE"
  99. 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"
  100. prompt_with_default "Weaviate Cluster Hostname" "node1" "WEAVIATE_CLUSTER_HOSTNAME"
  101. prompt_with_default "Weaviate Protocol" "http" "WEAVIATE_PROTOCOL"
  102. prompt_with_default "Weaviate Class Name" "LocalKnowledge" "WEAVIATE_CLASSNAME"
  103. echo ""
  104. echo "=== Production Environment Configuration ==="
  105. 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"
  106. prompt_with_default "Production Database Username" "root" "PROD_DB_USERNAME"
  107. prompt_for_password "Production Database Password" "root" "PROD_DB_PASSWORD"
  108. prompt_with_default "Production Redis Host" "redis" "PROD_REDIS_HOST"
  109. prompt_with_default "Production Redis Port" "6379" "PROD_REDIS_PORT"
  110. prompt_with_default "Production Redis Database" "0" "PROD_REDIS_DATABASE"
  111. prompt_for_password "Production Redis Password (leave empty for no password)" "" "PROD_REDIS_PASSWORD"
  112. prompt_with_default "Production Redis Timeout" "10s" "PROD_REDIS_TIMEOUT"
  113. echo ""
  114. echo "=== Frontend Configuration ==="
  115. prompt_with_default "Frontend API Base URL" "http://${BACKEND_HOST}:${SERVER_PORT}" "FRONTEND_API_BASE_URL"
  116. prompt_with_default "Frontend Development Server Port" "3000" "FRONTEND_DEV_PORT"
  117. # Copy template files
  118. cp ${SCRIPT_DIR}/template/.env.template ${DEPLOY_DIR}/.env
  119. cp ${SCRIPT_DIR}/template/docker-compose.yaml.template ${DEPLOY_DIR}/docker-compose.yaml
  120. echo "Template files copied to deployment directory."
  121. # Replace placeholders in .env file
  122. echo "Updating .env file with your configuration..."
  123. sed -i "s|{{TZ}}|$(escape_sed_replacement_string "${TZ}")|g" ${DEPLOY_DIR}/.env
  124. sed -i "s|{{MYSQL_ROOT_PASSWORD}}|$(escape_sed_replacement_string "${MYSQL_ROOT_PASSWORD}")|g" ${DEPLOY_DIR}/.env
  125. sed -i "s|{{MYSQL_DATABASE}}|$(escape_sed_replacement_string "${MYSQL_DATABASE}")|g" ${DEPLOY_DIR}/.env
  126. sed -i "s|{{MYSQL_PORT}}|$(escape_sed_replacement_string "${MYSQL_PORT}")|g" ${DEPLOY_DIR}/.env
  127. sed -i "s|{{REDIS_PORT}}|$(escape_sed_replacement_string "${REDIS_PORT}")|g" ${DEPLOY_DIR}/.env
  128. sed -i "s|{{REDIS_PASSWORD}}|$(escape_sed_replacement_string "${REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/.env
  129. sed -i "s|{{REDIS_DATABASE}}|$(escape_sed_replacement_string "${REDIS_DATABASE}")|g" ${DEPLOY_DIR}/.env
  130. sed -i "s|{{REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/.env
  131. sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/.env
  132. 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
  133. sed -i "s|{{DB_USERNAME}}|$(escape_sed_replacement_string "${DB_USERNAME}")|g" ${DEPLOY_DIR}/.env
  134. sed -i "s|{{DB_PASSWORD}}|$(escape_sed_replacement_string "${DB_PASSWORD}")|g" ${DEPLOY_DIR}/.env
  135. sed -i "s|{{BACKEND_HOST}}|$(escape_sed_replacement_string "${BACKEND_HOST}")|g" ${DEPLOY_DIR}/.env
  136. sed -i "s|{{ADMIN_PORT}}|$(escape_sed_replacement_string "${ADMIN_PORT}")|g" ${DEPLOY_DIR}/.env
  137. sed -i "s|{{WEB_PORT}}|$(escape_sed_replacement_string "${WEB_PORT}")|g" ${DEPLOY_DIR}/.env
  138. sed -i "s|{{FRONTEND_API_BASE_URL}}|$(escape_sed_replacement_string "${FRONTEND_API_BASE_URL}")|g" ${DEPLOY_DIR}/.env
  139. sed -i "s|{{FRONTEND_DEV_PORT}}|$(escape_sed_replacement_string "${FRONTEND_DEV_PORT}")|g" ${DEPLOY_DIR}/.env
  140. sed -i "s|{{WEAVIATE_HTTP_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_HTTP_PORT}")|g" ${DEPLOY_DIR}/.env
  141. sed -i "s|{{WEAVIATE_GRPC_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_GRPC_PORT}")|g" ${DEPLOY_DIR}/.env
  142. sed -i "s|{{WEAVIATE_QUERY_LIMIT}}|$(escape_sed_replacement_string "${WEAVIATE_QUERY_LIMIT}")|g" ${DEPLOY_DIR}/.env
  143. sed -i "s|{{WEAVIATE_ANONYMOUS_ACCESS}}|$(escape_sed_replacement_string "${WEAVIATE_ANONYMOUS_ACCESS}")|g" ${DEPLOY_DIR}/.env
  144. sed -i "s|{{WEAVIATE_DATA_PATH}}|$(escape_sed_replacement_string "${WEAVIATE_DATA_PATH}")|g" ${DEPLOY_DIR}/.env
  145. sed -i "s|{{WEAVIATE_VECTORIZER_MODULE}}|$(escape_sed_replacement_string "${WEAVIATE_VECTORIZER_MODULE}")|g" ${DEPLOY_DIR}/.env
  146. sed -i "s|{{WEAVIATE_MODULES}}|$(escape_sed_replacement_string "${WEAVIATE_MODULES}")|g" ${DEPLOY_DIR}/.env
  147. sed -i "s|{{WEAVIATE_CLUSTER_HOSTNAME}}|$(escape_sed_replacement_string "${WEAVIATE_CLUSTER_HOSTNAME}")|g" ${DEPLOY_DIR}/.env
  148. sed -i "s|{{WEAVIATE_PROTOCOL}}|$(escape_sed_replacement_string "${WEAVIATE_PROTOCOL}")|g" ${DEPLOY_DIR}/.env
  149. sed -i "s|{{WEAVIATE_CLASSNAME}}|$(escape_sed_replacement_string "${WEAVIATE_CLASSNAME}")|g" ${DEPLOY_DIR}/.env
  150. sed -i "s|{{PROD_DB_URL}}|$(escape_sed_replacement_string "${PROD_DB_URL}")|g" ${DEPLOY_DIR}/.env
  151. sed -i "s|{{PROD_DB_USERNAME}}|$(escape_sed_replacement_string "${PROD_DB_USERNAME}")|g" ${DEPLOY_DIR}/.env
  152. sed -i "s|{{PROD_DB_PASSWORD}}|$(escape_sed_replacement_string "${PROD_DB_PASSWORD}")|g" ${DEPLOY_DIR}/.env
  153. sed -i "s|{{PROD_REDIS_HOST}}|$(escape_sed_replacement_string "${PROD_REDIS_HOST}")|g" ${DEPLOY_DIR}/.env
  154. sed -i "s|{{PROD_REDIS_PORT}}|$(escape_sed_replacement_string "${PROD_REDIS_PORT}")|g" ${DEPLOY_DIR}/.env
  155. sed -i "s|{{PROD_REDIS_DATABASE}}|$(escape_sed_replacement_string "${PROD_REDIS_DATABASE}")|g" ${DEPLOY_DIR}/.env
  156. sed -i "s|{{PROD_REDIS_PASSWORD}}|$(escape_sed_replacement_string "${PROD_REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/.env
  157. sed -i "s|{{PROD_REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${PROD_REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/.env
  158. echo ".env file has been updated with your configuration."
  159. # Replace placeholders in docker-compose.yaml file
  160. echo "Updating docker-compose.yaml file with your configuration..."
  161. # Determine Redis command arguments based on password
  162. #if [ -n "${REDIS_PASSWORD}" ]; then
  163. # REDIS_COMMAND_ARGS="--requirepass $(escape_sed_replacement_string "${REDIS_PASSWORD}")"
  164. #else
  165. # REDIS_COMMAND_ARGS=""
  166. #fi
  167. sed -i "s|{{MYSQL_ROOT_PASSWORD}}|$(escape_sed_replacement_string "${MYSQL_ROOT_PASSWORD}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  168. sed -i "s|{{MYSQL_DATABASE}}|$(escape_sed_replacement_string "${MYSQL_DATABASE}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  169. sed -i "s|{{MYSQL_PORT}}|$(escape_sed_replacement_string "${MYSQL_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  170. sed -i "s|{{REDIS_PORT}}|$(escape_sed_replacement_string "${REDIS_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  171. sed -i "s|{{REDIS_COMMAND_ARGS}}|$(escape_sed_replacement_string "${REDIS_COMMAND_ARGS}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  172. sed -i "s|{{WEAVIATE_HTTP_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_HTTP_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  173. sed -i "s|{{WEAVIATE_GRPC_PORT}}|$(escape_sed_replacement_string "${WEAVIATE_GRPC_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  174. sed -i "s|{{WEAVIATE_QUERY_LIMIT}}|$(escape_sed_replacement_string "${WEAVIATE_QUERY_LIMIT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  175. sed -i "s|{{WEAVIATE_ANONYMOUS_ACCESS}}|$(escape_sed_replacement_string "${WEAVIATE_ANONYMOUS_ACCESS}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  176. sed -i "s|{{WEAVIATE_DATA_PATH}}|$(escape_sed_replacement_string "${WEAVIATE_DATA_PATH}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  177. sed -i "s|{{WEAVIATE_VECTORIZER_MODULE}}|$(escape_sed_replacement_string "${WEAVIATE_VECTORIZER_MODULE}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  178. sed -i "s|{{WEAVIATE_MODULES}}|$(escape_sed_replacement_string "${WEAVIATE_MODULES}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  179. sed -i "s|{{WEAVIATE_CLUSTER_HOSTNAME}}|$(escape_sed_replacement_string "${WEAVIATE_CLUSTER_HOSTNAME}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  180. sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  181. 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
  182. sed -i "s|{{DB_USERNAME}}|$(escape_sed_replacement_string "${DB_USERNAME}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  183. sed -i "s|{{DB_PASSWORD}}|$(escape_sed_replacement_string "${DB_PASSWORD}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  184. sed -i "s|{{REDIS_HOST}}|redis|g" ${DEPLOY_DIR}/docker-compose.yaml # REDIS_HOST is hardcoded to 'redis' in docker-compose
  185. sed -i "s|{{REDIS_DATABASE}}|$(escape_sed_replacement_string "${REDIS_DATABASE}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  186. sed -i "s|{{REDIS_PASSWORD}}|$(escape_sed_replacement_string "${REDIS_PASSWORD}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  187. sed -i "s|{{REDIS_TIMEOUT}}|$(escape_sed_replacement_string "${REDIS_TIMEOUT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  188. sed -i "s|{{TZ}}|$(escape_sed_replacement_string "${TZ}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  189. sed -i "s|{{ADMIN_PORT}}|$(escape_sed_replacement_string "${ADMIN_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  190. sed -i "s|{{WEB_PORT}}|$(escape_sed_replacement_string "${WEB_PORT}")|g" ${DEPLOY_DIR}/docker-compose.yaml
  191. echo ""
  192. echo "=== Build or Deploy Options ==="
  193. read -p "Do you want to build new images (B) or deploy directly using existing images (D)?[B/d]: " build_or_deploy_choice
  194. BUILD_CHOICE="${build_or_deploy_choice:-B}" # Default to Build
  195. if [[ "${BUILD_CHOICE}" == [Bb]* ]]; then
  196. echo "Image build process in progress..."
  197. # Clone ruoyi-ai-backend repositories
  198. if [ -d "${DEPLOY_DIR}/ruoyi-ai" ]; then
  199. echo "Directory ${DEPLOY_DIR}/ruoyi-ai already exists."
  200. read -p "Do you want to delete it and clone a new copy?[Y/n]: " answer
  201. case ${answer:-Y} in
  202. [Yy]* )
  203. echo "Deleting existing directory..."
  204. rm -rf ${DEPLOY_DIR}/ruoyi-ai
  205. echo "Cloning ruoyi-ai-backend repository..."
  206. cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-ai
  207. # Prompt for branch selection
  208. read -p "Please enter the branch name for ruoyi-ai repository [main]: " RUOYI_AI_BRANCH
  209. RUOYI_AI_BRANCH="${RUOYI_AI_BRANCH:-main}"
  210. echo "Switching to branch: ${RUOYI_AI_BRANCH}"
  211. cd ${DEPLOY_DIR}/ruoyi-ai && git checkout ${RUOYI_AI_BRANCH}
  212. cd ..
  213. ;;
  214. [Nn]* )
  215. echo "Skipping clone operation."
  216. ;;
  217. * )
  218. echo "Invalid input. Skipping clone operation."
  219. ;;
  220. esac
  221. else
  222. echo "Cloning ruoyi-ai-backend repository..."
  223. cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-ai
  224. # Prompt for branch selection
  225. read -p "Please enter the branch name for ruoyi-ai repository [main]: " RUOYI_AI_BRANCH
  226. RUOYI_AI_BRANCH="${RUOYI_AI_BRANCH:-main}"
  227. echo "Switching to branch: ${RUOYI_AI_BRANCH}"
  228. cd ${DEPLOY_DIR}/ruoyi-ai && git checkout ${RUOYI_AI_BRANCH}
  229. cd ..
  230. fi
  231. # Clone ruoyi-ai-admin repositories
  232. if [ -d "${DEPLOY_DIR}/ruoyi-admin" ]; then
  233. echo "Directory ${DEPLOY_DIR}/ruoyi-admin already exists."
  234. read -p "Do you want to delete it and clone a new copy?[Y/n]: " answer
  235. case ${answer:-Y} in
  236. [Yy]* )
  237. echo "Deleting existing directory..."
  238. rm -rf ${DEPLOY_DIR}/ruoyi-admin
  239. echo "Cloning ruoyi-admin repository..."
  240. cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-admin
  241. # Prompt for branch selection
  242. read -p "Please enter the branch name for ruoyi-admin repository [main]: " RUOYI_ADMIN_BRANCH
  243. RUOYI_ADMIN_BRANCH="${RUOYI_ADMIN_BRANCH:-main}"
  244. echo "Switching to branch: ${RUOYI_ADMIN_BRANCH}"
  245. cd ${DEPLOY_DIR}/ruoyi-admin && git checkout ${RUOYI_ADMIN_BRANCH}
  246. cd ..
  247. ;;
  248. [Nn]* )
  249. echo "Skipping clone operation."
  250. ;;
  251. * )
  252. echo "Invalid input. Skipping clone operation."
  253. ;;
  254. esac
  255. else
  256. echo "Cloning ruoyi-ai-admin repository..."
  257. cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-admin
  258. # Prompt for branch selection
  259. read -p "Please enter the branch name for ruoyi-admin repository [main]: " RUOYI_ADMIN_BRANCH
  260. RUOYI_ADMIN_BRANCH="${RUOYI_ADMIN_BRANCH:-main}"
  261. echo "Switching to branch: ${RUOYI_ADMIN_BRANCH}"
  262. cd ${DEPLOY_DIR}/ruoyi-admin && git checkout ${RUOYI_ADMIN_BRANCH}
  263. cd ..
  264. fi
  265. # Clone ruoyi-ai-web repositories
  266. if [ -d "${DEPLOY_DIR}/ruoyi-web" ]; then
  267. echo "Directory ${DEPLOY_DIR}/ruoyi-web already exists."
  268. read -p "Do you want to delete it and clone a new copy?[Y/n]: " answer
  269. case ${answer:-Y} in
  270. [Yy]* )
  271. echo "Deleting existing directory..."
  272. rm -rf ${DEPLOY_DIR}/ruoyi-web
  273. echo "Cloning ruoyi-ai-web repository..."
  274. cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-web
  275. # Prompt for branch selection
  276. read -p "Please enter the branch name for ruoyi-web repository [main]: " RUOYI_WEB_BRANCH
  277. RUOYI_WEB_BRANCH="${RUOYI_WEB_BRANCH:-main}"
  278. echo "Switching to branch: ${RUOYI_WEB_BRANCH}"
  279. cd ${DEPLOY_DIR}/ruoyi-web && git checkout ${RUOYI_WEB_BRANCH}
  280. cd ..
  281. ;;
  282. [Nn]* )
  283. echo "Skipping clone operation."
  284. ;;
  285. * )
  286. echo "Invalid input. Skipping clone operation."
  287. ;;
  288. esac
  289. else
  290. echo "Cloning ruoyi-ai-web repository..."
  291. cd ${DEPLOY_DIR} && git clone https://github.com/ageerle/ruoyi-web
  292. # Prompt for branch selection
  293. read -p "Please enter the branch name for ruoyi-web repository [main]: " RUOYI_WEB_BRANCH
  294. RUOYI_WEB_BRANCH="${RUOYI_WEB_BRANCH:-main}"
  295. echo "Switching to branch: ${RUOYI_WEB_BRANCH}"
  296. cd ${DEPLOY_DIR}/ruoyi-web && git checkout ${RUOYI_WEB_BRANCH}
  297. cd ..
  298. fi
  299. # Update application-prod.yml file
  300. echo "Updating application-prod.yml file with your configuration..."
  301. # Copy application-prod.yml template
  302. cp ${SCRIPT_DIR}/template/application-prod.yml.template ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
  303. # Replace placeholders in application-prod.yml
  304. 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
  305. 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
  306. 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
  307. 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
  308. 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
  309. 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
  310. if [ -z "${PROD_REDIS_PASSWORD}" ]; then
  311. sed -i "s/^ password: {{PROD_REDIS_PASSWORD}}/# password: {{PROD_REDIS_PASSWORD}}/g" ${DEPLOY_DIR}/ruoyi-ai/ruoyi-admin/src/main/resources/application-prod.yml
  312. else
  313. 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
  314. fi
  315. 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
  316. # Update vite.config.mts file
  317. echo "Updating vite.config.mts file with your configuration..."
  318. sed -i "s|http://127.0.0.1:6039|${FRONTEND_API_BASE_URL}|g" ${DEPLOY_DIR}/ruoyi-admin/apps/web-antd/vite.config.mts
  319. # Update image tags in docker-compose.yaml file
  320. echo "Updating image tags in docker-compose.yaml file..."
  321. sed -i "s|ruoyi-ai-backend:latest|ruoyi-ai-backend:${RUOYI_AI_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
  322. sed -i "s|ruoyi-ai-admin:latest|ruoyi-ai-admin:${RUOYI_ADMIN_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
  323. sed -i "s|ruoyi-ai-web:latest|ruoyi-ai-web:${RUOYI_WEB_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
  324. # Create Nginx configuration files for frontend services
  325. echo "Copying Admin UI Nginx configuration template to temporary location..."
  326. cp ${SCRIPT_DIR}/template/nginx.admin.conf.template ${DEPLOY_DIR}/nginx.admin.conf.tmp
  327. echo "Updating Admin UI Nginx configuration in temporary file..."
  328. sed -i "s|{{BACKEND_HOST}}|$(escape_sed_replacement_string "${BACKEND_HOST}")|g" ${DEPLOY_DIR}/nginx.admin.conf.tmp
  329. sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/nginx.admin.conf.tmp
  330. echo "Moving updated Admin UI Nginx configuration to final location..."
  331. mv ${DEPLOY_DIR}/nginx.admin.conf.tmp ${DEPLOY_DIR}/ruoyi-admin/nginx.conf
  332. echo "Copying Web UI Nginx configuration template to temporary location..."
  333. cp ${SCRIPT_DIR}/template/nginx.web.conf.template ${DEPLOY_DIR}/nginx.web.conf.tmp
  334. echo "Updating Web UI Nginx configuration in temporary file..."
  335. sed -i "s|{{BACKEND_HOST}}|$(escape_sed_replacement_string "${BACKEND_HOST}")|g" ${DEPLOY_DIR}/nginx.web.conf.tmp
  336. sed -i "s|{{SERVER_PORT}}|$(escape_sed_replacement_string "${SERVER_PORT}")|g" ${DEPLOY_DIR}/nginx.web.conf.tmp
  337. echo "Moving updated Web UI Nginx configuration to final location..."
  338. mv ${DEPLOY_DIR}/nginx.web.conf.tmp ${DEPLOY_DIR}/ruoyi-web/nginx.conf
  339. # Create Dockerfiles for frontend services
  340. echo "Creating Dockerfile for Admin UI..."
  341. cat > ${DEPLOY_DIR}/ruoyi-admin/Dockerfile << EOF
  342. FROM nginx:1.25-alpine
  343. COPY dist/ /usr/share/nginx/html/
  344. COPY nginx.conf /etc/nginx/conf.d/default.conf
  345. EXPOSE 80
  346. CMD ["nginx", "-g", "daemon off;"]
  347. EOF
  348. echo "Creating Dockerfile for Web UI..."
  349. cat > ${DEPLOY_DIR}/ruoyi-web/Dockerfile << EOF
  350. FROM nginx:1.25-alpine
  351. COPY dist/ /usr/share/nginx/html/
  352. COPY nginx.conf /etc/nginx/conf.d/default.conf
  353. EXPOSE 80
  354. CMD ["nginx", "-g", "daemon off;"]
  355. EOF
  356. # Build backend service
  357. echo "Building Ruoyi-AI backend service..."
  358. cd ${DEPLOY_DIR}/ruoyi-ai
  359. 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"
  360. # Build frontend Admin service
  361. echo "Building Ruoyi-AI frontend Admin service..."
  362. cd ${DEPLOY_DIR}/ruoyi-admin
  363. 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"
  364. # Build frontend Web service
  365. echo "Building Ruoyi-AI frontend Web service..."
  366. cd ${DEPLOY_DIR}/ruoyi-web
  367. 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"
  368. # Build Docker images
  369. echo "Building Ruoyi-AI Backend Docker images..."
  370. cd ${DEPLOY_DIR}/ruoyi-ai
  371. rm -rf temp
  372. mkdir temp
  373. cp ./ruoyi-admin/target/ruoyi-admin.jar temp/
  374. cd temp/
  375. cat > Dockerfile << EOF
  376. FROM openjdk:17-jdk-slim
  377. WORKDIR /app
  378. COPY ruoyi-admin.jar /app/ruoyi-admin.jar
  379. EXPOSE ${SERVER_PORT}
  380. ENTRYPOINT ["java","-jar","ruoyi-admin.jar","--spring.profiles.active=prod"]
  381. EOF
  382. docker build -t ruoyi-ai-backend:${RUOYI_AI_BRANCH} .
  383. cd ..
  384. echo "Building Ruoyi-AI Admin Docker images..."
  385. cd ${DEPLOY_DIR}/ruoyi-admin
  386. rm -rf temp
  387. mkdir temp
  388. cp ./apps/web-antd/dist.zip temp/
  389. cp Dockerfile temp/
  390. cp nginx.conf temp/
  391. cd temp/
  392. unzip dist.zip -d dist
  393. rm -f dist.zip
  394. docker build -t ruoyi-ai-admin:${RUOYI_ADMIN_BRANCH} .
  395. cd ..
  396. echo "Building Ruoyi-AI Web Docker images..."
  397. cd ${DEPLOY_DIR}/ruoyi-web
  398. rm -rf temp
  399. mkdir temp
  400. cp -pr ${DEPLOY_DIR}/ruoyi-web/dist temp/
  401. cp Dockerfile temp/
  402. cp nginx.conf temp/
  403. cd temp/
  404. docker build -t ruoyi-ai-web:${RUOYI_WEB_BRANCH} .
  405. cd ..
  406. else
  407. echo "Skipping image build process. Deploying directly using existing images..."
  408. # Prompt for branch names to use as image tags
  409. read -p "Please enter the tag for ruoyi-ai-backend image [main]: " RUOYI_AI_BRANCH
  410. RUOYI_AI_BRANCH="${RUOYI_AI_BRANCH:-main}"
  411. read -p "Please enter the tag for ruoyi-ai-admin image [main]: " RUOYI_ADMIN_BRANCH
  412. RUOYI_ADMIN_BRANCH="${RUOYI_ADMIN_BRANCH:-main}"
  413. read -p "Please enter the tag for ruoyi-ai-web image [main]: " RUOYI_WEB_BRANCH
  414. RUOYI_WEB_BRANCH="${RUOYI_WEB_BRANCH:-main}"
  415. # Update image tags in docker-compose.yaml file
  416. echo "Updating image tags in docker-compose.yaml file..."
  417. sed -i "s|ruoyi-ai-backend:latest|ruoyi-ai-backend:${RUOYI_AI_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
  418. sed -i "s|ruoyi-ai-admin:latest|ruoyi-ai-admin:${RUOYI_ADMIN_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
  419. sed -i "s|ruoyi-ai-web:latest|ruoyi-ai-web:${RUOYI_WEB_BRANCH}|g" ${DEPLOY_DIR}/docker-compose.yaml
  420. fi
  421. # Copy SQL file
  422. rm -rf ${DEPLOY_DIR}/mysql-init
  423. cp -pr ${SCRIPT_DIR}/mysql-init ${DEPLOY_DIR}/
  424. # Update SQL file with configuration values
  425. echo "Updating SQL configuration values..."
  426. sed -i "s|'weaviate', 'host', '127.0.0.1:6038'|'weaviate', 'host', 'weaviate:8080'|g" ${DEPLOY_DIR}/mysql-init/ruoyi-ai.sql
  427. sed -i "s|'weaviate', 'protocol', 'http'|'weaviate', 'protocol', '${WEAVIATE_PROTOCOL}'|g" ${DEPLOY_DIR}/mysql-init/ruoyi-ai.sql
  428. sed -i "s|'weaviate', 'classname', 'LocalKnowledge'|'weaviate', 'classname', '${WEAVIATE_CLASSNAME}'|g" ${DEPLOY_DIR}/mysql-init/ruoyi-ai.sql
  429. # Deploy using Docker Compose
  430. echo "Deploying with Docker Compose..."
  431. cd ${DEPLOY_DIR}
  432. docker-compose down
  433. docker-compose up -d
  434. echo "=================================================="
  435. echo " RuoYi-AI Deployment Complete"
  436. echo "=================================================="
  437. echo ""
  438. echo "Your RuoYi-AI system has deployed the following services:"
  439. echo "- Backend API: http://localhost:${SERVER_PORT}"
  440. echo "- Admin UI: http://localhost:${ADMIN_PORT}"
  441. echo "- Web UI: http://localhost:${WEB_PORT}"
  442. echo "- Weaviate: http://localhost:${WEAVIATE_HTTP_PORT}"
  443. echo ""
  444. echo "All configurations have been customized according to your inputs."
  445. echo "Configuration files have been updated to use environment variables."
  446. echo ""
  447. echo "Thank you for using the RuoYi-AI interactive deployment script!"