mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-07 05:34:17 +00:00
feat: add node management shell and installer flows
This commit is contained in:
parent
87282dde33
commit
6b58044e00
2 changed files with 166 additions and 1 deletions
48
install.sh
48
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}"
|
||||
|
|
|
|||
119
x-ui.sh
119
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:-<empty>}${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
|
||||
|
|
|
|||
Loading…
Reference in a new issue