From 8980f74b2619829b22af6003fccb1cf1c00518aa Mon Sep 17 00:00:00 2001 From: kobaltgit Date: Sun, 5 Apr 2026 23:34:33 +0300 Subject: [PATCH] modified: install.sh --- install.sh | 344 +++++++++++++++++++++-------------------------------- 1 file changed, 138 insertions(+), 206 deletions(-) diff --git a/install.sh b/install.sh index 5b2b981..8bf2ff6 100644 --- a/install.sh +++ b/install.sh @@ -1,9 +1,8 @@ #!/bin/bash -# ๐Ÿš€ SwiftGram MTProxy โ€” Smart Modular Manager -# ะงะธัั‚ะฐั ะฒะตั€ัะธั ะฑะตะท ั€ะตะบะปะฐะผั‹. -# ะคัƒะฝะบั†ะธะธ: Auto-BBR, IPv6, UDP-Fix, Domain Analysis, Hiddify Compatible. +# ๐Ÿš€ SwiftGram MTProxy โ€” ะŸะพะปะฝะพั„ัƒะฝะบั†ะธะพะฝะฐะปัŒะฝั‹ะน ะผะตะฝะตะดะถะตั€ +# ะ˜ัะฟั€ะฐะฒะปะตะฝะพ: ะ’ะพะทะฒั€ะฐั‚ ะบ ัั‚ะฐะฝะดะฐั€ั‚ะฝะพะน ัะตั‚ะตะฒะพะน ะผะพะดะตะปะธ Docker ะดะปั 100% ะดะพัั‚ัƒะฟะฝะพัั‚ะธ. -# โ”€โ”€ ะะฐัั‚ั€ะพะนะบะธ ั€ะตะฟะพะทะธั‚ะพั€ะธั (ะ—ะะœะ•ะะ˜ ะะ ะกะ’ะžะ˜ ะŸะžะกะ›ะ• ะกะžะ—ะ”ะะะ˜ะฏ ะ ะ•ะŸะž) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# โ”€โ”€ ะะฐัั‚ั€ะพะนะบะธ ั€ะตะฟะพะทะธั‚ะพั€ะธั โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ REPO_RAW_URL="https://git.bargcraft.top/kobalt/swiftgram/raw/branch/main" # โ”€โ”€ ะฆะฒะตั‚ะฐ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -54,6 +53,20 @@ progress_bar() { [ "$current" -eq "$total" ] && echo "" >&2 } +run_with_progress() { + local label="$1"; shift + spinner_start "$label" + "$@" >/dev/null 2>&1 + local rc=$? + spinner_stop + if [ $rc -eq 0 ]; then + echo -e " ${GREEN}โœ“${NC} $label" + else + echo -e " ${RED}โœ—${NC} $label ${RED}(ะพัˆะธะฑะบะฐ)${NC}" + fi + return $rc +} + # โ”€โ”€ ะŸั€ะพะฒะตั€ะบะธ ัะธัั‚ะตะผั‹ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ if [ "$EUID" -ne 0 ]; then echo -e "${RED}ะ—ะฐะฟัƒัั‚ะธั‚ะต ั sudo / root.${NC}" @@ -70,26 +83,18 @@ install_pkg() { fi } -# โ”€โ”€ ะžะฟั‚ะธะผะธะทะฐั†ะธั ะกะตั‚ะธ (BBR + Limits) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# โ”€โ”€ ะžะฟั‚ะธะผะธะทะฐั†ะธั ะกะตั‚ะธ (BBR) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ optimize_system() { - spinner_start "ะžะฟั‚ะธะผะธะทะฐั†ะธั ัะตั‚ะตะฒะพะณะพ ัั‚ะตะบะฐ (BBR)..." if ! sysctl net.ipv4.tcp_congestion_control | grep -q "bbr"; then + spinner_start "ะžะฟั‚ะธะผะธะทะฐั†ะธั ัะตั‚ะตะฒะพะณะพ ัั‚ะตะบะฐ (BBR)..." { echo "net.core.default_qdisc=fq" echo "net.ipv4.tcp_congestion_control=bbr" - echo "net.ipv4.ip_local_port_range=1024 65535" - echo "net.core.somaxconn=65535" - echo "net.ipv4.tcp_fastopen=3" } >> /etc/sysctl.conf sysctl -p >/dev/null 2>&1 + spinner_stop + echo -e " ${GREEN}โœ“${NC} BBR ะฒะบะปัŽั‡ะตะฝ" fi - # ะฃะฒะตะปะธั‡ะตะฝะธะต ะปะธะผะธั‚ะพะฒ ะพั‚ะบั€ั‹ั‚ั‹ั… ั„ะฐะนะปะพะฒ - if ! grep -q "soft nofile 1000000" /etc/security/limits.conf; then - echo "* soft nofile 1000000" >> /etc/security/limits.conf - echo "* hard nofile 1000000" >> /etc/security/limits.conf - fi - spinner_stop - echo -e " ${GREEN}โœ“${NC} ะกะธัั‚ะตะผะฐ ะพะฟั‚ะธะผะธะทะธั€ะพะฒะฐะฝะฐ (BBR ะฒะบะปัŽั‡ะตะฝ)" } # โ”€โ”€ Firewall (ะคะธะบั ะทะฒะพะฝะบะพะฒ) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -103,34 +108,43 @@ fix_firewall() { firewall-cmd --permanent --add-port="$port"/udp >/dev/null 2>&1 firewall-cmd --reload >/dev/null 2>&1 fi - echo -e " ${GREEN}โœ“${NC} Firewall: ะฟะพั€ั‚ั‹ $port/TCP ะธ $port/UDP ะพั‚ะบั€ั‹ั‚ั‹" + echo -e " ${GREEN}โœ“${NC} ะŸะพั€ั‚ั‹ $port (TCP/UDP) ะพั‚ะบั€ั‹ั‚ั‹" } -# โ”€โ”€ ะ˜ะฝั‚ะตะปะปะตะบั‚ัƒะฐะปัŒะฝั‹ะน ะฐะฝะฐะปะธะท ะดะพะผะตะฝะฐ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -analyze_best_domain() { - spinner_start "ะะฝะฐะปะธะท ะพะฟั‚ะธะผะฐะปัŒะฝะพะณะพ ะดะพะผะตะฝะฐ ะดะปั Fake TLS..." - local test_domains=( - "google.com" "wikipedia.org" "github.com" "habr.com" - "microsoft.com" "stackoverflow.com" "lenta.ru" "rbc.ru" - ) - local best_domain="google.com" - local min_time=999 - - for d in "${test_domains[@]}"; do - local t=$(ping -c 1 -W 1 "$d" 2>/dev/null | grep 'time=' | awk -F'time=' '{print $2}' | awk '{print $1}') - if [ -z "$t" ]; then t=999; fi - - if (( $(echo "$t < $min_time" | bc -l 2>/dev/null || [ ${t%.*} -lt ${min_time%.*} ]) )); then - min_time=$t - best_domain=$d - fi - done - spinner_stop - echo -e " ${GREEN}โœ“${NC} ะžะฟั‚ะธะผะฐะปัŒะฝั‹ะน ะดะพะผะตะฝ: ${WHITE}$best_domain${NC} (ะทะฐะดะตั€ะถะบะฐ: ${min_time}ms)" - echo "$best_domain" +# โ”€โ”€ ะฃัั‚ะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพัั‚ะตะน โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +install_base_deps() { + local steps=0 total=4 + progress_bar $steps $total "ะŸั€ะพะฒะตั€ะบะฐ ะทะฐะฒะธัะธะผะพัั‚ะตะน..." + if ! command -v curl &>/dev/null; then run_with_progress "ะฃัั‚ะฐะฝะพะฒะบะฐ curl" install_pkg curl; fi + steps=$((steps+1)); progress_bar $steps $total "curl" + if ! command -v docker &>/dev/null; then + spinner_start "ะฃัั‚ะฐะฝะพะฒะบะฐ Docker..." + curl -fsSL https://get.docker.com | sh >/dev/null 2>&1 + systemctl enable --now docker >/dev/null 2>&1 + spinner_stop + fi + steps=$((steps+1)); progress_bar $steps $total "docker" + if ! command -v qrencode &>/dev/null; then run_with_progress "ะฃัั‚ะฐะฝะพะฒะบะฐ qrencode" install_pkg qrencode; fi + steps=$((steps+1)); progress_bar $steps $total "qrencode" + if ! docker info &>/dev/null 2>&1; then systemctl start docker 2>/dev/null; sleep 2; fi + steps=$((steps+1)); progress_bar $steps $total "ะ“ะพั‚ะพะฒะพ" + echo "" +} + +# โ”€โ”€ ะฃั‚ะธะปะธั‚ั‹ IP ะธ ะŸะพั€ั‚ะพะฒ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +get_ip4() { curl -s -4 --max-time 5 https://api.ipify.org || echo "0.0.0.0"; } + +check_port() { + local port="$1" + if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + local hp=$(docker inspect "$CONTAINER_NAME" --format='{{range $p,$c := .HostConfig.PortBindings}}{{(index $c 0).HostPort}} {{end}}' 2>/dev/null) + for p in $hp; do [ "$p" = "$port" ] && return 1; done + fi + local line=$(ss -tlnp 2>/dev/null | grep -E ":${port}\b" | head -1) + [ -n "$line" ] && { echo "$line"; return 0; } + return 1 } -# โ”€โ”€ ะฃะผะฝั‹ะน ะฟะพะธัะบ ะฟะพั€ั‚ะฐ (ะ˜ะกะŸะ ะะ’ะ›ะ•ะะž: ะฒั‹ะฒะพะด ัะพะพะฑั‰ะตะฝะธะน ะฒ stderr) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ find_smart_port() { local port=443 if ss -tlnp | grep -qE ":${port}\b"; then @@ -144,80 +158,7 @@ find_smart_port() { echo "$port" } -# โ”€โ”€ ะฃัั‚ะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพัั‚ะตะน โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -install_base_deps() { - local total=4 cur=0 - progress_bar $cur $total "ะŸั€ะพะฒะตั€ะบะฐ..." - - if ! command -v curl &>/dev/null; then install_pkg curl; fi - cur=$((cur+1)); progress_bar $cur $total "curl" - - if ! command -v docker &>/dev/null; then - spinner_start "ะฃัั‚ะฐะฝะพะฒะบะฐ Docker..." - curl -fsSL https://get.docker.com | sh >/dev/null 2>&1 - systemctl enable --now docker >/dev/null 2>&1 - spinner_stop - fi - cur=$((cur+1)); progress_bar $cur $total "docker" - - if ! command -v qrencode &>/dev/null; then install_pkg qrencode; fi - cur=$((cur+1)); progress_bar $cur $total "qrencode" - - if ! docker info &>/dev/null 2>&1; then systemctl start docker; fi - cur=$((cur+1)); progress_bar $cur $total "ะ“ะพั‚ะพะฒะพ" - echo "" -} - -# โ”€โ”€ IP ะฃั‚ะธะปะธั‚ั‹ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -get_ip4() { curl -s -4 --max-time 5 https://api.ipify.org || echo "0.0.0.0"; } -get_ip6() { curl -s -6 --max-time 5 https://api6.ipify.org || echo ""; } - -# โ”€โ”€ 1) ะฃัั‚ะฐะฝะพะฒะบะฐ MTProxy โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -menu_install() { - clear - echo -e "${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" - echo -e "${CYAN}โ•‘ ะฃะกะขะะะžะ’ะšะ SWIFTGRAM MTPROXY โ•‘${NC}" - echo -e "${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" - - optimize_system - - local DOMAIN=$(analyze_best_domain) - local PORT=$(find_smart_port) - - echo -e " ${GREEN}โœ“${NC} ะ˜ั‚ะพะณะพะฒั‹ะน ะฟะพั€ั‚: ${WHITE}$PORT${NC}" - fix_firewall "$PORT" - - # ะŸั€ะพั†ะตัั Docker - spinner_start "ะ—ะฐะณั€ัƒะทะบะฐ ะธ ะทะฐะฟัƒัะบ ะฟั€ะพะบัะธ (IPv4 + IPv6 + UDP)..." - docker pull nineseconds/mtg:2 >/dev/null 2>&1 - local SECRET=$(docker run --rm nineseconds/mtg:2 generate-secret --hex "$DOMAIN" 2>/dev/null) - - docker stop "$CONTAINER_NAME" &>/dev/null - docker rm "$CONTAINER_NAME" &>/dev/null - - # ะ˜ัะฟะพะปัŒะทัƒะตะผ --network host ะดะปั 100% ัะพะฒะผะตัั‚ะธะผะพัั‚ะธ ั IPv6 ะธ UDP (ะทะฒะพะฝะบะธ) - # ะกะปัƒัˆะฐะตะผ ะฝะฐ [::], ั‡ั‚ะพ ะพั…ะฒะฐั‚ั‹ะฒะฐะตั‚ ะธ IPv4, ะธ IPv6 ะธะฝั‚ะตั€ั„ะตะนัั‹ - docker run -d --name "$CONTAINER_NAME" --restart always \ - --network host \ - nineseconds/mtg:2 simple-run \ - -n 1.1.1.1 -t 1.0.0.1 -i prefer-ipv4 \ - "::$PORT" "$SECRET" > /dev/null 2>&1 - - sleep 2 - spinner_stop - - if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then - mkdir -p "$BOT_DIR" - echo "{\"domain\": \"$DOMAIN\", \"port\": \"$PORT\", \"secret\": \"$SECRET\"}" > "$BOT_DIR/proxy.json" - echo -e "\n${GREEN}โœ“ SwiftGram ัƒัะฟะตัˆะฝะพ ะทะฐะฟัƒั‰ะตะฝ ะฝะฐ ะฟะพั€ั‚ัƒ $PORT!${NC}" - show_config - else - echo -e "\n${RED}โœ— ะžัˆะธะฑะบะฐ ะทะฐะฟัƒัะบะฐ. ะŸั€ะพะฒะตั€ัŒั‚ะต: docker logs $CONTAINER_NAME${NC}" - fi - read -p "ะะฐะถะผะธั‚ะต Enter..." -} - -# โ”€โ”€ ะŸะพะบะฐะทะฐั‚ัŒ ะดะฐะฝะฝั‹ะต โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# โ”€โ”€ ะŸะพะบะฐะทะฐั‚ัŒ ะดะฐะฝะฝั‹ะต ะฟะพะดะบะปัŽั‡ะตะฝะธั โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ show_config() { if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then echo -e "${RED}ะŸั€ะพะบัะธ ะฝะต ะทะฐะฟัƒั‰ะตะฝ!${NC}"; return @@ -226,73 +167,106 @@ show_config() { local PORT=$(echo "$DATA" | grep -oP '(?<="port": ")[^"]*') local SECRET=$(echo "$DATA" | grep -oP '(?<="secret": ")[^"]*') local IP4=$(get_ip4) - local IP6=$(get_ip6) - - echo -e "\n${CYAN}--- ะ”ะะะะซะ• ะŸะžะ”ะšะ›ะฎะงะ•ะะ˜ะฏ ---${NC}" - echo -e "IPv4: ${WHITE}$IP4${NC}" - [ -n "$IP6" ] && echo -e "IPv6: ${WHITE}$IP6${NC}" - echo -e "ะŸะพั€ั‚: ${WHITE}$PORT${NC}" - echo -e "Secret: ${WHITE}$SECRET${NC}" - local LINK="tg://proxy?server=$IP4&port=$PORT&secret=$SECRET" - echo -e "\nะกัั‹ะปะบะฐ: ${BLUE}$LINK${NC}" + + echo -e "\n${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e "${CYAN}โ•‘ ะ”ะะะะซะ• ะŸะžะ”ะšะ›ะฎะงะ•ะะ˜ะฏ โ•‘${NC}" + echo -e "${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo -e " IP: ${WHITE}$IP4${NC}" + echo -e " ะŸะพั€ั‚: ${WHITE}$PORT${NC} (TCP + UDP)" + echo -e " Secret: ${WHITE}$SECRET${NC}" + echo -e "\n ะกัั‹ะปะบะฐ: ${BLUE}$LINK${NC}" + echo "" qrencode -t ANSIUTF8 "$LINK" } -# โ”€โ”€ 3) ะะฐัั‚ั€ะพะนะบะฐ ะฑะพั‚ะฐ (ะœะพะดัƒะปัŒะฝะฐั) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# โ”€โ”€ 1) ะฃัั‚ะฐะฝะพะฒะบะฐ MTProxy โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +menu_install() { + clear + echo -e "${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e "${CYAN}โ•‘ ะฃะกะขะะะžะ’ะšะ SWIFTGRAM MTPROXY โ•‘${NC}" + echo -e "${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + + local domains=("google.com" "wikipedia.org" "github.com" "habr.com" "microsoft.com" "stackoverflow.com" "lenta.ru" "rbc.ru") + echo -e "\nะ’ั‹ะฑะตั€ะธั‚ะต ะดะพะผะตะฝ ะดะปั ะผะฐัะบะธั€ะพะฒะบะธ (Fake TLS):" + for i in "${!domains[@]}"; do + printf " ${YELLOW}%2d)${NC} %-20s" "$((i+1))" "${domains[$i]}" + [[ $(( (i+1) % 2 )) -eq 0 ]] && echo "" + done + echo -e "\n ${CYAN}9)${NC} ะ’ะฒะตัั‚ะธ ัะฒะพะน ะดะพะผะตะฝ" + read -p "ะ’ั‹ะฑะพั€: " d_idx + if [ "$d_idx" = "9" ]; then read -p "ะ’ะฒะตะดะธั‚ะต ะดะพะผะตะฝ: " DOMAIN; else DOMAIN=${domains[$((d_idx-1))]}; fi + DOMAIN=${DOMAIN:-google.com} + + local PORT=$(find_smart_port) + echo -e " ${GREEN}โœ“${NC} ะ˜ั‚ะพะณะพะฒั‹ะน ะฟะพั€ั‚: ${WHITE}$PORT${NC}" + + optimize_system + fix_firewall "$PORT" + + spinner_start "ะ—ะฐะฟัƒัะบ ะบะพะฝั‚ะตะนะฝะตั€ะฐ..." + docker pull nineseconds/mtg:2 >/dev/null 2>&1 + local SECRET=$(docker run --rm nineseconds/mtg:2 generate-secret --hex "$DOMAIN" 2>/dev/null) + + docker stop "$CONTAINER_NAME" &>/dev/null + docker rm "$CONTAINER_NAME" &>/dev/null + + # ะ’ะžะ—ะ’ะ ะะข ะš ะกะขะะะ”ะะ ะขะะžะ™ ะกะฅะ•ะœะ• (Bridge + 0.0.0.0), ะบะพั‚ะพั€ะฐั ั€ะฐะฑะพั‚ะฐะปะฐ ะฒ ะพั€ะธะณะธะฝะฐะปะต + docker run -d --name "$CONTAINER_NAME" --restart always \ + -p "$PORT":"$PORT"/tcp \ + -p "$PORT":"$PORT"/udp \ + nineseconds/mtg:2 simple-run \ + -n 1.1.1.1 -i prefer-ipv4 \ + 0.0.0.0:"$PORT" "$SECRET" > /dev/null 2>&1 + + sleep 2 + spinner_stop + + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + mkdir -p "$BOT_DIR" + echo "{\"domain\": \"$DOMAIN\", \"port\": \"$PORT\", \"secret\": \"$SECRET\"}" > "$BOT_DIR/proxy.json" + echo -e "\n${GREEN}โœ“ SwiftGram ัƒัะฟะตัˆะฝะพ ะทะฐะฟัƒั‰ะตะฝ!${NC}" + show_config + else + echo -e "\n${RED}โœ— ะžัˆะธะฑะบะฐ ะทะฐะฟัƒัะบะฐ. ะŸั€ะพะฒะตั€ัŒั‚ะต: docker logs $CONTAINER_NAME${NC}" + fi + read -p "ะะฐะถะผะธั‚ะต Enter..." +} + +# โ”€โ”€ 3) ะะฐัั‚ั€ะพะนะบะฐ ะฑะพั‚ะฐ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ menu_setup_bot() { clear echo -e "${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" echo -e "${CYAN}โ•‘ ะะะกะขะ ะžะ™ะšะ TELEGRAM ะ‘ะžะขะ โ•‘${NC}" echo -e "${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" - if ! command -v python3 &>/dev/null; then - run_with_progress "ะฃัั‚ะฐะฝะพะฒะบะฐ Python3" install_pkg python3 python3-pip python3-venv - fi - + if ! command -v python3 &>/dev/null; then run_with_progress "ะฃัั‚ะฐะฝะพะฒะบะฐ Python3" install_pkg python3 python3-pip python3-venv; fi mkdir -p "$BOT_DIR" cd "$BOT_DIR" - - spinner_start "ะ—ะฐะณั€ัƒะทะบะฐ ะผะพะดัƒะปะตะน ะฑะพั‚ะฐ ะธะท ั€ะตะฟะพะทะธั‚ะพั€ะธั..." + spinner_start "ะ—ะฐะณั€ัƒะทะบะฐ ะผะพะดัƒะปะตะน..." curl -sL "$REPO_RAW_URL/requirements.txt" -o "requirements.txt" curl -sL "$REPO_RAW_URL/bot.py" -o "bot.py" spinner_stop - - if [ ! -d "venv" ]; then - spinner_start "ะกะพะทะดะฐะฝะธะต ะฒะธั€ั‚ัƒะฐะปัŒะฝะพะณะพ ะพะบั€ัƒะถะตะฝะธั..." - python3 -m venv venv >/dev/null 2>&1 - spinner_stop - fi - spinner_start "ะฃัั‚ะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพัั‚ะตะน Python..." + [ ! -d "venv" ] && python3 -m venv venv >/dev/null 2>&1 ./venv/bin/pip install --upgrade pip -q ./venv/bin/pip install -r requirements.txt -q - spinner_stop - echo -e "\n${YELLOW}ะ’ะฒะตะดะธั‚ะต BOT_TOKEN ะพั‚ @BotFather:${NC}" + echo -e "\n${YELLOW}ะ’ะฒะตะดะธั‚ะต BOT_TOKEN:${NC}" read -r TOKEN - echo -e "${YELLOW}ะ’ะฒะตะดะธั‚ะต ะฒะฐัˆ Telegram ID (ะฐะดะผะธะฝ):${NC}" + echo -e "${YELLOW}ะ’ะฐัˆ Telegram ID:${NC}" read -r ADMIN_ID - - { - echo "BOT_TOKEN=$TOKEN" - [ -n "$ADMIN_ID" ] && echo "ALLOWED_IDS=$ADMIN_ID" - echo "CONTAINER_NAME=$CONTAINER_NAME" - echo "CONFIG_PATH=$BOT_DIR/proxy.json" - } > .env + { echo "BOT_TOKEN=$TOKEN"; echo "ALLOWED_IDS=$ADMIN_ID"; echo "CONTAINER_NAME=$CONTAINER_NAME"; echo "CONFIG_PATH=$BOT_DIR/proxy.json"; } > .env chmod 600 .env cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF [Unit] -Description=SwiftGram Bot Service +Description=SwiftGram Bot After=network.target docker.service - [Service] Type=simple WorkingDirectory=$BOT_DIR ExecStart=$BOT_DIR/venv/bin/python $BOT_DIR/bot.py Restart=always -RestartSec=5 - [Install] WantedBy=multi-user.target EOF @@ -300,81 +274,39 @@ EOF systemctl daemon-reload systemctl enable --now "$SERVICE_NAME" systemctl restart "$SERVICE_NAME" - - echo -e "\n${GREEN}โœ“ ะ‘ะพั‚ ัƒัะฟะตัˆะฝะพ ะทะฐะฟัƒั‰ะตะฝ ะธ ะดะพะฑะฐะฒะปะตะฝ ะฒ ะฐะฒั‚ะพะทะฐะณั€ัƒะทะบัƒ!${NC}" + echo -e "\n${GREEN}โœ“ ะ‘ะพั‚ ะทะฐะฟัƒั‰ะตะฝ!${NC}" read -p "ะะฐะถะผะธั‚ะต Enter..." } -# โ”€โ”€ 7) ะŸะพะปะฝะพะต ะผะตะฝัŽ ัƒะดะฐะปะตะฝะธั โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# โ”€โ”€ 7) ะฃะดะฐะปะตะฝะธะต โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ menu_remove() { clear - echo -e "${RED}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" - echo -e "${RED}โ•‘ ะฃะ”ะะ›ะ•ะะ˜ะ• SWIFTGRAM โ•‘${NC}" - echo -e "${RED}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" - echo -e "ะ‘ัƒะดะตั‚ ัƒะดะฐะปะตะฝะพ: ะบะพะฝั‚ะตะนะฝะตั€, ั„ะฐะนะปั‹ ะฑะพั‚ะฐ, ัะตั€ะฒะธั ะธ ะฝะฐัั‚ั€ะพะนะบะธ.\n" - - read -p "ะ’ั‹ ัƒะฒะตั€ะตะฝั‹? (y/N): " yn + read -p "ะฃะดะฐะปะธั‚ัŒ SwiftGram ะฟะพะปะฝะพัั‚ัŒัŽ? (y/N): " yn [[ "$yn" != "y" ]] && return - - local words=("ะฃะ”ะะ›ะ˜ะขะฌ" "SWIFTGRAM" "ะžะงะ˜ะกะขะšะ" "ะคะ˜ะะะ›") - local confirm_word="${words[$((RANDOM % ${#words[@]}))]}" - echo -e "ะ’ะฒะตะดะธั‚ะต ัะปะพะฒะพ ะดะปั ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั: ${WHITE}$confirm_word${NC}" - read -p ">>> " input_word - [[ "$input_word" != "$confirm_word" ]] && { echo "ะžั‚ะผะตะฝะฐ."; sleep 1; return; } - spinner_start "ะฃะดะฐะปะตะฝะธะต..." - docker stop "$CONTAINER_NAME" &>/dev/null - docker rm "$CONTAINER_NAME" &>/dev/null - systemctl stop "$SERVICE_NAME" 2>/dev/null - systemctl disable "$SERVICE_NAME" 2>/dev/null - rm -f "/etc/systemd/system/${SERVICE_NAME}.service" - rm -rf "$BOT_DIR" - rm -f /usr/local/bin/swiftgram + docker stop "$CONTAINER_NAME" &>/dev/null; docker rm "$CONTAINER_NAME" &>/dev/null + systemctl stop "$SERVICE_NAME" 2>/dev/null; systemctl disable "$SERVICE_NAME" 2>/dev/null + rm -f "/etc/systemd/system/${SERVICE_NAME}.service"; rm -rf "$BOT_DIR"; rm -f /usr/local/bin/swiftgram spinner_stop - echo -e "${GREEN}โœ“ ะกะธัั‚ะตะผะฐ ะฟะพะปะฝะพัั‚ัŒัŽ ะพั‡ะธั‰ะตะฝะฐ.${NC}" - read -p "ะะฐะถะผะธั‚ะต Enter..." + echo -e "${GREEN}โœ“ ะฃะดะฐะปะตะฝะพ.${NC}"; read -p "Enter..." } # โ”€โ”€ ะ“ะปะฐะฒะฝั‹ะน ั†ะธะบะป โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ install_base_deps - -# ะกะฐะผะพะบะพะฟะธั€ะพะฒะฐะฝะธะต SELF="$(realpath "$0")" -if [ "$SELF" != "/usr/local/bin/swiftgram" ]; then - cp "$SELF" /usr/local/bin/swiftgram && chmod +x /usr/local/bin/swiftgram -fi +[ "$SELF" != "/usr/local/bin/swiftgram" ] && { cp "$SELF" /usr/local/bin/swiftgram; chmod +x /usr/local/bin/swiftgram; } while true; do clear echo -e "${MAGENTA}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" echo -e "${MAGENTA}โ•‘ SWIFTGRAM MANAGER (Professional) โ•‘${NC}" echo -e "${MAGENTA}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" - - if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then - echo -e " ะŸั€ะพะบัะธ: ${GREEN}ะ ะะ‘ะžะขะะ•ะข${NC}" - else - echo -e " ะŸั€ะพะบัะธ: ${RED}ะ’ะซะšะ›ะฎะงะ•ะ${NC}" - fi - if systemctl is-active --quiet "$SERVICE_NAME"; then - echo -e " ะ‘ะพั‚: ${GREEN}ะ ะะ‘ะžะขะะ•ะข${NC}" - else - echo -e " ะ‘ะพั‚: ${YELLOW}ะะ• ะะะกะขะ ะžะ•ะ${NC}" - fi - - echo -e "\n ${GREEN}1)${NC} ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ / ะžะฑะฝะพะฒะธั‚ัŒ ะฟั€ะพะบัะธ" - echo -e " ${GREEN}2)${NC} ะŸะพะบะฐะทะฐั‚ัŒ ะดะฐะฝะฝั‹ะต (QR)" - echo -e " ${CYAN}3)${NC} ะะฐัั‚ั€ะพะธั‚ัŒ Telegram-ะฑะพั‚ะฐ" - echo -e " ${GREEN}4)${NC} ะŸะตั€ะตะทะฐะฟัƒัั‚ะธั‚ัŒ ะฟั€ะพะบัะธ" - echo -e " ${RED}5)${NC} ะฃะดะฐะปะธั‚ัŒ ะฒัั‘" - echo -e " ${WHITE}0)${NC} ะ’ั‹ั…ะพะด" - echo "" + docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$" && echo -e " ะŸั€ะพะบัะธ: ${GREEN}ะ ะะ‘ะžะขะะ•ะข${NC}" || echo -e " ะŸั€ะพะบัะธ: ${RED}ะ’ะซะšะ›ะฎะงะ•ะ${NC}" + systemctl is-active --quiet "$SERVICE_NAME" && echo -e " ะ‘ะพั‚: ${GREEN}ะ ะะ‘ะžะขะะ•ะข${NC}" || echo -e " ะ‘ะพั‚: ${YELLOW}ะะ• ะะะกะขะ ะžะ•ะ${NC}" + echo -e "\n ${GREEN}1)${NC} ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ / ะžะฑะฝะพะฒะธั‚ัŒ ะฟั€ะพะบัะธ\n ${GREEN}2)${NC} ะŸะพะบะฐะทะฐั‚ัŒ ะดะฐะฝะฝั‹ะต (QR)\n ${CYAN}3)${NC} ะะฐัั‚ั€ะพะธั‚ัŒ Telegram-ะฑะพั‚ะฐ\n ${GREEN}4)${NC} ะŸะตั€ะตะทะฐะฟัƒัั‚ะธั‚ัŒ ะฟั€ะพะบัะธ\n ${RED}5)${NC} ะฃะดะฐะปะธั‚ัŒ SwiftGram\n ${WHITE}0)${NC} ะ’ั‹ั…ะพะด" read -p "ะŸัƒะฝะบั‚: " m_idx case $m_idx in - 1) menu_install ;; - 2) clear; show_config; read -p "ะะฐะถะผะธั‚ะต Enter..." ;; - 3) menu_setup_bot ;; - 4) docker restart "$CONTAINER_NAME"; echo "ะ“ะพั‚ะพะฒะพ"; sleep 1 ;; - 5) menu_remove ;; - 0) exit 0 ;; + 1) menu_install ;; 2) clear; show_config; read -p "ะะฐะถะผะธั‚ะต Enter..." ;; 3) menu_setup_bot ;; + 4) docker restart "$CONTAINER_NAME"; sleep 1 ;; 5) menu_remove ;; 0) exit 0 ;; esac done \ No newline at end of file