From 376cfe881b1aabff2e5424ac51cd29ee06fd838b Mon Sep 17 00:00:00 2001 From: Till JS Date: Mon, 23 Mar 2026 10:01:14 +0100 Subject: [PATCH] docs: add tech stack independence analysis and improvement roadmap Comprehensive analysis of self-hosted vs cloud dependencies with prioritized roadmap to reach ~90% self-hosting. Key findings: mana-image-gen can replace Replicate, all LLM calls should route through mana-llm, and backup strategy needs strengthening. Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/TECH_STACK_INDEPENDENCE.md | 223 ++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 docs/TECH_STACK_INDEPENDENCE.md diff --git a/docs/TECH_STACK_INDEPENDENCE.md b/docs/TECH_STACK_INDEPENDENCE.md new file mode 100644 index 000000000..c6b8652c8 --- /dev/null +++ b/docs/TECH_STACK_INDEPENDENCE.md @@ -0,0 +1,223 @@ +# Tech Stack Unabhängigkeit & Verbesserungen + +> Stand: 2026-03-23 | Ziel: Maximale Unabhängigkeit durch Open-Source & Self-Hosting + +## Aktueller Unabhängigkeits-Status + +### Self-Hosted (keine externe Abhängigkeit) + +| Kategorie | Service | Technologie | +|-----------|---------|-------------| +| Database | PostgreSQL 16 + Drizzle ORM | Docker | +| Cache | Redis 7 | Docker | +| Object Storage | MinIO (S3-kompatibel) | Docker | +| Auth | Better Auth (mana-core-auth, EdDSA JWT) | NestJS | +| Search | SearXNG + mana-search | Docker + NestJS | +| Messaging | Matrix/Synapse + 13 Bots | Docker | +| Monitoring | VictoriaMetrics + Grafana | Docker | +| Analytics | Umami | Docker | +| Error Tracking | GlitchTip (Sentry-kompatibel) | Docker | +| Automation | n8n | Docker | +| LLM | Ollama + mana-llm Gateway | Nativ + Python | +| STT | Whisper Large V3 (mana-stt) | Python/MLX | +| TTS | Piper + Kokoro (mana-tts) | Python/MLX | +| Image Gen | FLUX.2 klein (mana-image-gen) | C/MPS | + +### Cloud-Abhängigkeiten + +| Kategorie | Service | Ersetzbar? | Notizen | +|-----------|---------|------------|---------| +| **Payments** | Stripe | Nein (Billing ja, Gateway nein) | Alternativen: Lago/Kill Bill für Billing, aber Payment Gateway braucht immer Provider | +| **Email** | Brevo SMTP | Ja | → Postal, Stalwart, Mailcow | +| **DNS/Tunnel** | Cloudflare Tunnel | Ja | → WireGuard + eigene IP, Caddy/Traefik | +| **Landing Pages** | Cloudflare Pages | Ja | → Nginx/Caddy auf eigenem Server | +| **Image Gen** | Replicate (Picture App) | Ja | → mana-image-gen (FLUX.2 klein, bereits vorhanden!) | +| **Vision** | Google Gemini (NutriPhi, Planta) | Teilweise | → Qwen2.5-VL / LLaVA via Ollama (Qualitätsverlust) | +| **LLM** | Azure OpenAI (Context App) | Teilweise | → Ollama mit größerem Modell | +| **LLM Fallbacks** | OpenRouter, Groq, Together | Ja (optional) | Nur Fallbacks, Ollama ist Primary | +| **OAuth** | Google OAuth (Contacts Import) | Nein | Nötig für Google Contacts API | + +--- + +## Verbesserungsvorschläge + +### 1. Cloud-Abhängigkeiten eliminieren (Easy Wins) + +#### 1.1 Picture App: Replicate → mana-image-gen + +**Aufwand:** 1-2 Tage | **Ersparnis:** $0.02-0.10 pro Bild + +`mana-image-gen` mit FLUX.2 klein läuft bereits auf dem Mac Mini (~0.8s pro Bild @ 1024x1024). Die Picture App nutzt aber noch Replicate. + +**TODO:** +- `ReplicateService` in Picture Backend um lokalen Endpoint erweitern +- Lokales Modell als Default, Replicate als Fallback für Premium-Modelle +- Betroffene Datei: `apps/picture/apps/backend/src/generate/replicate.service.ts` + +#### 1.2 Project Doc Bot: OpenAI → Ollama + mana-stt + +**Aufwand:** 1 Tag + +- Whisper (OpenAI API) → `mana-stt` (bereits self-hosted) +- GPT-4o-mini (Blog-Generierung) → `mana-llm` → Ollama (Gemma 3 4B) +- Betroffene Datei: `services/matrix-project-doc-bot/src/generation/generation.service.ts` + +#### 1.3 Landing Pages: Cloudflare Pages → Self-hosted + +**Aufwand:** 0.5 Tage + +Statische Astro-Builds können direkt vom Mac Mini über den Cloudflare Tunnel gehostet werden (wie die Web-Apps). Nginx- oder Caddy-Container mit den `dist/`-Ordnern. + +**TODO:** +- Docker-Container für Landing Pages in `docker-compose.macmini.yml` +- Cloudflare Tunnel Ingress-Rules auf lokale Ports umstellen +- Deploy-Scripts anpassen (`deploy:landing:*`) + +#### 1.4 Email: Brevo SMTP → Self-hosted + +**Aufwand:** 2-3 Tage + +Brevo ist SPOF für alle Transaktions-Emails (Verifizierung, Passwort-Reset). + +**Optionen:** +- **Postal** — Open-Source Mailgun-Alternative (Docker, Web-UI, Webhooks) +- **Stalwart Mail Server** — Moderner, Rust-basierter Mailserver +- **Mailcow** — Vollständiger Mailserver-Stack + +**Voraussetzung:** Korrekte DNS-Records (SPF, DKIM, DMARC) und idealerweise ein VPS mit offenem Port 25 (die meisten Hoster blockieren Port 25 auf Consumer-Leitungen). + +**Pragmatischer Ansatz:** Postal auf einem günstigen Hetzner VPS (€3/Monat), DNS bei eigenem Provider. + +--- + +### 2. Architektur-Verbesserungen + +#### 2.1 Alle LLM-Requests über mana-llm routen + +**Aufwand:** 1 Woche | **Impact:** Hoch + +Aktuell nutzen einige Apps direkt Cloud-SDKs (OpenAI, Gemini, Azure). Wenn alles über `mana-llm` läuft: +- Ein Switch reicht um Provider zu wechseln +- Zentrales Logging, Rate-Limiting, Cost-Tracking +- Einfacherer Wechsel zu lokalen Modellen + +**Betroffene Apps:** +- Context App → `apps/context/apps/backend/src/ai/ai.service.ts` +- NutriPhi → Google Gemini SDK direkt +- Planta → Google Gemini SDK direkt +- Matrix Project Doc Bot → OpenAI SDK direkt + +#### 2.2 PostgreSQL Backup stärken + +**Aufwand:** 1-2 Tage | **Impact:** Kritisch + +Aktuell nur `pg_dumpall`. Besser: +- **pgBackRest** für Point-in-Time-Recovery (PITR) +- Backups verschlüsselt auf externen Storage (z.B. zweite Maschine oder S3-kompatibler EU-Anbieter) +- Automatisierter Restore-Test (monatlich) + +```bash +# Beispiel: pgBackRest in Docker +docker run --name pgbackrest \ + -v /Volumes/ManaData/backups:/var/lib/pgbackrest \ + pgbackrest/pgbackrest:latest +``` + +#### 2.3 Cloudflare-Fallback dokumentieren + +**Aufwand:** 0.5 Tage | **Impact:** Risikominimierung + +Cloudflare Tunnel ist der einzige Weg ins Internet. Falls Cloudflare ausfällt oder den Account sperrt: +- **Plan B:** WireGuard-Tunnel zu einem VPS + Caddy als Reverse Proxy +- **Plan C:** Direkte IP beim ISP (falls verfügbar) + Let's Encrypt +- Einen dokumentierten Failover-Plan erstellen und testen + +#### 2.4 Redundanz: Zweiter Server + +**Aufwand:** 1-2 Wochen | **Impact:** Kritisch + +Der Mac Mini ist Single Point of Failure. Optionen: + +| Option | Kosten | Komplexität | Failover-Zeit | +|--------|--------|-------------|---------------| +| Zweiter Mac Mini (Warm Standby) | ~€800 einmalig | Mittel | ~5 Min | +| Hetzner Dedicated (Standby) | ~€40/Monat | Mittel | ~5 Min | +| k3s Cluster (2-3 Nodes) | ~€80/Monat | Hoch | ~30 Sek | +| Docker Swarm (2 Nodes) | ~€40/Monat | Mittel | ~1 Min | + +**Minimum:** PostgreSQL Streaming Replication auf einen zweiten Server, sodass Daten nicht verloren gehen. + +--- + +### 3. Tech Stack Modernisierung + +#### 3.1 NestJS 10 → 11 + +**Aufwand:** Mittel | **Impact:** Niedrig + +Aktuell: NestJS 10.4.15. Version 11 ist stable. Shared Packages (`@manacore/shared-nestjs-auth` etc.) unterstützen bereits NestJS 11 als peerDependency. Bringt bessere Performance und ESM-Support. + +#### 3.2 Expo 52 → 53/54 + +**Aufwand:** Mittel | **Impact:** Mittel + +Aktuell: Expo 52 + React Native 0.76. Expo 53+ bringt React Native 0.78+ mit New Architecture (Fabric, TurboModules) standardmäßig. Deutlich bessere Performance. + +#### 3.3 Vitest statt Jest + +**Aufwand:** Mittel | **Impact:** Niedrig + +Ihr nutzt Vite überall (SvelteKit, Astro). Jest 29/30 mit ts-jest ist langsamer und hat ESM-Probleme. Vitest wäre native kompatibel und deutlich schneller. + +#### 3.4 Vision-Models lokal testen + +**Aufwand:** 1 Woche | **Impact:** Mittel + +NutriPhi und Planta nutzen Google Gemini Vision. Alternativen via Ollama: +- **Qwen2.5-VL** — Bestes Open-Source Vision Model +- **LLaVA** — Leichtgewichtiger, gut für Kategorisierung + +**Vorgehen:** Benchmark mit 200-300 Beispielbildern (Food/Pflanzen) gegen Gemini. Wenn Genauigkeit >85%: migrieren. + +--- + +### 4. Open-Source Alternativen-Matrix + +| Aktuell (Cloud) | Open-Source Alternative | Status | +|-----------------|----------------------|--------| +| Stripe | Lago (Billing) + Mollie/Adyen (Gateway) | Billing ersetzbar, Gateway nicht | +| Brevo SMTP | Postal, Stalwart, Mailcow | Vollständig ersetzbar | +| Cloudflare Pages | Nginx/Caddy + eigener Server | Trivial | +| Cloudflare Tunnel | WireGuard + VPS | Machbar | +| Replicate | mana-image-gen (FLUX.2 klein) | **Bereits vorhanden!** | +| Google Gemini Vision | Qwen2.5-VL, LLaVA via Ollama | Qualitätsverlust möglich | +| Azure OpenAI | Ollama (Gemma, Llama, DeepSeek) | Für die meisten Use Cases | +| OpenAI Whisper API | mana-stt (Whisper lokal) | **Bereits vorhanden!** | +| Edge TTS | mana-tts (Piper + Kokoro) | **Bereits vorhanden!** | + +--- + +## Priorisierte Roadmap + +| Prio | Maßnahme | Aufwand | Gewinn | +|------|----------|---------|--------| +| **1** | Picture App → mana-image-gen | 1-2 Tage | Replicate-Kosten = 0, volle Kontrolle | +| **2** | Project Doc Bot → Ollama + mana-stt | 1 Tag | OpenAI-Abhängigkeit weg | +| **3** | Alle LLM-Calls über mana-llm routen | 1 Woche | Zentrale Provider-Kontrolle | +| **4** | PostgreSQL Backup mit pgBackRest | 1-2 Tage | Disaster Recovery | +| **5** | Brevo → Postal/Stalwart | 2-3 Tage | Email-Unabhängigkeit | +| **6** | Landing Pages self-hosted | 0.5 Tage | Cloudflare Pages weg | +| **7** | Vision-Models lokal benchmarken | 1 Woche | Gemini-Abhängigkeit reduzieren | +| **8** | Cloudflare-Fallback dokumentieren | 0.5 Tage | Risikominimierung | +| **9** | Zweiter Server / Redundanz | 1-2 Wochen | Kein Single Point of Failure | +| **10** | NestJS 11 + Vitest Migration | 1-2 Wochen | Modernerer Stack | + +--- + +## Zusammenfassung + +**Aktuell self-hosted:** ~75% der Infrastruktur +**Nach Roadmap (Prio 1-6):** ~90% +**Unvermeidbare Cloud-Abhängigkeiten:** Stripe (Payment Gateway), Google OAuth (Contacts API) + +Der Stack ist bereits sehr gut aufgestellt. Die größten Quick Wins sind die Integration von `mana-image-gen` in die Picture App und das Routing aller LLM-Calls über `mana-llm`. Die kritischste Verbesserung ist die Backup-Strategie und Server-Redundanz.