Plattform-Rückgrat (Option A): Laufrollen api/worker/job, Ereignis-Outbox, CronJobs, Kustomize #13

Closed
opened 2026-10-16 05:58:04 +00:00 by Nick.Rosenloecher · 0 comments
Owner

Ziel

ApiCore läuft aus einem Image in drei Rollen (api, worker, job) mit gemeinsamer Datenbank. Fachliche Folgen hängen an einer dauerhaften Outbox (DomainEvent), zeitgesteuerte Arbeit läuft als Kubernetes-CronJob, Rate-Limits gelten über alle Pods, Schlüssel sind je Zweck getrennt, und deploy/k8s ist wieder die Quelle der Wahrheit. Das ist die vom Inhaber am 2026-10-12 gewählte Option A („beste Option für Sicherheit und Ressourcenersparnis“).

Umgesetzt

Alle 26 Tasks des Plans, in zwei Checkpoint-Commits c01a3883 (2026-10-13) und cdd30cf3 (2026-10-14), gemergt mit 7097fcd9:

  • Laufrollen und Startprüfungen, dist/main.js, dist/worker.js, dist/cli.js (Tasks 1, 6)
  • Outbox DomainEvent/DomainEventDelivery, Dispatcher, Worker-Takt mit LISTEN und Health auf Port 3002 (Tasks 2–5)
  • Webhook-Zustellung mit Wiederholung und Zustellprotokoll WebhookDelivery (Task 7)
  • Kalender, Aufgaben und Automationen als Handler, alle Erzeuger umgestellt (Tasks 8–14)
  • Jobs als CronJobs mit JobRun: cleanup, task-templates, app-backup, daily-evaluation, rekey (Tasks 15–18, 21)
  • Throttler über die Datenbank (ThrottlerHit), Schlüsselbund mit getrennten Schlüsseln (Tasks 19, 20)
  • Herkunftsseite ohne genauen Standort, Shop-Schlüssel getrennt nach Lesen und Buchen (Tasks 22, 23)
  • System-API und Seite „Verwaltung > System“ (Tasks 24, 25)
  • Kustomize mit base, components (network-policies, pod-hardening, backend-roles, api-hpa), overlays/encry, Dockerfiles und CI manifests.yml (Task 26)
  • Gates laut Memory: 1909 Unit, 471 e2e, 929 Frontend grün

Offen

  • Ausrollen nach Runbook (Schritte 0–5), jeweils mit Freigabe: #28

Offene Entscheidungen

Keine. Entschieden: kein Schnitt nach Fachdomänen (Rückverfolgungskette bleibt relational), kein Message-Broker, kein eigener Pod für die Herkunftsseite (Cloudflare-Cache), CronJobs statt @Cron, Rate-Limit-Zähler in Postgres statt Redis.

Grundlage

docs/superpowers/specs/2026-10-12-plattform-rueckgrat-und-fahrplan-design.md, docs/superpowers/plans/2026-10-13-plattform-rueckgrat.md, ARCHITECTURE.md Abschnitte 7 und 10.

Status

Code: ja · Geprüft: ja · Gemergt: ja · Produktiv: nein
Stand: 2026-10-16 (Quelle: git origin/main b48fb157, Cluster-Abfrage 2026-10-16, Session-Status vs-code-ff, Memory)

## Ziel ApiCore läuft aus einem Image in drei Rollen (`api`, `worker`, `job`) mit gemeinsamer Datenbank. Fachliche Folgen hängen an einer dauerhaften Outbox (`DomainEvent`), zeitgesteuerte Arbeit läuft als Kubernetes-CronJob, Rate-Limits gelten über alle Pods, Schlüssel sind je Zweck getrennt, und `deploy/k8s` ist wieder die Quelle der Wahrheit. Das ist die vom Inhaber am 2026-10-12 gewählte Option A („beste Option für Sicherheit und Ressourcenersparnis“). ## Umgesetzt Alle 26 Tasks des Plans, in zwei Checkpoint-Commits c01a3883 (2026-10-13) und cdd30cf3 (2026-10-14), gemergt mit 7097fcd9: - [x] Laufrollen und Startprüfungen, `dist/main.js`, `dist/worker.js`, `dist/cli.js` (Tasks 1, 6) - [x] Outbox `DomainEvent`/`DomainEventDelivery`, Dispatcher, Worker-Takt mit LISTEN und Health auf Port 3002 (Tasks 2–5) - [x] Webhook-Zustellung mit Wiederholung und Zustellprotokoll `WebhookDelivery` (Task 7) - [x] Kalender, Aufgaben und Automationen als Handler, alle Erzeuger umgestellt (Tasks 8–14) - [x] Jobs als CronJobs mit `JobRun`: `cleanup`, `task-templates`, `app-backup`, `daily-evaluation`, `rekey` (Tasks 15–18, 21) - [x] Throttler über die Datenbank (`ThrottlerHit`), Schlüsselbund mit getrennten Schlüsseln (Tasks 19, 20) - [x] Herkunftsseite ohne genauen Standort, Shop-Schlüssel getrennt nach Lesen und Buchen (Tasks 22, 23) - [x] System-API und Seite „Verwaltung > System“ (Tasks 24, 25) - [x] Kustomize mit `base`, `components` (network-policies, pod-hardening, backend-roles, api-hpa), `overlays/encry`, Dockerfiles und CI `manifests.yml` (Task 26) - [x] Gates laut Memory: 1909 Unit, 471 e2e, 929 Frontend grün ## Offen - [ ] Ausrollen nach Runbook (Schritte 0–5), jeweils mit Freigabe: #28 ## Offene Entscheidungen Keine. Entschieden: kein Schnitt nach Fachdomänen (Rückverfolgungskette bleibt relational), kein Message-Broker, kein eigener Pod für die Herkunftsseite (Cloudflare-Cache), CronJobs statt `@Cron`, Rate-Limit-Zähler in Postgres statt Redis. ## Grundlage `docs/superpowers/specs/2026-10-12-plattform-rueckgrat-und-fahrplan-design.md`, `docs/superpowers/plans/2026-10-13-plattform-rueckgrat.md`, `ARCHITECTURE.md` Abschnitte 7 und 10. ## Status Code: ja · Geprüft: ja · Gemergt: ja · Produktiv: nein Stand: 2026-10-16 (Quelle: git origin/main b48fb157, Cluster-Abfrage 2026-10-16, Session-Status vs-code-ff, Memory)
Nick.Rosenloecher added the art/technikprio/hochstatus/erledigt labels 2026-10-16 05:58:05 +00:00
Sign in to join this conversation.