feat(stats): resource metrics dashboard + sites logs/stats
Build / build (push) Successful in 10m50s
Build / build (push) Successful in 10m50s
Background collector samples CPU/memory/network/block I/O for every
instance and site on a configurable interval (default 15s, range
5-300s), persists samples to SQLite with a configurable retention
window (default 2h, range 0-24h), and skips ticks gracefully when
the Docker daemon is unreachable. Settings are reloadable without
a restart — each tick re-reads them.
New API endpoints:
- GET /api/system/stats (host snapshot: info + df)
- GET /api/system/stats/history
- GET /api/system/stats/top?by=cpu|memory
- GET /api/projects/{id}/stages/{s}/instances/{iid}/stats/history
- GET /api/sites/{id}/stats[/history]
- GET /api/sites/{id}/logs (SSE + JSON, reuses instance log streamer)
Frontend:
- ECharts added with tree-shaken imports (~180KB gzip) for
future-proof time-series/gantt/graph visualizations
- CollapsibleSection wraps all dashboard sections (system health,
daemons, system resources, static sites, projects) with
localStorage-persisted open state
- SystemResourcesCard shows capacity tiles, workload utilization
chart with 30m/2h/6h/24h window picker, disk breakdown with
reclaimable callouts, and top 5 consumers
- ContainerStats and ContainerLogs take a source discriminated union
so sites reuse the same components as instances; sites detail page
embeds both for Deno backend debugging
- Settings › Maintenance exposes collection interval + retention
- Docker-unavailable state returns 503 and renders an amber banner
instead of a generic 500
Full i18n coverage (en + ru) for all new strings.
This commit is contained in:
@@ -41,7 +41,47 @@
|
||||
"failedSites": "с ошибкой",
|
||||
"noSites": "Статических сайтов пока нет.",
|
||||
"addFirstSite": "Разверните первый сайт",
|
||||
"viewAllSites": "Все сайты"
|
||||
"viewAllSites": "Все сайты",
|
||||
"systemHealth": "Состояние системы",
|
||||
"daemons": "Демоны",
|
||||
"systemResources": "Системные ресурсы",
|
||||
"systemResourcesSubtitle": "CPU, память, диск и топ потребителей"
|
||||
},
|
||||
"resources": {
|
||||
"cpuCores": "Ядра CPU",
|
||||
"memory": "Память",
|
||||
"running": "Запущено",
|
||||
"dockerDisk": "Диск Docker",
|
||||
"workloadUtilization": "Использование нагрузкой",
|
||||
"windowMinutes": "{n} минут",
|
||||
"windowHours": "{n} часов",
|
||||
"noSamples": "Пока нет данных — сбор идёт каждые {interval}с.",
|
||||
"diskImages": "Образы",
|
||||
"diskContainers": "Контейнеры",
|
||||
"diskVolumes": "Тома",
|
||||
"diskBuildCache": "Кэш сборки",
|
||||
"reclaimable": "{size} можно освободить",
|
||||
"topConsumers": "Топ потребителей",
|
||||
"byCpu": "по CPU",
|
||||
"byMemory": "по памяти",
|
||||
"noRunning": "Нет запущенных контейнеров.",
|
||||
"instance": "экземпляр",
|
||||
"site": "сайт",
|
||||
"showHistory": "Показать историю",
|
||||
"hideHistory": "Скрыть историю",
|
||||
"cpuSeries": "CPU %",
|
||||
"memorySeries": "Память %",
|
||||
"loading": "Загрузка…",
|
||||
"sectionTitle": "Ресурсы",
|
||||
"showLogs": "Показать логи",
|
||||
"hideLogs": "Скрыть логи",
|
||||
"dockerUnavailable": "Docker недоступен. Проверьте, что демон запущен."
|
||||
},
|
||||
"statsSettings": {
|
||||
"intervalLabel": "Интервал сбора статистики (с)",
|
||||
"intervalHelp": "Как часто собираются замеры ресурсов. 0 отключает сбор. Диапазон: 5–300с.",
|
||||
"retentionLabel": "Хранение статистики (часы)",
|
||||
"retentionHelp": "Как долго хранятся замеры ресурсов. 0 отключает сбор. Диапазон: 0–24ч."
|
||||
},
|
||||
"projects": {
|
||||
"title": "Проекты",
|
||||
|
||||
Reference in New Issue
Block a user