Dokumentation

Deployment, Konfiguration, Schichtplanung & Erweiterungen

1. Docker-Images

Docker Hub

klokkme/klokk

hub.docker.com/r/klokkme/klokk

GitHub Container Registry

ghcr.io/klokk-me/klokk

ghcr.io packages

Tag Beschreibung
stable Produktionsreif. Empfohlen für den Self-Hosting-Betrieb.
latest Neueste Veröffentlichung; kann aktuelle Fixes enthalten, die noch nicht nach stable übernommen wurden.

2. Schnellstart

Am einfachsten läuft Klokk mit SQLite — ohne externe Datenbank. Für den Produktivbetrieb wird ein Volume-Mount benötigt, damit die Daten über Container-Neustarts hinweg erhalten bleiben.

Docker run (SQLite)

docker run -d \
  --name klokk \
  -p 8080:8080 \
  -v klokk-data:/app/data \
  -e SESSION_SECRET="$(openssl rand -hex 32)" \
  -e CSRF_KEY="$(openssl rand -hex 32)" \
  -e SESSION_SECURE_COOKIE=false \
  -e BASE_URL=http://localhost:8080 \
  klokkme/klokk:stable

docker-compose.yml (SQLite)

services:
  klokk:
    image: klokkme/klokk:stable
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - klokk-data:/app/data
    environment:
      BASE_URL: "http://localhost:8080"
      SESSION_SECRET: "change-me-min-32-chars-random-string"
      CSRF_KEY: "change-me-min-32-chars-random-string"
      SESSION_SECURE_COOKIE: "false"

volumes:
  klokk-data:
Nach dem ersten Start: Melden Sie sich mit dem Benutzernamen admin (E-Mail admin@localhost) und dem Standardpasswort an und ändern Sie es anschließend sofort. Siehe DEFAULT_ADMIN_PASSWORD.

3. Umgebungsvariablen

Die gesamte Konfiguration erfolgt über Umgebungsvariablen. Mit Erforderlich markierte Variablen haben keinen Standardwert und müssen vor dem Start von Klokk gesetzt werden.

Anwendung

Variable Standard Beschreibung
APP_ENV dev Laufzeitmodus: production oder dev. Für echte Deployments production setzen; dev lockert einige Sicherheitsprüfungen.
PORT 8080 HTTP-Listen-Port innerhalb des Containers.
BASE_URL http://localhost:8080 Öffentliche Basis-URL (ohne abschließenden Schrägstrich). Wird für Links in E-Mails verwendet.
LOG_LEVEL warn Log-Ausführlichkeit: debug, info, warn, error.
LOCALES_PATH locales Pfad zum Verzeichnis der Locale-Dateien (relativ zum Binary oder absolut).

Datenbank

Variable Standard Beschreibung
DB_DRIVER sqlite Datenbank-Backend: sqlite oder postgres.
DB_SQLITE_PATH ./data/klokk.db Pfad zur SQLite-Datei. /app/data als Volume einbinden, damit sie erhalten bleibt.
DB_DSN PostgreSQL-Verbindungszeichenfolge, z. B. postgres://user:pass@host:5432/db?sslmode=disable. Erforderlich bei DB_DRIVER=postgres.
DB_MAX_OPEN_CONNS 25 Maximale offene DB-Verbindungen (nur PostgreSQL).
DB_MAX_IDLE_CONNS 5 Maximale ungenutzte DB-Verbindungen (nur PostgreSQL).
DB_CONN_MAX_LIFETIME_MINUTES 5 Maximale Verbindungslebensdauer in Minuten (nur PostgreSQL).

Sicherheit Erforderlich

Variable Standard Beschreibung
SESSION_SECRET Geheimnis zum Signieren der Session-Cookies. Mind. 32 Zeichen. Muss geändert werden. Erzeugen: openssl rand -hex 32
CSRF_KEY Geheimnis zum Signieren der CSRF-Token. Mind. 32 Zeichen. Muss geändert werden. Erzeugen: openssl rand -hex 32
SESSION_SECURE_COOKIE false Im Produktivbetrieb true (erfordert HTTPS). false für HTTP/localhost.
SESSION_SAME_SITE lax Cookie-SameSite-Richtlinie: strict, lax oder none.
SESSION_MAX_AGE_HOURS 24 Standard-Sitzungsdauer in Stunden.

Authentifizierung

Variable Standard Beschreibung
REMEMBER_ME_ENABLED true Checkbox „Angemeldet bleiben" auf der Login-Seite anzeigen.
MFA_TRUST_ENABLED true Checkbox „Diesem Gerät vertrauen" auf der MFA-Seite anzeigen.
MFA_TRUST_DAYS 30 Dauer in Tagen für gemerkte Sitzungen und vertrauenswürdige MFA-Geräte.
DEFAULT_ADMIN_PASSWORD Admin@Klokk1 Passwort für das anfängliche Admin-Konto (Benutzername admin, E-Mail admin@localhost). Wird nur beim ersten Start verwendet. Nach dem Login sofort ändern.

Admin-Zugriffskontrolle

Variable Standard Beschreibung
ADMIN_IP_ALLOWLIST empty Kommagetrennte IPs/CIDRs mit Zugriff auf /admin/*. Leer = keine Einschränkung. X-Forwarded-For wird hinter Reverse-Proxys berücksichtigt.
SUPER_ADMIN_IP_ALLOWLIST empty Zusätzliche Allowlist für reine super_admin-Routen (/admin/settings, /admin/companies, /admin/audit). Ergänzt ADMIN_IP_ALLOWLIST.

Passwortrichtlinie

Variable Standard Beschreibung
PASSWORD_MIN_LENGTH 12 Minimale Passwortlänge.
PASSWORD_REQUIRE_UPPER true Mindestens einen Großbuchstaben verlangen.
PASSWORD_REQUIRE_LOWER true Mindestens einen Kleinbuchstaben verlangen.
PASSWORD_REQUIRE_NUMBER true Mindestens eine Ziffer verlangen.
PASSWORD_REQUIRE_SPECIAL true Mindestens ein Sonderzeichen verlangen.
PASSWORD_MAX_HISTORY 5 Anzahl gemerkter früherer Passwörter (verhindert Wiederverwendung). 0 = deaktiviert.
PASSWORD_EXPIRY_DAYS 0 Passwortablauf in Tagen. 0 = läuft nie ab.

Rate-Limiting

Variable Standard Beschreibung
RATE_LIMIT_LOGIN_PER_MINUTE 10 Maximale Login-Versuche pro IP und Minute.
RATE_LIMIT_MFA_PER_MINUTE 10 Maximale MFA-Versuche pro IP und Minute.
RATE_API_PER_MINUTE 100 Maximale API-/allgemeine Anfragen pro IP und Minute.
AUTH_LOCKOUT_THRESHOLD 0 Fehlgeschlagene Login-Versuche bis zur Kontosperrung. 0 = deaktiviert.
AUTH_LOCKOUT_DURATION_MINUTES 15 Dauer der Kontosperrung in Minuten.

Internationalisierung

Variable Standard Beschreibung
I18N_DEFAULT_LOCALE en Standardsprache für neue Nutzer und die Login-Seite: en oder de.
I18N_AVAILABLE_LOCALES en,de Kommagetrennte Liste aktivierter Sprachen.

Arbeitszeit-Standardwerte

Wird beim ersten Start auf den Admin-Seed-Nutzer angewendet. Pro-Nutzer-Werte werden danach in der App verwaltet.

Variable Standard Beschreibung
DEFAULT_WEEKLY_HOURS 40 Standard-Wochenarbeitszeit.
DEFAULT_ANNUAL_LEAVE_DAYS 30 Standard-Jahresurlaubstage.

Schichtplanung

Die Schichtplanung selbst wird pro Firma in der App aktiviert (Admin → Companies), nicht über Umgebungsvariablen. Siehe Schichtplanung unten für den vollständigen Ablauf. Die einzige serverseitige Einstellung ist die Push-Erinnerung vor Schichtbeginn:

Variable Standard Beschreibung
SHIFT_REMINDER_HOURS 0 Sendet so viele Stunden vor Beginn einer veröffentlichten Schicht eine Push-Erinnerung. Wird einmal pro Schicht an Mitarbeitende gesendet, die die Push-Benachrichtigung „Schichtplan veröffentlicht oder geändert" aktiviert haben. 0 = deaktiviert.

SMTP (E-Mail)

Variable Standard Beschreibung
SMTP_HOST empty SMTP-Server-Hostname. Leer lassen, um den E-Mail-Versand komplett zu deaktivieren.
SMTP_PORT 587 SMTP-Server-Port. 587 für STARTTLS, 465 für implizites TLS.
SMTP_USER SMTP-Benutzername.
SMTP_PASS SMTP-Passwort.
SMTP_TLS false true = implizites TLS (Port 465). false = STARTTLS (Port 587).
SMTP_FROM empty Absenderadresse für ausgehende E-Mails. Leer lassen zum Deaktivieren.

API & Erweiterungen

Klokk bietet eine schreibgeschützte öffentliche REST-API unter /api/v1/* (/status, /users, /clock/states, /time/entries, /companies). Anfragen werden mit einem API-Schlüssel authentifiziert und pro Scope autorisiert (z. B. read:users, read:time_entries) und auf 60 Anfragen pro Minute und IP begrenzt.

Super-Admins verwalten Integrationen unter API & Erweiterungen (/admin/extensions). Jede Integration bündelt einen API-Schlüssel, seine Scopes und einen Verbindungsmodus:

  • Nur API — die Erweiterung ruft die obige REST-API mit ihrem Schlüssel auf.
  • Webhooks — Klokk sendet bei Ein-/Ausstempeln und Abwesenheitsereignissen ausgehende HTTP-POSTs.
  • WebSocket — die Erweiterung öffnet eine dauerhafte eingehende Verbindung unter GET /api/v1/extension/connect.

Mit EXTENSIONS_ENABLED=false wird das Erweiterungs-Subsystem auf Netzwerkebene abgeschaltet. Die oben aufgeführten schreibgeschützten REST-API-Endpunkte bleiben verfügbar; nur die Webhook-/WebSocket-Funktionen unten werden deaktiviert.

Variable Standard Beschreibung
EXTENSIONS_ENABLED true Aktiviert das Erweiterungs-API-Subsystem. Bei false:
  • /admin/extensions und alle Unterrouten liefern 404
  • Der WebSocket-Endpunkt /api/v1/extension/connect wird nicht registriert
  • Der Versand ausgehender Webhooks entfällt vollständig
  • Es werden keine ExtensionHub-Goroutinen gestartet
WEBHOOK_ALLOW_PRIVATE_TARGETS false SSRF-Schutz für ausgehende Webhooks. Standardmäßig werden Webhook-URLs abgelehnt, die auf Loopback-, private oder Link-Local-Adressen auflösen (auch über Redirects und DNS-Rebinding). Nur auf true setzen, wenn Webhooks bewusst an einen Endpunkt im internen Netz zugestellt werden sollen.

4. Reverse-Proxy

Wenn Klokk hinter einem Reverse-Proxy läuft, setzen Sie zusätzlich zur Proxy-Konfiguration diese beiden Variablen:

  • SESSION_SECURE_COOKIE=true setzen — erforderlich bei Auslieferung über HTTPS.
  • BASE_URL=https://yourdomain.com setzen — ohne abschließenden Schrägstrich.

nginx

server {
    listen 443 ssl;
    server_name yourdomain.com;

    # TLS config omitted — use certbot or similar

    location / {
        proxy_pass         http://localhost:8080;
        proxy_set_header   Host              $host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Caddy

yourdomain.com {
    reverse_proxy localhost:8080
}

Caddy stellt TLS-Zertifikate automatisch über Let's Encrypt bereit und erneuert sie — keine zusätzliche TLS-Konfiguration nötig.

5. Schichtplanung

Mit der Schichtplanung erstellen Admins und Manager Wochenpläne aus wiederverwendbaren Schichtvorlagen, veröffentlichen sie an die Mitarbeitenden und regeln den Alltag über Tausch, offene Schichten und Verfügbarkeiten — mit eingebauten Prüfungen nach dem Arbeitszeitgesetz (ArbZG). Es ist optional: Ein Mandant muss es aktivieren, und nur Nutzer mit dem Arbeitszeitmodell schichtbasiert beziehen ihre Sollstunden aus dem Dienstplan.

a. Schichten aktivieren

Ein Super-Admin aktiviert die Funktion pro Firma unter Admin → Companies:

  • Schichtplanung — aktiviert Schichtvorlagen und Dienstpläne für die Firma.
  • Ankündigungsfrist Dienstplan (Tage) — erforderliche Vorlaufzeit, bevor ein Dienstplan veröffentlicht werden darf (z. B. aus einem Tarif- oder Betriebsvereinbarung). 0 = keine. Der Planer sieht einen „Veröffentlichen bis"-Hinweis und eine Warnung, sobald die Frist abgelaufen ist.

Nach der Aktivierung erscheint für Admins und Manager ein Eintrag Schichten und für jeden Mitarbeitenden ein Eintrag Meine Schichten.

b. Arbeitszeitmodell

Die täglichen Sollstunden jedes Nutzers ergeben sich aus seinem Arbeitszeitmodell:

  • Wöchentlich — feste/flexible Wochenstunden aus dem Arbeitszeitplan (Standard).
  • Schichtbasiert — die Sollstunden werden statt aus Wochenstunden aus dem veröffentlichten Dienstplan abgeleitet.
  • Erben — den Abteilungsstandard nutzen, dann auf wöchentlich zurückfallen.

Pro Nutzer unter Admin → Users einstellen oder als Abteilungsstandard unter Admin → Departments. Nur schichtbasierte Nutzer sind vom Dienstplan betroffen; wöchentliche Nutzer behalten ihren Plan.

c. Vorlagen & Dienstplan

Vorlagen sind wiederverwendbare Schichtdefinitionen (z. B. „Früh 06:00–14:00"), die unter Schichten angelegt werden. Jede hat einen Namen, Start- und Endzeit (liegt das Ende nicht nach dem Start, geht die Schicht über Mitternacht, z. B. 22:00–06:00), eine Pause in Minuten (wird vom Brutto abgezogen und ergibt die bezahlte Nettozeit), eine Farbe für das Raster und ein Aktiv-Kennzeichen. Schichten im gesetzlichen Nachtzeitfenster (23:00–06:00) werden für die ArbZG-Prüfungen automatisch erkannt.

Der Dienstplan ist ein Wochenraster aus Mitarbeitenden × Tagen. Weisen Sie pro Zelle eine Vorlage zu, fügen Sie eine optionale Notiz hinzu und nutzen Sie Vorwoche kopieren, um einen wiederkehrenden Plan zu übernehmen. Entwürfe sind für Mitarbeitende unsichtbar und beeinflussen die Sollstunden nicht. Wenn fertig, wählen Sie Veröffentlichen & benachrichtigen: Die Zuweisungen werden in Meine Schichten sichtbar, speisen die schichtbasierten Sollstunden, benachrichtigen betroffene Mitarbeitende (E-Mail und/oder Push, je nach Einstellung) und zeigen jedem Mitarbeitenden eine genaue Änderungsübersicht gegenüber der zuletzt veröffentlichten Version.

d. Tausch, offene Schichten & Verfügbarkeit

  • Schichttausch (Abgabe). Aus Meine Schichten gibt ein Mitarbeitender eine veröffentlichte Schicht ab; ein Kollege übernimmt sie und ein Manager/Admin genehmigt die Neuzuweisung (offen → übernommen → genehmigt oder abgelehnt/zurückgezogen). Nur ein genehmigter Tausch verschiebt die Zuweisung.
  • Offene Schichten. Ein Planer bietet einen nicht zugewiesenen Slot dem Pool an; Mitarbeitende bewerben sich und ein Manager genehmigt, wodurch er zu einer normalen Zuweisung wird (offen → übernommen → besetzt).
  • Verfügbarkeit. Mitarbeitende markieren Tage als Nicht verfügbar oder Bevorzugt (kein Eintrag = keine Präferenz). Wird jemand an einem als nicht verfügbar markierten Tag eingeteilt, kennzeichnet der Dienstplan einen Konflikt.

e. Mitarbeiteransicht, Kalender & Erinnerungen

Meine Schichten zeigt dem Mitarbeitenden den eigenen veröffentlichten Dienstplan als Woche oder Monat; er kann den Plan bestätigen („Ich habe meine Schichten gesehen") und von hier aus Verfügbarkeiten, Tausch und Bewerbungen auf offene Schichten verwalten.

Kalender-Abo. Mitarbeitende können einen Kalender-Feed aktivieren und die erzeugte iCalendar-URL (/shifts/feed/<token>) in jeder Kalender-App abonnieren; er aktualisiert sich automatisch, und beim Deaktivieren wird der Link ungültig.

Erinnerungen vor Schichtbeginn. Setzen Sie SHIFT_REMINDER_HOURS (siehe Schichtplanung unter den Umgebungsvariablen), um so viele Stunden vor Schichtbeginn eine Erinnerung zu senden — einmal pro Schicht, an Mitarbeitende, die die Push-Benachrichtigung „Schichtplan veröffentlicht oder geändert" aktiviert haben.

ArbZG-Audit. Klokk prüft Dienstpläne gegen das Arbeitszeitgesetz — Tages-/Wochenhöchstgrenzen, die 11-stündige Ruhezeit und Nachtarbeitsregeln — und die Ansicht Jährliches ArbZG-Audit bietet eine Compliance-Übersicht pro Mitarbeitenden über das ganze Jahr.

6. Erweiterungen

Erweiterungen sind externe Dienste, die über das API- & Erweiterungssystem von Klokk angebunden werden: eine scope-basierte, schreibgeschützte REST-API, ausgehende Webhooks und eingehende WebSocket-Verbindungen. Die Konfigurationsvariablen finden sich unter API & Erweiterungen oben; dieser Abschnitt behandelt den Ablauf in der App und die hauseigenen Erweiterungen.

a. Nutzung in der App

Ein Super-Admin verwaltet Integrationen unter Admin → API & Erweiterungen (/admin/extensions). Jede Integration bündelt einen API-Schlüssel (nur einmal angezeigt — sicher aufbewahren), die nutzbaren Scopes und einen Verbindungsmodus:

  • Nur API — die Erweiterung fragt die REST-API mit ihrem Schlüssel ab (/api/v1/status, /users, /clock/states, /time/entries, /shifts/events, /companies); begrenzt auf 60/min pro IP.
  • Webhooks — Klokk sendet bei Ein-/Ausstempeln und Abwesenheitsereignissen ausgehende HTTP-POSTs.
  • WebSocket — die Erweiterung öffnet eine dauerhafte eingehende Verbindung unter GET /api/v1/extension/connect.

Scopes (z. B. read:users, read:time_entries, read:companies) autorisieren jeden Schlüssel; vergeben Sie nur, was eine Erweiterung benötigt. Die öffentliche API ist schreibgeschützt. EXTENSIONS_ENABLED=false entfernt die Admin-Routen, den WebSocket-Endpunkt und alle Webhooks (die einfache REST-API bleibt verfügbar).

b. Klokk Anchor

Klokk Anchor ist ein Begleitdienst, der täglich einen manipulationssicheren Nachweis Ihrer Zeiterfassungsdaten in die IOTA-Rebased-(Starfish-)Blockchain schreibt. Jedes Ereignis wird auf ein einseitiges SHA-256-Commitment reduziert und in einem Merkle-Baum zusammengefasst; nur die tägliche Merkle-Wurzel wird verankert, sodass keine personenbezogenen Daten in Richtung Chain gelangen. Optional wird ein vertrauenswürdiger Zeitstempel nach RFC 3161 ergänzt.

Voraussetzungen: ein laufendes Klokk mit EXTENSIONS_ENABLED=true; ein Klokk-API-Schlüssel mit den Scopes read:time_entries und read:companies; sowie zwei 32-Byte-Hex-Geheimnisse (eines für die Verschlüsselung im Ruhezustand, eines für das Hashing der Firmen-Token). Für das Mainnet eine finanzierte IOTA-Wallet (in der Anchor-Oberfläche erstellt); der Anchor-Smart-Contract von Klokk ist als Standard eingebaut.

Image: klokkme/anchor / ghcr.io/klokk-me/anchor (Tags stable, latest). PostgreSQL wird über DATABASE_URL unterstützt.

docker-compose.yml

services:
  klokk-anchor:
    image: klokkme/anchor:stable
    restart: unless-stopped
    ports:
      - "127.0.0.1:9090:9090"
    volumes:
      - anchor-data:/app/data
    environment:
      KLOKK_BASE_URL: "https://klokk.example.com"
      KLOKK_API_KEY: "klokk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      DATABASE_URL: "sqlite:/app/data/klokk-anchor.db"
      ENCRYPTION_KEY: "change-me-openssl-rand-hex-32"
      COMPANY_TOKEN_PEPPER: "change-me-openssl-rand-hex-32"
      IOTA_NETWORK: "testnet"
      TZ: "Europe/Berlin"
      TIMEZONE: "Europe/Berlin"

volumes:
  anchor-data:
Zuerst die Geheimnisse erzeugen: openssl rand -hex 32 zweimal für ENCRYPTION_KEY und COMPANY_TOKEN_PEPPER ausführen. Wird ENCRYPTION_KEY nach dem Anlegen von Wallets geändert, sind diese dauerhaft unlesbar.

Umgebungsvariablen

Variable Standard Beschreibung
KLOKK_BASE_URL ErforderlichBasis-URL Ihrer Klokk-Instanz.
KLOKK_API_KEY ErforderlichErweiterungs-API-Schlüssel mit read:time_entries + read:companies. Ein firmengebundener Schlüssel beschränkt den Anchor auf diese Firma. Geheim halten.
DATABASE_URLsqlite:data/klokk-anchor.dbSQLite-Pfad (sqlite:…) oder PostgreSQL-DSN (postgresql://…).
ENCRYPTION_KEY Erforderlich64-stelliger Hex-Wert (32 Byte). AES-256-GCM-Schlüssel für gespeicherte privaten Wallet-Schlüssel. openssl rand -hex 32.
COMPANY_TOKEN_PEPPER ErforderlichGeheimnis, das vor dem SHA-256-Hashing in die Firmen-Token eingemischt wird, sodass Firmen-IDs nicht aus On-Chain-Werten rückrechenbar sind.
IOTA_NETWORKtestnettestnet, mainnet oder localnet. IOTA_ANCHOR_PACKAGE verwendet standardmäßig das von Klokk bereitgestellte Package.
TIMEZONE / DAILY_BOOKING_TIMEUTC / 00:00IANA-Zeitzone und feste tägliche Buchungszeit (HH:MM) zum Verankern des Vortags.
ANCHOR_EMPTY_DAYStrueAuch an Tagen ohne Einträge einen Nachweis verankern (positiver Beleg „niemand hat gearbeitet"). Eine Transaktion pro Firma und leerem Tag.
TSA_URLOptionale RFC-3161-Zeitstempelstelle (kann ein qualifizierter eIDAS-QTSP sein). Best-Effort; blockiert das Verankern nie.
LEDGER_URLSKommagetrennte Klokk Ledger-URLs, um Nachweise bei der Verifizierung gegenzuprüfen — eine betreiberunabhängige vierte Prüfung.
ADMIN_PORT9090Port für die Web-Oberfläche und die REST-API (für Remote-Zugriff hinter einen Reverse-Proxy legen).

c. Klokk Ledger

Klokk Ledger ist ein unabhängiger Indexer- und Verifizierungsdienst. Er liest Klokk-Anchor-Nachweise aus dem öffentlichen IOTA-Ledger zurück, speichert sie und stellt eine schreibgeschützte Verifizierungs-API bereit — sodass jeder einen Nachweis prüfen kann, ohne dem Betreiber zu vertrauen, und selbst dann, wenn der Ledger-Knoten alte Transaktionen später entfernt. Er benötigt keinen API-Schlüssel und keine Geheimnisse; er liest nur öffentliche Daten und füllt beim ersten Lauf die vollständige Package-Historie automatisch nach.

Image: klokkme/ledger / ghcr.io/klokk-me/ledger (Tags stable, latest). SQLite ist reines Go (kein CGO); PostgreSQL optional.

docker-compose.yml

services:
  klokk-ledger:
    image: klokkme/ledger:stable
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:8080"
    volumes:
      - ledger-data:/app/data
    environment:
      IOTA_NETWORK: "mainnet"
      IOTA_ANCHOR_PACKAGE: "0x..."   # dasselbe Package, in das dein Anchor schreibt
      DB_DRIVER: "sqlite"
      DB_DSN: "data/klokk-ledger.db"
      POLL_INTERVAL: "60s"

volumes:
  ledger-data:

Umgebungsvariablen

Variable Standard Beschreibung
IOTA_ANCHOR_PACKAGE ErforderlichAdresse des zu indexierenden klokk_anchor-Move-Packages — dasselbe, in das Ihr Anchor schreibt.
IOTA_NETWORKtestnettestnet, mainnet oder devnet (wählt den Standard-GraphQL-Endpunkt; mit IOTA_GRAPHQL_URL überschreibbar).
DB_DRIVER / DB_DSNsqlite / data/…sqlite oder postgres, mit dem passenden Dateipfad bzw. DSN.
LISTEN_ADDR:8080Adresse, auf der die HTTP-API lauscht.
POLL_INTERVAL60sWie oft der Ledger nach neuen Nachweis-Ereignissen abgefragt wird (z. B. 30s, 5m).
ADDRESSESallOptionale kommagetrennte Anchor-Absenderadressen zum Indexieren. Leer = jeder Nachweis für das Package.

Verifizierungs-API

Alle Endpunkte sind offen verfügbar. GET /api/v1/verify/{tx}?root=<expected> liefert den unabhängig indexierten Nachweis und ob er der erwarteten Merkle-Wurzel entspricht — dieselbe Gegenprüfung, die Klokk Anchor über LEDGER_URLS durchführt.

Endpunkt Beschreibung
GET /api/v1/statusNetzwerk, Package, Anzahl indexiert, Zeitpunkt der letzten Indexierung.
GET /api/v1/verify/{tx}Verifizierungsergebnis; mit ?root= gegen die indexierte Wurzel vergleichen.
GET /api/v1/proofs/{tx}Ein einzelner indexierter Nachweis anhand des Transaktions-Digests.
GET /api/v1/proofsNachweise für einen sender auflisten, mit Filtern company_token/period.
GET /api/v1/companies/{token}/proofsNachweise für ein Firmen-Token, optional nach Zeitraum.