docs: Update documentation to reflect current state

README.md:
- Fix badge line breaks
- Add migration 008_auto_cleanup_metrics.sql
- Improve architecture diagram
- Add troubleshooting section
- Add changelog
- Fix formatting

ARCHITECTURE.md:
- Update agent metrics list (net_in_*, temp_*, etc.)
- Change interval from 10s to 60s
- Fix architecture diagram

INSTALL.md:
- PHP 8.1 -> 8.3
- php8.1-fpm.sock -> php8.3-fpm.sock
- Update API example with current metrics

AGENTS.md:
- PHP 8.1 -> 8.3
- Update API endpoints with new /get-agent, /agent/install.sh

docker/README.md:
- Fix password from 'admin' to 'mirvmon2026'

TECHNICAL_SPECIFICATION.md:
- Change agent interval from 10s to 60s
- Add lm-sensors, smartmontools to agent requirements
This commit is contained in:
mirivlad 2026-04-17 11:52:48 +08:00
parent fe1463442a
commit 6d3542232a
6 changed files with 248 additions and 84 deletions

View File

@ -5,7 +5,7 @@
**Название:** Система мониторинга серверов **Название:** Система мониторинга серверов
**URL:** https://mon.mirv.top **URL:** https://mon.mirv.top
**Расположение:** /var/www/mon **Расположение:** /var/www/mon
**Технологии:** PHP 8.1+, Slim Framework 4, Twig, MySQL/MariaDB **Технологии:** PHP 8.3+, Slim Framework 4, Twig, MySQL/MariaDB
## Структура проекта ## Структура проекта
@ -46,14 +46,18 @@
## API endpoints ## API endpoints
- `GET /api/servers` - список мониторинговых серверов ### Публичные (без авторизации)
- `GET /api/servers/{id}` - детали сервера - `POST /api/v1/metrics` - получение метрик от агента
- `POST /api/servers` - создание нового сервера - `GET /get-agent?token=` - скачать Python-агента
- `PUT /api/servers/{id}` - обновление сервера - `GET /agent/install.sh?token=` - скачать установочный скрипт (Linux)
- `DELETE /api/servers/{id}` - удаление сервера - `GET /agent/install.bat?token=` - скачать установочный скрипт (Windows)
- `GET /api/metrics/{server_id}` - метрики сервера
- `POST /api/agent/metrics` - получение метрик от агента ### Защищённые (требуется авторизация)
- `GET /csrf-token` - получение CSRF токена для форм - `GET /csrf-token` - получение CSRF токена для форм
- `GET /` - дашборд
- `GET /servers` - список серверов
- `GET /servers/{id}` - детали сервера
- `GET /alerts` - список алертов
## Агентские задачи ## Агентские задачи

View File

@ -25,15 +25,15 @@
### Общая схема ### Общая схема
``` ```
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ +---------------+ POST /api/v1/metrics +--------------+
│ Python Agent │─────▶│ API /metrics │─────▶│ Database │ | Python Agent | --------------------------> | PHP Backend |
│ (каждые 10с) │ HTTP │ (public) │ │ (MySQL) │ | (каждые 60с) | JSON: metrics + services | (Slim 4) |
└─────────────────┘ └──────────────────┘ └─────────────────┘ +---------------+ <-------------------------- +------+-------+
^
┌─────────────────┐ ┌──────────────────┐ │ +---------------+ +-----------------------+ |
│ Web Browser │─────▶│ Slim Framework │────────────┘ | Web Browser | ---> | /servers/{id} | ---------------+
│ (Dashboard) │ HTTP │ (PHP 8.1+) │ | (Dashboard) | | /alerts, /admin |
└─────────────────┘ └──────────────────┘ +---------------+ +-----------------------+
``` ```
### Технологический стек ### Технологический стек
@ -189,24 +189,28 @@ alerts # Алерты
### agent.py ### agent.py
**Расположение:** `/var/www/mon/agent.py` **Расположение:** `/var/www/mon/agent.py`
**Функции:** **Собираемые метрики:**
- Сбор метрик каждые 10 секунд: - `cpu_load` - загрузка CPU (%)
- `cpu_load` — загрузка CPU (%) - `ram_used` - использовано RAM (%)
- `ram_used` — использовано RAM (%) - `ram_total_gb` - всего RAM (ГБ)
- `disk_used` — использовано Disk (%) - `disk_used_*` - использовано по разделам (%)
- Отправка на `POST /api/v1/metrics` - `disk_total_gb_*` - размер разделов (ГБ)
- Конфигурация через JSON файл - `net_in_{iface}`, `net_out_{iface}` - трафик (% от скорости интерфейса)
- Автозапуск через systemd - `temp_*` - температуры (°C)
- `top_cpu_proc`, `top_ram_proc` - топ-5 процессов (JSON)
**Интервал сбора:** 60 секунд
### install.sh ### install.sh
**Генерация:** `GET /agent/install.sh?token={token}` **Endpoint:** `GET /agent/install.sh?token={token}`
**Что делает:** **Что делает:**
1. Проверяет Python 3 1. Проверяет Python 3, устанавливает psutil, lm-sensors, smartmontools
2. Устанавливает `psutil` 2. Скачивает `agent.py` с сервера мониторинга
3. Скачивает `agent.py` с сервера 3. Создает конфиг с токеном и URL API
4. Создаёт конфиг с токеном и URL 4. Создает systemd сервис `server-monitor-agent.service`
5. Создаёт systemd сервис `server-mon-agent.service`
**Безопасность:** Скрипт и агент доступны только с валидным токеном сервера.
--- ---
@ -289,15 +293,23 @@ certbot --nginx -d mon.mirv.top
### Стандартные метрики (metric_names) ### Стандартные метрики (metric_names)
| Имя | Единица | Описание | | Имя | Единица | Описание |
|-----|---------|----------| |-----|---------|---------|
| `cpu_load` | % | Загрузка CPU | | `cpu_load` | % | Загрузка CPU |
| `ram_used` | % | Использовано RAM | | `ram_used` | % | Использовано RAM |
| `disk_used` | % | Использовано Disk | | `ram_total_gb` | ГБ | Всего RAM |
| `disk_used` | % | Использовано (общий) |
| `disk_used_root` | % | Использовано (/) |
| `disk_used_home` | % | Использовано (/home) |
| `disk_used_*` | % | Другие разделы |
| `net_in_{iface}` | % | Входящий трафик |
| `net_out_{iface}` | % | Исходящий трафик |
| `temp_cpu` | °C | Температура CPU |
| `temp_hdd` | °C | Температура диска |
| `top_cpu_proc` | JSON | Топ-5 процессов по CPU | | `top_cpu_proc` | JSON | Топ-5 процессов по CPU |
| `top_ram_proc` | JSON | Топ-5 процессов по RAM | | `top_ram_proc` | JSON | Топ-5 процессов по RAM |
### Период сбора ### Период сбора
- **Агент:** каждые 10 секунд - **Агент:** каждые 60 секунд
- **Дашборд:** автообновление каждые 30 секунд - **Дашборд:** автообновление каждые 30 секунд
- **Графики:** 24 часа / 7 дней / 30 дней - **Графики:** 24 часа / 7 дней / 30 дней

View File

@ -2,7 +2,7 @@
## Требования ## Требования
- PHP 8.1 или выше - PHP 8.3 или выше
- Composer - Composer
- MySQL 8+ или MariaDB 10.5+ - MySQL 8+ или MariaDB 10.5+
- Apache или Nginx - Apache или Nginx
@ -72,7 +72,7 @@ server {
location ~ \.php$ { location ~ \.php$ {
include snippets/fastcgi-php.conf; include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
} }
} }
@ -136,11 +136,25 @@ chmod +x install.sh
"metrics": { "metrics": {
"cpu_load": 45.2, "cpu_load": 45.2,
"ram_used": 89.1, "ram_used": 89.1,
"disk_used": 65.5 "ram_total_gb": 16.0,
} "disk_used_root": 65.5,
"net_in_ens3": 12.3,
"net_out_ens3": 5.6
},
"services": [
{"name": "nginx", "status": "running"}
]
} }
``` ```
### Скачивание агента
```
GET /get-agent?token=<server_token>
GET /agent/install.sh?token=<server_token>
GET /agent/install.bat?token=<server_token>
```
## Безопасность ## Безопасность
- Все пароли хешируются с помощью `password_hash()` - Все пароли хешируются с помощью `password_hash()`

219
README.md
View File

@ -1,35 +1,28 @@
# 🖥️ mirvmon — Система мониторинга серверов # mirvmon — Система мониторинга серверов
> Лёгкая и функциональная система мониторинга для домашних и небольших серверных > Легкая и функциональная система мониторинга для домашних и небольших серверных инфраструктур.
инфраструктур.
[![PHP](https://img.shields.io/badge/PHP-8.3+-777BB4.svg)](https://php.net) [![PHP](https://img.shields.io/badge/PHP-8.3+-777BB4.svg)](https://php.net) [![Slim](https://img.shields.io/badge/Slim-4.x-3399FF.svg)](https://www.slimframework.com) [![MariaDB](https://img.shields.io/badge/MariaDB-10.11-003545.svg)](https://mariadb.org) [![Chart.js](https://img.shields.io/badge/Chart.js-4.x-FF6384.svg)](https://www.chartjs.org)
[![Slim](https://img.shields.io/badge/Slim-4.x-3399FF.svg)](https://www.slimfram
ework.com)
[![MariaDB](https://img.shields.io/badge/MariaDB-10.11-003545.svg)](https://mari
adb.org)
[![Chart.js](https://img.shields.io/badge/Chart.js-4.x-FF6384.svg)](https://www.
chartjs.org)
--- ---
## 📋 Возможности ## Возможности
- 📊 **Метрики в реальном времени:** CPU, RAM, диск (по разделам), сеть (In/Out в %) - **Метрики в реальном времени:** CPU, RAM, диск (по разделам), сеть (In/Out в %)
- 🔔 **Алерты и уведомления:** Настраиваемые пороги с уведомлениями через Telegram и Email - **Алерты и уведомления:** Настраиваемые пороги с уведомлениями через Telegram и Email
- 🖧 **Мониторинг сервисов:** Отслеживание состояния systemd-сервисов с алертами при остановке - **Мониторинг сервисов:** Отслеживание состояния systemd-сервисов с алертами при остановке
- 📈 **Интерактивные графики:** Зум, панорамирование, детализация по периодам (1ч, 6ч, 24ч, 7д, 30д) - **Интерактивные графики:** Зум, панорамирование, детализация по периодам (1ч, 6ч, 24ч, 7д, 30д)
- 🌐 **Множество серверов:** Поддержка неограниченного числа серверов через Python-агент - **Множество серверов:** Поддержка неограниченного числа серверов через Python-агент
- 🎨 **Цветная индикация:** Прогресс-бары меняют цвет (🟢 → 🟡 → 🔴) при приближении к порогам - **Цветная индикация:** Прогресс-бары меняют цвет при приближении к порогам
- 🔐 **Авторизация:** Сессионная аутентификация с CSRF-защитой - **Авторизация:** Сессионная аутентификация с CSRF-защитой
--- ---
## 🚀 Установка ## Установка
### Вариант A: Docker (рекомендуется) ### Вариант A: Docker (рекомендуется)
Самый быстрый способ — всё поднимается автоматически: Самый быстрый способ - все поднимается автоматически:
```bash ```bash
# 1. Клонируем # 1. Клонируем
@ -62,7 +55,7 @@ git pull
docker compose -f docker/docker-compose.yml up -d --build docker compose -f docker/docker-compose.yml up -d --build
``` ```
> 📦 Код внутри Docker-образа (immutable). Данные БД в volume `db_data` не теряются. > Код внутри Docker-образа (immutable). Данные БД в volume `db_data` - не теряются.
--- ---
@ -85,14 +78,10 @@ GRANT ALL PRIVILEGES ON monitoring_system.* TO 'mon_user'@'localhost';
FLUSH PRIVILEGES; FLUSH PRIVILEGES;
EOF EOF
# Загружаем схему # Загружаем миграции
mysql -u mon_user -pmon_password_123 monitoring_system < docker/migrations/001_create_base_schema.sql for f in docker/migrations/*.sql; do
mysql -u mon_user -pmon_password_123 monitoring_system < docker/migrations/002_add_encrypted_token.sql mysql -u mon_user -pmon_password_123 monitoring_system < "$f"
mysql -u mon_user -pmon_password_123 monitoring_system < docker/migrations/003_add_agent_configs.sql done
mysql -u mon_user -pmon_password_123 monitoring_system < docker/migrations/004_add_global_notification_settings.sql
mysql -u mon_user -pmon_password_123 monitoring_system < docker/migrations/005_add_service_tables.sql
mysql -u mon_user -pmon_password_123 monitoring_system < docker/migrations/006_server_metrics_value_to_text.sql
mysql -u mon_user -pmon_password_123 monitoring_system < docker/migrations/007_seed_admin_user.sql
``` ```
#### 3. Настройка .env #### 3. Настройка .env
@ -126,25 +115,169 @@ server {
#### 5. Вход в систему #### 5. Вход в систему
`http://your-server/login` `http://your-server/login`
- Логин: `admin` - Логин: `admin`
- Пароль: `mirvmon2026` (смените сразу!) - Пароль: `mirvmon2026` (смените сразу!)
--- ---
## 🏗️ Архитектура ## Архитектура
``` ```
┌─────────────────────┐ POST /api/v1/metrics ┌──────────────────┐ +-----------+ POST /api/v1/metrics +----------+
│ Python Agent │ ──────────────────────────────▶ │ PHP Backend │ | Python | -------------------------------> | PHP |
│ (мониторимый │ JSON: метрики + сервисы │ (Slim + Twig) │ | Agent | JSON: metrics + services | Backend |
│ сервер) │◀────────────────────────────── │ │ | (server) | <------------------------------- +----+-----+
└─────────────────────┘ └────────┬─────────┘ +-----------+ ^ |
▲ │ ^ | | PDO
│ systemctl list-units │ PDO | systemctl list-units | v
│ psutil ▼ +-----------+ +-----------+
┌─────────────────────┐ ┌──────────────────┐ | Linux | | MariaDB |
ОС Linux │ │ MariaDB │ | OS | | |
│ (systemd, net, │ │ monitoring_ │ +-----------+ +-----------+
│ disk, ps) │ │ system │
└─────────────────────┘ └──────────────────┘
``` ```
### Технологический стек
| Компонент | Технология |
|-------------|-------------------------|
| Backend | Slim Framework 4.x |
| Frontend | Bootstrap 5 + Chart.js |
| Database | MariaDB 10.11 |
| Agent | Python 3 + psutil |
---
## Установка агента на сервер
Агент устанавливается через скачивание скрипта с сервера мониторинга:
```bash
# 1. В веб-интерфейсе: Серверы -> Редактирование -> Скачать установочный скрипт
# 2. На целевом сервере:
chmod +x install.sh
sudo ./install.sh
```
Агент будет:
- Установлен в `/opt/server-monitor-agent/`
- Запущен как systemd-сервис
- Отправлять метрики каждые 60 секунд
---
## API
### Получение метрик от агента
```
POST /api/v1/metrics
Content-Type: application/json
{
"token": "server_token",
"metrics": {
"cpu_load": 45.2,
"ram_used": 89.1,
"disk_used_root": 65.5,
"net_in_ens3": 12.3,
"net_out_ens3": 5.6
},
"services": [
{"name": "nginx", "status": "running"},
{"name": "mysql", "status": "stopped"}
]
}
```
### Другие endpoints
| Endpoint | Описание |
|---------------------------------|------------------------------------|
| `GET /` | Дашборд |
| `GET /servers` | Управление серверами |
| `GET /servers/{id}` | Детали сервера с графиками |
| `GET /agent/install.sh?token=` | Скачать установочный скрипт (Linux)|
| `GET /agent/install.bat?token=` | Скачать установочный скрипт (Win) |
| `POST /api/v1/metrics` | Получение метрик от агента |
| `GET /alerts` | Список алертов |
| `POST /alerts/{id}/resolve` | Отметить алерт решенным |
---
## Troubleshooting
### Агент не отправляет метрики
```bash
# Проверить статус сервиса
sudo systemctl status server-monitor-agent
# Посмотреть логи
sudo journalctl -u server-monitor-agent -f
# Перезапустить
sudo systemctl restart server-monitor-agent
```
### Агент не устанавливается
```bash
# Проверить Python
python3 --version
# Установить зависимости вручную
sudo apt install python3-pip
sudo pip3 install psutil requests
```
### Docker: контейнер не стартует
```bash
# Проверить логи
docker compose logs app
# Пересобрать
docker compose down && docker compose up -d --build
```
---
## Документация
- [ARCHITECTURE.md](ARCHITECTURE.md) - Архитектура системы
- [TECHNICAL_SPECIFICATION.md](TECHNICAL_SPECIFICATION.md) - Техническое задание
- [INSTALL.md](INSTALL.md) - Детальная инструкция установки
- [docker/README.md](docker/README.md) - Docker-развертывание
---
## Changelog
### v1.1 (Апрель 2026)
- Динамические пороги для метрик сервера
- Улучшенный агент с поддержкой VPS (virtio-диски)
- Скачивание агента с сервера (вместо встраивания в скрипт)
- Защита endpoint агента токеном
- Doughnut-графики для разделов дисков
- Графики температур и сетевых интерфейсов
- Топ-процессы в тултипах графиков
- Мониторинг systemd-сервисов
### v1.0 (Февраль 2026)
- Ядро системы (Slim 4 + Twig + Bootstrap 5)
- Аутентификация и авторизация
- CRUD серверов и групп
- API для приема метрик
- Python-агент с systemd
- Графики Chart.js
- Система алертов с порогами
- Топ-5 процессов по CPU/RAM
- Уведомления (Email/Telegram)
---
## Лицензия
MIT

View File

@ -55,11 +55,11 @@
### 3.5. Агент мониторинга ### 3.5. Агент мониторинга
- **Скрипт установки:** `GET /agent/install.sh?token=...` → динамически генерирует **bash-скрипт**, который: - **Скрипт установки:** `GET /agent/install.sh?token=...` → динамически генерирует **bash-скрипт**, который:
1. Устанавливает Python3, psutil. 1. Устанавливает Python3, psutil, lm-sensors, smartmontools.
2. Скачивает Python-агента (`agent.py`) с вашего сервера. 2. Скачивает Python-агента (`agent.py`) с вашего сервера.
3. Подставляет **токен** и **URL API** в конфиг агента. 3. Подставляет **токен** и **URL API** в конфиг агента.
4. Создает systemd-сервис для автостарта. 4. Создает systemd-сервис для автостарта.
- **Python-агент:** собирает CPU, RAM, Disk раз в **10 секунд**, отправляет на `/api/v1/metrics`. - **Python-агент:** собирает CPU, RAM, Disk, Network, Temperature раз в **60 секунд**, отправляет на `/api/v1/metrics`.
### 3.6. Страница сервера (`/server/{id}`) ### 3.6. Страница сервера (`/server/{id}`)
- **Текущие значения** всех метрик. - **Текущие значения** всех метрик.

View File

@ -13,7 +13,8 @@ nano .env
docker compose up -d --build docker compose up -d --build
# 4. Открываем http://localhost:8080 # 4. Открываем http://localhost:8080
# Логин: admin, Пароль: admin (сменить сразу!) # Логин: admin
# Пароль: mirvmon2026 (сменить сразу!)
``` ```
## Обновление ## Обновление