user@homelab:~/docs$ cat decisions.md

Architektonická rozhodnutí

ADR: klíčová rozhodnutí návrhu, jejich kontext a důsledky

# obsah

Každý záznam popisuje kontext, rozhodnutí a jeho důsledky. Přijaté záznamy se už neupravují; změněné rozhodnutí dostane nový záznam, který ten starý nahradí.

ADRRozhodnutíStav
001k3s přímo na notebookuPřijato
002Ubuntu Server bez grafického prostředíPřijato
003k3s jako distribuce KubernetesPřijato
004Cloudflare Tunnel pro veřejný přístupPřijato
005Tailscale pro správuPřijato
006Správa clusteru jen na serveruPřijato
007GitOps s Flux (pull model)Přijato
008Soukromý repozitář a soukromý registr imagePřijato
009Statický dokumentační web v HugoPřijato

ADR-001: k3s přímo na notebooku

Kontext. Jediný hardware je notebook s 8 GB RAM. Možnosti: WSL2 + kind ve Windows, VM pod Windows, nebo Linux přímo na hardwaru.

Rozhodnutí. Ubuntu Server vedle Windows (dual boot) a k3s přímo na něm.

Důsledky.

  • ✅ všechna paměť pro workloady, provoz 24/7, stabilní adresa v LAN
  • ✅ Windows zůstávají k dispozici
  • ❌ jeden node = jediný bod selhání; obnova stojí na Gitu a zálohách

ADR-002: Ubuntu Server bez grafického prostředí

Kontext. Grafické prostředí stojí 1,5–2 GB RAM. Node se spravuje vzdáleně.

Rozhodnutí. Ubuntu Server LTS bez GUI, správa jen přes SSH.

Důsledky.

  • ✅ víc paměti pro cluster, menší útočná plocha
  • ❌ veškerá práce v terminálu

ADR-003: k3s jako distribuce Kubernetes

Kontext. Cluster musí běžet na jednom nodu s 8 GB a odpovídat verzi zkoušky CKAD (Kubernetes v1.35).

Rozhodnutí. k3s, kanál v1.35.

Důsledky.

  • ✅ jedna binárka včetně containerd, Flannel, CoreDNS, Traefik a local-path úložiště
  • ✅ certifikovaný Kubernetes, stejné API jako na zkoušce
  • ❌ správa clusteru se liší od kubeadm; na CKA je potřeba samostatný kubeadm cluster ve VM

ADR-004: Cloudflare Tunnel pro veřejný přístup

Kontext. Web má být veřejný. Node je na Wi-Fi za dvojitým NATem bez zaručené veřejné IPv4. Port forwarding by vystavil domácí síť skenování.

Rozhodnutí. Konektor cloudflared v clusteru otevře odchozí tunel do Cloudflare; ven se publikuje jen HTTP do Traefiku.

Důsledky.

  • ✅ žádné příchozí porty, HTTPS a ochrana proti DDoS od Cloudflare, vlastní doména
  • ❌ veřejný provoz závisí na Cloudflare; token tunelu je přihlašovací údaj, který se musí chránit

ADR-005: Tailscale pro správu

Kontext. SSH musí fungovat z Macu a iPadu i mimo domácí síť. Možnosti: port forwarding, Cloudflare Access/WARP, Tailscale.

Rozhodnutí. Tailscale na serveru, Macu a iPadu. Autentizaci dál dělá OpenSSH s klíči; Tailscale SSH se nepoužívá.

Důsledky.

  • ✅ žádné příchozí porty, server není z internetu vidět, Termius funguje beze změn
  • ✅ nezávislé na Cloudflare, takže node zůstane dostupný i při výpadku veřejné cesty
  • ❌ na každém zařízení pro správu musí běžet klient Tailscale; může kolidovat s jinými VPN

ADR-006: Správa clusteru jen na serveru

Kontext. Na Macu jsou kubeconfigy i pro jiné clustery. Administrátorský certifikát homelabu na pracovní stanici zvyšuje riziko příkazu do špatného clusteru.

Rozhodnutí. kubectl a k9s běží na serveru přes SSH. Na Macu žádný kubeconfig homelabu.

Důsledky.

  • ✅ administrátorský certifikát nikdy neopustí node, žádná záměna kontextů
  • ✅ stejný způsob práce jako na zkoušce CKAD (terminál na vzdáleném stroji)
  • ❌ grafické nástroje na Macu (Lens, pluginy v IDE) nejsou k dispozici

ADR-007: GitOps s Flux (pull model)

Kontext. Nasazení má proběhnout automaticky po git push. GitHub se do clusteru nedostane a otevřít mu přístup by bylo v rozporu s ADR-004 a ADR-005.

Rozhodnutí. GitHub Actions sestaví a publikuje image; Flux v clusteru si repozitář stáhne a aplikuje. Git je jediný zdroj pravdy.

Důsledky.

  • ✅ mimo cluster nejsou žádné přístupy do clusteru; Flux používá deploy klíč jen pro čtení
  • ✅ ruční odchylky se automaticky vrací; rollback je git revert
  • ❌ ruční změny v clusteru jen s pozastaveným Fluxem, jinak je vrátí
  • ❌ od pushe po web ~1,5–3 minuty

ADR-008: Soukromý repozitář a soukromý registr image

Kontext. Repozitář obsahuje konfiguraci infrastruktury. Image obsahuje jen veřejný obsah, ale nemá být veřejně dostupný.

Rozhodnutí. Soukromý repozitář na GitHubu a soukromý balíček v GHCR; cluster stahuje image s tokenem read:packages uloženým jako Secret ghcr-pull.

Důsledky.

  • ✅ konfigurace i image vidí jen vlastník
  • ❌ v clusteru je token, který jednou ročně vyprší a musí se obnovit

ADR-009: Statický dokumentační web v Hugo

Kontext. Dokumentace má být verzovaná spolu s infrastrukturou, veřejná, dvojjazyčná a levná na provoz přímo na nodu.

Rozhodnutí. Hugo s vlastní šablonou (bez externích témat a CDN), servírované přes nginx bez root práv, čeština a angličtina vedle sebe.

Důsledky.

  • ✅ rychlé, statické, na serveru se nic nespouští; možná přísná CSP
  • ✅ obsah je Markdown ve stejném repozitáři jako konfigurace clusteru
  • ❌ šablonu je potřeba udržovat vlastními silami