#!/bin/bash
LANGUAGE="zh"
COLOR_RED='\033[31m'
COLOR_GREEN='\033[32m'
COLOR_YELLOW='\033[33m'
COLOR_BLUE='\033[34m'
COLOR_NC='\033[0m'
select_language() {
clear
echo "=============================="
echo " Language Selection / 语言选择"
echo "=============================="
echo "1) English (en)"
echo "2) 中文 (zh)"
echo "=============================="
echo -n "请选择语言 / Please select language (1/2): "
read -r lang_choice
case $lang_choice in
1) LANGUAGE="en" ;;
2) LANGUAGE="zh" ;;
*)
echo "无效选择,默认使用中文 / Invalid selection, using Chinese by default"
LANGUAGE="zh"
sleep 1
;;
esac
}
get_localized_script() {
local base_script="$1"
local script_dir=$(dirname "$base_script")
local script_name=$(basename "$base_script")
local name_without_ext="${script_name%.*}"
local ext="${script_name##*.}"
local localized_script="${script_dir}/${name_without_ext}_${LANGUAGE}.${ext}"
if [[ -f "$localized_script" ]]; then
echo "$localized_script"
else
echo "$base_script"
fi
}
t() {
local zh_text="$1"
local en_text="$2"
if [[ "$LANGUAGE" == "zh" ]]; then
echo "$zh_text"
else
echo "$en_text"
fi
}
show_top_menu() {
clear
if [[ "$LANGUAGE" == "zh" ]]; then
echo "=============================="
echo " 主部署菜单 "
echo "=============================="
echo "0) 一键自动部署"
echo "1) 手动分步部署"
echo "2) 重启服务"
echo "3) 卸载所有组件并清除数据"
echo "4) 退出程序"
echo "=============================="
echo -n "请输入选项编号(0-4): "
else
echo "=============================="
echo " Main Deployment Menu "
echo "=============================="
echo "0) One-click Auto Deployment"
echo "1) Manual Step-by-step Deployment"
echo "2) Restart Services"
echo "3) Uninstall All Components and Clear Data"
echo "4) Exit"
echo "=============================="
echo -n "Please enter option number (0-4): "
fi
}
show_sub_menu() {
clear
if [[ "$LANGUAGE" == "zh" ]]; then
echo "=============================="
echo " 手动分步部署菜单 "
echo "=============================="
echo "1) 执行环境检查脚本"
echo "2) 安装k3s和helm"
echo "3) 安装Ollama"
echo "4) 部署Deepseek模型"
echo "5) 部署Embedding模型"
echo "6) 安装数据库"
echo "7) 安装AuthHub"
echo "8) 安装EulerCopilot"
echo "9) 返回主菜单"
echo "=============================="
echo -n "请输入选项编号(1-9): "
else
echo "=============================="
echo " Manual Deployment Menu "
echo "=============================="
echo "1) Execute Environment Check Script"
echo "2) Install k3s and helm"
echo "3) Install Ollama"
echo "4) Deploy Deepseek Model"
echo "5) Deploy Embedding Model"
echo "6) Install Databases"
echo "7) Install AuthHub"
echo "8) Install EulerCopilot"
echo "9) Return to Main Menu"
echo "=============================="
echo -n "Please enter option number (1-9): "
fi
}
show_restart_menu() {
clear
if [[ "$LANGUAGE" == "zh" ]]; then
echo "=============================="
echo " 服务重启菜单 "
echo "=============================="
echo "可重启的服务列表:"
echo "1) authhub-backend"
echo "2) authhub"
echo "3) framework"
echo "4) minio"
echo "5) mongo"
echo "6) mysql"
echo "7) opengauss"
echo "8) rag"
echo "9) rag-web"
echo "10) redis"
echo "11) web"
echo "12) 返回主菜单"
echo "=============================="
echo -n "请输入要重启的服务编号(1-12): "
else
echo "=============================="
echo " Service Restart Menu "
echo "=============================="
echo "Available services to restart:"
echo "1) authhub-backend"
echo "2) authhub"
echo "3) framework"
echo "4) minio"
echo "5) mongo"
echo "6) mysql"
echo "7) opengauss"
echo "8) rag"
echo "9) rag-web"
echo "10) redis"
echo "11) web"
echo "12) Return to Main Menu"
echo "=============================="
echo -n "Please enter service number to restart (1-12): "
fi
}
run_script_with_check() {
local script_path=$1
local script_name=$2
local localized_script=$(get_localized_script "$script_path")
echo "--------------------------------------------------"
if [[ "$LANGUAGE" == "zh" ]]; then
echo "开始执行:$script_name"
echo "脚本路径:$localized_script"
else
echo "Starting: $script_name"
echo "Script path: $localized_script"
fi
if [[ ! -f "$localized_script" ]]; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "\n${COLOR_RED}错误:脚本文件不存在: $localized_script${COLOR_NC}"
else
echo -e "\n${COLOR_RED}Error: Script file not found: $localized_script${COLOR_NC}"
fi
return 1
fi
"$localized_script" || {
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "\n${COLOR_RED}$script_name 执行失败!${COLOR_NC}"
else
echo -e "\n${COLOR_RED}$script_name execution failed!${COLOR_NC}"
fi
return 1
}
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "\n${COLOR_GREEN}$script_name 执行成功!${COLOR_NC}"
else
echo -e "\n${COLOR_GREEN}$script_name executed successfully!${COLOR_NC}"
fi
echo "--------------------------------------------------"
}
run_sub_script() {
local base_script_path=""
local script_description=""
case $1 in
1)
base_script_path="./1-check-env/check_env.sh"
script_description=$(t "环境检查脚本" "Environment Check Script")
;;
2)
base_script_path="./2-install-tools/install_tools.sh"
script_description=$(t "k3s和helm安装脚本" "k3s and helm Installation Script")
;;
3)
base_script_path="./3-install-ollama/install_ollama.sh"
script_description=$(t "Ollama安装脚本" "Ollama Installation Script")
;;
4)
base_script_path="./4-deploy-deepseek/deploy_deepseek.sh"
script_description=$(t "Deepseek部署脚本" "Deepseek Deployment Script")
;;
5)
base_script_path="./5-deploy-embedding/deploy-embedding.sh"
script_description=$(t "Embedding部署脚本" "Embedding Deployment Script")
;;
6)
base_script_path="./6-install-databases/install_databases.sh"
script_description=$(t "数据库安装脚本" "Database Installation Script")
;;
7)
base_script_path="./7-install-authhub/install_authhub.sh"
script_description=$(t "AuthHub安装脚本" "AuthHub Installation Script")
;;
8)
base_script_path="./8-install-EulerCopilot/install_eulercopilot.sh"
script_description=$(t "EulerCopilot安装脚本" "EulerCopilot Installation Script")
;;
9)
if [[ "$LANGUAGE" == "zh" ]]; then
echo "正在返回主菜单..."
else
echo "Returning to main menu..."
fi
echo "$(t "按任意键继续..." "Press any key to continue...")"
read -r -n 1 -s
return 2
;;
*)
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}无效的选项,请输入1-9之间的数字${COLOR_NC}"
else
echo -e "${COLOR_RED}Invalid option, please enter a number between 1-9${COLOR_NC}"
fi
return 1
;;
esac
run_script_with_check "$base_script_path" "$script_description"
return $?
}
uninstall_all() {
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}警告:此操作将永久删除所有组件和数据!${COLOR_NC}"
read -p "确认要继续吗?(y/n) " confirm
else
echo -e "${COLOR_RED}Warning: This operation will permanently delete all components and data!${COLOR_NC}"
read -p "Are you sure you want to continue? (y/n) " confirm
fi
if [[ $confirm != "y" && $confirm != "Y" ]]; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo "取消卸载操作"
else
echo "Uninstall operation cancelled"
fi
return
fi
local HELM_TIMEOUT=300
local PVC_DELETE_TIMEOUT=120
local FORCE_DELETE=false
if [[ "$LANGUAGE" == "zh" ]]; then
echo "开始卸载所有Helm Release..."
else
echo "Starting to uninstall all Helm Releases..."
fi
local RELEASES
RELEASES=$(helm list -n euler-copilot --short)
if [ -n "$RELEASES" ]; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_YELLOW}找到以下Helm Release,开始清理...${COLOR_NC}"
else
echo -e "${COLOR_YELLOW}Found the following Helm Releases, starting cleanup...${COLOR_NC}"
fi
for release in $RELEASES; do
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_BLUE}正在删除Helm Release: ${release}${COLOR_NC}"
else
echo -e "${COLOR_BLUE}Deleting Helm Release: ${release}${COLOR_NC}"
fi
if ! helm uninstall "$release" -n euler-copilot \
--wait \
--timeout ${HELM_TIMEOUT}s \
--no-hooks; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}警告:Helm Release ${release} 删除异常,尝试强制删除...${COLOR_NC}"
else
echo -e "${COLOR_RED}Warning: Helm Release ${release} deletion abnormal, attempting forced deletion...${COLOR_NC}"
fi
FORCE_DELETE=true
helm uninstall "$release" -n euler-copilot \
--timeout 10s \
--no-hooks \
--force || true
fi
done
else
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_YELLOW}未找到需要清理的Helm Release${COLOR_NC}"
else
echo -e "${COLOR_YELLOW}No Helm Releases found to clean up${COLOR_NC}"
fi
fi
sleep 10
local pvc_list
pvc_list=$(kubectl get pvc -n euler-copilot -o name 2>/dev/null)
if [ -n "$pvc_list" ]; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_YELLOW}找到以下PVC,开始清理...${COLOR_NC}"
else
echo -e "${COLOR_YELLOW}Found the following PVCs, starting cleanup...${COLOR_NC}"
fi
local start_time=$(date +%s)
local end_time=$((start_time + PVC_DELETE_TIMEOUT))
for pvc in $pvc_list; do
while : ; do
if kubectl delete $pvc -n euler-copilot --timeout=30s 2>/dev/null; then
break
fi
if [ $(date +%s) -ge $end_time ]; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}错误:PVC删除超时,尝试强制清理...${COLOR_NC}"
else
echo -e "${COLOR_RED}Error: PVC deletion timeout, attempting forced cleanup...${COLOR_NC}"
fi
kubectl patch $pvc -n euler-copilot \
--type json \
--patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]' 2>/dev/null || true
kubectl delete $pvc -n euler-copilot \
--force \
--grace-period=0 2>/dev/null && break || true
if ! kubectl get $pvc -n euler-copilot &>/dev/null; then
break
fi
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}严重错误:无法删除PVC ${pvc}${COLOR_NC}" >&2
else
echo -e "${COLOR_RED}Critical error: Unable to delete PVC ${pvc}${COLOR_NC}" >&2
fi
return 1
fi
sleep 5
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_YELLOW}重试删除PVC: ${pvc}...${COLOR_NC}"
else
echo -e "${COLOR_YELLOW}Retrying deletion of PVC: ${pvc}...${COLOR_NC}"
fi
done
done
else
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_YELLOW}未找到需要清理的PVC${COLOR_NC}"
else
echo -e "${COLOR_YELLOW}No PVCs found to clean up${COLOR_NC}"
fi
fi
local secret_list=("authhub-secret" "euler-copilot-database" "euler-copilot-system")
for secret in "${secret_list[@]}"; do
if kubectl get secret "$secret" -n euler-copilot &>/dev/null; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_YELLOW}找到Secret: ${secret},开始清理...${COLOR_NC}"
else
echo -e "${COLOR_YELLOW}Found Secret: ${secret}, starting cleanup...${COLOR_NC}"
fi
if ! kubectl delete secret "$secret" -n euler-copilot; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}错误:删除Secret ${secret} 失败!${COLOR_NC}" >&2
else
echo -e "${COLOR_RED}Error: Failed to delete Secret ${secret}!${COLOR_NC}" >&2
fi
return 1
fi
else
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_YELLOW}未找到需要清理的Secret: ${secret}${COLOR_NC}"
else
echo -e "${COLOR_YELLOW}No Secret found to clean up: ${secret}${COLOR_NC}"
fi
fi
done
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_YELLOW}执行最终资源检查...${COLOR_NC}"
else
echo -e "${COLOR_YELLOW}Performing final resource check...${COLOR_NC}"
fi
kubectl delete all --all -n euler-copilot --timeout=30s 2>/dev/null || true
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_GREEN}资源清理完成${COLOR_NC}"
echo -e "${COLOR_GREEN}所有组件和数据已成功清除${COLOR_NC}"
else
echo -e "${COLOR_GREEN}Resource cleanup completed${COLOR_NC}"
echo -e "${COLOR_GREEN}All components and data have been successfully cleared${COLOR_NC}"
fi
}
manual_deployment_loop() {
while true; do
show_sub_menu
read -r sub_choice
run_sub_script "$sub_choice"
retval=$?
if [ $retval -eq 2 ]; then
break
elif [ $retval -eq 0 ]; then
echo "$(t "按任意键继续..." "Press any key to continue...")"
read -r -n 1 -s
fi
done
}
restart_pod() {
local service="$1"
if [[ -z "$service" ]]; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}错误:请输入服务名称${COLOR_NC}"
else
echo -e "${COLOR_RED}Error: Please enter service name${COLOR_NC}"
fi
return 1
fi
local deployment="${service}-deploy"
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_BLUE}正在验证部署是否存在...${COLOR_NC}"
else
echo -e "${COLOR_BLUE}Verifying if deployment exists...${COLOR_NC}"
fi
if ! kubectl get deployment "$deployment" -n euler-copilot &> /dev/null; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}错误:在 euler-copilot 命名空间中找不到部署 $deployment${COLOR_NC}"
else
echo -e "${COLOR_RED}Error: Deployment $deployment not found in euler-copilot namespace${COLOR_NC}"
fi
return 1
fi
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_YELLOW}正在重启部署 $deployment ...${COLOR_NC}"
else
echo -e "${COLOR_YELLOW}Restarting deployment $deployment ...${COLOR_NC}"
fi
if kubectl rollout restart deployment/"$deployment" -n euler-copilot; then
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_GREEN}成功触发滚动重启!${COLOR_NC}"
echo -e "可以使用以下命令查看状态:\nkubectl rollout status deployment/$deployment -n euler-copilot"
else
echo -e "${COLOR_GREEN}Successfully triggered rolling restart!${COLOR_NC}"
echo -e "You can check the status with:\nkubectl rollout status deployment/$deployment -n euler-copilot"
fi
return 0
else
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}重启部署 $deployment 失败!${COLOR_NC}"
else
echo -e "${COLOR_RED}Failed to restart deployment $deployment!${COLOR_NC}"
fi
return 1
fi
}
select_language
while true; do
show_top_menu
read -r main_choice
case $main_choice in
0)
run_script_with_check "./0-one-click-deploy/one-click-deploy.sh" "$(t "一键自动部署" "One-click Auto Deployment")"
echo "$(t "按任意键继续..." "Press any key to continue...")"
read -r -n 1 -s
;;
1)
manual_deployment_loop
;;
2)
while true; do
show_restart_menu
read -r restart_choice
case $restart_choice in
1) service="authhub-backend" ;;
2) service="authhub" ;;
3) service="framework" ;;
4) service="minio" ;;
5) service="mongo" ;;
6) service="mysql" ;;
7) service="opengauss" ;;
8) service="rag" ;;
9) service="rag-web" ;;
10) service="redis" ;;
11) service="web" ;;
12) break ;;
*)
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}无效的选项,请输入1-12之间的数字${COLOR_NC}"
else
echo -e "${COLOR_RED}Invalid option, please enter a number between 1-12${COLOR_NC}"
fi
continue
;;
esac
if [[ -n "$service" ]]; then
restart_pod "$service"
echo "$(t "按任意键继续..." "Press any key to continue...")"
read -r -n 1 -s
fi
done
;;
3)
uninstall_all
echo "$(t "按任意键继续..." "Press any key to continue...")"
read -r -n 1 -s
;;
4)
if [[ "$LANGUAGE" == "zh" ]]; then
echo "退出部署系统"
else
echo "Exiting deployment system"
fi
exit 0
;;
*)
if [[ "$LANGUAGE" == "zh" ]]; then
echo -e "${COLOR_RED}无效的选项,请输入0-4之间的数字${COLOR_NC}"
else
echo -e "${COLOR_RED}Invalid option, please enter a number between 0-4${COLOR_NC}"
fi
sleep 1
;;
esac
done