Dokumentation
Deployment, Konfiguration, Schichtplanung & Erweiterungen
1. Docker-Images
| 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: 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:
|
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=truesetzen — erforderlich bei Auslieferung über HTTPS.BASE_URL=https://yourdomain.comsetzen — 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 → genehmigtoder 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: 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 Erforderlich | — | Basis-URL Ihrer Klokk-Instanz. |
KLOKK_API_KEY Erforderlich | — | Erweiterungs-API-Schlüssel mit read:time_entries + read:companies. Ein firmengebundener Schlüssel beschränkt den Anchor auf diese Firma. Geheim halten. |
DATABASE_URL | sqlite:data/klokk-anchor.db | SQLite-Pfad (sqlite:…) oder PostgreSQL-DSN (postgresql://…). |
ENCRYPTION_KEY Erforderlich | — | 64-stelliger Hex-Wert (32 Byte). AES-256-GCM-Schlüssel für gespeicherte privaten Wallet-Schlüssel. openssl rand -hex 32. |
COMPANY_TOKEN_PEPPER Erforderlich | — | Geheimnis, das vor dem SHA-256-Hashing in die Firmen-Token eingemischt wird, sodass Firmen-IDs nicht aus On-Chain-Werten rückrechenbar sind. |
IOTA_NETWORK | testnet | testnet, mainnet oder localnet. IOTA_ANCHOR_PACKAGE verwendet standardmäßig das von Klokk bereitgestellte Package. |
TIMEZONE / DAILY_BOOKING_TIME | UTC / 00:00 | IANA-Zeitzone und feste tägliche Buchungszeit (HH:MM) zum Verankern des Vortags. |
ANCHOR_EMPTY_DAYS | true | Auch an Tagen ohne Einträge einen Nachweis verankern (positiver Beleg „niemand hat gearbeitet"). Eine Transaktion pro Firma und leerem Tag. |
TSA_URL | — | Optionale RFC-3161-Zeitstempelstelle (kann ein qualifizierter eIDAS-QTSP sein). Best-Effort; blockiert das Verankern nie. |
LEDGER_URLS | — | Kommagetrennte Klokk Ledger-URLs, um Nachweise bei der Verifizierung gegenzuprüfen — eine betreiberunabhängige vierte Prüfung. |
ADMIN_PORT | 9090 | Port 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 Erforderlich | — | Adresse des zu indexierenden klokk_anchor-Move-Packages — dasselbe, in das Ihr Anchor schreibt. |
IOTA_NETWORK | testnet | testnet, mainnet oder devnet (wählt den Standard-GraphQL-Endpunkt; mit IOTA_GRAPHQL_URL überschreibbar). |
DB_DRIVER / DB_DSN | sqlite / data/… | sqlite oder postgres, mit dem passenden Dateipfad bzw. DSN. |
LISTEN_ADDR | :8080 | Adresse, auf der die HTTP-API lauscht. |
POLL_INTERVAL | 60s | Wie oft der Ledger nach neuen Nachweis-Ereignissen abgefragt wird (z. B. 30s, 5m). |
ADDRESSES | all | Optionale 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/status | Netzwerk, 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/proofs | Nachweise für einen sender auflisten, mit Filtern company_token/period. |
GET /api/v1/companies/{token}/proofs | Nachweise für ein Firmen-Token, optional nach Zeitraum. |