#!/bin/bash # Универсальный установщик Telegram CLI Bot # Автоматически устанавливает зависимости (npm + pip) и qwen-code set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Функции вывода info() { echo -e "${BLUE}ℹ️ $1${NC}"; } success() { echo -e "${GREEN}✅ $1${NC}"; } warning() { echo -e "${YELLOW}⚠️ $1${NC}"; } error() { echo -e "${RED}❌ $1${NC}"; } # Проверка: новая установка или обновление if [ -f "$SCRIPT_DIR/.installed" ]; then INSTALL_TYPE="update" INSTALLED_VERSION=$(cat "$SCRIPT_DIR/.installed" 2>/dev/null || echo "unknown") echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "🔄 Обновление Telegram CLI Bot" echo "📦 Текущая версия: $INSTALLED_VERSION" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" else INSTALL_TYPE="install" echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "🚀 Установка Telegram CLI Bot" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" fi # ============================================================================ # Проверка системных требований # ============================================================================ echo "📋 Проверка системных требований..." # Проверка Python if command -v python3 &> /dev/null; then PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}') success "Python: $PYTHON_VERSION" else error "Python3 не найден!" echo "Установите Python 3.10 или выше:" echo " Ubuntu/Debian: sudo apt install python3 python3-pip python3-venv" echo " Fedora: sudo dnf install python3 python3-pip" exit 1 fi # Проверка pip if command -v pip3 &> /dev/null || command -v pip &> /dev/null; then PIP_CMD=$(command -v pip3 2>/dev/null || command -v pip 2>/dev/null) success "pip: $(pip3 --version 2>&1 | head -1 || pip --version 2>&1 | head -1)" else error "pip не найден!" echo "Установите pip:" echo " Ubuntu/Debian: sudo apt install python3-pip" exit 1 fi # Проверка Node.js и npm if command -v node &> /dev/null; then NODE_VERSION=$(node --version) success "Node.js: $NODE_VERSION" else warning "Node.js не найден" echo "Node.js требуется для qwen-code (ИИ-агент)." echo "Установить Node.js?" read -p "y/n: " INSTALL_NODE if [[ "$INSTALL_NODE" =~ ^[Yy]$ ]]; then # Установка Node.js if [ -f /etc/debian_version ]; then curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs elif [ -f /etc/redhat-release ]; then curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - sudo yum install -y nodejs else echo "Установите Node.js вручную: https://nodejs.org/" exit 1 fi success "Node.js установлен" else warning "Пропущена установка Node.js (qwen-code не будет работать)" fi fi # Проверка npm if command -v npm &> /dev/null; then NPM_VERSION=$(npm --version) success "npm: $NPM_VERSION" else warning "npm не найден (qwen-code не будет работать)" fi # ============================================================================ # Установка qwen-code через npm # ============================================================================ if command -v npm &> /dev/null; then echo "" echo "📦 Установка qwen-code..." # Проверяем установлен ли уже qwen-code if npm list -g @qwen-code/qwen-code &> /dev/null; then info "qwen-code уже установлен, проверяем обновления..." npm update -g @qwen-code/qwen-code success "qwen-code обновлён" else info "Установка qwen-code глобально..." npm install -g @qwen-code/qwen-code success "qwen-code установлен" fi # Проверка установки if command -v qwen &> /dev/null; then QWEN_VERSION=$(qwen --version 2>&1 | head -1 || echo "unknown") success "qwen: $QWEN_VERSION" else warning "qwen не найден в PATH, пробуем добавить..." # Пробуем найти qwen в глобальных npm QWEN_PATH=$(npm root -g)/@qwen-code/qwen-code/cli.js if [ -f "$QWEN_PATH" ]; then export PATH="$PATH:$(npm root -g)/@qwen-code/qwen-code" success "qwen добавлен в PATH" fi fi else warning "npm не найден — qwen-code не установлен" echo "Для работы ИИ-агента установите npm и выполните:" echo " npm install -g @qwen-code/qwen-code" fi # ============================================================================ # Создание/обновление виртуального окружения Python # ============================================================================ echo "" echo "🐍 Настройка Python окружения..." if [ ! -d "venv" ]; then info "Создание виртуального окружения..." python3 -m venv venv success "Виртуальное окружение создано" else info "Виртуальное окружение найдено" fi # Активация виртуального окружения source venv/bin/activate # Обновление pip info "Обновление pip..." pip install -q --upgrade pip # Установка зависимостей echo "" echo "📦 Установка Python зависимостей..." if [ -f "requirements.txt" ]; then pip install -q -r requirements.txt success "Зависимости установлены" else error "requirements.txt не найден!" exit 1 fi # ============================================================================ # Настройка .env файла # ============================================================================ echo "" echo "⚙️ Настройка конфигурации..." if [ ! -f ".env" ]; then if [ -f ".env.example" ]; then info "Создание .env из .env.example..." cp .env.example .env warning "Требуется настроить .env файл!" echo "" echo "Отредактируйте .env и укажите:" echo " 1. TELEGRAM_BOT_TOKEN — токен от @BotFather" echo " 2. ALLOWED_USERS — ваш Telegram ID" echo " 3. SERVERS — SSH серверы (опционально)" echo "" echo "Или запустите ./run.sh для интерактивной настройки" fi else info ".env файл найден" fi # ============================================================================ # Сохранение версии # ============================================================================ # Получаем версию из git или создаём timestamp if command -v git &> /dev/null && [ -d ".git" ]; then VERSION=$(git describe --tags --always 2>/dev/null || git rev-parse --short HEAD) else VERSION=$(date +%Y%m%d-%H%M%S) fi echo "$VERSION" > "$SCRIPT_DIR/.installed" success "Версия: $VERSION" # ============================================================================ # Итоги # ============================================================================ echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" if [ "$INSTALL_TYPE" = "update" ]; then success "Обновление завершено!" else success "Установка завершена!" fi echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" echo "📁 Директория: $SCRIPT_DIR" echo "📦 Версия: $VERSION" echo "" # Проверка готовности READY=true if [ ! -f ".env" ]; then warning "Не настроен .env файл" READY=false fi if ! grep -q "^TELEGRAM_BOT_TOKEN=" .env 2>/dev/null || grep -q "TELEGRAM_BOT_TOKEN=123456789" .env 2>/dev/null; then warning "Не установлен TELEGRAM_BOT_TOKEN в .env" READY=false fi if [ "$READY" = true ]; then echo "✅ Бот готов к запуску!" echo "" echo "Запуск:" echo " ./run.sh" echo "" echo "Или в фоновом режиме:" echo " nohup ./run.sh > bot.log 2>&1 &" else echo "⚠️ Требуется настройка перед запуском:" echo " 1. Отредактируйте .env" echo " 2. Установите TELEGRAM_BOT_TOKEN" echo " 3. Настройте ALLOWED_USERS" echo "" echo "Затем запустите:" echo " ./run.sh" fi echo ""