148 lines
5.4 KiB
Bash
Executable File
148 lines
5.4 KiB
Bash
Executable File
#!/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 - Логи за сегодня"
|