feat: add bot control script to prevent multiple instances
Some checks reported errors
continuous-integration/drone/push Build encountered an error

- Add bot_control.sh script for safe bot management
- Prevent 'Conflict: terminated by other getUpdates' error
- Add Makefile commands: bot-start, bot-stop, bot-restart, bot-status, bot-logs
- Add BOT_MANAGEMENT.md with usage instructions
- Use PID file to track single bot instance
- Auto-stop all old processes before starting
- Add .bot.pid to .gitignore

Fixes issue where multiple bot instances cause command processing failures
This commit is contained in:
2025-11-17 06:44:43 +09:00
parent d3f9f2fb53
commit 72e95db811
4 changed files with 293 additions and 1 deletions

151
BOT_MANAGEMENT.md Normal file
View File

@@ -0,0 +1,151 @@
# 🤖 Управление ботом
## Проблема множественных экземпляров
Если бот перестал реагировать на команды и в логах появляются ошибки:
```
ERROR - TelegramConflictError: Conflict: terminated by other getUpdates request
```
Это означает, что запущено **несколько экземпляров бота одновременно**, и они конфликтуют друг с другом.
## Решение
Используйте скрипт `bot_control.sh` для управления ботом:
### Команды управления через Makefile
```bash
# Запустить бота (остановит все старые процессы)
make bot-start
# Остановить бота
make bot-stop
# Перезапустить бота
make bot-restart
# Проверить статус бота
make bot-status
# Показать логи бота в реальном времени
make bot-logs
```
### Прямое использование скрипта
```bash
# Запуск
./bot_control.sh start
# Остановка
./bot_control.sh stop
# Перезапуск
./bot_control.sh restart
# Статус
./bot_control.sh status
# Логи
./bot_control.sh logs
```
## Что делает скрипт?
1. **bot-start**:
- Проверяет, не запущен ли уже бот
- Останавливает все старые процессы `python main.py`
- Запускает ТОЛЬКО ОДИН экземпляр бота
- Создает PID-файл для отслеживания процесса
2. **bot-stop**:
- Корректно останавливает бот (SIGTERM, затем SIGKILL)
- Удаляет PID-файл
- Проверяет что все процессы остановлены
3. **bot-restart**:
- Останавливает бота
- Запускает заново
4. **bot-status**:
- Показывает состояние бота (работает/не работает)
- Показывает PID и использование ресурсов
- Проверяет логи на ошибки конфликта
- Предупреждает если найдено несколько процессов
5. **bot-logs**:
- Показывает логи бота в реальном времени
- Нажмите Ctrl+C для выхода
## Файлы
- **bot_control.sh** - скрипт управления ботом
- **.bot.pid** - файл с PID текущего процесса бота
- **/tmp/bot_single.log** - логи бота
## Диагностика проблем
### Проверить сколько процессов запущено:
```bash
ps aux | grep "python main.py" | grep -v grep
```
Должна быть **только одна строка**. Если больше - используйте `make bot-restart`.
### Проверить логи на ошибки:
```bash
tail -n 100 /tmp/bot_single.log | grep "ERROR"
```
### Остановить ВСЕ процессы бота вручную:
```bash
pkill -9 -f "python main.py"
```
Затем запустите через `make bot-start`.
## ⚠️ Важно
- **НЕ используйте** `make run` для продакшена - он не контролирует множественные запуски
- **ВСЕГДА используйте** `make bot-start` или `./bot_control.sh start`
- Перед запуском нового экземпляра **всегда проверяйте** статус: `make bot-status`
## Автозапуск при загрузке системы (опционально)
Если нужно автоматически запускать бота при загрузке сервера:
```bash
# Создать systemd service
sudo nano /etc/systemd/system/lottery-bot.service
```
Содержимое файла:
```ini
[Unit]
Description=Lottery Bot
After=network.target postgresql.service
[Service]
Type=simple
User=trevor
WorkingDirectory=/home/trevor/new_lottery_bot
ExecStart=/home/trevor/new_lottery_bot/bot_control.sh start
ExecStop=/home/trevor/new_lottery_bot/bot_control.sh stop
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
Активация:
```bash
sudo systemctl daemon-reload
sudo systemctl enable lottery-bot
sudo systemctl start lottery-bot
sudo systemctl status lottery-bot
```