docs(sesja): kapala.org → Cloudflare wildcard DNS-01, HA i Immich na mesh

Sesja 2026-06-30: migracja DNS kapala.org z 42.pl na Cloudflare, wildcard
*.kapala.org przez DNS-01, ha/immich.kapala.org przez NPM@PIHA mesh-only.

- nowy session log z root-cause buga "unrecognized name" (NPM duplikuje
  proxy_http_version przy Websockets ON) + wzorzec migracji usługi na mesh
- backlog: gotchas (NPM WS config, CF auto-proxy DKIM) + TODO (migracja
  okit.pl, foty renew, cleanup ha-ken add-on, stale ha.okit.pl)
- topology: nowa sekcja ingress (ha/immich → NPM@PIHA, wildcard cert)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Oskar Kapala 2026-06-30 16:23:57 +02:00
parent 48107ef2c1
commit 831bbedffa
3 changed files with 151 additions and 0 deletions

View file

@ -39,6 +39,75 @@ historia incydentów, out-of-band watchdog.
## Aktywne
### Gotchas (z 2026-06-30 — migracja kapala.org → Cloudflare/wildcard)
**Data**: 2026-06-30
**Źródło**: sesja 2026-06-30 (`docs/sessions/2026-06-30-kapala-cloudflare-wildcard-mesh.md`)
- **NPM custom WS config + Websockets Support:** NIE wklejać
`proxy_http_version 1.1;` do Advanced gdy Websockets Support = ON.
NPM dodaje tę dyrektywę sam → duplikat → nginx -t failuje → plik
proxy_host/<id>.conf się NIE generuje → "unrecognized name" mimo
dobrego certu. Objaw mylący (wygląda jak problem certu/DNS).
Diagnoza: `strings /data/database.sqlite | grep <domena>` → pole nginx_err.
- **Cloudflare auto-proxy na import:** CF proxuje A/CNAME przy dodaniu strefy.
DKIM CNAME (fm1/2/3._domainkey) proxied = zepsuty podpis maila.
Zawsze przełączyć na DNS only (szara chmurka) przed aktywacją.
Reserved/CGNAT IP (Tailscale 100.x) CF wymusza DNS only automatycznie.
---
### Migracja okit.pl → Cloudflare (większy projekt, firmowa domena)
**Data**: 2026-06-30
**Źródło**: sesja 2026-06-30 (`docs/sessions/2026-06-30-kapala-cloudflare-wildcard-mesh.md`)
Naprawi wszystkie wygasłe certy okit.pl naraz (HTTP-01 failuje przy mesh DNS):
ap, audiobooks, code-server, dysk, forgejo, ha-embed, hagc, ngpm, node-red,
okit.pl, pihole, ha.okit.pl. Wzorzec jak kapala.org: NS na CF, wildcard *.okit.pl
przez DNS-01, przepiąć hosty. UWAGA: okit.pl ma usługi publiczne (foty) —
rozdzielić mesh-only od publicznych. Ostrożnie — firmowa domena.
---
### foty.kapala.org renew failuje (#47, expired 2026-06-19, HTTP-01)
**Data**: 2026-06-30
**Źródło**: sesja 2026-06-30 (`docs/sessions/2026-06-30-kapala-cloudflare-wildcard-mesh.md`)
Foty są PUBLICZNE celowo (zewn. dostęp za hasłem NPM) — port 80 powinien
być dostępny, więc HTTP-01 powinno działać. Sprawdzić czemu failuje
(DNS foty wskazuje na zły IP? port 80 zablokowany?). NIE przenosić na mesh.
---
### Cleanup po błędnej ścieżce HA-Tailscale-addon (z 2026-06-29)
**Data**: 2026-06-30
**Źródło**: sesja 2026-06-30 (`docs/sessions/2026-06-30-kapala-cloudflare-wildcard-mesh.md`)
- ha-ken: Stop + Uninstall add-on Tailscale
- Tailscale admin: usunąć node ha-ken (100.98.128.40)
- 42.pl/okit.pl: usunąć rekord ha-ken → 87.205.110.38 (jeśli jest)
---
### Stary ha.okit.pl (cert wygasł 6/28, teraz "Not Used")
**Data**: 2026-06-30
**Źródło**: sesja 2026-06-30 (`docs/sessions/2026-06-30-kapala-cloudflare-wildcard-mesh.md`)
Zostawić lub usunąć proxy host + DNS. Niepilne (martwy, nie szkodzi).
---
### Stopniowa migracja usług domowych okit.pl → kapala.org (mesh-only)
**Data**: 2026-06-30
**Źródło**: sesja 2026-06-30 (`docs/sessions/2026-06-30-kapala-cloudflare-wildcard-mesh.md`)
dysk, audiobooks, budget, code-server, home, ha-embed, node-red... wg wzorca
migracji usługi na kapala.org (patrz sesja: CF rekord A → 100.108.208.3 DNS only,
NPM proxy host z wildcard *.kapala.org, Advanced PUSTE, weryfikacja grep+curl).
---
### `deploy-node.sh` nie reloaduje config-driven serwisów (cicha rozbieżność deploy↔config)
**Data**: 2026-06-26

View file

@ -0,0 +1,57 @@
# 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

View file

@ -6,6 +6,31 @@ deployment:
mode: pull
orchestrator: saturn
# Ingress dla usług domowych przez NPM @ PIHA + wildcard cert kapala.org.
# Od 2026-06-30. Poprzednia ścieżka (add-on Tailscale na ha-ken) PORZUCONA.
# DNS kapala.org: Cloudflare, wildcard *.kapala.org via DNS-01 (auto-renew).
# Mail: Fastmail (MX/DKIM/SPF na CF, DNS only).
# Subdomeny mesh: A → 100.108.208.3 (Tailscale PIHA), DNS only.
ingress:
dns_provider: cloudflare # kapala.org od 2026-06-30
wildcard_cert:
domain: "*.kapala.org"
method: dns-01 # Cloudflare DNS-01, auto-renew
proxy: npm-piha # Nginx Proxy Manager @ PIHA
services:
home_assistant:
host: 192.168.31.7
port: 8123
ingress: ha.kapala.org # NPM @ PIHA, cert *.kapala.org, mesh-only
access: tailscale # 100.108.208.3
cert: wildcard-kapala # DNS-01 Cloudflare, auto-renew
immich:
host: 192.168.31.5
port: 2283
ingress: immich.kapala.org # NPM @ PIHA, cert *.kapala.org, mesh-only
access: tailscale
cert: wildcard-kapala
nodes:
saturn: