mirror of
https://github.com/anten-ka/gotelegram_pro.git
synced 2026-05-19 16:46:03 +00:00
461 lines
19 KiB
Bash
461 lines
19 KiB
Bash
#!/bin/bash
|
||
# ══════════════════════════════════════════════════════════════════════════════
|
||
# GoTelegram v2.2 — MTProxy на ядре telemt (Rust + Tokio)
|
||
# Anti-DPI • Fake TLS • TCP Splice • JA3/JA4 Resistance
|
||
#
|
||
# Установка:
|
||
# curl -sL URL/install.sh | sudo bash
|
||
# ══════════════════════════════════════════════════════════════════════════════
|
||
|
||
set -uo pipefail
|
||
|
||
# Путь к скрипту и библиотекам
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
LIB_DIR="$SCRIPT_DIR/lib"
|
||
|
||
# Загружаем библиотеки
|
||
source "$LIB_DIR/common.sh"
|
||
source "$LIB_DIR/telemt.sh"
|
||
source "$LIB_DIR/telemt_config.sh"
|
||
source "$LIB_DIR/website.sh"
|
||
source "$LIB_DIR/templates_catalog.sh"
|
||
source "$LIB_DIR/backup.sh"
|
||
|
||
# ── Главное меню ─────────────────────────────────────────────────────────────
|
||
show_main_menu() {
|
||
local status
|
||
status=$(telemt_status)
|
||
|
||
local status_badge
|
||
case "$status" in
|
||
running) status_badge="${GREEN}● Работает${NC}" ;;
|
||
stopped) status_badge="${YELLOW}○ Остановлен${NC}" ;;
|
||
*) status_badge="${RED}✗ Не установлен${NC}" ;;
|
||
esac
|
||
|
||
echo ""
|
||
echo -e " ${BOLD}${WHITE}Главное меню${NC} │ ${status_badge}"
|
||
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
|
||
echo -e " ${CYAN} 1)${NC} 🔧 Установить / Обновить прокси"
|
||
echo -e " ${CYAN} 2)${NC} 📊 Статус"
|
||
echo -e " ${CYAN} 3)${NC} 🔗 Ссылка для подключения"
|
||
echo -e " ${CYAN} 4)${NC} 📤 Поделиться ключом"
|
||
echo -e " ${CYAN} 5)${NC} 🔄 Перезапуск"
|
||
echo -e " ${CYAN} 6)${NC} 📋 Логи"
|
||
echo -e " ${CYAN} 7)${NC} 🎭 Сменить режим / шаблон"
|
||
echo -e " ${CYAN} 8)${NC} 💾 Бекап конфигурации"
|
||
echo -e " ${CYAN} 9)${NC} 📦 Восстановить из бекапа"
|
||
echo -e " ${CYAN}10)${NC} ⬆️ Обновить telemt"
|
||
echo -e " ${CYAN}11)${NC} 🌐 Управление сайтом (SSL)"
|
||
echo -e " ${CYAN}12)${NC} 🗑 Удалить прокси"
|
||
echo -e " ${CYAN}13)${NC} 🏷 Промо"
|
||
echo -e " ${CYAN} 0)${NC} 🚪 Выход"
|
||
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
|
||
echo -ne " ${WHITE}Выбор:${NC} "
|
||
}
|
||
|
||
# ── Установка: выбор режима ──────────────────────────────────────────────────
|
||
menu_install() {
|
||
# Проверяем v1
|
||
if detect_v1_installation; then
|
||
echo ""
|
||
echo -e " ${YELLOW}⚠️ Обнаружена установка GoTelegram v1 (mtg)${NC}"
|
||
echo -e " ${DIM}Контейнер: ${V1_CONTAINER_NAME}${NC}"
|
||
echo ""
|
||
if ! migrate_v1_to_v2; then
|
||
return
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
echo -e " ${BOLD}${WHITE}🎭 Выберите режим маскировки:${NC}"
|
||
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
|
||
echo -e " ${CYAN}1)${NC} ${GREEN}⚡ Quick${NC} — маскировка под популярный сайт"
|
||
echo -e " ${DIM}Быстро, без домена. telemt маскирует трафик${NC}"
|
||
echo -e " ${DIM}под выбранный сайт (google.com и т.д.)${NC}"
|
||
echo ""
|
||
echo -e " ${CYAN}2)${NC} ${MAGENTA}🛡 Stealth${NC} — свой сайт + полная маскировка"
|
||
echo -e " ${DIM}nginx + SSL + HTML-шаблон + telemt.${NC}"
|
||
echo -e " ${DIM}DPI видит реальный сайт с реальным сертификатом.${NC}"
|
||
echo -e " ${DIM}Требует: домен, направленный на этот сервер.${NC}"
|
||
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
|
||
echo -ne " ${WHITE}Выбор (1/2):${NC} "
|
||
read -r mode_choice
|
||
mode_choice="${mode_choice:-}"
|
||
|
||
case "$mode_choice" in
|
||
1) install_quick_mode ;;
|
||
2) install_stealth_mode ;;
|
||
*) log_error "Неверный выбор: ${mode_choice:-<пусто>}" ;;
|
||
esac
|
||
}
|
||
|
||
# ── Quick-режим ──────────────────────────────────────────────────────────────
|
||
install_quick_mode() {
|
||
log_step "Установка Quick-режима"
|
||
|
||
# Выбор домена
|
||
local domain
|
||
domain=$(select_quick_domain)
|
||
[ $? -ne 0 ] && return
|
||
|
||
# Выбор порта
|
||
local port
|
||
port=$(select_port)
|
||
[ $? -ne 0 ] && return
|
||
|
||
# Генерация секрета
|
||
local secret
|
||
secret=$(generate_hex 32)
|
||
|
||
# Подтверждение
|
||
local ip
|
||
ip=$(get_server_ip)
|
||
echo ""
|
||
echo -e " ${BOLD}${WHITE}📋 Конфигурация:${NC}"
|
||
echo -e " IP: ${CYAN}${ip}${NC}"
|
||
echo -e " Порт: ${CYAN}${port}${NC}"
|
||
echo -e " Маскировка: ${CYAN}${domain}${NC}"
|
||
echo -e " Режим: ${GREEN}Quick${NC}"
|
||
echo ""
|
||
|
||
if ! confirm "Установить прокси?"; then
|
||
return
|
||
fi
|
||
|
||
# Установка
|
||
ensure_deps
|
||
install_telemt_full || return
|
||
|
||
# Генерируем конфиг telemt
|
||
generate_telemt_toml "$secret" "$port" "quick" "$domain" "443"
|
||
|
||
# Валидация
|
||
validate_telemt_config || return
|
||
|
||
# Запуск
|
||
start_telemt || return
|
||
|
||
# Сохраняем GoTelegram конфиг
|
||
save_gotelegram_config "telemt" "quick" "$port" "$secret" "$domain" "" ""
|
||
|
||
# Благодарности
|
||
show_credits
|
||
|
||
# Результат
|
||
show_proxy_info
|
||
log_success "GoTelegram v${GOTELEGRAM_VERSION} установлен! (Quick-режим)"
|
||
}
|
||
|
||
# ── Stealth-режим ────────────────────────────────────────────────────────────
|
||
install_stealth_mode() {
|
||
log_step "Установка Stealth-режима"
|
||
|
||
# Ввод домена
|
||
echo ""
|
||
echo -ne " ${WHITE}Введите ваш домен (например, example.com):${NC} "
|
||
read -r user_domain
|
||
|
||
if [ -z "$user_domain" ] || ! validate_domain "$user_domain"; then
|
||
log_error "Некорректный домен: ${user_domain:-<пусто>}"
|
||
return
|
||
fi
|
||
|
||
# Проверяем DNS
|
||
local resolved_ip server_ip
|
||
resolved_ip=$(dig +short "$user_domain" A 2>/dev/null | head -1)
|
||
server_ip=$(get_server_ip)
|
||
|
||
if [ -n "$resolved_ip" ] && [ "$resolved_ip" != "$server_ip" ]; then
|
||
log_warning "Домен $user_domain указывает на $resolved_ip, а не на $server_ip"
|
||
if ! confirm "Продолжить всё равно?"; then
|
||
return
|
||
fi
|
||
fi
|
||
|
||
# Email для Let's Encrypt
|
||
echo -ne " ${WHITE}Email для SSL (Enter = без email):${NC} "
|
||
read -r ssl_email
|
||
|
||
# Выбор шаблона
|
||
local template_dir
|
||
template_dir=$(interactive_template_selection)
|
||
[ $? -ne 0 ] && return
|
||
|
||
# Выбор порта для telemt (внутренний)
|
||
local telemt_port=8443
|
||
echo ""
|
||
echo -e " ${DIM}telemt будет слушать на порту $telemt_port (внутренний)${NC}"
|
||
echo -e " ${DIM}nginx будет на 443 (внешний) и проксировать трафик${NC}"
|
||
|
||
# Генерация секрета
|
||
local secret
|
||
secret=$(generate_hex 32)
|
||
|
||
# Подтверждение
|
||
echo ""
|
||
echo -e " ${BOLD}${WHITE}📋 Конфигурация:${NC}"
|
||
echo -e " Домен: ${CYAN}${user_domain}${NC}"
|
||
echo -e " Порт: ${CYAN}443 (nginx) → $telemt_port (telemt)${NC}"
|
||
echo -e " Режим: ${MAGENTA}Stealth${NC}"
|
||
echo ""
|
||
|
||
if ! confirm "Установить прокси + сайт?"; then
|
||
return
|
||
fi
|
||
|
||
# Установка
|
||
ensure_deps
|
||
install_telemt_full || return
|
||
|
||
# Конфиг telemt: маскировка на localhost (nginx)
|
||
generate_telemt_toml "$secret" "$telemt_port" "stealth" "127.0.0.1" "443"
|
||
|
||
# Настройка сайта (nginx + certbot + шаблон)
|
||
setup_stealth_mode "$user_domain" "$template_dir" "$telemt_port" "$ssl_email" || return
|
||
|
||
# Запуск telemt
|
||
start_telemt || return
|
||
|
||
# Сохраняем конфиг
|
||
local tpl_id
|
||
tpl_id=$(basename "$template_dir")
|
||
save_gotelegram_config "telemt" "stealth" "443" "$secret" "127.0.0.1" "$user_domain" "$tpl_id"
|
||
|
||
# Результат
|
||
show_proxy_info
|
||
echo -e " ${WHITE}Сайт:${NC} ${GREEN}https://${user_domain}${NC}"
|
||
log_success "GoTelegram v${GOTELEGRAM_VERSION} установлен! (Stealth-режим)"
|
||
}
|
||
|
||
# ── Статус ───────────────────────────────────────────────────────────────────
|
||
menu_status() {
|
||
show_proxy_info
|
||
|
||
# Дополнительно для stealth
|
||
local mode
|
||
mode=$(config_get mode 2>/dev/null)
|
||
if [ "$mode" = "stealth" ]; then
|
||
local domain
|
||
domain=$(config_get domain 2>/dev/null)
|
||
if [ -n "$domain" ]; then
|
||
local ssl_expiry
|
||
ssl_expiry=$(get_ssl_expiry "$domain")
|
||
local nginx_st
|
||
nginx_st=$(nginx_status)
|
||
echo -e " ${WHITE}nginx:${NC} ${nginx_st}"
|
||
echo -e " ${WHITE}SSL до:${NC} ${ssl_expiry}"
|
||
echo -e " ${WHITE}Сайт:${NC} https://${domain}"
|
||
echo ""
|
||
fi
|
||
fi
|
||
}
|
||
|
||
# ── Ссылка ───────────────────────────────────────────────────────────────────
|
||
menu_link() {
|
||
local secret port ip link
|
||
secret=$(get_config_value secret)
|
||
port=$(get_config_value port)
|
||
ip=$(get_server_ip)
|
||
link=$(generate_proxy_link "$ip" "$port" "$secret")
|
||
|
||
echo ""
|
||
echo -e " ${BOLD}${WHITE}🔗 Ссылка для подключения:${NC}"
|
||
echo ""
|
||
echo -e " ${GREEN}${link}${NC}"
|
||
echo ""
|
||
|
||
if command -v qrencode &>/dev/null; then
|
||
qrencode -t UTF8 -m 2 "$link" 2>/dev/null
|
||
fi
|
||
}
|
||
|
||
# ── Поделиться ───────────────────────────────────────────────────────────────
|
||
menu_share() {
|
||
local secret port ip link
|
||
secret=$(get_config_value secret)
|
||
port=$(get_config_value port)
|
||
ip=$(get_server_ip)
|
||
link=$(generate_proxy_link "$ip" "$port" "$secret")
|
||
|
||
echo ""
|
||
echo -e " ${BOLD}📤 Перешлите это сообщение:${NC}"
|
||
echo ""
|
||
echo "🔐 MTProxy для Telegram (GoTelegram v${GOTELEGRAM_VERSION})"
|
||
echo ""
|
||
echo "🌍 Сервер: $ip"
|
||
echo "🔌 Порт: $port"
|
||
echo ""
|
||
echo "👉 Подключиться одним нажатием:"
|
||
echo "$link"
|
||
echo ""
|
||
echo "Просто нажмите на ссылку или настройте вручную."
|
||
echo ""
|
||
}
|
||
|
||
# ── Перезапуск ───────────────────────────────────────────────────────────────
|
||
menu_restart() {
|
||
restart_telemt
|
||
local mode
|
||
mode=$(config_get mode 2>/dev/null)
|
||
if [ "$mode" = "stealth" ]; then
|
||
restart_nginx
|
||
fi
|
||
}
|
||
|
||
# ── Логи ─────────────────────────────────────────────────────────────────────
|
||
menu_logs() {
|
||
echo ""
|
||
echo -e " ${BOLD}${WHITE}📋 Логи telemt (последние 40 строк):${NC}"
|
||
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
|
||
telemt_logs 40
|
||
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
|
||
}
|
||
|
||
# ── Смена режима / шаблона ───────────────────────────────────────────────────
|
||
menu_change_mode() {
|
||
local current_mode
|
||
current_mode=$(config_get mode 2>/dev/null)
|
||
echo ""
|
||
echo -e " ${WHITE}Текущий режим:${NC} ${CYAN}${current_mode}${NC}"
|
||
echo ""
|
||
echo -e " ${CYAN}1)${NC} Сменить шаблон сайта (только stealth)"
|
||
echo -e " ${CYAN}2)${NC} Переключить режим (quick ↔ stealth)"
|
||
echo -e " ${CYAN}0)${NC} Назад"
|
||
echo -ne " ${WHITE}Выбор:${NC} "
|
||
read -r ch
|
||
|
||
case "$ch" in
|
||
1)
|
||
if [ "$current_mode" != "stealth" ]; then
|
||
log_error "Смена шаблона доступна только в stealth-режиме"
|
||
return
|
||
fi
|
||
local template_dir
|
||
template_dir=$(interactive_template_selection)
|
||
[ $? -ne 0 ] && return
|
||
switch_template "$template_dir"
|
||
;;
|
||
2)
|
||
log_warning "Переключение режима требует переустановки."
|
||
if confirm "Переустановить прокси?"; then
|
||
menu_install
|
||
fi
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# ── Управление сайтом ───────────────────────────────────────────────────────
|
||
menu_website() {
|
||
local mode
|
||
mode=$(config_get mode 2>/dev/null)
|
||
if [ "$mode" != "stealth" ]; then
|
||
log_info "Управление сайтом доступно только в stealth-режиме"
|
||
return
|
||
fi
|
||
|
||
local domain
|
||
domain=$(config_get domain 2>/dev/null)
|
||
|
||
echo ""
|
||
echo -e " ${BOLD}${WHITE}🌐 Управление сайтом${NC}"
|
||
echo -e " Домен: ${CYAN}${domain}${NC}"
|
||
echo -e " SSL до: $(get_ssl_expiry "$domain")"
|
||
echo ""
|
||
echo -e " ${CYAN}1)${NC} Обновить SSL сертификат"
|
||
echo -e " ${CYAN}2)${NC} Перезапустить nginx"
|
||
echo -e " ${CYAN}3)${NC} Сменить шаблон"
|
||
echo -e " ${CYAN}0)${NC} Назад"
|
||
echo -ne " ${WHITE}Выбор:${NC} "
|
||
read -r ch
|
||
|
||
case "$ch" in
|
||
1) renew_ssl_certificate ;;
|
||
2) restart_nginx ;;
|
||
3)
|
||
local template_dir
|
||
template_dir=$(interactive_template_selection)
|
||
[ $? -ne 0 ] && return
|
||
switch_template "$template_dir"
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# ── Удаление ─────────────────────────────────────────────────────────────────
|
||
menu_remove() {
|
||
echo ""
|
||
log_warning "Это удалит прокси и все настройки."
|
||
if ! confirm "Вы уверены?"; then
|
||
return
|
||
fi
|
||
|
||
# Предлагаем бекап
|
||
if confirm "Сделать бекап перед удалением?"; then
|
||
interactive_backup
|
||
fi
|
||
|
||
remove_telemt
|
||
|
||
local mode
|
||
mode=$(config_get mode 2>/dev/null)
|
||
if [ "$mode" = "stealth" ]; then
|
||
remove_stealth_mode
|
||
fi
|
||
|
||
rm -f "$GOTELEGRAM_CONFIG"
|
||
log_success "GoTelegram полностью удалён"
|
||
}
|
||
|
||
# ── Промо ────────────────────────────────────────────────────────────────────
|
||
menu_promo() {
|
||
echo ""
|
||
echo -e " ${YELLOW}╔══════════════════════════════════════════════════════╗${NC}"
|
||
echo -e " ${YELLOW}║${NC} ${BOLD}💰 ХОСТИНГ СО СКИДКОЙ ДО -60%${NC} ${YELLOW}║${NC}"
|
||
echo -e " ${YELLOW}║${NC} Ссылка: ${CYAN}https://vk.cc/ct29NQ${NC} ${YELLOW}║${NC}"
|
||
echo -e " ${YELLOW}║${NC} ${YELLOW}║${NC}"
|
||
echo -e " ${YELLOW}║${NC} Промокоды: OFF60, antenka20, antenka6, antenka12 ${YELLOW}║${NC}"
|
||
echo -e " ${YELLOW}║${NC} ${YELLOW}║${NC}"
|
||
echo -e " ${YELLOW}║${NC} Донат: ${CYAN}https://pay.cloudtips.ru/p/7410814f${NC} ${YELLOW}║${NC}"
|
||
echo -e " ${YELLOW}╚══════════════════════════════════════════════════════╝${NC}"
|
||
echo ""
|
||
}
|
||
|
||
# ── Точка входа ──────────────────────────────────────────────────────────────
|
||
main() {
|
||
check_root
|
||
init_dirs
|
||
show_banner
|
||
|
||
# Pre-flight
|
||
check_os
|
||
check_disk_space 500
|
||
|
||
while true; do
|
||
show_main_menu
|
||
read -r choice
|
||
case "$choice" in
|
||
1) menu_install ;;
|
||
2) menu_status ;;
|
||
3) menu_link ;;
|
||
4) menu_share ;;
|
||
5) menu_restart ;;
|
||
6) menu_logs ;;
|
||
7) menu_change_mode ;;
|
||
8) interactive_backup ;;
|
||
9) interactive_restore ;;
|
||
10) update_telemt ;;
|
||
11) menu_website ;;
|
||
12) menu_remove ;;
|
||
13) menu_promo ;;
|
||
0|q|exit) echo ""; log_info "До встречи! 👋"; exit 0 ;;
|
||
*) log_error "Неверный выбор" ;;
|
||
esac
|
||
|
||
echo ""
|
||
echo -ne " ${DIM}Нажмите Enter для возврата в меню...${NC}"
|
||
read -r
|
||
done
|
||
}
|
||
|
||
main "$@"
|