🗄️ 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 secrets (databases, Redis, LLM keys, embeddings) live in command_center_tenant_server/config/passwords.yaml; auth secrets in command_center_server/config/passwords.yaml. Non-secret host/port settings live in the matching config/development.yaml (or staging / production). Keep passwords.yaml out of version control.

🗄️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 — die EU-DB-Hosts verwenden LUKS / AES-256-Volumenverschlüsselung im Ruhezustand.

  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

The Auth and Tenant servers must share an identical TENANT_JWT_SECRET (env var, or shared.tenantJwtSecret in passwords.yaml). The Auth server signs tenant JWTs with it and the Tenant server verifies them; if the two differ, every tenant API call returns 401. Use the same byte-for-byte value on both, even across different hosts.

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

Add the provider API keys you intend to use to the tenant server's passwords.yaml. Each provider has its own key (for example openaiApiKey); Ollama and Ollama Cloud take a base URL and model name rather than a secret key. The OpenAI key also powers image generation in workflows. There is no hardcoded default provider — availability is whatever an admin configures.

⚠️
Ollama Cloud URL

Ollama Cloud's host is api.ollama.com — the .ai domain does not resolve. Use the .com host in every config value.

Embedding-Modell — Wissen verankern

Knowledge answers are grounded with pgvector semantic search: uploaded documents and linked websites are chunked, embedded, and retrieved with citations. That requires an embedding model in addition to the chat LLMs. Configure an embedding provider key (for example an OpenAI embeddings key) in the tenant server's passwords.yaml.

⚠️
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

With datastores and AI keys in place, set up OAuth & Integrationen über Nango to connect the integration catalog, or jump to LiveKit-Setup for real-time video and voice.