Zum Hauptinhalt springen

Zurück zum Devlog

Freitag, 20. März 2026

Infrastructure

48 Commits

10 min Lesezeit

Cross-App SSO, Infrastructure Fixes & Calendar Deployment

Massive Infrastruktur-Session: SSO Cookie-Fix für alle Apps, Calendar-Web auf Local Build migriert, Cross-App API Routing repariert, MinIO Tunnel-Anbindung, und umfangreiche Storage/Docker-Optimierungen.

T

Till Schneider

Autor

Intensiver Infrastruktur- und Bugfix-Tag mit 48 Commits: Cross-App SSO endlich funktionsfähig, Calendar-Web von stale GHCR Image auf Local Build migriert, und eine Kette von Routing/CORS/Cookie-Problemen systematisch aufgelöst.

  • SSO Cookie-Fix - SameSite=None + Session-Cookie bei Login setzen
  • Calendar-Web Migration - Von veraltetem GHCR Image auf lokalen Docker Build
  • Cross-App API Routing - getBaseUrl() Bug in shared-api-client gefixt
  • CORS & Caddy - 10+ falsche Reverse-Proxy-Ports korrigiert, CORS für Cross-App erweitert
  • MinIO Tunnel - Cloudflare Tunnel für minio.mana.how eingerichtet
  • Storage & Docker - Optimierte Dockerfiles, Presigned Multipart, Lifecycle Rules
  • Calendar Features - CalDAV Sync UI, Recurring Events, Reminders, Composable-Refactoring

1. Cross-App SSO – Endlich funktionsfähig

Das Single Sign-On über alle *.mana.how Subdomains hatte drei versteckte Bugs, die zusammen verhinderten, dass SSO jemals funktionierte:

Die signIn() Funktion in @manacore/shared-auth nutzte nur den Custom-Endpoint (/api/v1/auth/login), der JWT-Tokens zurückgibt aber kein Session-Cookie setzt. Nur der native Better Auth Endpoint (/api/auth/sign-in/email) setzt das Cookie.

Fix: Nach erfolgreichem JWT-Login wird jetzt zusätzlich der Better Auth Endpoint mit credentials: 'include' aufgerufen.

Problem 2: SameSite=Lax blockiert fetch()

Das Session-Cookie hatte SameSite=Lax, was Cookies nur bei Top-Level-Navigationen (Link-Klicks) sendet — nicht bei programmatischen fetch() Requests. Der SSO-Flow nutzt aber fetch() mit credentials: 'include'.

Fix: SameSite=None wenn COOKIE_DOMAIN gesetzt ist (Production). Fallback auf Lax für lokale Entwicklung.

Problem 3: getBaseUrl() Override

Die getBaseUrl() Funktion in @manacore/shared-api-client überschrieb immer die baseUrl mit window.__PUBLIC_BACKEND_URL__ — egal welche URL der Client eigentlich konfiguriert hatte. Cross-App Clients (Calendar→Todo, Calendar→Contacts) sendeten dadurch alle Requests an den Calendar-Backend.

Fix: Neues useRuntimeUrl: false Flag für Cross-App Clients.

2. Calendar-Web: GHCR → Local Build

calendar-web nutzte noch ein veraltetes GHCR Docker Image, das weder die Cross-App URL-Injection noch aktuelle shared-auth Änderungen enthielt.

Migration:

  • Docker-Compose auf build: context + dockerfile umgestellt
  • Drei fehlende Packages im Dockerfile ergänzt (patches, shared-pwa, shared-app-onboarding)
  • Erfolgreich gebaut und deployed

3. Reverse-Proxy Port-Chaos aufgeräumt

Die Caddyfile.production hatte 10+ falsche Ports — Überbleibsel aus früheren Deployments:

DomainAltNeu
mana.how51735000
chat.mana.how30005010
chat-api30023030
todo.mana.how51885011
calendar.mana.how51865012
calendar-api30163032
clock.mana.how51875013
clock-api30173033
contacts.mana.how51845014
grafana31008000
stats32008010

Hinweis: Routing läuft über Cloudflare Tunnel (korrekte Ports), nicht Caddy. Caddyfile trotzdem aktualisiert für Dokumentation.

4. CORS für Cross-App Integration

Todo-Backend erlaubte nur todo.mana.how und mana.how als Origins. Calendar und Contacts konnten keine Task-API-Requests machen.

Fix: calendar.mana.how und contacts.mana.how zu CORS_ORIGINS des Todo-Backends hinzugefügt.

5. MinIO Tunnel-Anbindung

Mukke-Songs konnten nicht abgespielt werden: Die presigned S3-URLs zeigten auf minio.mana.how, aber diese Domain fehlte in der Cloudflare Tunnel Config.

Fix: minio.mana.how → localhost:9000 zur Cloudflare Tunnel Config hinzugefügt. Audio-Streaming funktioniert jetzt.

6. Storage & Docker Optimierungen

  • Auth Dockerfile: Von ~740MB auf ~320MB optimiert
  • Backend Dockerfiles: DevDeps Pruning für alle Backends
  • shared-storage: Presigned Multipart Upload, deleteByPrefix, copy, getMetadata, File-Size Validation, Lifecycle Rules
  • Deploy Tracking: Neues Grafana Dashboard mit PostgreSQL + Pushgateway
  • CD Pipeline: Mukke-Backend und -Web hinzugefügt, Matrix-Benachrichtigung bei Deploy-Fehlern

7. Calendar Features & Refactoring

  • CalDAV/iCal Sync UI — Externe Kalender verbinden und synchronisieren
  • Recurring Events — Wiederholungsdialog mit RFC 5545 RRULE Support
  • Reminders — Erinnerungen erstellen und verwalten
  • WeekView Refactoring — Inline-Logik in Composables extrahiert (1600→903 LOC)
  • Settings vereinfacht — Von 41 auf 18 persistierte Einstellungen reduziert
  • ViewCarousel — Touch-Gesten aus UnifiedBar extrahiert
  • Tests — Composable Unit Tests, WeekView E2E, CalDAV Sync API Tests

8. Weitere Fixes

  • Picture App — Migration von Netlify zu Docker/Mac Mini, Dockerfile-Fixes
  • Contacts — Verwaiste Fotos bei Duplikat-Merge aufräumen, Storage-Optimierung
  • Mukke — 34 Frontend-Tests, klickbare Songs, Player Error Handling
  • Games — WhoPixels Hosting unter whopxl.mana.how
  • DevBuildBadge — Shared Component für Development-Build-Kennzeichnung

Zusammenfassung

BereichÄnderungen
SSO/Auth3 Bugs gefixt (Cookie, SameSite, URL-Override), funktioniert jetzt cross-subdomain
DockerCalendar-Web migriert, Auth Image halbiert, alle Backend-Dockerfiles optimiert
RoutingCaddyfile korrigiert, MinIO Tunnel, CORS erweitert
CalendarCalDAV, Recurrence, Reminders, Tests, Composable-Refactoring
StorageMultipart, Lifecycle, Bulk-Delete, Validation
TestingMukke 34 Tests, Calendar Composables + E2E, Sync API Tests

Tags

#sso #auth #docker #caddy #cors #minio #calendar #mukke #storage #cloudflare #infrastructure