Betrieb
GovBridge im Betrieb: Hosting in den Niederlanden, Umgebungsvariablen, Größen-Limits, Timeouts, Caching und die Fehlermeldungen des Adapters.
GovBridge ist ein schlanker, zustandsloser Node-Dienst. Die rooom AG betreibt ihn in einem Rechenzentrum in den Niederlanden.
Hosting
| Aspekt | Wert |
|---|---|
| Hosting-Anbieter | Railway (Sitz in den USA) |
| Region | europe-west4 (Niederlande) |
| Öffentliche URL | https://govbridge.sovrgpt.com |
| Health-Check | GET /healthz → 200 {"status":"ok","protocols":["cmis","fit-connect"]} (bediente Protokolle) |
| Image | privates GHCR-Image, Pull über Registry-Zugangsdaten |
| TLS | Let's-Encrypt-Zertifikat, automatisch ausgestellt |
Der Dispatcher ist zustandslos; mehrere Instanzen können parallel 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
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 und nicht gelistete MIME-Typen → nur eine Referenz
(
cmis://<objectId>) mit Metadaten, ohne Bytes.
Timeouts & Caching
- Hartes Upstream-Timeout (
BACKEND_TIMEOUT_MS, Default 15 s) überAbortController: Ein hängendes Backend blockiert den Chat nicht. - Das OAuth-Token des Backends liegt je Endpunkt im Prozess-RAM und wird 30 s vor
Ablauf erneuert (
SAFETY_WINDOW_MS). - Das CMIS-Repository-Service-Dokument bleibt 5 Minuten im Cache (
REPO_TTL_MS); das spart einen Round-Trip pro Aufruf. - Fachinhalte cacht der Adapter nie. Jeder Aufruf liest live aus dem DMS.
Fehlerverhalten
Fehler kommen als Meldung im Tool-Ergebnis zurück (isError: true), nicht als
Protokollabbruch. So kann das Modell darauf reagieren.
| Ursache | Meldung an das Modell |
|---|---|
| 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 oder 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","fit-connect"]}Den initialize-Handshake gegen einen konkreten Endpunkt beschreibt die
Einrichtung.