#!/bin/bash # ============================================================================= # Установка Telegram-бота для управления mita # ============================================================================= set -euo pipefail RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' BLUE='\033[0;34m'; CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m' info() { echo -e "${BLUE}[INFO]${NC} $*"; } ok() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } error() { echo -e "${RED}[ERROR]${NC} $*"; exit 1; } section() { echo -e "\n${CYAN}══════ $* ══════${NC}"; } [[ $EUID -ne 0 ]] && error "Запустите от root: sudo bash install-bot.sh" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BOT_DIR="/opt/mita-bot" BOT_CONFIG="/etc/mita/bot.json" # ── поиск bot.py ──────────────────────────────────────────────────── BOT_SRC="" for candidate in "$SCRIPT_DIR/bot.py" "$SCRIPT_DIR/mita-bot-pkg/bot.py"; do if [[ -f "$candidate" ]]; then BOT_SRC="$candidate" break fi done if [[ -z "$BOT_SRC" ]]; then error "bot.py не найден рядом со скриптом. Убедитесь что bot.py лежит в одной папке с install-bot.sh" fi # ═══════════════════════════════════════════════════════════════════════ section "Установка Telegram-бота mita" # ── неинтерактивный режим (вызов из веб-панели или API) ──────────── if [[ -n "${BOT_TOKEN_NONINTERACTIVE:-}" && -n "${BOT_ADMIN_NONINTERACTIVE:-}" ]]; then BOT_TOKEN="$BOT_TOKEN_NONINTERACTIVE" ADMIN_ID="$BOT_ADMIN_NONINTERACTIVE" info "Неинтерактивный режим" else echo "" echo -e " ${BOLD}Для работы бота нужны:${NC}" echo -e " ${YELLOW}1.${NC} Токен бота от @BotFather" echo -e " ${YELLOW}2.${NC} Ваш Telegram ID (узнать: @userinfobot)" echo "" # ── токен ─────────────────────────────────────────────────────────── read -r -p "Введите токен бота (от @BotFather): " BOT_TOKEN if [[ -z "$BOT_TOKEN" ]]; then error "Токен не может быть пустым" fi # ── admin ID ───────────────────────────────────────────────────────── read -r -p "Введите ваш Telegram ID (число, узнать через @userinfobot): " ADMIN_ID if [[ -z "$ADMIN_ID" || ! "$ADMIN_ID" =~ ^[0-9]+$ ]]; then error "Telegram ID должен быть числом" fi fi echo "" info "Токен: ${BOT_TOKEN:0:8}..." info "Admin ID: $ADMIN_ID" # ── зависимости ───────────────────────────────────────────────────── section "Установка зависимостей" apt-get update -qq apt-get install -y -qq python3 python3-pip python3-venv BOT_VENV="$BOT_DIR/venv" if [[ ! -d "$BOT_VENV" ]]; then python3 -m venv "$BOT_VENV" fi info "Установка python-telegram-bot (может занять до минуты)..." _bot_pip() { PIP_RETRIES=0 timeout 30 "$BOT_VENV/bin/pip" install -q --disable-pip-version-check --timeout 5 --retries 1 "$@" } bot_pip_ok=false for mirror in "https://pypi.org/simple/" "https://mirrors.aliyun.com/pypi/simple/"; do if _bot_pip --index-url "$mirror" python-telegram-bot psutil 2>/dev/null; then bot_pip_ok=true break fi done if ! $bot_pip_ok; then warn "pip не смог установить python-telegram-bot. Пробую через apt..." rm -rf "$BOT_VENV" python3 -m venv --system-site-packages "$BOT_VENV" apt-get install -y -qq python3-psutil 2>/dev/null apt-get install -y -qq python3-telegram-bot 2>/dev/null || \ "$BOT_VENV/bin/pip" install --timeout 15 --index-url https://mirrors.aliyun.com/pypi/simple/ python-telegram-bot 2>/dev/null || { warn "Не удалось установить зависимости бота." warn "Установите вручную: /opt/mita-bot/venv/bin/pip install python-telegram-bot psutil" } fi ok "Python-зависимости бота установлены" # ── копирование файлов ────────────────────────────────────────────── section "Установка бота" mkdir -p "$BOT_DIR" cp "$BOT_SRC" "$BOT_DIR/bot.py" chmod +x "$BOT_DIR/bot.py" ok "bot.py скопирован в $BOT_DIR/" # ── конфиг ────────────────────────────────────────────────────────── mkdir -p /etc/mita if [[ -f "$BOT_CONFIG" ]]; then python3 -c " import json with open('$BOT_CONFIG') as f: d=json.load(f) d['token']='$BOT_TOKEN' admin_ids=d.get('admin_ids',[]) if '$ADMIN_ID' not in admin_ids: admin_ids.append('$ADMIN_ID') d['admin_ids']=admin_ids with open('$BOT_CONFIG','w') as f: json.dump(d,f,indent=2) " ok "Конфиг обновлён" else cat > "$BOT_CONFIG" < "$BOT_DIR/env" < /etc/systemd/system/mita-bot.service <