feat: real-time WebSocket metrics broadcaster and UI updates
- New metrics_broadcaster service (410 lines) — background broadcaster pushing CPU/RAM/disk/network stats to subscribed WebSocket clients - WebSocket protocol extended: subscribe/unsubscribe channels, get_rrd/get_node_rrd requests with request_id - main.py: metrics broadcaster started in lifespan, WS message dispatcher - websocket_manager.py: subscription map support - templates: dashboard, instance_detail, proxmox_server_detail, proxmox_vms, workspaces — real-time charts and UI updates - auth.py, servers.py, settings.py: minor fixes
This commit is contained in:
@@ -75,13 +75,11 @@ class ChangePasswordRequest(BaseModel):
|
||||
|
||||
class PanelSettingsResponse(BaseModel):
|
||||
panel_name: str
|
||||
refresh_interval: int # seconds
|
||||
log_retention_days: int
|
||||
language: str # ru or en
|
||||
|
||||
|
||||
class UpdatePanelSettingsRequest(BaseModel):
|
||||
refresh_interval: Optional[int] = Field(None, ge=1, le=60)
|
||||
log_retention_days: Optional[int] = Field(None, ge=1, le=365)
|
||||
language: Optional[str] = Field(None, pattern='^(ru|en)$')
|
||||
|
||||
@@ -269,13 +267,11 @@ async def get_panel_settings(
|
||||
from ..config import settings
|
||||
|
||||
# Get settings from database or use defaults
|
||||
refresh_interval = get_setting(db, "refresh_interval", "5")
|
||||
log_retention_days = get_setting(db, "log_retention_days", "30")
|
||||
language = get_setting(db, "language", "ru")
|
||||
|
||||
return {
|
||||
"panel_name": settings.PANEL_NAME,
|
||||
"refresh_interval": int(refresh_interval),
|
||||
"log_retention_days": int(log_retention_days),
|
||||
"language": language
|
||||
}
|
||||
@@ -291,10 +287,6 @@ async def update_panel_settings(
|
||||
updated_fields = []
|
||||
|
||||
# Save settings to database
|
||||
if data.refresh_interval is not None:
|
||||
set_setting(db, "refresh_interval", str(data.refresh_interval), "Интервал обновления данных (секунды)")
|
||||
updated_fields.append(f"refresh_interval={data.refresh_interval}")
|
||||
|
||||
if data.log_retention_days is not None:
|
||||
set_setting(db, "log_retention_days", str(data.log_retention_days), "Срок хранения логов (дни)")
|
||||
updated_fields.append(f"log_retention_days={data.log_retention_days}")
|
||||
|
||||
Reference in New Issue
Block a user