309 lines
10 KiB
Markdown
309 lines
10 KiB
Markdown
# Система статистики и мониторинга серверов
|
||
|
||
## 📊 Что добавлено
|
||
|
||
### Backend (API):
|
||
|
||
1. **Новая модель Prisma**: `ServerMetric`
|
||
- Хранит историю метрик каждого сервера
|
||
- Поля: CPU, Memory, Disk, Network, Status, Uptime
|
||
- Автоматическое удаление при удалении сервера (CASCADE)
|
||
|
||
2. **3 новых API endpoint'а**:
|
||
- `GET /api/server/:id/metrics` - Получить текущие метрики (+ сохранение в БД)
|
||
- `GET /api/server/:id/metrics/history?period=24h` - История за период (1h, 6h, 24h, 7d, 30d)
|
||
- `GET /api/server/:id/metrics/summary` - Сводка за 24 часа (средние, макс, мин)
|
||
|
||
3. **Автоматическое сохранение**:
|
||
- При каждом запросе текущих метрик данные сохраняются в БД
|
||
- Создаётся точка для графиков
|
||
|
||
### Frontend (React):
|
||
|
||
1. **Компонент `ServerMetrics.tsx`**:
|
||
- 4 карточки с текущими показателями (CPU, RAM, Disk, Network)
|
||
- Цветовая индикация нагрузки (зелёный/жёлтый/красный)
|
||
- Фильтр периода (1 час, 6 часов, 24 часа, 7 дней, 30 дней)
|
||
- 3 интерактивных графика (Recharts):
|
||
- CPU Usage (Area Chart)
|
||
- Memory + Disk (Line Chart)
|
||
- Network Traffic (Area Chart)
|
||
- Автообновление каждую минуту
|
||
|
||
2. **Интеграция**:
|
||
- Встроен в панель управления сервером
|
||
- Вкладка "Мониторинг" теперь показывает реальные данные
|
||
|
||
## 🚀 Установка
|
||
|
||
### 1. SQL миграция:
|
||
```bash
|
||
cd /var/www/ospab-host/backend
|
||
mysql -u root -p ospabhost < prisma/migrations/add_server_metrics.sql
|
||
```
|
||
|
||
### 2. Обновление Prisma:
|
||
```bash
|
||
cd /var/www/ospab-host/backend
|
||
npx prisma generate
|
||
```
|
||
|
||
### 3. Сборка backend:
|
||
```bash
|
||
npm run build
|
||
pm2 restart ospab-backend
|
||
```
|
||
|
||
### 4. Сборка frontend:
|
||
```bash
|
||
cd /var/www/ospab-host/frontend
|
||
npm install recharts
|
||
npm run build
|
||
# Деплой dist/
|
||
```
|
||
|
||
## 📈 Как работает
|
||
|
||
### Сбор данных:
|
||
1. Frontend запрашивает `/api/server/:id/metrics`
|
||
2. Backend получает данные от Proxmox API
|
||
3. Данные сохраняются в таблицу `server_metrics`
|
||
4. Возвращаются пользователю
|
||
|
||
### Графики:
|
||
1. Frontend запрашивает историю за период
|
||
2. Backend агрегирует данные с интервалами:
|
||
- 1h → каждую минуту
|
||
- 6h → каждые 5 минут
|
||
- 24h → каждые 15 минут
|
||
- 7d → каждый час
|
||
- 30d → каждые 6 часов
|
||
3. Recharts строит интерактивные графики
|
||
|
||
### Автоочистка (рекомендуется):
|
||
Добавьте cron-задачу для удаления старых метрик:
|
||
```sql
|
||
-- Удалять метрики старше 30 дней
|
||
DELETE FROM server_metrics WHERE timestamp < DATE_SUB(NOW(), INTERVAL 30 DAY);
|
||
```
|
||
|
||
Или в crontab:
|
||
```bash
|
||
0 2 * * * mysql -u root -pПАРОЛЬ ospabhost -e "DELETE FROM server_metrics WHERE timestamp < DATE_SUB(NOW(), INTERVAL 30 DAY);"
|
||
```
|
||
|
||
## 🎨 Внешний вид
|
||
|
||
### Карточки метрик:
|
||
- **CPU**: Процент загрузки с цветовой индикацией
|
||
- **Память**: Процент + используемый объём / всего
|
||
- **Диск**: Процент + используемый объём / всего
|
||
- **Сеть**: Входящий/исходящий трафик + Uptime
|
||
|
||
### Графики:
|
||
- **CPU**: Плавная заливка оранжевым
|
||
- **Memory/Disk**: Двойной линейный график (синий/зелёный)
|
||
- **Network**: Двойная заливка (фиолетовый/розовый)
|
||
|
||
## 🔧 API примеры
|
||
|
||
### Получить текущие метрики:
|
||
```bash
|
||
curl -H "Authorization: Bearer TOKEN" \
|
||
http://localhost:5000/api/server/1/metrics
|
||
```
|
||
|
||
Ответ:
|
||
```json
|
||
{
|
||
"status": "success",
|
||
"data": {
|
||
"vmid": 105,
|
||
"status": "running",
|
||
"uptime": 3600,
|
||
"cpu": 0.15,
|
||
"memory": {
|
||
"used": 536870912,
|
||
"max": 1073741824,
|
||
"usage": 50.0
|
||
},
|
||
"disk": {
|
||
"used": 2147483648,
|
||
"max": 10737418240,
|
||
"usage": 20.0
|
||
},
|
||
"network": {
|
||
"in": 1048576,
|
||
"out": 524288
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### Получить историю:
|
||
```bash
|
||
curl -H "Authorization: Bearer TOKEN" \
|
||
"http://localhost:5000/api/server/1/metrics/history?period=24h"
|
||
```
|
||
|
||
Ответ:
|
||
```json
|
||
{
|
||
"status": "success",
|
||
"period": "24h",
|
||
"data": [
|
||
{
|
||
"timestamp": "2025-11-01T10:00:00.000Z",
|
||
"cpuUsage": 15.2,
|
||
"memoryUsage": 48.5,
|
||
"diskUsage": 20.1,
|
||
"networkIn": 1048576,
|
||
"networkOut": 524288,
|
||
"status": "running"
|
||
}
|
||
],
|
||
"total": 96
|
||
}
|
||
```
|
||
|
||
### Получить сводку:
|
||
```bash
|
||
curl -H "Authorization: Bearer TOKEN" \
|
||
http://localhost:5000/api/server/1/metrics/summary
|
||
```
|
||
|
||
Ответ:
|
||
```json
|
||
{
|
||
"status": "success",
|
||
"data": {
|
||
"cpu": { "avg": 12.5, "max": 45.2, "min": 2.1 },
|
||
"memory": { "avg": 48.3, "max": 72.1, "min": 35.2 },
|
||
"disk": { "avg": 20.0, "max": 21.5, "min": 19.8 },
|
||
"network": {
|
||
"totalIn": 104857600,
|
||
"totalOut": 52428800
|
||
},
|
||
"uptime": 86400
|
||
}
|
||
}
|
||
```
|
||
|
||
## 🔒 Безопасность
|
||
|
||
- ✅ Все endpoints требуют авторизации (authMiddleware)
|
||
- ✅ Пользователь видит только метрики своих серверов
|
||
- ✅ CASCADE DELETE - метрики удаляются вместе с сервером
|
||
- ✅ Нет лимитов на количество запросов (можно добавить rate limiting)
|
||
|
||
## 📊 База данных
|
||
|
||
Структура таблицы:
|
||
```sql
|
||
CREATE TABLE `server_metrics` (
|
||
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||
`serverId` INT NOT NULL,
|
||
`cpuUsage` DOUBLE DEFAULT 0,
|
||
`memoryUsage` DOUBLE DEFAULT 0,
|
||
`memoryUsed` BIGINT DEFAULT 0,
|
||
`memoryMax` BIGINT DEFAULT 0,
|
||
`diskUsage` DOUBLE DEFAULT 0,
|
||
`diskUsed` BIGINT DEFAULT 0,
|
||
`diskMax` BIGINT DEFAULT 0,
|
||
`networkIn` BIGINT DEFAULT 0,
|
||
`networkOut` BIGINT DEFAULT 0,
|
||
`status` VARCHAR(191) DEFAULT 'unknown',
|
||
`uptime` BIGINT DEFAULT 0,
|
||
`timestamp` DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3),
|
||
INDEX `server_metrics_serverId_timestamp_idx` (`serverId`, `timestamp`),
|
||
FOREIGN KEY (`serverId`) REFERENCES `server`(`id`) ON DELETE CASCADE
|
||
);
|
||
```
|
||
|
||
Размер записи: ~100 байт
|
||
При частоте 1 метрика/минуту: ~144 KB/день/сервер
|
||
|
||
## 🎯 Рекомендации
|
||
|
||
1. **Cron для сбора метрик**:
|
||
Создайте задачу, которая каждые 5 минут запрашивает метрики всех серверов:
|
||
```javascript
|
||
// backend/src/cron/collectMetrics.ts
|
||
import { PrismaClient } from '@prisma/client';
|
||
import { getContainerStats } from './modules/server/proxmoxApi';
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
async function collectAllMetrics() {
|
||
const servers = await prisma.server.findMany({
|
||
where: { status: 'running' }
|
||
});
|
||
|
||
for (const server of servers) {
|
||
if (!server.proxmoxId) continue;
|
||
try {
|
||
const stats = await getContainerStats(server.proxmoxId);
|
||
if (stats.status === 'success' && stats.data) {
|
||
await prisma.serverMetric.create({ /* ... */ });
|
||
}
|
||
} catch (err) {
|
||
console.error(`Ошибка сбора метрик для сервера ${server.id}:`, err);
|
||
}
|
||
}
|
||
}
|
||
|
||
// Запускать каждые 5 минут
|
||
setInterval(collectAllMetrics, 5 * 60 * 1000);
|
||
```
|
||
|
||
2. **Партиционирование таблицы** (для высоких нагрузок):
|
||
```sql
|
||
ALTER TABLE server_metrics
|
||
PARTITION BY RANGE (YEAR(timestamp) * 100 + MONTH(timestamp)) (
|
||
PARTITION p202511 VALUES LESS THAN (202512),
|
||
PARTITION p202512 VALUES LESS THAN (202601),
|
||
PARTITION pmax VALUES LESS THAN MAXVALUE
|
||
);
|
||
```
|
||
|
||
3. **Кэширование**:
|
||
Добавьте Redis для кэширования текущих метрик (TTL 30 секунд).
|
||
|
||
## 📝 Changelog
|
||
|
||
**1 ноября 2025**:
|
||
- ✅ Добавлена модель ServerMetric в Prisma
|
||
- ✅ Созданы 3 API endpoint'а для метрик
|
||
- ✅ Реализован компонент ServerMetrics с графиками
|
||
- ✅ Интегрирован в панель управления сервером
|
||
- ✅ Установлена библиотека Recharts для графиков
|
||
- ✅ Добавлена SQL миграция
|
||
|
||
## 🐛 Troubleshooting
|
||
|
||
**Проблема**: Графики не отображаются
|
||
- Проверьте консоль браузера на ошибки API
|
||
- Убедитесь, что сервер запущен и метрики собираются
|
||
- Проверьте, что таблица `server_metrics` создана
|
||
|
||
**Проблема**: "Cannot read property 'cpu' of undefined"
|
||
- Сервер ещё не имеет метрик в БД
|
||
- Подождите 1-2 минуты после создания сервера
|
||
- Вручную запросите `/api/server/:id/metrics`
|
||
|
||
**Проблема**: Слишком большая база данных
|
||
- Настройте автоочистку старых метрик (см. выше)
|
||
- Уменьшите частоту сбора данных
|
||
- Используйте партиционирование
|
||
|
||
## 🎉 Готово!
|
||
|
||
Теперь у вас полноценная система мониторинга с:
|
||
- ✅ Реал-тайм метриками
|
||
- ✅ Интерактивными графиками
|
||
- ✅ Историей данных
|
||
- ✅ Красивым интерфейсом
|
||
- ✅ Автоматическим обновлением
|
||
|
||
Пользователи могут отслеживать нагрузку на свои серверы в режиме реального времени! 🚀
|