From 6b58044e007c05b7238302a071689817380fabf8 Mon Sep 17 00:00:00 2001 From: Sora39831 <540587985@qq.com> Date: Fri, 10 Apr 2026 15:31:35 +0800 Subject: [PATCH] feat: add node management shell and installer flows --- install.sh | 48 +++++++++++++++++++++ x-ui.sh | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 166 insertions(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 1dd63586..e92a3f12 100644 --- a/install.sh +++ b/install.sh @@ -896,6 +896,54 @@ config_after_install() { fi config_port="${saved_port}" + read -rp "Database type [mariadb]: " db_type + db_type=$(echo "${db_type:-mariadb}" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]') + if [[ "${db_type}" != "mariadb" && "${db_type}" != "sqlite" ]]; then + echo -e "${yellow}无效的数据库类型,回退到 mariadb${plain}" + db_type="mariadb" + fi + + if [[ "${db_type}" == "mariadb" ]]; then + read -rp "MariaDB host [127.0.0.1]: " db_host + read -rp "MariaDB port [3306]: " db_port + read -rp "MariaDB user: " db_user + read -rsp "MariaDB password: " db_pass + echo + read -rp "MariaDB database [3xui]: " db_name + + XUI_DB_PASSWORD="$db_pass" ${xui_folder}/x-ui setting \ + -dbHost "${db_host:-127.0.0.1}" \ + -dbPort "${db_port:-3306}" \ + -dbUser "$db_user" \ + -dbName "${db_name:-3xui}" + fi + ${xui_folder}/x-ui setting -dbType "${db_type}" + + read -rp "Node role [master]: " node_role + node_role=$(echo "${node_role:-master}" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]') + if [[ "${node_role}" != "master" && "${node_role}" != "worker" ]]; then + echo -e "${yellow}无效的节点角色,回退到 master${plain}" + node_role="master" + fi + + if [[ "${node_role}" == "worker" && "${db_type}" != "mariadb" ]]; then + echo -e "${yellow}worker 节点要求使用 MariaDB,回退到 master${plain}" + node_role="master" + fi + + if [[ "${node_role}" == "worker" ]]; then + read -rp "Node ID: " node_id + node_id="${node_id// /}" + while [[ -z "${node_id}" ]]; do + echo -e "${yellow}worker 节点必须提供 Node ID${plain}" + read -rp "Node ID: " node_id + node_id="${node_id// /}" + done + ${xui_folder}/x-ui setting -nodeRole worker -nodeId "$node_id" + else + ${xui_folder}/x-ui setting -nodeRole master + fi + echo "" echo -e "${green}═══════════════════════════════════════════${plain}" echo -e "${green} SSL 证书配置(必需) ${plain}" diff --git a/x-ui.sh b/x-ui.sh index 65fbf129..789b9ada 100644 --- a/x-ui.sh +++ b/x-ui.sh @@ -2231,6 +2231,108 @@ db_show_status() { echo -e "${green}MariaDB 主机: ${host:-127.0.0.1}:${port:-3306}${plain}" echo -e "${green}数据库名: ${dbname:-3xui}${plain}" fi + show_node_status +} + +get_node_setting() { + local key="$1" + local default_value="$2" + local json_path="/etc/x-ui/x-ui.json" + + if [ ! -f "$json_path" ]; then + echo "$default_value" + return + fi + + if command -v jq >/dev/null 2>&1; then + jq -r "$key // $default_value" "$json_path" 2>/dev/null + return + fi + + case "$key" in + ".nodeRole") + grep -o '"nodeRole"[[:space:]]*:[[:space:]]*"[^"]*"' "$json_path" 2>/dev/null | tail -1 | sed 's/.*"\([^"]*\)"$/\1/' || echo "$default_value" + ;; + ".nodeId") + grep -o '"nodeId"[[:space:]]*:[[:space:]]*"[^"]*"' "$json_path" 2>/dev/null | tail -1 | sed 's/.*"\([^"]*\)"$/\1/' || echo "$default_value" + ;; + ".syncInterval") + grep -o '"syncInterval"[[:space:]]*:[[:space:]]*[^,}]*' "$json_path" 2>/dev/null | tail -1 | awk -F': ' '{print $2}' | tr -d '[:space:]' || echo "$default_value" + ;; + ".trafficFlushInterval") + grep -o '"trafficFlushInterval"[[:space:]]*:[[:space:]]*[^,}]*' "$json_path" 2>/dev/null | tail -1 | awk -F': ' '{print $2}' | tr -d '[:space:]' || echo "$default_value" + ;; + *) + echo "$default_value" + ;; + esac +} + +show_node_status() { + local node_role + local node_id + local sync_interval + local flush_interval + + node_role=$(get_node_setting '.nodeRole' '"master"' | tr -d '"') + node_id=$(get_node_setting '.nodeId' '""' | tr -d '"') + sync_interval=$(get_node_setting '.syncInterval' '30' | tr -d '"') + flush_interval=$(get_node_setting '.trafficFlushInterval' '10' | tr -d '"') + + echo -e "${green}节点角色: ${node_role:-master}${plain}" + echo -e "${green}节点 ID: ${node_id:-}${plain}" + echo -e "${green}同步间隔: ${sync_interval:-30}s${plain}" + echo -e "${green}流量回刷间隔: ${flush_interval:-10}s${plain}" +} + +set_node_role() { + local node_role="" + local node_id="" + + read -rp "输入节点角色(master/worker): " node_role + node_role=$(echo "${node_role}" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]') + if [ "$node_role" != "master" ] && [ "$node_role" != "worker" ]; then + echo -e "${red}无效的节点角色${plain}" + return 1 + fi + + if [ "$node_role" = "worker" ]; then + read -rp "输入节点 ID: " node_id + node_id="${node_id// /}" + if [ -z "$node_id" ]; then + echo -e "${red}worker 节点必须提供 nodeId${plain}" + return 1 + fi + if ! ${xui_folder}/x-ui setting -nodeRole worker -nodeId "$node_id"; then + echo -e "${red}节点角色更新失败${plain}" + return 1 + fi + else + if ! ${xui_folder}/x-ui setting -nodeRole master; then + echo -e "${red}节点角色更新失败${plain}" + return 1 + fi + fi + + echo -e "${yellow}节点设置已更新,建议重启面板使其完全生效。${plain}" +} + +set_node_id() { + local node_id="" + local current_role="" + + read -rp "输入节点 ID: " node_id + node_id="${node_id// /}" + current_role=$(get_node_setting '.nodeRole' '"master"' | tr -d '"') + if [ "${current_role}" = "worker" ] && [ -z "${node_id}" ]; then + echo -e "${red}worker 节点必须提供 nodeId${plain}" + return 1 + fi + if ! ${xui_folder}/x-ui setting -nodeId "$node_id"; then + echo -e "${red}节点 ID 更新失败${plain}" + return 1 + fi + echo -e "${yellow}节点 ID 已更新,建议重启面板使其完全生效。${plain}" } # Check if MariaDB is installed (server or client) @@ -2467,9 +2569,12 @@ db_menu() { │ ${green}1.${plain} 查看当前数据库类型(当前: ${current_type}) │ │ ${green}2.${plain} 切换到 MariaDB │ │ ${green}3.${plain} 切换到 SQLite │ +│ ${green}4.${plain} 查看当前节点设置 │ +│ ${green}5.${plain} 设置节点角色 │ +│ ${green}6.${plain} 设置节点 ID │ ╚════════════════════════════════════════════════╝ " - read -rp "请输入选择 [0-3]:" num + read -rp "请输入选择 [0-6]:" num case "${num}" in 0) show_menu @@ -2484,6 +2589,18 @@ db_menu() { 3) db_switch_to_sqlite ;; + 4) + show_node_status + db_menu + ;; + 5) + set_node_role + db_menu + ;; + 6) + set_node_id + db_menu + ;; *) echo -e "${red}无效选项,请选择有效数字。${plain}\n" db_menu