Inhalt
  1. Voraussetzungen
  2. Azure-Bot-Registrierung
  3. Download & Authentifizierung
  4. Secrets generieren
  5. Umgebung konfigurieren
  6. Bereitstellung
  7. Teams-App Sideloading
  8. Installation prüfen
  9. Optionale Integrationen
  10. Fehlerbehebung

1 Voraussetzungen

Hardware-Anforderungen

KomponenteMinimum (Dev / Eval)Empfohlen (Produktion)
CPU4 Kerne8+ Kerne
RAM16 GB32 GB
Speicher50 GB SSD100 GB SSD
GPU (für lokales LLM)NVIDIA GPU, 16 GB VRAMNVIDIA GPU, 24+ GB VRAM

Die GPU wird für das lokale LLM benötigt (Ollama mit qwen3:14b). Alternativ kann eine entfernte Ollama-Instanz oder ein Cloud-LLM-Anbieter verwendet werden.

Produktions-Skalierung

LLM-Inferenz ist der primäre Engpass. Eine einzelne Anfrage dauert ~20 Sekunden (4 Agent-Schritte, 1 Tool-Aufruf). Ollama serialisiert GPU-Anfragen — bei gleichzeitigen Nutzern steigt die Latenz linear.

TeamgrößeLLM-BackendGPUHinweise
1–3 NutzerOllama16 GB VRAM (z. B. RTX 5070 Ti)Ausreichend für Evaluierung und kleine Teams. Sequenzielle Verarbeitung.
5–20 NutzervLLM24+ GB VRAM (z. B. RTX 5090)Batched Inference ermöglicht gleichzeitige Anfragen. Deutlich höherer Durchsatz als Ollama.
20+ NutzervLLM oder Cloud-LLM48+ GB VRAM oder Multi-GPUFür große Teams Cloud-LLM-Anbieter (OpenAI, Anthropic) in Betracht ziehen, um GPU-Infrastruktur-Komplexität zu vermeiden.

Warum vLLM für Produktion? Ollama verarbeitet Anfragen sequenziell — bei 5 gleichzeitigen Nutzern überschreiten Antwortzeiten 2 Minuten und Anfragen beginnen mit Timeouts. vLLM nutzt Continuous Batching und PagedAttention, um mehrere Anfragen gleichzeitig zu bedienen, benötigt aber mindestens 24 GB VRAM für den KV-Cache-Spielraum von qwen3:14b.

Um vLLM zu aktivieren, setzen Sie diese Umgebungsvariablen:

REVA_VLLM_URL=http://gpu-server:8100/v1
REVA_VLLM_API_KEY=beliebiger-string

Das Ollama-Router-Modell (llama3.2:3b) muss auf einer separaten Ollama-Instanz verbleiben, um GPU-Konflikte zu vermeiden. Details siehe src/reva/vllm_client.py.

Empfohlene Modelle

Reva benötigt Modelle mit starken Tool-Calling-Fähigkeiten (Function Calling) und Mehrsprachigkeit. Nicht alle Modelle liefern gleich gute Ergebnisse — folgende Empfehlungen basieren auf umfangreichen Tests mit Revas Agent-Loop:

ModellGrößeBewertungHinweise
qwen3:14b14BBeste WahlHervorragendes Tool-Calling, zuverlässiges Ausgabeformat, starke Mehrsprachigkeit (DE/EN/FR/ES/NL). Standard-Agent-Modell.
qwen3:32b32BAusgezeichnetNoch bessere Qualität, erfordert aber 24+ GB VRAM und ist langsamer. Gut für vLLM-Deployments.
gemma3:27b27BGutGutes Tool-Calling, aber gelegentliche Formatierungsinkonsistenzen bei strukturierter Ausgabe.
llama3.3:70b70BGutStarke Gesamtleistung, erfordert erhebliche GPU-Ressourcen. Besser für Cloud-/Multi-GPU-Setups.
mistral-small3.224BMittelNutzbar, aber weniger zuverlässiges Tool-Calling im Vergleich zu Qwen3.
qwen2.5-coder:32b32BMittelGute Qualität, aber zu langsam für interaktive Nutzung auf einer einzelnen GPU.

Cloud-LLM-Modelle: Bei Verwendung von OpenAI oder Anthropic liefern Modelle wie gpt-4o oder claude-sonnet-4-5-20250514 hervorragende Ergebnisse. Cloud-Modelle eliminieren GPU-Anforderungen vollständig und skalieren für jede Teamgröße.

Das Router-Modell (llama3.2:3b) klassifiziert eingehende Nachrichten und benötigt keine Tool-Calling-Fähigkeiten. Es läuft auf Ollama, unabhängig vom Agent-Modell-Backend.

Software-Anforderungen

EntwicklungTest / Abnahme / Produktion
LaufzeitDocker Engine 24+ & Docker Compose v2k3s (Lightweight Kubernetes)
BuildDocker (baut lokal)Docker (für Image-Build) + kubectl
LLMOllama (lokal oder remote) — oder ein Cloud-LLM-API-Key
RegistryZugang zu ghcr.io/x-idra-systems-gmbh/reva (Zugangsdaten von X-idra)

Netzwerk-Anforderungen

2 Azure-Bot-Registrierung

Reva kommuniziert mit Microsoft Teams über das Azure Bot Framework.

2.1 App-Registrierung erstellen

  1. Azure PortalMicrosoft Entra IDApp-RegistrierungenNeue Registrierung
  2. Name: Reva, Kontotyp: Einzelmandant
  3. Zertifikate & GeheimnisseNeuer geheimer Clientschlüssel
  4. Geheimniswert sofort kopieren — er wird nur einmal angezeigt

Notieren Sie: Anwendungs-ID, Verzeichnis-ID (Mandanten-ID) und das Clientgeheimnis.

2.2 Azure-Bot-Ressource erstellen

  1. Azure BotErstellen, Tarif: F0, App-Typ: Einzelmandant
  2. Vorhandene App-Registrierung verwenden → App-ID eingeben
  3. Datenresidenz: Lokal (westeurope)

2.3 Messaging-Endpunkt

https://ihre-domain.example.com/api/messages

2.4 Teams-Kanal aktivieren

KanäleMicrosoft Teams (Commercial) → Übernehmen

3 Download & Authentifizierung

3.1 Deployment-Paket entpacken

Laden Sie das von X-idra bereitgestellte Deployment-Paket herunter und entpacken Sie es:

tar xzf reva-1.0.4.tar.gz
cd reva-1.0.4

3.2 Container-Registry authentifizieren

Melden Sie sich mit den von X-idra bereitgestellten Zugangsdaten an der GitHub Container Registry an:

echo "$GHCR_TOKEN" | docker login ghcr.io -u "$GHCR_USER" --password-stdin

3.3 Reva-Image herunterladen

docker compose pull

Pinnen Sie die Version in Ihrer .env-Datei: REVA_VERSION=1.0.4. Die docker-compose.yml verwendet diese Variable für den Image-Tag.

4 Secrets generieren

Alle sensiblen Zugangsdaten werden als Dateien in secrets/ gespeichert. Sowohl Docker Compose als auch Kubernetes verwenden dieselben Dateien.

./bin/generate-secrets.sh

Das Skript generiert automatisch ein PostgreSQL-Passwort, ein Admin-Passwort, SSL-Zertifikate (selbstsignierte CA + Server-Zertifikat), einen Webhook-Secret und eine Datenbank-URL. Anschließend werden interaktive Eingaben für externe Zugangsdaten abgefragt:

Secret-DateiBeschreibungQuelle
reva_microsoft_app_passwordAzure-App-ClientgeheimnisSchritt 2.1
reva_release_passwordDigital.ai Release PasswortRelease-Admin (Basic Auth)
reva_release_tokenDigital.ai Release API-TokenRelease-Admin (Token Auth)
reva_ldap_bind_passwordLDAP-Bind-PasswortLDAP-Administrator
reva_jira_tokenJira Cloud API-TokenAtlassian API-Tokens

5 Umgebung konfigurieren

cp .env.example .env

Erforderliche Einstellungen

VariableBeschreibungBeispiel
OLLAMA_URLOllama-API-Endpunkthttp://localhost:11434
REVA_MICROSOFT_APP_IDAzure-App-IDd57d6dd5-4399-...
REVA_MICROSOFT_APP_TENANT_IDAzure-Mandanten-ID847e08d2-a338-...
REVA_RELEASE_BASE_URLDigital.ai Release API-URLhttp://release:5516
REVA_RELEASE_AUTH_TYPEbasic oder tokentoken

LLM-Modell-Setup

ollama pull llama3.2:3b     # Router (schnell, klein)
ollama pull qwen3:14b       # Agent (Tool-Calling, mehrsprachig)
ollama pull nomic-embed-text  # Embeddings (für sitzungsübergreifendes Gedächtnis)

Setzen Sie AGENT_MODEL nicht in der .env. Das Agent-Modell wird in config/agent_roles.yaml konfiguriert.

Cloud-LLM-Anbieter (Alternative)

REVA_OPENAI_API_KEY=sk-...          # OpenAI
REVA_ANTHROPIC_API_KEY=sk-ant-...   # Anthropic Claude

6 Bereitstellung

Wählen Sie Ihre Zielumgebung:

Docker Compose (Entwicklung & Evaluierung)

Der schnellste Weg, Reva zum Laufen zu bringen. MCP-Server werden als Docker-Container über den Docker-Socket gestartet.

docker compose up -d

Pinnen Sie die Version in Ihrer .env-Datei: REVA_VERSION=1.0.4

Docker Compose ├─ reva (Python-App) → :3978 → :8000 │ └─ startet MCP-Container über Docker-Socket │ ├─ release-mcp (stdio) │ └─ jira-mcp (stdio) ├─ postgres (pgvector:pg16) → :5432 (SSL) │ ├─ Admin: postgres (Superuser) │ └─ App: reva (eingeschränkt) └─ redis (redis:7-alpine) → :6379
docker compose ps    # Alle Services sollten "Up (healthy)" zeigen

Docker Compose bindet den Docker-Socket (/var/run/docker.sock) ein, um MCP-Server-Container zu starten. Dieser Ansatz ist einfach, aber für Produktions-Kubernetes nicht geeignet.

Reverse Proxy (TLS)

backend reva
    server reva 127.0.0.1:3978 check

Datenbank-Backup

./bin/backup-db.sh                                    # Manuell
0 2 * * * /pfad/zu/reva/bin/backup-db.sh              # Crontab

Kubernetes (Test / Abnahme / Produktion)

Produktionsreife Bereitstellung auf k3s. MCP-Server laufen als Sidecar-Container im selben Pod mit SSE-Transport — kein Docker-Socket erforderlich.

6.1 k3s installieren

# k3s installieren (Single-Node, inkl. Traefik Ingress)
curl -sfL https://get.k3s.io | sh -

# Kubeconfig einrichten
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config

kubectl get nodes

k3s benötigt nur ~512 MB RAM Overhead und bringt Traefik als Standard-Ingress-Controller mit.

6.2 Mit Deploy-Skript bereitstellen

# Vollständiges Deployment
./bin/k8s-deploy.sh

# Oder schrittweise:
./bin/k8s-deploy.sh --build-only    # Image bauen und importieren
./bin/k8s-deploy.sh --secrets       # Kubernetes-Secrets erstellen
./bin/k8s-deploy.sh --apply-only    # Nur Manifeste anwenden

Architektur

Kubernetes (k3s) ├─ Namespace: reva │ ├─ Deployment: reva (1 Pod, 3 Container) │ │ ├─ reva (Haupt-App) → :8000 │ │ ├─ release-mcp (Sidecar) → :8080 (SSE, localhost) │ │ └─ jira-mcp (Sidecar) → :8081 (SSE, localhost) │ ├─ StatefulSet: postgres (10 Gi PVC, SSL) │ │ ├─ Admin: postgres (Superuser) │ │ └─ App: reva (eingeschränkt) │ ├─ Deployment: redis │ ├─ Ingress: Traefik → reva:8000 (TLS) │ ├─ NetworkPolicies (Default-Deny + Erlaubnisregeln) │ └─ CronJob: db-backup (täglich 02:00 UTC) └─ TLS: terminiert bei Traefik (websecure Entrypoint)

Sicherheitshärtung: Sowohl Docker-Compose- als auch Kubernetes-Deployments beinhalten PostgreSQL-Benutzereinschränkung (App-Benutzer ohne Superuser-Rechte), PostgreSQL-SSL-Verschlüsselung und Secrets-Management über Docker-Secrets / K8s-Secrets. Siehe docs/security-hardening.md für die vollständige Härtungsanleitung.

Hauptunterschied zu Docker Compose: MCP-Server laufen als Sidecar-Container im selben Pod und kommunizieren über SSE auf localhost statt Docker-stdio.

6.3 Deployment prüfen

kubectl get pods -n reva

# Erwartet: 3/3 READY für reva, 1/1 für postgres und redis

6.4 Betrieb

# Logs anzeigen
kubectl logs -n reva -l app=reva -c reva -f           # App
kubectl logs -n reva -l app=reva -c release-mcp -f    # Release MCP
kubectl logs -n reva -l app=reva -c jira-mcp -f       # Jira MCP

# Neustart
kubectl rollout restart deployment/reva -n reva

# Manuelles Datenbank-Backup
kubectl create job --from=cronjob/db-backup db-backup-manual -n reva

# Rollback auf vorherige Version
kubectl rollout undo deployment/reva -n reva

6.5 Ingress & TLS

TLS ist standardmäßig über den Traefik-websecure-Entrypoint aktiviert. Das Ingress-Manifest leitet HTTP automatisch auf HTTPS um.

# Selbstsigniertes TLS-Zertifikat generieren
./bin/generate-k8s-tls.sh

# Oder cert-manager für Produktion
# cert-manager.io/cluster-issuer: letsencrypt-prod

7 Teams-App Sideloading

7.1 App-Paket vorbereiten

Führen Sie das Manifest-Konfigurationsskript aus. Es fragt nach Ihrer Azure App ID und Bot-Endpunkt-Domain und erstellt das Teams-App-Paket:

./bin/configure-manifest.sh

Sie müssen nur zwei Werte angeben:

Der Entwickler-Abschnitt (Firmenname, URLs) bleibt X-idra Systems GmbH.

Manuelle Alternative: appPackage/manifest.json direkt bearbeiten — {{AZURE_APP_ID}} und {{BOT_DOMAIN}} ersetzen, dann: cd appPackage && zip ../reva-teams-app.zip manifest.json color.png outline.png

7.2 Benutzerdefinierte Apps aktivieren

Teams Admin CenterEinrichtungsrichtlinienBenutzerdefinierte Apps hochladen aktivieren.

7.3 App sideloaden

  1. TeamsAppsApps verwaltenApp hochladen
  2. Benutzerdefinierte App hochladenreva-teams-app.zip
  3. Hinzufügen

8 Installation prüfen

Health Check

curl http://localhost:3978/api/health
kubectl exec -n reva deploy/reva -c reva -- \
  python -c "import urllib.request; print(urllib.request.urlopen('http://localhost:8000/api/health').read().decode())"

Erwartete Antwort:

{
  "status": "ok",
  "adapter_initialized": true,
  "db": true,
  "mcp": {
    "release": { "connected": true, "tools": 38 },
    "jira": { "connected": true, "tools": 29 }
  }
}

Funktionstest

  1. „Hallo“ — Reva sollte Sie begrüßen
  2. „Zeige alle aktiven Releases“ — Ergebnisse aus Release
  3. „Mein Dashboard“ — persönliche Release-Übersicht

9 Optionale Integrationen

Jira Cloud

REVA_JIRA_URL=https://ihrorg.atlassian.net
REVA_JIRA_USERNAME=ihre-email@firma.com

LDAP-Gruppenauflösung

REVA_LDAP_URL=ldap://ldap.firma.de:389
REVA_LDAP_BIND_DN=cn=reva,ou=services,dc=firma,dc=de
REVA_LDAP_GROUP_BASE=ou=groups,dc=firma,dc=de

Release-Webhook-Benachrichtigungen

Kopieren Sie plugins/xlr-reva-notify-plugin-1.0.4.jar in das Plugin-Verzeichnis Ihres Digital.ai Release Servers und starten Sie Release neu. Webhook-Ziel konfigurieren:

https://ihre-domain.example.com/api/notify

Autonome Überwachung

REVA_MONITOR_ENABLED=true
REVA_MONITOR_INTERVAL=300
REVA_MONITOR_OVERDUE_THRESHOLD_HOURS=24
REVA_MONITOR_STALE_APPROVAL_HOURS=48

Benutzer-Autorisierung

REVA_AUTH_ENABLED=true
REVA_AUTH_USER_MAP=Name1=releaseUser1,Name2=releaseUser2

Sitzungsübergreifendes Gedächtnis

Reva kann Benutzerpräferenzen und Kontext über Gespräche hinweg speichern. Erinnerungen werden pro Benutzer mit semantischer Deduplizierung und automatischer Bereinigung gespeichert.

MEMORY_ENABLED=true
MEMORY_EXTRACTION_ENABLED=true

Benötigt das Embedding-Modell nomic-embed-text und pgvector (im Standard-PostgreSQL-Image enthalten).

DSGVO: Benutzer können zeige Erinnerungen eingeben, um gespeicherte Erinnerungen anzuzeigen, und vergiss Erinnerungen, um alle zu löschen. Erinnerungen werden mit Audit-Trail soft-deleted.

10 Fehlerbehebung

Image kann nicht geladen werden

Falls docker compose pull mit einem Authentifizierungsfehler fehlschlägt:

Health Check gibt 503 zurück

docker compose logs reva | grep -i "mcp\|error"
kubectl logs -n reva -l app=reva -c reva | grep -i "mcp\|error"
kubectl logs -n reva -l app=reva -c release-mcp
kubectl logs -n reva -l app=reva -c jira-mcp

Teams-Nachrichten kommen nicht an

MCP-Container starten nicht (Docker Compose)

docker ps
docker pull xebialabsearlyaccess/dai-release-mcp:25.3.1-beta.212
docker pull ghcr.io/sooperset/mcp-atlassian:0.21.0

MCP-Sidecars nicht bereit (Kubernetes)

kubectl describe pod -n reva -l app=reva
kubectl get configmap -n reva

LLM-Antworten sind langsam

Hilfe

info@x-idra.de

Nächste Schritte

Installation abgeschlossen? So geht es weiter:

Diese Website verwendet keine Cookies und keine Tracking-Technologien. Schriftarten werden lokal bereitgestellt; es werden keine Daten an Dritte übermittelt. Details finden Sie in unserer Datenschutzerklärung.