Questa è la pianificazione operativa di st4ck redatta con la lente di un project manager senior (15+ anni delivery IT, sensibilità lean): fasi piccole, dipendenze esplicite, definition-of-done per ogni step. Convenzione append-only: i task non si cancellano, si segnano come DONE per preservare la storia di delivery. Stato vivo aggiornato a ogni avanzamento.
🎯 NEXT PHASE
Fase 0 — closing (preparazione hardware)
Goal: chiudere la preparazione hardware del compute primario casa, sbloccando l'inizio di Fase 1. Esce quando NVMe 990 PRO è nel G8, BIOS aggiornato, HA Voice PE ordinati, hardware key 2FA confermata, dismissioni programmate.
Evento ricorrente Google Calendar primo sabato del mese (~1h), checklist linkata a dossier §13
S (~15min)
—
Exit criteria Fase 0: tutti i 7 step in DONE. Output verso Fase 1A: G8 production-ready bootabile su Ubuntu 24.04 LTS (vuoto, no servizi), NVMe in posizione, BIOS aggiornato. Storage NAS DS720+ #1 invariato (already production).
Roadmap completa — 18 fasi
Pianificazione granulare in fasi piccole (1-2 weekend ciascuna) per favorire delivery incrementale, validazione intermedia, e bus factor mitigation (un singolo subentrante può raccogliere il piano dal punto di interruzione). Ogni fase ha exit criteria discreti, tutti raggiunti = fase chiusa.
Fase 0 — Preparazione hardware
0Preparazione hardware compute primario95% · IN PROGRESS
Vedi tabella NEXT PHASE sopra per lo step-by-step dettagliato. Goal: G8 production-ready, OS bootabile, hardware del modulo j4rv1s ordinato, dismissioni programmate. Exit: 7/7 step DONE.
Fase 1 — Foundation deploy (CF hardening + auth + storage layer)
Goal: proteggere il root account Cloudflare prima di qualsiasi deploy che dipenda da CF (ed è tutto). Mitiga ISSUE-010 (already RESOLVED parzialmente con TOTP) e completa hardening multi-fattore.
1A.1 — Enrollment YubiKey/Titan come 2FA primary su account CF root TODO
1A.2 — Backup recovery codes CF in busta sigillata (B2 cartaceo) TODO
1A.3 — API token scoped (no global API key) per cloudflared, dns-only e zone-only TODO
1A.4 — Audit log CF abilitato + scarico mensile in archivio TODO
1A.5 — Allowlist IP per dashboard CF (casa + genitori) TODO
Exit: il break-glass scenario "Aldo perde password CF" è gestibile via recovery codes cartacei + hardware key fisica. Dipendenze: Fase 0 chiusa, hardware key 2FA disponibile.
1BG8 OS baseline + LUKS at-rest encryptionTODO · ~1 weekend
Goal: G8 con Ubuntu 24.04 LTS configurato baseline + LUKS sui dischi dati (mitiga ISSUE-007 P1). Pre-requisito per qualsiasi servizio che tocca dati persistenti.
1B.1 — Install Ubuntu Server 24.04 LTS minimal sul 990 PRO TODO
1B.2 — Hardening base: ufw, fail2ban, ssh key-only no password, no root login TODO
1B.3 — LUKS encryption su Kioxia XG6 e SSD esterno USB-C (passphrase + keyfile slot) TODO
1B.4 — btrfs subvolumes per /srv/data, /srv/data2 (snapshot-friendly) TODO
1B.5 — Auto-unlock LUKS al boot via TPM2 (non passphrase manuale) TODO
Goal: Identity Provider in piedi prima di qualsiasi altro servizio. Tutti i servizi famiglia useranno OIDC verso Authentik, quindi Authentik è il primo a deploy. Mitiga ISSUE-004 (`chattr +C` Postgres su btrfs).
1C.1 — docker-compose.yml baseline con authentik-server, authentik-worker, postgres-authentik, redis-authentik TODO
1C.2 — `chattr +C` su volume Postgres prima di first run (no copy-on-write) TODO
1C.3 — Bootstrap admin Authentik, configurazione email service (SMTP esterno o disabilitato) TODO
1C.4 — TOTP enforcement per admin, hardware key enrollment (post-1A.1) TODO
1C.5 — Backup config Authentik (export YAML blueprints) committato in repo privato TODO
Exit: login Authentik web funzionante con TOTP+hardware key, blueprint export riproducibile. Dipendenze: 1B chiusa.
Goal: tutta l'infrastruttura di accesso pubblico in piedi. Caddy interno, cloudflared per tunnel, primi hostname pubblici (1d.d0mus.com per Authentik).
1D.1 — Caddy container con Caddyfile baseline, internal-only network TODO
1D.2 — cloudflared container con CF Tunnel pre-configurato (token in .env), public hostname per 1d.d0mus.com TODO
1D.3 — DNS CF: 1d.d0mus.com → tunnel ingress, TLS auto-provisioning TODO
1D.4 — Smoke test: 1d.d0mus.com pubblico → Authentik login UI TODO
1D.5 — Documentazione runbook "aggiungere nuovo servizio dietro tunnel" TODO
Exit: Authentik raggiungibile pubblicamente con TLS valido via tunnel. Dipendenze: 1C chiusa.
Goal: primo servizio "vero" famiglia in piedi: chat E2EE Matrix. Test del pattern OIDC-via-Authentik su un servizio reale prima di sbloccare gli altri.
1E.1 — Synapse container, postgres-synapse con `chattr +C` TODO
1E.2 — homeserver.yaml baseline, registrazione disabilitata, OIDC delegata a Authentik TODO
1E.3 — Caddy + tunnel: ch4t.d0mus.com → Synapse TODO
1E.4 — Element Web statico su CF Pages → w3b.d0mus.com (homeserver puntato) TODO
1E.5 — Account famiglia di test: 1 admin + 1 membro normale, login OIDC end-to-end, cifratura E2EE verificata TODO
Exit: due account che si scrivono in chat E2EE via Element Web autenticati Authentik. Dipendenze: 1D chiusa.
4C.3 — RAG su Qdrant per kb_search + foto_ricerca TODO
4C.4 — Telemetria opex cloud (token in/out per L3-L5) TODO
4C.5 — 1 settimana use reale, misurazione opex effettivo TODO
4DPausa-consolidamento 6 mesi (review syst3m)DEFERRED · 6 mesi post-4C
Stop deliberato sull'aggiunta di servizi/feature. 6 mesi di consolidamento, monitoring, refactoring, prima di valutare j4rv1s F5-F7 (skill avanzate, dashboard, multi-utente). Raccomandazione audit syst3m.
4D.1 — Re-run audit syst3m + homelab-architect a fine periodo DEFERRED
4D.2 — Decisione go/no-go su j4rv1s F5-F7 DEFERRED
Convenzioni di tracking
Status enum
Status
Significato
Quando applicare
DONE
Step completato e Definition-of-Done verificata
DoD soddisfatta + smoke test passato. Mai marcare DONE per "quasi fatto".
IN PROGRESS
Step iniziato ma non chiuso
Lavoro attivo nelle ultime 7 giorni. Se >7gg → BLOCKED o TODO.
TODO
Step pianificato, dipendenze non ancora chiuse o non iniziato
Default per step nuovo aggiunto al piano.
BLOCKED
Step non eseguibile per dipendenza esterna
Causa documentata in note. Esempi: lead time HW, decisione famiglia, audit pendente.
DEFERRED
Decisione esplicita di rinviare oltre l'orizzonte attuale
Differimento intenzionale. Cross-link a §15 dossier "decisioni differite".
Regola append-only
Mai cancellare task chiusi. I task DONE rimangono visibili nel piano per:
Storico delivery (cosa è stato fatto, quando, da chi)
Onboarding di una persona di fiducia (vedere il flusso di lavoro reale)
Audit retrospettivi (RA-008 mitigation: tech debt da scelte 2026)
Recupero da incidenti (rollback su un commit dello stato pre-incidente)
Se un task viene annullato (decisione cambia), si marca DEFERRED con razionale, non si elimina la riga. Se un task viene riformulato, si chiude il vecchio come DONE (con nota "rifattorizzato in X.Y.Z") e si apre il nuovo.
Aggiornamenti incrementali
Quando un task si chiude:
Cambia TODO / IN PROGRESS → DONE nel relativo `<li>` o riga tabella.
Aggiungi class="row-done" alla `<tr>` della NEXT PHASE table per attenuare visivamente.
Se chiude una fase intera: aggiorna progress bar + status nel `<summary>` della fase.
Se la fase corrente cambia: aggiorna meta-card "Fase corrente" e "Next milestone" nell'header row.
Bump versione roadmap (es. v1.0 → v1.1) nel title, doc-toolbar, footer + riga changelog (sezione sotto, da creare quando necessario).
Cross-link al dossier
Le fasi qui sono lo specchio temporale di §11 Phasing del Rollout nel dossier (vista architetturale macro). Le ISSUE/RA citate sono in §15 dossier. Le pendenze trasversali per priorità (non temporali) sono in backlog.