rebreak-monorepo/ops/MAESTRO_HOSTING_DECISION.md
chahinebrini e76be7ee78 feat(profile): Profile-Page komplett + Header-Dropdown + UI-Pattern-Fixes
Profile (3 Iterationen):
- app/profile/index.tsx + components/profile/* (Header, StatsBar, Approved,
  Streak, UrgeStats, Demographics, DigaMissionBanner)
- echte Live-Daten via useMe-Hook (Avatar/Nickname/Plan/Email/Provider-Pill)
- Demographics mit echten Inputs (TextInput + Bottom-Sheet-Selects),
  debounced auto-save, Pro-Trial-Reward-Banner, Mikro-Why-Texte
- Approved Domains als plain integer (KEIN Plan-Slot/Cap)
- Friendly Hint-Text statt Progress-Bar (alignSelf:'stretch' Pattern)
- StatsBar zentriert mit 3 prominenten Cards (vertikale Dividers)
- Cooldown-Timeline als Liste mit 1px-Rail
- ApprovedDomainsList: Collapse-Chevron rechts in Title-Row (Pattern-Fix)
- Eigene vs fremde Profile-Ansicht streng getrennt (DSGVO/Anonymität)

Header-Dropdown (kein 3-Punkte-Icon):
- Avatar als Trigger im AppHeader (User-Wunsch)
- Custom-Modal beide Plattformen, Card-Style
- SOS prominent oben (nur Wort 'SOS' rot, Tagline 'wir sind für dich da' klein darunter)
- Profile/Settings/Games/Debug(__DEV__)/Logout
- Logout neutral (nicht rot — Recovery-tonal)
- AppHeader: neue showBack + title Props für Sub-Routes

Routes (Stub bis Phase C):
- app/profile/[userId].tsx — anonym (nur public-Stats)
- app/settings.tsx — Coming-Soon-Skeleton
- app/games.tsx — Standalone Games-Page mit GameCard-Grid
- app/debug.tsx — __DEV__-only

Game-Picker (Migration aus Nuxt):
- components/games/{GameCard, StarRating, GameRatingStars}
- 2x2 Grid, 56pt SVG-Icons (inline aus components/urge/gameSvgs.ts)
- Live-Backend /api/games/ratings (silent-fail)
- Re-use UrgeGames.tsx ohne TTS/Cooldown-Loop

UI-Pattern-Fixes (alle aus screenshot-User-Feedback 2026-05-07):
- Snake-Bug (food-pellet React-18-StrictMode-Reducer-double-call) gefixt
- Snake-Buttons platform-native (iOS-blue / Android-ripple)
- Tetris-Margins (16px paddingHorizontal)
- PostCard-Buttons Apple-44pt-Hit-Area (Image-Select, Image-Remove,
  Cancel, Share-Pill — via hitSlop)
- ProfileHeader Demographics-Hint: alignSelf:'stretch' Pattern
- ApprovedDomainsList Collapse: Title flex:1 + Chevron rechts
- ProtectionDetailsSheet FAQ-Items: alignSelf:'stretch' defensive
- AppHeader Back-Button: neue showBack-Prop + chevron-back

Memory + Plan-Docs:
- 17 Memory-Files dokumentieren System-Wissen + Patterns
- ops/{CUTOVER, UI_MIGRATION, PROFILE_PAGE, WEBHOOK, GAMES_1V1,
  RELEASE_READINESS, TESTING_STATE, MAESTRO_HOSTING}_*.md

Backend bleibt unverändert (Tier-LLM + Nickname + sort:latency
sind seit gestern deployed).
2026-05-07 18:22:58 +02:00

224 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Maestro Hosting — Decision Memo
Author: Backyard (Infrastruktur) · Stand: 2026-05-07 · Status: Recon-Empfehlung, READ-ONLY
User-Frage (2026-05-08): „lohnt sich maestro für uns oder reicht self hosted auf hetzner neue server mit backyard checken"
Dieses Doc ist die Antwort. Kurzfassung in einem Satz:
**Maestro Cloud (Starter ~10 EUR/Monat oder Free-Tier zuerst) nehmen — Self-Host
auf Hetzner lohnt sich für unsere Team-Größe + Stack nicht, vor allem weil iOS
auf Linux prinzipiell nicht testbar ist und unser CX23-Server bereits ausgelastet
ist.**
---
## 1. Hard-Constraint: iOS lässt sich auf Linux nicht testen
Apple-Lizenz-Restriction: **iOS-Simulator läuft ausschließlich auf macOS.** Hetzner
liefert (im EU-Standard-Tier) keine Mac-Hardware. Linux-VMs auf Hetzner können
nur Android-Emulators hosten. Das heißt:
- **Self-Host auf einem Hetzner-Linux-Server kann maximal die Android-Hälfte
unserer E2E-Suite abdecken.**
- iOS-Tests müssten parallel auf einem anderen Pfad laufen:
- (a) lokaler Mac-Build (User-Hardware) — nicht CI-fähig
- (b) Mac-mini bei MacStadium o.ä. — ~60-120 EUR/Monat
- (c) GitHub-Actions macOS-Runner — ~0.08 USD/Min, pay-per-use
- (d) Maestro-Cloud nur für iOS, self-host für Android — Hybrid
Jede dieser Optionen treibt entweder Kosten oder Wartungs-Komplexität.
**Konsequenz:** „Self-Hosted-Maestro auf Hetzner" ist immer ein Hybrid-Setup,
nie eine vollständige Lösung. Wer „self-hosted" sagt, meint praktisch entweder
*nur Android* oder *Hybrid mit zweitem Pfad für iOS*.
---
## 2. Performance-Risk auf existierendem CX23
Der dedicated rebreak-server ist eine **CX23: 2 vCPU x86, 4 GB RAM, 40 GB SSD,
2 GB swap** (siehe `reference_rebreak_server.md`). Aktuelle Last:
- `rebreak-staging` (Nuxt-Server, Nitro)
- `rebreak-imap-staging`, `rebreak-idle-staging` (Mo's IMAP-Stack)
- `rebreak-webhook` (Auto-Deploy-Listener)
- `pnpm build` während Deploy (peakt RAM)
Ein Android-Emulator braucht **2-4 GB RAM** + 1-2 vCPU für akzeptable Boot-Zeit
und stabile Test-Runs (bei `-no-window -no-audio -gpu swiftshader_indirect` am
unteren Ende). Das **kollidiert direkt** mit dem Build-Peak. OOM-Risk auf 4 GB
RAM ist real und wird in `feedback_deploy_workflow.md` schon ohne Maestro
notiert.
**Heißt:** wir KÖNNEN den CX23 nicht zusätzlich mit Android-Emulator beladen,
ohne Production-Risiko. Wir bräuchten zwingend einen **zweiten dedicated
CI-Server** (mindestens CX22 ~5 EUR/Monat netto, eher CX32 mit 8 GB RAM
~9-11 EUR/Monat um Reserve zu haben, weil Emulator + Maestro-CLI + Test-Runner
+ ggf. paralleles Android-Build sich gerne überlappen).
Damit ist der „self-hosted ist gratis"-Mythos schon entzaubert: wir reden
realistisch über **zusätzlich ~10 EUR/Monat Hetzner-Server** plus mehrere
Stunden Setup plus laufende Wartung.
---
## 3. Cost-Comparison
Annahmen: ~10 Test-Runs/Monat (TestFlight-Sprint-Phase, später ggf. mehr), je
Run ~5 Minuten Maestro-Time pro Plattform, iOS+Android parallel.
| Variante | Direkte Kosten/Monat | Direkte Kosten/Jahr | Setup-Aufwand | Laufende Wartung |
|----------|----------------------|---------------------|---------------|------------------|
| **(A) Maestro Cloud Starter** | ~10 EUR (laut Ahmed-Quote, plus Free-Tier-Monatsminuten) | ~120 EUR | 30-60 min (CLI install + cloud-token) | quasi 0 — Maestro betreibt Devices |
| **(B) Self-Host Android-only auf Hetzner (neuer CX22/32)** | 5-11 EUR (+ Strom-Pool inklusive) | 60-130 EUR | 4-8 h (Server provision + Android-SDK + Emulator-image + KVM-acceleration check + Maestro-CLI + Webhook/Trigger) | ~30 min/Monat (image-updates, Emulator-state-Drift) |
| **(B+) Self-Host Android + GitHub-Actions-iOS** | 5-11 EUR Hetzner + ~4 EUR GitHub macOS-Minutes (10×5 min) | 110-180 EUR | 6-10 h (zwei Pfade synchron halten) | ~1 h/Monat (zwei Pipelines pflegen) |
| **(C) Pure self-host iOS + Android (eigener Mac-mini bei MacStadium)** | 60-120 EUR Mac + 5-11 EUR Hetzner | 780-1570 EUR | 8-16 h | ~2 h/Monat (zwei Hosts) |
| **(D) GitHub Actions Matrix-Build (macOS-runner für beide)** | ~8 EUR (10×5 min iOS + Android Linux gratis) | ~100 EUR | 2-3 h Workflow-yml | ~30 min/Monat |
**Beobachtung:** Die nominellen Kosten von (A), (B), (B+) und (D) liegen alle
im Bereich 60-180 EUR/Jahr. Der echte Tradeoff sind **Setup-Aufwand und
Wartungs-Komplexität**, nicht Cash.
---
## 4. Aufwand-Schätzung pro Variante
### (A) Maestro Cloud
- **Setup:** Account anlegen, `MAESTRO_CLOUD_API_KEY` als GitHub-Secret, ein
einziger CLI-Aufruf in der Action. **30-60 Min.**
- **Wartung:** Maestro pflegt Device-Pool, Updates, OS-Versionen. **Nahe 0.**
- **Risk:** External Vendor — wenn Maestro down, blockiert PR-Test. Akzeptabel
weil Tests nicht Production-blocking sind, nur PR-Gate.
### (B) Self-Host Android-only
- **Setup:** Hetzner-Server provisionieren (CX22/32), Ubuntu, Android-SDK +
cmdline-tools + emulator-image installieren, KVM/HAXM-Acceleration testen
(auf Hetzner-Cloud bedingt verfügbar — `/dev/kvm` muss exposed sein, je
nach Hetzner-Tier OK), Maestro-CLI installieren, Webhook-Endpoint bauen
oder GitHub-Actions self-hosted-runner registrieren. **4-8 h.**
- **Wartung:** Android-System-Image-Updates (alle 2-3 Monate), Emulator-state
kann korrupt werden, Maestro-CLI-Updates, Disk-cleanup für AVD-snapshots.
**~30 Min/Monat im stabilen Zustand, gelegentlich mehrere Stunden bei Bruch.**
- **Risk:** Wenn Server down, Test-Pipeline down. Plus: ein zweiter Server
vergrößert die Hetzner-Sprawl, gegen die wir gerade in
`project_rebreak_dedicated_hetzner.md` fokussiert haben.
### (B+) Hybrid Self-Host Android + Cloud-iOS oder GH-Actions-iOS
- **Setup:** wie (B) **plus** zweiter Pfad für iOS. **6-10 h.**
- **Wartung:** Zwei Pipelines, zwei Auth-Token-Pflege, zwei verschiedene
Reporting-Outputs. **~1 h/Monat.**
- **Risk:** Pipeline-Drift — Android-Test-Setup divergiert von iOS-Test-Setup,
Bugs werden auf einer Plattform gefangen, auf der anderen nicht.
### (C) Pure Self-Host inkl. Mac
- **Setup:** Mac-mini-Provider auswählen (MacStadium, Scaleway-Apple-M1, Mac
in Cloud), Maestro auf macOS installieren, iOS-Sim einrichten, plus Hetzner
für Android. **8-16 h.**
- **Wartung:** Zwei OS, zwei Toolchains, Apple-Xcode-Updates. **~2 h/Monat.**
- **Risk:** Hoch. Aufwand steht in keinem Verhältnis zum Output für unsere
Team-Größe (User + ein paar Sub-Agents).
### (D) GitHub Actions Matrix
- **Setup:** Eine `.yml` mit zwei Jobs (`maestro-ios` auf macos-latest,
`maestro-android` auf ubuntu-latest mit `reactivecircus/android-emulator-runner`).
**2-3 h.**
- **Wartung:** Action-Updates, ggf. Cache-Invalidierung. **~30 Min/Monat.**
- **Risk:** macOS-Minutes können bei vielen Test-Runs schnell teuer werden
(z.B. 100 Runs/Monat × 5 Min = 40 USD). Bei aktueller Run-Frequenz aber OK.
---
## 5. Empfehlung — Lieblings-Pfad
### Lieblings-Pfad: **Maestro Cloud Starter (Variante A)**
**Begründung:**
1. **iOS-Hard-Constraint** löst sich elegant — Cloud betreibt Apple-Devices.
2. **Setup-Aufwand minimal** — eine Stunde max, keine Hetzner-Sprawl.
3. **Hetzner-Strategie respektiert** — der CX23 bleibt fokussiert auf
`rebreak-staging`/`rebreak-prod`-Workload, kein OOM-Risk durch Emulator-Last.
4. **Ahmed-Empfehlung deckt sich**`TESTING_STATE.md §5.2` nennt Maestro mit
Cloud-Run als bevorzugten Pfad genau aus diesem Grund.
5. **Cash-Risk niedrig** — 120 EUR/Jahr ist Rauschen verglichen mit
DiGA-Pen-Test (5-15k EUR), Apple-Developer-Program (99 USD) etc.
6. **Reversibilität hoch** — wenn Cloud-Limits gesprengt werden, lässt sich
später auf (B+) oder (D) wechseln. Maestro-yml-Flows sind portable.
**Plan-Form:**
- Anfang: **Free-Tier prüfen** (Maestro hat ein gratis Kontingent für kleine
Teams — verifizieren beim Account-Anlegen). Wenn Free-Tier ausreicht für
unsere ~10 Runs/Monat, kostet's 0.
- Wenn Free-Tier nicht reicht: Starter-Plan (~10 EUR/Monat laut Ahmed-Quote).
- Maestro-CLI lokal für Dev-Iteration, Cloud für CI-Gate auf `main`.
### Plan B: **GitHub Actions Matrix (Variante D)**
Wenn Maestro Cloud aus irgendeinem Grund nicht passt (z.B. EU-Datenschutz-Bedenken
weil Test-Recordings auf US-Servern liegen, oder Pricing-Änderung):
- GitHub-Actions-Matrix mit `macos-latest` für iOS und `ubuntu-latest` +
`reactivecircus/android-emulator-runner` für Android.
- Test-Runs nur auf `main`-Push und `workflow_dispatch`, nicht auf jedem PR
→ hält macOS-Minutes-Verbrauch klein.
- Aufwand: 2-3 h Setup, ~30 Min/Monat Wartung, ~100 EUR/Jahr.
### Anti-Empfehlung: **Self-Host auf Hetzner (B oder B+)**
Würde ich nur empfehlen wenn:
- DSGVO/DiGA-Audit verlangt explizit, dass Test-Pipelines auf EU-eigener
Infrastruktur laufen (unwahrscheinlich, weil Test-Recordings keine
Produktiv-User-Daten enthalten).
- Wir mehr als ~50 Test-Runs/Tag haben (sind wir nicht).
- Wir bereits dedicated CI-Infrastruktur betreiben (haben wir nicht — der
rebreak-server ist Production).
In allen anderen Fällen ist Self-Host für unsere Größe **Over-Engineering**
und kollidiert mit der Hetzner-Konsolidierungs-Linie aus den letzten
Backyard-Sessions.
---
## 6. Setup-Estimate für die Empfehlung (Pfad A)
| Schritt | Owner | Aufwand |
|---------|-------|---------|
| Maestro-Cloud-Account anlegen + Free-Tier-Limits checken | User | 15 Min |
| `MAESTRO_CLOUD_API_KEY` GitHub-Secret hinterlegen | User | 5 Min |
| `.github/workflows/rebreak-test.yml` Job `maestro-cloud` schreiben (`maestro cloud --apiKey $MAESTRO_CLOUD_API_KEY .maestro/`) | Ahmed/Backyard | 30 Min |
| Erster Test-Run gegen Staging-Build von TestFlight-IPA | Ahmed | 30 Min |
| Smoke-Flow `auth/sign-in.yaml` entstehen lassen + via Cloud verifizieren | Ahmed | bereits in TESTING_STATE Roadmap (1 h) |
| **Total bis erste grüne Cloud-Run** | | **~2 h** zusätzlich zur Maestro-Flow-Entwicklung selbst |
Vergleich Self-Host: 4-8 h Setup + Wartungs-Last + zweiter Hetzner-Server. Cloud
gewinnt deutlich.
---
## 7. Offene Punkte (User-Decision)
1. **Maestro-Cloud-Pricing-Verifikation:** „~10 EUR/Monat" ist Schätzung aus
Ahmed's Notiz. User sollte beim Account-Anlegen den aktuellen Starter-Plan-Preis
und das Free-Tier-Kontingent verifizieren. Backyard hat bewusst nicht selbst
den Maestro-Pricing-Endpoint gefetcht (kein Web-Tool im Recon-Scope).
2. **Cloud-Datenschutz vs DSGVO:** Maestro-Cloud-Server-Region prüfen (US vs EU).
Test-Flows enthalten keine echten User-Daten, sondern Test-Account-Daten —
Risk niedrig, aber Hans-Müller (DSFA) sollte das im Datenfluss-Diagramm
notieren.
3. **Wenn (D) als Plan B aktiv wird:** Run-Frequenz kapeln (max 1× pro PR auf
main, nicht auf jedem Branch-Push), sonst eskalieren macOS-Minutes.
---
## 8. TL;DR für User
- **Maestro Cloud Starter (~10 EUR/Monat, ggf. Free-Tier am Anfang) nehmen.**
- iOS lässt sich nicht auf Linux testen — Self-Host auf Hetzner ist immer
Hybrid und kostet mehr Stunden als es spart.
- Unser CX23 ist schon nah an OOM bei Build-Peaks; Android-Emulator dazu wäre
Production-Risk.
- Plan B falls Cloud nicht passt: GitHub-Actions-Matrix mit macOS-runner für
iOS, ubuntu-runner für Android. ~100 EUR/Jahr, kein eigener Server.
- Setup für Pfad A: ~2 h gesamt bis zur ersten grünen Cloud-Run.
Ende. — Backyard