# 2026-06-30 — Migracja kapala.org → Cloudflare + wildcard DNS-01, HA i Immich na mesh

## Cel
Trwałe rozwiązanie problemu zdalnego dostępu do HA (i innych usług domowych)
przez Tailscale. Odejście od HTTP-01 per-host (wygasające certy przy mesh DNS)
na rzecz wildcard cert przez DNS-01.

## Co zrobiono

### Migracja DNS kapala.org: 42.pl → Cloudflare
- Eksport strefy z 42.pl (AXFR, 13 rekordów) jako siatka bezpieczeństwa
- Dodanie kapala.org do Cloudflare (Free), import + ręczne uzupełnienie
- KRYTYCZNE: CF auto-proxuje rekordy na import — wszystkie A/CNAME
  przełączone na "DNS only" (szara chmurka). DKIM CNAME proxied = zepsuty
  podpis maila. Wszystkie 9 rekordów zweryfikowane 1:1 z eksportem.
- NS w VipoWer: fns1/fns2.42.pl → dom.ns.cloudflare.com / katja.ns.cloudflare.com
- Propagacja ~45 min. Mail (Fastmail MX/DKIM/SPF) bez przerwy przez całą migrację.

### Wildcard cert DNS-01
- CF API token (Zone:DNS:Edit, scope kapala.org)
- NPM → SSL → Let's Encrypt via DNS → Cloudflare → *.kapala.org + kapala.org
- Cert #49 (npm-49) wydany, auto-renew przez DNS-01 potwierdzony (renew zadziałał)
- Expires 2026-09-28, odnawia się sam

### Usługi przeniesione na kapala.org (mesh-only)
- ha.kapala.org → 192.168.31.7:8123 (cert wildcard, WS ON)
- immich.kapala.org → 192.168.31.5:2283 (cert wildcard, WS ON)
- DNS w CF: rekordy A → 100.108.208.3 (Tailscale PIHA, DNS only/reserved IP)

## Bugi rozwiązane

### "unrecognized name" na ha.kapala.org mimo dobrego certu (root cause)
Objaw: cert OK (npm-49), DNS OK, host "Online" w UI, ale curl → TLS
unrecognized name. Plik proxy_host/4.conf nie istniał.
Przyczyna: custom Advanced config zawierał `proxy_http_version 1.1;`,
a NPM dodaje tę dyrektywę SAM przy Websockets Support = ON.
Duplikat → `nginx -t` odrzucał cały 4.conf → plik się nie generował.
Diagnoza przez `strings /data/database.sqlite | grep kapala`:
  nginx_err: "proxy_http_version directive is duplicate in 4.conf:68"
Fix: usunięcie `proxy_http_version 1.1;` z Advanced. Plik się wygenerował.

### immich.okit.pl 403 Forbidden (red herring → nie ruszany)
403 od openresty = Access List "Local" blokuje mesh, NIE cert (cert żył do 9/28).
Decyzja: zamiast zmieniać Access List — przeniesiono na immich.kapala.org
(mesh-only, wildcard cert). immich.okit.pl zostaje do migracji okit.pl.

## Wzorzec migracji usługi na kapala.org (mesh)
1. CF: rekord A <usługa> → 100.108.208.3 (DNS only)
2. NPM proxy host: forward wewn. IP:port, Access List = Publicly Accessible,
   cert *.kapala.org, Advanced PUSTE (zero proxy_http_version!)
3. Weryfikacja: grep conf (plik istnieje) + curl (cert *.kapala.org + 200/302)
4. Zmiana URL w apce/kliencie

## Stan końcowy
- ha.kapala.org, immich.kapala.org — działają przez mesh, zielona kłódka
- Mail kapala.org (Fastmail) — bez przerwy, MX/DKIM/SPF OK
- Wildcard *.kapala.org — auto-renew DNS-01 potwierdzony
