mirvmon/README.md

273 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🖥️ mirvmon — Система мониторинга серверов
> Лёгкая и функциональная система мониторинга для домашних и небольших серверных инфраструктур.
[![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)
---
## 📋 Возможности
- 📊 **Метрики в реальном времени:** CPU, RAM, диск (по разделам), сеть (In/Out в %)
- 🔔 **Алерты и уведомления:** Настраиваемые пороги с уведомлениями через Telegram и Email
- 🖧 **Мониторинг сервисов:** Отслеживание состояния systemd-сервисов с алертами при остановке
- 📈 **Интерактивные графики:** Зум, панорамирование, детализация по периодам (1ч, 6ч, 24ч, 7д, 30д)
- 🌐 **Множество серверов:** Поддержка неограниченного числа серверов через Python-агент
- 🎨 **Цветная индикация:** Прогресс-бары меняют цвет (🟢 → 🟡 → 🔴) при приближении к порогам
- 🔐 **Авторизация:** Сессионная аутентификация с CSRF-защитой
---
## 🏗️ Архитектура
```
┌─────────────────────┐ POST /api/v1/metrics ┌──────────────────┐
│ Python Agent │ ──────────────────────────────▶ │ PHP Backend │
│ (мониторимый │ JSON: метрики + сервисы │ (Slim + Twig) │
│ сервер) │◀────────────────────────────── │ │
└─────────────────────┘ └────────┬─────────┘
▲ │
│ systemctl list-units │ PDO
│ psutil ▼
┌─────────────────────┐ ┌──────────────────┐
ОС Linux │ │ MariaDB │
│ (systemd, net, │ │ monitoring_ │
│ disk, ps) │ │ system │
└─────────────────────┘ └──────────────────┘
```
---
## 🚀 Быстрый старт
### 1. Клонирование
```bash
git clone https://git.mirv.top/mirivlad/mirvmon.git
cd mirvmon
```
### 2. Установка зависимостей
```bash
composer install
```
### 3. База данных
```bash
mysql -u root -p monitoring_system < monitoring_system_dump.sql
```
### 4. Настройка БД
Отредактируйте `config/DatabaseConfig.php`:
```php
private $host = 'localhost';
private $db_name = 'monitoring_system';
private $username = 'mon_user';
private $password = 'mon_password_123';
```
### 5. Веб-сервер (Nginx)
```nginx
server {
listen 80;
server_name mon.mirv.top;
root /var/www/mon/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
```
### 6. Вход в систему
Перейдите на `http://mon.mirv.top/login`. Пароль по умолчанию для тестовых данных: `admin123`.
---
## 🤖 Установка Python-агента
### Через скрипт установки (рекомендуется):
1. **Получите ссылку на скрипт:**
В веб-интерфейсе перейдите на страницу редактирования сервера и нажмите кнопку **«Скачать install.sh»**.
Или сгенерируйте ссылку вручную:
```bash
https://mon.mirv.top/agent/install.sh?token=ВАШ_ТОКЕН
```
2. **Запустите установку на сервере:**
```bash
curl -o install.sh "https://mon.mirv.top/agent/install.sh?token=ВАШ_ТОКЕН"
chmod +x install.sh
sudo bash install.sh
```
*Скрипт сам установит Python, зависимости, создаст конфиг и настроит systemd-сервис.*
3. **Проверьте статус:**
```bash
systemctl status server-monitor-agent
```
### Что собирает агент:
- **CPU** (`cpu_load`) — загрузка процессора (%)
- **RAM** (`ram_used`) — использование памяти (%) + топ-5 процессов
- **Диск** (`disk_used_root`, `disk_used_home`, ...) — по каждому реальному разделу (%) + общий объём (GB)
- **Сеть** (`net_in_enp4s0`, `net_out_enp4s0`) — % использования пропускной способности интерфейса
- **Сервисы** — статус всех systemd-юнитов (running/stopped)
---
## 📁 Структура проекта
```
/var/www/mon/
├── config/
│ └── DatabaseConfig.php # Настройки подключения к БД
├── public/
│ ├── index.php # Точка входа (Slim Framework)
│ ├── chartjs-plugin-zoom.min.js # Плагин зума для графиков
│ └── hammer.min.js # Зависимость zoom (CDN)
├── src/
│ ├── Controllers/
│ │ ├── DashboardController.php # Дашборд с карточками серверов
│ │ ├── ServerDetailController.php # Детали сервера + графики + пороги
│ │ ├── ServerController.php # CRUD серверов
│ │ ├── GroupController.php # CRUD групп
│ │ ├── AlertController.php # Управление алертами
│ │ ├── AdminController.php # Админ-панель
│ │ └── Api/
│ │ └── MetricsController.php # REST API для приёма метрик
│ ├── Models/
│ │ ├── Server.php # Модель сервера
│ │ ├── Group.php # Модель группы
│ │ └── Alert.php # Модель алерта
│ ├── Middlewares/
│ │ ├── AuthMiddleware.php # Проверка авторизации
│ │ ├── CsrfMiddleware.php # CSRF-защита
│ │ ├── SessionMiddleware.php # Работа с сессиями
│ │ └── FlashMiddleware.php # Flash-сообщения
│ └── Services/
│ └── NotificationService.php # Отправка уведомлений (Telegram/Email)
├── templates/
│ ├── layout.twig # Базовый layout (Bootstrap 5)
│ ├── dashboard.twig # Дашборд с карточками
│ ├── servers/detail.twig # Детали сервера: графики, пороги, сервисы
│ └── ...
├── composer.json
├── monitoring_system_dump.sql # Дамп структуры + примеры данных
└── schema.sql # Чистая схема БД
```
---
## 📊 Метрики и графики
### На странице сервера доступны:
| Метрика | Тип графика | Описание |
|---------|-------------|----------|
| **CPU Загрузка** | Line (синий) | Загрузка процессора во времени |
| **RAM Использование** | Line (фиолетовый) | Использование памяти + топ процессов в тултипе |
| **Сеть: enp4s0** | Line (2 линии: 🟢 In / 🔴 Out) | % использования пропускной способности |
| **Диски** | Doughnut (карточки по 3 в ряд) | Текущее заполнение каждого раздела с GB |
### Управление графиками:
- 🖱️ **Колёсико мыши** — зум
-**Перетаскивание** — панорамирование
- 🔍 **Кнопка «Сброс»** — возврат к исходному масштабу
- ⏱️ **Период:** 1ч / 6ч / 24ч / 7д / 30д
---
## 🔔 Алерты и уведомления
### Пороги метрик
Для каждой метрики настраиваются:
- ⚠️ **Предупреждение** (warning threshold)
- 🚨 **Критический** (critical threshold)
- ⏱️ **Длительность** (минуты до срабатывания)
### Алерты сервисов
- 🛑 **Остановка** — красное уведомление, создаётся алерт
-**Запуск** — зелёное уведомление, алерт закрывается
- Отслеживаются только сервисы, отмеченные галочкой во вкладке «Сервисы»
### Каналы уведомлений
- **Telegram** — через Bot API (с поддержкой прокси)
- **Email** — через SMTP или функцию `mail()`
---
## 🗄️ База данных
### Основные таблицы:
| Таблица | Описание |
|---------|----------|
| `servers` | Мониторимые серверы |
| `server_metrics` | Временные ряды метрик |
| `metric_names` | Справочник метрик |
| `metric_thresholds` | Пороги алертов для серверов |
| `alerts` | Активные и закрытые алерты |
| `service_status` | Текущие статусы сервисов |
| `service_alerts` | Алерты на остановку сервисов |
| `agent_configs` | Настройки агентов (интервал, список сервисов) |
| `agent_tokens` | Токены авторизации агентов |
| `server_groups` | Группы серверов |
| `users` | Пользователи системы |
| `global_notification_settings` | Глобальные настройки уведомлений |
---
## ⚙️ Конфигурация
### PHP-FPM
- PHP 8.3+
- Расширения: `pdo`, `pdo_mysql`, `json`, `curl`, `mbstring`
### Nginx
- PHP-FPM через Unix socket
- `try_files` для Slim routing
### Python Agent
- Python 3.8+
- `psutil >= 5.0`
- `requests >= 2.25`
- `systemd` (для сбора статусов сервисов)
---
## 🔒 Безопасность
-Все пароли хешируются через `password_hash()` (bcrypt)
- ✅ Токены агентов хранятся как SHA-256 хеши
- ✅ Подготовленные выражения (PDO) для всех SQL-запросов
- ✅ CSRF-токены для всех форм
- ✅ Сессионная аутентификация для веб-интерфейса
- ✅ Валидация и санитизация входных данных
---
## 📝 Лицензия
MIT
---
## 👤 Автор
Владимир (mirivlad) — [git.mirv.top](https://git.mirv.top/mirivlad/mirvmon)