ChastityTrackerEnglish
← Zum Blog

2026-04-04 · 4 Min. Lesezeit · TruBlue

Chastity Tracker mit Docker selbst hosten

Wer den Chastity Tracker nicht über das Self-Service-Portal beziehen möchte, kann die Anwendung vollständig auf einem eigenen Server betreiben. Das Docker-Image ist öffentlich verfügbar — ihr behaltet damit die vollständige Kontrolle über eure Daten, euren Server und eure Updates.

Diese Anleitung richtet sich an Personen mit Grundkenntnissen in Linux und Docker. Die Software wird ohne Gewähr bereitgestellt.

Voraussetzungen

Bevor ihr beginnt, stellt sicher, dass folgendes vorhanden ist:

Das GitHub-Repository findet ihr unter github.com/trublue-2/chastitytracker. Dort sind auch Release-Notes und bekannte Probleme dokumentiert.

Docker Compose Setup

Legt ein Verzeichnis für die Installation an und erstellt darin eine docker-compose.yml:

mkdir chastitytracker && cd chastitytracker
services:
  chastitytracker:
    image: ghcr.io/trublue-2/chastitytracker:latest
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      NEXTAUTH_SECRET: "your-secret-here"
      NEXTAUTH_URL: "https://your-domain.com"
      DATABASE_URL: "file:./data/prod.db"
    volumes:
      - ./data:/app/data

Das Volume ./data:/app/data sorgt dafür, dass die SQLite-Datenbank und alle hochgeladenen Fotos auch nach einem Container-Neustart oder Update erhalten bleiben. Ohne dieses Volume gehen alle Daten beim nächsten docker compose pull verloren.

Konfiguration (.env)

Die Umgebungsvariablen können direkt in der docker-compose.yml gesetzt werden (wie oben gezeigt) oder in eine separate .env-Datei im selben Verzeichnis ausgelagert werden:

NEXTAUTH_SECRET=your-secret-here
NEXTAUTH_URL=https://your-domain.com
DATABASE_URL=file:./data/prod.db

NEXTAUTH_SECRET ist zwingend erforderlich. Generiert einen zufälligen String mit mindestens 32 Zeichen, zum Beispiel:

openssl rand -base64 32

NEXTAUTH_URL muss exakt mit der URL übereinstimmen, unter der die App erreichbar ist — inklusive Protokoll (https://) und ohne abschliessenden Schrägstrich.

DATABASE_URL zeigt auf die SQLite-Datenbankdatei innerhalb des Containers. Der Pfad file:./data/prod.db legt die Datei im gemounteten Volume ab.

Initialer Admin-Account

Ohne einen Admin-Benutzer lässt sich die App nach dem Start nicht sinnvoll nutzen. Legt beim ersten Deployment folgende Variablen fest — der Admin-Account wird beim Start automatisch erstellt, falls noch kein Admin in der Datenbank existiert:

INITIAL_ADMIN_USERNAME=admin
INITIAL_ADMIN_PASSWORD=your-strong-password
INITIAL_ADMIN_EMAIL=admin@your-domain.com

Diese Variablen werden nur beim allerersten Start ausgewertet. Danach können sie entfernt oder leer gelassen werden.

SMTP (optional, empfohlen)

Benachrichtigungen per E-Mail funktionieren nur, wenn SMTP konfiguriert ist. Fügt folgende Variablen hinzu:

SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=your-user@example.com
SMTP_PASS=your-password
SMTP_FROM=noreply@your-domain.com

Ohne SMTP-Konfiguration läuft die App, aber E-Mail-basierte Funktionen (Benachrichtigungen, Passwort-Reset) stehen nicht zur Verfügung.

KI-Inspektionsverifizierung (optional)

Der Tracker kann handgeschriebene Codes in Inspektionsfotos automatisch erkennen (Claude Vision). Dafür ist ein Anthropic API-Key nötig:

ANTHROPIC_API_KEY=sk-ant-...

Ohne diesen Key läuft die App vollständig — die automatische Bildanalyse bei Kontrollen ist schlicht deaktiviert.

Push-Benachrichtigungen (optional)

Für Web-Push-Benachrichtigungen (PWA) werden VAPID-Schlüssel benötigt. Generiert sie einmalig mit:

node -e "const c=require('crypto').createECDH('prime256v1');c.generateKeys();console.log(c.getPublicKey('base64url'));console.log(c.getPrivateKey('base64url'))"
VAPID_PUBLIC_KEY=generated-public-key
VAPID_PRIVATE_KEY=generated-private-key
VAPID_SUBJECT=mailto:admin@your-domain.com

Passkey / WebAuthn (optional)

Damit Face ID, Touch ID oder andere Passkeys in der Produktion funktionieren, müsst ihr die Domain konfigurieren:

WEBAUTHN_RP_ID=your-domain.com
WEBAUTHN_RP_ORIGIN=https://your-domain.com

Diese Variablen sind für den lokalen Betrieb nicht nötig — ohne sie greift der Fallback auf localhost.

Starten

Startet den Container mit:

docker compose up -d

Beim ersten Start initialisiert die Anwendung die Datenbank automatisch und legt den Admin-Account an (sofern INITIAL_ADMIN_* gesetzt ist). Danach ist die App unter eurer Domain erreichbar.

Prüft den Status mit:

docker compose logs -f

Sobald die Zeile Ready on http://0.0.0.0:3000 erscheint, ist die App erreichbar.

Traefik / Reverse Proxy (optional)

Wer Traefik als Reverse Proxy verwendet, kann die Labels direkt im Compose-File setzen. Entfernt dabei den ports-Block und ersetzt ihn durch Labels:

services:
  chastitytracker:
    image: ghcr.io/trublue-2/chastitytracker:latest
    container_name: kg-yourname
    restart: unless-stopped
    environment:
      NEXTAUTH_SECRET: "your-secret-here"
      NEXTAUTH_URL: "https://yourname.your-domain.com"
      DATABASE_URL: "file:./data/prod.db"
    volumes:
      - ./data:/app/data
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.chastitytracker.rule=Host(`yourname.your-domain.com`)"
      - "traefik.http.routers.chastitytracker.entrypoints=websecure"
      - "traefik.http.routers.chastitytracker.tls.certresolver=letsencrypt"
      - "traefik.http.services.chastitytracker.loadbalancer.server.port=3000"
    networks:
      - traefik

networks:
  traefik:
    external: true

Passt yourname.your-domain.com sowie den Netzwerknamen an eure Traefik-Konfiguration an. TLS wird über Let's Encrypt automatisch ausgehandelt, sofern euer Traefik-Setup einen letsencrypt-Certresolver kennt.

Andere Reverse Proxies (nginx, Caddy) funktionieren ebenfalls — leitet in dem Fall einfach Port 3000 des Containers weiter und setzt den NEXTAUTH_URL entsprechend.

Updates

Um auf eine neue Version zu aktualisieren:

docker compose pull
docker compose up -d

Docker zieht das neue Image und startet den Container neu. Die Datenbank im Volume bleibt dabei unverändert. Lest vor jedem Update die Release-Notes im GitHub-Repository, um auf breaking changes oder notwendige Migrationsschritte hingewiesen zu werden.

Ein automatisches Backup des ./data-Verzeichnisses vor jedem Update ist empfehlenswert.


Bei Fragen oder Problemen schaut zunächst in die GitHub Issues. Wer keinen eigenen Server betreiben möchte, kann eine verwaltete Instanz über das Self-Service-Portal erstellen.