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 ""
|
||||||
123
run.sh
123
run.sh
|
|
@ -1,5 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Скрипт запуска Telegram CLI Bot
|
# Скрипт запуска Telegram CLI Bot
|
||||||
|
# Предполагается что зависимости уже установлены через install.sh
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
|
@ -8,107 +9,55 @@ cd "$SCRIPT_DIR"
|
||||||
|
|
||||||
ENV_FILE="$SCRIPT_DIR/.env"
|
ENV_FILE="$SCRIPT_DIR/.env"
|
||||||
|
|
||||||
# Функция для установки значения в .env
|
# Цвета для вывода
|
||||||
set_env_value() {
|
GREEN='\033[0;32m'
|
||||||
local key="$1"
|
YELLOW='\033[1;33m'
|
||||||
local value="$2"
|
NC='\033[0m'
|
||||||
|
|
||||||
if [ -f "$ENV_FILE" ]; then
|
echo -e "${GREEN}🤖 Запуск Telegram CLI Bot...${NC}"
|
||||||
# Если ключ существует - обновляем
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
# Проверка виртуального окружения
|
# Проверка виртуального окружения
|
||||||
if [ ! -d "venv" ]; then
|
if [ ! -d "venv" ]; then
|
||||||
echo "📦 Виртуальное окружение не найдено. Создаю..."
|
echo -e "${YELLOW}⚠️ Виртуальное окружение не найдено${NC}"
|
||||||
python3 -m venv venv
|
echo "Запустите установку: ./install.sh"
|
||||||
echo "✅ Виртуальное окружение создано"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Активация виртуального окружения (проверяем что файл существует)
|
|
||||||
if [ -f "venv/bin/activate" ]; then
|
|
||||||
source venv/bin/activate
|
|
||||||
else
|
|
||||||
echo "❌ Ошибка: venv/bin/activate не найден"
|
|
||||||
echo "Попробуйте удалить venv и запустить скрипт заново"
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Установка зависимостей
|
# Активация виртуального окружения
|
||||||
echo "📦 Установка зависимостей..."
|
if [ -f "venv/bin/activate" ]; then
|
||||||
pip install -q --upgrade pip
|
source venv/bin/activate
|
||||||
pip install -q -r requirements.txt
|
else
|
||||||
|
echo -e "${YELLOW}❌ Ошибка: venv/bin/activate не найден${NC}"
|
||||||
# Работа с токеном
|
echo "Запустите установку: ./install.sh"
|
||||||
TOKEN=""
|
exit 1
|
||||||
|
|
||||||
# 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
|
fi
|
||||||
|
|
||||||
# 2. Проверяем переменную окружения (имеет приоритет над .env)
|
# Проверка .env файла
|
||||||
if [ -n "$TELEGRAM_BOT_TOKEN" ]; then
|
if [ ! -f "$ENV_FILE" ]; then
|
||||||
TOKEN="$TELEGRAM_BOT_TOKEN"
|
echo -e "${YELLOW}⚠️ Файл .env не найден${NC}"
|
||||||
echo "✅ Токен получен из переменной окружения"
|
echo "Скопируйте .env.example в .env и настройте его"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3. Если токена нет нигде, запрашиваем у пользователя
|
# Проверка токена
|
||||||
if [ -z "$TOKEN" ]; then
|
TOKEN=$(grep "^TELEGRAM_BOT_TOKEN=" "$ENV_FILE" | cut -d'=' -f2)
|
||||||
echo ""
|
if [ -z "$TOKEN" ] || [ "$TOKEN" = "123456789:ABCdefGHIjklMNOpqrsTUVwxyz" ]; then
|
||||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
echo -e "${YELLOW}⚠️ TELEGRAM_BOT_TOKEN не установлен в .env${NC}"
|
||||||
echo "🔑 Настройка Telegram Bot"
|
echo "Отредактируйте .env и укажите токен от @BotFather"
|
||||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
exit 1
|
||||||
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
|
|
||||||
else
|
|
||||||
echo "❌ Неверный формат токена. Токен должен выглядеть как: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Экспорт токена для бота
|
# Экспорт токена
|
||||||
export TELEGRAM_BOT_TOKEN="$TOKEN"
|
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 ""
|
||||||
echo "🤖 Запуск Telegram CLI Bot..."
|
|
||||||
echo ""
|
|
||||||
python bot.py
|
python bot.py
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue