#!/usr/bin/env bash set -euo pipefail # ─── CONSTANTS ─────────────────────────────────────────────────────────────── BASE_URL="https://script.twentur.com" # ─── COLORS ────────────────────────────────────────────────────────────────── R='\033[0;31m' G='\033[0;32m' Y='\033[0;33m' B='\033[0;34m' C='\033[0;36m' W='\033[1;37m' D='\033[2m' N='\033[0m' # ─── REGISTRY ──────────────────────────────────────────────────────────────── SCRIPTS_ID=( "setup" "beszel-hub" "beszel-agent" "remnanode" ) SCRIPTS_LABEL=( "System Setup" "Beszel Hub" "Beszel Agent" "Remnanode" ) SCRIPTS_DESC=( "Initial Debian configuration: upgrade, base packages, UFW firewall, timezone" "Install Beszel monitoring hub via Docker with optional Nginx reverse proxy" "Install Beszel monitoring agent via Docker" "Install Remnawave node via Docker with geoip/geosite files" ) # ─── HELPERS ───────────────────────────────────────────────────────────────── print_banner() { clear 2>/dev/null || true echo -e "${W}" echo " ╔══════════════════════════════════════════════════╗" echo " ║ TWENTUR · Script Hub ║" echo " ║ script.twentur.com ║" echo " ╚══════════════════════════════════════════════════╝" echo -e "${N}" } print_menu() { local total=${#SCRIPTS_ID[@]} echo -e " ${W}Available scripts:${N}" echo "" for (( i=0; i/dev/null; then wget -qO- "$url" | bash elif command -v curl &>/dev/null; then curl -fsSL "$url" | bash else echo -e " ${R}Error: wget or curl is required.${N}" exit 1 fi } # ─── MAIN ──────────────────────────────────────────────────────────────────── main() { local total=${#SCRIPTS_ID[@]} print_banner print_menu while true; do echo -ne " ${W}Select [1-${total}] or 0 to exit: ${N}" read -r choice = 1 && choice <= total )); then local idx=$(( choice - 1 )) run_script "${SCRIPTS_ID[$idx]}" exit $? fi echo -e " ${R}Invalid choice. Enter a number between 0 and ${total}.${N}" done } main