Ouruka ID Service
Ouruka ist ein REST-API-Dienst zur Erzeugung eindeutiger, strukturierter IDs. Statt selbst Zähler,
Datumslogik und Eindeutigkeitsgarantien zu bauen, definierst du ein Schema (z. B. ORD-{DATE:YYYY}-{COUNTER:6})
und rufst per API fertige IDs ab – fortlaufend, kollisionsfrei, auch unter hoher Last.
- Basis-URL:
https://ouruka.com - Authentifizierung: API-Key im Header
X-API-KEY - API-Referenz:
/swagger/(maschinenlesbar, interaktiv)
Typische Einsatzbereiche
- PIM: einheitliche Artikel- und Produktnummern über mehrere Kanäle hinweg.
- ERP: Beleg-, Auftrags- und Lieferscheinnummern in einheitlichem Format.
- E-Commerce: Bestell-, Kunden- und Transaktionsnummern.
- Logistik: Sendungsnummern, Paletten-IDs, Versandlabels.
- Healthcare: Patientenakten-, Proben- und Vorgangsnummern.
- Produktion: Serien-, Chargen- und Qualitäts-IDs.
Der Rest dieser Dokumentation führt Schritt für Schritt durch Authentifizierung, Schemas, alle Platzhalter, die Zusatzdienste (UID, Keyify, Mappings) und eine praxisnahe Beispiel-Bibliothek.
Schnellstart
In wenigen Schritten zur ersten generierten ID.
Schritt 1 — API-Key erhalten
Dein Zugang (Tenant) wird von Ouruka bereitgestellt; bei der Registrierung erhältst du einmalig
einen api_key. Dieser Key identifiziert deinen Tenant und wird für alle Anfragen benötigt – sicher
aufbewahren (siehe Authentifizierung).
Schritt 2 — Schema anlegen
Ein Schema definiert das Format deiner IDs. Du legst fest, aus welchen Bausteinen (Datum, Zähler, feste Zeichen, Variablen) sich eine ID zusammensetzt.
curl -X POST https://ouruka.com/v2/schemas \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{"name":"bestellung","pattern":"ORD-{DATE:YYYY}{DATE:MM}-{COUNTER:5}","start_value":1}'
Das erzeugt IDs im Format ORD-202601-00001.
Schritt 3 — ID generieren
Mit dem Schema-Namen rufst du die nächste ID ab. Ouruka stellt sicher, dass jede ID eindeutig ist.
curl -X POST https://ouruka.com/v2/generate/bestellung -H "X-API-KEY: $KEY"
{ "id": "ORD-202601-00001" }
Jeder weitere Aufruf liefert die nächste Nummer (…-00002, …-00003, …).
🔧 Tiefer erklärt: Die Eindeutigkeit garantiert der Server, nicht dein Code: Der Zähler wird atomar erhöht, sodass selbst tausende gleichzeitige Aufrufe (aus mehreren Systemen) nie dieselbe Nummer doppelt bekommen. Du musst dich also um Sperren, Locks oder Race Conditions nicht kümmern – ein einziger
POSTgenügt pro ID.
Interaktiv ausprobieren: https://ouruka.com/swagger/ — dort „Authorize" klicken, API-Key eintragen und alle Endpunkte direkt im Browser testen.
Authentifizierung
Alle Endpunkte, die Daten lesen oder schreiben, erfordern einen gültigen API-Key im HTTP-Header:
X-API-KEY: <dein API-Key>
Ausnahmen (ohne Key erreichbar): GET /health und GET /v2/changelog.
Der API-Key identifiziert deinen Tenant eindeutig und steuert den Zugriff auf alle deine Schemas,
Zähler, Mappings und History-Daten. Fehlt der Key oder ist er ungültig, antwortet der Dienst mit
401 Unauthorized.
🔧 Tiefer erklärt: Es gibt keinen „Passwort vergessen"-Weg – der Key ist zugleich Identität und Berechtigung, und Ouruka speichert ihn nur als SHA-256-Hash (der Klartext existiert also nur bei dir). Deshalb kann der Key nicht „ausgelesen" werden; ist er weg, erzeugst du über die Rotation einfach einen neuen. Intern gibt es zwei Ebenen: den Tenant-Key (deine Daten) und einen separaten Master-Key (nur das Ouruka-Backend, für Verwaltung) – die beiden sind strikt getrennt.
Sichere Handhabung
- Den API-Key nie im Quellcode oder in versionierten Dateien ablegen.
- Umgebungsvariablen oder Secret-Manager verwenden (z. B. AWS Secrets Manager, HashiCorp Vault, Kubernetes Secrets).
- Nicht an Dritte weitergeben – wer den Key kennt, kann in deinem Namen IDs generieren.
- Die Übertragung erfolgt ausschließlich über HTTPS/TLS.
- Ouruka speichert Keys nie im Klartext, sondern nur als kryptografischen Hash (SHA-256).
Key-Rotation
Falls ein Key kompromittiert wurde – oder rein vorsorglich – lässt er sich jederzeit rotieren. Der neue Key wird einmalig zurückgegeben, der alte wird sofort ungültig:
curl -X POST https://ouruka.com/v2/me/rotate-key -H "X-API-KEY: $KEY"
{ "status": "rotated", "api_key": "…neuer Key…",
"message": "Der bisherige Key ist ab sofort ungültig." }
Den neuen Key sofort sicher speichern – er erscheint nur in dieser einen Antwort.
Schemas & Platzhalter
Ein Schema ist die Schablone für eine ID-Serie – du legst einmal fest, wie deine Nummern aussehen,
und Ouruka liefert sie ab dann fortlaufend. Ein Muster (Pattern) besteht aus festem Text plus
Platzhaltern, z. B. ART-{DATE:YY}{DATE:MM}-{COUNTER:4} → ART-2603-0017.
🔧 Tiefer erklärt: Ein Schema ist an einen Tenant gebunden und hat einen eigenen, unabhängigen Zähler, eigene History und ein eigenes Pattern. Schemas sind immutable: einmal angelegt, lässt sich das Pattern nicht mehr ändern (
409 Conflictbei erneutemPOST). Das ist Absicht – eine laufende Nummernserie soll ihr Format nicht mittendrin wechseln. Zum „Ändern" löscht man das Schema und legt es neu an (der Zähler startet dann wieder beimstart_value).
Datums-Platzhalter
Setzen automatisch das aktuelle Datum ein – praktisch, um auf einen Blick zu sehen, wann etwas angelegt wurde.
| Platzhalter | Ergebnis | Bedeutung |
|---|---|---|
{DATE:YYYY} |
2026 |
Jahr vierstellig |
{DATE:YY} |
26 |
Jahr zweistellig (spart Zeichen) |
{DATE:MM} |
03 |
Monat (01–12) |
{DATE:DD} |
18 |
Tag (01–31) |
Bunt gemischte Praxis:
| Branche | Pattern | Beispiel-ID |
|---|---|---|
| Logistik – Frachtbriefe | FB-{DATE:YYYY}-{COUNTER:6} |
FB-2026-000134 |
| Healthcare – Laborproben | LAB-{DATE:YYYY}-{COUNTER:5} |
LAB-2026-00891 |
| Fashion – Saisonartikel | JKT-{DATE:YY}{DATE:MM}-{COUNTER:4} |
JKT-2603-0056 |
| Gastronomie – Tagesbons | BON-{DATE:YYYY}{DATE:MM}{DATE:DD}-{COUNTER:4} |
BON-20260318-0047 |
| Events – Ticketcodes | TICKET-{DATE:YY}-{COUNTER:5} |
TICKET-26-00042 |
🔧 Tiefer erklärt: Das Datum wird zur Generierungszeit in UTC aufgelöst (nicht beim Anlegen des Schemas). Ein Tages-Präfix wie
{DATE:YYYY}{DATE:MM}{DATE:DD}eignet sich hervorragend als „Bucket" für Statistiken und Archivierung. Reihenfolge und Trennzeichen sind frei kombinierbar.
Zähler — {COUNTER:N}
Der Kern jeder fortlaufenden Nummer: ein hochzählender Zähler, der links mit Nullen aufgefüllt wird.
N ist die Stellenzahl ({COUNTER:4} → 0001, 0002, …).
🔧 Tiefer erklärt: Der Zähler wird über ein atomares Redis-Verfahren erhöht – auch bei vielen gleichzeitigen Anfragen aus verschiedenen Systemen wird jeder Wert nur genau einmal vergeben (im Lasttest: 500.000 IDs, 0 Duplikate).
Nlegt nur die Mindest-Breite fest: Bei mehr Nummern als Stellen wächst die Zahl mit ({COUNTER:4}liefert nach9999einfach10000). Der optionalestart_value(Standard1) wird beim Schema-Anlegen gesetzt – ideal, um eine Nummernreihe aus einem Altsystem nahtlos fortzuführen.
| Branche | Pattern | start_value | Beispiel-ID |
|---|---|---|---|
| E-Commerce – Bestellungen | ORD-{DATE:YYYY}-{COUNTER:6} |
1 | ORD-2026-000342 |
| Pharma – Chargen | CH-{DATE:YYYY}-{COUNTER:5} |
10000 | CH-2026-10047 |
| Buchhaltung – Rechnungen (Migration) | RE-{COUNTER:6} |
4711 | RE-004711 |
Automatischer Reset (Intervall-Zähler)
Viele Nummernkreise sollen periodisch neu bei 1 beginnen (Rechnungsnummern pro Jahr, Tagestickets …).
Ein angehängtes Intervall macht genau das – automatisch, ohne Cron-Job:
{COUNTER:N:daily|monthly|quarterly|yearly}.
| Pattern | Verhalten |
|---|---|
INV-{DATE:YYYY}-{COUNTER:5:yearly} |
2026: INV-2026-00001 … · 2027: INV-2027-00001 (Reset) |
T-{DATE:YYYY}/{DATE:MM}-{COUNTER:4:monthly} |
Juli: T-2026/07-0001 · August: T-2026/08-0001 |
Q-{DATE:YYYY}-{COUNTER:3:quarterly} |
Q1: Q-2026-001 · Q2: startet wieder bei 001 |
🔧 Tiefer erklärt: Technisch wird die aktuelle Periode Teil des Redis-Zähler-Keys (
…:2026-03für monatlich). Wechselt die Periode, entsteht ein neuer Key → der Zähler beginnt automatisch wieder beimstart_value. Alte Perioden-Keys verfallen per TTL. Ein etwaigerstart_valuegilt bei jedem Reset (z. B. Reset auf1000statt1).
Variablen — {VAR1} bis {VAR4}
Werte, die du pro Anfrage mitgibst (z. B. Ländercode, Produktgruppe) – so tragen deine IDs kontextspezifische Infos.
{VAR1}– Wert direkt einfügen.{VAR1:-}/{VAR2:/}– Wert mit vorangestelltem Trenner (-,/, …).
| Branche | Pattern | Eingabe | Beispiel-ID |
|---|---|---|---|
| Logistik – Zielland | SEND-{DATE:YYYY}-{VAR1:-}{COUNTER:6} |
var1=DE |
SEND-2026-DE-000071 |
| PIM – Kategorie | ART-{VAR1:-}{DATE:YY}-{COUNTER:5} |
var1=ELEK |
ART-ELEK-26-00019 |
| Mehrere Variablen | {VAR1}-{VAR2:-}{COUNTER:4} |
var1=DE, var2=B2B |
DE-B2B-0001 |
🔧 Tiefer erklärt: Der Trenner erscheint nur, wenn der Wert nicht leer ist. Bleibt eine Variable leer, fallen Platzhalter und Trenner sauber weg – so entstehen keine doppelten Trennzeichen (
ORD--0001). Damit lässt sich ein Pattern für „mit und ohne Zusatz" gleichzeitig nutzen. Übergabe im Request-Body:{"var1":"DE","var2":"B2B"}.
Mapping — {MAP:tabelle}
Übersetzt einen Klartext-Wert in einen Code: Du sagst „weiss", Ouruka setzt den hinterlegten Code „101" ein. So bleibt die Code-Zuordnung an einer Stelle statt in jedem System.
| Pattern | Tabelle farbe |
Aufruf | Beispiel-ID |
|---|---|---|---|
{COUNTER:4}{MAP:farbe} |
weiss→101 | {"mappings":{"farbe":"weiss"}} |
0001101 |
ART-{MAP:farbe}-{MAP:groesse} |
weiss→101, S→202 | {"mappings":{"farbe":"weiss","groesse":"S"}} |
ART-101-202 |
🔧 Tiefer erklärt: Mapping-Tabellen werden pro Tenant gepflegt (
POST /v2/mappings/{tabelle}). Beim Generieren übergibst du den Klartext-Schlüssel; Ouruka löst ihn zur ID-Zeit auf. Ist der Wert nicht in der Tabelle, kommt400 Bad Requestmit klarer Meldung – so fällt ein Tippfehler sofort auf, statt eine falsche ID zu erzeugen. Ideal, wenn PIM, ERP und Shop denselben Farb-/Größencode brauchen.
Schema-Typ hash (Fingerprint)
Statt eines Zählers erzeugt ein Hash-Schema aus definierten Feldern einen immer gleichen Code für gleiche Eingaben – perfekt, um Dubletten zu erkennen.
{ "name": "fingerprint", "type": "hash", "fields": ["iban","name"], "hash_length": 64 }
🔧 Tiefer erklärt: Ouruka sortiert die Felder alphabetisch, verkettet sie als
key=value|…und bildet einen SHA-256-Hash, gekürzt aufhash_length(erlaubt:16,32,40,64). Deshalb ist das Ergebnis deterministisch und reihenfolge-unabhängig:{"iban":"DE..","name":"ACME"}ergibt denselben Hash wie{"name":"ACME","iban":"DE.."}. Beim Generieren sind alle konfigurierten Felder Pflicht (sonst400). Anwendungsfall: gleicher Lieferant/Datensatz → gleicher Fingerprint → als bereits bekannt erkennbar, ohne die Rohdaten im Klartext zu speichern.
Beispiel-Bibliothek
Konkrete Aufrufe für jede Funktion. Alle Beispiele nutzen https://ouruka.com als Basis und
$KEY als Platzhalter für deinen Tenant-API-Key.
Alle geschützten Endpunkte erwarten den Header
X-API-KEY: $KEY.
1. Authentifizierung
Jede Anfrage (außer /health und /v2/changelog) braucht deinen API-Key im Header:
curl https://ouruka.com/v2/me -H "X-API-KEY: $KEY"
Fehlt der Key oder ist er falsch, kommt 401 Unauthorized.
2. Schema anlegen (Muster)
Ein Schema ist die Schablone für eine ganze ID-Serie: Du legst das Muster einmal an, danach liefert jeder Generierungsaufruf die nächste ID daraus. Ein Schema ist nach dem Anlegen unveränderlich (ändern = löschen + neu anlegen) — so bleibt eine Nummernreihe in sich konsistent.
curl -X POST https://ouruka.com/v2/schemas \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{"name":"bestellung","pattern":"ORD-{DATE:YYYY}-{COUNTER:6}","start_value":1}'
Antwort (mit Vorschau der ersten ID, ohne den Zähler zu verbrauchen):
{ "name": "bestellung", "pattern": "ORD-{DATE:YYYY}-{COUNTER:6}", "preview": "ORD-2026-000001" }
Schemas auflisten & löschen
# Alle eigenen Schemas – inkl. Vorschau und zuletzt generierter ID
curl https://ouruka.com/v2/schemas -H "X-API-KEY: $KEY"
# Ein Schema löschen (entfernt auch dessen Zähler und History-Einträge)
curl -X DELETE https://ouruka.com/v2/schemas/bestellung -H "X-API-KEY: $KEY"
🔧 Tiefer erklärt:
GET /v2/schemasliefert je Schema zusätzlichpreview,last_generatedundlast_generated_at– gut für ein Dashboard. Da Schemas immutable sind, ist Löschen + neu anlegen der Weg, ein Pattern zu ändern; danach beginnt der Zähler wieder beimstart_value.
3. IDs generieren
Einfacher Zähler mit Datum
curl -X POST https://ouruka.com/v2/generate/bestellung -H "X-API-KEY: $KEY"
{ "id": "ORD-2026-000001" }
Der nächste Aufruf liefert ORD-2026-000002, usw.
Startwert (z. B. Migration aus Altsystem)
Schema KND-{COUNTER:5} mit "start_value": 1000 → erste ID:
{ "id": "KND-01000" }
Zähler mit Auto-Reset (Intervall)
Viele Nummernkreise sollen periodisch neu bei 1 beginnen (z. B. Rechnungsnummern pro Jahr). Genau das
macht ein Intervall-Zähler — automatisch, ohne Cron-Job oder manuellen Reset. Muster
INV-{DATE:YYYY}-{COUNTER:5:yearly} setzt den Zähler jährlich zurück:
| Zeitpunkt | Ergebnis |
|---|---|
| 2026 | INV-2026-00001, INV-2026-00002, … |
| 2027 | INV-2027-00001 (Reset) |
Unterstützte Intervalle: daily, monthly, quarterly, yearly.
Laufzeit-Variablen (mit optionalem Trenner)
Schema ART-{VAR1}-{VAR2}-{COUNTER:4}:
curl -X POST https://ouruka.com/v2/generate/artikel \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{"var1":"RED","var2":"XL"}'
{ "id": "ART-RED-XL-0001" }
Optionaler Trenner {VAR1:-}: ist die Variable leer, fallen Platzhalter und Trenner weg.
Muster ORD-{DATE:YYYY}{VAR1:-}{COUNTER:5} → mit var1=DE: ORD-2026-DE-00001, ohne: ORD-2026-00001.
Attribut-Codes aus Mapping-Tabelle
Muster {COUNTER:4}{MAP:farbe} (Tabelle farbe: weiß→101):
curl -X POST https://ouruka.com/v2/generate/artikel \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{"mappings":{"farbe":"weiss"}}'
{ "id": "0001101" }
4. Hash-Schema (deterministischer Fingerprint)
Erzeugt aus definierten Feldern immer denselben Hash – ideal zur Dubletten-Erkennung.
curl -X POST https://ouruka.com/v2/schemas \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{"name":"fingerprint","type":"hash","fields":["iban","name"],"hash_length":64}'
Generieren (alle Felder sind Pflicht; Reihenfolge egal):
curl -X POST https://ouruka.com/v2/generate/fingerprint \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{"iban":"DE12...","name":"ACME GmbH"}'
{ "id": "9f2c4a1b…" }
Gleiche Eingabe → immer gleicher 64-Zeichen-Hash. Erlaubte Längen: 16, 32, 40, 64.
5. Zufalls-IDs (UID)
Ohne Schema, rein zufällig. Zwei Varianten, Längen 16 / 32 / 64 / 128 / 256 / 512.
curl -X POST https://ouruka.com/v2/uid/numeric \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" -d '{"length":16}'
{ "id": "8391027465018273", "length": 16, "type": "numeric" }
/v2/uid/alpha liefert alphanumerische UIDs. In der History werden UIDs maskiert gespeichert
(nur die letzten 5 Zeichen sichtbar).
6. Text zu Schlüssel (Keyify)
Wandelt beliebigen Text in einen URL-/systemsicheren Schlüssel um (Umlaute umgesetzt, Sonderzeichen entfernt).
curl -X POST https://ouruka.com/v2/keyify \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{"input":"Rote Größe – XÄ 42!"}'
{ "input": "Rote Größe – XÄ 42!", "key": "Rote_Groesse_XAe_42" }
7. Mapping-Tabellen
Mit Mapping-Tabellen musst du in der Anwendung nur den Klartext-Wert kennen (z. B. „weiss") — Ouruka
setzt den hinterlegten Code (z. B. „101") beim Generieren ein. So bleiben Code-Zuordnungen zentral an
einer Stelle, statt in jedem angebundenen System gepflegt zu werden. Zentrale Nachschlagetabellen
(menschenlesbarer Wert → Code) für {MAP:...}.
# Eintrag anlegen/aktualisieren
curl -X POST https://ouruka.com/v2/mappings/farbe \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{"key":"weiss","value":"101"}'
# Alle Tabellen / Einträge einer Tabelle
curl https://ouruka.com/v2/mappings -H "X-API-KEY: $KEY"
curl https://ouruka.com/v2/mappings/farbe -H "X-API-KEY: $KEY"
# Einzelnen Eintrag / ganze Tabelle löschen
curl -X DELETE https://ouruka.com/v2/mappings/farbe/weiss -H "X-API-KEY: $KEY"
curl -X DELETE https://ouruka.com/v2/mappings/farbe -H "X-API-KEY: $KEY"
8. History (mit Pagination)
curl "https://ouruka.com/v2/history?limit=50&offset=0" -H "X-API-KEY: $KEY"
[
{ "id": "ORD-2026-000002", "schema_name": "bestellung",
"pattern_used": "ORD-{DATE:YYYY}-{COUNTER:6}",
"requested_at": "2026-07-26T10:15:03.421Z", "source_ip": "203.0.113.7" }
]
Blättern: ?limit=50&offset=50 liefert die nächste Seite.
9. Eigene Daten & Limits
curl https://ouruka.com/v2/me -H "X-API-KEY: $KEY"
{
"package": "Orbit",
"limits": { "max_schemas": 5, "monthly_ids": 2000 },
"usage": { "schemas": 2, "ids_this_month": 341 }
}
10. API-Key rotieren
Erzeugt einen neuen Key; der alte wird sofort ungültig. Neuen Key sofort sicher speichern – er erscheint nur einmal.
curl -X POST https://ouruka.com/v2/me/rotate-key -H "X-API-KEY: $KEY"
{ "status": "rotated", "api_key": "…neuer Key…", "message": "Der bisherige Key ist ab sofort ungültig." }
11. Fehlerfälle im Überblick
| Situation | Status |
|---|---|
| Kein / falscher API-Key | 401 |
| Ungültige Eingabe (z. B. unzulässige UID-Länge) | 400 |
| Limit erreicht (Schemas oder Monatskontingent) | 403 |
| Schema existiert bereits (immutable) | 409 |
| Zu viele Anfragen an öffentliche Endpunkte (60/min) | 429 |
Fehlerantworten sind JSON, z. B.:
{ "error": "Schema-Limit erreicht (5/5). Lösche ein bestehendes Schema oder wechsle das Paket." }
Zufalls-IDs (UID)
Manchmal willst du keine sprechende Nummer, sondern einfach einen eindeutigen Zufallscode – z. B. für Tokens, Gutschein-PINs oder anonyme Kennungen. Genau dafür sind UIDs: rein zufällig, ohne Datum oder Zähler.
🔧 Tiefer erklärt: UIDs tragen keine Semantik und brauchen kein Schema. Sie werden aus kryptografischem Zufall erzeugt; je länger, desto kleiner die (ohnehin winzige) Kollisionswahrschein- lichkeit. UIDs zählen zum monatlichen ID-Kontingent und werden in der History maskiert gespeichert (nur die letzten 5 Zeichen sichtbar) – so taucht ein sensibler Code nie vollständig im Log auf.
Erlaubte Längen: 16, 32, 64, 128, 256, 512. (Andere Werte → 400 Bad Request.)
Numerische UIDs — POST /v2/uid/numeric
Nur Ziffern (0–9) – gut, wenn Menschen den Code am Telefon durchgeben oder er in ein Zahlenfeld muss.
curl -X POST https://ouruka.com/v2/uid/numeric \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" -d '{"length":16}'
{ "id": "8391027465018273", "length": 16, "type": "numeric" }
| Einsatz | Länge | Beispiel |
|---|---|---|
| Gutschein-PIN | 16 | 7392048117263540 |
| Support-Ticket-Referenz | 16 | 4410298356170022 |
| Barcode-Basis | 32 | 82940173625481930274615098… |
Alphanumerische UIDs — POST /v2/uid/alpha
Buchstaben + Ziffern (a–z, A–Z, 0–9) – kompakter und „unratbarer" bei gleicher Länge.
curl -X POST https://ouruka.com/v2/uid/alpha \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" -d '{"length":32}'
| Einsatz | Länge | Beispiel |
|---|---|---|
| Session-Token | 32 | aX7kP2mRnQz9wLvBcT4eYdJ0hF6sN1uG |
| Anonymisierungs-ID (Studie) | 16 | Kf3mX9pLrT2nVqBw |
| API-/Webhook-Secret | 64 | Zp3… (64 Zeichen) |
🔧 Tiefer erklärt: Der alphanumerische Zeichenraum ist deutlich größer als der numerische – eine 16-stellige Alpha-UID ist damit weit „stärker" als eine 16-stellige Numeric-UID. Faustregel: numerisch für menschenfreundliche Codes, alphanumerisch für technische Schlüssel/Tokens. Für sicherheitskritische Secrets eher 64+ wählen.
String-Konvertierung (Keyify)
Keyify macht aus beliebigem Text einen sauberen, system-sicheren Schlüssel – z. B. aus einem Produktnamen einen technischen Bezeichner. Ein kleines, aber praktisches Werkzeug.
🔧 Tiefer erklärt: Keyify ist zustandslos (kein Schema, keine gespeicherte ID) und dient dazu, aus redaktionell gepflegten Klartexten konsistente, wiederholbare Schlüssel zu erzeugen – etwa für Datenbankschlüssel, interne Codes oder als Baustein vor der eigentlichen ID-Erzeugung. Gleiche Eingabe ergibt immer denselben Schlüssel.
POST /v2/keyify (auth-pflichtig).
Was passiert
- Leerzeichen → Unterstrich (
_) - Deutsche Umlaute aufgelöst:
ä→ae,ö→oe,ü→ue,Ä→Ae,Ö→Oe,Ü→Ue,ß→ss - sonstige Sonderzeichen werden entfernt
- Groß-/Kleinschreibung bleibt erhalten
- mehrfache Unterstriche werden zusammengefasst
curl -X POST https://ouruka.com/v2/keyify \
-H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{"input":"Rote Größe – XÄ 42!"}'
{ "input": "Rote Größe – XÄ 42!", "key": "Rote_Groesse_XAe_42" }
Beispiele (bunt gemischt)
| Eingabe | Ergebnis |
|---|---|
Schwarze Lederjacke Größe XL |
Schwarze_Lederjacke_Groesse_XL |
Kühlschränke & Gefriergeräte |
Kuehlschraenke_Gefriergeraete |
Sportartikel / Outdoor |
Sportartikel_Outdoor |
Müller & Söhne GmbH |
Mueller_Soehne_GmbH |
Rote Größe – XÄ 42! |
Rote_Groesse_XAe_42 |
🔧 Tiefer erklärt: Deutsche Umlaute und
ßwerden gezielt transliteriert (ä→ae,ß→ss, …); übrige Sonderzeichen werden – soweit möglich auf einen Grundbuchstaben abgebildet, sonst – entfernt. Der Schlüssel besteht am Ende ausschließlich ausA–Z,a–z,0–9und_. Wer klein geschriebene URL-Slugs mit Bindestrichen braucht, wandelt das Ergebnis nachgelagert um – Keyify ist bewusst auf technische Schlüssel (Groß/Klein erhaltend, Unterstriche) ausgelegt.
History
Ouruka merkt sich jede erzeugte ID – so kannst du jederzeit nachschauen, welche IDs wann generiert wurden. Praktisch für Audits, Fehlersuche und Kontrollen auf Vollständigkeit.
🔧 Tiefer erklärt: Die History wird pro Tenant geführt und ist über die REST-API abrufbar. Sie ist ein Komfort-/Nachweis-Feature, kein Langzeitarchiv: Aufbewahrungsdauer und maximale Zeilenzahl hängen vom Paket ab, ältere Einträge werden automatisch bereinigt. Wer IDs dauerhaft braucht, ruft sie regelmäßig ab und speichert sie im eigenen System.
Pro Eintrag gespeichert:
- die generierte ID (UIDs werden maskiert, nur die letzten 5 Zeichen sichtbar),
- Schema-Name und verwendetes Pattern,
- Zeitstempel der Generierung (UTC),
- Quell-IP.
Abruf mit Pagination
curl "https://ouruka.com/v2/history?limit=50&offset=0" -H "X-API-KEY: $KEY"
[
{ "id": "ORD-2026-000002", "schema_name": "bestellung",
"pattern_used": "ORD-{DATE:YYYY}-{COUNTER:6}",
"requested_at": "2026-07-26T10:15:03.906071Z", "source_ip": "203.0.113.7" }
]
limit: Anzahl Einträge (Standard 50, Maximum 200).offset: überspringt die ersten N Einträge –?limit=50&offset=50liefert die zweite Seite.- Sortierung: neueste zuerst.
🔧 Tiefer erklärt: Für lange Listen kombinierst du
limitundoffsetzum seitenweisen Laden („unendliches Scrollen"): Seite 1 =offset=0, Seite 2 =offset=50, usw. Diesource_ipist die echte Client-IP (ausX-Forwarded-Forhinter dem Reverse-Proxy); Zeitstempel sind mikrosekunden-genau in UTC – zum Anzeigen ggf. in die lokale Zeitzone umrechnen.
Pakete & Limits
Jedes Konto hat ein Paket, das festlegt, wie viel du nutzen darfst – wie viele Schemas, wie viele IDs pro Monat usw. Vom kostenlosen Test bis zum großen Paket ist alles klar gestaffelt.
🔧 Tiefer erklärt: Limits werden serverseitig durchgesetzt. Der monatliche Verbrauch wird in Redis gezählt und zu Monatsbeginn zurückgesetzt; Schema- und Mapping-Limits gegen den aktuellen Bestand geprüft. Wird ein Limit erreicht, kommt eine klare
403-Antwort mit Hinweis – die Generierung schlägt also kontrolliert fehl, statt still Daten zu verlieren.
Jeder Tenant gehört zu einem Paket mit definierten Kontingenten.
| Paket | Schemas | IDs/Monat | Mapping-Tabellen | Besonderheit |
|---|---|---|---|---|
| Discovery | 2 | 250 | 1 | 14-tägiger Testzeitraum |
| Orbit | 5 | 2.000 | 1 | — |
| Galaxy | 10 | 5.000 | 2 | — |
| Universe | 20 | 10.000 | 5 | — |
Der monatliche ID-Verbrauch wird automatisch getrackt und zu Monatsbeginn zurückgesetzt.
Eigenen Verbrauch abrufen
curl https://ouruka.com/v2/me -H "X-API-KEY: $KEY"
{
"package": "Orbit",
"limits": { "max_schemas": 5, "monthly_ids": 2000, "max_mapping_tables": 1, "max_mapping_entries": 50 },
"usage": { "schemas": 2, "ids_this_month": 341, "mapping_tables": 1 }
}
Was passiert am Limit?
- Schema-Limit erreicht →
POST /v2/schemasantwortet mit403und Hinweis. - Monatliches ID-Limit erreicht →
POST /v2/generate/...antwortet mit403. - Fehlerantworten sind JSON, z. B.:
{ "error": "Monatliches ID-Limit erreicht (2000/2000).",
"upgrade_hint": "Upgrade auf Galaxy für mehr Kontingent." }
Die aktuellen Paketdetails und Preise stehen auf https://ouruka.com.
Sicherheit & Compliance
Dieses Kapitel beschreibt die technisch umgesetzten Sicherheitsmaßnahmen von Ouruka. Es ist eine faktische Beschreibung der Kontrollen im Quellcode und Betrieb – keine Zusicherung einer formalen Zertifizierung (z. B. ISO 27001, SOC 2). Wo Compliance-Rahmenwerke genannt werden, geht es um die Abbildung einzelner Anforderungen durch konkrete Maßnahmen.
Übertragungssicherheit
Der gesamte Verkehr läuft über HTTPS/TLS. Unverschlüsselte Verbindungen werden nicht bedient.
Warum kein „Ende-zu-Ende" – und warum das hier richtig so ist
Ende-zu-Ende-Verschlüsselung (E2E) kennt man von Messengern wie WhatsApp: Eine Nachricht wird auf dem Gerät des Absenders verschlüsselt und erst auf dem Gerät des Empfängers wieder lesbar – der Anbieter dazwischen sieht nur Kauderwelsch. Das funktioniert, weil ein Messenger nur ein Bote ist: Er trägt den versiegelten Umschlag weiter, ohne den Inhalt je kennen zu müssen.
Ouruka ist kein Bote, sondern ein Bäcker: Seine Aufgabe ist es, die ID auszurechnen – Muster lesen, Zähler hochzählen, Datum und Variablen zusammensetzen. Dafür muss der Dienst die Zutaten verstehen und das Ergebnis im Klartext erzeugen. Ein Bäcker, der die Zutaten nicht sehen darf, kann nicht backen – und ein ID-Dienst, der die Eingaben nicht lesen darf, kann keine strukturierte ID bauen. E2E ist für diese Art von Dienst also das falsche Werkzeug – nicht aus Bequemlichkeit, sondern prinzipbedingt.
Wichtiger ist, was tatsächlich schützt – und genau das ist umgesetzt bzw. verfügbar:
| Schutz | Was er bewirkt | bei Ouruka |
|---|---|---|
| TLS (Transport) | abhörsicher auf dem Weg zwischen dir und dem Dienst | ✅ immer |
| Zugangsdaten gehasht | selbst ein Datenbank-Diebstahl gibt keine nutzbaren Keys preis | ✅ (SHA-256) |
| Datensparsamkeit | Unnötiges wird gar nicht erst gespeichert | ✅ kein Passwort-System, UID-Maskierung |
| Löschung auf Wunsch | Daten sind vollständig entfernbar | ✅ kaskadierende Tenant-Löschung |
| Verschlüsselung „at rest" | gestohlene Datenträger bleiben unlesbar | Infrastruktur-Option |
Kurz: Für einen rechnenden Dienst wie Ouruka ist nicht „der Server darf nichts sehen" das Ziel, sondern „so wenig wie möglich – sicher übertragen, sicher aufbewahrt, jederzeit löschbar". Genau das leisten wir.
Authentifizierung & Zugangsdaten
- API-Keys werden niemals im Klartext gespeichert, sondern ausschließlich als SHA-256-Hash. Der Roh-Key wird genau einmal (bei Erstellung bzw. Rotation) ausgegeben und danach nie wieder. Selbst ein Lesezugriff auf die Datenbank gäbe keine nutzbaren Schlüssel preis.
- Der administrative Master-Key wird timing-sicher verglichen
(
crypto/subtle.ConstantTimeCompare) – das verhindert das schrittweise Erraten per Zeitmessung. - Der Master-Key existiert nur als Umgebungsvariable auf dem Server – nie im Quellcode oder im Repository – und wird nicht in Logs geschrieben.
- Keine Standard-/Hardcoded-Zugangsdaten: Ohne korrekt gesetzte Konfiguration (DB, Redis, Master-Key) startet der Dienst nicht. Es gibt keine „vergessenen" Hintertüren.
Berechtigungen & Missbrauchsschutz
- Zwei getrennte Ebenen: Tenant-Key (
X-API-KEY) nur für die eigenen Daten, Master-Key (X-MASTER-KEY) für administrative Vorgänge. Kunden können sich nicht selbst registrieren. - Privilegien-Grenze: Das interne Sonderpaket ohne Limits ist über die API nicht vergebbar
(Antwort
403) – ausschließlich manuell im Backend. - Rate-Limiting öffentlicher Endpunkte (60 Anfragen/Minute/IP) gegen Missbrauch und Überlastung.
- Key-Rotation als Reaktion auf kompromittierte Schlüssel: neuer Key sofort gültig, alter sofort ungültig – ohne Ausfallzeit.
Datenintegrität
- Zähler werden über ein atomares Redis-Verfahren erhöht – auch bei massiver Nebenläufigkeit wird jeder Wert nur einmal vergeben (im Lasttest: 500.000 IDs, 0 Duplikate).
- Schemas sind unveränderlich – eine laufende Nummernserie kann nicht nachträglich umdefiniert werden.
- Eingaben werden validiert (z. B. erlaubte UID-/Hash-Längen, Muster, Mapping-Schlüssel).
Datenschutz (Privacy by Design)
- Datenminimierung: Kein Benutzername/Passwort-System; der API-Key ist zugleich Identität. Es werden keine unnötigen personenbezogenen Daten erhoben.
- Maskierung: Zufalls-UIDs werden in der History nur maskiert gespeichert (letzte 5 Zeichen sichtbar).
- Recht auf Löschung: Beim Löschen eines Tenants werden alle zugehörigen Daten (Schemas, History, Zähler, Mappings) kaskadierend entfernt.
- Zeitstempel werden konsistent in UTC gespeichert.
Nachvollziehbarkeit (Auditability)
- Jede Anfrage erhält eine eindeutige
X-Request-ID, die in strukturierten JSON-Logs erscheint – Grundlage für Fehleranalyse, Monitoring und Audits.
Abbildung auf gängige Anforderungen
Die obigen Maßnahmen adressieren u. a. folgende, häufig geprüfte Prinzipien (ohne Anspruch auf Vollständigkeit oder Zertifizierung):
| Prinzip | Umsetzung bei Ouruka |
|---|---|
| Vertraulichkeit der Zugangsdaten | Keys nur gehasht (SHA-256), Master-Key timing-sicher, nie im Code |
| Verschlüsselung der Übertragung | HTTPS/TLS |
| Datenminimierung (DSGVO Art. 5) | kein Passwort-System, keine unnötigen personenbezogenen Daten |
| Recht auf Löschung (DSGVO Art. 17) | kaskadierende Tenant-Löschung |
| Integrität & Verfügbarkeit | atomare Zähler, Rate-Limiting, fail-open bei Cache-Ausfall |
| Protokollierung/Auditierbarkeit | Request-IDs + strukturierte Logs |
FAQ
Sind die IDs wirklich eindeutig?
Ja. Ouruka garantiert Eindeutigkeit innerhalb eines Schemas (Schema-IDs) bzw. innerhalb eines Tenants (UIDs). Zähler werden atomar inkrementiert – auch bei parallelen Anfragen wird jeder Zählerwert nur einmal vergeben. Belegt durch Lasttests: 500.000 IDs unter Volllast, 0 Duplikate.
Was passiert, wenn zwei Systeme gleichzeitig eine ID anfordern?
Ouruka nutzt eine atomare Zähler-Operation (Redis-Lua-Script), die Race Conditions ausschließt. Selbst zwei Anfragen in derselben Millisekunde erhalten unterschiedliche, eindeutige IDs.
Kann ich den Zähler zurücksetzen?
Es gibt keinen separaten Reset-Endpunkt. Für periodisches Zurücksetzen nutzt du einen
Intervall-Zähler ({COUNTER:N:yearly} etc.) – der setzt sich automatisch zurück. Ein einmaliger
Reset ist über Schema löschen + neu anlegen möglich (der Zähler startet dann wieder beim
start_value). Achtung: Bei unverändertem Pattern können dabei bereits vergebene Werte erneut
entstehen – in dem Fall zusätzlich das Pattern anpassen (z. B. Jahresteil oder festes Präfix).
Was ist der Unterschied zwischen Schema-IDs und UIDs?
Schema-IDs folgen einem selbst definierten Pattern und können lesbare Informationen tragen (Datum, Zähler, Variablen) – ideal für Beleg- oder Produktnummern. UIDs sind rein zufällig und bedeutungsfrei – ideal für technische Schlüssel und Tokens.
Wie sicher ist der API-Key?
Übertragung nur über HTTPS; Keys werden nie im Klartext gespeichert (nur als SHA-256-Hash); der Vergleich läuft timing-sicher. Bei Verdacht auf Kompromittierung lässt sich der Key sofort rotieren. Key stets außerhalb des Quellcodes aufbewahren.
Kann ich mehrere Schemas haben?
Ja, je nach Paket. Jedes Schema hat einen eigenen unabhängigen Zähler, eigene History und eigenes Pattern – typischerweise ein Schema pro Dokumententyp (Bestellungen, Rechnungen, Kunden …).
Was passiert, wenn ein Variablen-Wert leer ist?
Der Platzhalter wird durch einen leeren String ersetzt; bei Separator-Syntax ({VAR1:-}) fällt auch der
Trenner weg – keine doppelten Trennzeichen. Datums-Platzhalter sind nie leer (immer Systemdatum).
Wie hoch ist die Performance?
ID-Generierung wird typischerweise im zweistelligen bis niedrigen dreistelligen Millisekundenbereich beantwortet; im Lasttest wurden 1.000+ IDs/Sekunde bei 0 Fehlern und 0 Duplikaten gemessen. Für konkrete SLA-Anforderungen den Support kontaktieren.
Lässt sich Ouruka einfach integrieren?
Ja. Standard-REST-API mit JSON – nur HTTP-Requests nötig, keine SDK-Abhängigkeiten, keine proprietären Protokolle. Jede Sprache, die HTTP kann, ist kompatibel (Python, Java, PHP, JavaScript …), ebenso Low-Code-Plattformen wie Make oder Zapier.
API-Referenz (Swagger)
Die vollständige, maschinenlesbare API-Referenz ist interaktiv verfügbar unter:
https://ouruka.com/swagger/
Dort findest du:
- Alle Endpunkte mit Methoden, Pfaden und Beschreibungen.
- Request-/Response-Schemas inkl. Datentypen und Pflichtfeldern.
- Interaktives Testen direkt im Browser – auf „Authorize" klicken,
X-API-KEYeintragen, Endpunkte ausprobieren. - Fehlercodes und ihre Bedeutung.
Endpunkt-Überblick
| Methode | Pfad | Zweck |
|---|---|---|
GET |
/health |
Status (öffentlich) |
GET |
/v2/changelog |
Versionshistorie (öffentlich) |
GET |
/v2/me |
Tenant-Info, Limits, Verbrauch |
POST |
/v2/me/rotate-key |
Eigenen API-Key rotieren |
POST / GET / DELETE |
/v2/schemas … |
Schemas verwalten |
POST |
/v2/generate/{schema} |
ID generieren |
GET |
/v2/history |
History (Pagination) |
POST |
/v2/uid/numeric · /v2/uid/alpha |
Zufalls-IDs |
POST |
/v2/keyify |
Text → Schlüssel |
POST / GET / DELETE |
/v2/mappings/... |
Mapping-Tabellen |
Open-Source-Komponenten & Audit
Diese Übersicht dient als Software Bill of Materials (SBOM) und als Ausgangspunkt für einen Open-Source-Audit. Sie listet alle Dritt-Komponenten, aus denen Ouruka besteht bzw. die es zur Laufzeit nutzt, samt Version und Lizenz.
Hinweis zur Verbindlichkeit: Die Lizenzangaben entsprechen dem allgemeinen Kenntnisstand zu den jeweiligen Projekten. Für ein formales Audit sollte zusätzlich ein automatischer Lizenz-/SBOM-Scan laufen (siehe Reproduzieren) und im Zweifel die jeweilige
LICENSE-Datei geprüft werden.
Die Applikation selbst
| Merkmal | Wert |
|---|---|
| Name / Modul | Ouruka ID Service (id-service) |
| Sprache / Toolchain | Go 1.25 (Toolchain 1.26), Standardbibliothek unter BSD-3-Clause |
| Lizenz der Applikation | proprietär (kein Open-Source-Release) – erzeugt selbst keine OSS-Pflichten |
| Architektur | Monolith (net/http, kein Framework) + PostgreSQL + Redis, Docker |
In das Service-Binary kompilierte Go-Module
Ermittelt aus dem gebauten Binary (go version -m) – das ist die verbindliche Laufzeit-Stückliste.
| Komponente | Version | Zweck | Lizenz |
|---|---|---|---|
github.com/lib/pq |
v1.11.2 | PostgreSQL-Treiber | MIT |
github.com/redis/go-redis/v9 |
v9.18.0 | Redis-Client | BSD-2-Clause |
github.com/cespare/xxhash/v2 |
v2.3.0 | Hash (Redis-Client-Dep) | MIT |
github.com/dgryski/go-rendezvous |
(pseudo) | Hashing (Redis-Client-Dep) | MIT |
go.uber.org/atomic |
v1.11.0 | Atomics | MIT |
github.com/swaggo/http-swagger |
v1.3.4 | Swagger-UI-Handler | MIT |
github.com/swaggo/files |
v1.0.1 | Swagger-UI-Assets | MIT |
github.com/swaggo/swag |
v1.16.6 | Swagger-Spec | MIT |
github.com/go-openapi/spec |
v0.20.6 | OpenAPI-Spec | Apache-2.0 |
github.com/go-openapi/jsonpointer |
v0.19.5 | OpenAPI | Apache-2.0 |
github.com/go-openapi/jsonreference |
v0.20.0 | OpenAPI | Apache-2.0 |
github.com/go-openapi/swag |
v0.19.15 | OpenAPI | Apache-2.0 |
github.com/KyleBanks/depth |
v1.2.1 | Swag-Dep | MIT |
github.com/josharian/intern |
v1.0.0 | JSON-Dep | MIT |
github.com/mailru/easyjson |
v0.7.6 | JSON | MIT |
golang.org/x/net |
v0.34.0 | Netzwerk | BSD-3-Clause |
golang.org/x/mod |
v0.17.0 | Modul-Parsing | BSD-3-Clause |
golang.org/x/tools |
(pseudo) | Tooling | BSD-3-Clause |
gopkg.in/yaml.v2 |
v2.4.0 | YAML | Apache-2.0 |
Funktional relevant zur Laufzeit sind primär lib/pq und redis/go-redis; der Rest bedient den eingebetteten
/swagger/-Endpunkt. Nur zur Entwicklung/Test (nicht im Binary):stretchr/testify,bsm/ginkgo,bsm/gomega,google/go-cmp.
Container-Images (Betrieb)
| Image | Konkrete Version | Rolle | Lizenz-Hinweis |
|---|---|---|---|
golang:1.25-alpine |
— | Build (Multi-Stage) | Go: BSD-3; nur Build, nicht im Auslieferungs-Image |
alpine:3.21 |
— | Laufzeit-Basis | musl (MIT), BusyBox (GPLv2), apk-tools (GPLv2) – Basis-OS, unverändert genutzt |
postgres:16-alpine |
PostgreSQL 16.13 | Datenbank | PostgreSQL License (permissiv, BSD/MIT-artig) |
redis:7-alpine |
Redis 7.4.8 | Cache / Zähler | ⚠️ RSALv2 / SSPLv1 (siehe Befund) |
Drittsysteme (Betrieb)
- PostgreSQL 16 – persistente Speicherung. Lizenz: PostgreSQL License (permissiv).
- Redis 7.4 – atomare Zähler und Rate-Limit-Buckets. Lizenz: RSALv2/SSPLv1 (siehe Befund).
- Reverse-Proxy / TLS-Terminierung (Infrastruktur, außerhalb dieses Repos).
Befunde für den Auditor
- ⚠️ Redis 7.4.8 ist nicht mehr OSI-Open-Source. Ab Redis 7.4 gilt die duale Lizenz
RSALv2 / SSPLv1 (source-available). Für den reinen Eigenbetrieb als Abhängigkeit ist das i. d. R.
unkritisch, ein OSS-Audit wird es aber als Nicht-OSS-Komponente kennzeichnen.
Entscheidung: Ouruka setzt bewusst weiter auf Redis – für den Eigenbetrieb erlaubt und kostenlos.
Sollte je eine strikte „nur OSI-Open-Source"-Anforderung bestehen, gäbe es zwei einfache Alternativen
(
redis:7.2-alpine, noch BSD-3-Clause, oder der kompatible Fork Valkey); beide werden aktuell nicht benötigt. - Alpine-Basis enthält GPLv2-Komponenten (BusyBox, apk-tools). Sie werden als unveränderte Betriebssystem-Basis genutzt und nicht in die Applikation gelinkt – Standardpraxis, aber auflisten.
- Alle in das Binary kompilierten Go-Module sind permissiv (MIT / BSD / Apache-2.0). Kein Copyleft (GPL/LGPL) im Applikations-Binary.
- Versions-Pinning:
redis:7,postgres:16folgen dem Major-Tag (floaten innerhalb Major). Für ein Audit exakte Versionen bzw. Image-Digests festschreiben.
In Klartext: warum wir den Redis-Punkt offen zeigen
Wir könnten diesen Punkt verstecken – tun wir bewusst nicht. Offenheit ist für uns ein Qualitätsmerkmal, kein Risiko.
Redis ist ein fertiger Baustein eines anderen Herstellers, den Ouruka als schnelles „Zählwerk" nutzt. Jede Software kommt mit einer Lizenz – den Spielregeln der Nutzung. Redis hatte lange die freizügigste Sorte (jeder darf alles). 2024 haben die Macher die Regeln ab Version 7.4 geändert: jetzt „source-available" – der Code bleibt einsehbar und für den Eigenbetrieb weiterhin kostenlos und erlaubt, gilt aber offiziell **nicht mehr als „echtes Open Source". Die Einschränkung zielt auf große Cloud-Anbieter, die Redis als eigenen Bezahldienst weiterverkaufen – nicht auf Nutzer wie uns.
Bild dazu: Ein Spezial-Ofen im Restaurant, dessen Hersteller die Bedingungen von „benutz ihn frei" auf „benutzen ja – aber kein Ofen-Vermietgeschäft damit" ändert. Fürs Kochen ändert sich nichts; ein Prüfer notiert den Punkt trotzdem.
Für uns bedeutet das: erlaubt, kostenlos, im Betrieb unproblematisch. Ein formaler OSS-Audit markiert die Komponente zwar als „kein Standard-Open-Source" – wir setzen aber bewusst weiter auf Redis und legen den Punkt hier offen dar. Falls je eine strikte „nur OSI-Open-Source"-Anforderung aufkommt, gibt es mit Valkey (technisch austauschbarer Fork) oder Redis 7.2 zwei einfache Wege – aktuell nicht nötig.
Reproduzieren des SBOMs
# Laufzeit-Stückliste des Binaries (verbindlich):
go build -o /tmp/ouruka . && go version -m /tmp/ouruka
# Vollständiger Modulgraph:
go list -m all
# Konkrete Dienst-Versionen im Betrieb:
docker exec ouruka-postgres postgres --version
docker exec ouruka-redis redis-server --version
Empfohlen für ein formales Audit (nicht im Repo installiert): eine maschinenlesbare SBOM erzeugen,
z. B. mit cyclonedx-gomod mod -json (CycloneDX) oder syft bzw. trivy für Go und Container-Images,
sowie ein Lizenz-Scan mit go-licenses report ./....