117 lines
4.1 KiB
Bash
Executable File
117 lines
4.1 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
|
||
|
||
# Определяем путь к qwen через bash --login чтобы загрузить .bashrc с nvm
|
||
QWEN_PATH=$(sudo -u "$BOT_USER" bash --login -c "which qwen" 2>/dev/null || echo "")
|
||
if [ -z "$QWEN_PATH" ]; then
|
||
echo "⚠️ qwen не найден. Установите: npm install -g @qwen-code/qwen-code"
|
||
fi
|
||
|
||
# Определяем Node.js путь (для nvm) - через bash --login
|
||
NODE_BIN=$(sudo -u "$BOT_USER" bash --login -c "which node" 2>/dev/null || echo "")
|
||
if [ -n "$NODE_BIN" ]; then
|
||
NODE_PATH=$(dirname "$NODE_BIN")
|
||
# Извлекаем базовый путь nvm (убираем /bin/node)
|
||
NVM_BASE=$(dirname "$NODE_PATH")
|
||
else
|
||
# Fallback: стандартные пути
|
||
NVM_BASE="/home/$BOT_USER/.config/nvm/versions/node"
|
||
NODE_PATH="$NVM_BASE/current/bin"
|
||
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 - Логи за сегодня"
|