Table of Contents
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.