mirror of
https://github.com/anten-ka/gotelegram_pro.git
synced 2026-05-19 20:36:04 +00:00
v2.2.1: unified menu with bot management, grouped sections, telemt download fix, QR cleanup, version bump
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
| Команда | Описание |
|
- **Complete CLI Feature Parity** - All menu items from CLI version
|
||||||
|--------|----------|
|
- Install (Quick/Stealth modes)
|
||||||
| `/start`, `/help` | Справка |
|
- Status monitoring
|
||||||
| `/install` | Установить или обновить прокси (выбор домена и порта) |
|
- Proxy link generation
|
||||||
| `/status` | Статус и данные подключения (IP, порт, secret, ссылка) |
|
- Share with QR codes
|
||||||
| `/link` | Только ссылка `tg://proxy` |
|
- Service restart
|
||||||
| `/restart` | Перезапустить контейнер |
|
- Logs viewing
|
||||||
| `/logs` | Последние логи контейнера |
|
- Mode/template changes
|
||||||
| `/remove` | Удалить прокси |
|
- Backup/restore
|
||||||
| `/promo` | Промо хостинга |
|
- 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
|
```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)).
|
2. Create .env file:
|
||||||
|
|
||||||
### Закрытый репозиторий (установка по ключу)
|
|
||||||
|
|
||||||
Для **приватного** репо используется клонирование по **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`
|
|
||||||
|
|
||||||
### Локально (файлы уже рядом со скриптом)
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo ./install_gotelegram_bot.sh
|
cp config.example.env .env
|
||||||
|
# Edit .env and set your BOT_TOKEN
|
||||||
|
nano .env
|
||||||
```
|
```
|
||||||
|
|
||||||
## Конфигурация
|
3. (Optional) Restrict access to specific users:
|
||||||
|
|
||||||
Файл: `/opt/gotelegram-bot/.env`
|
|
||||||
|
|
||||||
- **BOT_TOKEN** — токен от @BotFather (обязательно).
|
|
||||||
- **ALLOWED_IDS** — опционально. Список ID пользователей через запятую; если не задан, бот доступен всем.
|
|
||||||
|
|
||||||
После изменения `.env` перезапуск сервиса:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo systemctl restart gotelegram-bot
|
# Edit .env and uncomment ALLOWED_IDS
|
||||||
|
# ALLOWED_IDS=123456789,987654321
|
||||||
```
|
```
|
||||||
|
|
||||||
## Требования на сервере
|
### Running the Bot
|
||||||
|
|
||||||
- Linux (systemd), Docker, Python 3.
|
|
||||||
- Перед использованием бота на сервере должен быть установлен Docker (бот сам поднимает контейнер `nineseconds/mtg:2` по команде `/install`).
|
|
||||||
|
|
||||||
## Управление сервисом
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo systemctl status gotelegram-bot
|
python3 bot.py
|
||||||
sudo systemctl restart gotelegram-bot
|
|
||||||
journalctl -u gotelegram-bot -f
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
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
|
||||||
|
|||||||
386
install.sh
386
install.sh
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/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
|
# Anti-DPI • Fake TLS • TCP Splice • JA3/JA4 Resistance
|
||||||
#
|
#
|
||||||
# Установка:
|
# Установка:
|
||||||
@@ -23,19 +23,26 @@ source "$LIB_DIR/backup.sh"
|
|||||||
|
|
||||||
# ── Главное меню ─────────────────────────────────────────────────────────────
|
# ── Главное меню ─────────────────────────────────────────────────────────────
|
||||||
show_main_menu() {
|
show_main_menu() {
|
||||||
local status
|
local proxy_status bot_status
|
||||||
status=$(telemt_status)
|
proxy_status=$(telemt_status)
|
||||||
|
bot_status=$(bot_service_status)
|
||||||
|
|
||||||
local status_badge
|
local proxy_badge bot_badge
|
||||||
case "$status" in
|
case "$proxy_status" in
|
||||||
running) status_badge="${GREEN}● Работает${NC}" ;;
|
running) proxy_badge="${GREEN}● Работает${NC}" ;;
|
||||||
stopped) status_badge="${YELLOW}○ Остановлен${NC}" ;;
|
stopped) proxy_badge="${YELLOW}○ Остановлен${NC}" ;;
|
||||||
*) status_badge="${RED}✗ Не установлен${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
|
esac
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${BOLD}${WHITE}Главное меню${NC} │ ${status_badge}"
|
echo -e " ${BOLD}${WHITE}Главное меню${NC} │ Proxy: ${proxy_badge} │ ${bot_badge}"
|
||||||
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
|
echo -e " ${DIM}$(printf '─%.0s' {1..60})${NC}"
|
||||||
|
echo -e " ${DIM}── Прокси ──${NC}"
|
||||||
echo -e " ${CYAN} 1)${NC} 🔧 Установить / Обновить прокси"
|
echo -e " ${CYAN} 1)${NC} 🔧 Установить / Обновить прокси"
|
||||||
echo -e " ${CYAN} 2)${NC} 📊 Статус"
|
echo -e " ${CYAN} 2)${NC} 📊 Статус"
|
||||||
echo -e " ${CYAN} 3)${NC} 🔗 Ссылка для подключения"
|
echo -e " ${CYAN} 3)${NC} 🔗 Ссылка для подключения"
|
||||||
@@ -43,14 +50,17 @@ show_main_menu() {
|
|||||||
echo -e " ${CYAN} 5)${NC} 🔄 Перезапуск"
|
echo -e " ${CYAN} 5)${NC} 🔄 Перезапуск"
|
||||||
echo -e " ${CYAN} 6)${NC} 📋 Логи"
|
echo -e " ${CYAN} 6)${NC} 📋 Логи"
|
||||||
echo -e " ${CYAN} 7)${NC} 🎭 Сменить режим / шаблон"
|
echo -e " ${CYAN} 7)${NC} 🎭 Сменить режим / шаблон"
|
||||||
|
echo -e " ${DIM}── Управление ──${NC}"
|
||||||
echo -e " ${CYAN} 8)${NC} 💾 Бекап конфигурации"
|
echo -e " ${CYAN} 8)${NC} 💾 Бекап конфигурации"
|
||||||
echo -e " ${CYAN} 9)${NC} 📦 Восстановить из бекапа"
|
echo -e " ${CYAN} 9)${NC} 📦 Восстановить из бекапа"
|
||||||
echo -e " ${CYAN}10)${NC} ⬆️ Обновить telemt"
|
echo -e " ${CYAN}10)${NC} ⬆️ Обновить telemt"
|
||||||
echo -e " ${CYAN}11)${NC} 🌐 Управление сайтом (SSL)"
|
echo -e " ${CYAN}11)${NC} 🌐 Управление сайтом (SSL)"
|
||||||
echo -e " ${CYAN}12)${NC} 🗑 Удалить прокси"
|
echo -e " ${DIM}── Бот и прочее ──${NC}"
|
||||||
echo -e " ${CYAN}13)${NC} 🏷 Промо"
|
echo -e " ${CYAN}12)${NC} 🤖 Telegram-бот"
|
||||||
|
echo -e " ${CYAN}13)${NC} 🗑 Удалить всё"
|
||||||
|
echo -e " ${CYAN}14)${NC} 🏷 Промо"
|
||||||
echo -e " ${CYAN} 0)${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} "
|
echo -ne " ${WHITE}Выбор:${NC} "
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,26 +394,337 @@ menu_website() {
|
|||||||
# ── Удаление ─────────────────────────────────────────────────────────────────
|
# ── Удаление ─────────────────────────────────────────────────────────────────
|
||||||
menu_remove() {
|
menu_remove() {
|
||||||
echo ""
|
echo ""
|
||||||
log_warning "Это удалит прокси и все настройки."
|
echo -e " ${BOLD}${RED}🗑 Удаление GoTelegram${NC}"
|
||||||
if ! confirm "Вы уверены?"; then
|
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
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Предлагаем бекап
|
systemctl stop "$BOT_SERVICE" 2>/dev/null
|
||||||
if confirm "Сделать бекап перед удалением?"; then
|
systemctl disable "$BOT_SERVICE" 2>/dev/null
|
||||||
interactive_backup
|
rm -f "/etc/systemd/system/${BOT_SERVICE}.service"
|
||||||
fi
|
systemctl daemon-reload
|
||||||
|
rm -rf "$BOT_DIR"
|
||||||
remove_telemt
|
log_success "Бот полностью удалён"
|
||||||
|
|
||||||
local mode
|
|
||||||
mode=$(config_get mode 2>/dev/null)
|
|
||||||
if [ "$mode" = "stealth" ]; then
|
|
||||||
remove_stealth_mode
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -f "$GOTELEGRAM_CONFIG"
|
|
||||||
log_success "GoTelegram полностью удалён"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Промо ────────────────────────────────────────────────────────────────────
|
# ── Промо ────────────────────────────────────────────────────────────────────
|
||||||
@@ -445,8 +766,9 @@ main() {
|
|||||||
9) interactive_restore ;;
|
9) interactive_restore ;;
|
||||||
10) update_telemt ;;
|
10) update_telemt ;;
|
||||||
11) menu_website ;;
|
11) menu_website ;;
|
||||||
12) menu_remove ;;
|
12) menu_bot ;;
|
||||||
13) menu_promo ;;
|
13) menu_remove ;;
|
||||||
|
14) menu_promo ;;
|
||||||
0|q|exit) echo ""; log_info "До встречи! 👋"; exit 0 ;;
|
0|q|exit) echo ""; log_info "До встречи! 👋"; exit 0 ;;
|
||||||
*) log_error "Неверный выбор" ;;
|
*) log_error "Неверный выбор" ;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# GoTelegram v2.2 — Установка Telegram-бота
|
# GoTelegram v2.2.1 — Установка Telegram-бота
|
||||||
# Создаёт venv, ставит зависимости, настраивает systemd
|
# Создаёт venv, ставит зависимости, настраивает systemd
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
@@ -19,7 +19,7 @@ if [ "$EUID" -ne 0 ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "${CYAN}╔═══════════════════════════════════════════╗${NC}"
|
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 -e "${CYAN}╚═══════════════════════════════════════════╝${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ fi
|
|||||||
# ── Systemd ──────────────────────────────────────────────────────────────────
|
# ── Systemd ──────────────────────────────────────────────────────────────────
|
||||||
cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF
|
cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=GoTelegram v2.2 Telegram Bot
|
Description=GoTelegram v2.2.1 Telegram Bot
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
|||||||
Reference in New Issue
Block a user