feat: универсальный установщик с поддержкой qwen-code
- install.sh — автоматическая установка всех зависимостей - Проверка Python, pip, Node.js, npm - Установка qwen-code через npm (глобально) - Создание venv и установка pip зависимостей - Определение: новая установка или обновление - Сохранение версии в .installed - run.sh — только запуск бота (без установки) - Проверка наличия venv - Проверка .env и токена - Запуск bot.py - install.sh делает: 1. Проверяет системные требования 2. Устанавливает Node.js (если нет) 3. Устанавливает qwen-code (npm install -g) 4. Создаёт venv и ставит pip зависимости 5. Создаёт .env из .env.example 6. Сохраняет версию Version: 0.6.0 Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
parent
9bb2837b53
commit
b26182cb08
|
|
@ -0,0 +1,257 @@
|
|||
#!/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 ""
|
||||
127
run.sh
127
run.sh
|
|
@ -1,5 +1,6 @@
|
|||
#!/bin/bash
|
||||
# Скрипт запуска Telegram CLI Bot
|
||||
# Предполагается что зависимости уже установлены через install.sh
|
||||
|
||||
set -e
|
||||
|
||||
|
|
@ -8,107 +9,55 @@ cd "$SCRIPT_DIR"
|
|||
|
||||
ENV_FILE="$SCRIPT_DIR/.env"
|
||||
|
||||
# Функция для установки значения в .env
|
||||
set_env_value() {
|
||||
local key="$1"
|
||||
local value="$2"
|
||||
# Цвета для вывода
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
if [ -f "$ENV_FILE" ]; then
|
||||
# Если ключ существует - обновляем
|
||||
if grep -q "^$key=" "$ENV_FILE"; then
|
||||
sed -i "s|^$key=.*|$key=$value|" "$ENV_FILE"
|
||||
else
|
||||
# Иначе добавляем
|
||||
echo "$key=$value" >> "$ENV_FILE"
|
||||
fi
|
||||
else
|
||||
# Создаём файл
|
||||
echo "$key=$value" > "$ENV_FILE"
|
||||
fi
|
||||
}
|
||||
echo -e "${GREEN}🤖 Запуск Telegram CLI Bot...${NC}"
|
||||
|
||||
# Проверка виртуального окружения
|
||||
if [ ! -d "venv" ]; then
|
||||
echo "📦 Виртуальное окружение не найдено. Создаю..."
|
||||
python3 -m venv venv
|
||||
echo "✅ Виртуальное окружение создано"
|
||||
fi
|
||||
|
||||
# Активация виртуального окружения (проверяем что файл существует)
|
||||
if [ -f "venv/bin/activate" ]; then
|
||||
source venv/bin/activate
|
||||
else
|
||||
echo "❌ Ошибка: venv/bin/activate не найден"
|
||||
echo "Попробуйте удалить venv и запустить скрипт заново"
|
||||
echo -e "${YELLOW}⚠️ Виртуальное окружение не найдено${NC}"
|
||||
echo "Запустите установку: ./install.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Установка зависимостей
|
||||
echo "📦 Установка зависимостей..."
|
||||
pip install -q --upgrade pip
|
||||
pip install -q -r requirements.txt
|
||||
|
||||
# Работа с токеном
|
||||
TOKEN=""
|
||||
|
||||
# 1. Проверяем .env файл
|
||||
if [ -f "$ENV_FILE" ]; then
|
||||
TOKEN=$(grep "^TELEGRAM_BOT_TOKEN=" "$ENV_FILE" | cut -d'=' -f2)
|
||||
if [ -n "$TOKEN" ]; then
|
||||
echo "✅ Токен получен из .env"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 2. Проверяем переменную окружения (имеет приоритет над .env)
|
||||
if [ -n "$TELEGRAM_BOT_TOKEN" ]; then
|
||||
TOKEN="$TELEGRAM_BOT_TOKEN"
|
||||
echo "✅ Токен получен из переменной окружения"
|
||||
fi
|
||||
|
||||
# 3. Если токена нет нигде, запрашиваем у пользователя
|
||||
if [ -z "$TOKEN" ]; then
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "🔑 Настройка Telegram Bot"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
echo "Для работы бота необходим токен от @BotFather"
|
||||
echo ""
|
||||
echo "Как получить токен:"
|
||||
echo " 1. Откройте @BotFather в Telegram"
|
||||
echo " 2. Отправьте команду /newbot"
|
||||
echo " 3. Введите имя бота (например: My CLI Bot)"
|
||||
echo " 4. Введите username бота (должен заканчиваться на 'bot')"
|
||||
echo " 5. Скопируйте полученный токен"
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
# Запрос токена с подтверждением
|
||||
while true; do
|
||||
read -p "📋 Вставьте токен бота: " TOKEN
|
||||
|
||||
# Проверка формата токена (примерно 46 символов, содержит : и _)
|
||||
if [[ "$TOKEN" =~ ^[0-9]+:[A-Za-z0-9_-]+$ ]]; then
|
||||
echo ""
|
||||
read -p "💾 Сохранить токен в .env? (y/n): " SAVE
|
||||
if [[ "$SAVE" =~ ^[Yy]$ ]]; then
|
||||
set_env_value "TELEGRAM_BOT_TOKEN" "$TOKEN"
|
||||
echo "✅ Токен сохранён в $ENV_FILE"
|
||||
fi
|
||||
break
|
||||
# Активация виртуального окружения
|
||||
if [ -f "venv/bin/activate" ]; then
|
||||
source venv/bin/activate
|
||||
else
|
||||
echo "❌ Неверный формат токена. Токен должен выглядеть как: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
|
||||
echo ""
|
||||
fi
|
||||
done
|
||||
echo -e "${YELLOW}❌ Ошибка: venv/bin/activate не найден${NC}"
|
||||
echo "Запустите установку: ./install.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Экспорт токена для бота
|
||||
# Проверка .env файла
|
||||
if [ ! -f "$ENV_FILE" ]; then
|
||||
echo -e "${YELLOW}⚠️ Файл .env не найден${NC}"
|
||||
echo "Скопируйте .env.example в .env и настройте его"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверка токена
|
||||
TOKEN=$(grep "^TELEGRAM_BOT_TOKEN=" "$ENV_FILE" | cut -d'=' -f2)
|
||||
if [ -z "$TOKEN" ] || [ "$TOKEN" = "123456789:ABCdefGHIjklMNOpqrsTUVwxyz" ]; then
|
||||
echo -e "${YELLOW}⚠️ TELEGRAM_BOT_TOKEN не установлен в .env${NC}"
|
||||
echo "Отредактируйте .env и укажите токен от @BotFather"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Экспорт токена
|
||||
export TELEGRAM_BOT_TOKEN="$TOKEN"
|
||||
|
||||
# Проверка qwen-code (опционально)
|
||||
if command -v qwen &> /dev/null; then
|
||||
echo -e "${GREEN}✅ qwen-code: $(qwen --version 2>&1 | head -1)${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}⚠️ qwen-code не найден (ИИ-чат не будет работать)${NC}"
|
||||
echo "Установите: npm install -g @qwen-code/qwen-code"
|
||||
fi
|
||||
|
||||
# Запуск бота
|
||||
echo ""
|
||||
echo "🤖 Запуск Telegram CLI Bot..."
|
||||
echo ""
|
||||
python bot.py
|
||||
|
|
|
|||
Loading…
Reference in New Issue