type: standard
aspect: guidance
title: "Стандарт: Infra Bot — Telegram бот управления сервером"
version: 1.0.0
date: 2026-02-19
status: active
Версия: 1.0.0
Дата: 2025-12-30
Статус: active
Telegram бот для безопасного управления сервером через мобильный телефон.
Принцип: Бот может делать только БЕЗОПАСНЫЕ операции. Опасные операции — ТОЛЬКО через SSH.
Каждая операция классифицируется по 3 параметрам:
| Уровень | Критерий | Подтверждение | Откат | Пример |
|---|---|---|---|---|
| L0 SAFE | Не влияет на production | ❌ Нет | Не нужен | Чтение статуса, tmp cleanup |
| L1 MEDIUM | Удаляет неиспользуемые данные | ✅ Да (кнопка) | Не нужен | Docker prune, старые venv |
| L2 DANGER | Влияет на production | ✅✅ Двойное | Обязателен | Volumes, БД, конфиги |
| L3 FORBIDDEN | Может сломать систему | 🚫 ЗАПРЕЩЕНО БОТУ | — | rm -rf, DROP, useradd |
| Категория | Можно откатить? | Разрешено боту? |
|---|---|---|
| Обратимые | Да (перезапуск, recreate) | ✅ L0-L1 |
| Частично обратимые | Да, но сложно (из бэкапа) | ⚠️ Только L1 с предупреждением |
| Необратимые | Нет (потеря данных) | 🚫 ЗАПРЕЩЕНО |
| Категория | Влияет на работу? | Разрешено боту? |
|---|---|---|
| Нулевое | Сервисы работают | ✅ L0 |
| Временное | Restart (секунды) | ✅ L1 |
| Длительное | Downtime минуты | 🚫 ЗАПРЕЩЕНО |
| Критическое | Может не восстановиться | 🚫 ЗАПРЕЩЕНО |
Критерии: Обратимые + Нулевое влияние + Не трогают production
| Операция | Риск | Автоматизация |
|---|---|---|
/status, /disk, /memory |
0% | Всегда доступно |
/logs <service> (read only) |
0% | Всегда доступно |
| Cleanup L0 (tmp, apt cache, pip cache) | 0% | АВТОМАТИЧЕСКИ при 90% |
/uptime, /who |
0% | Всегда доступно |
Автоматическая очистка L0:
- Monitor при disk >= 90% → АВТОМАТИЧЕСКИ запускает cleanup-L0.sh
- Очищает: /tmp (>7 дней), apt/pip/npm cache, Docker dangling, journald
- БЕЗ уведомления если успешно
- С уведомлением если не помогло
Критерии: Частично обратимые + Временное влияние + Удаляют неиспользуемое
| Операция | Риск | Подтверждение |
|---|---|---|
| Cleanup L1 (меню опций) | 20% | Кнопки выбора |
/restart <service> (белый список) |
10% | Inline кнопка |
Интерактивная очистка L1:
- Monitor при disk >= 95% → ПРЕДЛАГАЕТ меню
- Опции (можно выбрать несколько):
- [1] 🐳 Docker images (все) — 5-7 GB
- [2] 📦 Snapd (если не используется) — 1.2 GB
- [3] 💾 Старые бэкапы (>30 дней) — varies
- [4] 📁 Старые venv/node_modules (>60 дней) — varies
- [5] 🗜️ Git gc (сжатие) — varies
- Выбор: нажать кнопки [1] [2] [3] или написать "1 3 5"
- После выбора → кнопка [✅ Выполнить]
Критерии: Необратимые ИЛИ Длительное влияние ИЛИ Трогают production
| Операция | Почему запрещено боту |
|---|---|
| Cleanup L2 (volumes, БД дампы) | Необратимая потеря данных |
| Изменение конфигов | Может сломать сервер |
| Обновление системы | Может сломать зависимости |
| Работа с БД | Прямой доступ к production |
| Firewall | Может отрубить доступ |
| Операция | Почему |
|---|---|
rm -rf /, DROP DATABASE |
Полная потеря данных |
chmod 777, chown root |
Дыра в безопасности |
useradd, passwd |
Несанкционированный доступ |
git push --force, git reset --hard |
Потеря истории |
| Произвольные команды | Обход всех защит |
/status — общий статус (диск, память, CPU, сервисы)
/disk — детали использования диска
/memory — детали использования памяти
/services — статус systemd сервисов
/docker — статус Docker контейнеров
/logs <service> — последние 20 строк лога
/uptime — время работы сервера
/who — кто залогинен
/help — список команд
Monitor при disk >= 90%:
→ АВТОМАТИЧЕСКИ запускает cleanup-L0.sh
→ Очищает: /tmp, caches, dangling Docker
→ БЕЗ уведомления если успешно
→ С уведомлением если не помогло
Monitor при disk >= 95%:
→ Отправляет МЕНЮ в Telegram с кнопками
Bot → 🟡 ДИСК: 95% — требуется очистка L1
Выбери опции (можно несколько):
[1] 🐳 Docker images (5-7 GB)
[2] 📦 Snapd (1.2 GB)
[3] 💾 Бэкапы >30д (varies)
[4] 📁 venv/node_modules >60д (varies)
[5] 🗜️ Git gc (сжатие)
[✅ Выполнить выбранное]
Ты нажимаешь кнопки → [✅ Выполнить] → бот запускает очистку
/restart nginx — перезапуск (только белый список)
Белый список: nginx, postgresql, redis, docker
Telegram
↓
InfraBot (system/bots/infra/)
↓
CommandHandler (белый список команд)
↓
ActionExecutor (выполнение с таймаутом)
↓
ResponseFormatter (форматирование ответа)
| Уровень | Защита |
|---|---|
| Аутентификация | Только разрешённые chat_id из конфига |
| Белый список | Только команды из белого списка |
| Таймаут | Любая команда — максимум 30 секунд |
| Логирование | Все команды логируются |
| Подтверждение | L1 операции требуют подтверждения |
| Ограничение частоты | Max 10 команд в минуту |
# system/config/telegram.yaml
bots:
infra: # ← Новый бот
token: "..."
username: "infra_bot"
allowed_users: # ← Белый список пользователей
- 1318367261 # operator
allowed_services: # ← Белый список сервисов для restart
- nginx
- postgresql
- redis
- docker
rate_limit:
max_commands: 10 # команд
per_seconds: 60 # в секунду
timeouts:
command: 30 # секунд на выполнение
cleanup: 300 # секунд на очистку (5 мин)
08:00 — Ты → /status
Bot → 🖥 Статус: ✅ Норма
Диск: 88% (23.8G / 27G)
Память: 45% (1.8G / 4.0G)
CPU: 12% (load: 0.5)
Сервисы: ✅ 5/5 active
14:00 — Monitor обнаружил disk = 91%
→ АВТОМАТИЧЕСКИ запустил cleanup-L0.sh
→ Освободил 3% (91% → 88%)
→ Не беспокоит тебя уведомлениями
14:30 — (Если НЕ помогло)
Bot → ⚠️ ДИСК: 91% (L0 очистка не помогла)
Рекомендация: /cleanup L1
15:00 — Monitor обнаружил disk = 95%
→ Отправляет интерактивное меню
Bot → 🟡 ДИСК: 95% — требуется L1 очистка
[1] 🐳 Docker (5-7 GB) [выбрано]
[2] 📦 Snapd (1.2 GB)
[3] 💾 Бэкапы (varies)
[4] 📁 venv/node (varies) [выбрано]
[5] 🗜️ Git gc (varies)
[✅ Выполнить выбранное (1, 4)]
15:01 — Ты нажал [✅ Выполнить]
Bot → ⏳ Очистка L1 (опции: 1, 4)...
[1] Docker images...
✅ Удалено 145 images (6.2 GB)
[4] venv/node_modules...
✅ Удалено 8 папок (1.8 GB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Диск ДО: 95%
Диск ПОСЛЕ: 85%
Освобождено: 10% (8.0 GB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ Готово за 45 секунд
16:00 — Monitor обнаружил disk = 98%
Bot → 🔴 ДИСК: 98% — КРИТИЧЕСКАЯ СИТУАЦИЯ
L0 и L1 очистки недостаточно.
Требуется L2 очистка через SSH.
Подключись: ssh root@server
Запусти: bash infra/scripts/cleanup-L2.sh
⚠️ L2 удаляет production данные!
Monitor при критическом уровне диска:
# system/monitor/checks/infra.py
if disk_usage >= 95:
# Отправить интерактивное меню через InfraBot
from system.bots.infra import send_cleanup_menu
send_cleanup_menu(
disk_usage=disk_usage,
cleanup_options=[
{"id": 1, "name": "Docker images", "size": "5-7 GB"},
{"id": 2, "name": "Snapd", "size": "1.2 GB"},
{"id": 3, "name": "Старые бэкапы", "size": "varies"},
{"id": 4, "name": "Старые venv/node_modules", "size": "varies"},
{"id": 5, "name": "ВСЁ ВМЕСТЕ", "size": "total"}
]
)
# В Telegram: @BotFather
/newbot
name: Infra Bot
username: your_infra_bot
# Сохранить токен в system/config/telegram.yaml
# Написать боту любое сообщение, затем:
python3 library/connectors/api/telegram/client.py infra
# В выводе найти свой chat_id и добавить в allowed_users
# Вручную (для теста)
python3 system/bots/infra/run.py
# Systemd сервис (production)
sudo systemctl start infra-bot
sudo systemctl enable infra-bot
Все действия бота логируются:
/var/log/infra-bot/commands.log
2025-12-30 14:23:45 | chat_id=1318367261 | cmd=/status | result=ok | time=0.5s
2025-12-30 14:24:10 | chat_id=1318367261 | cmd=/cleanup L1 | options=[1,5] | result=ok | time=45s | freed=8.5GB
2025-12-30 14:25:00 | chat_id=1318367261 | cmd=/restart nginx | result=ok | time=2s
2025-12-30 14:26:15 | chat_id=9999999999 | cmd=/status | result=DENIED | reason=unauthorized
system/bots/infra/commands.pysystem/bots/infra/handlers/system/bots/infra/help.mdОтредактировать system/config/telegram.yaml:
bots:
infra:
allowed_services:
- nginx
- postgresql
- redis
- docker
- myapp # ← новый сервис
| Альтернатива | Плюсы | Минусы |
|---|---|---|
| SSH терминал | Полный контроль | Не удобно с телефона |
| Web панель | Красиво | Нужен браузер, сложнее |
| Telegram бот | Быстро, мобильно | Ограниченные команды |
Вывод: Бот для рутинных задач, SSH для сложных.
Версия: 1.0.0