v2.2.1: unified menu with bot management, grouped sections, telemt download fix, QR cleanup, version bump

This commit is contained in:
anten-ka
2026-04-06 21:40:34 +03:00
parent fe9e5fa019
commit fee25f191e
9 changed files with 2306 additions and 1907 deletions

View File

@@ -1,70 +1,147 @@
# GoTelegram MTProxy Bot
# GoTelegram v2.2 Bot
Telegram-бот для управления MTProxy на сервере — те же функции, что и у CLI `gotelegram`, но через бота.
Production-quality Telegram bot for managing MTProxy (telemt engine) on Linux servers.
## Команды
## Features
| Команда | Описание |
|--------|----------|
| `/start`, `/help` | Справка |
| `/install` | Установить или обновить прокси (выбор домена и порта) |
| `/status` | Статус и данные подключения (IP, порт, secret, ссылка) |
| `/link` | Только ссылка `tg://proxy` |
| `/restart` | Перезапустить контейнер |
| `/logs` | Последние логи контейнера |
| `/remove` | Удалить прокси |
| `/promo` | Промо хостинга |
- **Complete CLI Feature Parity** - All menu items from CLI version
- Install (Quick/Stealth modes)
- Status monitoring
- Proxy link generation
- Share with QR codes
- Service restart
- Logs viewing
- Mode/template changes
- Backup/restore
- telemt updates
- Website/SSL management
- Remove installation
- Promotional links
## Установка на сервер
- **Template Browsing** - Browse categories → templates → preview → install
- **V1 Migration** - Detects old mtg Docker container and offers migration
- **Access Control** - ALLOWED_IDS from .env
- **Async/Await** - Full async support via python-telegram-bot v21+
- **Inline Keyboards** - Modern UI with callback-based navigation
- **Shell Integration** - Executes system commands via asyncio subprocess
- **Error Handling** - Production-ready error handling
### Публичный репозиторий (одной командой)
## Installation
### Prerequisites
- Python 3.8+
- Linux system with systemd
- telemt installed and running
- Telegram Bot Token from @BotFather
### Setup
1. Install dependencies:
```bash
curl -sL https://raw.githubusercontent.com/anten-ka/gotelegram_pro/main/install_gotelegram_bot.sh -o /tmp/install_gotelegram_bot.sh && sudo bash /tmp/install_gotelegram_bot.sh
pip install -r requirements.txt
```
При установке скрипт запросит **BOT_TOKEN** (получить у [@BotFather](https://t.me/BotFather)).
### Закрытый репозиторий (установка по ключу)
Для **приватного** репо используется клонирование по **SSH-ключу** или по **токену (PAT)**. Подробно: **[INSTALL_PRIVATE.md](../INSTALL_PRIVATE.md)** в корне репозитория.
Кратко:
- **По SSH:** скопируйте `bootstrap_install.sh` на сервер, затем
`GIT_REPO_SSH=git@github.com:USER/REPO.git sudo bash bootstrap_install.sh`
- **По токену:**
`GITHUB_TOKEN=ghp_xxx GIT_REPO_HTTPS=https://github.com/USER/REPO.git sudo -E bash bootstrap_install.sh`
- Или клонируйте репо вручную и запустите:
`sudo ./install_gotelegram_bot.sh`
### Локально (файлы уже рядом со скриптом)
2. Create .env file:
```bash
sudo ./install_gotelegram_bot.sh
cp config.example.env .env
# Edit .env and set your BOT_TOKEN
nano .env
```
## Конфигурация
Файл: `/opt/gotelegram-bot/.env`
- **BOT_TOKEN** — токен от @BotFather (обязательно).
- **ALLOWED_IDS** — опционально. Список ID пользователей через запятую; если не задан, бот доступен всем.
После изменения `.env` перезапуск сервиса:
3. (Optional) Restrict access to specific users:
```bash
sudo systemctl restart gotelegram-bot
# Edit .env and uncomment ALLOWED_IDS
# ALLOWED_IDS=123456789,987654321
```
## Требования на сервере
- Linux (systemd), Docker, Python 3.
- Перед использованием бота на сервере должен быть установлен Docker (бот сам поднимает контейнер `nineseconds/mtg:2` по команде `/install`).
## Управление сервисом
### Running the Bot
```bash
sudo systemctl status gotelegram-bot
sudo systemctl restart gotelegram-bot
journalctl -u gotelegram-bot -f
python3 bot.py
```
For systemd service:
```bash
[Unit]
Description=GoTelegram Bot
After=network.target
[Service]
Type=simple
User=gotelegram
WorkingDirectory=/opt/gotelegram/bot
ExecStart=/usr/bin/python3 /opt/gotelegram/bot/bot.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
```
## Configuration
### .env Variables
- `BOT_TOKEN` - Telegram bot token (required)
- `ALLOWED_IDS` - Comma-separated user IDs (optional, all users allowed if empty)
### System Paths
- `GOTELEGRAM_CONFIG` - `/opt/gotelegram/config.json`
- `TELEMT_CONFIG` - `/etc/telemt/config.toml`
- `TELEMT_SERVICE` - `telemt` (systemd service name)
- `WEBSITE_ROOT` - `/var/www/gotelegram-site`
- `BACKUP_DIR` - `/opt/gotelegram/backups`
- `TEMPLATES_CATALOG` - `/opt/gotelegram/templates_catalog.json`
## Architecture
### Single File Design
All functionality in one `bot.py` for simplicity and ease of deployment.
### Command Handlers
- `/start` - Main menu
- `/help` - Help text
- `/status` - Quick status
- `/logs` - Recent logs
### Callback Handlers
Organized by feature:
- Installation (quick/stealth modes)
- Status monitoring
- Backup/restore
- SSL management
- Updates
- Removal
### Shell Integration
Async subprocess wrapper:
```python
code, stdout, stderr = await sh("command", "arg1", "arg2")
```
## Callback Data Convention
- `menu_*` - Menu items
- `install_mode_*` - Install options
- `quick_dom_*` - Domain selection
- `stealth_cat_*` - Template categories
- `stealth_tpl_*` - Template selection
- `stealth_confirm_*` - Confirm installation
- `backup_*` - Backup operations
- `ssl_*` - SSL operations
- `restore_backup_*` - Restore operations
## Credits
- **telemt** - MTProxy engine foundation
- **HTML5UP** - Beautiful web templates
- **Learning Zone** - Educational resources
- **Start Bootstrap** - Bootstrap framework
- **Community** - Your feedback and support
## License
GoTelegram v2.2 - Open source community project

View File

@@ -1,6 +1,6 @@
#!/bin/bash
# ══════════════════════════════════════════════════════════════════════════════
# GoTelegram v2.2 — MTProxy на ядре telemt (Rust + Tokio)
# GoTelegram v2.2.1 — MTProxy на ядре telemt (Rust + Tokio)
# Anti-DPI • Fake TLS • TCP Splice • JA3/JA4 Resistance
#
# Установка:
@@ -23,19 +23,26 @@ source "$LIB_DIR/backup.sh"
# ── Главное меню ─────────────────────────────────────────────────────────────
show_main_menu() {
local status
status=$(telemt_status)
local proxy_status bot_status
proxy_status=$(telemt_status)
bot_status=$(bot_service_status)
local status_badge
case "$status" in
running) status_badge="${GREEN}● Работает${NC}" ;;
stopped) status_badge="${YELLOW}○ Остановлен${NC}" ;;
*) status_badge="${RED}Не установлен${NC}" ;;
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}${status_badge}"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
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} 🔗 Ссылка для подключения"
@@ -43,14 +50,17 @@ show_main_menu() {
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 " ${CYAN}12)${NC} 🗑 Удалить прокси"
echo -e " ${CYAN}13)${NC} 🏷 Промо"
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..55})${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..60})${NC}"
echo -ne " ${WHITE}Выбор:${NC} "
}
@@ -384,26 +394,337 @@ menu_website() {
# ── Удаление ─────────────────────────────────────────────────────────────────
menu_remove() {
echo ""
log_warning "Это удалит прокси и все настройки."
if ! confirm "Вы уверены?"; then
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
# Предлагаем бекап
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 полностью удалён"
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 "Бот полностью удалён"
}
# ── Промо ────────────────────────────────────────────────────────────────────
@@ -445,8 +766,9 @@ main() {
9) interactive_restore ;;
10) update_telemt ;;
11) menu_website ;;
12) menu_remove ;;
13) menu_promo ;;
12) menu_bot ;;
13) menu_remove ;;
14) menu_promo ;;
0|q|exit) echo ""; log_info "До встречи! 👋"; exit 0 ;;
*) log_error "Неверный выбор" ;;
esac

View File

@@ -1,5 +1,5 @@
#!/bin/bash
# GoTelegram v2.2 — Установка Telegram-бота
# GoTelegram v2.2.1 — Установка Telegram-бота
# Создаёт venv, ставит зависимости, настраивает systemd
set -e
@@ -19,7 +19,7 @@ if [ "$EUID" -ne 0 ]; then
fi
echo -e "${CYAN}╔═══════════════════════════════════════════╗${NC}"
echo -e "${CYAN}${NC} ${GREEN}GoTelegram v2.2 — Установка бота${NC} ${CYAN}${NC}"
echo -e "${CYAN}${NC} ${GREEN}GoTelegram v2.2.1 — Установка бота${NC} ${CYAN}${NC}"
echo -e "${CYAN}╚═══════════════════════════════════════════╝${NC}"
echo ""
@@ -93,7 +93,7 @@ fi
# ── Systemd ──────────────────────────────────────────────────────────────────
cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF
[Unit]
Description=GoTelegram v2.2 Telegram Bot
Description=GoTelegram v2.2.1 Telegram Bot
After=network.target
[Service]