Zum Inhalt springen

CompanyWizard Web per Docker Compose betreiben (Site)

Admin

Der Web-Modus von CompanyWizard läuft als ein Container (ASP.NET-API + Blazor-WASM-Oberfläche) neben einer Qdrant-Vektordatenbank — ausgelegt für bis zu 100 Nutzer pro Deployment. Diese Anleitung zeigt Site-Kunden, wie sie den Stack selbst per docker compose in Betrieb nehmen und die Site-Lizenz aktivieren. Der serverseitige API-/Web-Betrieb ist ein Site-Feature → Lizenz- & Editionsmodell.

  • Ein Container: API + Weboberfläche im Image evantomedia/companywizard; Nutzer arbeiten im Browser.
  • Qdrant als eigener Container für die Vektorsuche (RAG).
  • Port 8080 (HTTP). TLS terminiert ein vorgelagerter Reverse-Proxy (Caddy, nginx, Traefik).
  • Datenhaltung: SQLite-DB + Wissensbasis + Import-Staging auf einem persistenten Volume.
  • Docker und Docker Compose.
  • Ein Verzeichnis/Volume für Daten (überlebt Container-Neustarts und Upgrades).
  • Eine öffentliche URL/DNS für den Reverse-Proxy.
  • Optional ein Site-Lizenz-Token (ohne Lizenz läuft die App am Free-Floor, voll evaluierbar).

Dieses Setup startet CompanyWizard plus eine Qdrant-Vektordatenbank. Ohne Lizenz läuft die App am Free-Floor — voll nutzbar zur Evaluierung; die Lizenz tragen Sie später auf der Admin-Lizenzseite ein.

services:
companywizard:
image: evantomedia/companywizard:latest
depends_on:
- qdrant
ports:
- "8080:8080" # front this with an HTTPS reverse proxy in production
environment:
# --- REQUIRED: app refuses to start without these ---
Encryption__ApiKeySecret: "change-me-to-a-random-32+-char-secret" # ≥ 32 chars; seeds AES-256-GCM for stored API keys
Jwt__SecretKey: "change-me-to-another-random-32+-char-secret" # ≥ 32 chars; signs auth tokens
Cors__AllowedOrigins__0: "https://companywizard.example.com" # the public URL users hit (add __1, __2 for more)
# --- REQUIRED in Docker (no sensible default exists) ---
Knowledge__FolderPath: "/data/knowledge"
Import__StagingRoot: "/data/imports" # same volume as knowledge → atomic KB promotion
ConnectionStrings__CompanyWizardDb: "Data Source=/data/companywizard.db"
# --- Vector database (RAG). Point at the Qdrant gRPC port (6334) ---
Qdrant__QdrantEndpoint: "http://qdrant:6334"
# --- OPTIONAL: license token. Leave unset to run at the Free floor. ---
# Prefer entering the token on the in-app admin license page (survives restarts);
# set it here only if you provision licenses through ops/config.
# Licensing__Token: "<signed-license-token>"
volumes:
- cw-data:/data # SQLite DB + knowledge base + import staging (single volume = atomic promotion)
restart: unless-stopped
qdrant:
image: qdrant/qdrant:latest # pin to a specific version for production
volumes:
- qdrant-data:/qdrant/storage
restart: unless-stopped
volumes:
cw-data:
qdrant-data:

Jede Einstellung ist eine Umgebungsvariable mit dem __-Sektionstrenner von ASP.NET Core.

VariablePflichtHinweise
Encryption__ApiKeySecretja≥ 32 Zeichen. Seed für AES-256-GCM der in der DB gespeicherten API-Keys/Secrets. Rotation entwertet gespeicherte Keys — im Admin-UI neu eintragen.
Jwt__SecretKeyja≥ 32 Zeichen. Signiert Auth-Tokens.
Cors__AllowedOrigins__0jaÖffentliche Origin(s), die API + SignalR-Hub aufrufen dürfen. Leerer Wert = harter Startabbruch. __1, __2, … für weitere.
Knowledge__FolderPathja (Docker)Wurzel der Wissensbasis. Auf ein Volume legen.
Import__StagingRootja (Docker)Import-Staging-Verzeichnis. Auf dasselbe Volume wie Knowledge__FolderPath legen, damit die KB-Promotion ein atomarer Move ist.
Qdrant__QdrantEndpointfür RAGQdrant-gRPC-Endpoint, z. B. http://qdrant:6334. Weglassen = ohne Vektorsuche.
ConnectionStrings__CompanyWizardDbneinDefault Data Source=companywizard.db. Auf das Daten-Volume zeigen lassen, um zu persistieren.
Licensing__TokenneinSigniertes Lizenz-Token. Nicht gesetzt ⇒ Free-Floor. Besser die Admin-Lizenzseite (überlebt Neustarts).

Der Container-Port ist immer 8080 (ASPNETCORE_URLS=http://+:8080).

Terminal-Fenster
docker compose up -d
curl -f http://localhost:8080/alive # -> 200, sobald der Container live ist

Danach http://localhost:8080 (bzw. Ihre proxied HTTPS-URL) öffnen. Der erste Start führt durch das Admin-Setup.

Ohne Lizenz läuft die App am Free-Floor (voll evaluierbar). Für den Site-Betrieb tragen Sie das Site-Lizenz-Token auf der Admin-Lizenzseite ein — das überlebt Neustarts und ist gegenüber Licensing__Token in der Compose-Datei zu bevorzugen (Letzteres nur, wenn Sie Lizenzen über Ops/Config ausrollen). Was die Editionen unterscheiden: Lizenz- & Editionsmodell.

LLM-, Embedding- und OCR-Provider stellen Sie nach dem ersten Login im Admin-UI ein — sie liegen verschlüsselt in der DB, nicht in Env-Vars.

  • Docker-Hub-Rate-Limit: anonyme Pulls sind gedeckelt (100 Pulls / 6 h pro IP). Mit einem kostenlosen Docker-Konto anmelden oder das Image in eine eigene Registry spiegeln, sonst toomanyrequests auf ausgelasteten Hosts.
  • Reverse-Proxy / TLS: der Container spricht reines HTTP auf 8080. TLS am Proxy terminieren und Cors__AllowedOrigins__0 auf die öffentliche HTTPS-URL setzen.
  • Encryption__ApiKeySecret-Rotation entwertet gespeicherte API-Keys — danach im Admin-UI neu eintragen.
  • Backups: nur das cw-data-Volume sichern (SQLite-DB + Wissensbasis + Imports). Das Qdrant-Volume ist eine rebuildbare Projektion der Wissensbasis.
  • Upgrade: neues Image-Tag ziehen und docker compose up -d — das Daten-Volume bleibt erhalten.