modified: install.sh
This commit is contained in:
107
install.sh
107
install.sh
@@ -1,6 +1,7 @@
|
||||
#!/bin/bash
|
||||
# 🚀 SwiftGram MTProxy v1.0.3 — Финальный фикс звонков (UDP)
|
||||
# Режим: Network Host + IPv4 Explicit Binding (100% Calls Compatibility)
|
||||
# 🚀 SwiftGram MTProxy — Smart Modular Manager
|
||||
# v1.0.5 — Final Working Version (TCP + UDP Calls)
|
||||
# Полный функционал, без рекламы, исправлена логика портов.
|
||||
|
||||
# ── Настройки репозитория ────────────────────────────────────────────────────
|
||||
REPO_RAW_URL="https://git.bargcraft.top/kobalt/swiftgram/raw/branch/main"
|
||||
@@ -90,6 +91,8 @@ optimize_system() {
|
||||
{
|
||||
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"
|
||||
} >> /etc/sysctl.conf
|
||||
sysctl -p >/dev/null 2>&1
|
||||
spinner_stop
|
||||
@@ -108,7 +111,7 @@ 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 настроен (TCP/UDP $port)"
|
||||
echo -e " ${GREEN}✓${NC} Firewall: порты $port (TCP/UDP) открыты"
|
||||
}
|
||||
|
||||
# ── Установка зависимостей ───────────────────────────────────────────────────
|
||||
@@ -159,6 +162,22 @@ find_smart_port() {
|
||||
echo "$port"
|
||||
}
|
||||
|
||||
# ── Интеллектуальный анализ домена ───────────────────────────────────────────
|
||||
analyze_best_domain() {
|
||||
spinner_start "Анализ доменов для Fake TLS..."
|
||||
local test_domains=("google.com" "wikipedia.org" "github.com" "habr.com" "microsoft.com")
|
||||
local best="google.com"
|
||||
local min=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 [ -n "$t" ] && (( $(echo "$t < $min" | bc -l 2>/dev/null || [ ${t%.*} -lt ${min%.*} ]) )); then
|
||||
min=$t; best=$d
|
||||
fi
|
||||
done
|
||||
spinner_stop
|
||||
echo "$best"
|
||||
}
|
||||
|
||||
# ── Показать данные подключения ──────────────────────────────────────────────
|
||||
show_config() {
|
||||
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
@@ -174,9 +193,9 @@ show_config() {
|
||||
echo -e "\n${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${CYAN}║ ДАННЫЕ ПОДКЛЮЧЕНИЯ ║${NC}"
|
||||
echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo -e " IP: ${WHITE}$IP4${NC}"
|
||||
echo -e " IPv4: ${WHITE}$IP4${NC}"
|
||||
[ -n "$IP6" ] && echo -e " IPv6: ${WHITE}$IP6${NC}"
|
||||
echo -e " Порт: ${WHITE}$PORT${NC} (Direct UDP Calls Ready)"
|
||||
echo -e " Порт: ${WHITE}$PORT${NC} (TCP + UDP)"
|
||||
echo -e " Secret: ${WHITE}$SECRET${NC}"
|
||||
echo -e "\n Ссылка: ${BLUE}$LINK${NC}"
|
||||
echo ""
|
||||
@@ -187,19 +206,35 @@ show_config() {
|
||||
menu_install() {
|
||||
clear
|
||||
echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${CYAN}║ УСТАНОВКА SWIFTGRAM MTPROXY ║${NC}"
|
||||
echo -e "${CYAN}║ Выберите домен для маскировки (Fake TLS) ║${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):"
|
||||
local domains=(
|
||||
"google.com" "wikipedia.org" "habr.com" "github.com"
|
||||
"coursera.org" "udemy.com" "medium.com" "stackoverflow.com"
|
||||
"bbc.com" "cnn.com" "reuters.com" "nytimes.com"
|
||||
"lenta.ru" "rbc.ru" "ria.ru" "kommersant.ru"
|
||||
"stepik.org" "duolingo.com" "khanacademy.org" "ted.com"
|
||||
)
|
||||
|
||||
local best_suggest=$(analyze_best_domain)
|
||||
echo -e " ${GREEN}→ Рекомендуемый домен (лучший пинг): $best_suggest${NC}\n"
|
||||
|
||||
for i in "${!domains[@]}"; do
|
||||
printf " ${YELLOW}%2d)${NC} %-20s" "$((i+1))" "${domains[$i]}"
|
||||
printf " ${YELLOW}%2d)${NC} %-22s" "$((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}
|
||||
echo -e "\n ${CYAN}21)${NC} Ввести свой домен"
|
||||
|
||||
local d_idx DOMAIN
|
||||
read -p "Ваш выбор [1-21]: " d_idx
|
||||
if [ "$d_idx" = "21" ]; then
|
||||
read -p " Введите домен: " DOMAIN
|
||||
DOMAIN=$(echo "$DOMAIN" | tr -d '[:space:]')
|
||||
else
|
||||
DOMAIN=${domains[$((d_idx-1))]}
|
||||
fi
|
||||
DOMAIN=${DOMAIN:-$best_suggest}
|
||||
|
||||
local PORT=$(find_smart_port)
|
||||
echo -e " ${GREEN}✓${NC} Итоговый порт: ${WHITE}$PORT${NC}"
|
||||
@@ -207,19 +242,19 @@ menu_install() {
|
||||
optimize_system
|
||||
fix_firewall "$PORT"
|
||||
|
||||
spinner_start "Запуск контейнера (UDP Calls Optimized)..."
|
||||
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
|
||||
|
||||
# РЕШЕНИЕ: --network host + привязка к IPv4 (0.0.0.0).
|
||||
# Это убирает NAT докера, который ломает звонки, но оставляет доступность.
|
||||
# ИСПОЛЬЗУЕМ ТОЧНУЮ КОМАНДУ, КОТОРАЯ РАБОТАЛА В ОРИГИНАЛЕ
|
||||
docker run -d --name "$CONTAINER_NAME" --restart always \
|
||||
--network host \
|
||||
-p "$PORT":"$PORT"/tcp \
|
||||
-p "$PORT":"$PORT"/udp \
|
||||
nineseconds/mtg:2 simple-run \
|
||||
-n 1.1.1.1 -t 1.0.0.1 -i prefer-ipv4 \
|
||||
-n 1.1.1.1 -i prefer-ipv4 \
|
||||
0.0.0.0:"$PORT" "$SECRET" > /dev/null 2>&1
|
||||
|
||||
sleep 2
|
||||
@@ -246,10 +281,12 @@ menu_setup_bot() {
|
||||
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
|
||||
|
||||
[ ! -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
|
||||
@@ -258,12 +295,18 @@ menu_setup_bot() {
|
||||
read -r TOKEN
|
||||
echo -e "${YELLOW}Ваш Telegram ID:${NC}"
|
||||
read -r ADMIN_ID
|
||||
{ echo "BOT_TOKEN=$TOKEN"; 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
|
||||
Description=SwiftGram Bot Service
|
||||
After=network.target docker.service
|
||||
[Service]
|
||||
Type=simple
|
||||
@@ -284,14 +327,22 @@ EOF
|
||||
# ── 7) Удаление ──────────────────────────────────────────────────────────────
|
||||
menu_remove() {
|
||||
clear
|
||||
read -p "Удалить SwiftGram полностью? (y/N): " yn
|
||||
echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${RED}║ УДАЛЕНИЕ SWIFTGRAM ║${NC}"
|
||||
echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||
read -p " Удалить полностью? (y/N): " yn
|
||||
[[ "$yn" != "y" ]] && return
|
||||
spinner_start "Удаление..."
|
||||
local words=("УДАЛИТЬ" "SWIFTGRAM" "ОЧИСТКА")
|
||||
local confirm_word="${words[$((RANDOM % ${#words[@]}))]}"
|
||||
echo -e " Введите слово: ${WHITE}$confirm_word${NC}"
|
||||
read -p " >>> " input_word
|
||||
[[ "$input_word" != "$confirm_word" ]] && 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
|
||||
spinner_stop
|
||||
echo -e "${GREEN}✓ Удалено.${NC}"; read -p "Enter..."
|
||||
echo -e "${GREEN}✓ Система очищена.${NC}"; read -p "Enter..."
|
||||
}
|
||||
|
||||
# ── Главный цикл ─────────────────────────────────────────────────────────────
|
||||
@@ -302,14 +353,16 @@ SELF="$(realpath "$0")"
|
||||
while true; do
|
||||
clear
|
||||
echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${MAGENTA}║ SWIFTGRAM MANAGER (v1.0.3) ║${NC}"
|
||||
echo -e "${MAGENTA}║ SWIFTGRAM MANAGER (Professional) ║${NC}"
|
||||
echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||
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} Выход"
|
||||
echo -e "\n ${GREEN}1)${NC} Установить / Обновить прокси\n ${GREEN}2)${NC} Показать данные (QR)\n ${CYAN}3)${NC} Настроить Telegram-бота\n ${GREEN}4)${NC} Перезапустить прокси\n ${GREEN}5)${NC} Логи прокси\n ${RED}6)${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"; sleep 1 ;; 5) menu_remove ;; 0) exit 0 ;;
|
||||
4) docker restart "$CONTAINER_NAME"; echo "Готово"; sleep 1 ;;
|
||||
5) docker logs --tail 50 "$CONTAINER_NAME"; read -p "Enter..." ;;
|
||||
6) menu_remove ;; 0) exit 0 ;;
|
||||
esac
|
||||
done
|
||||
Reference in New Issue
Block a user