This commit is contained in:
mirivlad 2026-04-26 20:47:43 +08:00
parent 3edf138e43
commit 58001aaffe
4 changed files with 76 additions and 44 deletions

View File

@ -95,7 +95,7 @@
--- ---
## 🗄️ База данных (8 таблиц) ## 🗄️ База данных
### Схема ### Схема
``` ```
@ -153,7 +153,7 @@ alerts # Алерты
### SQL инъекции ### SQL инъекции
- Prepared statements (PDO) во всех запросах - Prepared statements (PDO) во всех запросах
- Базовый класс `Model` предоставляет методы `fetchAll()`, `fetchOne()`, `insert()`, `update()` - Базовый класс `Model` даёт единый доступ к PDO через `DatabaseConfig`
--- ---
@ -172,7 +172,8 @@ alerts # Алерты
| Метод | Путь | Контроллер | Описание | | Метод | Путь | Контроллер | Описание |
|-------|------|------------|----------| |-------|------|------------|----------|
| GET | `/` | `DashboardController` | Дашборд (карточки серверов) | | GET | `/` | `DashboardController` | Дашборд (карточки серверов) |
| GET | `/server/{id}` | `ServerDetailController` | Детали сервера + графики | | GET | `/server/{id}` | redirect | Legacy redirect на `/servers/{id}` |
| GET | `/servers/{id}` | `ServerDetailController` | Детали сервера + графики |
| GET/POST | `/servers/create` | `ServerController` | Добавить сервер | | GET/POST | `/servers/create` | `ServerController` | Добавить сервер |
| GET/POST | `/servers/{id}/edit` | `ServerController` | Редактировать сервер | | GET/POST | `/servers/{id}/edit` | `ServerController` | Редактировать сервер |
| GET/POST | `/servers/{id}/delete` | `ServerController` | Удалить сервер | | GET/POST | `/servers/{id}/delete` | `ServerController` | Удалить сервер |
@ -198,6 +199,7 @@ alerts # Алерты
- `net_in_{iface}`, `net_out_{iface}` - трафик (% от скорости интерфейса) - `net_in_{iface}`, `net_out_{iface}` - трафик (% от скорости интерфейса)
- `temp_*` - температуры (°C) - `temp_*` - температуры (°C)
- `top_cpu_proc`, `top_ram_proc` - топ-5 процессов (JSON) - `top_cpu_proc`, `top_ram_proc` - топ-5 процессов (JSON)
- `uptime` - аптайм в секундах
**Интервал сбора:** 60 секунд **Интервал сбора:** 60 секунд
@ -241,9 +243,9 @@ alerts # Алерты
- `alerts/*.twig` — список алертов - `alerts/*.twig` — список алертов
### JavaScript ### JavaScript
- Chart.js для графиков (CPU/RAM/Disk за 24ч/7д/30д) - Chart.js для графиков CPU/RAM/Network/Temperature/Disk
- Автообновление дашборда через `setTimeout` - Автообновление дашборда через `setTimeout`
- Внешний tooltip handler для загрузки данных процессов - Внешний tooltip handler для загрузки данных процессов и деталей RAM
--- ---
@ -311,7 +313,8 @@ certbot --nginx -d mon.mirv.top
### Период сбора ### Период сбора
- **Агент:** каждые 60 секунд - **Агент:** каждые 60 секунд
- **Дашборд:** автообновление каждые 30 секунд - **Дашборд:** автообновление каждые 30 секунд
- **Графики:** 24 часа / 7 дней / 30 дней - **Графики:** 1 час / 6 часов / 24 часа / 7 дней / 30 дней
- **Длинные периоды:** данные берутся из `server_metrics_trends`
--- ---
@ -341,9 +344,9 @@ certbot --nginx -d mon.mirv.top
## 📝 Changelog ## 📝 Changelog
### v1.0 (Февраль 2026) ### v1.1 (Апрель 2026)
- ✅ Ядро системы (Slim 4 + Twig + Bootstrap 5) - ✅ Ядро системы (Slim 4 + Twig + Bootstrap 5)
- ✅ 8 таблиц базы данных - ✅ Базовая схема и последующие миграции для trends, сервисов и offline-логики
- ✅ Аутентификация и авторизация - ✅ Аутентификация и авторизация
- ✅ CRUD серверов и групп - ✅ CRUD серверов и групп
- ✅ API для приёма метрик - ✅ API для приёма метрик

View File

@ -13,7 +13,7 @@
```bash ```bash
git clone <repository-url> git clone <repository-url>
cd monitoring-system cd mon
``` ```
### 2. Установка зависимостей ### 2. Установка зависимостей
@ -78,15 +78,22 @@ server {
} }
``` ```
### 5. Настройка конфигурации базы данных ### 5. Настройка окружения
Отредактируйте файл `config/DatabaseConfig.php` для указания параметров подключения к базе данных: Скопируйте `.env.example` в `.env` и укажите параметры подключения к базе данных:
```php ```bash
private $host = 'localhost'; cp .env.example .env
private $db_name = 'monitoring_system'; ```
private $username = 'your_db_username';
private $password = 'your_db_password'; Ключевые переменные:
```dotenv
DB_HOST=localhost
DB_NAME=monitoring_system
DB_USERNAME=mon_user
DB_PASSWORD=your_db_password
APP_PORT=8082
``` ```
## Использование ## Использование
@ -95,14 +102,10 @@ private $password = 'your_db_password';
Перейдите на `http://mon.mirv.top/login` и войдите в систему. Перейдите на `http://mon.mirv.top/login` и войдите в систему.
Для первоначальной настройки создайте администратора через SQL: По умолчанию миграция `007_seed_admin_user.sql` создаёт пользователя:
```sql - логин: `admin`
INSERT INTO users (username, password_hash, email, role) - пароль: `mirvmon2026`
VALUES ('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin@example.com', 'admin');
```
Пароль: `password`
### 2. Добавление серверов ### 2. Добавление серверов
@ -124,6 +127,15 @@ chmod +x install.sh
Агент будет установлен как systemd-сервис и начнет отправлять метрики на сервер мониторинга. Агент будет установлен как systemd-сервис и начнет отправлять метрики на сервер мониторинга.
## Trends и длинные периоды
Для графиков за периоды больше 24 часов используются агрегированные данные из `server_metrics_trends`.
Если после установки или миграции нужно дозаполнить историю:
```bash
php /var/www/mon/cron/backfill_trends.php 30
```
## API ## API
### Отправка метрик ### Отправка метрик

View File

@ -33,7 +33,7 @@ cd mirvmon
cd docker && bash deploy.sh cd docker && bash deploy.sh
# 3. Открываем браузер # 3. Открываем браузер
# http://localhost:8080 # http://localhost:8082
# Логин: admin # Логин: admin
# Пароль: mirvmon2026 (смените сразу!) # Пароль: mirvmon2026 (смените сразу!)
``` ```
@ -73,18 +73,20 @@ composer install
```bash ```bash
mysql -u root -p <<EOF mysql -u root -p <<EOF
CREATE DATABASE monitoring_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE monitoring_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mon_user'@'localhost' IDENTIFIED BY 'mon_password_123'; CREATE USER 'mon_user'@'localhost' IDENTIFIED BY 'your_db_password';
GRANT ALL PRIVILEGES ON monitoring_system.* TO 'mon_user'@'localhost'; GRANT ALL PRIVILEGES ON monitoring_system.* TO 'mon_user'@'localhost';
FLUSH PRIVILEGES; FLUSH PRIVILEGES;
EOF EOF
# Загружаем миграции cp .env.example .env
# Укажите в .env актуальные DB_HOST / DB_USERNAME / DB_PASSWORD
for f in docker/migrations/*.sql; do for f in docker/migrations/*.sql; do
mysql -u mon_user -pmon_password_123 monitoring_system < "$f" mysql -u mon_user -pyour_db_password monitoring_system < "$f"
done done
``` ```
#### 3. Настройка .env #### 3. Настройка `.env`
```bash ```bash
cp .env.example .env cp .env.example .env
@ -117,7 +119,7 @@ server {
`http://your-server/login` `http://your-server/login`
- Логин: `admin` - Логин: `admin`
- Пароль: `mirvmon2026` (смените сразу!) - Пароль: `mirvmon2026` (создаётся миграцией `007_seed_admin_user.sql`, смените сразу)
--- ---
@ -242,6 +244,15 @@ docker compose logs app
docker compose down && docker compose up -d --build docker compose down && docker compose up -d --build
``` ```
### Графики за 7/30 дней показывают не всю историю
Для длинных периодов страница сервера использует агрегированные данные из `server_metrics_trends`.
Если history только что мигрировала или trends ещё не заполнены, выполните backfill:
```bash
php /var/www/mon/cron/backfill_trends.php 30
```
--- ---
## Документация ## Документация

View File

@ -9,7 +9,7 @@
- **Интерфейс:** **Полностью на русском языке** (все надписи, кнопки, формы, меню) - **Интерфейс:** **Полностью на русском языке** (все надписи, кнопки, формы, меню)
- **Безопасность:** Prepared Statements для всех SQL-запросов, хеши паролей (`password_hash`), **токены агентов хранятся только как SHA-256 хеши**. - **Безопасность:** Prepared Statements для всех SQL-запросов, хеши паролей (`password_hash`), **токены агентов хранятся только как SHA-256 хеши**.
## 2. Структура базы данных (8 таблиц) ## 2. Структура базы данных
| Таблица | Поля (ключевые) | Назначение | | Таблица | Поля (ключевые) | Назначение |
| ------------------------------ | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | | ------------------------------ | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| **users** | `id, username (unique), password_hash, email, role(admin/user), created_at` | Управление доступом | | **users** | `id, username (unique), password_hash, email, role(admin/user), created_at` | Управление доступом |
@ -61,12 +61,18 @@
4. Создает systemd-сервис для автостарта. 4. Создает systemd-сервис для автостарта.
- **Python-агент:** собирает CPU, RAM, Disk, Network, Temperature раз в **60 секунд**, отправляет на `/api/v1/metrics`. - **Python-агент:** собирает CPU, RAM, Disk, Network, Temperature раз в **60 секунд**, отправляет на `/api/v1/metrics`.
### 3.6. Страница сервера (`/server/{id}`) ### 3.6. Страница сервера (`/servers/{id}`)
- **Текущие значения** всех метрик. - Основной маршрут: `/servers/{id}` (`/server/{id}` оставлен как legacy redirect).
- **Графики Chart.js** для метрик: - **Текущие значения** ключевых метрик.
- По умолчанию — **последние 24 часа**. - **Графики Chart.js**:
- Кнопки выбора периода: **24 часа, 7 дней, 30 дней** (через параметр `?period=7d`). - CPU и RAM — отдельные линейные графики.
- **Управление порогами:** форма настройки `warning_threshold` и `duration` для каждой метрики этого сервера (сохраняет в `metric_thresholds`). - Network — отдельный график на каждый интерфейс (In/Out).
- Temperature — один общий график по всем выбранным `temp_*`.
- Disk — donut-графики по разделам.
- `uptime` показывается текстом, без графика.
- Кнопки выбора периода: **1 час, 6 часов, 24 часа, 7 дней, 30 дней**.
- Для периодов больше 24 часов используются агрегаты из `server_metrics_trends`.
- **Управление порогами:** форма настройки `warning_threshold`, `critical_threshold` и `duration`.
### 3.7. Система алертов ### 3.7. Система алертов
- **Автоматическое создание** при превышении порога. - **Автоматическое создание** при превышении порога.
@ -89,12 +95,12 @@
### Этап 1: Ядро системы ### Этап 1: Ядро системы
- **Цель:** Slim Framework + Twig + Bootstrap работают. - **Цель:** Slim Framework + Twig + Bootstrap работают.
- **Результат:** Открываю `http://localhost:8080/test` → вижу «Система мониторинга». - **Результат:** Открываю `http://localhost:8082/test` → вижу «Система мониторинга».
- ✅ **Выполнен** - ✅ **Выполнен**
### Этап 2: База данных ### Этап 2: База данных
- **Цель:** Все 8 таблиц созданы. - **Цель:** Базовая схема и справочник метрик созданы.
- **Результат:** Импорт `schema.sql` → в MySQL есть все таблицы, включая `metric_names` с записями «cpu_load», «ram_used». - **Результат:** Импорт `schema.sql` и миграций → в MySQL есть основные таблицы, включая `metric_names` с записями `cpu_load`, `ram_used`.
- ✅ **Выполнен** - ✅ **Выполнен**
### Этап 3: Аутентификация + CRUD групп ### Этап 3: Аутентификация + CRUD групп
@ -132,7 +138,7 @@
### Этап 7: Детали сервера + графики ### Этап 7: Детали сервера + графики
- **Цель:** Страница с графиками и выбором периода. - **Цель:** Страница с графиками и выбором периода.
- **Результат:** - **Результат:**
1. Кликаю на карточку сервера → открывается `/server/1`. 1. Кликаю на карточку сервера → открывается `/servers/1`.
2. Вижу график CPU за 24 часа. 2. Вижу график CPU за 24 часа.
3. Нажимаю «7 дней» → график перерисовывается за неделю. 3. Нажимаю «7 дней» → график перерисовывается за неделю.
- ✅ **Выполнен** - ✅ **Выполнен**
@ -159,7 +165,7 @@
### Выполненные этапы: ### Выполненные этапы:
- ✅ Этап 1: Ядро системы (Slim Framework 4, Twig, Bootstrap 5, Font Awesome 6) - ✅ Этап 1: Ядро системы (Slim Framework 4, Twig, Bootstrap 5, Font Awesome 6)
- ✅ Этап 2: База данных (схема создана, 8 таблиц, стандартные метрики) - ✅ Этап 2: База данных (схема создана, миграции и стандартные метрики применены)
- ✅ Этап 3: Аутентификация и авторизация (middleware, формы входа/выхода, CRUD групп) - ✅ Этап 3: Аутентификация и авторизация (middleware, формы входа/выхода, CRUD групп)
- ✅ Этап 4: CRUD серверов (добавление/редактирование/удаление, генерация токенов) - ✅ Этап 4: CRUD серверов (добавление/редактирование/удаление, генерация токенов)
- ✅ Этап 5: API для агентов (прием метрик, проверка токенов, обновление статусов) - ✅ Этап 5: API для агентов (прием метрик, проверка токенов, обновление статусов)
@ -171,7 +177,7 @@
### Архитектура: ### Архитектура:
- **Frontend:** Bootstrap 5, Font Awesome 6, Chart.js (через CDN) - **Frontend:** Bootstrap 5, Font Awesome 6, Chart.js (через CDN)
- **Backend:** Slim Framework 4, Twig templates, PSR-7 - **Backend:** Slim Framework 4, Twig templates, PSR-7
- **Database:** MySQL/MariaDB с 8 таблицами - **Database:** MySQL/MariaDB с базовой схемой и последующими миграциями
- **Security:** Password hashing, SHA-256 token hashes, prepared statements - **Security:** Password hashing, SHA-256 token hashes, prepared statements
- **Language:** Полный перевод интерфейса на русский язык - **Language:** Полный перевод интерфейса на русский язык