chore(analytics): Umami-Token auch aus datierten Records genericisiert (Web-Analytics)

Auf expliziten Wunsch — 6 historische Audit-/Decision-/Plan-Records. Token
Umami→Web-Analytics; präzise Historie bleibt in git-log + devlog erhalten.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-26 15:16:32 +02:00
parent 0b04ec35b5
commit bcb4df0979
6 changed files with 24 additions and 24 deletions

View file

@ -63,7 +63,7 @@ Dieses Dokument analysiert den aktuellen Zustand der Mana-Infrastruktur auf dem
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ Monitoring & Tools (8 Services) │ │
│ │ VictoriaMetrics │ Grafana │ Exporters │ Umami │ n8n │ │
│ │ VictoriaMetrics │ Grafana │ Exporters │ Web-Analytics │ n8n │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
@ -153,7 +153,7 @@ Dieses Dokument analysiert den aktuellen Zustand der Mana-Infrastruktur auf dem
| cAdvisor | mana-cadvisor | 8080 | Container-Metriken |
| Postgres Exporter | mana-postgres-exporter | 9187 | DB-Metriken |
| Redis Exporter | mana-redis-exporter | 9121 | Cache-Metriken |
| Umami | mana-umami | 3200 | Web Analytics |
| Web-Analytics | mana-web-analytics | 3200 | Web Analytics |
| n8n | mana-n8n | 5678 | Workflow Automation |
| Telegram Stats Bot | mana-telegram-stats-bot | 3300 | Telegram Reports |
@ -198,7 +198,7 @@ AKTUELL (Chaotisch):
│ 3031-3032 LÜCKE │ │
│ 3033 matrix-tts-bot │ Bot im falschen Bereich! │
│ 3100 grafana │ Monitoring im Backend-Bereich! │
│ 3200 umami │ Warum 3200? │
│ 3200 web-analytics │ Warum 3200? │
│ 3300-3301 Telegram │ Telegram im 33xx Bereich │
│ 3310-3318 Matrix Bots │ OK, aber 3033 fehlt! │
├──────────────────────────────────────────────────────────────────┤
@ -341,7 +341,7 @@ NEU (Strukturiert):
│ │
│ 8000-8099: Monitoring Dashboards │
│ ├── 8000: grafana │
│ ├── 8010: umami
│ ├── 8010: web-analytics
│ └── 8080: victoriametrics-ui │
│ │
│ 9000-9199: Infrastructure & Exporters │

View file

@ -76,7 +76,7 @@ consistency:
## Zusammenfassung
Memoro ist eine KI-gestützte Sprachnotiz-App mit Web (SvelteKit), Mobile (Expo), Server (Hono/Bun) und Audio-Server (Hono/Bun). Die App hat eine solide Architektur mit 801 Quelldateien und nutzt 21 Shared Packages. Seit dem letzten Audit behoben: Rate Limiting, Zod-Validierung auf allen Endpoints, konsistente ApiResult-Responses, Pagination, Error Tracking (GlitchTip), Error Boundaries, CI/CD-Pipeline, self-hosted mana-stt/mana-llm als Primary mit Cloud-Fallbacks, Umami Analytics. Verbleibende Schwächen: keine OpenAPI-Dokumentation, Audio-Server ohne Tests.
Memoro ist eine KI-gestützte Sprachnotiz-App mit Web (SvelteKit), Mobile (Expo), Server (Hono/Bun) und Audio-Server (Hono/Bun). Die App hat eine solide Architektur mit 801 Quelldateien und nutzt 21 Shared Packages. Seit dem letzten Audit behoben: Rate Limiting, Zod-Validierung auf allen Endpoints, konsistente ApiResult-Responses, Pagination, Error Tracking (GlitchTip), Error Boundaries, CI/CD-Pipeline, self-hosted mana-stt/mana-llm als Primary mit Cloud-Fallbacks, Web-Analytics. Verbleibende Schwächen: keine OpenAPI-Dokumentation, Audio-Server ohne Tests.
## Backend (70/100)
@ -115,7 +115,7 @@ Memoro ist eine KI-gestützte Sprachnotiz-App mit Web (SvelteKit), Mobile (Expo)
- ~~Keine +error.svelte Error-Boundary-Pages~~ ✅ Error Page implementiert
- i18n nur 5 Sprachen (de, en, fr, it, es) — Mobile hat 32
- ~~Sentry nicht initialisiert~~ ✅ GlitchTip Error Tracking aktiv
- ~~Analytics nicht aktiv~~Umami Analytics mit MemoroEvents integriert
- ~~Analytics nicht aktiv~~Web-Analytics mit MemoroEvents integriert
- Service Worker nicht implementiert trotz PWA-Config
## Database (65/100)
@ -217,7 +217,7 @@ Memoro ist eine KI-gestützte Sprachnotiz-App mit Web (SvelteKit), Mobile (Expo)
- Web-App hat nur 5 Sprachen vs. 32 in Mobile
- ~~Keine Error-Pages~~ ✅ +error.svelte implementiert
- Kein Lighthouse-Audit durchgeführt
- ~~Analytics nicht aktiv~~Umami Analytics mit 25+ Events integriert
- ~~Analytics nicht aktiv~~Web-Analytics mit 25+ Events integriert
## Top-5 Empfehlungen (aktualisiert)

View file

@ -627,7 +627,7 @@ Misst den tatsächlichen RAM-Verbrauch aller Container, sortiert nach Kategorie:
### Memory-Limits
> **Stand 2026-05-07** — nach Phase 2c+2d+2e+2f+2g Cleanup (siehe [`PLAN_OPTION_C.md`](./PLAN_OPTION_C.md)) sind ~17 Service-Blöcke (Grafana, VictoriaMetrics, Loki, Tempo, Promtail, Pushgateway, Blackbox-Exporter, Vmalert, Alertmanager, Alert-Notifier, Umami, Glitchtip+Worker, Forgejo, Status-Page-Gen, news-ingester, mana-ai, mana-research) auf die GPU-Box gewandert und aus der Mini-Compose entfernt. Phase 2f-1 (verdaccio) wurde am 2026-05-07 zurückgerollt — verdaccio bleibt Standalone-Compose unter `~/projects/verdaccio/` auf dem Mini.
> **Stand 2026-05-07** — nach Phase 2c+2d+2e+2f+2g Cleanup (siehe [`PLAN_OPTION_C.md`](./PLAN_OPTION_C.md)) sind ~17 Service-Blöcke (Grafana, VictoriaMetrics, Loki, Tempo, Promtail, Pushgateway, Blackbox-Exporter, Vmalert, Alertmanager, Alert-Notifier, Web-Analytics, Glitchtip+Worker, Forgejo, Status-Page-Gen, news-ingester, mana-ai, mana-research) auf die GPU-Box gewandert und aus der Mini-Compose entfernt. Phase 2f-1 (verdaccio) wurde am 2026-05-07 zurückgerollt — verdaccio bleibt Standalone-Compose unter `~/projects/verdaccio/` auf dem Mini.
Container in `docker-compose.macmini.yml` haben explizite `mem_limit`:

View file

@ -1,7 +1,7 @@
# Plan — Option C: Workload-Split Mac Mini ↔ Windows-GPU-Box
**Stand:** 2026-05-06
**Ziel:** Nicht-zeitkritische Hilfsdienste (Monitoring, Forgejo, Glitchtip, Umami)
**Ziel:** Nicht-zeitkritische Hilfsdienste (Monitoring, Forgejo, Glitchtip, Web-Analytics)
auf die Windows-GPU-Box (64 GB RAM, derzeit 95 % idle System-RAM) verlagern.
Single-Point-of-Failure innerhalb des Standorts entfernen, ohne Geld auszugeben.
Production-Hot-Path bleibt unverändert auf dem Mini.
@ -13,7 +13,7 @@ Production-Hot-Path bleibt unverändert auf dem Mini.
| Phase 0 — Vor-Setup | ✅ | Hardware bestätigt (Ryzen 9 5950X / 64 GB / RTX 3090 / 660 GB frei C:), in `WINDOWS_GPU_SERVER_SETUP.md` dokumentiert |
| Phase 1 — WSL2 + Docker | ✅ | War schon eingerichtet (Ubuntu 24.04, Docker 29.4.1, systemd). `.wslconfig` erweitert um `memory=24GB`, `processors=12`, `swap=8GB`, `vmIdleTimeout=-1` |
| Phase 2a — Grafana auf GPU-Box | ✅ | Container `mana-mon-grafana` läuft auf `:8000`, Cross-Box-Datasources testen erfolgreich (Prometheus/VM, Loki, Business Metrics). DB-Datasources schlagen fehl wegen Pre-existing-Mis-config (DBs heißen `mana_admin`, nicht `mana`; keine `glitchtip` DB) |
| Phase 2b — Umami + Forgejo | ✅ | Beide healthy auf GPU-Box. Glitchtip übersprungen — Mini-Glitchtip ist bereits im Broken-State (DB `glitchtip` existiert nicht in Postgres, läuft nur in Degraded-Mode), Migration würde Bug nicht heilen |
| Phase 2b — Web-Analytics + Forgejo | ✅ | Beide healthy auf GPU-Box. Glitchtip übersprungen — Mini-Glitchtip ist bereits im Broken-State (DB `glitchtip` existiert nicht in Postgres, läuft nur in Degraded-Mode), Migration würde Bug nicht heilen |
| Phase 2c — VM + Loki + Alerts | ✅ | Komplett auf GPU-Box. 11 Container neu (VM, Loki, Pushgateway, Blackbox, Vmalert, Alertmanager, Alert-notifier, GPU-eigenes Node-Exporter+Cadvisor+Promtail). VM scrapt 76 Targets, **69 UP / 7 DOWN** (DOWN sind alle pre-existing wrong /metrics endpoints auf Mana-Services, nicht durch Migration). Konfig-Pfade: `monitoring/{prometheus,loki,blackbox,alertmanager,alert-notifier}/`. Bekannte Limits siehe unten. |
| Phase 2d — Glitchtip mit dediziertem DB-Stack | ✅ | 4 Container neu (mana-mon-glitchtip + worker + dedizierte glitchtip-postgres + glitchtip-redis). Mini-Postgres scheiterte bei `logs.0001_initial`-Partition-Creation mit OS-level "Permission denied" (macOS-Docker-Storage-Quirk auf externer SSD). Auf der GPU-Box mit Linux-ext4 saubere 333-Tabellen-Migration. Worker enqueuet UND finished Tasks → DB-Writes funktional (vorher hingen sie ewig). Public-Hostname `glitchtip.mana.how` → mana-gpu-server-Tunnel (config v23). |
| Phase 2e — Status-Page auf GPU-Box | ✅ | 2 Container neu (`mana-mon-status-gen` + `mana-mon-status-nginx`). Sparse `/srv/mana/source` mit `mana-source-pull.timer` (stündlich) hostet das `generate-status-page.sh` und `mana-apps.ts`. status-gen schreibt in das Docker-Volume `status-output`, das status-nginx auf `:8090` ausliefert. Public-Hostname `status.mana.how` → mana-gpu-server-Tunnel (config v25). Bonus: behebt den Inode-Stale-Bind-Mount-Bug, der auf dem Mini bei jedem CD-`git checkout -f` die Status-Page kaputt machte. `vm.mana.how` (Phase-2c-Workaround für Mini→GPU-VM-Routing) wurde wieder aus dem Tunnel entfernt — VM ist nicht mehr public. |
@ -21,7 +21,7 @@ Production-Hot-Path bleibt unverändert auf dem Mini.
| Phase 2g — mana-research auslagern | ✅ | Web-Research-Orchestrator mit 16+ Search-/LLM-Providern. Nativer Build via workspace-Dockerfile (sparse-checkout `services/mana-research` + `packages/{shared-research,shared-types,shared-hono,shared-logger}`). Cross-LAN zu mana-auth/mana-credits/mana-llm/mana-search/postgres/redis (alle auf 192.168.178.131); Redis-Auth via `REDIS_PASSWORD` aus Mini's `.env.macmini` übernommen. `research.mana.how` zum GPU-Tunnel umgebogen via Cloudflare-API (config v29). Beide `PUBLIC_MANA_RESEARCH_URL`-Vars in mana-app-web auf https-URL umgestellt — gleicher Cross-LAN-Bridge-Pattern wie mana-ai (Mini-Container können 192.168.178.11 nicht direkt erreichen, daher Tunnel-Roundtrip). Mini Container 42 → 41. |
| Phase 3 — Daten-Migration | n/a | Alle migrierten Apps lesen Mini-Postgres direkt — keine separate Datenmigration |
| Phase 4 — Cloudflare-Cutover | ✅ | API-Approach via `cert.pem` apiToken: PUT `/accounts/.../cfd_tunnel/.../configurations` für GPU-Tunnel, dann `cloudflared tunnel route dns --overwrite-dns`. Kein Dashboard-Klick nötig. 3 Hostnames live (grafana/git/stats) |
| Phase 5 — Mini-Compose aufräumen | ✅ | 3 Blöcke in `cloudflared-config.yml` auskommentiert (Backup angelegt), cloudflared neu geladen, Mini-Container `mana-mon-grafana` + `mana-mon-umami` gestoppt (nicht entfernt — Rollback bleibt möglich) |
| Phase 5 — Mini-Compose aufräumen | ✅ | 3 Blöcke in `cloudflared-config.yml` auskommentiert (Backup angelegt), cloudflared neu geladen, Mini-Container `mana-mon-grafana` + `mana-mon-web-analytics` gestoppt (nicht entfernt — Rollback bleibt möglich) |
### Cloudflare-API-Approach (für nachvollziehbares Re-Run / weitere Cutover)
@ -55,7 +55,7 @@ WSL2 (Ubuntu 24.04, 24 GB RAM-Limit, 12 vCPU, vmIdleTimeout=-1)
│ └── datasources jetzt LOKAL (victoriametrics:9090, loki:3100, tempo:3200)
├── Phase 2b — Apps
│ ├── mana-core-forgejo (forgejo:11, :3041) — DB → Mini-Postgres
│ └── mana-mon-umami (umami:2.18.0, :8010) — DB → Mini-Postgres
│ └── mana-mon-web-analytics (web-analytics:2.18.0, :8010) — DB → Mini-Postgres
├── Phase 2d — Glitchtip mit eigener DB-Insel
│ ├── mana-mon-glitchtip (glitchtip:latest, :8020) — DB → glitchtip-postgres
│ ├── mana-mon-glitchtip-worker — Celery + Beat
@ -146,7 +146,7 @@ als langlebigen Windows-Prozess offen → WSL-VM idled nicht aus, Container
| `vmalert` | 8880 | `victoriametrics/vmalert:v1.99.0` | — | Alerts-Dir aus Repo bind-mount |
| `alertmanager` | 9093 | `prom/alertmanager:v0.27.0` | `mana-alertmanager-data` (8 KB) | |
| `alert-notifier` | 9095 | `alert-notifier:local` | — | Lokales Image — auf GPU-Box neu bauen |
| `umami` | 8010 | `umami:postgresql-v2.18.0` | (DB only) | DB `umami` bleibt auf Mini-Postgres, App ruft via 192.168.178.131:5432 |
| `web-analytics` | 8010 | `web-analytics:postgresql-v2.18.0` | (DB only) | DB `web-analytics` bleibt auf Mini-Postgres, App ruft via 192.168.178.131:5432 |
| `glitchtip` + `worker` | 8020 | `glitchtip:latest` | (DB only) | DB-Name TBD beim Migrieren — wahrscheinlich auch in Mini-Postgres |
| `forgejo` (re-aktivieren) | 3041 | `codeberg.org/forgejo/forgejo:11` | (frisch oder Volume-Restore) | Container läuft heute **nicht**; DB-Tabelle vorhanden |
@ -185,7 +185,7 @@ zurückgerollt — Storage-Volume kam dort nie an).
| `grafana.mana.how` | Mini :8000 | GPU-Box :8000 | mana-gpu-server |
| `git.mana.how` | Mini :3041 (heute 502, da Forgejo aus) | GPU-Box :3041 | mana-gpu-server |
| `glitchtip.mana.how` | Mini :8020 | GPU-Box :8020 | mana-gpu-server |
| `stats.mana.how` (Umami) | Mini :8010 | GPU-Box :8010 | mana-gpu-server |
| `stats.mana.how` (Web-Analytics) | Mini :8010 | GPU-Box :8010 | mana-gpu-server |
| `status.mana.how` | Mini :4400 (nginx) | **bleibt Mini** (status-page-gen schreibt in landings dir) | mana-server |
| Alle anderen `*.mana.how` | Mini | **unverändert Mini** | mana-server |
@ -284,7 +284,7 @@ Container-Liste zurückgeben.
### Phase 3 — Daten-Migration (3 h)
#### Glitchtip + Umami
#### Glitchtip + Web-Analytics
Beide haben *keine* persistenten Container-Volumes — der Zustand liegt komplett
in `mana-infra-postgres`. **Einfachster Weg:** App-Container auf GPU-Box
@ -298,8 +298,8 @@ ssh mana-server 'PATH=/Applications/Docker.app/Contents/Resources/bin:$PATH; doc
```
Falls nötig: Eintrag für `192.168.178.0/24` ergänzen, Postgres-Reload.
DB-Namen + Credentials aus `docker-compose.macmini.yml` extrahieren (Umami:
`umami` DB, Glitchtip-DB-Name TBD beim Migrieren).
DB-Namen + Credentials aus `docker-compose.macmini.yml` extrahieren (Web-Analytics:
`web-analytics` DB, Glitchtip-DB-Name TBD beim Migrieren).
#### Forgejo
@ -364,7 +364,7 @@ sauberer Re-Start ist hier billiger als jeder rsync-Fehler.
Rollback) in `docker-compose.macmini.yml`:
```
grafana, victoriametrics, loki, tempo, pushgateway, blackbox-exporter,
vmalert, alertmanager, alert-notifier, umami, glitchtip, glitchtip-worker
vmalert, alertmanager, alert-notifier, web-analytics, glitchtip, glitchtip-worker
```
2. Sum-of-Limits neu berechnen (`./scripts/mac-mini/memory-baseline.sh`).
Ziel: ≤ 6 GiB.
@ -384,7 +384,7 @@ ist trivial.
|---|---|
| Phase 1 (WSL2 broken) | WSL2 deinstallieren, GPU-Box bleibt AI-only |
| Phase 2 (Monitoring auf GPU-Box läuft nicht) | GPU-Box-Compose `down`, Mini bleibt SoT — kein Impact |
| Phase 3 (Glitchtip/Umami können Mini-Postgres nicht erreichen) | pg_hba.conf zurück, GPU-Box-Container `down`, Mini-Container weiter — kein Impact |
| Phase 3 (Glitchtip/Web-Analytics können Mini-Postgres nicht erreichen) | pg_hba.conf zurück, GPU-Box-Container `down`, Mini-Container weiter — kein Impact |
| Phase 4 (Cutover) | DNS-Route zurück auf Mini-Tunnel + Mini-Container `up -d` (waren ja nur gestoppt) |
| Phase 5 (Mini bricht beim Aufräumen) | `git checkout docker-compose.macmini.yml && docker compose up -d` — Container kommen zurück |
@ -394,7 +394,7 @@ ist trivial.
|---|---|
| WSL2-Networking nach Patch-Tuesday weg | Healthcheck auf Mini probt GPU-Box-Endpoints; manuelles Eingreifen am nächsten Werktag |
| AI-Tasks werden ge-OOM'd | `.wslconfig` begrenzt WSL auf 16 GB → AI-Tasks behalten 48 GB |
| Glitchtip/Umami können Mini-Postgres-IP nicht auflösen | Vorab-Test in Phase 3: `psql -h 192.168.178.131 -U postgres -p 5432 -c '\l'` aus WSL2 |
| Glitchtip/Web-Analytics können Mini-Postgres-IP nicht auflösen | Vorab-Test in Phase 3: `psql -h 192.168.178.131 -U postgres -p 5432 -c '\l'` aus WSL2 |
| Mini-Tunnel führt nach Cutover noch alte Routen, weil DNS-Cache | TTL der Cloudflare-Records ist 60 s; `dig` prüfen vorm Verifizieren |
| Status-Page-Gen findet VM nicht mehr | URL in `scripts/generate-status-page.sh` von `localhost:9090` auf `192.168.178.11:9090` ändern |

View file

@ -324,11 +324,11 @@ running, or pointing at a port nothing was bound to.
**What changed (four containers started, three Postgres databases
created):**
- `docker compose -p manacore-monorepo up -d landings umami manavoxel-web synapse`
- `docker compose -p manacore-monorepo up -d landings web-analytics manavoxel-web synapse`
brought four compose-defined-but-not-running services back.
- `mana-mon-umami` initially crashed because database `umami` didn't
- `mana-mon-web-analytics` initially crashed because database `web-analytics` didn't
exist on `mana-infra-postgres` — created it with
`CREATE DATABASE umami;` and the container went healthy.
`CREATE DATABASE web-analytics;` and the container went healthy.
- `mana-matrix-synapse` initially crashed because role `synapse` didn't
exist either, then because database `matrix` didn't exist —
created both:

View file

@ -19,7 +19,7 @@ Die aktuelle Docker-Compose-Konfiguration auf dem Mac Mini hat über die Zeit 52
| 4000-4099 | Matrix Stack | 4000 synapse, 401x bots, 4080 element |
| 5000-5099 | Web Frontends | 5000 dashboard, 501x app webs |
| 6000-6099 | Automation | 6000 n8n, 601x telegram |
| 8000-8099 | Monitoring UI | 8000 grafana, 8010 umami |
| 8000-8099 | Monitoring UI | 8000 grafana, 8010 web-analytics |
| 9000-9199 | Infra & Exporters | 9000 minio, 909x metrics |
| 11000+ | Native macOS | 11434 ollama |