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:
mirivlad 2026-02-25 00:52:59 +08:00
parent 9bb2837b53
commit b26182cb08
2 changed files with 293 additions and 87 deletions

257
install.sh Executable file
View File

@ -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
View File

@ -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
# Работа с токеном
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
else else
echo "❌ Неверный формат токена. Токен должен выглядеть как: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz" echo -e "${YELLOW}❌ Ошибка: venv/bin/activate не найден${NC}"
echo "" echo "Запустите установку: ./install.sh"
fi exit 1
done
fi 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" 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