🗄️ Infrastruktur

Kerndienste & Umgebung

Die Datenspeicher und KI-Anbieterschlüssel, die jedes Your Office AI-Deployment benötigt: zwei PostgreSQL-Datenbanken, Redis, S3-kompatibler Objektspeicher sowie die sechs LLM-Anbieter plus ein Embedding-Modell. Diese Seite beschreibt, was bereitzustellen ist und wohin jeder Wert genau gehört.

ℹ️
Eine Datei enthält die Geheimnisse

Tenant-Server-Geheimnisse (Datenbanken, Redis, LLM-Schlüssel, Embeddings) liegen in command_center_tenant_server/config/passwords.yaml; Auth-Geheimnisse in command_center_server/config/passwords.yaml. Nicht-geheime Host-/Port-Einstellungen liegen in der entsprechenden config/development.yaml (oder staging / production). Halten Sie passwords.yaml aus der Versionsverwaltung heraus.

🗄️DatenbankenAuth + Tenant
RedisPub/sub
📦ObjektspeicherMinIO / Supabase
🧠LLM + EmbeddingsSchlüssel + pgvector
Die Kerndatenspeicher- und KI-Schicht, in der Reihenfolge ihrer Einrichtung.

PostgreSQL — die beiden Datenbanken

Your Office AI ist eine Multi-Tenant-Plattform mit einem Zwei-Server-Backend, und jeder Server besitzt seine eigene Datenbank. Die Trennung ermöglicht es, Auth-Server (Identität) und Tenant-Server (organisations­spezifische Daten) unabhängig zu betreiben, zu skalieren und sogar von verschiedenen Parteien hosten zu lassen.

  1. Zwei PostgreSQL-Datenbanken bereitstellen

    Your Office AI betreibt zwei unabhängige Datenbanken: eine Auth-Datenbank für den Auth-Server (Benutzer, Organisationen, globale Einstellungen) und eine Tenant-Datenbank für den Tenant-Server (Chat, Wissen, Integrationen, LiveKit-Tokens). Für die lokale Entwicklung laufen beide in Docker über die jeweilige docker-compose.yaml. Für die Produktion nutzen Sie verwaltetes Postgres — Supabase, AWS RDS oder Cloud SQL.

  2. Verbindungsdaten notieren

    Notieren Sie für jede Datenbank Host, Port, Datenbankname, Benutzer und Passwort. In einem Supabase-Projekt finden Sie diese unter Settings → Database → Connection string. Wählen Sie die Region, die Ihren Nutzern am nächsten liegt — verwaltete Anbieter verschlüsseln Volumes im Ruhezustand in der Regel standardmäßig, bestätigen Sie die Details jedoch bei Ihrem Anbieter.

  3. Passwort und Host/Port festlegen

    Tragen Sie jedes Passwort in die config/passwords.yaml des entsprechenden Servers unter der richtigen Umgebung (development.database) ein und Host/Port/Name in config/development.yaml (oder staging / production). Die Auth-Werte liegen in command_center_server; die Tenant-Werte in command_center_tenant_server.

  4. Migrationen anwenden

    Führen Sie die Migrationen für beide Datenbanken aus (vom Repository-Stammverzeichnis: make both-migrate). Dabei wird auch die PostgreSQL-Vektorer­weiterung aktiviert, die Knowledge für die pgvector-Semantiksuche verwendet. Laden Sie Testdaten mit make both-seed, wenn Sie eine befüllte Umgebung wünschen.

Wohin die Werte gehören

WertDateiSchlüssel
Auth-DB-Passwortcommand_center_server/config/passwords.yamldevelopment.database
Auth-DB-Host / Port / Namecommand_center_server/config/development.yamldatabase.host / .port / .name
Tenant-DB-Passwortcommand_center_tenant_server/config/passwords.yamldevelopment.database
Tenant-DB-Host / Port / Namecommand_center_tenant_server/config/development.yamldatabase.host / .port / .name
⚠️
Gemeinsames JWT-Geheimnis

Auth- und Tenant-Server müssen ein identisches TENANT_JWT_SECRET teilen (Umgebungsvariable oder shared.tenantJwtSecret in passwords.yaml). Der Auth-Server signiert Tenant-JWTs damit, der Tenant-Server verifiziert sie; stimmen die Werte nicht überein, gibt jeder Tenant-API-Aufruf 401 zurück. Verwenden Sie auf beiden Seiten denselben Wert Byte für Byte, auch über verschiedene Hosts hinweg.

Redis — Echtzeit-Pub/sub

Redis unterstützt die Echtzeit-Streams von Serverpod auf dem Tenant-Server. Es ist auch das Rückgrat der horizontalen Skalierung: Mit Redis als gemeinsamem Nachrichtenbus kann jede Replika ein Ereignis senden, das alle anderen Replikas empfangen.

  1. Redis bereitstellen

    Der Tenant-Server verwendet Redis für die Echtzeit-Streams von Serverpod (Pub/sub). Lokal ist es in docker-compose.yaml enthalten. Für die Produktion nutzen Sie ein verwaltetes Redis — ElastiCache, Upstash oder Redis Cloud.

  2. Passwort und Host/Port festlegen

    Tragen Sie das Redis-Passwort in config/passwords.yaml ein (development.redis) und Host/Port in config/development.yaml unter redis:. Der Auth-Server verfügt über einen eigenen Redis-Container mit demselben Schlüssellayout.

  3. Erforderlich beim Skalieren

    Eine einzelne Instanz kann ohne Redis betrieben werden, aber Pub/sub ist obligatorisch, sobald mehr als eine Tenant-Server-Replika läuft — so teilen Replikas Ereignisse miteinander. Lesen Sie die Anleitung zur Multi-Instanz-Bereitstellung.

WertDateiSchlüssel
Tenant-Redis-Passwortcommand_center_tenant_server/config/passwords.yamldevelopment.redis
Tenant-Redis-Host / Portcommand_center_tenant_server/config/development.yamlredis.host / redis.port

Objektspeicher

Uploads, Wissensdokumente und Avatare liegen im S3-kompatiblen Objektspeicher. Selbst gehostete Deployments verwenden typischerweise MinIO; verwaltete Deployments nutzen Supabase Storage. Dokument-Downloads sind server-vermittelt — die App holt Bytes über den Tenant-Server statt eine Speicher-URL direkt freizugeben — daher müssen private Buckets nie öffentlich sein.

  1. Einen S3-kompatiblen Speicher wählen

    Datei-Uploads, Wissensdokumente und Avatare werden im Objektspeicher abgelegt. Selbst gehostete Deployments verwenden MinIO (S3-kompatibel, kostenlos, lokales Docker); verwaltete Deployments nutzen Supabase Storage. Beides funktioniert — die App spricht die S3-API.

  2. Buckets erstellen

    Erstellen Sie die Buckets, die die App verwendet (z. B. uploads und avatars). Markieren Sie in Supabase Storage Avatar-artige Buckets als öffentlich und halten Sie Upload-Buckets privat.

  3. Zugriffsrichtlinien festlegen

    Fügen Sie für Supabase Storage Row-Level-Security-Richtlinien hinzu, damit authentifizierte Benutzer nur ihren eigenen Ordner lesen und schreiben können (Pfad mit ihrer Benutzer-ID präfixiert), mit öffentlichem Lesezugriff auf Avatar-Buckets. Downloads von Wissensdokumenten sind server-vermittelt, daher benötigen private Buckets keine öffentliche URL.

💡
MinIO ist kostenlos und lokal

Für die Entwicklung und luftdicht isoliertes Self-Hosting läuft MinIO kostenlos in Docker und spricht dieselbe S3-API wie Cloud-Speicher. Nutzen Sie verwalteten Supabase Storage für Deployments, die einen gehosteten Bucket wünschen.

LLM-Anbieter — sechs in einer Organisation

Your Office AI ist anbieterunabhängig. Eine einzelne Organisation kann sechs KI-Anbieter anbieten, und Administratoren entscheiden, welche Modelle verfügbar sind, und legen Ausgabenlimits pro Organisation fest. Gehostete Modelle kommen von OpenAI, Anthropic, Google und Groq; private und lokale Inferenz läuft über Ollama und Ollama Cloud.

AnbieterTypBeispielmodell
OpenAIGehostetgpt-4o-mini
AnthropicGehostetclaude-sonnet-4-5
GoogleGehostetgemini-2.0-flash
GroqGehostet (schnelle Inferenz)Llama / Mixtral family
OllamaLokal / privatllama3.2
Ollama CloudGehostetes Ollamagpt-oss:120b

Fügen Sie die API-Schlüssel der Anbieter, die Sie verwenden möchten, in die passwords.yaml des Tenant-Servers ein. Jeder Anbieter hat seinen eigenen Schlüssel (z. B. openaiApiKey); Ollama und Ollama Cloud erhalten eine Basis-URL und einen Modellnamen statt eines Geheimschlüssels. Der OpenAI-Schlüssel treibt auch die Bildgenerierung in Workflows an. Es gibt keinen fest programmierten Standard-Anbieter — die Verfügbarkeit richtet sich danach, was ein Administrator konfiguriert.

⚠️
Ollama Cloud URL

Der Host von Ollama Cloud ist api.ollama.com — die Domain .ai lässt sich nicht auflösen. Verwenden Sie den Host .com in allen Konfigurationswerten.

Embedding-Modell — Wissen verankern

Wissensantworten werden durch pgvector-Semantiksuche verankert: hochgeladene Dokumente und verknüpfte Websites werden aufgeteilt, eingebettet und mit Quellenangaben abgerufen. Dafür ist zusätzlich zu den Chat-LLMs ein Embedding-Modell erforderlich. Konfigurieren Sie einen Embedding-Anbieterschlüssel (z. B. einen OpenAI-Embeddings-Schlüssel) in der passwords.yaml des Tenant-Servers.

⚠️
Embedding-Anbieter nicht mischen

Die pgvector-Spalte hat eine feste Dimension, die zu Ihrem Embedding-Modell passen muss (z. B. 1536 für OpenAI). Wählen Sie einen Embedding-Anbieter und bleiben Sie dabei — ein Anbieterwechsel ändert die Vektordimension und macht gespeicherte Embeddings ungültig. Die Plattform führt absichtlich kein automatisches Failover zwischen Embedding-Anbietern durch.

Umgebungsübersicht

Wo die Kernwerte auf einen Blick liegen:

BereichServerDatei
Auth-Datenbank, E-MailAuth-Servercommand_center_server/config/passwords.yaml
Tenant-Datenbank, Redis, LiveKit, LLM- + Embedding-Schlüssel, NangoTenant-Servercommand_center_tenant_server/config/passwords.yaml
Host / Port / nicht-geheime EinstellungenBeideconfig/development.yaml (or staging / production)
Speicher-URL + Anon-SchlüsselFlutter-Appcommand_center_flutter Supabase init
ℹ️
Weiter

Wenn Datenspeicher und KI-Schlüssel eingerichtet sind, konfigurieren Sie OAuth & Integrationen über Nango, um den Integrationskatalog zu verbinden, oder springen Sie zu LiveKit-Setup für Echtzeit-Video und Sprache.