CompanyWizard Web per Docker Compose betreiben (Site)
AdminDer 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.
Überblick
Section titled “Überblick”- 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.
Voraussetzungen
Section titled “Voraussetzungen”- 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).
Compose-Beispiel
Section titled “Compose-Beispiel”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:Umgebungsvariablen
Section titled “Umgebungsvariablen”Jede Einstellung ist eine Umgebungsvariable mit dem __-Sektionstrenner von ASP.NET Core.
| Variable | Pflicht | Hinweise |
|---|---|---|
Encryption__ApiKeySecret | ja | ≥ 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__SecretKey | ja | ≥ 32 Zeichen. Signiert Auth-Tokens. |
Cors__AllowedOrigins__0 | ja | Öffentliche Origin(s), die API + SignalR-Hub aufrufen dürfen. Leerer Wert = harter Startabbruch. __1, __2, … für weitere. |
Knowledge__FolderPath | ja (Docker) | Wurzel der Wissensbasis. Auf ein Volume legen. |
Import__StagingRoot | ja (Docker) | Import-Staging-Verzeichnis. Auf dasselbe Volume wie Knowledge__FolderPath legen, damit die KB-Promotion ein atomarer Move ist. |
Qdrant__QdrantEndpoint | für RAG | Qdrant-gRPC-Endpoint, z. B. http://qdrant:6334. Weglassen = ohne Vektorsuche. |
ConnectionStrings__CompanyWizardDb | nein | Default Data Source=companywizard.db. Auf das Daten-Volume zeigen lassen, um zu persistieren. |
Licensing__Token | nein | Signiertes Lizenz-Token. Nicht gesetzt ⇒ Free-Floor. Besser die Admin-Lizenzseite (überlebt Neustarts). |
Der Container-Port ist immer 8080 (ASPNETCORE_URLS=http://+:8080).
Start & Health
Section titled “Start & Health”docker compose up -dcurl -f http://localhost:8080/alive # -> 200, sobald der Container live istDanach http://localhost:8080 (bzw. Ihre proxied HTTPS-URL) öffnen. Der erste Start führt durch das Admin-Setup.
Lizenz aktivieren
Section titled “Lizenz aktivieren”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.
Provider konfigurieren
Section titled “Provider konfigurieren”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.
Betrieb & Stolperfallen
Section titled “Betrieb & Stolperfallen”- 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
toomanyrequestsauf ausgelasteten Hosts. - Reverse-Proxy / TLS: der Container spricht reines HTTP auf
8080. TLS am Proxy terminieren undCors__AllowedOrigins__0auf 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.