content-distribution-source — TYPO3 pusht TYPO3, signiert, replay-sicher.
Eine zentrale Editorial-TYPO3 („source") pushed Inhalte an n downstream-TYPO3-Instanzen („targets"). Redakteur·innen arbeiten weiter im gewohnten Backend; die Distribution triggert auf Workspace-zu-Live-Publish, signiert die Payload mit Ed25519 und liefert einen DAG-strukturierten Snapshot — referenziert per UUIDv7, nie per TYPO3-UID. Der Companion moselwal/content-distribution-receiver empfängt und schreibt ins lokale Schema.
Warum ein eigenes Paket
moselwal/semantic-delivery verteilt Content an externe Kanäle — LinkedIn, Buffer, n8n, generische Webhooks. Es weiß nichts über:
- mehrere TYPO3-Instanzen als Peers
- Workspace-Publish-Trigger
- TYPO3-native Record-Snapshots (pages plus tt_content plus FAL)
- per-Sprache-lokale Edits auf der Receiver-Seite
content-distribution-source füllt genau diese Lücke. Es reused den SSRF-sicheren URL-Validator, die Ed25519-Key-Infrastruktur aus moselwal/content-provenance und die Rate-Limit- und Nonce-Patterns aus moselwal/webmcp.
Voraussetzungen
- TYPO3 14.x
- Composer-Paket
moselwal/content-distribution-source - Optional:
moselwal/content-provenancefür Vault-basierte Key-Provider,moselwal/structured-contentfür Relations und Annotationen
Transport, Authentifizierung und Scope
Transport — hybrid push plus pull
- Push-Ping: Auf Workspace-zu-Live-Publish sendet die Source einen kleinen signierten Webhook an jeden abonnierten Target und kommuniziert, was sich geändert hat.
- Pull-Fetch: Das Target authentifiziert sich zurück zum Source-Pull-Endpoint und lädt den vollständigen DAG-Snapshot.
- Ack: Das Target bestätigt; die Source markiert den Outbox-Eintrag als
acked.
Snapshots referenzieren alle Records per origin_uuid (UUIDv7) — nie per TYPO3-UID. Das lässt den Receiver Foreign-Keys gegen seinen eigenen ID-Space auflösen, ohne dass die UIDs zwischen den Instanzen kollidieren.
Workspace-Integration
Distribution wird nur getriggert, wenn ein Record im TYPO3-Workspace zu live gestaged wird. Drafts lecken nie. Der Trigger ist ein TYPO3-14-Event-Listener mit DataHandler-Hook als Fallback.
Authentifizierung
- Bearer-Token pro Target (preshared, verschlüsselt gespeichert)
- Ed25519-Signatur über Canonical-JSON (RFC 8785) des Payload-Headers. Keys werden vom
KeyProviderInterfaceausmoselwal/content-provenanceverwaltet — file-based oder Vault-backed, rotierbar. - Replay-Protection über Nonce plus Timestamp; Receiver cachen Nonces für 600 s und lehnen Drift > ±300 s ab.
Scope — was out of the box distributiert wird
pagesmit allentt_content-Kindernsys_file_referenceplussys_file(Binär-Inhalt per signierter URL nachgeladen, nie inline)sys_file_metadata,sys_category- Custom-Tabellen — pro Site über
settings.yamlregistriert - Optional: structured-content-Relations und -Annotationen
Installation, Quickstart und Commands
Installation
composer require moselwal/content-distribution-source
vendor/bin/typo3 extension:setup
Schema-Migrationen ergänzen origin_uuid-Spalten an pages, tt_content, sys_file* sowie die Package-Tabellen tx_cdsource_target und tx_cdsource_outbox.
Quickstart
# Ein Target registrieren
vendor/bin/typo3 cdsource:targets:add \
--label="Production EN" \
--base-url="https://en.example.com" \
--subscribed-tables="pages,tt_content,sys_file_reference" \
--subscribed-languages="0,1"
# Outbox abarbeiten (per cron oder scheduler)
vendor/bin/typo3 cdsource:outbox:process
CLI-Commands
| Command | Zweck |
|---|---|
cdsource:targets:list | Konfigurierte Targets listen |
cdsource:targets:add | Target-Instanz registrieren |
cdsource:targets:test | Probe-Ping zu einem Target schicken |
cdsource:outbox:process | Alle pending- und retryable-Einträge senden |
cdsource:outbox:retry | Failed-Einträge erneut einreihen |
cdsource:outbox:purge | Alte acked-Einträge aufräumen |
Backend-Module
- Targets — CRUD für Target-Sites
- Outbox — Queue-Monitor, Replay-Button, Payload-Diff-Viewer
Architektur (DDD 4-Layer)
Strict DDD 4-Layer-Architektur, enforced via deptrac:
| Layer | Darf abhängen von |
|---|---|
| Domain | Moselwal\ContentProvenance\* (Interface only) |
| Application | Domain, ContentProvenance |
| Infrastructure | Application, Domain, Framework, ContentProvenance, StructuredContent |
| Presentation | Application, Domain, Framework |
Lizenz GPL-2.0-or-later (siehe Repo). Codebase-Begleitdokumentation: CLAUDE.md im Paket.
TYPO3-zu-TYPO3-Distribution aufsetzen?
Wenn Sie redaktionelle Inhalte zentral pflegen und an mehrere TYPO3-Brand-Sites pushen wollen, ohne Headless-Architektur und ohne Editor-Workflow-Bruch, ist content-distribution-source der richtige Layer. Sprechen Sie uns für Architektur-Beratung, Multi-Site-Setup und Migration aus bestehenden Syndication-Lösungen an.
Oder direkt schreiben: kontakt@moselwal.de
Setzen wir ein bei …
Dieses Paket trägt die Multi-Site- und Multi-Region-Syndizierung in TYPO3 Kubernetes und ist Bestandteil souveräner Plattformen, die unter Open Source & Digitale Souveränität beschrieben sind. In der betreuten Variante: AI-Ready CMS as a Service.