258 lines
9.6 KiB
Bash
Executable File
258 lines
9.6 KiB
Bash
Executable File
#!/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 ""
|