| Versione | Data | Highlight |
|---|---|---|
| v1.0 | 2026-05-03 | Pivot da DS718+ legacy a HP EliteDesk G8 + Ubuntu Server, baseline architettura |
| v1.1-1.3 | 2026-05-05/06 | Aggiunti Kopia (LAN-only), Home Assistant, Blinko nello stack |
| v1.4-1.5 | 2026-05-06 | Audit interno arch+perf → ISSUE-001..006 |
| v1.6 | 2026-05-07 | Audit cyb3r+c0mpl14nc3 → +ISSUE-007..010, retention policy, LUKS promosso a Fase 1 |
| v1.7-1.9 | 2026-05-08 | Modulo j4rv1s integrato, m41n→st4ck rename, CF Pages+CF Access live |
| v1.10 | 2026-05-08 | D2 j4rv1s estesa con Mac mini M4 ricondizionato come terza opzione service node |
| v2.0 | 2026-05-08 | Major: KPI tile bar, Stato Progetto pulse check, ISSUE table refactor, Risk register RA-001..008 da audit syst3m, vincolo soft mantenibilità, audit log dedicato |
| v2.1 | 2026-05-08 | §02 Topologia + cross-ref j4rv1s, §09 layer security matrix, §11 roadmap 4 fasi in tabelle, §13 Plan B Cloudflare + Bus factor mitigation |
| v2.2 | 2026-05-08 | Cover changelog inline, diagrammi ASCII collapsible mobile-friendly, §10 RTO/RPO grid card, §04 NAS coerenza dettaglio, §15 cleanup domande stale |
| v2.3 | 2026-05-08 | §14 ADR-light refactor: 22 ADR D-NNN con data + status (ACTIVE/SUPERSEDED) raggruppate in 5 sotto-tabelle tematiche |
| v2.4 | 2026-05-08 | §05 successor candidates per 12 servizi, §13 awareness training famiglia + DPA archive, §15 +2 decisioni differite (image signing + GPU dedicata) |
| v2.5 | 2026-05-08 | Backlog page (8 tier A→H) + §15 action items refactor con cross-link backlog |
| v2.6 | 2026-05-08 | Tier C completato (5/6): §02 Identity flow + §08 Backup workflow ASCII collapsible · pre-commit hook anchor validator · §15 progress bar Fase · ISSUE-010 RESOLVED (CF 2FA TOTP) |
| v2.7 | 2026-05-08 | Disaster Recovery page (dr.html): bozza letter + DR runbook 9 scenari · H1 confermato OK · backlog Top 5 ranked aggiornato |
| v2.8 | 2026-05-08 | j4rv1s F0a scaffold DONE (monorepo Python in st4ck/j4rv1s/, blocchi compose/Caddyfile commentati, .env.example LLM placeholders) |
| v2.9 | 2026-05-08 | 7° audit homelab-architect (operations v2): 3 GAP (UniFi/UDM config backup, HA Voice firmware rollback) + 9 OPS recommendations in §13 monthly homelab check |
| v2.10 | 2026-05-08 | UI refresh u1: KPI bar grouping in 3 cluster (Architettura/Sicurezza/Costi), bottone "Esporta PDF" su tutte le pagine, @media print rules raffinate (force-expand details, ADR table word-wrap, KPI compact print) |
| v2.11 | 2026-05-08 | Cover refresh: 3 meta-card colorate (Stato Fase 0 95% / Owner / Architettura). KPI card upgrade: accent bar laterale dinamica per data-tone, emoji icon prominent, hover lift transform. TOC indice cliccabile (16 link a #sec-NN, hover effect). Fix "VERSIONE 2.2" obsoleto |
aldobrunello/st4ck live. CF Pages + CF Access serve la landing già da 2026-05-08. Decisioni architetturali consolidate (12 risolte j4rv1s + 19 risolte st4ck). Capex hardware = 0 EUR, riuso parco completo.st4ck e' la piattaforma self-host che sostituisce in modo controllato i servizi cloud commerciali e l'ecosistema software Synology proprietario. Ospita chat, archivio documenti, foto, knowledge base, password vault, archivio email, autenticazione unificata, e backup multi-livello geograficamente distribuiti.
Inizio: 2 utenti (Aldo + moglie, accesso paritario per ridondanza umana).
Fase 2: 4 utenti (+ 2 figli).
Massimo previsto: 10-15 utenti (parenti stretti / amici fidati).
Due siti fisicamente separati connessi via VPN site-to-site UniFi (Site Magic, mesh WireGuard). Cloudflare DNS + Tunnel come unico ingress pubblico. Nessuna porta aperta su router di nessuno dei due siti.
Asse aggiuntivo introdotto dal modulo j4rv1s: satelliti voice-first WiFi distribuiti in casa che parlano via Wyoming protocol al G8. Wake word locale on-device, audio mai esce dal satellite finche' non scatta il trigger. Brain (STT/LLM/TTS/skill) tutto containerizzato dentro st4ck.
Modulo j4rv1s — riferimenti incrociati nel dossier: §03 (2× HA Voice PE in inventario hardware), §05 sotto-sezione "Modulo j4rv1s" (7 container brain + 18 skill compatte), §06 (override AdGuard j4rv1s.d0mus.com), §08 (3 righe retention conversation/audit/memory), §11 sub-step Fase 0/1/2/4 (j4rv1s F0a-F7 integrati cronologicamente), §14 (decisione "Modulo j4rv1s integrato in st4ck"), §15 (ISSUE-011 sequencing + decisione differita D2 con 3 opzioni service node LLM), App. A (BOM edge satelliti + 7 container nello stack a regime). Design doc completo separato: /Users/user1/st4ck/j4rv1s/docs/design.html (v0.3, 12 decisioni risolte + 5 differite).
Pattern "1 IdP → N services": ogni servizio ha un OIDC client registrato in Authentik come SSO provider. Login utente avviene una volta su 1d.d0mus.com, sessione 8h valida per tutti i servizi. SPoF tracciato (ISSUE-001 break-glass) ma il design è giusto: meglio 1 IdP da hardenare che 11 da maintenare.
| Dispositivo | Ruolo | Sito | Stato |
|---|---|---|---|
| HP EliteDesk 800 G8 | Compute primario - tutto lo stack Docker | Casa | Production |
| HP EliteDesk 800 G8 (#2, da reperire) | Compute replica passivo | Genitori | Da acquisire |
| Synology DS720+ #1 | Hot storage tier-1 (foto/docs/KB) via NFS | Casa | Production |
| Synology DS720+ #2 | Mirror Snapshot Replication di DS720+ #1 | Genitori | Production fase 3 |
| Synology DS918+ | Cold storage film, NFS read-only | Casa | Production (riuso esistente) |
| UDM Pro / equivalente UniFi | Gateway di rete + Site Magic | Casa | Esistente |
| UCG-Ultra (~160 EUR) | Gateway di rete + Site Magic | Genitori | Da acquistare |
| UPS (esistente, autonomia 35 min) | Continuita' alimentazione | Entrambi | Esistente |
| HA Voice Preview Edition #1 (Nabu Casa, ~70 EUR) | Satellite voice-first studio (modulo j4rv1s) - ESP32-S3, doppio mic XMOS far-field, microWakeWord "jarvis" on-device, speaker built-in, mute hardware | Casa - studio | Da acquistare (j4rv1s F0) |
| HA Voice Preview Edition #2 (Nabu Casa, ~70 EUR) | Satellite voice-first cucina (modulo j4rv1s) - identico a #1, posizionato su mensola alta lontano da lavandino e piano cottura | Casa - cucina | Da acquistare (j4rv1s F0) |
| Dispositivo | Destino | Recupero stimato |
|---|---|---|
| HP EliteDesk 800 G5 (16 GB) | Vendi (dopo aver spostato NVMe 990 PRO 1TB nel G8) | ~200-300 EUR |
| Intel NUC10FNK (32 GB) | Vendi (dopo aver spostato NVMe 970 EVO+ 500GB) | ~250-300 EUR |
| Synology DS718+ (legacy services) | Dismetti a fine migrazione, recupera HDD per DS720+ #2 | ~150-200 EUR |
| Synology DS718+ (backup spento) | Vendi, ruolo gia' coperto da B2 e DS720+ #2 | ~150-200 EUR |
Recupero totale stimato dalla dismissione: ~750-1000 EUR, parzialmente ricicla per UCG-Ultra + UPS aggiuntivo casa genitori.
| Dispositivo | Idle | Peak | Sito |
|---|---|---|---|
| HP EliteDesk 800 G8 (primary) | ~14 W | ~50 W | Casa |
| DS720+ #1 (2 SSD) | ~10 W | ~18 W | Casa |
| DS720+ #2 | ~12 W | ~22 W | Genitori |
| DS918+ | ~14 W | ~25 W | Casa |
| UDM Pro | ~16 W | ~30 W | Casa |
| UCG-Ultra | ~7 W | ~12 W | Genitori |
| HP EliteDesk 800 G8 (replica) | ~12 W | ~50 W | Genitori |
| TOTALE casa | ~54 W | ~123 W | - |
| TOTALE genitori | ~31 W | ~84 W | - |
| Posizione | Disco | Filesystem | Uso |
|---|---|---|---|
| M.2 slot Gen4 | Samsung 990 PRO 1 TB (dal G5) | btrfs | OS + Docker + DB latency-critical (/srv/data) |
| M.2 slot Gen3 (combo) | Kioxia XG6 512 GB (esistente) | btrfs | State container "tranquilli" (/srv/data2) |
| USB-C 3.2 Gen2 esterno | Samsung 870 EVO 500 GB in enclosure (ex PoC DS718+) | ext4 | Repository Restic locale (/srv/restic-local) |
Vincolo hardware: il G8 ha 2 soli slot M.2 e nessuna SATA bay interna; il cassettino 2.5" recuperato dal G5 NON e' meccanicamente compatibile con il chassis del G8 (montaggio scartato dopo verifica). Di conseguenza il terzo disco vive esterno via USB-C 3.2 Gen2.
SSD esterno: e' il Samsung 870 EVO 500 GB originariamente destinato al DS718+ per la PoC iniziale di ch4t (Postgres + Redis su usbshare1); con la migrazione dell'architettura al G8, lo stesso disco viene riusato in enclosure USB-C UASP (~25 EUR, chip JMS583/RTL9210/ASM2362, no SMR) e dedicato al repository Restic locale. Throughput sostenuto ~1000 MB/s, ampiamente sufficiente per snapshot orari e dedup. Mount stabile via UUID in /etc/fstab con opzioni nofail,x-systemd.device-timeout=10s per evitare boot bloccati se l'enclosure non e' presente.
Altri dischi del parco: il Samsung 256 GB M.2 SATA precedentemente nel G8 viene rimosso (slot ceduto al 990 PRO 1 TB). Il 970 EVO+ 500 GB del NUC10 e' destinato al G8 replica futuro a casa genitori. Una chiavetta USB consumer (es. 256 GB) e' stata valutata e scartata per questo ruolo: endurance e IOPS random write inadeguate al workload Restic continuativo.
/ ~ 50 GB /var/lib/docker ~ 150 GB (immagini + overlay) /srv/data ~ 600 GB (volumi DB latency-critical) | +-- pg-authentik/ Postgres Authentik +-- pg-synapse/ Postgres ch4t (Matrix) +-- pg-seafile/ Postgres Seafile +-- pg-immich/ Postgres + ML Immich +-- pg-paperless/ Postgres Paperless +-- pg-vaultwarden/ Postgres Vaultwarden (o sqlite) +-- redis/ Redis multi-tenant +-- synapse-state/ media_store + signing key swap (file) ~ 8 GB margine libero ~ 200 GB
/srv/data2 ~ 500 GB | +-- caddy/ data + cert Let's Encrypt +-- authentik-media/ templates e media Authentik +-- seafile-objects/ block storage Seafile +-- paperless-index/ indice full-text Whoosh +-- mailpiler-sphinx/ indice ricerca mail archive +-- adguard/ config + query log +-- caddy-cert/ certificati LE renewabili
/srv/restic-local ~ 500 GB repository Restic con snapshot ORARI di: - /srv/data - /srv/data2 - /etc, /home//configs Dedup automatico -> 30-60 giorni di history Mount stabile via UUID in /etc/fstab
| Posizione | Disco | Layout | Capacita' usable |
|---|---|---|---|
| Bay 1+2 | 2x Samsung 870 EVO 4 TB | SHR-1 mirror | 4 TB redundant |
| NVMe slot M.2 | (non utilizzati) | n/a | n/a (storage gia' SSD) |
Esposto via NFS al G8 primary, percorso interno LAN, banda 1 Gbit. Cartelle:
/foto — Immich library (incluso ML face cache parziale)/documenti — Seafile data dir/knowledge — Paperless-ngx archive (originali + OCR)/archivio-mail — Mailpiler raw .eml store (indici su NVMe locale, vedi ISSUE-005)/backups/clients — Kopia repository per endpoint famiglia| Posizione | Disco | Layout | Capacita' usable |
|---|---|---|---|
| Bay 1+2 | 2x HDD recuperati da DS718+ dismessi | SHR-1 mirror | 4-8 TB redundant (in base a HDD recuperati: 2x 4TB → 4 TB; 2x 8TB → 8 TB) |
| NVMe slot M.2 | (non utilizzati) | n/a | n/a |
Configurazione esistente conservata (HDD spinning storici). Disattivare progressivamente i servizi Synology (Drive, Photos, Mail) in Fase 2-3. Esporre solo NFS read-only di /film al G8.
Decisione differita: upgrade DS918+ a TrueNAS-on-commodity-hardware se DSM diventa incompatibile in futuro (vedi RA-006). Familiarizzazione lab TrueNAS Scale prevista in Fase 3 su DS720+ #2 dual-boot.
| Servizio | Ruolo | Note |
|---|---|---|
| Authentik (server + worker + Postgres + Redis) | IdP OIDC unico per tutte le app | 2FA TOTP/WebAuthn obbligatorio. Bootstrap email aldo.brunello@protonmail.com |
| Hostname pubblico | Componente | Funzione |
|---|---|---|
| st4ck.d0mus.com | Landing page st4ck + dossier HTML | Pagina HTML statica con link a tutti i servizi famiglia + link al dossier (/dossier.html, questo documento). Static su Cloudflare Pages (build da repo privato aldobrunello/st4ck branch main, root directory st4ck/, omonimia con il nome del repo voluta — riflette il dominio st4ck.d0mus.com). Cloudflare Access davanti (Zero Trust auth, allowlist email familiari): la lista servizi e la documentazione non sono pubbliche. I singoli servizi linkati mantengono il loro OIDC nativo. Live dal 2026-05-08, indipendente da st4ck Fase 1. Pattern parallelo a w3b.d0mus.com Element Web (entrambi static su CDN Cloudflare). UI allineata al design system STR4TUM (terminale dark mode con toggle light, JetBrains Mono, palette semantica fissa). Dossier print-friendly (CSS @media print + bottone toolbar) |
| ch4t.d0mus.com | Synapse (Matrix) | Chat E2EE, server chiuso, no federation |
| 1d.d0mus.com | Authentik | Login OIDC + 2FA |
| w3b.d0mus.com | Element Web (CF Pages) | Client browser Matrix |
| dr1v3.d0mus.com | Seafile + OnlyOffice | Documenti + editing collaborativo |
| ph0t0.d0mus.com | Immich | Foto + ML faces, app mobile native |
| kb.d0mus.com | Paperless-ngx | Knowledge base PDF, OCR + ricerca full-text |
| 4rch1v3.d0mus.com | Mailpiler | Archivio email IMAP, ricerca, no SMTP outbound |
| v4ult.d0mus.com | Vaultwarden | Password manager (alternativa Bitwarden) |
| h0me.d0mus.com | Home Assistant | Domotica famiglia, automazioni, app companion mobile. Migrato da installazione esistente (HA Container Docker su altro host) tramite copia del volume config/ |
| br41n.d0mus.com | Blinko | Note-taking AI-powered self-host (cattura rapida + RAG su appunti personali). Stack Next.js + PostgreSQL 14 dedicato. Login OIDC via Authentik. Complementare a Paperless-ngx (KB documenti) e Seafile (file) |
| j4rv1s.d0mus.com | j4rv1s API + dashboard | Assistente personale voice-first multi-room (modulo j4rv1s). Conversation agent custom per HA Assist + dashboard web (FastAPI + HTMX). Login OIDC via Authentik. Pipeline voce/skill orchestrata da 7 container dietro (vedi sotto-sezione "Modulo j4rv1s") |
Servizi raggiungibili solo da LAN o via UniFi Site Magic VPN: nessun record DNS su Cloudflare, nessuna route cloudflared, nessuna esposizione pubblica. Risolti unicamente da AdGuard Home interno.
| Hostname interno | Componente | Funzione |
|---|---|---|
| b4ckup.d0mus.com | Kopia Server | Backup selettivo cartelle endpoint famiglia (Mac/Win/Linux), E2EE client-side. Accesso KopiaUI desktop e UI web solo da casa o via VPN site-to-site dai genitori |
| Componente | Funzione |
|---|---|
| Caddy | Reverse proxy interno HTTP, gestione certificati LE via DNS-01 Cloudflare |
| cloudflared | Tunnel esistente, public hostname multipli |
| AdGuard Home | DNS locale split-horizon + ad-blocking di rete |
| Watchtower / Diun | Notifica update immagini Docker (non auto-apply per servizi stateful) |
| Restic | Backup cifrato, deduplicato, multi-target (locale, NAS, B2) |
| btrbk | Snapshot btrfs + send/receive verso replica G8 |
| Uptime Kuma | Monitoring esterno (su replica G8 a casa genitori) |
Modulo applicativo dedicato all'assistente personale voice-first multi-room. Edge: 2 satelliti WiFi (HA Voice PE) gia' inventariati in §03. Brain: 7 container dentro st4ck. Solo j4rv1s.d0mus.com e' esposto pubblico (riga gia' presente nella tabella Applicazioni); gli altri 6 container vivono internal-only su apps-net. Design completo in /Users/user1/st4ck/j4rv1s/docs/design.html (v0.3, 2026-05-08).
| Container | Image | Ruolo | Esposizione |
|---|---|---|---|
j4rv1s-llm | ghcr.io/ggerganov/llama.cpp:server | Llama 3.1 8B Q4_K_M, OpenAI-compat endpoint, ~5-8 t/s su i7-11700 CPU | internal apps-net |
j4rv1s-qdrant | qdrant/qdrant | Vector DB per memoria episodica + semantica (RAG su Blinko/Paperless), storage su SSD per latenza | internal apps-net |
j4rv1s-worker | Custom Python + APScheduler | Skill executor, cron, event watchers, RAG indexer nightly, retention purger (10gg conversation, 30gg audit) | internal apps-net |
wyoming-faster-whisper | rhasspy/wyoming-whisper | STT large-v3 italiano via Wyoming protocol, beam-size 5, VAD-gated, latency target 1000-1500ms | internal apps-net |
wyoming-piper | rhasspy/wyoming-piper | TTS voce it_IT-riccardo-x_low, streaming, first-byte ~300ms | internal apps-net |
wyoming-openwakeword | rhasspy/wyoming-openwakeword | Fallback wake word server-side, attivato solo se microWakeWord on-device satellite degrada | internal apps-net |
Riuso servizi st4ck (zero duplicazione): Authentik (SSO dashboard), Caddy (reverse proxy), cloudflared (esposizione pubblica), Redis condiviso DB 3 (working memory j4rv1s), Home Assistant h0me.d0mus.com (orchestratore Wyoming + skill home_*), Blinko/Paperless/Vaultwarden/Immich/Synapse/Mailpiler (skill di consultazione/azione su questi servizi), Restic+Kopia (backup volumi j4rv1s-* e wyoming-* nei pattern esistenti), SQLite via Litestream verso NFS DS720+ #1 (no Postgres dedicato).
LLM router cost-tuned a 5 livelli: L1 regole/intent lookup (50% richieste, 0€), L2 Llama 3.1 8B locale (30%, 0€), L3 Mistral Small 3.x EU default (15%, ~3-5€/mese), L4 Claude Haiku 4.5 (4%, on-demand tool-use), L5 Claude Sonnet 4.6 (1%, solo on-demand esplicito). Anthropic Opus mai automatico.
18 skill modulari, naming inglese, trigger vocali italiani (mappa in j4rv1s/skills/intents_it.yaml). Hot-reload in dev, versionate in git.
| Categoria | Skill | Note |
|---|---|---|
| Smart home | home_state, home_control, music | Stato HA read-only, scene/automation con whitelist, Spotify/Sonos via HA media_player |
| Productivity | calendar, mail_triage, focus_mode, reminders, timer, shopping_list, announce | Google Calendar OAuth, Mailpiler API, Pomodoro+Hue+Slack DND, timer multi-stanza, lista spesa su HA todo, broadcast multi-satellite |
| Knowledge & data | notes, documents, credentials, photos, search, weather | RAG Blinko/Paperless via Qdrant, Bitwarden CLI read-only, embedding CLIP Immich riusato, SearXNG, Open-Meteo |
| Dev/utility | code_runner, vision | Sandbox subprocess + timeout/ulimit; Frigate/HA camera + Claude vision o LLaVa locale (no Continuity Camera) |
Per ogni servizio dello stack, "successor candidate" è l'alternativa OSS già valutata che potrebbe sostituirlo se l'upstream viene abbandonato, acquisito da vendor non graditi, o cambia drasticamente le condizioni. Non è un piano di migrazione attivo: è la capability dormiente da poter attivare se uno dei rischi WI-7 si manifesta.
| Servizio attuale | Successor candidate primary | Successor candidate secondary | Effort migrazione stimato |
|---|---|---|---|
| Authentik (IdP OIDC) | Keycloak (Red Hat, mature, scala enterprise) | Authelia (Go, leggero, simile UX) | 1-2 settimane (re-config OIDC client per tutti i servizi + utenti import) |
| Synapse (Matrix) | Dendrite (Go, lightweight Matrix server) | Conduit (Rust, single-binary) | 1 settimana (Matrix protocol stesso, utenti via account_data export/import) |
| Immich (foto) | PhotoPrism (Go, mature, mobile presente) | Nextcloud Photos (se gia' Nextcloud nello stack) | 1-2 settimane (export Immich + re-import + ML faces re-trigger) |
| Seafile (drive) | Nextcloud (PHP, ecosistema vasto) | OpenCloud (fork ownCloud Infinite Scale, Go) | 1 settimana (export libraries via Seafile CLI + import target) |
| Paperless-ngx (KB) | DocSpell (Scala, OCR + ML) | Mayan EDMS (Python, enterprise feel) | 3-5 giorni (export originali + OCR re-run su target) |
| Mailpiler (mail archive) | Stalwart (Rust, fa anche IMAP/SMTP completo) | Dovecot DIY + sphinx index | 1-2 settimane (re-import IMAP storico) |
| Vaultwarden | Bitwarden ufficiale self-host (PHP/.NET, da preferire se serve enterprise feature) | KeePassXC + sync via Seafile | 2-3 giorni (export Vaultwarden vault → Bitwarden import) |
| Home Assistant Container | HAOS in VM KVM (Supervised completo, Add-on Store ufficiale) | OpenHAB (Java, alternative ecosystem) | 1 weekend (config config/ portabile) |
| Blinko (note RAG) | Memos (Go, mature, no AI nativa) | Trilium Next (JS, Hierarchical) | 2-3 giorni (markdown export → import target) |
| Kopia (backup endpoint) | Restic CLI + frontend GUI (Vorta su Mac) | BorgBackup + Vorta | 3-5 giorni (re-seed iniziale completo) |
| cloudflared (tunnel) | WireGuard + VPS reverse proxy (vedi Plan B CF) | Tailscale Funnel | 1 weekend (vedi Plan B) |
| Caddy (reverse proxy) | Nginx + acme.sh (mature, footprint piu' piccolo) | Traefik (Docker-native, label-based routing) | 2-3 giorni (porting Caddyfile -> nginx.conf) |
| j4rv1s-llm (Llama locale) | Ollama (semplifica gestione modelli) | vLLM (performance superiore se M4 Pro / GPU) | 2-3 giorni (cambio endpoint OpenAI-compat) |
Pattern: per ogni servizio core esiste un successor con caratteristiche comparabili e migrazione <2 settimane. Questo è il vincolo di scelta originale degli ADR §14: "selezionare servizi con migrazione possibile in giorni-settimane, non mesi". Nessun servizio nello stack attuale è "lock-in cementato".
I record DNS dei servizi pubblici sono CNAME verso il tunnel Cloudflare (*.cfargotunnel.com). Le hostname puntano dinamicamente al tunnel attivo (sito A o B in caso di failover). I servizi LAN-only (vedi b4ckup.d0mus.com) non hanno alcun record su Cloudflare DNS: esistono solo nel DNS interno di AdGuard Home.
AdGuard Home gira sul G8 e risponde a tutta la LAN. Le voci di override mappano gli hostname pubblici a IP locali (split-horizon), e in piu' AdGuard ospita i record dei servizi interni privi di DNS pubblico.
# Override hostname pubblici -> IP LAN (split-horizon) ch4t.d0mus.com -> 192.168.1.10 (G8 primary LAN) 1d.d0mus.com -> 192.168.1.10 dr1v3.d0mus.com -> 192.168.1.10 ph0t0.d0mus.com -> 192.168.1.10 kb.d0mus.com -> 192.168.1.10 4rch1v3.d0mus.com -> 192.168.1.10 v4ult.d0mus.com -> 192.168.1.10 h0me.d0mus.com -> 192.168.1.10 br41n.d0mus.com -> 192.168.1.10 j4rv1s.d0mus.com -> 192.168.1.10 w3b.d0mus.com -> CDN Cloudflare (non override, e' statico) st4ck.d0mus.com -> CDN Cloudflare (non override, e' statico via CF Pages) # Hostname interni (NESSUN record su Cloudflare DNS, solo AdGuard) b4ckup.d0mus.com -> 192.168.1.10 (Kopia Server, LAN/VPN-only)
Caddy usa DNS-01 challenge via API Cloudflare per ottenere certificati Let's Encrypt validi. Lo stesso certificato funziona per:
Niente warning browser, niente dipendenza da porte 80/443 esposte. Rinnovo automatico ogni 60 giorni con internet attivo.
Il certificato per b4ckup.d0mus.com (servizio LAN-only) si ottiene comunque tramite DNS-01: il record TXT _acme-challenge viene creato temporaneamente in Cloudflare DNS solo durante la validation, senza esporre alcun A/AAAA pubblico per l'hostname.
| Scenario | LAN access funziona? |
|---|---|
| Internet ISP down a casa | SI - DNS locale + Caddy + container tutti su G8 |
| Cloudflare degraded | SI da LAN, accesso esterno offline finche' CF si ristabilisce |
| UDM down a casa | NO - serve gateway up per DHCP/DNS |
| G8 primary down | NO finche' non si fa failover a sito B |
| Sito | Subnet LAN | Gateway | Banda fibra |
|---|---|---|---|
| Casa | 192.168.1.0/24 | UDM Pro | 1 Gbit simmetrica |
| Genitori | 192.168.2.0/24 | UCG-Ultra | 800 Mbit simmetrica reali (UDR) |
Mesh WireGuard gestita dalla console UniFi (incluso senza costo aggiuntivo). Setup ~10 minuti. Routing automatico bidirezionale, no NAT, latenza tipica 5-30 ms tra i due siti su FTTH italiana.
| Tipo | Volume tipico | Frequenza |
|---|---|---|
| btrfs send/receive (G8 -> G8) | 10-100 MB / ciclo | Ogni 15 min |
| Snapshot Replication (DS720+ -> DS720+) | 50-500 MB / ciclo | Ogni 15 min |
| Seeding iniziale (DB+state) | ~50-100 GB | Una tantum |
| Seeding iniziale (foto+docs+KB) | ~1.1 TB | Una tantum, ~3-4 ore |
| Probe Uptime Kuma | < 1 MB/giorno | Ogni 60 s |
Zero porte aperte sui router di entrambi i siti. Ingress pubblico solo via Cloudflare Tunnel (uscente). Inter-sito solo via WireGuard di Site Magic (uscente da entrambi i lati).
Tre copie indipendenti, due tecnologie diverse, una off-site (qui sono due off-site).
| Layer | Tecnologia | Dove | Frequenza | RPO |
|---|---|---|---|---|
| 1 - Snapshot locale orario | Restic su USB-C esterno | G8 (870 EVO 500 GB enclosure) | 1 h | 1 h |
| 2 - Backup locale giornaliero | Restic su NAS | DS720+ #2 cartella backup | 24 h | 24 h |
| 3 - Replica live G8 | btrfs send/receive | G8 replica genitori | 15 min | 15 min |
| 4 - Replica live NAS | Synology Snapshot Replication | DS720+ #2 in genitori | 15 min | 15 min |
| 5 - Backup catastrofico | Restic su Backblaze B2 | Cloud cifrato lato client | 24 h | 24 h |
Replicato il subvol critico /srv/data (DB e state). NON replicato /srv/data2 (rebuild deterministico al boot). NON replicato /srv/restic-local (per definizione locale).
Tool: btrbk (cron, ogni 15 min) Trasporto: SSH over Site Magic (WireGuard) Encrypted: si (WireGuard) Snapshot retention sul replica: 96 (= 24 h granularita' 15 min)
Synology Snapshot Replication, configurata via DSM:
/foto, /documenti, /knowledge, /archivio-mail su DS720+ #1| Voce | Valore |
|---|---|
| Tool | Restic |
| Endpoint | Backblaze B2 (eu-central-1) |
| Cifratura | AES-256 client-side, chiave fuori dal NAS |
| Volumi inclusi | /srv/data, contenuto NFS DS720+ #1 |
| Volume escluso | Film (ricostruibili), cache, indici |
| Volume stimato | ~1.1 TB iniziale, dedup -> ~1.5-2 TB con 6 mesi history |
| Costo stimato | ~10-12 USD/mese |
| Retention | 14 giorni daily, 12 settimane weekly, 12 mesi monthly |
Lo stack copre anche il backup selettivo di cartelle dai dispositivi della famiglia (Mac, Windows, Linux Zorin) verso il G8, indipendente dai backup server-side dei dati st4ck.
| Voce | Valore |
|---|---|
| Tool | Kopia (server + client GUI nativa multi-OS) |
| Endpoint | b4ckup.d0mus.com (container kopia/kopia in modalita' server) - LAN/VPN-only, no cloudflared |
| Repository | Volume su NFS DS720+ #1, sottocartella dedicata /backups/clients |
| Cifratura | AES-256 / ChaCha20 client-side, password per utente, server cieco sui contenuti |
| Dedup | Block-level globale tra tutti gli endpoint, compressione zstd |
| Auth | Account Kopia server-side (uno per persona). NON dietro Authentik perche' KopiaUI parla diretto al server via API binaria |
| Granularita' | Selettiva per cartella (es. ~/Documents, ~/Desktop, ~/Pictures-lavoro); intero disco escluso per design |
| Schedule | Policy per directory configurate da KopiaUI: snapshot ogni 1-4 h secondo importanza |
| Retention | 14 daily, 8 weekly, 12 monthly, 3 annual (per cartella) |
| Restore | KopiaUI desktop (browse temporale + drag-and-drop) oppure UI web del server |
| Volume stimato | ~30-80 GB per persona dopo seed iniziale, ~150-400 GB totali su 4-5 utenti |
Client supportati:
brew install --cask kopiaui, login item per autostart.deb ufficiale (Zorin e' Ubuntu-based, KopiaUI gira su GTK)Time Machine resta complementare sui Mac. Time Machine via SMB sul DS720+ #1 copre il caso "rebuild totale del Mac via Migration Assistant" dopo guasto SSD o nuovo acquisto. Kopia copre il caso "recupero selettivo file/cartella nel tempo, da qualsiasi dispositivo, con storia lunga e dedup". Ruoli distinti, non sovrapposti.
Posizione nel modello 3-2-1. Gli endpoint famiglia diventano una sorgente dati aggiuntiva, e il loro repo Kopia su DS720+ #1 entra automaticamente nella replica Snapshot Replication verso DS720+ #2 (Layer 4) e nel backup B2 cloud (Layer 5). Quindi anche le cartelle dei Mac eredita off-site + cloud senza configurazione extra.
Politica esplicita di conservazione dati per ciascun servizio, separata in 3 colonne: dati attivi (UI utente), copie di backup (Restic locale/B2 cloud), log applicativi. Necessaria per (a) prevedere la crescita storage, (b) rispettare il principio GDPR di conservazione limitata anche se l'eccezione "uso domestico" si applica solo in parte (i terzi che entrano nei sistemi escono dall'eccezione), (c) avere una posizione difendibile se un familiare chiede cancellazione.
| Servizio | Dati attivi | Backup | Log applicativi |
|---|---|---|---|
| Synapse (chat) | Forever (cronologia famiglia) | 14d/8w/12m/3y (Kopia + B2) | 30 giorni rolling (no PII oltre) |
| Element Web | Stateless (CF Pages) | N/A | N/A |
| Authentik | Forever (utenti + gruppi) | 14d/8w/12m/3y | 180 giorni eventi auth (failed login, MFA, impersonation) |
| Vaultwarden | Forever (vault famiglia) | 14d/8w/12m/3y + export annuale offline su YubiKey | 90 giorni |
| Immich (foto) | Forever salvo richiesta esplicita di un familiare | 14d/8w/12m/3y. Cap a 5 TB → review famiglia per cleanup foto >10 anni | 30 giorni |
| Seafile (drive) | Forever per file attivi, 90 giorni cestino utente, 30 giorni Trash admin | 14d/8w/12m/3y | 30 giorni |
| Paperless-ngx (KB PDF) | Forever (knowledge accumulato) | 14d/8w/12m/3y | 30 giorni |
| Mailpiler (archivio mail) | Forever per default. Override se familiare richiede cancellazione propria mailbox storica | 14d/8w/12m/3y | 30 giorni |
| Home Assistant | Recorder DB: 30 giorni history, long-term statistics 5 anni | 14d/8w/12m/3y | 14 giorni |
| Blinko (note) | Forever per note utente, soft-delete 60 giorni cestino | 14d/8w/12m/3y | 30 giorni |
| Kopia (endpoint backup) | 14d/8w/12m/3y per cartella (gia' definito sopra) | Ereditato da DS720+ #1 → #2 + B2 | 30 giorni server log |
| Caddy (reverse proxy) | N/A (stateless) | N/A | 30 giorni access log; alert immediato su 401/403 burst |
| cloudflared | N/A | N/A | 30 giorni connection log |
| AdGuard Home | 30 giorni query log (privacy DNS) | N/A (rebuildable) | Coincide con query log |
| Loki / Promtail (futuro) | N/A | N/A | 180 giorni retention aggregato (storage cap NVMe) |
| j4rv1s - conversation (transcript voce, log conversazioni, telemetria sessione) | 10 giorni (decisione 8 modulo j4rv1s). Audio raw MAI persistito (memoria volatile sul satellite, scartato post-STT) | Pattern Restic/Kopia esistenti, ma con override di retention: snapshot conversation non escono dalla finestra 10gg neanche nei backup remoti | Coincide con dati attivi 10gg |
| j4rv1s - audit skill | 30 giorni log invocazioni skill (input filtrato, skill eseguita, esito) - separato dai transcript per audit di sicurezza | Pattern Restic/Kopia esistenti | 30 giorni |
| j4rv1s - episodic + semantic memory | Indefinito (e' il "cervello", non il "diario") - SQLite via Litestream + Qdrant collection | 14d/8w/12m/3y | 30 giorni log accesso |
Eccezioni / override: qualsiasi familiare puo' richiedere cancellazione anticipata dei propri dati personali (vedi runbook off-boarding in docs/runbooks/offboarding.md, da scrivere come da ISSUE-009 in §15). La cancellazione e' best-effort: i log applicativi anonimizzati (es. timestamp di azioni, IP) restano fino al ciclo di rotation. I backup Restic/Kopia/B2 non vengono espunti retroattivamente — i dati dell'utente decadono naturalmente al termine della retention 3y dell'ultimo snapshot.
Storage growth check: review semestrale dello spazio occupato su DS720+ #1 e su B2. Se Immich supera 5 TB o B2 supera 50 EUR/mese, riapertura discussione in famiglia su downgrade qualita' foto storiche / esclusione film backup.
Sicurezza stratificata su 5 layer. Le mitigazioni elencate qui sono le primary; il dettaglio operativo (configurazione, comandi, runbook) vive nelle sezioni di riferimento per evitare duplicazione narrativa.
| Layer | Mitigazioni primary | Vedi anche § |
|---|---|---|
| L1 — Network | Zero porte aperte sui router · CF Tunnel uscente come unico ingress · WAF Cloudflare + rate limit edge · WireGuard mesh inter-sito (Site Magic UniFi) | §02 topologia, §07 network, §06 Internet down |
| L2 — Identità | Authentik IdP OIDC unico · 2FA TOTP/WebAuthn obbligatorio · password policy 12+ char, no riuso · lockout dopo 5 fail · sessione 8h max · solo invito admin | §05 identità unificata, ISSUE-001 break-glass |
| L3 — Applicazione | Matrix E2EE default · Cross-signing device verification · Recovery Key offline obbligatoria · federation OFF (server chiuso) · password login Synapse OFF, solo OIDC | §05 stack software |
| L4 — Storage | LUKS at-rest sui NVMe G8 (promosso a Fase 1 step 1, ISSUE-007) · backup B2 cifrato client-side, chiave fuori dal NAS · snapshot Restic immutabili dal source (anti-ransomware) | §04 storage layout, §08 3-2-1 backup |
| L5 — Operativo | SSH solo da LAN, no esposizione · sudo loggato · update OS settimanale + image container mensile · Authentik audit log 1 anno · LUKS passphrase su YubiKey + safe fisico (recovery) | §13 operations |
Hardening account Cloudflare (L1 + L2 trasversale): hardware key 2FA + email separata + Certificate Transparency monitoring + API token scope minimo (Zone:DNS:Edit per d0mus.com, no account-wide). Tracciato come ISSUE-010 P0 da chiudere in Fase 1 step 0. Risk register per scenari long-term in RA-001..008.
Recovery Time / Recovery Point Objective per scenario di failure. Visione "what happens if X breaks": RPO = quanto di lavoro si perde, RTO = quanto serve per tornare operativi.
Tono: verde = recovery rapido, esperienza utente impattata minimamente · ambra = downtime accettabile, utente avvisato · rosso = downtime esteso, recovery dipende da rete + tempo di download da B2. Drill DR semestrale (vedi §13) verifica gli scenari ambra+rosso in produzione.
| # | Step | Dettaglio |
|---|---|---|
| 0.1 | Workspace setup | Reperire monitor + tastiera + mouse + USB stick per setup G8 |
| 0.2 | Trasloca NVMe primary | Spostare NVMe Samsung 990 PRO 1TB dal G5 al G8 (slot M.2 Gen4) |
| 0.3 | Libera slot Gen3 | Rimuovere Samsung 256 GB M.2 SATA dal G8 (cede slot Gen3 al Kioxia) |
| 0.4 | Backup locale enclosure | Acquistare enclosure USB-C 3.2 Gen2 (~25 EUR) + inserire Samsung 870 EVO 500 GB |
| 0.5 | Vendi G5 | ~250 EUR recuperati post-cannibalizzazione |
| 0.6 | Setup BIOS G8 | Verificare: secure boot off, AHCI on, virtualization on |
| 0.7 | Monorepo creato in st4ck/j4rv1s/: pyproject (uv build), src/j4rv1s/{api,worker,skill,router}, skills/intents_it.yaml, docker/Dockerfile.{api,worker}, README, design.html mosso in docs/. 7 blocchi compose j4rv1s-* + wyoming-* commentati. Blocco Caddyfile j4rv1s.d0mus.com commentato. .env.example con placeholder MISTRAL/ANTHROPIC/HA token. Pre-condizione bloccante per j4rv1s F1: hardware satelliti (step 0.8) | |
| 0.8 | j4rv1s edge order | Ordinare 2× HA Voice Preview Edition da Nabu Casa (~140€ + spedizione UE). Lead time tipico 2-4 settimane: ordinare in Fase 0 per averli pronti a Fase 2 |
| # | Step | Dettaglio |
|---|---|---|
| 1.0 | 2FA TOTP attivo (verificato 2026-05-08). Sub-action raccomandate ma non bloccanti: hardware key fisica YubiKey/Titan come fattore primary, email separata mai usata altrove, CT monitoring webhook, API token CF scope Zone:DNS:Edit only. Decisione: passare a hw key + email separata quando si fa il setup G8 fisico | |
| 1.1 | Install Ubuntu + LUKS (ISSUE-007 P0) | Ubuntu Server 24.04 LTS sul G8 con LUKS sui due NVMe (990 PRO + Kioxia XG6) + btrfs sopra LUKS. Passphrase robusta, copia su YubiKey + copia cartacea in safe fisico (recovery). Trade-off accettato: passphrase a ogni boot, automatizzabile con TPM2-LUKS unlock se serve unattended dopo power-loss |
| 1.2 | Hardening base | sshd (key-only, no password), ufw default-deny, fail2ban (sshd + recidive), unattended-upgrades per pacchetti security |
| 1.3 | Install Docker | Docker Engine + compose plugin v2 |
| 1.4 | chattr +C Postgres (ISSUE-004 P0) | mkdir /srv/data/postgres && chattr +C /srv/data/postgres PRIMA del primo docker compose up. Disattiva CoW btrfs sul subdir → -30/-50% latency commit. Trade-off accettato: niente snapshot btrfs sul subdir (backup PG via pg_dump + Restic) |
| 1.5 | Deploy core IdP+ingress | Stack con AdGuard Home + Caddy + Authentik (server + worker + Postgres + Redis) |
| 1.6 | Cert TLS DNS-01 | Configurare API token CF (gia' creato in 1.0 con scope minimo) per DNS-01 challenge. Ottenere primi certificati Let's Encrypt |
| 1.7 | DNS LAN | Configurare router LAN per usare AdGuard Home come DNS primary |
| 1.8 | Sostituito 2026-05-08: landing gia' live come st4ck.d0mus.com via Cloudflare Pages + Cloudflare Access (Zero Trust). Indipendente da st4ck Fase 1, deploy avvenuto prima di tutto. Caddyfile e bind-mount per m41n NON sono piu' richiesti | |
| 1.9 | Deploy ch4t | Synapse (Matrix) + Element Web su CF Pages, federation OFF |
| 1.10 | Deploy Vaultwarden | Container vaultwarden/server, OIDC via Authentik |
| 1.11 | Onboarding 2 utenti | Te + moglie su Authentik con TOTP obbligatorio |
| 1.12 | Test device target | mobile (Element X, Bitwarden mobile), web, macOS WebDAV |
| 1.13 | Setup Restic + B2 | Restic locale (NVMe → 870 EVO USB-C) + Backblaze B2 cloud (regione EU) |
| 1.14 | Authentik break-glass (ISSUE-001 P0) | Documentare procedura break-glass in §13: container con utente locale admin pre-configurato in vault offline (Vaultwarden export su carta o YubiKey), bypass temporaneo OIDC per servizi che lo permettono (Synapse, Vaultwarden, Paperless), RTO target ripristino < 30 min con restore Postgres da snapshot btrfs |
| 1.15 | j4rv1s F0b deploy voice infra | Sblocca dopo Authentik live (1.5). Registrare OIDC application j4rv1s su Authentik UI (Proxy Provider con outpost embedded, stesso pattern m41n storico). CF DNS CNAME j4rv1s.d0mus.com + cloudflared public hostname route. Decommentare 6 container internal modulo j4rv1s in docker-compose.yml: docker compose up -d j4rv1s-llm j4rv1s-qdrant wyoming-faster-whisper wyoming-piper wyoming-openwakeword. Download Llama 3.1 8B Q4_K_M GGUF (~4.9 GB) in ${STACK_ROOT}/j4rv1s/models/ |
Output Fase 1 Chat e password manager funzionanti, identita' centralizzata, due livelli di backup attivi, infrastruttura voice j4rv1s pronta (container running, OIDC client registrato). Sistema "production-ready" per 2 utenti. CF account hardenato. LUKS at-rest attivo.
| # | Step | Dettaglio |
|---|---|---|
| 2.1 | DS720+ #1 NFS-only | Riconfigurare come storage puro (disabilitare app Synology Photos/Drive/Chat). Migrare 2× Samsung 870 EVO 4TB → SHR-1. Esporre cartelle NFS al G8 |
| 2.2 | Deploy Immich | Container immich-server + immich-machine-learning. Postgres dedicato + Redis (riuso). Volume foto/video su NFS DS720+ #1 |
| 2.3 | Deploy Seafile + OnlyOffice | Drive documenti + editing collaborativo. Volume librerie su NFS |
| 2.4 | Deploy Paperless-ngx | Knowledge base PDF, OCR + ricerca full-text |
| 2.5 | Deploy Mailpiler (ISSUE-005 P0) | Archivio email IMAP. Indici (MariaDB + Sphinx/Manticore) OBBLIGATORIAMENTE su NVMe locale (/srv/data2), volume data/ raw .eml su NFS DS720+ #1. Senza separazione → search da sec a min |
| 2.6 | Migrazione foto Synology→Immich | Bulk import + verifica EXIF + ML faces re-trigger |
| 2.7 | Migrazione documenti Synology→Seafile | Export osheet/odoc → xlsx/docx |
| 2.8 | Onboarding 2 figli | Account Authentik con TOTP. Onboarding device + parental policy |
| 2.9 | Pull email storiche | Da Outlook IMAP → Mailpiler |
| 2.10 | Migrazione Home Assistant | Stop container HA sull'host attuale, copia config/ nel volume sul G8, restart su ghcr.io/home-assistant/home-assistant, riassociazione integrazioni e device cloud |
| 2.11 | Deploy Kopia Server | b4ckup.d0mus.com LAN/VPN-only (no cloudflared). Repo su NFS DS720+ #1, sottocartella /backups/clients |
| 2.12 | Onboarding KopiaUI | Mac famiglia + Windows + Zorin Linux. Policy per cartelle critiche per persona |
| 2.13 | Deploy Blinko | br41n.d0mus.com: container blinkospace/blinko + Postgres 14 dedicato (vincolo upstream), volume su /srv/data, route cloudflared, OIDC via Authentik, app desktop/mobile Tauri configurate |
| 2.14 | Off-boarding runbook (ISSUE-009 P0) | Scrivere docs/runbooks/offboarding.md prima dell'onboarding completo (4 utenti reali = caso d'uso possibile). 9 step deactivate Authentik → Synapse → Vaultwarden → Immich → Blinko → Mailpiler → HA → Kopia + export dati |
| 2.15 | j4rv1s F1 Voice loop | Ricezione 2× HA Voice PE, posizionamento studio + cucina, Wyoming integrations su HA (faster-whisper, piper, openwakeword via UI), voice assistant pipeline con conversation agent default HA Assist + 1 satellite, smoke test "Jarvis che ore sono?". Test latency e2e <3s |
| 2.16 | j4rv1s F2 Brain + skill loader | Build immagini custom j4rv1s-api + j4rv1s-worker, deploy, switch conversation agent HA → j4rv1s-api. 3 skill iniziali: home_state (read-only HA), weather (Open-Meteo), timer (multi-stanza). LLM router L1-L3 (regole + Llama locale + Mistral Small EU). Test 10+ comandi reali, room-aware |
| 2.17 | Test PG14 vs PG16 Blinko (ISSUE-003 P1) | Test in staging Blinko su PG16 (Prisma di solito tollera). Se OK → collassare a PG16 unico. Se NO → valutare alternative Blinko (Memos / Trilium con compat PG16 nativa). Deadline hard: prima di PG14 EOL Nov 2026 |
| 2.18 | Dismissione DS718+ legacy | Recupera HDD per DS720+ #2 (Fase 3 seeding) |
Output Fase 2 Stack completo a singolo sito, 4 utenti, funzionalita' 100%, Synology lock-in eliminato. j4rv1s con voice loop attivo + 3 skill core funzionanti in 2 stanze. Decision point a fine Fase 2: j4rv1s copre ~50% casi d'uso target. Proseguire F3-F7 e' opzionale, dipende da uso reale.
| # | Step | Dettaglio |
|---|---|---|
| 3.1 | Acquisto G8 #2 | HP EliteDesk 800 G8 mercato usato ~400-500 EUR. Spec: classe i7 11th gen+, 64GB RAM (vedi RA-004 per alternative Lenovo M90q, Dell OptiPlex equivalenti) |
| 3.2 | Acquisto UCG-Ultra | UniFi gateway genitori ~160 EUR |
| 3.3 | Setup G8 replica | OS clonato dal primary (configurazione identica). LUKS+btrfs già setup come da step 1.1 |
| 3.4 | Trasporto installazione genitori | G8 #2 + DS720+ #2 + UCG-Ultra + UPS piccolo (~120 EUR). Setup fisico a casa genitori (spazio + rete + alimentazione) |
| 3.5 | Site Magic VPN | Configurare tra UDM Pro casa e UCG-Ultra genitori. Test traffico inter-sito ~100-300 Mbit |
| 3.6 | Seeding iniziale | btrfs send full di /srv/data + Snapshot Replication Synology seed iniziale (può richiedere ore-giorni in base al volume) |
| 3.7 | Replica continua | Configurare cron btrbk + schedule Snapshot Replication ogni 15 min |
| 3.8 | cloudflared backup (ISSUE-002 P0) | Configurare cloudflared di backup sul G8 replica con stessi hostname. Documentare in §13 il meccanismo di failover: named tunnel cloudflared replicato sui due G8 con stesso UUID e credenziali, priorità routing CF Tunnel via metric/weight, detection del down (heartbeat), tempo medio switchover |
| 3.9 | Migrare Uptime Kuma | Sul G8 replica per monitoring meta-cross (probe verso il sito attivo da fuori) |
| 3.10 | Drill DR #1 | Documentare e testare procedura di failover end-to-end. Recovery from primary down → tutto su replica entro RTO 30 min. Documentare imprevisti per iterare |
| 3.11 | Dismettere DS718+ #2 | Recupero HDD se non già usati in step 2.18 |
Output Fase 3 Ridondanza geografica live. RPO 15 min. RTO 30 min. Drill DR esercitato.
Pausa-consolidamento prima di Fase 4 (raccomandazione syst3m): 6 mesi minimum di operate-and-learn dopo Fase 3 chiusura. Non aggiungere nuovo scope finché lo stack reale non ha visto fault, recovery, drift. Pattern Lean: build → operate → learn → expand.
| # | Step | Dettaglio |
|---|---|---|
| 4.1 | DR drill semestrale | Failover esercitato 2×/anno minimum, documentato. Cap soft 30 min RTO da rispettare |
| 4.2 | Onboarding utenti aggiuntivi | Parenti/amici fidati (max 4 ulteriori per restare sotto cap "≤15 servizi → 4-6 utenti effettivi") |
| 4.3 | Audit sicurezza completo | Lynis + ClamAV scan + Authentik audit log review + risposta a RA-001..008 dello syst3m. Re-run audit cyb3r + c0mpl14nc3 annuale |
| 4.4 | Valutazione LUKS NAS | Estendere LUKS at-rest oltre G8 → DS720+ #1/#2 dischi (DSM 7.x supporta encrypted shared folder; perf hit ~5-10%) |
| 4.5 | j4rv1s F3 Memory + persona | SQLite + Litestream verso NFS DS720+ #1, Qdrant collections (episodic + semantic), system prompt curato con iniezione contesto runtime, classificatore L2 per scrittura selettiva su episodic memory, retention purger 10gg attivo. "Ricordami questo", recall episodi, persona consistente |
| 4.6 | j4rv1s F4 Skill expansion | + calendar (Google OAuth), mail_triage, music, focus_mode, reminders, notes (Blinko RAG), documents (Paperless), shopping_list. Onboarding j4rv1s come daily driver cucina + studio. Decision point Fase 4 fine: valutare se F5-F7 o congelare |
| 4.7 * | j4rv1s F5 Proactive layer | Opzionale. Event watchers, trigger temporali, regole "quando X allora Y" ("alle 8 dimmi meteo + agenda", "se piove ricorda ombrello") |
| 4.8 * | j4rv1s F6 Vision + mobile | Opzionale. Integrazione Frigate / HA camera per skill vision (snapshot + analisi via Claude vision o LLaVa locale). iOS Shortcut per j4rv1s da iPhone fuori casa |
| 4.9 * | j4rv1s F7 Polish + satelliti | Opzionale. Web dashboard con metriche, voice tuning, persona refinement. Valutare 3°/4° satellite (salotto + camera) — D1 j4rv1s differita |
| 4.10 | Re-run audit syst3m | Annuale (vedi audit log). Verificare se RA-001..008 sono mitigati o aggiornare priorità |
* opzionali — proseguire solo se le 4 fasi precedenti hanno mostrato uso reale che giustifica.
| Voce | Costo | Fase |
|---|---|---|
| Hardware G8 primario (gia' posseduto) | 0 EUR | 0 |
| NVMe Samsung 990 PRO 1TB (riuso da G5) | 0 EUR | 0 |
| NVMe Kioxia XG6 512GB (gia' nel G8) | 0 EUR | 0 |
| SATA Samsung 870 EVO 500GB (gia' posseduto) | 0 EUR | 0 |
| Samsung 870 EVO 4TB x2 (gia' posseduti) | 0 EUR | 2 |
| DS720+ #1 (gia' posseduto) | 0 EUR | 2 |
| DS720+ #2 (gia' posseduto) | 0 EUR | 3 |
| DS918+ (riuso) | 0 EUR | 2 |
| HP EliteDesk 800 G8 #2 (usato) | ~400-500 EUR | 3 |
| UCG-Ultra (UniFi gateway genitori) | ~160 EUR | 3 |
| UPS piccolo casa genitori (1 KVA) | ~120 EUR | 3 |
| Cavetteria + switch piccolo genitori | ~80 EUR | 3 |
| Enclosure USB-C 3.2 Gen2 per 870 EVO (backup locale) | ~25 EUR | 1 |
| TOTALE CAPEX | ~785-885 EUR | - |
| Voce | Recupero stimato |
|---|---|
| HP EliteDesk 800 G5 (vendi) | ~250 EUR |
| Intel NUC10FNK (vendi) | ~280 EUR |
| 2x Synology DS718+ (vendi) | ~350 EUR |
| TOTALE RECUPERO | ~880 EUR |
Capex netto effettivo: indicativamente zero o leggermente positivo (recuperi vendite >= acquisti). Il fatto che esca a "zero" e' dovuto alla densita' di hardware gia' presente.
| Voce | Costo mensile |
|---|---|
| Backblaze B2 (1.5 TB cifrato) | ~10-12 USD (~9-11 EUR) |
| Energia casa (54 W idle) | ~10-13 EUR |
| Energia genitori (31 W idle) | ~6-8 EUR |
| Cloudflare DNS / Tunnel / Pages | 0 EUR (free tier) |
| Cloudflare Realtime TURN (audio chat) | 0 EUR (free tier) |
| Dominio d0mus.com (gia' posseduto) | ~1 EUR (annuo / 12) |
| UniFi Site Magic | 0 EUR (incluso UniFi) |
| TOTALE OPEX | ~26-33 EUR/mese |
Equivalente annuo: ~310-400 EUR/anno.
| Frequenza | Task |
|---|---|
| Settimanale | Verifica salute container (docker compose ps), check spazio disco, scan log Authentik per anomalie |
| Settimanale | Verifica esito backup B2 (ultima snapshot < 26 h) |
| Mensile | Update OS Ubuntu + reboot pianificato (drift di 1-2 settimane tra primary e replica) |
| Mensile | Update immagini Docker (con snapshot btrfs preventivo, rollback se rotto) |
| Trimestrale | Test restore Restic da B2 (pull random subset, verifica integrita') |
| Trimestrale | Audit utenti Authentik: disabilita account non usati, revisione 2FA enrollati |
| Semestrale | DR drill: failover completo a sito B, test 24 h, switch back |
| Annuale | Rinnovo credenziali Cloudflare TURN (TTL 1 anno) |
| Annuale | Audit sicurezza: Lynis, ClamAV, review CVE Synapse/Authentik/altre app |
| Annuale | Aggiornamento documentazione (questo documento) con cambiamenti reali |
Mantenuta in repository Git privato GitHub: docker-compose.yml, .env.example, configurazioni, README di deploy passo passo, runbook DR. Il repo non contiene secrets (file .env e' gitignored).
Pattern industry homelab maturo: maintenance day mensile (~1 ora) per tenere a bada i piccoli rischi quotidiani che gli audit tecnologici non vedono (polvere, batterie, configs di rete). Identificato dall'audit homelab-architect.
| ID | Task | Frequenza | Effort | Trigger |
|---|---|---|---|---|
| OPS-001 | Pulizia fisica G8 (ventole + thermal paste check + dust) | Annuale | 30 min | Stagione cambio o ventole rumorose |
| OPS-002 | UPS APC battery health check (Synology DSM o APC web UI). Sostituzione preventiva ogni 4 anni | Trimestrale check / 4 anni swap | 5 min check / 30 min swap | Calendar reminder |
| OPS-003 | Etichette fisiche hardware: G8 = "st4ck primary", DS720+ #1 = "hot storage", DS720+ #2 = "mirror genitori", DS918+ = "cold film". Aiuta dr.html persona di fiducia | One-time + annual review | 30 min | Onboarding persona di fiducia |
| OPS-004 | Smart home failsafe test: luci cucina/ingresso/bagno funzionano da interruttore fisico anche se HA è down | Annuale | 5 min walk-around | Pre-Fase 2 |
| OPS-005 | 4G/5G dongle USB + SIM dati per emergency upstream (caso ISP down + Site Magic down). Dongle ~30 EUR one-shot, SIM ~5-10 EUR/mese | One-time setup | 1 h setup + ordine | Pre-Fase 3 |
| OPS-006 | Morning health check: 1 min, apri st4ck.d0mus.com da mobile, verifica 4 tile rispondono. Catch issue prima che la famiglia se ne accorga | Quotidiano | 1 min | Routine mattina |
| OPS-007 | btrfs scrub su /srv/data + /srv/data2 per detection bit-rot | Mensile | 1 h background, 1 min setup cron | Cron settimanale notturno |
| OPS-008 | Config export UniFi controller + UDM Pro (chiude ISSUE-012 e ISSUE-013) | Mensile | 5 min | Calendar reminder + post UniFi update |
| OPS-009 | UniFi controller firmware update (controlled, NON auto). Pulizia release notes e verify post-update | Trimestrale | 30 min con verify | Notifica UniFi update disponibile |
Pattern: creare un calendar reminder ricorrente "homelab maintenance day" (1°/mese, ~1 ora) che esegue la checklist OPS-006 (quotidiano integrato altrove), OPS-007 (verifica scrub passato), OPS-008 (config export). OPS-001/002/003/004/009 sono trimestrali/annuali, agganciare a check del mese di apertura quarter. OPS-005 è one-time, fare entro Fase 3.
st4ck dipende da Cloudflare per 5 servizi: DNS, Tunnel, Pages (landing+docs), Access (Zero Trust auth), WAF. Compromissione/cambio policy/pricing 5x → blast radius enorme. Questo capitolo documenta le alternative OSS o low-cost per ciascuno, con stima effort di migrazione. Non è un piano di migrazione attivo: è la capability dormiente da poter attivare in 1-2 settimane se necessario.
| Servizio CF | Plan B | Effort migrazione | Pre-condizioni |
|---|---|---|---|
| Cloudflare DNS | (a) DeSEC.io nonprofit EU free tier · (b) NSD self-hosted · (c) Knot DNS · (d) Bind9 | ~4 ore: cambio nameserver registrar + import zone file | Backup zone file CF mensile in docs/dns-backup/ |
| Cloudflare Tunnel | (a) WireGuard mesh + reverse SSH tunnel su VPS €3/mese (Hetzner CPX11, Contabo VPS S) · (b) Tailscale Funnel · (c) Pangolin (open source CF Tunnel alternative) | 1 weekend: setup VPS + WG config + cloudflared decommission | VPS account già creato in standby; backup config cloudflared in repo |
| Cloudflare Pages | (a) Caddy + landing locale (codice già versionato in st4ck/, basta riattivare Caddyfile commentato) · (b) Netlify · (c) GitHub Pages se repo passa a public | 1 ora: decommentare blocco Caddyfile + bind-mount Docker già pronti | Authentik live (Fase 1+) per pattern forward-auth |
| Cloudflare Access (Zero Trust) | (a) Authentik Proxy Provider + outpost embedded (era il piano originale, già scelto come pattern m41n) · (b) Pomerium · (c) Authelia | 2-4 ore: creare Application Authentik per ciascun servizio CF Access-protected, route Caddy con forward_auth | Authentik live (Fase 1+) |
| Cloudflare WAF | (a) Caddy + CrowdSec (community-driven crowdsourced threat intel, EU) · (b) Caddy + ModSecurity · (c) fail2ban + ipset + nginx | 1 giornata: deploy CrowdSec container + scenarios + Caddy plugin | — |
Effort totale migrazione full-CF → self-hosted: ~5-7 giornate work. Il dossier contiene già il "codice originale" (Caddyfile + compose con blocchi commentati) per la maggior parte: non è "lock-in cementato", è "lock-in pragmatico". Trigger di attivazione Plan B: (a) CF cambia free tier in modo che renda costoso lo stack (>30 EUR/mese), (b) CF deprecata uno dei servizi che usiamo, (c) policy CF cambia in modo che colpisce dati famiglia (es. obbligo di scansione contenuti). Trigger di review: annuale, in coincidenza con re-run audit syst3m.
st4ck è attualmente operato da una sola persona (Aldo). Se Aldo è indisponibile temporaneamente o permanentemente, la famiglia perde accesso ai dati propri. Mitigazione progressiva basata su 3 layer: documento accessibile, runbook step-by-step, persona di fiducia onboarded.
| Layer | Cosa | Dove | Aggiornamento |
|---|---|---|---|
| L1 — Letter to family | Documento di 1-2 pagine in italiano semplice: "se mi succede qualcosa, ecco come accedere ai vostri dati". Include: ubicazione fisica G8 + password router + master password Vaultwarden + ubicazione YubiKey recovery + recovery key Authentik + recovery key Synapse + telefono persona di fiducia tech | Busta sigillata in safe fisico casa + copia con persona di fiducia (geograficamente separata, in caso di incendio) | Annuale + ogni cambio password master |
| L2 — DR runbook step-by-step | Procedura "scenario-driven" stampata: (a) "G8 non si accende → cosa fare", (b) "Authentik non risponde → break-glass account locale", (c) "Internet casa down → split-horizon DNS funziona", (d) "Dimenticato master password Vaultwarden → recovery key", (e) "Cancellato file per sbaglio → restore Restic da KopiaUI". Tono accessibile a non-tech | PDF stampato in 2 copie: una con la letter L1, una con persona di fiducia. Versione editable in repo privato docs/runbooks/ | Annuale + dopo ogni DR drill |
| L3 — Persona di fiducia onboarded | Una persona della famiglia/amico fidato con know-how minimo: sa come riavviare il G8, sa dove cercare il runbook, sa il telefono dell'azienda di consulenza (se prevista). Non deve saper amministrare lo stack — solo "what to do in the first 24h" | Conversazione + walk-through fisico setup hardware annuale | Annuale o cambio circostanze |
Cosa NON inserire nella letter: recovery key Restic/Kopia/B2 in plaintext (rischio compromissione fisica casa). Pattern raccomandato: passphrase Restic/Kopia generate da Vaultwarden via account "family-emergency" condiviso, accesso al quale è gated dietro la master Vaultwarden personale di Aldo (catena di accesso) + recovery key Vaultwarden in busta separata.
Effort iniziale stimato: letter L1 ~1 ora, runbook L2 ~4 ore (scrittura + test mentale per ogni scenario), L3 onboarding ~2 ore + ripetizione annuale. Status: tutti TODO. Priorità: chiudere L1+L2 prima di Fase 1 (vedi action items in §15).
Il modello di sicurezza st4ck prevede 4-6 utenti familiari come endpoint reali. Senza awareness training, ciascuno di loro è un vettore di phishing/social engineering che bypassa MFA e password manager. Necessario almeno una sessione "family security 101" nei primi 30 giorni post-Fase 1.
| Argomento | Cosa coprire (15-30 min ciascuno) | Quando |
|---|---|---|
| Password manager + MFA | Walk-through Vaultwarden (creazione vault, browser extension, mobile app), enrollment TOTP per ogni servizio, recovery key offline. Ognuno setup col proprio device sotto guida | Onboarding utente, post-Fase 1 |
| Phishing recognition | Esempi reali di phishing email/SMS/voice. Pattern "se ti chiede di fare qualcosa con urgenza, fermati". Mai cliccare link da SMS bancari/Poste/etc. Verifica via canale alternativo (chiamata diretta numero ufficiale) | Onboarding + refresh annuale |
| Hardware key 2FA (futuro) | Quando Authentik abilita WebAuthn/passkey: walk-through enrollment YubiKey/Titan come fattore primary, TOTP come fallback | Post-Fase 1, quando passkey abilitato |
| Cosa fare se device perso/rubato | Procedura: chiamare Aldo, lui revoca sessioni Authentik, blocca SIM mobile, reset master password. Tempo target: < 1 ora | Onboarding |
| Cosa NON fare | Mai inviare master password a chiunque (incluso Aldo). Mai disabilitare 2FA "per fare prima". Mai aprire link non richiesti. Mai installare app da store non ufficiali | Onboarding + refresh annuale |
Effort: ~2 ore prima sessione + ~30 min refresh annuale per persona. Status: TODO. Priorità: dopo onboarding 2 utenti iniziali Fase 1.
Per i pochi vendor cloud che st4ck usa (Cloudflare, Backblaze, Mistral, Anthropic), conviene archiviare i Data Processing Agreement (DPA) versionati nel repo. In caso di domande di audit familiare ("dove vanno i miei dati?") o di incidente con il vendor, si ha il riferimento contrattuale a portata di mano.
| Vendor | Documento | Path nel repo | Frequenza review |
|---|---|---|---|
| Cloudflare | Cloudflare DPA (incluso CCPA/GDPR addendum) + AUP | docs/dpa/cloudflare-dpa-v$(YYYY).pdf | Annuale o quando CF aggiorna |
| Backblaze (B2) | Backblaze DPA + EU Data Processing Addendum (per regione EU del bucket) | docs/dpa/backblaze-dpa-v$(YYYY).pdf | Annuale |
| Mistral (Le Plateforme) | Terms of Service + DPA (Mistral è francese, EU-native, GDPR diretto) | docs/dpa/mistral-tos-v$(YYYY).pdf | Annuale |
| Anthropic (Claude API) | Anthropic Commercial Terms + Acceptable Use Policy | docs/dpa/anthropic-terms-v$(YYYY).pdf | Annuale |
| Nabu Casa (HA Voice PE hardware) | HA Voice PE manuale firmware + Nabu Casa privacy policy se userai HA Cloud | docs/dpa/nabucasa-firmware.pdf | Quando esce firmware update significativo |
Effort: ~30 min download + commit iniziale, ~30 min/anno review. Status: TODO. Cartella: docs/dpa/ da creare al primo commit.
ADR-light registry: ogni decisione architetturale ha ID stabile (D-NNN), data, status (ACTIVE / SUPERSEDED / DEFERRED), alternativa scartata, motivo. Raggruppate per area tematica.
| ID | Data | Status | Decisione | Alternative | Motivo |
|---|---|---|---|---|---|
| D-001 | 2026-05-03 | ACTIVE | Authentik come IdP unico | Keycloak / Authelia | UI moderna, stack Go/Python piu' leggero, OIDC stato dell'arte, supporto Site Magic-friendly |
| D-002 | 2026-05-03 | ACTIVE | Vaultwarden vs Bitwarden self-host ufficiale | Bitwarden ufficiale (PHP/.NET pesante) | Stesso protocollo, 1/10 della RAM, single binary Rust, 100% compatibile client |
| ID | Data | Status | Decisione | Alternative | Motivo |
|---|---|---|---|---|---|
| D-010 | 2026-05-03 | ACTIVE | Synapse / Matrix per chat | Rocket.Chat / Mattermost / Nextcloud Talk / HuLa | E2EE robusto, app mobile mature (Element X), federation disattivabile, lock-in zero |
| D-011 | 2026-05-03 | ACTIVE | Immich per foto | Nextcloud Photos / PhotoPrism | Performance superiore con librerie grandi, ML faces locale eccellente, mobile native top |
| D-012 | 2026-05-03 | ACTIVE | Seafile per documenti | Nextcloud / OpenCloud / Pydio | Sync velocita' top di categoria, mobile polished, OIDC OK, community grande, basso risk pivot |
| D-013 | 2026-05-03 | ACTIVE | Paperless-ngx per knowledge PDF | DocSpell / Mayan EDMS | Maturita' superiore, OCR integrato, OIDC supportato, footprint contenuto |
| D-014 | 2026-05-03 | ACTIVE | Mailpiler per archivio mail | Stalwart / DocSpell / Dovecot DIY | Specializzato per archivio (no SMTP), full-text search nativo, doc abbondante |
| D-015 | 2026-05-06 | ACTIVE | Home Assistant in Docker (Container) sul G8 | HAOS in VM KVM / Supervised / mantenere host attuale | Coerente col resto dello stack Docker puro, niente overhead VM, migrazione = copia volume config/. Trade-off accettato: niente Add-on Store ufficiale (gli equivalenti girano gia' come container separati nello stack) |
| D-016 | 2026-05-06 | ACTIVE | Blinko per note-taking AI / second-brain | Memos / Trilium Next / Joplin Server / Logseq sync | RAG nativo sui propri appunti, cattura rapida mobile, markdown puro, multi-piattaforma con app Tauri leggere, SSO/OIDC integrabile con Authentik. Trade-off: progetto piu' giovane (less mature di Joplin/Logseq), accettato in cambio dell'AI integrata. Ruolo distinto da Paperless e Seafile |
| D-017 | 2026-05-08 | ACTIVE | Modulo j4rv1s integrato in st4ck (assistente voice-first multi-room) | (a) Mac mini standalone come edge brain (b) Repo separato con deploy K8s dedicato (c) Picovoice/Alexa/Siri come back-end | (a) scartato: capex 1065 EUR vs 174 EUR con satelliti HA Voice PE, non multi-room, vendor lock-in. (b) scartato: zero motivo per orchestrator pesante, st4ck ha gia' Authentik+Caddy+Redis+Restic riusabili. (c) scartato per privacy + EU bias + costo: STT/wake word locale, LLM router cost-tuned con Mistral Small EU default, opex 6-12 EUR/mese. Soluzione scelta: 7 container j4rv1s-* + wyoming-* dentro lo stesso docker-compose, satelliti WiFi multi-room come edge |
| ID | Data | Status | Decisione | Alternative | Motivo |
|---|---|---|---|---|---|
| D-020 | 2026-05-03 | ACTIVE | Compute = NUC/G8, Storage = NAS | Tutto-in-uno NAS Synology / TrueNAS | Vendor independence vera, replaceability separata, stack Linux puro |
| D-021 | 2026-05-03 | ACTIVE | btrfs sui NVMe del G8 | ext4 / ZFS | Snapshot e send/receive nativi, in-tree (niente DKMS), ottima per replica futura |
| D-022 | 2026-05-03 | ACTIVE | 2x SSD 4TB in DS720+ SHR-1 | HDD spinning + cache NVMe | Latenza migliore per Immich/Seafile, redundancy mirror nativa |
| D-023 | 2026-05-03 | ACTIVE | Synology Snapshot Replication | Synology HA / DRBD / DIY rsync | SHA non funziona su WAN, Snap Repl funziona perfetta su Site Magic |
| D-024 | 2026-05-03 | ACTIVE | btrbk per replica G8 -> G8 | syncoid (ZFS) / DIY scripts | btrfs-native, retention policy buona, configurazione semplice |
| D-025 | 2026-05-03 | ACTIVE | Backblaze B2 backup off-site | Storj / S3 / IDrive E2 / NAS off-site dedicato | Prezzo ottimo per piccoli volumi, regione EU, integrazione Restic perfetta |
| D-026 | 2026-05-06 | ACTIVE | Kopia per backup endpoint famiglia | UrBackup / Duplicati / Restic CLI / BorgBackup+Vorta | GUI nativa Mac/Win/Linux, dedup globale block-level, E2EE client-side, repo-agnostic |
| ID | Data | Status | Decisione | Alternative | Motivo |
|---|---|---|---|---|---|
| D-030 | 2026-05-03 | ACTIVE | Cloudflare Tunnel + niente porte aperte | Port forwarding + Let's Encrypt HTTP-01 | Superficie d'attacco minima, niente CGNAT issue, WAF gratis al bordo. Lock-in tracciato in RA-001 con Plan B in §13 |
| D-031 | 2026-05-03 | ACTIVE | Cloudflare Realtime TURN | coturn self-host + UDP esposto | Free tier sufficiente, no UDP da aprire, audio quality ottima |
| D-032 | 2026-05-03 | ACTIVE | Site Magic VPN UniFi | WireGuard manuale / Tailscale | Gestione tramite UniFi console, gia' integrata, zero account terzi |
| D-033 | 2026-05-03 | ACTIVE | 2 siti (casa + genitori) | VPS Hostinger come secondario | FTTH simmetrica gratis, dati 100% on-prem, zero dipendenza commerciale |
| D-034 | 2026-05-06 | SUPERSEDED | Index pubblico senza auth / Forward-auth Authentik su tutto / Dashboard container Homepage | Era il piano del dossier v1.4-v1.7. Superseded da D-035 quando CF Pages+Access ha permesso di portare la landing online mesi prima del resto dello stack, indipendente da Fase 1. Pattern Caddy+Authentik resta come Plan B in §13 | |
| D-035 | 2026-05-08 | ACTIVE | Landing st4ck.d0mus.com su Cloudflare Pages + CF Access (supersedes D-034) | Caddy interno + Authentik (D-034) / GitHub Pages | Supersedes D-034 perche' CF Pages indipendente da Fase 1, deploy mesi prima. Authentik forward-auth resta opzione migrazione futura per unificare auth. GitHub Pages su repo privato richiede piano Pro+, e CF Pages e' gia' nello stesso vendor del tunnel/DNS. CF Access offre identity-aware proxy gratis fino a 50 utenti, build automatica, edge global CDN |
| ID | Data | Status | Decisione | Alternative | Motivo |
|---|---|---|---|---|---|
| D-040 | 2026-05-03 | ACTIVE | Ubuntu Server LTS | Debian / Proxmox / TrueNAS Scale | Doc abbondantissima, supporto 5-10 anni, kernel recente per CPU 11th gen |
| D-041 | 2026-05-08 | ACTIVE | Vincolo soft mantenibilita' (codificato da audit syst3m): <=15 servizi attivi, <=20 ISSUE aperte simultaneamente, <=2 OS distinti nello stack, <=1 stack di compute principale | "Tutto sotto un weekend" senza limite / Crescita organica senza vincolo | Vincolo forte: 1 persona unica gestisce. Senza vincolo soft, i piani crescono finche' diventano ingestibili sotto la pressione del singolo operator. Conseguenze: sotto cap = aggiungi tranquillo; sopra cap = consolidare prima di aggiungere altro. Cap calibrate da bus factor + cognitive load reale stack 2026: 11 servizi attuali + 2 in roadmap = 13, OK. Aggiunta j4rv1s mantiene cap 14-15. Ulteriori scope = decisione esplicita di trade-off |
Riepilogo: 22 decisioni totali (ADR-light, raggruppate in 5 aree). Status: 21 ACTIVE / 1 SUPERSEDED (D-034 -> D-035 landing m41n a st4ck). Decisioni differite tracciate nella sub-sezione "Decisioni differite" di §15. Pattern industry: Architecture Decision Records (ADR) leggero, sufficiente per scala 1-persona. Date prima del 2026-05-03 = baseline pivot da DS718+ legacy.
Snapshot al 2026-05-08. Aggiornato manualmente quando milestone completate. Per il backlog operativo dettagliato vedi backlog & next steps.
Output Fase 0 atteso: hardware G8 pronto + ordini hardware avviati + documentazione completa. Manca: A1 (acquisto hw key 2FA opzionale), A3 (NVMe move), A4 (BIOS), A5 (ordine HA Voice PE), A7 (enclosure backup). Vedi backlog Tier A.
| Fase | Domanda | Stato |
|---|---|---|
| Fase 1 | Workspace fisico per setup G8 (monitor + tastiera + mouse) | DA RISPONDERE |
| Fase 1 | UniFi gateway casa: modello esatto + versione firmware (compat Site Magic) | DA RISPONDERE |
| Fase 1 | Timeline: avvio Fase 1 entro 2 settimane o più tardi? | DA RISPONDERE |
| Fase 1 | Hardware key 2FA per CF account già acquistata? (YubiKey/Titan) | DA RISPONDERE |
| Fase 2 | HA Voice PE ordinati? (lead time 2-4 settimane Nabu Casa) | DA RISPONDERE |
| Fase 2 | Persona di fiducia onboardata per Bus factor mitigation? | DA RISPONDERE |
| Fase 3 | Spazio fisico genitori: dove posizionare G8 + DS720+ + UCG + UPS? | DA RISPONDERE |
| Fase 3 | HP EliteDesk 800 G8 #2 sul mercato usato (o classe equivalente: Lenovo M90q, Dell OptiPlex 7000) | DA REPERIRE |
| Fase 3 | Runbook DR step-by-step scritto e testato | DA SCRIVERE |
Output cumulativo degli audit interni (vedi audit log): arch + perf (2026-05-06), cyb3r + c0mpl14nc3 (2026-05-07), refresh + syst3m (2026-05-08). Severity P0 = da chiudere prima di Fase 1; severity P1-P3 = differita ma tracciata.
| ID | Stato | Sev | Titolo | Owner | Deadline |
|---|---|---|---|---|---|
ISSUE-001 | OPEN | P0 | Authentik SPoF + procedura break-glass | Aldo | Pre-Fase 1 |
ISSUE-002 | OPEN | P0 | Failover cloudflared esplicito + runbook DR | Aldo | Pre-Fase 3 |
ISSUE-003 | DEFERRED | P1 | DB sprawl PG14 (Blinko) vs PG16 standard | Aldo | Fine Fase 2 |
ISSUE-004 | OPEN | P0 | chattr +C su volume Postgres pre-deploy | Aldo | Fase 1 step 4 |
ISSUE-005 | OPEN | P0 | Indici Mailpiler obbligatori su NVMe locale | Aldo | Fase 2 |
ISSUE-006 | RESOLVED | P0 | Rigenerazione PDF dossier manuale → migrato a HTML print-on-demand | Aldo | 2026-05-08 ✓ |
ISSUE-007 | OPEN | P0 | LUKS at-rest encryption sui NVMe G8 | Aldo | Fase 1 step 1 |
ISSUE-008 | RESOLVED | P0 | Data retention policy esplicita per servizio | Aldo | 2026-05-07 ✓ (v1.6) + estensione j4rv1s 2026-05-08 |
ISSUE-009 | OPEN | P0 | Procedura off-boarding utente (GDPR art. 17) | Aldo | Pre-Fase 2 |
ISSUE-010 | RESOLVED | P0 | Hardening account Cloudflare (2FA TOTP gia' attivo) — sub-action raccomandate ma non bloccanti: hardware key + email separata + CT monitoring + API token least-priv | Aldo | 2026-05-08 ✓ (TOTP) |
ISSUE-011 | TRACKING | P1 | Sequencing modulo j4rv1s vs fasi st4ck | Aldo | Implicito nelle fasi |
ISSUE-012 | OPEN | P1 | UniFi controller config NON backuppata (audit homelab) | Aldo | OPS-008 Mensile |
ISSUE-013 | OPEN | P1 | UDM Pro config NON backuppata (audit homelab) | Aldo | OPS-008 Mensile |
ISSUE-014 | DEFERRED | P2 | HA Voice PE firmware rollback procedure assente (audit homelab) | Aldo | Post j4rv1s F1 deploy |
Riepilogo: 14 ISSUE totali · 11 OPEN (di cui 5 P0 pre-Fase 1, 2 P0 differite a Fase 2/3, 2 P1 da audit homelab, 1 tracking, 1 P1 deferred) · 3 RESOLVED (006 PDF→HTML, 008 retention policy, 010 CF 2FA TOTP) · 0 DEFERRED. Top 2 P0 cronologicamente vincolati: #007 LUKS (Fase 1 step 1), #004 chattr +C Postgres (Fase 1 step 4). Nuove 2026-05-08 da audit homelab: #012 UniFi config backup, #013 UDM config backup, #014 HA Voice firmware rollback.
Vedi action items dettagliati di ogni ISSUE nel testo originale qui sotto. Tabella sopra è il quick reference.
chattr +C mancante su volume Postgres. btrfs CoW penalizza random write dei DB. Senza nodatacow sul subdir Postgres, latency commit -30/-50% rispetto al possibile. Action: nel runbook Fase 1 aggiungere step "mkdir /srv/data/postgres && chattr +C /srv/data/postgres" PRIMA del primo docker compose up. Trade-off accettato: niente snapshot btrfs sul subdir (i backup PG passano per pg_dump e Restic). Owner: Aldo. Deadline: Fase 1, step 4.data/ (NFS, raw .eml) da volume indexes/ (NVMe /srv/data2). Documentare in runbook Fase 2. Owner: Aldo. Deadline: Fase 2.st4ck/dossier.html nel repo) servito direttamente da CF Pages, print-friendly via CSS @media print + bottone Stampa nella toolbar. Niente piu' rigenerazione, niente piu' file binari da committare, niente piu' drift HTML/PDF. Implicazione: per archiviare offline o stampare, l'utente usa il bottone Stampa del browser che produce un PDF print-on-demand A4 con stile light forzato.docs/runbooks/offboarding.md come checklist runbook: (1) deactivate Authentik user, (2) Synapse POST /_synapse/admin/v1/deactivate/{user}, (3) Vaultwarden delete user, (4) Immich delete user (cascade album), (5) Blinko delete user, (6) Mailpiler purge mailbox, (7) HA delete person + recorder data, (8) Kopia delete repository entry, (9) export e consegna dati personali in archivio cifrato all'utente uscente prima della cancellazione. ETA per esecuzione: ~1 ora per utente. Owner: Aldo. Deadline: pre-Fase 2 (quando si onboarda 4 utenti, l'eventuale off-boarding diventa caso d'uso reale).cf-st4ck@d0mus.com alias), (c) Certificate Transparency monitoring webhook con alert (es. Cloudflare Abuse Reports + crt.sh feed), (d) API token usato da Caddy ridotto a scope minimo Zone:DNS:Edit per d0mus.com (non account-wide), rotazione semestrale, (e) abilitare CF "User > Security > Login monitoring" con alert email su nuovo browser/IP. Owner: Aldo. Deadline: Fase 1 step 0 (prima ancora di qualsiasi deploy).j4rv1s-api/j4rv1s-worker buildate e pushate su GHCR. Action: rispettare l'ordinamento documentato nei nuovi sub-step di Fase 0/1/2 in §11. Trigger di rilascio dossier v1.8: al completamento di j4rv1s F2 aggiornare nuovamente §03/§05/§08 con stato post-deploy (decisione D4 design doc j4rv1s) - inclusi eventuali drift dalle stime (latency reale, opex misurato, skill aggiunte). Owner: Aldo. Deadline: sequenziamento implicito nelle fasi st4ck; nessuna scadenza esplicita oltre quelle già nelle fasi.Output dell'audit syst3m (system architecture specialist, lente 3-10 anni). Rischi long-term distinti dalle ISSUE operative sopra: le ISSUE si chiudono in giorni/settimane, i rischi RA si mitigano gradualmente nel tempo e non hanno deadline rigide.
| ID | Rischio | Trigger / Probabilità | Impatto | Mitigazione raccomandata |
|---|---|---|---|---|
RA-001 | Lock-in Cloudflare consolidato (DNS + Tunnel + Pages + Access + WAF tutto CF) | CF cambia pricing/policy/free tier · Probabilità bassa-media (~10% in 5 anni) | Catastrofico | Plan B doc per ciascun servizio CF in §13: NSD/DeSEC.io per DNS, WireGuard mesh per tunnel, Caddy+Authentik forward-auth per Pages+Access (codice gia' versionato), Caddy+CrowdSec per WAF |
RA-002 | Bus factor = 1 (Aldo unico operator) | Aldo indisponibile temporaneamente (malattia, viaggio) o permanentemente · Probabilità media (15-25% in 10 anni) | Critico per famiglia | Letter to family + DR runbook step-by-step + chiavi master in safe fisico + persona di fiducia onboarded con minimo know-how |
RA-003 | Postgres 14 EOL (vincolo upstream Blinko) | PG14 EOL Nov 2026; Blinko upstream non aggiorna in tempo · Probabilità media | Medio | Test PG16 in staging fine Fase 2 (gia' ISSUE-003); fallback: switch Blinko → Memos / Trilium se necessario |
RA-004 | Hardware lock-in classe HP G8 | Mercato usato i7-11th gen secca / prezzi salgono · Probabilità bassa-media | Medio (impatto Fase 3 acquisto G8 #2) | Ridefinire spec come "classe i7 11th gen+, 64GB RAM" non modello specifico — accettare alternative Lenovo M90q, Dell OptiPlex equivalenti |
RA-005 | Modulo j4rv1s gonfia il monorepo | F4-F7 → 1500+ righe Python + 18+ skill + worker + dashboard · Probabilità alta se progetto procede | Medio (cognitive load) | Submodule git o sub-repo separato prima di j4rv1s F4. Decisione architetturale, non urgente |
RA-006 | DSM Synology EOL/breaking | DSM 7 → DSM 8 (~2027), incompatibilità feature SHR-1 / Snapshot Replication · Probabilità media | Medio | TrueNAS Scale familiarizzazione lab Fase 3 su DS720+ #2 dual-boot; preparazione migrazione PRIMA del bisogno reale (gia' tracciato come decisione differita) |
RA-007 | OS sprawl se Mac mini M4 entra | Riapertura D2 j4rv1s con scelta M4 invece di N5 · Probabilità media (M4 e' Recommended in §15) | Medio (mantenibilità) | Codificare vincolo soft "max 2 OS distinti nello stack" in §14 e ridiscutere D2 in luce di questo. Preferire Linux N5 se il vincolo OS pesa di piu' del costo (~2x del M4) |
RA-008 | Tech debt da scelte 2026 invecchiano male | 36+ mesi senza review architetturale strategica · Probabilità alta se non si codifica il loop | Variabile (cumulativo) | Riapertura review syst3m annuale (workflow gia' codificato in audit log) |
Top 3 RA da mitigare entro Fase 1: RA-001 Plan B Cloudflare (~2 ore doc), RA-002 letter to family + DR runbook (~4 ore), RA-008 calendar reminder per review syst3m annuale (~5 min).
*.d0mus.com (issue da audit, P2): ridurre i ~11 override individuali a 1 wildcard + eccezioni (w3b su CF Pages). Decisione: dopo deploy completo Fase 2 quando lista servizi e' stabile.compose.identity.yml + compose.chat.yml + ecc. Riduce blast radius degli update. Decisione: a fine Fase 2, quando lo stack monolitico avra' raggiunto ~12 servizi e il refactor sara' giustificato.latest, stable) e nessuna verifica firma. Watchtower auto-update amplifica il supply chain risk. Pattern industry 2025+: Sigstore/cosign per image signing, Syft per SBOM generation, Grype per CVE scanning. Decisione: introdurre in Fase 4 quando Watchtower passa a notify-only e si pinnano i tag a digest immutabili. Effort: ~1 giornata setup pipeline + cron settimanale.Source of truth completo in Backlog & Next Steps. Qui solo Tier A (pre-Fase 1) e Tier B (documenti fuori dossier) per cross-reference.
| Tier | # | Action | Effort | Pri |
|---|---|---|---|---|
| A | A1 | Acquisto hardware key 2FA (YubiKey 5C NFC o Titan, ~50 EUR) | 30 min | P0 |
| A2 | Hardening account Cloudflare (hw key + email separata + CT monitoring + API token least-priv) | 2 h | P0 | |
| A3 | Spostare NVMe 990 PRO 1TB dal G5 al G8 | 30 min | P1 | |
| A4 | Verificare BIOS G8 (secure boot off, AHCI on, virt on) | 15 min | P1 | |
| A5 | Ordinare 2× HA Voice Preview Edition Nabu Casa (~140 EUR, lead time 2-4 settimane) | 15 min | P1 | |
| A6 | Vendere G5 dopo cannibalizzazione (~250 EUR) | 1-2 sett mercato | P3 | |
| A7 | Acquisto enclosure USB-C 3.2 Gen2 + cassettino backup locale (~25 EUR) | 30 min | P1 | |
| A8 | Conferma timeline avvio Fase 1 | 5 min | DECISION | |
| A9 | Verifica modello UniFi gateway casa + firmware | 10 min | P1 | |
| B | B1 | Letter to family (busta sigillata in safe + persona di fiducia) | 1 h | RA-002 |
| B2 | DR runbook step-by-step scenario-driven (PDF stampato) | 5 h | RA-002 | |
| B3 | Persona di fiducia onboardata | 2 h + annuale | RA-002 | |
| B4 | docs/runbooks/offboarding.md | 4 h | P0 ISSUE-009 | |
| B5 | docs/dpa/ + 5 PDF vendor (CF, B2, Mistral, Anthropic, Nabu Casa) | 30 min | A.5.23 | |
| B6 | docs/runbooks/restore-test.md | 2 h + cron | A.8.13 |
Top 5 ranked: H1 (verifica CF Pages dashboard), A2 (CF account hardening), B1+B2 (Letter+DR runbook), A3+A4+A5 (hardware Fase 1), D5 (j4rv1s F0a scaffold). Vedi backlog per Tier C-H completi.
| Identificativo | Specifiche | Stato | Destinazione |
|---|---|---|---|
| HP EliteDesk 800 G8 | Intel 11th gen, 64 GB DDR4, mobo con 2x M.2 (no SATA bay) | In uso | Compute primario casa |
| HP EliteDesk 800 G5 | Intel 9th gen, 16 GB DDR4 | Disponibile | VENDI dopo cannibalizzazione |
| Intel NUC10FNK | Intel 10th gen U-series, 32 GB DDR4 | Disponibile | VENDI dopo cannibalizzazione |
| HP EliteDesk 800 G8 #2 | (da acquisire usato, generation 11) | Da reperire | Compute replica genitori |
| Hardware compute potenziale (non pianificato, decisione differita D2 j4rv1s): service node LLM dedicato per inferenza locale modelli 14B+ realtime, da riaprire se opex cloud > 30 EUR/mese. Vedi §15 decisioni differite. | |||
| Minisforum N5 | AMD Ryzen AI 9 HX 370 (12c), 32GB DDR5, 1TB NVMe, NPU 50 TOPS | Potenziale | Service node LLM (~1500 EUR, Linux nativo) |
| Mac mini M4 base ricondizionato | Apple M4 (10c CPU/10c GPU), 24GB unified, 512GB SSD, Neural Engine 38 TOPS | Potenziale (RECOMMENDED) | Service node LLM (~800 EUR, MLX-accelerated) |
| Mac mini M4 Pro ricondizionato | Apple M4 Pro (12c CPU/16c GPU), 24GB unified, 512GB SSD | Potenziale | Service node LLM (~1250 EUR, room per modelli 14-22B) |
| Modello | Capacita' | Origine | Destinazione finale |
|---|---|---|---|
| Samsung MZV9P1T0 (990 PRO) | 1 TB | Era nel G5 | G8 primary - M.2 Gen4 |
| Kioxia KXG60ZNV512G XG6 | 512 GB | Era nel G8 | G8 primary - M.2 Gen3 |
| Samsung MZ-V7S500 (970 EVO+) | 500 GB | Era nel NUC10 | G8 replica - M.2 (futuro) |
| Samsung 870 EVO 500 GB (2.5" SATA) | 500 GB | Spare | G8 primary - USB-C esterno (Restic locale) |
| Samsung MZNTY256HDHP (M.2 SATA) | 256 GB | Era nel G8 | RIMOSSO - cassetto / vendi (cede slot M.2 al 990 PRO) |
| Samsung 870 EVO 4 TB x2 | 4 TB cad | Spare | DS720+ #1 - SHR-1 |
| Modello | Configurazione attuale | Destinazione finale |
|---|---|---|
| Synology DS720+ #1 | Vuoto / pulito | Casa - hot storage SHR-1 |
| Synology DS720+ #2 | Vuoto / pulito | Genitori - replica via Site Magic |
| Synology DS918+ | HDD esistenti con film | Casa - cold film server NFS |
| Synology DS718+ (legacy) | Synology Chat/Drive/Photos in uso | DISMETTI dopo fase 2 |
| Synology DS718+ (backup) | Spento | VENDI |
| Modello | Sito | Stato |
|---|---|---|
| UDM Pro / UCG-Max (verificare) | Casa | Esistente |
| UCG-Ultra | Genitori | Da acquistare ~160 EUR |
| Switch UniFi Lite 8 / equiv | Genitori | Verificare se gia' presente |
| UPS APC 1 KVA | Casa | Esistente, autonomia 35 min |
| UPS piccolo (~600 VA) | Genitori | Da acquistare ~120 EUR |
| Componente | Quantita' | EUR/unita' | EUR totale | Note |
|---|---|---|---|---|
| HA Voice Preview Edition (Nabu Casa) | 2 | ~70 | ~140 | ESP32-S3, 2× XMOS far-field, speaker built-in, mute hardware, microWakeWord pre-trained "jarvis" |
| Alimentatori USB-C 5V/2A | 2 | ~10 | ~20 | Standard, qualsiasi marca certificata |
| Cavi USB-C 2m | 2 | ~7 | ~14 | Per posizionamento flessibile lontano da prese |
| Totale capex edge j4rv1s F1 | ~174 EUR | Servizi G8: zero capex (riuso) | ||
Opex j4rv1s mensile (run-rate stimato): Mistral Small 3.x EU 2-4 EUR (default L3, ~140 req/g con prompt cache), Claude Haiku 4.5 1-3 EUR (L4 ~6 req/g), Claude Sonnet 4.6 0-2 EUR (L5 on-demand), energia G8 +10W ~2 EUR + 2× satelliti +6W ~1 EUR. Totale: 6-12 EUR/mese con Piper TTS locale; +5 EUR se ElevenLabs Starter abilitato come opt-in skill premium.
| Servizio | Container image | Versione target |
|---|---|---|
| Ubuntu Server | (host OS) | 24.04 LTS |
| Docker Engine | (host) | 27.x |
| Caddy | caddy:2-alpine | 2.x stable |
| AdGuard Home | adguard/adguardhome | latest stable |
| Authentik server | ghcr.io/goauthentik/server | 2025.10+ |
| Authentik worker | ghcr.io/goauthentik/server | 2025.10+ |
| Synapse (Matrix) | matrixdotorg/synapse | v1.119+ |
| Element Web | (static su CF Pages) | v1.11.91+ |
| Vaultwarden | vaultwarden/server | 1.32+ |
| Immich server | ghcr.io/immich-app/immich-server | v1.140+ |
| Immich ML | ghcr.io/immich-app/immich-machine-learning | v1.140+ |
| Seafile server | seafileltd/seafile-mc | 11.x community |
| OnlyOffice Document Server | onlyoffice/documentserver | community |
| Paperless-ngx | ghcr.io/paperless-ngx/paperless-ngx | 2.14+ |
| Mailpiler | (community image) | 1.4+ |
| Home Assistant | ghcr.io/home-assistant/home-assistant | 2025.10+ |
| Blinko | blinkospace/blinko | latest stable |
| Postgres dedicato Blinko | postgres | 14 (vincolo upstream Blinko) |
| Kopia Server | kopia/kopia | 0.17+ |
| j4rv1s API + dashboard | ghcr.io/<user>/j4rv1s-api (custom) | 0.1+ (sviluppo iniziale) |
| j4rv1s LLM (Llama 3.1 8B locale) | ghcr.io/ggerganov/llama.cpp:server | latest stable |
| j4rv1s Qdrant (vector DB) | qdrant/qdrant | 1.x stable |
| j4rv1s worker (skill executor + APScheduler) | ghcr.io/<user>/j4rv1s-worker (custom) | 0.1+ (sviluppo iniziale) |
| Wyoming faster-whisper (STT) | rhasspy/wyoming-whisper | large-v3 italiano |
| Wyoming Piper (TTS) | rhasspy/wyoming-piper | voce it_IT-riccardo-x_low |
| Wyoming openWakeWord (fallback) | rhasspy/wyoming-openwakeword | preload model "jarvis" |
| PostgreSQL (per ogni app) | postgres | 16-alpine |
| Redis | redis | 7-alpine |
| Restic | restic/restic | 0.17+ |
| Watchtower | containrrr/watchtower | 1.7+ |
| Uptime Kuma | louislam/uptime-kuma | 1.23+ |
| cloudflared | cloudflare/cloudflared | latest |
// FINE DOCUMENTO //
st4ck.d0mus.com - Project Dossier v2.11
Aggiornato 2026-05-08 (v2.11: cover refresh con 3 meta-card colorate per stato/owner/architettura, KPI card upgrade (accent bar laterale + emoji icon + hover lift), TOC indice cliccabile (16 link interni a #sec-NN), fix "VERSIONE 2.2" obsoleto. Vedi changelog completo in cover.)
Documento privato Aldo Brunello