2 Backend
Claude edited this page 2026-06-29 21:37:15 +00:00

Backend

FastAPI + SQLAlchemy async + PostgreSQL. Entry: server/main.py.

Struktur

Pfad Inhalt
main.py App, WebSocket- + Install-Endpoints (/install/{token}, /vm-install/{token}, /vm-agent-binary/{arch})
database.py AsyncSession, get_db, init_db (create_all + Legacy-DDL + Alembic upgrade)
scheduler.py asyncio Background-Scheduler
rate_limit.py Rate-Limiting
auth/ jwt.py, rbac.py, local.py
routers/ ein Router pro Domäne (siehe unten)
websocket/ manager.py (AgentManager), agent_ws.py (Endpoint)
tunneling/ Reverse-Tunnel-Manager
guaclite/ schlanker Guacamole-Client (RDP/VNC)
services/ Service-Layer
settings/ settings_router.py, JSONB-Config in DB
migrations/ Alembic (ab 0001_baseline)
models/ ORM-Modelle

Router (server/routers/)

admin, audit, auth, backup, command, deploy, docker, log, me, monitor, net, notification, rdp, schedule, security, temperature, template, tunnel, update, upgrade.

Neuer Router → in server/main.py einbinden.

Models (server/models/)

audit_log, backup_log, bulk_run, command, command_log, log_entry, log_settings, log_source, metric, node, notification_log, scheduled_job, security, settings, temperature_metric, tenant, tunnel_session, update_log, user, vm_auth_setting, vm_docker_config, vm_note, vm_template.

Neues Model → in server/models/__init__.py exportieren.

Migrationen (Alembic)

Ab 2026-05-26 via Alembic (server/migrations/). 0001_baseline ist no-op (wird auto-gestamped, wenn Legacy-DB ohne alembic_version, aber mit tenants-Tabelle erkannt). init_db() führt create_all + Legacy-DDL aus, dann alembic upgrade head via asyncio.to_thread.

Auth

Dependencies aus auth/rbac.py: require_superadmin, require_read(), require_write(), require_role(min) (Compat-Shim), get_current_user. JWT als httpOnly Cookie (auth/jwt.py). Lokaler Admin-Fallback (auth/local.py).

Rebuild-Pflicht: nach jeder Änderung in server/ cd server && docker-compose up -d --build — kein Bind-Mount.