rybbit: lägg till web analytics med HA-applager #108

Merged
znibb merged 5 commits from feature/rybbit into develop 2026-09-25 17:36:20 +00:00
Owner

Implementerar issue #107 (research/planning) i ett svep, utom backuper och Kiln-trackern som är kvar som uppföljningar.

Vad som ingår

  • kubernetes/apps/rybbit/: namespace, backend (2 replicas), client (2 replicas), Postgres/ClickHouse/Redis (1 replica var), PDB:er, topology spread, probes, preStop, Services, IngressRoute, https-headers-middleware och SOPS-krypterad secret.
  • Routing med paritet mot upstreams Caddyfile: /.well-known/oauth-* + /.well-known/openid-configuration* + /api/* → backend, resten → client.
  • kubernetes/core/traefik/values.yaml: entryPoints.web.forwardedHeaders.trustedIPs=10.244.0.0/16 + helmrelease.sh (Traefik installeras med Helm CLI). Utan detta rensar Traefik Pangolins X-Forwarded-* och Rybbit geolokaliserar till klusternätet.
  • docs/rybbit.md med arkitektur, besluten från #107 och Pangolin-uppsättning.

Beslut (frågorna i #107)

Fråga Beslut
HA-scope 2× backend/client + singel Postgres/Redis/ClickHouse. Accepterad begränsning i v1.
Cron-duplicering CLUSTER_WORKERS=0 + DISABLE_TELEMETRY=true; usage-jobbet är cloud-only; site-baseline är Redis-vald. Inga dubbelkörningar.
Migrationer Körs av entrypointen, men en migrate-initContainer med retry serialiserar kollisionen när två pods startar samtidigt (drizzle-kit tar inget advisory lock).
ClickHouse-lagring nfs-csi (issue #8 pekar mot NFS). NFS-latensen är accepterad i v1.
Klient-IP/geo Traefik litar på podnätet, se ovan.
Session replay Ligger i ClickHouse även self-hosted — ingen S3-backend behövs (R2-kolumnerna är cloud-only).
MAPBOX/LITE_DASHBOARD Avstängda i v1 (kräver ev. egen klientbuild).
Klientimage Upstream-imagen bakas utan build-args → tom NEXT_PUBLIC_BACKEND_URL → relativa /api-URL:er. Inga egna builds behövs.
Env DISABLE_SIGNUP=true (säkert default; admin bootstrappas med ett tillfälligt kubectl set env … =false), DISABLE_TELEMETRY=true, CLUSTER_WORKERS=0, BASE_URL=https://analytics.kobbo.se.

Kvar (medvetet utanför PR:en)

  • Backuper: pg_dump + ClickHouse BACKUP. Rekommendation i docs/rybbit.md: delad pipeline enligt #7/#77.
  • Kiln-trackern: snippet i znibb/lovable (separat repo/PR).
  • Pangolin-resource för analytics.kobbo.se måste skapas manuellt (DNS-wildcard finns redan).

Verifierat

  • kubectl kustomize kubernetes/apps och kubectl kustomize kubernetes/apps/rybbit bygger.
  • kubectl apply --dry-run=server mot prod-klustret validerar alla 20 objekten.
Implementerar issue #107 (research/planning) i ett svep, utom backuper och Kiln-trackern som är kvar som uppföljningar. ## Vad som ingår - `kubernetes/apps/rybbit/`: namespace, backend (2 replicas), client (2 replicas), Postgres/ClickHouse/Redis (1 replica var), PDB:er, topology spread, probes, `preStop`, Services, `IngressRoute`, `https-headers`-middleware och SOPS-krypterad secret. - Routing med paritet mot upstreams `Caddyfile`: `/.well-known/oauth-*` + `/.well-known/openid-configuration*` + `/api/*` → backend, resten → client. - `kubernetes/core/traefik/values.yaml`: `entryPoints.web.forwardedHeaders.trustedIPs=10.244.0.0/16` + `helmrelease.sh` (Traefik installeras med Helm CLI). Utan detta rensar Traefik Pangolins `X-Forwarded-*` och Rybbit geolokaliserar till klusternätet. - `docs/rybbit.md` med arkitektur, besluten från #107 och Pangolin-uppsättning. ## Beslut (frågorna i #107) | Fråga | Beslut | | --- | --- | | HA-scope | 2× backend/client + singel Postgres/Redis/ClickHouse. Accepterad begränsning i v1. | | Cron-duplicering | `CLUSTER_WORKERS=0` + `DISABLE_TELEMETRY=true`; usage-jobbet är cloud-only; site-baseline är Redis-vald. Inga dubbelkörningar. | | Migrationer | Körs av entrypointen, men en `migrate`-initContainer med retry serialiserar kollisionen när två pods startar samtidigt (drizzle-kit tar inget advisory lock). | | ClickHouse-lagring | `nfs-csi` (issue #8 pekar mot NFS). NFS-latensen är accepterad i v1. | | Klient-IP/geo | Traefik litar på podnätet, se ovan. | | Session replay | Ligger i ClickHouse även self-hosted — ingen S3-backend behövs (R2-kolumnerna är cloud-only). | | MAPBOX/LITE_DASHBOARD | Avstängda i v1 (kräver ev. egen klientbuild). | | Klientimage | Upstream-imagen bakas utan build-args → tom `NEXT_PUBLIC_BACKEND_URL` → relativa `/api`-URL:er. Inga egna builds behövs. | | Env | `DISABLE_SIGNUP=true` (säkert default; admin bootstrappas med ett tillfälligt `kubectl set env … =false`), `DISABLE_TELEMETRY=true`, `CLUSTER_WORKERS=0`, `BASE_URL=https://analytics.kobbo.se`. | ## Kvar (medvetet utanför PR:en) - Backuper: `pg_dump` + ClickHouse `BACKUP`. Rekommendation i `docs/rybbit.md`: delad pipeline enligt #7/#77. - Kiln-trackern: snippet i `znibb/lovable` (separat repo/PR). - Pangolin-resource för `analytics.kobbo.se` måste skapas manuellt (DNS-wildcard finns redan). ## Verifierat - `kubectl kustomize kubernetes/apps` och `kubectl kustomize kubernetes/apps/rybbit` bygger. - `kubectl apply --dry-run=server` mot prod-klustret validerar alla 20 objekten.
Deployar Rybbit v2.9.0 i ett eget namespace bakom Traefik på
analytics.kobbo.se: 2x backend + 2x client med rullande uppdateringar,
topology spread och PDB, samt Postgres/ClickHouse/Redis som singelreplicas.

- IngressRoute med paritet mot upstreams Caddyfile (/api + /.well-known
  -> backend, resten -> client) och https-headers-middleware.
- migrate-initContainer med retry serialiserar drizzle-migreringarna som
  annars kraschar nar tva pods startar samtidigt.
- DISABLE_SIGNUP/DISABLE_TELEMETRY/CLUSTER_WORKERS=0 enligt besluten i
  issue #107; inga cronjobb kor dubbelt mellan replicaerna.
- Traefik litar nu pa X-Forwarded-* fran podnatet (10.244.0.0/16), annars
  rensas Pangolins XFF och Rybbit geolokaliserar till klusternatet.
- docs/rybbit.md dokumenterar arkitektur, beslut och Pangolin-uppsattning.

Backuper (pg_dump + ClickHouse BACKUP) och Kiln-trackern ar kvar som
uppfoljningar enligt docs/rybbit.md.
znibb merged commit 67bc031088 into develop 2026-09-25 17:36:20 +00:00
znibb deleted branch feature/rybbit 2026-09-25 17:36:20 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
znibb/kobbo-homelab!108
No description provided.