feat: v1.1.0 — backup module, IPAM node binding, HA, task queue, theme CSS

- Backup module: full CRUD for storages, backup files, scheduled jobs (APScheduler)
- Proxmox client: storage/backup/restore/HA methods
- IPAM: proxmox_node field, server+node binding for networks and allocations
- Task queue service: improvements and new task types
- Monitoring worker: extended metrics and alerts
- HA support: add/remove VMs from Proxmox HA groups
- tasks.html: new task tracking page
- proxmox_vms.html: major UI update (bulk ops, HA, snapshots)
- backups.html: full backup management UI (3 tabs)
- base.html: sidebar backup link, websocket manager
- theme.css: full CSS variables theme, 395 lines added
- migrations: migration #15 (BackupJob), #16 (proxmox_node)
- RBAC: backup resource permissions
- websocket_manager.py: new module for WS connections
This commit is contained in:
markmorado
2026-03-08 18:29:29 +01:00
parent 2c8becc6d4
commit b3db346cfb
21 changed files with 3676 additions and 93 deletions

View File

@@ -403,14 +403,19 @@ def get_server_cluster_info(
})
is_cluster = client.is_cluster()
nodes = client.get_nodes() if is_cluster else []
nodes = client.get_nodes()
node_names = [n.get('node') for n in nodes if n.get('node')]
# Fallback: если get_nodes() вернул пустой список (например, нет прав),
# используем hostname сервера как имя ноды
if not node_names:
node_names = [server.hostname]
return JSONResponse(content={
"server_id": server_id,
"server_name": server.name,
"is_cluster": is_cluster,
"node_count": len(nodes),
"nodes": [n.get('node') for n in nodes] if nodes else []
"node_count": len(node_names),
"nodes": node_names
})
except Exception as e:
logger.error(f"Error checking cluster info for server {server_id}: {e}")