Architektur
System-Ueberblick
Abschnitt betitelt „System-Ueberblick“┌─────────────────────────────────────────────────────────┐│ Cloudflare ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ ││ │ Pages │ │ CDN │ │ DNS │ │ SSL │ ││ │ (Static) │ │ (Assets) │ │ │ │ (auto) │ ││ └─────┬─────┘ └──────────┘ └──────────┘ └────────┘ ││ │ ││ ┌─────┴──────────────────────────────────────────────┐ ││ │ Cloudflare Tunnel │ ││ └─────┬──────────────────────────────────────────────┘ │└────────┼────────────────────────────────────────────────┘ │┌────────┼────────────────────────────────────────────────┐│ Hetzner VPS ││ ┌─────┴──────────────────────────┐ ┌───────────────┐ ││ │ CMS │ │ PostgreSQL │ ││ │ ┌───────────┐ ┌────────────┐ │ │ │ ││ │ │ Backend │ │ Frontend │ │ │ Multi-Tenant │ ││ │ │ (Javalin)│ │ (React) │ │ │ (Tenant-ID) │ ││ │ └───────────┘ └────────────┘ │ │ JSONB Content│ ││ └────────────────────────────────┘ │ WAL-G PITR │ ││ └───────────────┘ │└─────────────────────────────────────────────────────────┘Entschiedene Architektur
Abschnitt betitelt „Entschiedene Architektur“| Komponente | Entscheidung | Begruendung |
|---|---|---|
| CMS Backend | Java + Javalin | Bewaehrter Stack, vorhandene Expertise |
| CMS Frontend | React (Mobile-first) | Bewaehrter Stack, vorhandene Expertise |
| Datenbank | PostgreSQL self-hosted auf Hetzner | $0 Kosten, keine Latenz, JSONB fuer flexible Inhalte |
| Multi-Tenancy | Eine DB, Tenant-Spalte | Pragmatischste Loesung |
| Auth | Eigene Session-Auth (Cookie) | Einfach, bewaehrt (Baunach-Pattern) |
| Backup/PITR | WAL-G | Bewaehrtes Konzept (Baunach-Erfahrung) |
| Kunden-Websites | Astro SSG | Performance, Sicherheit, kostenlos auf Cloudflare Pages |
| Hosting Websites | Cloudflare Pages | Kostenlos, kein Server-Maintenance, CDN inklusive |
| Hosting CMS | Hetzner VPS + Cloudflare Tunnel | Guenstig, kein offener Port |
| Domain/SSL/CDN | Cloudflare | Zentrales Management, automatisch |
| Analytics | Eigenes Tracking: Script → AWS API Gateway → SQS → CMS → PostgreSQL | DSGVO-konform, entkoppelt, $0 Infrastrukturkosten (ausser API Gateway/SQS) |
Analytics-Flow
Abschnitt betitelt „Analytics-Flow“- Tracking-Script auf Kundenwebseite sendet Event (Seitenaufruf, Geraet, Browser, Land)
- AWS API Gateway nimmt Event entgegen (hochverfuegbar, unabhaengig vom CMS)
- Event wird in SQS Queue geschrieben (Puffer bei CMS-Downtime)
- CMS pollt SQS asynchron und speichert Events in PostgreSQL
- CMS-Dashboard zeigt Statistiken per SQL-Queries (Top-Seiten, Geraete, etc.)
Build-Flow
Abschnitt betitelt „Build-Flow“- Kunde aendert Inhalt im CMS
- CMS ruft Cloudflare Pages Deploy Hook auf
- Cloudflare Pages startet Astro-Build
- Astro holt Kundendaten per API vom CMS (Service Auth ueber Cloudflare Tunnel)
- Statische Seite wird generiert und deployed
- Kunde erhaelt E-Mail-Benachrichtigung dass die Seite live ist
Repository-Struktur
Abschnitt betitelt „Repository-Struktur“Aktuell (Entwicklung)
Abschnitt betitelt „Aktuell (Entwicklung)“traffino/business/├── docs/ # Projektdokumentation (Astro Starlight)├── cms/ # CMS Backend (Java/Javalin) + Frontend (React)└── templates/ # Wiederverwendbare Astro-KomponentenSpaeter (Produktion)
Abschnitt betitelt „Spaeter (Produktion)“traffino/business/ # CMS + Docs + Templatestraffino/sites/ # Monorepo mit Kunden-Websites (Astro) ├── kunde-a/ ├── kunde-b/ └── kunde-c/ # Cloudflare Pages baut pro UnterordnerOffene Entscheidungen
Abschnitt betitelt „Offene Entscheidungen“| Thema | Status |
|---|---|
| Analytics | Entschieden — eigenes Tracking via AWS API Gateway + SQS + PostgreSQL |
| E-Mail-Versand | Entschieden — AWS SES Frankfurt, $0.10/1000 Mails, unbegrenzte Domains |
| Medien-Speicher | Recherche noetig — Cloudflare R2 vs. Alternativen |
| Preview-Environment | Challengen — Cloudflare Pages Preview Deployments |
| Mehrsprachigkeit | Challengen — Aufwand vs. Nutzen |