# Empfohlene Services für den Mac Mini Server Diese Dokumentation beschreibt Services, die die bestehende Infrastruktur sinnvoll ergänzen würden. Für jeden Service wird erklärt: Was ist es? Warum braucht man es? Wie würde es integriert? ## Inhaltsverzeichnis 1. [Aktuelle Infrastruktur](#aktuelle-infrastruktur) 2. [Kritische Ergänzungen](#kritische-ergänzungen) - [Backup-Lösung (restic/borgmatic)](#1-backup-lösung-resticborgmatic) - [Zentrales Logging (Loki + Promtail)](#2-zentrales-logging-loki--promtail) 3. [Wichtige Ergänzungen](#wichtige-ergänzungen) - [Uptime Monitoring (Uptime Kuma)](#3-uptime-monitoring-uptime-kuma) - [Reverse Proxy (Traefik/Caddy)](#4-reverse-proxy-traefikcaddy) 4. [Empfohlene Ergänzungen](#empfohlene-ergänzungen) - [Secrets Management (Vault/Infisical)](#5-secrets-management-vaultinfisical) - [API Gateway (Kong)](#6-api-gateway-kong) 5. [Optionale Ergänzungen](#optionale-ergänzungen) - [CI/CD Runner](#7-cicd-runner) - [Container Registry](#8-container-registry) - [Speech-to-Text (Whisper)](#9-speech-to-text-whisper) 6. [Noch nicht deployed (bereits entwickelt)](#noch-nicht-deployed-bereits-entwickelt) 7. [Priorisierte Roadmap](#priorisierte-roadmap) --- ## Aktuelle Infrastruktur ### Was bereits läuft ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ INFRASTRUKTUR │ │ ├── PostgreSQL Relationale Datenbank für alle Apps │ │ ├── Redis Cache & Session-Store │ │ ├── MinIO S3-kompatibler Object Storage │ │ └── Cloudflare Tunnel für öffentliche Erreichbarkeit │ ├─────────────────────────────────────────────────────────────────────────┤ │ AUTH & CORE │ │ ├── mana-core-auth Zentraler Auth-Service (Better Auth + EdDSA JWT) │ │ └── manacore-web Dashboard für alle Apps │ ├─────────────────────────────────────────────────────────────────────────┤ │ PRODUKTIVITÄTS-APPS (je Backend + Web) │ │ ├── Chat AI-Chat mit verschiedenen Modellen │ │ ├── Todo Aufgabenverwaltung │ │ ├── Calendar Kalender & Termine │ │ ├── Clock Zeiterfassung │ │ ├── Contacts Kontaktverwaltung │ │ ├── Storage Cloud-Speicher │ │ ├── Presi Präsentationen │ │ └── NutriPhi Ernährungstracking │ ├─────────────────────────────────────────────────────────────────────────┤ │ MONITORING │ │ ├── VictoriaMetrics Zeitreihen-Datenbank für Metriken │ │ ├── Grafana Dashboards & Visualisierung │ │ ├── Pushgateway Metriken von Batch-Jobs │ │ ├── Node Exporter Host-Metriken (CPU, RAM, Disk) │ │ ├── cAdvisor Container-Metriken │ │ ├── Postgres Exp. PostgreSQL-Metriken │ │ └── Redis Exporter Redis-Metriken │ ├─────────────────────────────────────────────────────────────────────────┤ │ AUTOMATION & ANALYTICS │ │ ├── n8n Workflow-Automation (wie Zapier) │ │ ├── Watchtower Automatische Container-Updates │ │ └── Umami Privacy-freundliche Web-Analytics │ ├─────────────────────────────────────────────────────────────────────────┤ │ MATRIX (DSGVO-KONFORM) │ │ ├── Synapse Matrix Homeserver │ │ ├── Element Web Web-Client für Matrix │ │ └── 8 Bots Ollama, Stats, Doc, Calendar, Todo, etc. │ ├─────────────────────────────────────────────────────────────────────────┤ │ KI-SERVICES │ │ ├── Ollama Lokale LLM-Inferenz (nativ, Metal GPU) │ │ ├── Telegram Bot Ollama-Chat via Telegram │ │ └── Telegram Stats Server-Status via Telegram │ └─────────────────────────────────────────────────────────────────────────┘ ``` ### Was fehlt | Bereich | Lücke | Risiko | |---------|-------|--------| | **Backup** | Kein automatisches Backup | Datenverlust bei Hardware-Ausfall | | **Logging** | Logs nur in einzelnen Containern | Schwierige Fehlersuche | | **Externe Überwachung** | Nur interne Health-Checks | Kein Alarm wenn Server offline | | **Secrets** | .env Dateien auf Disk | Sicherheitsrisiko | --- ## Kritische Ergänzungen ### 1. Backup-Lösung (restic/borgmatic) #### Was ist das? **Backup-Tools** erstellen automatische Sicherungskopien deiner Daten und speichern sie an einem sicheren Ort (lokal oder remote). Bei einem Ausfall können alle Daten wiederhergestellt werden. - **restic**: Modernes Backup-Tool mit Deduplizierung und Verschlüsselung - **borgmatic**: Wrapper um Borg Backup mit einfacher YAML-Konfiguration #### Warum braucht man das? ``` OHNE BACKUP: ┌──────────────┐ Hardware-Defekt ┌──────────────┐ │ PostgreSQL │ ────────────────────> │ ALLE DATEN │ │ MinIO │ │ VERLOREN │ │ Volumes │ │ 💀 │ └──────────────┘ └──────────────┘ MIT BACKUP: ┌──────────────┐ Hardware-Defekt ┌──────────────┐ │ PostgreSQL │ ────────────────────> │ Neuer Mac │ │ MinIO │ │ Mini kaufen │ │ Volumes │ └──────┬───────┘ └──────────────┘ │ │ │ │ Täglich 3:00 Uhr │ Restore ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ Hetzner │ ────────────────────> │ Alles wie │ │ Storage Box │ │ vorher │ │ (20€/TB) │ │ ✓ │ └──────────────┘ └──────────────┘ ``` **Konkrete Szenarien:** - SSD-Ausfall → Alle Datenbanken weg - Versehentliches `DROP TABLE` → Daten unwiederbringlich - Ransomware → Verschlüsselte Daten - macOS-Update schlägt fehl → System nicht bootbar #### Wie würde es integriert? **Docker-Compose Ergänzung:** ```yaml services: backup: image: mazzolino/restic:latest container_name: manacore-backup hostname: macmini-backup environment: # Backup-Ziel (Hetzner Storage Box) RESTIC_REPOSITORY: sftp:u123456@u123456.your-storagebox.de:/backups RESTIC_PASSWORD: ${BACKUP_PASSWORD} # Backup-Zeitplan BACKUP_CRON: "0 3 * * *" # Täglich 3:00 Uhr # Aufbewahrung RESTIC_KEEP_DAILY: 7 RESTIC_KEEP_WEEKLY: 4 RESTIC_KEEP_MONTHLY: 12 volumes: # PostgreSQL Daten - postgres_data:/data/postgres:ro # MinIO Daten - minio_data:/data/minio:ro # App-Volumes - synapse_data:/data/synapse:ro # SSH-Key für Hetzner - ./backup/ssh:/root/.ssh:ro depends_on: - postgres - minio ``` **Pre-Backup Script für PostgreSQL:** ```bash #!/bin/bash # Vor dem Backup: Konsistenten DB-Dump erstellen docker exec manacore-postgres pg_dumpall -U postgres > /backup/postgres_dump.sql ``` **Kosten:** - Hetzner Storage Box: ~3,50€/Monat für 100 GB - Hetzner Object Storage: ~2,50€/Monat für 100 GB --- ### 2. Zentrales Logging (Loki + Promtail) #### Was ist das? **Loki** ist ein Log-Aggregationssystem (wie Elasticsearch, aber leichtgewichtiger). **Promtail** sammelt Logs von allen Containern und sendet sie an Loki. Die Logs können dann in **Grafana** durchsucht und analysiert werden. ``` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ chat-backend│ │ todo-backend│ │ auth-service│ │ Logs │ │ Logs │ │ Logs │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ └────────────────┼────────────────┘ │ ▼ ┌───────────────┐ │ Promtail │ Sammelt alle Logs │ (Agent) │ └───────┬───────┘ │ ▼ ┌───────────────┐ │ Loki │ Speichert & Indexiert │ (Server) │ └───────┬───────┘ │ ▼ ┌───────────────┐ │ Grafana │ Suche & Dashboards │ (bereits da) │ └───────────────┘ ``` #### Warum braucht man das? **Aktuelles Problem:** ```bash # Fehler in der App? Du musst jeden Container einzeln durchsuchen: docker logs manacore-chat-backend | grep error docker logs manacore-todo-backend | grep error docker logs manacore-auth | grep error docker logs manacore-calendar-backend | grep error # ... 15+ weitere Container ``` **Mit Loki:** ``` Grafana Query: {job="docker"} |= "error" | json | level="error" → Alle Fehler aller Container in einer Ansicht → Filterbar nach App, Zeit, User, Request-ID → Korrelation zwischen Services möglich ``` **Konkrete Vorteile:** | Situation | Ohne Loki | Mit Loki | |-----------|-----------|----------| | User meldet Fehler | 20 Min. Suche in 15 Containern | 30 Sek. Query nach Request-ID | | Performance-Problem | Unklar welcher Service | Timeline aller Requests | | Security-Incident | Logs evtl. schon rotiert | 30 Tage Retention | | Debugging nachts | Logs am nächsten Tag weg | Alles gespeichert | #### Wie würde es integriert? **Docker-Compose Ergänzung:** ```yaml services: loki: image: grafana/loki:3.0.0 container_name: manacore-loki ports: - "3100:3100" volumes: - ./loki/config.yaml:/etc/loki/config.yaml - loki_data:/loki command: -config.file=/etc/loki/config.yaml restart: unless-stopped promtail: image: grafana/promtail:3.0.0 container_name: manacore-promtail volumes: - ./promtail/config.yaml:/etc/promtail/config.yaml - /var/run/docker.sock:/var/run/docker.sock:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro command: -config.file=/etc/promtail/config.yaml restart: unless-stopped ``` **Loki Config (loki/config.yaml):** ```yaml auth_enabled: false server: http_listen_port: 3100 common: ring: instance_addr: 127.0.0.1 kvstore: store: inmemory replication_factor: 1 path_prefix: /loki schema_config: configs: - from: 2024-01-01 store: tsdb object_store: filesystem schema: v13 index: prefix: index_ period: 24h storage_config: filesystem: directory: /loki/chunks limits_config: retention_period: 744h # 31 Tage ``` **Promtail Config (promtail/config.yaml):** ```yaml server: http_listen_port: 9080 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: docker docker_sd_configs: - host: unix:///var/run/docker.sock refresh_interval: 5s relabel_configs: - source_labels: ['__meta_docker_container_name'] regex: '/(.*)' target_label: 'container' - source_labels: ['__meta_docker_container_label_com_docker_compose_service'] target_label: 'service' ``` **Ressourcen:** - RAM: ~200-500 MB für Loki - Disk: ~1-5 GB für 30 Tage Logs - CPU: Minimal --- ## Wichtige Ergänzungen ### 3. Uptime Monitoring (Uptime Kuma) #### Was ist das? **Uptime Kuma** ist ein Self-Hosted Monitoring-Tool, das regelmäßig deine Services von außen prüft und bei Ausfällen alarmiert. Es bietet auch eine öffentliche Status-Seite. ``` ┌─────────────────────────────────────────────────────────────────┐ │ UPTIME KUMA │ │ │ │ Checks alle 60 Sekunden: │ │ │ │ ✓ https://mana.how 200 OK Latenz: 142ms │ │ ✓ https://chat.mana.how 200 OK Latenz: 89ms │ │ ✓ https://auth.mana.how/health 200 OK Latenz: 45ms │ │ ✗ https://calendar.mana.how 503 Error ← ALARM! │ │ ✓ https://matrix.mana.how 200 OK Latenz: 234ms │ │ │ │ Uptime (30 Tage): │ │ ████████████████████████████░░ 99.7% │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────┐ │ Benachrichtigungen: │ │ • Telegram │ │ • Matrix │ │ • Email │ │ • Webhook │ └─────────────────────────┘ ``` #### Warum braucht man das? **Unterschied zu internen Health-Checks:** | Aspekt | Interner Health-Check | Uptime Kuma | |--------|----------------------|-------------| | **Perspektive** | Vom Server selbst | Von außen (wie User) | | **Erkennt** | Container-Crash | DNS, Cloudflare, SSL, Container | | **Server offline** | Keine Benachrichtigung! | Sofort Alarm | | **Tunnel-Problem** | Nicht erkennbar | Erkennbar | | **SSL-Ablauf** | Nicht geprüft | Warnung vor Ablauf | **Beispiel:** Der Mac Mini läuft, aber Cloudflare Tunnel ist down: - Interner Health-Check: "Alles OK" ✓ - Uptime Kuma (extern): "Alle Services down!" → Alarm #### Wie würde es integriert? **Option A: Auf einem externen VPS (empfohlen)** ```bash # Auf einem 3€/Monat VPS (Hetzner/Netcup) docker run -d \ --name uptime-kuma \ -p 3001:3001 \ -v uptime-kuma:/app/data \ louislam/uptime-kuma:1 ``` **Option B: Auf dem Mac Mini selbst (eingeschränkt)** ```yaml # docker-compose.macmini.yml services: uptime-kuma: image: louislam/uptime-kuma:1 container_name: manacore-uptime-kuma ports: - "3099:3001" volumes: - uptime_kuma_data:/app/data restart: unless-stopped ``` **Einrichtung:** 1. Web-Interface öffnen: `https://status.mana.how` 2. Monitors hinzufügen: - Type: HTTP(s) - URL: `https://chat.mana.how` - Interval: 60 Sekunden - Retry: 3 3. Benachrichtigungen konfigurieren (Telegram, Matrix) 4. Status-Page erstellen und öffentlich machen **Ressourcen:** - RAM: ~100-200 MB - Disk: ~50 MB - CPU: Minimal --- ### 4. Reverse Proxy (Traefik/Caddy) #### Was ist das? Ein **Reverse Proxy** ist ein Vermittler zwischen eingehenden Anfragen und deinen Backend-Services. Er bietet: - Automatische SSL-Zertifikate - Load Balancing - Request-Routing - Middleware (Auth, Rate-Limiting, Headers) ``` OHNE REVERSE PROXY: ┌──────────┐ │ Internet │──┬──> :3000 chat-web │ │ ├──> :3001 auth │ │ ├──> :3002 chat-backend │ │ ├──> :5173 dashboard │ │ └──> :8008 synapse └──────────┘ (Cloudflare muss jeden Port einzeln routen) MIT REVERSE PROXY: ┌──────────┐ ┌─────────────────┐ ┌──────────────┐ │ Internet │─────>│ Traefik │─────>│ Container │ │ │ :443 │ │ │ │ │ │ │ chat.mana.how │──────│ chat-web │ │ │ │ auth.mana.how │──────│ auth │ │ │ │ api.chat.mana.* │──────│ chat-backend │ └──────────┘ └─────────────────┘ └──────────────┘ │ ├── SSL Termination ├── Rate Limiting ├── Request Logging └── Health Checks ``` #### Warum braucht man das? **Aktuell:** - Cloudflare Tunnel macht das Routing - Funktioniert, aber: - Keine lokalen SSL-Zertifikate zwischen Containern - Keine einheitliche Request-Logs - Kein Rate-Limiting - Cloudflare-Konfiguration nötig für jeden neuen Service **Mit Traefik:** - Service hinzufügen → automatisch erreichbar - Einheitliche Logs aller Requests - Rate-Limiting gegen Missbrauch - Dashboard mit Traffic-Übersicht #### Wie würde es integriert? **Docker-Compose Ergänzung:** ```yaml services: traefik: image: traefik:v3.0 container_name: manacore-traefik command: - "--api.dashboard=true" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--accesslog=true" - "--accesslog.filepath=/logs/access.log" ports: - "80:80" - "443:443" - "8080:8080" # Dashboard volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - traefik_logs:/logs labels: - "traefik.enable=true" - "traefik.http.routers.dashboard.rule=Host(`traefik.mana.how`)" - "traefik.http.routers.dashboard.service=api@internal" chat-web: labels: - "traefik.enable=true" - "traefik.http.routers.chat.rule=Host(`chat.mana.how`)" - "traefik.http.services.chat.loadbalancer.server.port=3000" # Rate Limiting - "traefik.http.middlewares.chat-ratelimit.ratelimit.average=100" - "traefik.http.middlewares.chat-ratelimit.ratelimit.burst=50" - "traefik.http.routers.chat.middlewares=chat-ratelimit" ``` **Alternative: Caddy** Caddy ist einfacher zu konfigurieren und hat automatisches HTTPS: ``` # Caddyfile chat.mana.how { reverse_proxy chat-web:3000 } auth.mana.how { reverse_proxy mana-core-auth:3001 } api.chat.mana.how { reverse_proxy chat-backend:3002 @api path /api/* rate_limit @api 100r/m } ``` **Ressourcen:** - RAM: ~50-100 MB - CPU: Minimal - Disk: Logs --- ## Empfohlene Ergänzungen ### 5. Secrets Management (Vault/Infisical) #### Was ist das? **Secrets Management** ist ein System zur sicheren Speicherung und Verteilung von sensiblen Daten wie: - Datenbank-Passwörter - API-Keys - JWT-Secrets - Verschlüsselungsschlüssel ``` OHNE SECRETS MANAGEMENT: ┌─────────────────────────────────────┐ │ .env Datei auf Disk │ │ │ │ DATABASE_PASSWORD=supersecret123 │ ← Im Klartext! │ JWT_SECRET=myverysecretkey │ ← Wer lesen kann, sieht alles │ OPENAI_API_KEY=sk-abc123... │ ← Git-History? └─────────────────────────────────────┘ MIT VAULT: ┌─────────────────────────────────────┐ │ Vault (verschlüsselt) │ │ │ │ ┌─────────────────────────────┐ │ │ │ ████████████████████████ │ │ ← Verschlüsselt │ │ ████████████████████████ │ │ ← Zugriff nur mit Token │ │ ████████████████████████ │ │ ← Audit-Log wer was las │ └─────────────────────────────┘ │ └─────────────────────────────────────┘ │ ▼ App startet und fragt Vault ┌─────────────────────────────────────┐ │ Container bekommt Secrets │ │ nur in den Speicher │ │ (nie auf Disk) │ └─────────────────────────────────────┘ ``` #### Warum braucht man das? | Aspekt | .env Dateien | Vault/Infisical | |--------|--------------|-----------------| | **Speicherung** | Klartext auf Disk | Verschlüsselt | | **Zugriffskontrolle** | Filesystem-Rechte | Policies & Tokens | | **Audit** | Keins | Wer hat wann was gelesen | | **Rotation** | Manuell | Automatisch möglich | | **Git-Sicherheit** | .gitignore kann vergessen werden | Secrets nie in Git | | **Backup** | Klartext im Backup | Verschlüsselt | **Szenarien:** 1. **Laptop gestohlen** mit Git-Repo → .env lesbar 2. **Mitarbeiter verlässt Team** → Alle Secrets rotieren? 3. **Security-Audit** → Wer hatte Zugriff auf welche Secrets? 4. **Compliance** → DSGVO verlangt Schutz sensibler Daten #### Wie würde es integriert? **Option A: HashiCorp Vault (Enterprise-Grade)** ```yaml services: vault: image: hashicorp/vault:1.15 container_name: manacore-vault ports: - "8200:8200" environment: VAULT_DEV_ROOT_TOKEN_ID: "dev-token" VAULT_DEV_LISTEN_ADDRESS: "0.0.0.0:8200" cap_add: - IPC_LOCK volumes: - vault_data:/vault/data ``` **Option B: Infisical (Einfacher, Open-Source)** ```yaml services: infisical: image: infisical/infisical:latest container_name: manacore-infisical ports: - "8080:8080" environment: ENCRYPTION_KEY: ${INFISICAL_ENCRYPTION_KEY} MONGO_URL: mongodb://mongo:27017/infisical depends_on: - mongo ``` **Verwendung in Apps:** ```typescript // Statt process.env.DATABASE_PASSWORD import { InfisicalClient } from "@infisical/sdk"; const client = new InfisicalClient({ token: process.env.INFISICAL_TOKEN, }); const secret = await client.getSecret({ secretName: "DATABASE_PASSWORD", environment: "production", }); ``` --- ### 6. API Gateway (Kong) #### Was ist das? Ein **API Gateway** ist ein zentraler Eintrittspunkt für alle API-Anfragen. Es bietet: - Authentifizierung & Autorisierung - Rate Limiting - Request/Response Transformation - Caching - Analytics ``` ┌──────────┐ ┌─────────────────┐ ┌──────────────┐ │ Client │─────>│ Kong Gateway │─────>│ Backends │ │ (App) │ │ │ │ │ └──────────┘ │ • Auth prüfen │ │ chat-backend │ │ • Rate Limit │ │ todo-backend │ │ • Transform │ │ calendar-api │ │ • Cache │ │ etc. │ │ • Log │ │ │ └─────────────────┘ └──────────────┘ ``` #### Warum braucht man das? **Aktuell:** - Jeder Backend-Service macht eigenes Rate-Limiting - Auth wird in jedem Service einzeln geprüft - Keine zentrale API-Übersicht **Mit Kong:** - Ein Ort für alle API-Regeln - Einheitliche Rate-Limits - API-Key Management - Plugin-System für Erweiterungen **Wann sinnvoll:** - Viele externe API-Consumer - Verschiedene Rate-Limits für verschiedene User - API-Monetarisierung (Pläne, Quotas) - Komplexe Auth-Anforderungen **Wann NICHT nötig:** - Nur interne Apps - Wenige User - Einfache Auth-Anforderungen #### Wie würde es integriert? ```yaml services: kong: image: kong:3.5 container_name: manacore-kong environment: KONG_DATABASE: "off" KONG_DECLARATIVE_CONFIG: /etc/kong/kong.yml KONG_PROXY_ACCESS_LOG: /dev/stdout KONG_ADMIN_ACCESS_LOG: /dev/stdout ports: - "8000:8000" # Proxy - "8001:8001" # Admin API - "8443:8443" # Proxy SSL volumes: - ./kong/kong.yml:/etc/kong/kong.yml ``` **Kong Config (kong.yml):** ```yaml _format_version: "3.0" services: - name: chat-api url: http://chat-backend:3002 routes: - name: chat-route paths: - /api/chat plugins: - name: rate-limiting config: minute: 100 policy: local - name: key-auth config: key_names: - X-API-Key ``` --- ## Optionale Ergänzungen ### 7. CI/CD Runner #### Was ist das? Ein **CI/CD Runner** führt Build- und Deploy-Prozesse aus. Statt auf GitHub's Servern zu bauen, läuft alles lokal. #### Warum könnte man das brauchen? | Aspekt | GitHub Actions | Self-Hosted Runner | |--------|---------------|-------------------| | **Kosten** | Minuten-Limit (2000/Monat free) | Unbegrenzt | | **Geschwindigkeit** | Geteilte Ressourcen | Dedizierte Hardware | | **Secrets** | In GitHub gespeichert | Lokal | | **Netzwerk** | GitHub → Server (langsam) | Lokal → Lokal | | **ARM-Builds** | Extra Kosten | M4 native | #### Wie würde es integriert? **GitHub Actions Runner:** ```yaml services: github-runner: image: myoung34/github-runner:latest container_name: manacore-github-runner environment: REPO_URL: https://github.com/your-org/manacore-monorepo RUNNER_TOKEN: ${GITHUB_RUNNER_TOKEN} RUNNER_NAME: macmini-runner volumes: - /var/run/docker.sock:/var/run/docker.sock ``` --- ### 8. Container Registry #### Was ist das? Eine **Container Registry** speichert Docker Images. Statt von Docker Hub zu pullen, hostest du deine eigenen Images. #### Warum könnte man das brauchen? - **Unabhängigkeit:** Keine Rate-Limits von Docker Hub - **Geschwindigkeit:** Images lokal verfügbar - **Privatsphäre:** Eigene Images nicht öffentlich - **Kontrolle:** Welche Images wo deployed werden #### Wie würde es integriert? ```yaml services: registry: image: registry:2 container_name: manacore-registry ports: - "5000:5000" volumes: - registry_data:/var/lib/registry ``` --- ### 9. Speech-to-Text (Whisper) #### Was ist das? **Whisper** ist OpenAI's Speech-to-Text Modell, das Audio in Text umwandelt. Es kann lokal laufen (whisper.cpp). #### Warum könnte man das brauchen? - **Matrix Clock Bot:** Sprachnachrichten → Zeiterfassung - **Chat:** Voice Messages transkribieren - **Meetings:** Aufnahmen transkribieren - **Privacy:** Daten bleiben lokal #### Wie würde es integriert? ```yaml services: whisper: image: onerahmet/openai-whisper-asr-webservice:latest container_name: manacore-whisper ports: - "9000:9000" environment: ASR_MODEL: small ASR_ENGINE: faster_whisper deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] ``` **Oder nativ auf Mac (Apple Silicon optimiert):** ```bash brew install whisper-cpp whisper-cpp --model small.en audio.wav ``` --- ## Noch nicht deployed (bereits entwickelt) Diese Apps existieren bereits im Monorepo, sind aber noch nicht auf dem Server: | App | Beschreibung | Status | Priorität | |-----|--------------|--------|-----------| | **Zitare** | Tägliche Inspirations-Zitate | Backend + Web fertig | Hoch | | **Picture** | AI-Bildgenerierung | Braucht GPU/API | Mittel | | **Cards** | Kartenspiel/Deckbuilding | Backend + Web fertig | Niedrig | | **Planta** | Pflanzenpflege-Tracker | In Entwicklung | Niedrig | ### Telegram Bots (nicht deployed) | Bot | Beschreibung | Code vorhanden | |-----|--------------|---------------| | `telegram-todo-bot` | Todo-Management via Telegram | ✓ | | `telegram-nutriphi-bot` | Ernährung loggen via Telegram | ✓ | | `telegram-zitare-bot` | Tägliche Zitate via Telegram | ✓ | | `telegram-project-doc-bot` | Projekt-Dokumentation | ✓ | --- ## Priorisierte Roadmap ### Phase 1: Kritisch (Diese Woche) ``` 1. ✅ Backup-Lösung einrichten └── PostgreSQL + MinIO → Hetzner Storage Box └── Täglich 3:00 Uhr └── 7 Tage Daily, 4 Wochen Weekly, 12 Monate Monthly 2. ✅ Loki + Promtail └── Alle Container-Logs zentral └── Grafana-Integration └── 30 Tage Retention ``` ### Phase 2: Wichtig (Nächste 2 Wochen) ``` 3. 📊 Uptime Kuma (extern) └── Auf separatem VPS └── Alle öffentlichen URLs überwachen └── Telegram-Benachrichtigung 4. 🚀 Zitare deployen └── Bereits entwickelt └── Backend + Web Container hinzufügen └── Cloudflare Tunnel Route ``` ### Phase 3: Empfohlen (Nächster Monat) ``` 5. 🔐 Secrets Management └── Infisical oder Vault └── Alle .env migrieren └── Rotation einrichten 6. 🤖 Weitere Telegram Bots └── todo-bot └── zitare-bot └── nutriphi-bot ``` ### Phase 4: Optional (Backlog) ``` 7. 🎙️ Whisper STT └── Für Matrix Clock Bot └── Voice → Zeiterfassung 8. 🏗️ CI/CD Runner └── Wenn GitHub Actions Limit erreicht ``` --- ## Zusammenfassung | Service | Kategorie | Aufwand | Nutzen | Empfehlung | |---------|-----------|---------|--------|------------| | Backup (restic) | Kritisch | 2h | Datensicherheit | **Sofort** | | Loki + Promtail | Kritisch | 1h | Debugging | **Sofort** | | Uptime Kuma | Wichtig | 30min | Externe Überwachung | Diese Woche | | Zitare | Wichtig | 1h | Bereits entwickelt | Diese Woche | | Traefik/Caddy | Empfohlen | 2h | Einheitliches Routing | Wenn Zeit | | Vault/Infisical | Empfohlen | 4h | Security | Wenn Zeit | | Kong | Optional | 4h | API Management | Bei Bedarf | | Whisper | Optional | 1h | Voice Features | Bei Bedarf | | CI Runner | Optional | 2h | Build-Performance | Bei Bedarf | Die wichtigste Erkenntnis: **Backups sind nicht optional.** Ohne automatisierte Backups ist es nur eine Frage der Zeit, bis Daten verloren gehen.