Betreiben

Selbstbetrieb

Dieselben Container wie in unserem Betrieb, in Ihrer Umgebung. Ein Lizenzschlüssel der X-Sitter GmbH schaltet die Enterprise-Funktionen frei; es gibt keine zweite Codelinie.

Docker Compose

git clone <Repository> tokenwacht && cd tokenwacht
cp .env.example .env            # TW_DATENBANK_URL, TW_SITZUNGSGEHEIMNIS, TW_UMGEBUNG=selbstbetrieb
docker compose -f docker/docker-compose.yml up -d     # Postgres 16 + TimescaleDB, Valkey, API (:8080), Worker
docker compose exec api python -m tokenwacht.cli migrieren
docker compose exec api python -m tokenwacht.cli seed  # erster Mandant, Projekt, Schlüssel

Cockpit und Website liefert die API mit TW_STATISCH=1 selbst aus; alternativ ein eigener Reverse-Proxy vor /cockpit/ und /. Vor den Proxy-Pfaden darf nichts puffern (Streams).

Kubernetes

cp infra/kubernetes/secret.example.yaml infra/kubernetes/secret.yaml   # Werte eintragen
kubectl apply -k infra/kubernetes/ && kubectl -n tokenwacht apply -f infra/kubernetes/secret.yaml

Kustomize-Basis mit Postgres/Timescale-StatefulSet, Migrations-Job, API, Worker, Ingress mit abgeschalteter Pufferung. Mehrere API-Repliken brauchen TW_VALKEY_URL, damit alle denselben Zählerstand sehen.

Lizenzschlüssel

Format TW1.<nutzlast>.<signatur>, Ed25519-signiert, nur mit dem privaten Schlüssel der X-Sitter GmbH ausstellbar. Eintragen als TW_LIZENZ oder Datei TW_LIZENZ_PFAD. Prüfen: python -m tokenwacht.cli lizenz pruefen --schluessel TW1…. Ohne gültige Lizenz sind im Selbstbetrieb SSO, Prüfprotokoll-Export, DATEV und die API für Fremdsysteme gesperrt (HTTP 402 lizenz_noetig); alles andere läuft. Die Installation prüft alle sechs Stunden eine signierte Sperrliste; ist sie nicht erreichbar, gilt der letzte bekannte Stand.

Umgebungsvariablen

VariableStandardBedeutung
TW_DATENBANK_URLsqlite (nur Entwicklung)postgresql://… für den Betrieb.
TW_UMGEBUNGentwicklungproduktion oder selbstbetrieb (Lizenzgates aktiv).
TW_SITZUNGSGEHEIMNISzufällig je StartFester Wert (64 Hex), sonst laufen Sitzungen bei Neustart aus.
TW_OEFFENTLICHE_URL, TW_COCKPIT_URLtokenwacht.deIhre Adresse; steht in Alarmen, Berichten, SSO-Rückkehradresse.
TW_ANTHROPIC_URL, TW_OPENAI_URL, TW_GEMINI_URL, TW_BEDROCK_URLAnbieteradressenUpstream je Anbieter; Bedrock-Region hier setzen.
TW_VALKEY_URLleerredis://… für Zähler außerhalb des Prozesses (mehrere API-Prozesse).
TW_SMTP_HOST/PORT/BENUTZER/PASSWORT, TW_MAIL_VONleerE-Mail für Alarme, Berichte, Einladungen, Passwort-Links.
TW_SLACK_WEBHOOK, TW_TEAMS_WEBHOOKleerRückfall-Kanäle für alle Mandanten.
TW_STRIPE_GEHEIMNIS, TW_STRIPE_WEBHOOK_GEHEIMNIS, TW_STRIPE_PREIS_SOLO/TEAM/AGENTURleerAbrechnung (nur Tokenwacht-Betrieb).
TW_REGISTRIERUNG_OFFENtrueSelbstbedienungs-Registrierung; im Selbstbetrieb meist aus.
TW_LIZENZ, TW_LIZENZ_PFADleerLizenzschlüssel (Selbstbetrieb).
TW_ANTHROPIC_ADMIN_KEYleerMonatlicher Abgleich gegen die Anthropic-Rechnung.
TW_BETREIBER_EMAILSleerAnmeldungen mit Zugang zum Betreiber-Bereich.
TW_BETREIBER_NTFY_URL, TW_BETREIBER_MAILleerWachhund-Alarme an den Betreiber (API, Speicherplatz, Sicherung, Zertifikat).
TW_DEMO_OFFENfalseÖffentlicher Demo-Zugang /v1/demo.
TW_DATEV_BERATER/MANDANT/ERLOESKONTOleer / 8400Kopf des DATEV-Buchungsstapels.

Sicherung und Wiederherstellung

infra/hetzner/backup.sh sichert täglich Datenbank und Konfiguration, optional hybrid verschlüsselt für eine Außer-Haus-Kopie; sicherung-entschluesseln.sh stellt sie wieder her. Der Wachhund im Worker meldet fehlende Sicherungen, wenig Speicherplatz, ablaufende Zertifikate und ausgefallene Komponenten.

Metriken

GET /metrics im Prometheus-Textformat: Proxy-Anfragen, geschriebene und verlorene Ereignisse, Wache-Entscheidungen und Dauern, Zählerart, Worker-Herzschlag, Lizenzstand. Nur intern veröffentlichen.