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
| Variable | Standard | Bedeutung |
|---|---|---|
TW_DATENBANK_URL | sqlite (nur Entwicklung) | postgresql://… für den Betrieb. |
TW_UMGEBUNG | entwicklung | produktion oder selbstbetrieb (Lizenzgates aktiv). |
TW_SITZUNGSGEHEIMNIS | zufällig je Start | Fester Wert (64 Hex), sonst laufen Sitzungen bei Neustart aus. |
TW_OEFFENTLICHE_URL, TW_COCKPIT_URL | tokenwacht.de | Ihre Adresse; steht in Alarmen, Berichten, SSO-Rückkehradresse. |
TW_ANTHROPIC_URL, TW_OPENAI_URL, TW_GEMINI_URL, TW_BEDROCK_URL | Anbieteradressen | Upstream je Anbieter; Bedrock-Region hier setzen. |
TW_VALKEY_URL | leer | redis://… für Zähler außerhalb des Prozesses (mehrere API-Prozesse). |
TW_SMTP_HOST/PORT/BENUTZER/PASSWORT, TW_MAIL_VON | leer | E-Mail für Alarme, Berichte, Einladungen, Passwort-Links. |
TW_SLACK_WEBHOOK, TW_TEAMS_WEBHOOK | leer | Rückfall-Kanäle für alle Mandanten. |
TW_STRIPE_GEHEIMNIS, TW_STRIPE_WEBHOOK_GEHEIMNIS, TW_STRIPE_PREIS_SOLO/TEAM/AGENTUR | leer | Abrechnung (nur Tokenwacht-Betrieb). |
TW_REGISTRIERUNG_OFFEN | true | Selbstbedienungs-Registrierung; im Selbstbetrieb meist aus. |
TW_LIZENZ, TW_LIZENZ_PFAD | leer | Lizenzschlüssel (Selbstbetrieb). |
TW_ANTHROPIC_ADMIN_KEY | leer | Monatlicher Abgleich gegen die Anthropic-Rechnung. |
TW_BETREIBER_EMAILS | leer | Anmeldungen mit Zugang zum Betreiber-Bereich. |
TW_BETREIBER_NTFY_URL, TW_BETREIBER_MAIL | leer | Wachhund-Alarme an den Betreiber (API, Speicherplatz, Sicherung, Zertifikat). |
TW_DEMO_OFFEN | false | Öffentlicher Demo-Zugang /v1/demo. |
TW_DATEV_BERATER/MANDANT/ERLOESKONTO | leer / 8400 | Kopf 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.