Files
gotelegram_pro/install.sh

797 lines
32 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ══════════════════════════════════════════════════════════════════════════════
# GoTelegram v2.2.1 — 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 "$(readlink -f "${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 proxy_status bot_status
proxy_status=$(telemt_status)
bot_status=$(bot_service_status)
local proxy_badge bot_badge
case "$proxy_status" in
running) proxy_badge="${GREEN}● Работает${NC}" ;;
stopped) proxy_badge="${YELLOW}○ Остановлен${NC}" ;;
*) proxy_badge="${RED}Не установлен${NC}" ;;
esac
case "$bot_status" in
running) bot_badge="${GREEN}● Бот работает${NC}" ;;
stopped) bot_badge="${YELLOW}○ Бот остановлен${NC}" ;;
*) bot_badge="${DIM}нет${NC}" ;;
esac
echo ""
echo -e " ${BOLD}${WHITE}Главное меню${NC} │ Proxy: ${proxy_badge}${bot_badge}"
echo -e " ${DIM}$(printf '─%.0s' {1..60})${NC}"
echo -e " ${DIM}── Прокси ──${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 " ${DIM}── Управление ──${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 " ${DIM}── Бот и прочее ──${NC}"
echo -e " ${CYAN}12)${NC} 🤖 Telegram-бот"
echo -e " ${CYAN}13)${NC} 🗑 Удалить всё"
echo -e " ${CYAN}14)${NC} 🏷 Промо"
echo -e " ${CYAN} 0)${NC} 🚪 Выход"
echo -e " ${DIM}$(printf '─%.0s' {1..60})${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
# Архитектура Stealth:
# telemt слушает на 0.0.0.0:443 (принимает ВСЕ подключения)
# nginx слушает на 127.0.0.1:8443 с SSL (обслуживает сайт)
# MTProxy клиент → :443 → telemt (проксирует)
# Обычный браузер → :443 → telemt → 127.0.0.1:8443 → nginx (сайт)
# Провайдер видит только HTTPS на 443 к домену
local nginx_internal_port=8443
echo ""
echo -e " ${DIM}telemt принимает весь трафик на 443 (маскировка под HTTPS)${NC}"
echo -e " ${DIM}nginx обслуживает сайт на внутреннем порту $nginx_internal_port${NC}"
echo -e " ${DIM}Провайдер видит только HTTPS-трафик к ${user_domain}:443${NC}"
# Генерация fake-TLS секрета (ee + secret + hex domain)
# Префикс ee говорит Telegram-клиенту маскировать трафик под TLS к домену
local raw_secret
raw_secret=$(generate_hex 32)
local domain_hex
domain_hex=$(printf '%s' "$user_domain" | xxd -p | tr -d '\n')
local faketls_secret="ee${raw_secret}${domain_hex}"
# Подтверждение
echo ""
echo -e " ${BOLD}${WHITE}📋 Конфигурация:${NC}"
echo -e " Домен: ${CYAN}${user_domain}${NC}"
echo -e " Порт: ${CYAN}443 (telemt + nginx внутри)${NC}"
echo -e " Режим: ${MAGENTA}Stealth (fake-TLS)${NC}"
echo ""
if ! confirm "Установить прокси + сайт?"; then
return
fi
# Установка
ensure_deps
install_telemt_full || return
# Конфиг telemt: слушает 443, маскировка на локальный nginx
generate_telemt_toml "$raw_secret" "443" "stealth" "127.0.0.1" "$nginx_internal_port"
# Настройка сайта (nginx на внутреннем порту + certbot + шаблон)
setup_stealth_mode "$user_domain" "$template_dir" "$nginx_internal_port" "$ssl_email" || return
# Останавливаем nginx на 443 перед запуском telemt (telemt займёт 443)
# nginx уже перенастроен на внутренний порт
systemctl restart nginx 2>/dev/null
# Запуск telemt
start_telemt || return
# Сохраняем конфиг
local tpl_id
tpl_id=$(basename "$template_dir")
save_gotelegram_config "telemt" "stealth" "443" "$raw_secret" "$user_domain" "$user_domain" "$tpl_id"
# Результат — используем домен и fake-TLS ссылку
show_proxy_info_stealth "$user_domain" "$faketls_secret"
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 ""
echo -e " ${BOLD}${RED}🗑 Удаление GoTelegram${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
echo -e " ${CYAN}1)${NC} Удалить только прокси (telemt)"
echo -e " ${CYAN}2)${NC} Удалить только Telegram-бота"
echo -e " ${CYAN}3)${NC} Удалить всё (прокси + бот + настройки)"
echo -e " ${CYAN}0)${NC} Назад"
echo -ne " ${WHITE}Выбор:${NC} "
read -r rm_choice
case "$rm_choice" in
1)
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 "Прокси удалён"
;;
2)
bot_remove
;;
3)
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"
# Бот
if [ "$(bot_service_status)" != "not_installed" ]; then
systemctl stop "$BOT_SERVICE" 2>/dev/null
systemctl disable "$BOT_SERVICE" 2>/dev/null
rm -f "/etc/systemd/system/${BOT_SERVICE}.service"
systemctl daemon-reload
rm -rf "$BOT_DIR"
fi
log_success "GoTelegram полностью удалён (прокси + бот)"
;;
esac
}
# ── Telegram-бот ────────────────────────────────────────────────────────────
BOT_DIR="/opt/gotelegram-bot"
BOT_SERVICE="gotelegram-bot"
bot_service_status() {
if ! systemctl list-unit-files "$BOT_SERVICE.service" &>/dev/null 2>&1; then
echo "not_installed"
elif systemctl is-active "$BOT_SERVICE" &>/dev/null 2>&1; then
echo "running"
else
echo "stopped"
fi
}
menu_bot() {
local st
st=$(bot_service_status)
echo ""
echo -e " ${BOLD}${WHITE}🤖 Telegram-бот${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
case "$st" in
running)
echo -e " Статус: ${GREEN}● Работает${NC}"
echo ""
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} ⚙️ Настройки (.env)"
echo -e " ${CYAN}6)${NC} 🗑 Удалить бота"
;;
stopped)
echo -e " Статус: ${YELLOW}○ Остановлен${NC}"
echo ""
echo -e " ${CYAN}1)${NC} 📊 Статус бота"
echo -e " ${CYAN}2)${NC} 📋 Логи бота"
echo -e " ${CYAN}3)${NC} ▶️ Запустить бота"
echo -e " ${CYAN}5)${NC} ⚙️ Настройки (.env)"
echo -e " ${CYAN}6)${NC} 🗑 Удалить бота"
;;
*)
echo -e " Статус: ${RED}Не установлен${NC}"
echo ""
echo -e " ${DIM}Бот позволяет управлять прокси прямо из Telegram:${NC}"
echo -e " ${DIM}статус, перезапуск, смена режима, бекап, QR-код.${NC}"
echo ""
echo -e " ${CYAN}1)${NC} 🔧 Установить бота"
;;
esac
echo -e " ${CYAN}0)${NC} « Назад"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
echo -ne " ${WHITE}Выбор:${NC} "
read -r ch
case "$st" in
running)
case "$ch" in
1) bot_show_status ;;
2) bot_show_logs ;;
3) systemctl restart "$BOT_SERVICE" && log_success "Бот перезапущен" ;;
4) systemctl stop "$BOT_SERVICE" && log_info "Бот остановлен" ;;
5) bot_edit_config ;;
6) bot_remove ;;
esac
;;
stopped)
case "$ch" in
1) bot_show_status ;;
2) bot_show_logs ;;
3) systemctl start "$BOT_SERVICE" && log_success "Бот запущен" ;;
5) bot_edit_config ;;
6) bot_remove ;;
esac
;;
*)
case "$ch" in
1) bot_install ;;
esac
;;
esac
}
bot_install() {
log_step "Установка Telegram-бота"
# Python
if ! command -v python3 &>/dev/null; then
log_info "Установка Python3..."
if command -v apt-get &>/dev/null; then
apt-get update -qq && apt-get install -y -qq python3 python3-pip python3-venv
elif command -v dnf &>/dev/null; then
dnf install -y -q python3 python3-pip
elif command -v yum &>/dev/null; then
yum install -y -q python3 python3-pip
fi
fi
# Копируем файлы бота
mkdir -p "$BOT_DIR"
if [ -f "$SCRIPT_DIR/gotelegram-bot/bot.py" ]; then
cp "$SCRIPT_DIR/gotelegram-bot/bot.py" "$BOT_DIR/"
cp "$SCRIPT_DIR/gotelegram-bot/requirements.txt" "$BOT_DIR/"
[ -f "$SCRIPT_DIR/gotelegram-bot/config.example.env" ] && \
cp "$SCRIPT_DIR/gotelegram-bot/config.example.env" "$BOT_DIR/"
else
log_error "Файлы бота не найдены в $SCRIPT_DIR/gotelegram-bot/"
return 1
fi
# Каталог шаблонов
[ -f "$SCRIPT_DIR/templates_catalog.json" ] && \
cp "$SCRIPT_DIR/templates_catalog.json" "$GOTELEGRAM_DIR/"
# Venv
if [ ! -d "$BOT_DIR/venv" ]; then
log_info "Создание виртуального окружения..."
python3 -m venv "$BOT_DIR/venv"
fi
log_info "Установка зависимостей..."
"$BOT_DIR/venv/bin/pip" install -r "$BOT_DIR/requirements.txt" -q
# Конфигурация
if [ ! -f "$BOT_DIR/.env" ]; then
echo ""
echo -e " ${YELLOW}Введите BOT_TOKEN от @BotFather:${NC}"
local token=""
while [ -z "$token" ]; do
echo -ne " ${WHITE}Token:${NC} "
read -r token
token=$(echo "$token" | tr -d '[:space:]')
[ -z "$token" ] && log_error "Токен не может быть пустым"
done
echo -ne " ${WHITE}ID администратора (Enter = доступ для всех):${NC} "
read -r admin_id
{
echo "BOT_TOKEN=$token"
[ -n "$admin_id" ] && echo "ALLOWED_IDS=$admin_id"
} > "$BOT_DIR/.env"
chmod 600 "$BOT_DIR/.env"
log_success ".env создан"
else
log_info ".env уже существует, настройки сохранены"
fi
# Systemd
cat > "/etc/systemd/system/${BOT_SERVICE}.service" << SVCEOF
[Unit]
Description=GoTelegram v${GOTELEGRAM_VERSION} Telegram Bot
After=network.target
[Service]
Type=simple
WorkingDirectory=$BOT_DIR
ExecStart=$BOT_DIR/venv/bin/python $BOT_DIR/bot.py
Restart=always
RestartSec=5
Environment=PATH=$BOT_DIR/venv/bin:/usr/bin
[Install]
WantedBy=multi-user.target
SVCEOF
systemctl daemon-reload
systemctl enable "$BOT_SERVICE" &>/dev/null
systemctl restart "$BOT_SERVICE" 2>/dev/null || systemctl start "$BOT_SERVICE"
echo ""
log_success "Бот установлен и запущен!"
echo -e " ${DIM}Проверка: systemctl status $BOT_SERVICE${NC}"
echo -e " ${DIM}Логи: journalctl -u $BOT_SERVICE -f${NC}"
}
bot_show_status() {
echo ""
echo -e " ${BOLD}${WHITE}📊 Статус Telegram-бота${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
systemctl status "$BOT_SERVICE" --no-pager -l 2>/dev/null | head -15 | while IFS= read -r line; do
echo " $line"
done
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
if [ -f "$BOT_DIR/.env" ]; then
local has_token has_ids
has_token=$(grep -c "BOT_TOKEN=" "$BOT_DIR/.env" 2>/dev/null || echo 0)
has_ids=$(grep "ALLOWED_IDS=" "$BOT_DIR/.env" 2>/dev/null | cut -d= -f2)
echo -e " Token: ${has_token:+${GREEN}✓ настроен${NC}}"
echo -e " Доступ: ${has_ids:+ID: $has_ids}${has_ids:-${YELLOW}все пользователи${NC}}"
fi
}
bot_show_logs() {
echo ""
echo -e " ${BOLD}${WHITE}📋 Логи бота (последние 30 строк):${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
journalctl -u "$BOT_SERVICE" --no-pager -n 30 2>/dev/null | while IFS= read -r line; do
echo " $line"
done
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
}
bot_edit_config() {
echo ""
echo -e " ${BOLD}${WHITE}⚙️ Настройки бота${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
if [ -f "$BOT_DIR/.env" ]; then
echo -e " ${DIM}Текущий .env:${NC}"
while IFS= read -r line; do
# Маскируем токен для безопасности
if [[ "$line" == BOT_TOKEN=* ]]; then
local tok="${line#BOT_TOKEN=}"
echo -e " BOT_TOKEN=${tok:0:10}...${tok: -5}"
else
echo " $line"
fi
done < "$BOT_DIR/.env"
fi
echo ""
echo -e " ${CYAN}1)${NC} Сменить BOT_TOKEN"
echo -e " ${CYAN}2)${NC} Изменить ALLOWED_IDS"
echo -e " ${CYAN}0)${NC} Назад"
echo -ne " ${WHITE}Выбор:${NC} "
read -r ch
case "$ch" in
1)
echo -ne " ${WHITE}Новый BOT_TOKEN:${NC} "
read -r new_token
new_token=$(echo "$new_token" | tr -d '[:space:]')
if [ -n "$new_token" ]; then
sed -i "s|^BOT_TOKEN=.*|BOT_TOKEN=$new_token|" "$BOT_DIR/.env"
systemctl restart "$BOT_SERVICE"
log_success "Токен обновлён, бот перезапущен"
else
log_error "Пустой токен"
fi
;;
2)
echo -ne " ${WHITE}ALLOWED_IDS (через запятую, пусто = все):${NC} "
read -r new_ids
new_ids=$(echo "$new_ids" | tr -d '[:space:]')
if grep -q "^ALLOWED_IDS=" "$BOT_DIR/.env" 2>/dev/null; then
if [ -n "$new_ids" ]; then
sed -i "s|^ALLOWED_IDS=.*|ALLOWED_IDS=$new_ids|" "$BOT_DIR/.env"
else
sed -i '/^ALLOWED_IDS=/d' "$BOT_DIR/.env"
fi
else
[ -n "$new_ids" ] && echo "ALLOWED_IDS=$new_ids" >> "$BOT_DIR/.env"
fi
systemctl restart "$BOT_SERVICE"
log_success "Доступ обновлён, бот перезапущен"
;;
esac
}
bot_remove() {
echo ""
log_warning "Это удалит Telegram-бота и все его настройки."
if ! confirm "Удалить бота?"; then
return
fi
systemctl stop "$BOT_SERVICE" 2>/dev/null
systemctl disable "$BOT_SERVICE" 2>/dev/null
rm -f "/etc/systemd/system/${BOT_SERVICE}.service"
systemctl daemon-reload
rm -rf "$BOT_DIR"
log_success "Бот полностью удалён"
}
# ── Промо ────────────────────────────────────────────────────────────────────
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_bot ;;
13) menu_remove ;;
14) menu_promo ;;
0|q|exit) echo ""; log_info "До встречи! 👋"; exit 0 ;;
*) log_error "Неверный выбор" ;;
esac
echo ""
echo -ne " ${DIM}Нажмите Enter для возврата в меню...${NC}"
read -r
done
}
main "$@"