Architektur
Eine klassische, bewusst schlichte Web-App: ein Django-Server, eine Datenbank, keine weiteren Dienste wie Redis oder Celery.
Browser
PC, Tablet, Handy im Heimnetz
HTTPS im Intranet
nginx
im Paket · Intranet-Hostname und TLS
HTTP auf localhost
Django
gunicorn (gthread), Django 5.2
- chat – Ansichten, Streaming (SSE)
- providers – ein Adapter je Anbieter geplant (M3–M4)
- mcp – Werkzeugschleife geplant (M4a)
Worker-Prozess
indexiert Dokumente, gleiche Datenbank
geplant (M7)
Django (und der Worker) verbinden sich mit:
- SQLPostgreSQL + pgvector Konten, Chats, Vektoren für RAG
- HTTPS ins InternetAnbieter-APIs OpenAI, Anthropic, Google, Mistral, OpenRouter … geplant (M3–M4)
- HTTP im IntranetLM Studio PC im Heimnetz, nur zeitweise online geplant (M4)
- WerkzeugaufrufeMCP-Server lokal (stdio) oder per Streamable HTTP geplant (M4a)
Die Bausteine
- Browser: Die Oberfläche besteht aus Django-Templates und etwas Vanilla-JavaScript. Alle Dateien werden vom eigenen Server geladen, ohne CDN und ohne Node-Buildschritt.
- nginx: gehört zum Debian-Paket und läuft auf demselben Rechner. Es sorgt für den Hostnamen im Heimnetz und TLS, leitet HTTP auf HTTPS um, liefert die statischen Dateien direkt aus und reicht gestreamte Antworten ungepuffert weiter. Für die Sprachfunktionen ist HTTPS Pflicht, weil Browser das Mikrofon sonst nicht freigeben. In Docker und in der Entwicklung liefert die App ihre statischen Dateien selbst aus (WhiteNoise).
- gunicorn und Django: gunicorn lauscht nur auf localhost (
127.0.0.1), mit der Worker-Klassegthread(Standard: 2 Prozesse × 8 Threads, Timeout 300 Sekunden), damit lange gestreamte Antworten andere Anfragen nicht blockieren. Antworten werden per Server-Sent Events gestreamt. - PostgreSQL mit pgvector: die einzige Datenbank – für Konten, Chats und die Vektoren der eigenen Dokumente. Kein SQLite.
- Worker: ein zweiter Prozess aus derselben Codebasis, der Dokumente im Hintergrund indexiert. Er holt seine Aufträge aus einer Tabelle in PostgreSQL und startet für mehrere Dokumente gleichzeitig weitere Prozesse.
- Anbieter-Adapter: eine gemeinsame Schnittstelle, darunter ein Adapter für
OpenAI-kompatible APIs (OpenAI, OpenRouter, LM Studio), einer für
Anthropic und einer für Google Gemini. Umgesetzt mit
httpxdirekt gegen die HTTP-APIs. - MCP-Client: verbindet sich über das offizielle Python-SDK mit MCP-Servern und reicht deren Werkzeuge an die Modelle weiter. Client, Verbindungstest und die Werkzeugschleife im Chat sind umgesetzt.
- MCP-Server (Knoten): Unter
/mcp/ist MultiGPT selbst ein MCP-Server für andere Programme, mit API-Keys je Konto. Er läuft in denselben gunicorn-Prozessen, ohne zusätzlichen Dienst.
Netz und Sicherheit
- Die App läuft nur im Heimnetz und ist aus dem Internet nicht erreichbar. Nach außen gehen nur HTTPS-Anfragen an die gewählten KI-Anbieter, im Heimnetz HTTP zu LM Studio.
- Alle Einstellungen kommen aus der Umgebung bzw. aus
/etc/multi-gpt/.env, nie aus dem Repository. - API-Keys und Zugangsdaten von MCP-Servern werden mit Fernet verschlüsselt in der Datenbank gespeichert und in der Verwaltung nur mit den letzten vier Zeichen angezeigt.
- Keys und Nachrichteninhalte erscheinen nicht in Logs.
- Der Dienst läuft unter einem eigenen Systemnutzer
multi-gptohne Zugriff auf andere Freigaben des Servers.
Technik
| Bereich | Wahl |
|---|---|
| Sprache | Python 3.12+ (Debian 13: 3.13) |
| Framework | Django 5.2 LTS |
| App-Server | gunicorn (gthread) |
| Datenbank | PostgreSQL mit pgvector |
| Webserver und TLS | nginx (im Debian-Paket) |
| Statische Dateien | nginx im Paket, WhiteNoise in Docker und Entwicklung |
| Login-Drosselung | django-axes |
| Paketierung | Debian-Paket mit dh-virtualenv, systemd; Docker als Ausweichweg |