5.2 KiB
Sesja 2026-06-08 — onboarding LUSTRO (RPi4 / Magic Mirror / KEN)
Cel
Budowa reużywalnego narzędzia onboardingu nodów scripts/onboard/ (bash idempotentny,
NIE Ansible — świadoma decyzja), napędzanego deklaratywnym manifestem
hosts/<node>/node.yaml. Pierwszy realny node: LUSTRO.
Node LUSTRO (fakty z preflight)
- RPi4, aarch64, Debian bookworm, hostname pimirror2, sieć KEN 192.168.31.x
- RAM 4 GB (MM zjada ~1.7 Gi — ten sam profil co VPS z OOM 2026-06-01 →
mem_limitobowiązkowy) - dysk 58 G / 48% (luz)
- docker 29.5.3 już zainstalowany (krok
20-install-dockerzbędny dla tego node'a) - user
pi: uid=1000, passwordless sudo (potwierdzonesudo -n true=0), grupy docker+ollama - Magic Mirror = systemd unit
magicmirror.service(Electron jako pi) — NIETKNIĘTY przez całą sesję - swap = 200 M plik
/var/swapna SD → do migracji na zram (wear karty) - Tailscale: zainstalowany w tej sesji, Running, IP 100.99.85.73
Decyzje
- user = istniejący
pi(NIE tworzymyoskar—pijuż zajmuje uid 1000, jest właścicielem MM, ma docker+sudo; node-agent docker1000:1000pasuje out-of-box). Świadome odstępstwo od konwencji "oskar wszędzie". - runtime node-agent = docker
first_contact= LAN IPpi@192.168.31.19(mDNS.localokazał się zawodny — transient resolve fail); potailscale upkontakt przejmuje mesh (pi@lustro)- Tailscale auth = login interaktywny (URL), bez authkey
- swap target = zram
Stan: 00-access ZAMKNIĘTY
Idempotentny, przeszedł na ostro + re-run czysty. Lustro w mesh, kanał SATURN→lustro przez Tailscale działa bezhasłowo. Verify czysty (arch=aarch64).
Bugi narzędzia naprawione w tej sesji
- dry-run był płytki (tylko orchestrator) →
run()helper + propagacjaDRY_RUN=1do steps (lib/common.sh,onboard.sh,remote.sh,00-access.sh) yaml_getfallback (bezyq):- inline-comment stripping —
[[:space:]]+#.*$po wartości - PRE-EXISTING greedy-colon bug —
.*:ucinał ostatni dwukropek, gubił prefix wsystemd:magicmirror.service; fix:^[[:space:]]*[^:]*:[[:space:]]*
- inline-comment stripping —
00-accessverify — ssh known-hosts warning wpadał do parsowanegoarch(WARN "Unexpected arch 'Warning:Permanently…'"); fix:-o LogLevel=ERROR- czysty stdout (bez
2>&1)
- czysty stdout (bez
Branch / commity
feat/node-onboarding (6 commitów):
| Hash | Opis |
|---|---|
adb8407 |
scaffold — onboard.sh, lib/, steps/00-preflight, hosts/lustro/node.yaml draft |
9012a36 |
00-access.sh + node.yaml ssh_user/first_contact/hardware |
931fd46 |
dry-run propagacja — run() helper, DRY_RUN=0/1 |
eed0ad0 |
yaml_get fix — inline-comment + greedy-colon |
1bed855 |
first_contact: IP zamiast mDNS .local |
471ba09 |
verify fix — LogLevel=ERROR, czysty stdout |
OTWARTE — do następnej sesji (kolejność)
-
WORKTREE HYGIENE (pierwsza rzecz): cała sesja jechała w MAIN checkout wbrew zasadzie "main = deploy-only". Decyzja nierozstrzygnięta:
- (A) rename
feat/→task/node-onboarding+ worktree + main→master (pełna zgodność zagent.sh; merge=FF) - (B) zostać
feat/+ ręcznygit merge --ff-only
agent.sh newtworzytask/<name>odmasteri NIE bierze istniejącego brancha.git worktree listjeszcze nieodczytany (potrzebny wzorzec ścieżki). - (A) rename
-
base step: migracja swap 200 M-plik → zram;
/opt/homelab+chown pi(uid 1000 już pasuje); event dir/opt/homelab/events/lustro/ -
node-agent step: docker override, user 1000:1000 (pi=1000),
mem_limit: 256m -
register step: observer/supervisor inventory + redis sub + UI panel agents.okit.pl
-
verify step (50): smoke end-to-end (event dotarł do control plane, widać w UI, realny alert path Telegram)
-
mm-watch: health check
systemctl is-active magicmirror.service -
drobiazgi: baner URL w 00-access ma defekt wyrównania;
locale pl_PLniewygenerowane na lustrze (niegroźne)
Learnings
(odzwierciedlone też w scripts/onboard/README.md)
- mDNS
.localzawodny do automatyzacji →first_contactprzez IP lub tailscale, nie.local - istniejący node z userem uid=1000: użyj go zamiast tworzyć
oskar(kolizja uid) - swap na SD = wear → zram
- dry-run MUSI propagować do step-skryptów (
run()wrapper), inaczej bezużyteczny - yaml fallback bez
yqmusi strippować inline komentarze i nie być greedy na:
Update — worktree hygiene
- feat/node-onboarding → task/node-onboarding. Main checkout (~/homelab-codex-ws) wrócił na master (deploy-only). Praca onboardingu w ~/homelab-codex-ws-node-onboarding.
- Origin: task/ pushnięty+tracking, feat/ usunięty.
- DROBIAZG: worktree utworzony ręcznie (git worktree add) → agent.sh list pokazuje "(no marker)"/parent=?. Działa; przy finałowym
agent.sh merge node-onboardingzweryfikować, czy brak markera nie przeszkadza — inaczej dorobić marker (wzór: ha-piha) lub ręcznygit merge --ff-only. - NASTĘPNE: base step (zram, /opt/homelab, event dir /opt/homelab/events/lustro/) — z worktree node-onboarding.
- Osobny przyszły projekt: parent-layout refaktor (bare + worktree pod jednym katalogiem) — wymaga przepisania agent.sh + zabezpieczenia dirty ha-piha.