Betrieb
Hosting, Konfiguration, Größen-Limits, Timeouts, Caching und Fehlerverhalten des GovBridge-Dienstes.
GovBridge läuft als schlanker, zustandsloser Node-Dienst — betrieben von eNetworkers, strikt EU-gehostet.
Hosting
| Aspekt | Wert |
|---|---|
| Plattform | Railway |
| Region | europe-west4 (Amsterdam, EU) |
| Öffentliche URL | https://govbridge.sovrgpt.com |
| Health-Check | GET /healthz → 200 {"status":"ok","protocols":["cmis","fit-connect"]} |
| Image | privates GHCR-Image, Pull über Registry-Credentials |
| TLS | Let's-Encrypt-Zertifikat, automatisch ausgestellt |
Der Dienst skaliert horizontal: Da der Dispatcher stateless ist (jeder Request trägt seinen eigenen aufgelösten Mandantenkontext), können mehrere Instanzen ohne geteilten Sitzungszustand laufen.
Konfiguration (Umgebungsvariablen)
| Variable | Default | Zweck |
|---|---|---|
PORT | 8080 | HTTP-Listen-Port. |
SUPABASE_URL | — (Pflicht) | Supabase-Projekt-URL (Endpunkt-Lookup). |
SUPABASE_SERVICE_ROLE_KEY | — (Pflicht) | Service-Role-Key für den Endpunkt-Lookup. |
GOVBRIDGE_ENCRYPTION_KEY | — (Pflicht) | 32-Byte-base64-AES-Schlüssel. |
GOVBRIDGE_PROTOCOLS | cmis | Komma-Liste der bedienten Protokolle. |
BACKEND_TIMEOUT_MS | 15000 | Hartes Timeout pro DMS-HTTP-Call. |
LOG_LEVEL | info | error / warn / info / debug. |
SENTRY_DSN | — (optional) | Error-Monitoring (Region DE). |
Größen-Limits
Mehrere harte Grenzen schützen Speicher und Antwortzeit:
| Grenze | Wert | Wo |
|---|---|---|
| JSON-RPC-Request-Body | 1 MB | Transport (Einzelaufruf oder Batch) |
Inline-Text (cmis_dokument_holen) | 32 KB | content.ts (MAX_TEXT_BYTES) |
| Inline-Binär (base64) | 5 MB | content.ts (MAX_INLINE_BYTES) |
| CMIS-JSON-Antwort | 4 MB | cmis/client.ts (MAX_JSON_BYTES) |
| FIT-Connect-JSON-Antwort | 1 MB | fit-connect/client.ts (MAX_JSON_BYTES) |
FIT-Connect-Antragsdaten (fit_antrag_senden) | 5 MB | fit-connect/index.ts (MAX_INLINE_BYTES) |
| FIT-Connect-Anhänge | max. 10 Stück, je 5 MB | fit-connect/index.ts (MAX_ATTACHMENTS, MAX_INLINE_BYTES) |
| OAuth-Token-Antwort | 64 KB | backend-auth.ts |
Inhalts-Policy bei cmis_dokument_holen
- Text ≤ 32 KB → inline als Text-Ressource.
- Allowlist-Binärtyp ≤ 5 MB (PDF, DOC/DOCX, XLS/XLSX, PNG, JPEG) → base64-Blob.
- Alles Größere / nicht gelistete MIME-Typen → nur Referenz
(
cmis://<objectId>) plus Metadaten, ohne Bytes.
Timeouts & Caching
- Hartes Upstream-Timeout (
BACKEND_TIMEOUT_MS, Default 15 s) überAbortController— ein hängendes Backend blockiert nie den Chat-Turn. - OAuth-Backend-Token wird pro Endpunkt im Prozess-RAM gecacht und 30 s vor
Ablauf erneuert (
SAFETY_WINDOW_MS). - CMIS-Repository-Service-Dokument wird 5 Minuten gecacht (
REPO_TTL_MS), um einen Round-Trip pro Call zu sparen. - Fachinhalte werden nie gecacht — jeder Call zieht live aus dem DMS.
Fehlerverhalten
Fehler werden in deutschsprachige, modell-sichtbare Meldungen übersetzt und
als Tool-Ergebnis mit isError: true zurückgegeben (nicht als Protokollabbruch),
damit der Assistent reagieren kann statt den Turn abzubrechen:
| Ursache | Modell-sichtbare Meldung |
|---|---|
| Backend-Timeout | „Das Fachverfahren hat nicht rechtzeitig geantwortet (Timeout)." |
| Backend-HTTP-/Netzwerkfehler | „Fehler beim Zugriff auf das Fachverfahren: …" |
| Fehlender Parameter | „Parameter 'name' fehlt." |
| Schreibzugriff gesperrt | „Schreibzugriff ist für diesen Endpoint nicht freigegeben." |
| Unbekanntes Werkzeug | „Unbekanntes Tool: name" |
Auf Transportebene gilt: ungültige Route/Methode → 404/405,
fehlgeschlagene Mandantenauflösung → generisches 401, reine Notifications
→ 202 ohne Body.
Verfügbarkeitsprüfung
curl -s https://govbridge.sovrgpt.com/healthz
# → {"status":"ok","protocols":["cmis"]}Ein vollständiger MCP-initialize-Handshake gegen einen konkreten Endpunkt ist
in der Einrichtung beschrieben.