#!/bin/bash # Скрипт установки systemd сервиса для Telegram CLI Bot set -e # Используем SUDO_USER если скрипт запущен через sudo, иначе текущего пользователя BOT_USER="${SUDO_USER:-$USER}" BOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BOT_VENV="${BOT_DIR}/venv" SERVICE_FILE="${BOT_DIR}/telegram-bot.service" SYSTEMD_SERVICE="/etc/systemd/system/telegram-bot.service" echo "🔧 Установка systemd сервиса для Telegram CLI Bot" echo "==================================================" echo "Пользователь: $BOT_USER" echo "Директория: $BOT_DIR" echo "Venv: $BOT_VENV" echo "" # Проверка что скрипт запущен от root или через sudo if [ "$EUID" -ne 0 ]; then echo "❌ Запустите скрипт от имени root (sudo ./install-systemd-service.sh)" exit 1 fi # Проверка существования файлов if [ ! -f "$BOT_DIR/bot.py" ]; then echo "❌ bot.py не найден в $BOT_DIR" exit 1 fi if [ ! -f "$BOT_VENV/bin/python" ]; then echo "❌ Venv не найден в $BOT_VENV" echo " Запустите: source $BOT_DIR/venv/bin/activate && pip install -r requirements.txt" exit 1 fi if [ ! -f "$BOT_DIR/.env" ]; then echo "⚠️ .env файл не найден. Создайте его:" echo " cp $BOT_DIR/.env.example $BOT_DIR/.env" echo " и отредактируйте переменные окружения" exit 1 fi # Определяем путь к node через find в домашней директории пользователя echo "🔍 Поиск node..." NODE_BIN=$(find /home/$BOT_USER -name "node" 2>/dev/null | grep "/bin/node$" | head -1) echo " NODE_BIN=$NODE_BIN" if [ -n "$NODE_BIN" ]; then NODE_PATH=$(dirname "$NODE_BIN") # Извлекаем базовый путь nvm (убираем /bin/node) NVM_BASE=$(dirname "$NODE_PATH") # Извлекаем версию nvm из NVM_BASE (например v24.13.1 из /home/user/.config/nvm/versions/node/v24.13.1) NVM_VERSION=$(basename "$NVM_BASE") echo " NODE_PATH=$NODE_PATH" echo " NVM_BASE=$NVM_BASE" echo " NVM_VERSION=$NVM_VERSION" else # Fallback: стандартные пути NVM_BASE="/home/$BOT_USER/.config/nvm/versions/node" NVM_VERSION="current" NODE_PATH="$NVM_BASE/$NVM_VERSION/bin" echo " ⚠️ node не найден, используем fallback: $NODE_PATH" fi # Ищем qwen в той же версии nvm где найден node (просто проверяем существование файла) echo "🔍 Поиск qwen..." if [ -n "$NVM_VERSION" ] && [ "$NVM_VERSION" != "current" ]; then QWEN_PATH="$NVM_BASE/$NVM_VERSION/bin/qwen" echo " Проверяем путь: $QWEN_PATH" if [ -e "$QWEN_PATH" ]; then echo " ✅ qwen найден" ls -la "$QWEN_PATH" 2>/dev/null | head -1 else echo " ❌ qwen не найден по пути $QWEN_PATH" QWEN_PATH="" fi else # Если версия не определена - ищем любой файл с именем qwen echo " Версия не определена, ищем через find..." QWEN_PATH=$(find /home/$BOT_USER -name "qwen" 2>/dev/null | grep "/bin/qwen$" | head -1) if [ -n "$QWEN_PATH" ]; then echo " ✅ qwen найден: $QWEN_PATH" else echo " ❌ qwen не найден через find" fi fi if [ -z "$QWEN_PATH" ]; then echo "⚠️ qwen не найден. Установите: npm install -g @qwen-code/qwen-code" fi NVM_DIR="/home/$BOT_USER/.nvm" echo "📝 Создание systemd сервиса..." echo " Node путь: $NODE_PATH" echo " NVM база: $NVM_BASE" # Вычисляем NODE_LIB_DIR из NODE_PATH NODE_LIB_DIR=$(dirname "$NODE_PATH")/lib/node_modules # Создаём сервис с подстановкой путей cat > "$SYSTEMD_SERVICE" << EOF [Unit] Description=Telegram CLI Bot After=network.target [Service] Type=simple User=$BOT_USER WorkingDirectory=$BOT_DIR Environment="PATH=$NODE_PATH:$BOT_VENV/bin:/home/$BOT_USER/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" Environment="NVM_DIR=$NVM_DIR" Environment="NODE_PATH=$NODE_LIB_DIR" ExecStart=$BOT_VENV/bin/python bot.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal SyslogIdentifier=telegram-bot [Install] WantedBy=multi-user.target EOF echo "✅ Сервис установлен в $SYSTEMD_SERVICE" # Перезагружаем systemd и включаем сервис echo "🔄 Перезагрузка systemd..." systemctl daemon-reload echo "🚀 Включение сервиса..." systemctl enable telegram-bot echo "" echo "✅ Установка завершена!" echo "" echo "Управление сервисом:" echo " sudo systemctl start telegram-bot - Запустить бота" echo " sudo systemctl stop telegram-bot - Остановить бота" echo " sudo systemctl restart telegram-bot - Перезапустить бота" echo " sudo systemctl status telegram-bot - Проверить статус" echo "" echo "Просмотр логов:" echo " sudo journalctl -u telegram-bot -f - Логи в реальном времени" echo " sudo journalctl -u telegram-bot --since today - Логи за сегодня"