183 lines
13 KiB
Markdown
Executable File
183 lines
13 KiB
Markdown
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. Управление серверами
|
||
- **Добавление сервера:** форма с полями (имя, адрес опционально, группа, описание).
|
||
- **После сохранения:**
|
||
1. Генерация **уникального токена** (32 символа).
|
||
2. Сохранение **хеша токена** в `agent_tokens`.
|
||
3. Показ пользователю: **«Токен для агента: [токен]. Скачайте скрипт установки: [install.sh?token=...]»**.
|
||
- **Редактирование сервера:** возможность изменить все поля, **повторно скачать скрипт** (токен остается прежним).
|
||
|
||
### 3.4. API для агентов
|
||
- **Эндпоинт:** `POST /api/v1/metrics` (публичный, без авторизации сессии).
|
||
- **Ожидаемый JSON:** `{"token": "...", "metrics": {"cpu_load": 45.2, "ram_used": 89.1}}`.
|
||
- **Логика:**
|
||
1. Проверка токена (сравнение хеша).
|
||
2. Обновление `servers.last_metrics_at` и `agent_tokens.last_used_at`.
|
||
3. Сохранение каждой метрики в `server_metrics`.
|
||
4. **Проверка порогов:** если значение превышает `warning_threshold` из `metric_thresholds` → создание записи в `alerts`.
|
||
|
||
### 3.5. Агент мониторинга
|
||
- **Скрипт установки:** `GET /agent/install.sh?token=...` → динамически генерирует **bash-скрипт**, который:
|
||
1. Устанавливает Python3, psutil.
|
||
2. Скачивает Python-агента (`agent.py`) с вашего сервера.
|
||
3. Подставляет **токен** и **URL API** в конфиг агента.
|
||
4. Создает systemd-сервис для автостарта.
|
||
- **Python-агент:** собирает CPU, RAM, Disk раз в **10 секунд**, отправляет на `/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 групп
|
||
- **Цель:** Вход/выход, управление группами.
|
||
- **Результат:**
|
||
1. Неавторизован → редирект на `/login` (форма на русском).
|
||
2. Вход как `admin:123` → переход на дашборд.
|
||
3. Меню «Группы» → создаю группу «Веб-серверы» → она отображается в списке.
|
||
- ✅ **Выполнен**
|
||
|
||
### Этап 4: CRUD серверов + генерация токена
|
||
- **Цель:** Добавление сервера с получением токена.
|
||
- **Результат:**
|
||
1. Форма «Добавить сервер» → заполняю → нажимаю «Сохранить».
|
||
2. Вижу страницу: **«Сервер добавлен. Токен: abc123... Скачайте скрипт: [install.sh?token=abc123...]»**.
|
||
3. Перехожу по ссылке → скачивается `install.sh`.
|
||
- ✅ **Выполнен**
|
||
|
||
### Этап 5: API + логика статусов
|
||
- **Цель:** Приём метрик, цветные карточки на дашборде.
|
||
- **Результат:**
|
||
1. Через `curl` отправляю метрики с токеном.
|
||
2. Обновляю дашборд → вижу карточку сервера **зелёного цвета** (метрики в норме).
|
||
3. Отправляю `cpu_load: 95` → карточка становится **жёлтой**.
|
||
- ✅ **Выполнен**
|
||
|
||
### Этап 6: Агент и скрипт установки
|
||
- **Цель:** Рабочий агент, отправляющий метрики каждые 10 сек.
|
||
- **Результат:**
|
||
1. В виртуальной машине запускаю `bash install.sh` → устанавливается Python-агент.
|
||
2. `systemctl status server-mon-agent` → сервис работает.
|
||
3. В логах агента вижу: «Отправлено: cpu_load=12.3» каждые 10 сек.
|
||
- ✅ **Выполнен**
|
||
|
||
### Этап 7: Детали сервера + графики
|
||
- **Цель:** Страница с графиками и выбором периода.
|
||
- **Результат:**
|
||
1. Кликаю на карточку сервера → открывается `/server/1`.
|
||
2. Вижу график CPU за 24 часа.
|
||
3. Нажимаю «7 дней» → график перерисовывается за неделю.
|
||
- ✅ **Выполнен**
|
||
|
||
### Этап 8: Пороги и алерты
|
||
- **Цель:** Настройка порогов, срабатывание алертов.
|
||
- **Результат:**
|
||
1. На странице сервера ставлю порог CPU: 80%.
|
||
2. Отправляю метрику `cpu_load: 90` → в таблице `alerts` появляется запись.
|
||
3. Страница `/alerts` показывает «Превышение CPU на сервере X».
|
||
- ✅ **Выполнен**
|
||
|
||
### Этап 9: Уведомления + админка
|
||
- **Цель:** Отправка email/Telegram, управление пользователями.
|
||
- **Результат:**
|
||
1. В админке указываю свой Telegram Chat ID.
|
||
2. При срабатывании алерта получаю сообщение в Telegram.
|
||
3. В меню «Админка» → «Пользователи» создаю нового пользователя.
|
||
- ✅ **Выполнен**
|
||
|
||
---
|
||
|
||
## История реализации
|
||
|
||
### Выполненные этапы:
|
||
- ✅ Этап 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 для приема метрик от агентов
|
||
- Скрипт установки агента для мониторинга серверов
|
||
- Система алертов и уведомлений
|
||
- Административная панель |