architect/standards/9-guidance/guidance-infra-bot.md

type: standard
aspect: guidance
title: "Стандарт: Infra Bot — Telegram бот управления сервером"
version: 1.0.0
date: 2026-02-19
status: active


Стандарт: Infra Bot — Telegram бот управления сервером

Версия: 1.0.0
Дата: 2025-12-30
Статус: active


НАЗНАЧЕНИЕ

Telegram бот для безопасного управления сервером через мобильный телефон.

Принцип: Бот может делать только БЕЗОПАСНЫЕ операции. Опасные операции — ТОЛЬКО через SSH.


МАТРИЦА БЕЗОПАСНОСТИ (приоритет #1)

Каждая операция классифицируется по 3 параметрам:

1. Уровень риска

Уровень Критерий Подтверждение Откат Пример
L0 SAFE Не влияет на production ❌ Нет Не нужен Чтение статуса, tmp cleanup
L1 MEDIUM Удаляет неиспользуемые данные ✅ Да (кнопка) Не нужен Docker prune, старые venv
L2 DANGER Влияет на production ✅✅ Двойное Обязателен Volumes, БД, конфиги
L3 FORBIDDEN Может сломать систему 🚫 ЗАПРЕЩЕНО БОТУ rm -rf, DROP, useradd

2. Обратимость

Категория Можно откатить? Разрешено боту?
Обратимые Да (перезапуск, recreate) ✅ L0-L1
Частично обратимые Да, но сложно (из бэкапа) ⚠️ Только L1 с предупреждением
Необратимые Нет (потеря данных) 🚫 ЗАПРЕЩЕНО

3. Влияние на доступность

Категория Влияет на работу? Разрешено боту?
Нулевое Сервисы работают ✅ L0
Временное Restart (секунды) ✅ L1
Длительное Downtime минуты 🚫 ЗАПРЕЩЕНО
Критическое Может не восстановиться 🚫 ЗАПРЕЩЕНО

КЛАССИФИКАЦИЯ ОПЕРАЦИЙ

✅ L0 SAFE — Автоматически

Критерии: Обратимые + Нулевое влияние + Не трогают 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
- БЕЗ уведомления если успешно
- С уведомлением если не помогло

⚠️ L1 MEDIUM — Интерактивное меню

Критерии: Частично обратимые + Временное влияние + Удаляют неиспользуемое

Операция Риск Подтверждение
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"
- После выбора → кнопка [✅ Выполнить]

🔴 L2 DANGER — Только SSH

Критерии: Необратимые ИЛИ Длительное влияние ИЛИ Трогают production

Операция Почему запрещено боту
Cleanup L2 (volumes, БД дампы) Необратимая потеря данных
Изменение конфигов Может сломать сервер
Обновление системы Может сломать зависимости
Работа с БД Прямой доступ к production
Firewall Может отрубить доступ

🚫 L3 FORBIDDEN — Никогда

Операция Почему
rm -rf /, DROP DATABASE Полная потеря данных
chmod 777, chown root Дыра в безопасности
useradd, passwd Несанкционированный доступ
git push --force, git reset --hard Потеря истории
Произвольные команды Обход всех защит

КОМАНДЫ БОТА

L0: Мониторинг (всегда доступно)

/status           общий статус (диск, память, CPU, сервисы)
/disk             детали использования диска
/memory           детали использования памяти
/services         статус systemd сервисов
/docker           статус Docker контейнеров
/logs <service>   последние 20 строк лога
/uptime           время работы сервера
/who              кто залогинен
/help             список команд

L0: Очистка (автоматическая)

Monitor при disk >= 90%:
  → АВТОМАТИЧЕСКИ запускает cleanup-L0.sh
  → Очищает: /tmp, caches, dangling Docker
  → БЕЗ уведомления если успешно
  → С уведомлением если не помогло

L1: Очистка (интерактивная)

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 (сжатие)

      [ Выполнить выбранное]

Ты нажимаешь кнопки  [ Выполнить]  бот запускает очистку

L1: Управление сервисами

/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 мин)

СЦЕНАРИИ ИСПОЛЬЗОВАНИЯ

Сценарий 1: Рутинная проверка

08:00  Ты  /status

        Bot  🖥 Статус:  Норма

              Диск:    88% (23.8G / 27G)
              Память:  45% (1.8G / 4.0G)
              CPU:     12% (load: 0.5)
              Сервисы:  5/5 active

Сценарий 2: Автоматическая очистка (90%)

14:00  Monitor обнаружил disk = 91%
         АВТОМАТИЧЕСКИ запустил cleanup-L0.sh
         Освободил 3% (91%  88%)
         Не беспокоит тебя уведомлениями

14:30  (Если НЕ помогло)
        Bot  ⚠️ ДИСК: 91% (L0 очистка не помогла)

              Рекомендация: /cleanup L1

Сценарий 3: Интерактивная очистка (95%)

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 секунд

Сценарий 4: Критическая ситуация (98%)

16:00  Monitor обнаружил disk = 98%

        Bot  🔴 ДИСК: 98%  КРИТИЧЕСКАЯ СИТУАЦИЯ

              L0 и L1 очистки недостаточно.
              Требуется L2 очистка через SSH.

              Подключись: ssh root@server
              Запусти: bash infra/scripts/cleanup-L2.sh

              ⚠️ L2 удаляет production данные!

ИНТЕГРАЦИЯ С MONITOR

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"}
        ]
    )

РАЗВЁРТЫВАНИЕ

1. Создать бота

# В Telegram: @BotFather
/newbot
name: Infra Bot
username: your_infra_bot

# Сохранить токен в system/config/telegram.yaml

2. Узнать свой chat_id

# Написать боту любое сообщение, затем:
python3 library/connectors/api/telegram/client.py infra

# В выводе найти свой chat_id и добавить в allowed_users

3. Запустить бота

# Вручную (для теста)
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

ЭВОЛЮЦИЯ

Добавить новую команду

  1. Добавить в белый список: system/bots/infra/commands.py
  2. Реализовать handler: system/bots/infra/handlers/
  3. Добавить в help: system/bots/infra/help.md
  4. Обновить документацию

Добавить сервис в белый список

Отредактировать system/config/telegram.yaml:

bots:
  infra:
    allowed_services:
      - nginx
      - postgresql
      - redis
      - docker
      - myapp     # ← новый сервис

СВЯЗИ


АЛЬТЕРНАТИВЫ

Альтернатива Плюсы Минусы
SSH терминал Полный контроль Не удобно с телефона
Web панель Красиво Нужен браузер, сложнее
Telegram бот Быстро, мобильно Ограниченные команды

Вывод: Бот для рутинных задач, SSH для сложных.


Версия: 1.0.0