14 KiB
Executable File
14 KiB
Executable File
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Система мониторинга серверов
1. Общие требования
- Язык: PHP 8.1+
- Фреймворк: Slim Framework 4 (с PSR-7, Twig)
- Фронтенд: Bootstrap 5, Font Awesome 6 (через CDN), Chart.js для графиков
- База данных: MySQL 8+ / MariaDB 10.5+
- Архитектура: MVC в рамках Slim (Controllers, Models, Templates)
- Интерфейс: Полностью на русском языке (все надписи, кнопки, формы, меню)
- Безопасность: Prepared Statements для всех SQL-запросов, хеши паролей (
password_hash), токены агентов хранятся только как SHA-256 хеши.
2. Структура базы данных (8 таблиц)
| Таблица | Поля (ключевые) | Назначение |
|---|---|---|
| users | id, username (unique), password_hash, email, role(admin/user), created_at |
Управление доступом |
| user_notification_settings | id, user_id, telegram_chat_id, email_for_alerts |
Персональные настройки уведомлений |
| server_groups | id, name, description, icon, color |
Группировка серверов |
| servers | id, name, address (nullable), group_id, description, last_metrics_at, created_at |
Основные данные серверов |
| metric_names | id, name (unique), unit, description |
Справочник метрик (cpu_load, ram_used, …) |
| metric_thresholds | id, server_id, metric_name_id, warning_threshold, critical_threshold, duration |
Индивидуальные пороги для каждой метрики на каждом сервере |
| server_metrics | id, server_id, metric_name_id, value, created_at |
Исторические данные метрик (с индексом (server_id, metric_name_id, created_at)) |
| agent_tokens | id, server_id (unique), token_hash, created_at, last_used_at |
Хеши токенов для авторизации агентов |
| alerts | id, server_id, metric_name, value, severity(warning/critical), resolved, created_at, resolved_at |
История срабатывания алертов |
3. Функциональные модули (что должна делать система)
3.1. Аутентификация и авторизация
- Доступ ко всем страницам, кроме
/loginи/api/v1/metrics, только после входа. - Сессионная авторизация с middleware.
3.2. Дашборд (главная страница /)
- Цветные карточки серверов (Bootstrap cards):
- Зеленый:
last_metrics_at< 2 мин назад И все метрики ниже порогов. - Желтый: метрики свежие (<2 мин), но есть превышение порогов.
- Красный:
last_metrics_at> 5 мин назад (сервер «молчит»).
- Зеленый:
- В карточке: имя сервера, текущие значения CPU/RAM, время последнего обновления.
- Автообновление каждые 30 секунд (через
setTimeout).
3.3. Управление серверами
- Добавление сервера: форма с полями (имя, адрес опционально, группа, описание).
- После сохранения:
- Генерация уникального токена (32 символа).
- Сохранение хеша токена в
agent_tokens. - Показ пользователю: «Токен для агента: [токен]. Скачайте скрипт установки: [install.sh?token=...]».
- Редактирование сервера: возможность изменить все поля, повторно скачать скрипт (токен остается прежним).
3.4. API для агентов
- Эндпоинт:
POST /api/v1/metrics(публичный, без авторизации сессии). - Ожидаемый JSON:
{"token": "...", "metrics": {"cpu_load": 45.2, "ram_used": 89.1}}. - Логика:
- Проверка токена (сравнение хеша).
- Обновление
servers.last_metrics_atиagent_tokens.last_used_at. - Сохранение каждой метрики в
server_metrics. - Проверка порогов: если значение превышает
warning_thresholdизmetric_thresholds→ создание записи вalerts.
3.5. Агент мониторинга
- Скрипт установки:
GET /agent/install.sh?token=...→ динамически генерирует bash-скрипт, который:- Устанавливает Python3, psutil, lm-sensors, smartmontools.
- Скачивает Python-агента (
agent.py) с вашего сервера. - Подставляет токен и URL API в конфиг агента.
- Создает systemd-сервис для автостарта.
- Python-агент: собирает CPU, RAM, Disk, Network, Temperature раз в 60 секунд, отправляет на
/api/v1/metrics.
3.6. Страница сервера (/server/{id})
- Текущие значения всех метрик.
- Графики Chart.js для метрик:
- По умолчанию — последние 24 часа.
- Кнопки выбора периода: 24 часа, 7 дней, 30 дней (через параметр
?period=7d). - Управление порогами: форма настройки
warning_thresholdиdurationдля каждой метрики этого сервера (сохраняет вmetric_thresholds).
3.7. Система алертов
- Автоматическое создание при превышении порога.
- Страница
/alerts: список активных алертов с кнопкой «Исправлено» (помечаетresolved=1). - Логика статуса на дашборде учитывает только неисправленные (resolved=0) алерты.
3.8. Уведомления
- Email: отправка через SMTP (PHPMailer) при срабатывании алерта.
- Telegram Bot: отправка сообщения в заданный чат.
- Настройка: в админке (
/admin/notifications) указываются: SMTP параметры, Telegram Bot Token, Chat ID.
3.9. Администрирование
- CRUD пользователей: страница
/admin/users(только дляrole='admin'). - Управление группами серверов.
- Повторная выдача скрипта: на странице сервера кнопка «Скачать скрипт агента».
План поэтапной реализации (9 этапов)
Этап 1: Ядро системы
- Цель: Slim Framework + Twig + Bootstrap работают.
- Результат: Открываю
http://localhost:8080/test→ вижу «Система мониторинга». - ✅ Выполнен
Этап 2: База данных
- Цель: Все 8 таблиц созданы.
- Результат: Импорт
schema.sql→ в MySQL есть все таблицы, включаяmetric_namesс записями «cpu_load», «ram_used». - ✅ Выполнен
Этап 3: Аутентификация + CRUD групп
- Цель: Вход/выход, управление группами.
- Результат:
- Неавторизован → редирект на
/login(форма на русском). - Вход как
admin:123→ переход на дашборд. - Меню «Группы» → создаю группу «Веб-серверы» → она отображается в списке.
- Неавторизован → редирект на
- ✅ Выполнен
Этап 4: CRUD серверов + генерация токена
- Цель: Добавление сервера с получением токена.
- Результат:
- Форма «Добавить сервер» → заполняю → нажимаю «Сохранить».
- Вижу страницу: «Сервер добавлен. Токен: abc123... Скачайте скрипт: [install.sh?token=abc123...]».
- Перехожу по ссылке → скачивается
install.sh.
- ✅ Выполнен
Этап 5: API + логика статусов
- Цель: Приём метрик, цветные карточки на дашборде.
- Результат:
- Через
curlотправляю метрики с токеном. - Обновляю дашборд → вижу карточку сервера зелёного цвета (метрики в норме).
- Отправляю
cpu_load: 95→ карточка становится жёлтой.
- Через
- ✅ Выполнен
Этап 6: Агент и скрипт установки
- Цель: Рабочий агент, отправляющий метрики каждые 10 сек.
- Результат:
- В виртуальной машине запускаю
bash install.sh→ устанавливается Python-агент. systemctl status server-mon-agent→ сервис работает.- В логах агента вижу: «Отправлено: cpu_load=12.3» каждые 10 сек.
- В виртуальной машине запускаю
- ✅ Выполнен
Этап 7: Детали сервера + графики
- Цель: Страница с графиками и выбором периода.
- Результат:
- Кликаю на карточку сервера → открывается
/server/1. - Вижу график CPU за 24 часа.
- Нажимаю «7 дней» → график перерисовывается за неделю.
- Кликаю на карточку сервера → открывается
- ✅ Выполнен
Этап 8: Пороги и алерты
- Цель: Настройка порогов, срабатывание алертов.
- Результат:
- На странице сервера ставлю порог CPU: 80%.
- Отправляю метрику
cpu_load: 90→ в таблицеalertsпоявляется запись. - Страница
/alertsпоказывает «Превышение CPU на сервере X».
- ✅ Выполнен
Этап 9: Уведомления + админка
- Цель: Отправка email/Telegram, управление пользователями.
- Результат:
- В админке указываю свой Telegram Chat ID.
- При срабатывании алерта получаю сообщение в Telegram.
- В меню «Админка» → «Пользователи» создаю нового пользователя.
- ✅ Выполнен
История реализации
Выполненные этапы:
- ✅ Этап 1: Ядро системы (Slim Framework 4, Twig, Bootstrap 5, Font Awesome 6)
- ✅ Этап 2: База данных (схема создана, 8 таблиц, стандартные метрики)
- ✅ Этап 3: Аутентификация и авторизация (middleware, формы входа/выхода, CRUD групп)
- ✅ Этап 4: CRUD серверов (добавление/редактирование/удаление, генерация токенов)
- ✅ Этап 5: API для агентов (прием метрик, проверка токенов, обновление статусов)
- ✅ Этап 6: Скрипт установки агента (динамическая генерация bash-скрипта)
- ✅ Этап 7: Детали сервера и графики (страница с метриками и графиками Chart.js)
- ✅ Этап 8: Система алертов (обнаружение превышений, страница алертов)
- ✅ Этап 9: Администрирование (управление пользователями, настройки уведомлений)
Архитектура:
- Frontend: Bootstrap 5, Font Awesome 6, Chart.js (через CDN)
- Backend: Slim Framework 4, Twig templates, PSR-7
- Database: MySQL/MariaDB с 8 таблицами
- Security: Password hashing, SHA-256 token hashes, prepared statements
- Language: Полный перевод интерфейса на русский язык
Компоненты:
- Веб-интерфейс для управления серверами и мониторинга
- API для приема метрик от агентов
- Скрипт установки агента для мониторинга серверов
- Система алертов и уведомлений
- Административная панель