Zum Inhalt springen

Architektur

┌─────────────────────────────────────────────────────────┐
│ 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 │ │
│ └───────────────┘ │
└─────────────────────────────────────────────────────────┘
KomponenteEntscheidungBegruendung
CMS BackendJava + JavalinBewaehrter Stack, vorhandene Expertise
CMS FrontendReact (Mobile-first)Bewaehrter Stack, vorhandene Expertise
DatenbankPostgreSQL self-hosted auf Hetzner$0 Kosten, keine Latenz, JSONB fuer flexible Inhalte
Multi-TenancyEine DB, Tenant-SpaltePragmatischste Loesung
AuthEigene Session-Auth (Cookie)Einfach, bewaehrt (Baunach-Pattern)
Backup/PITRWAL-GBewaehrtes Konzept (Baunach-Erfahrung)
Kunden-WebsitesAstro SSGPerformance, Sicherheit, kostenlos auf Cloudflare Pages
Hosting WebsitesCloudflare PagesKostenlos, kein Server-Maintenance, CDN inklusive
Hosting CMSHetzner VPS + Cloudflare TunnelGuenstig, kein offener Port
Domain/SSL/CDNCloudflareZentrales Management, automatisch
AnalyticsEigenes Tracking: Script → AWS API Gateway → SQS → CMS → PostgreSQLDSGVO-konform, entkoppelt, $0 Infrastrukturkosten (ausser API Gateway/SQS)
  1. Tracking-Script auf Kundenwebseite sendet Event (Seitenaufruf, Geraet, Browser, Land)
  2. AWS API Gateway nimmt Event entgegen (hochverfuegbar, unabhaengig vom CMS)
  3. Event wird in SQS Queue geschrieben (Puffer bei CMS-Downtime)
  4. CMS pollt SQS asynchron und speichert Events in PostgreSQL
  5. CMS-Dashboard zeigt Statistiken per SQL-Queries (Top-Seiten, Geraete, etc.)
  1. Kunde aendert Inhalt im CMS
  2. CMS ruft Cloudflare Pages Deploy Hook auf
  3. Cloudflare Pages startet Astro-Build
  4. Astro holt Kundendaten per API vom CMS (Service Auth ueber Cloudflare Tunnel)
  5. Statische Seite wird generiert und deployed
  6. Kunde erhaelt E-Mail-Benachrichtigung dass die Seite live ist
traffino/business/
├── docs/ # Projektdokumentation (Astro Starlight)
├── cms/ # CMS Backend (Java/Javalin) + Frontend (React)
└── templates/ # Wiederverwendbare Astro-Komponenten
traffino/business/ # CMS + Docs + Templates
traffino/sites/ # Monorepo mit Kunden-Websites (Astro)
├── kunde-a/
├── kunde-b/
└── kunde-c/ # Cloudflare Pages baut pro Unterordner
ThemaStatus
AnalyticsEntschieden — eigenes Tracking via AWS API Gateway + SQS + PostgreSQL
E-Mail-VersandEntschieden — AWS SES Frankfurt, $0.10/1000 Mails, unbegrenzte Domains
Medien-SpeicherRecherche noetig — Cloudflare R2 vs. Alternativen
Preview-EnvironmentChallengen — Cloudflare Pages Preview Deployments
MehrsprachigkeitChallengen — Aufwand vs. Nutzen