← Home
st4ck.d0mus.com · Project Dossier · v2.6 · 2026-05-08
// PROJECT DOSSIER //

st4ck

. d0mus . com
VERSIONE 2.2
DATA 2026-05-08
OWNER Aldo Brunello
DOMINIO d0mus.com (Cloudflare)
SITI 2 (casa + genitori)
UTENTI 4-15 fidati
Changelog v1.0 → v2.6
VersioneDataHighlight
v1.02026-05-03Pivot da DS718+ legacy a HP EliteDesk G8 + Ubuntu Server, baseline architettura
v1.1-1.32026-05-05/06Aggiunti Kopia (LAN-only), Home Assistant, Blinko nello stack
v1.4-1.52026-05-06Audit interno arch+perf → ISSUE-001..006
v1.62026-05-07Audit cyb3r+c0mpl14nc3 → +ISSUE-007..010, retention policy, LUKS promosso a Fase 1
v1.7-1.92026-05-08Modulo j4rv1s integrato, m41n→st4ck rename, CF Pages+CF Access live
v1.102026-05-08D2 j4rv1s estesa con Mac mini M4 ricondizionato come terza opzione service node
v2.02026-05-08Major: 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.62026-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.62026-05-08Cover changelog, diagrammi ASCII collapsible mobile-friendly, §10 RTO/RPO grid card, §04 NAS coerenza dettaglio, §15 cleanup domande stale

Stato in numeri

Servizi self-host
11
attivi pianificati
Porte aperte router
0
zero-trust egress only
Layer di backup
5
3-2-1 stratificato
Siti fisici
2
casa + genitori (Site Magic)
Utenti famiglia F1-F4
4 + 2
adulti + figli
Capex hardware
~0 EUR
100% riuso parco
Opex stack core
~3 EUR
/mese (B2 cloud + dominio)
Opex modulo j4rv1s
~6-12 EUR
/mese (Mistral + Anthropic)
RTO target Fase 3+
30 min
manuale, runbook DR
RPO target Fase 3+
15 min
btrbk + Snapshot Replication
ISSUE P0 aperte / risolte
8 / 3
audit interno cumulativo
Risk register architetturale
8
RA-001..008 da syst3m

Indice

  1. Visione e obiettivi3
  2. Architettura ad alto livello4
  3. Hardware e ruoli6
  4. Storage e dischi8
  5. Stack software10
  6. Hostname e DNS strategy12
  7. Network e Site-to-Site VPN13
  8. Replica e backup14
  9. Modello di sicurezza16
  10. RTO / RPO matrix17
  11. Phasing del rollout18
  12. Costi (capex + opex)19
  13. Operations e manutenzione20
  14. Decisioni e rationale21
  15. Open questions e next steps22
  16. Appendice A - Inventario completo23

📊 Stato Progetto — Pulse Check

Aggiornato: 2026-05-08 · dossier v2.6
Lettura
Fase 0 in corso. Documentazione e UI sito statico maturi (dossier v2.6 HTML print-friendly + audit log dedicato su Cloudflare Pages + CF Access). Hardware non ancora migrato dal G5 al G8. Modulo j4rv1s in design phase v0.3. Il deploy del core stack non è iniziato. 6 audit completati (arch / perf / u1 / cyb3r / c0mpl14nc3 / syst3m), tutte le finding tracciate.
Cosa va
Documentazione vivente con 6 audit cumulativi e ISSUE/RA tracker espliciti. Repo privato 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.
Cosa non va
G8 non ancora cannibalizzato (NVMe da spostare). 1 ISSUE P0 critica ancora aperta pre-Fase 1: Authentik break-glass (#001). Lead time HA Voice PE 2-4 settimane non ancora avviato (modulo j4rv1s F1 bloccato). Bus factor = 1 (rischio architetturale top, da syst3m).
Rischio sottovalutato
Account Cloudflare 2FA TOTP attivo (ISSUE-010 RESOLVED), ma resta singolo punto di MITM totale dello stack futuro (DNS + Tunnel + Pages + Access + WAF tutto CF). Compromessa CF = compromessi tutti i servizi. Lock-in CF cresciuto in 5 versioni del dossier ma exit strategy ora documentata in Plan B Cloudflare (vedi RA-001). Bus factor = 1 resta il rischio architetturale top (mitigazione in §13, ancora TODO).
Prossimi 10 giorni
  • Spostare NVMe Samsung 990 PRO 1TB dal G5 al G8
  • Setup hardware key 2FA su account Cloudflare ✓ TOTP attivo, #010 RESOLVED. Sub-action raccomandate (hw key fisica, email separata, CT monitoring, token least-priv) restano a discrezione
  • Ordinare 2× HA Voice Preview Edition Nabu Casa (lead time 2-4 settimane)
  • Documentare Plan B Cloudflare in §13 (chiude RA-001)
  • Letter to family + chiavi master in safe fisico (mitiga RA-002 Bus factor)

01 - Visione e Obiettivi

Cosa è st4ck

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.

Obiettivi strategici

Cosa NON e' st4ck

Utenti target

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).

02 - Architettura ad Alto Livello

Topologia 2-siti

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.

Diagramma ASCII completo · clicca per nascondere su mobile
[ INTERNET ] | +--------+--------+ | CLOUDFLARE | | DNS / WAF / TUNNEL +-+------+------+-+ | | ingress | | fallback (failover) v v +------------------------- SITO A : CASA ------------------------+ | | | cloudflared (tunnel principale, gia' attivo) | | | | | v | | +-----------+ +-----------------+ | | | CADDY |<---->| AdGuard Home | | | | (proxy) | | (DNS locale) | | | +-----+-----+ +-----------------+ | | | | | +----------------+--------------------+ | | v v v | | AUTHENTIK CH4T PHOTOS / DRIVE / KB | | (IdP OIDC) (Synapse) VAULT / ARCHIVE | | | | | | | +-------+-------+----------+------------+ | | | | | | v v | | [ NVMe G8 PRIMARY ] [ DS720+ #1 - SHR-1 4TB SSD ] | | | | [ DS918+ ] <--------- NFS film, sola lettura | | | | [ DS720+ #2 ] -- repo Restic backup locale (HDD recuperati) | | | | [ UDM Pro ] <---- Site Magic VPN -----+ | +------------------------------------------|---------------------+ | | WireGuard mesh | ~100-300 Mbit v +------------------------ SITO B : GENITORI -----------+ | | | [ UCG-Ultra ] | | | | | v | | [ G8 REPLICA ] [ DS720+ #2 (mirror) ] | | compute paused Snapshot Replication target | | btrfs receive da DS720+ #1 | | ogni 15 minuti ogni 15 minuti | | | | In failover: G8 replica monta DS720+ #2 NFS, | | container partono, CF tunnel si attiva qui. | +------------------------------------------------------+ | | (ridondanza ulteriore) v [ BACKBLAZE B2 ] cifrato Restic cold catastrofic backup 1.5 TB tier-1 only

Edge satelliti (modulo j4rv1s)

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).

Diagramma ASCII completo · clicca per nascondere su mobile
+-- EDGE casa: 2 satelliti WiFi UniFi -------------------------+ | | | STUDIO CUCINA | | [ HA Voice PE #1 ] [ HA Voice PE #2 ] | | ESP32-S3 ESP32-S3 | | microWakeWord "jarvis" microWakeWord "jarvis" | | speaker built-in speaker built-in | | hard mute switch hard mute switch | | | | | | +--------------+-------------------+ | | | | +-------------------------|------------------------------------+ | Wyoming protocol (TCP/JSON) v +-- BRAIN (G8 dentro st4ck) -----------------------------------+ | | | Home Assistant (h0me) <-- Wyoming hub | | +--> wyoming-faster-whisper (STT large-v3 IT) | | +--> wyoming-piper (TTS riccardo IT) | | +--> wyoming-openwakeword (fallback wake) | | +--> j4rv1s-api (conversation agent) | | | | | +--> j4rv1s-llm (Llama 3.1 8B locale) | | +--> j4rv1s-qdrant (vector DB) | | +--> j4rv1s-worker (skill executor + cron) | | +--> Mistral Small / Claude Haiku (cloud, L3+) | +--------------------------------------------------------------+

Identity flow (Authentik OIDC hub)

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.

Diagramma identity flow · clicca per nascondere
UTENTE famiglia | | 1. Browser/app -> redirect a 1d.d0mus.com v +--------------------------------+ | AUTHENTIK (1d.d0mus.com) | | - User database | | - 2FA TOTP (+ passkey futuro)| | - OIDC issuer | | - Session 8h sliding | +-------+------------------------+ | | 2. Token JWT firmato issued | +-------v---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | | | | | v v v v v v v v v v v v v [ ch4t ] [ w3b ] [ dr1v3 ] [ ph0t0 ] [ kb ] [ 4rch1v3 ] [ v4ult ] Synapse Element Seafile Immich Paperless Mailpiler Vaultwarden | v v v v | [ h0me ] [ br41n ] [ j4rv1s ] [ st4ck ] [ audit ] [ backlog ]<-----+ HomeAsst Blinko j4rv1s CF Pages CF Pages CF Pages + CF Acc + CF Acc + CF Acc (NB: pubbliche static, identity via CF Access invece che OIDC diretto Authentik) 3. Servizio valida JWT (issuer, signature, expiry, audience) e crea sessione interna applicativa. Eccezioni: - st4ck.d0mus.com / audit.html / backlog.html: dietro CF Access (Zero Trust gate al bordo CF), NON parlano OIDC con Authentik direttamente. Pattern parallelo, scelta architetturale v1.8+ - b4ckup.d0mus.com (Kopia): NO OIDC, account locali Kopia per persona. Decisione: KopiaUI parla diretto API binaria, non HTTP

Principi architetturali

03 - Hardware e Ruoli

Inventario operativo

DispositivoRuoloSitoStato
HP EliteDesk 800 G8Compute primario - tutto lo stack DockerCasaProduction
HP EliteDesk 800 G8 (#2, da reperire)Compute replica passivoGenitoriDa acquisire
Synology DS720+ #1Hot storage tier-1 (foto/docs/KB) via NFSCasaProduction
Synology DS720+ #2Mirror Snapshot Replication di DS720+ #1GenitoriProduction fase 3
Synology DS918+Cold storage film, NFS read-onlyCasaProduction (riuso esistente)
UDM Pro / equivalente UniFiGateway di rete + Site MagicCasaEsistente
UCG-Ultra (~160 EUR)Gateway di rete + Site MagicGenitoriDa acquistare
UPS (esistente, autonomia 35 min)Continuita' alimentazioneEntrambiEsistente
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 hardwareCasa - studioDa 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 cotturaCasa - cucinaDa acquistare (j4rv1s F0)

Hardware da dismettere

DispositivoDestinoRecupero 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.

Profilo elettrico aggregato

DispositivoIdlePeakSito
HP EliteDesk 800 G8 (primary)~14 W~50 WCasa
DS720+ #1 (2 SSD)~10 W~18 WCasa
DS720+ #2~12 W~22 WGenitori
DS918+~14 W~25 WCasa
UDM Pro~16 W~30 WCasa
UCG-Ultra~7 W~12 WGenitori
HP EliteDesk 800 G8 (replica)~12 W~50 WGenitori
TOTALE casa~54 W~123 W-
TOTALE genitori~31 W~84 W-

04 - Storage e Dischi

HP EliteDesk 800 G8 - layout dischi

PosizioneDiscoFilesystemUso
M.2 slot Gen4Samsung 990 PRO 1 TB (dal G5)btrfsOS + Docker + DB latency-critical (/srv/data)
M.2 slot Gen3 (combo)Kioxia XG6 512 GB (esistente)btrfsState container "tranquilli" (/srv/data2)
USB-C 3.2 Gen2 esternoSamsung 870 EVO 500 GB in enclosure (ex PoC DS718+)ext4Repository 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.

Allocazione su Samsung 990 PRO 1 TB (primary btrfs)

/                   ~  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

Allocazione su Kioxia XG6 512 GB (secondary btrfs)

/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

Allocazione su Samsung 870 EVO 500 GB (USB-C esterno, ext4)

/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

DS720+ #1 - hot storage casa

Layout fisico

PosizioneDiscoLayoutCapacita' usable
Bay 1+22x Samsung 870 EVO 4 TBSHR-1 mirror4 TB redundant
NVMe slot M.2(non utilizzati)n/an/a (storage gia' SSD)

Esposizione e cartelle

Esposto via NFS al G8 primary, percorso interno LAN, banda 1 Gbit. Cartelle:

DS720+ #2 - mirror genitori e backup locale casa

Layout fisico

PosizioneDiscoLayoutCapacita' usable
Bay 1+22x HDD recuperati da DS718+ dismessiSHR-1 mirror4-8 TB redundant (in base a HDD recuperati: 2x 4TB → 4 TB; 2x 8TB → 8 TB)
NVMe slot M.2(non utilizzati)n/an/a

Ruoli sovrapposti

DS918+ - cold storage film

Layout e ruolo

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.

05 - Stack Software

Sistema operativo G8

OSUbuntu Server 24.04 LTS (snap rimosso al post-install)
KernelHWE per supporto 11th gen Intel
Filesystembtrfs su NVMe primary e secondary, ext4 su SATA backup
ContainerDocker + docker compose v2 plugin
Initsystemd con unit dedicata per docker compose stack

Identita' unificata

ServizioRuoloNote
Authentik (server + worker + Postgres + Redis)IdP OIDC unico per tutte le app2FA TOTP/WebAuthn obbligatorio. Bootstrap email aldo.brunello@protonmail.com

Applicazioni

Hostname pubblicoComponenteFunzione
st4ck.d0mus.comLanding page st4ck + dossier HTMLPagina 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.comSynapse (Matrix)Chat E2EE, server chiuso, no federation
1d.d0mus.comAuthentikLogin OIDC + 2FA
w3b.d0mus.comElement Web (CF Pages)Client browser Matrix
dr1v3.d0mus.comSeafile + OnlyOfficeDocumenti + editing collaborativo
ph0t0.d0mus.comImmichFoto + ML faces, app mobile native
kb.d0mus.comPaperless-ngxKnowledge base PDF, OCR + ricerca full-text
4rch1v3.d0mus.comMailpilerArchivio email IMAP, ricerca, no SMTP outbound
v4ult.d0mus.comVaultwardenPassword manager (alternativa Bitwarden)
h0me.d0mus.comHome AssistantDomotica famiglia, automazioni, app companion mobile. Migrato da installazione esistente (HA Container Docker su altro host) tramite copia del volume config/
br41n.d0mus.comBlinkoNote-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.comj4rv1s API + dashboardAssistente 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 interni (LAN / VPN-only)

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 internoComponenteFunzione
b4ckup.d0mus.comKopia ServerBackup 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

Infrastruttura di supporto

ComponenteFunzione
CaddyReverse proxy interno HTTP, gestione certificati LE via DNS-01 Cloudflare
cloudflaredTunnel esistente, public hostname multipli
AdGuard HomeDNS locale split-horizon + ad-blocking di rete
Watchtower / DiunNotifica update immagini Docker (non auto-apply per servizi stateful)
ResticBackup cifrato, deduplicato, multi-target (locale, NAS, B2)
btrbkSnapshot btrfs + send/receive verso replica G8
Uptime KumaMonitoring esterno (su replica G8 a casa genitori)

Modulo j4rv1s

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).

ContainerImageRuoloEsposizione
j4rv1s-llmghcr.io/ggerganov/llama.cpp:serverLlama 3.1 8B Q4_K_M, OpenAI-compat endpoint, ~5-8 t/s su i7-11700 CPUinternal apps-net
j4rv1s-qdrantqdrant/qdrantVector DB per memoria episodica + semantica (RAG su Blinko/Paperless), storage su SSD per latenzainternal apps-net
j4rv1s-workerCustom Python + APSchedulerSkill executor, cron, event watchers, RAG indexer nightly, retention purger (10gg conversation, 30gg audit)internal apps-net
wyoming-faster-whisperrhasspy/wyoming-whisperSTT large-v3 italiano via Wyoming protocol, beam-size 5, VAD-gated, latency target 1000-1500msinternal apps-net
wyoming-piperrhasspy/wyoming-piperTTS voce it_IT-riccardo-x_low, streaming, first-byte ~300msinternal apps-net
wyoming-openwakewordrhasspy/wyoming-openwakewordFallback wake word server-side, attivato solo se microWakeWord on-device satellite degradainternal 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.

Skill plugin (priorita' di sviluppo)

18 skill modulari, naming inglese, trigger vocali italiani (mappa in j4rv1s/skills/intents_it.yaml). Hot-reload in dev, versionate in git.

CategoriaSkillNote
Smart homehome_state, home_control, musicStato HA read-only, scene/automation con whitelist, Spotify/Sonos via HA media_player
Productivitycalendar, mail_triage, focus_mode, reminders, timer, shopping_list, announceGoogle Calendar OAuth, Mailpiler API, Pomodoro+Hue+Slack DND, timer multi-stanza, lista spesa su HA todo, broadcast multi-satellite
Knowledge & datanotes, documents, credentials, photos, search, weatherRAG Blinko/Paperless via Qdrant, Bitwarden CLI read-only, embedding CLIP Immich riusato, SearXNG, Open-Meteo
Dev/utilitycode_runner, visionSandbox subprocess + timeout/ulimit; Frigate/HA camera + Claude vision o LLaVa locale (no Continuity Camera)

Successor candidates per servizio (mitiga RA-007 e WI-7)

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 attualeSuccessor candidate primarySuccessor candidate secondaryEffort 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 index1-2 settimane (re-import IMAP storico)
VaultwardenBitwarden ufficiale self-host (PHP/.NET, da preferire se serve enterprise feature)KeePassXC + sync via Seafile2-3 giorni (export Vaultwarden vault → Bitwarden import)
Home Assistant ContainerHAOS 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 + Vorta3-5 giorni (re-seed iniziale completo)
cloudflared (tunnel)WireGuard + VPS reverse proxy (vedi Plan B CF)Tailscale Funnel1 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".

06 - Hostname e DNS Strategy

Hostname pubblici (gestiti da Cloudflare)

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.

DNS interno - split-horizon

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)

Certificati TLS

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.

Comportamento in caso di internet down

ScenarioLAN access funziona?
Internet ISP down a casaSI - DNS locale + Caddy + container tutti su G8
Cloudflare degradedSI da LAN, accesso esterno offline finche' CF si ristabilisce
UDM down a casaNO - serve gateway up per DHCP/DNS
G8 primary downNO finche' non si fa failover a sito B

07 - Network e Site-to-Site VPN

Topologia di rete

SitoSubnet LANGatewayBanda fibra
Casa192.168.1.0/24UDM Pro1 Gbit simmetrica
Genitori192.168.2.0/24UCG-Ultra800 Mbit simmetrica reali (UDR)

UniFi Site Magic

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.

Traffico atteso fra siti

TipoVolume tipicoFrequenza
btrfs send/receive (G8 -> G8)10-100 MB / cicloOgni 15 min
Snapshot Replication (DS720+ -> DS720+)50-500 MB / cicloOgni 15 min
Seeding iniziale (DB+state)~50-100 GBUna tantum
Seeding iniziale (foto+docs+KB)~1.1 TBUna tantum, ~3-4 ore
Probe Uptime Kuma< 1 MB/giornoOgni 60 s

Apertura porte

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).

08 - Replica e Backup

Strategia 3-2-1 estesa

Tre copie indipendenti, due tecnologie diverse, una off-site (qui sono due off-site).

LayerTecnologiaDoveFrequenzaRPO
1 - Snapshot locale orarioRestic su USB-C esternoG8 (870 EVO 500 GB enclosure)1 h1 h
2 - Backup locale giornalieroRestic su NASDS720+ #2 cartella backup24 h24 h
3 - Replica live G8btrfs send/receiveG8 replica genitori15 min15 min
4 - Replica live NASSynology Snapshot ReplicationDS720+ #2 in genitori15 min15 min
5 - Backup catastroficoRestic su Backblaze B2Cloud cifrato lato client24 h24 h
Workflow 5-layer · clicca per nascondere
SOURCE: /srv/data G8 primary casa (NVMe Samsung 990 PRO btrfs) | | Layer 1 (1h, locale, snapshot CoW immutable) v [ btrfs snapshots /srv/.snapshots/ ] | | Layer 2 (24h, locale, copia sull'870 EVO USB-C esterno) v [ Restic locale /srv/restic-local ] | | Layer 3 (15min, off-host, btrbk send/receive cifrato) v [ G8 replica /srv/data (genitori, btrfs receive r/o) ] | | Layer 4 (15min, NAS-to-NAS via Site Magic VPN) | (parallel: DS720+ #1 -> DS720+ #2 Snapshot Replication) v [ DS720+ #2 mirror genitori ] | | Layer 5 (24h, cloud catastrofico cifrato lato client) v [ Backblaze B2 EU region (1.5 TB tier-1 only) ] NOTE ==== - Layer 3 e 4 girano in PARALLELO (G8->G8 + NAS->NAS), non sequenziale. Site Magic VPN trasporta entrambi. - Layer 5 NON include /srv/data2 ne' /film (rebuildable o riacquisibili). Solo tier-1 (foto, drive, KB, vault, mail). - Crypto-locker resilience: Restic snapshot e B2 sono read-only dal source dopo commit (immutable repo policy). - 3-2-1 esteso a 5-3-2: 5 copie totali, 3 tecnologie distinte (btrfs, Restic, Synology DSM), 2 off-site (genitori + B2).

Replica live G8 -> G8

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)

Replica live DS720+ -> DS720+

Synology Snapshot Replication, configurata via DSM:

Backup B2 cloud

VoceValore
ToolRestic
EndpointBackblaze B2 (eu-central-1)
CifraturaAES-256 client-side, chiave fuori dal NAS
Volumi inclusi/srv/data, contenuto NFS DS720+ #1
Volume esclusoFilm (ricostruibili), cache, indici
Volume stimato~1.1 TB iniziale, dedup -> ~1.5-2 TB con 6 mesi history
Costo stimato~10-12 USD/mese
Retention14 giorni daily, 12 settimane weekly, 12 mesi monthly

Backup endpoint famiglia

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.

VoceValore
ToolKopia (server + client GUI nativa multi-OS)
Endpointb4ckup.d0mus.com (container kopia/kopia in modalita' server) - LAN/VPN-only, no cloudflared
RepositoryVolume su NFS DS720+ #1, sottocartella dedicata /backups/clients
CifraturaAES-256 / ChaCha20 client-side, password per utente, server cieco sui contenuti
DedupBlock-level globale tra tutti gli endpoint, compressione zstd
AuthAccount 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
SchedulePolicy per directory configurate da KopiaUI: snapshot ogni 1-4 h secondo importanza
Retention14 daily, 8 weekly, 12 monthly, 3 annual (per cartella)
RestoreKopiaUI 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:

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.

Data retention policy per servizio

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.

ServizioDati attiviBackupLog applicativi
Synapse (chat)Forever (cronologia famiglia)14d/8w/12m/3y (Kopia + B2)30 giorni rolling (no PII oltre)
Element WebStateless (CF Pages)N/AN/A
AuthentikForever (utenti + gruppi)14d/8w/12m/3y180 giorni eventi auth (failed login, MFA, impersonation)
VaultwardenForever (vault famiglia)14d/8w/12m/3y + export annuale offline su YubiKey90 giorni
Immich (foto)Forever salvo richiesta esplicita di un familiare14d/8w/12m/3y. Cap a 5 TB → review famiglia per cleanup foto >10 anni30 giorni
Seafile (drive)Forever per file attivi, 90 giorni cestino utente, 30 giorni Trash admin14d/8w/12m/3y30 giorni
Paperless-ngx (KB PDF)Forever (knowledge accumulato)14d/8w/12m/3y30 giorni
Mailpiler (archivio mail)Forever per default. Override se familiare richiede cancellazione propria mailbox storica14d/8w/12m/3y30 giorni
Home AssistantRecorder DB: 30 giorni history, long-term statistics 5 anni14d/8w/12m/3y14 giorni
Blinko (note)Forever per note utente, soft-delete 60 giorni cestino14d/8w/12m/3y30 giorni
Kopia (endpoint backup)14d/8w/12m/3y per cartella (gia' definito sopra)Ereditato da DS720+ #1 → #2 + B230 giorni server log
Caddy (reverse proxy)N/A (stateless)N/A30 giorni access log; alert immediato su 401/403 burst
cloudflaredN/AN/A30 giorni connection log
AdGuard Home30 giorni query log (privacy DNS)N/A (rebuildable)Coincide con query log
Loki / Promtail (futuro)N/AN/A180 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 remotiCoincide con dati attivi 10gg
j4rv1s - audit skill30 giorni log invocazioni skill (input filtrato, skill eseguita, esito) - separato dai transcript per audit di sicurezzaPattern Restic/Kopia esistenti30 giorni
j4rv1s - episodic + semantic memoryIndefinito (e' il "cervello", non il "diario") - SQLite via Litestream + Qdrant collection14d/8w/12m/3y30 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.

09 - Modello di Sicurezza

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.

LayerMitigazioni primaryVedi anche §
L1 — NetworkZero 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 — ApplicazioneMatrix E2EE default · Cross-signing device verification · Recovery Key offline obbligatoria · federation OFF (server chiuso) · password login Synapse OFF, solo OIDC§05 stack software
L4 — StorageLUKS 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 — OperativoSSH 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.

10 - RTO / RPO Matrix

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.

Scenari frequenti (drill semestrale)

File cancellato per errore
< 1 min
RPO 1h · RTO <1min · Restic restore puntuale
File perso su endpoint famiglia
< 5 min
RPO 1-4h · RTO <5min · KopiaUI browse temporale
Internet ISP casa down
0
RPO 0 · RTO 0 · split-horizon DNS funziona

Scenari hardware (mitigati da replica)

Disco NVMe primary morto
1-2 h
RPO 1h · sostituzione + restore Restic locale
G8 primary morto interamente
15-30 min
RPO 15min · Promote G8 replica + DNS switch CF
DS720+ #1 morto (foto/docs/KB)
30-60 min
RPO 15min · Promote DS720+ #2 + remount NFS
UDM Pro casa down
1-4 h
RPO 0 · hardware swap + config restore

Scenari critici (BCP totale)

Casa offline blackout esteso
30 min
RPO 15min · Failover totale a sito genitori
Crypto-locker / errore massivo
1-4 h
RPO 1-24h · Restic restore snapshot precedenti
Furto / incendio casa
30 min
RPO 15min · Sito B copre tutto, tier-1 intatto
Catastrofe entrambi i siti
4-12 h
RPO 24h · Restic restore da Backblaze B2 EU

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.

11 - Phasing del Rollout

Fase 0 - Preparazione (settimana 1)

#StepDettaglio
0.1Workspace setupReperire monitor + tastiera + mouse + USB stick per setup G8
0.2Trasloca NVMe primarySpostare NVMe Samsung 990 PRO 1TB dal G5 al G8 (slot M.2 Gen4)
0.3Libera slot Gen3Rimuovere Samsung 256 GB M.2 SATA dal G8 (cede slot Gen3 al Kioxia)
0.4Backup locale enclosureAcquistare enclosure USB-C 3.2 Gen2 (~25 EUR) + inserire Samsung 870 EVO 500 GB
0.5Vendi G5~250 EUR recuperati post-cannibalizzazione
0.6Setup BIOS G8Verificare: secure boot off, AHCI on, virtualization on
0.7j4rv1s F0a scaffoldFile-only, eseguibile in parallelo. Scaffold monorepo Python in /Users/user1/st4ck/j4rv1s/ (src layout, uv build system, pyproject.toml, FastAPI app stub, skill interface base). Aggiungere blocchi commentati dei 7 container j4rv1s-* + wyoming-* a docker-compose.yml. Aggiungere blocco j4rv1s.d0mus.com a caddy/Caddyfile con forward-auth Authentik. Pre-condizione bloccante per j4rv1s F1: hardware satelliti (step 0.8)
0.8j4rv1s edge orderOrdinare 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

Fase 1 - Core stack (mesi 1-2)

#StepDettaglio
1.0CF account hardeningISSUE-010 RESOLVED2FA 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.1Install 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.2Hardening basesshd (key-only, no password), ufw default-deny, fail2ban (sshd + recidive), unattended-upgrades per pacchetti security
1.3Install DockerDocker Engine + compose plugin v2
1.4chattr +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.5Deploy core IdP+ingressStack con AdGuard Home + Caddy + Authentik (server + worker + Postgres + Redis)
1.6Cert TLS DNS-01Configurare API token CF (gia' creato in 1.0 con scope minimo) per DNS-01 challenge. Ottenere primi certificati Let's Encrypt
1.7DNS LANConfigurare router LAN per usare AdGuard Home come DNS primary
1.8Deploy m41n forward-auth CaddySostituito 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.9Deploy ch4tSynapse (Matrix) + Element Web su CF Pages, federation OFF
1.10Deploy VaultwardenContainer vaultwarden/server, OIDC via Authentik
1.11Onboarding 2 utentiTe + moglie su Authentik con TOTP obbligatorio
1.12Test device targetmobile (Element X, Bitwarden mobile), web, macOS WebDAV
1.13Setup Restic + B2Restic locale (NVMe → 870 EVO USB-C) + Backblaze B2 cloud (regione EU)
1.14Authentik 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.15j4rv1s F0b deploy voice infraSblocca 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.

Fase 2 - Espansione apps (mesi 3-4)

#StepDettaglio
2.1DS720+ #1 NFS-onlyRiconfigurare come storage puro (disabilitare app Synology Photos/Drive/Chat). Migrare 2× Samsung 870 EVO 4TB → SHR-1. Esporre cartelle NFS al G8
2.2Deploy ImmichContainer immich-server + immich-machine-learning. Postgres dedicato + Redis (riuso). Volume foto/video su NFS DS720+ #1
2.3Deploy Seafile + OnlyOfficeDrive documenti + editing collaborativo. Volume librerie su NFS
2.4Deploy Paperless-ngxKnowledge base PDF, OCR + ricerca full-text
2.5Deploy 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.6Migrazione foto Synology→ImmichBulk import + verifica EXIF + ML faces re-trigger
2.7Migrazione documenti Synology→SeafileExport osheet/odoc → xlsx/docx
2.8Onboarding 2 figliAccount Authentik con TOTP. Onboarding device + parental policy
2.9Pull email storicheDa Outlook IMAP → Mailpiler
2.10Migrazione Home AssistantStop 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.11Deploy Kopia Serverb4ckup.d0mus.com LAN/VPN-only (no cloudflared). Repo su NFS DS720+ #1, sottocartella /backups/clients
2.12Onboarding KopiaUIMac famiglia + Windows + Zorin Linux. Policy per cartelle critiche per persona
2.13Deploy Blinkobr41n.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.14Off-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.15j4rv1s F1 Voice loopRicezione 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.16j4rv1s F2 Brain + skill loaderBuild 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.17Test 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.18Dismissione DS718+ legacyRecupera 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.

Fase 3 - Disaster recovery off-site (mesi 5-6)

#StepDettaglio
3.1Acquisto G8 #2HP 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.2Acquisto UCG-UltraUniFi gateway genitori ~160 EUR
3.3Setup G8 replicaOS clonato dal primary (configurazione identica). LUKS+btrfs già setup come da step 1.1
3.4Trasporto installazione genitoriG8 #2 + DS720+ #2 + UCG-Ultra + UPS piccolo (~120 EUR). Setup fisico a casa genitori (spazio + rete + alimentazione)
3.5Site Magic VPNConfigurare tra UDM Pro casa e UCG-Ultra genitori. Test traffico inter-sito ~100-300 Mbit
3.6Seeding inizialebtrfs send full di /srv/data + Snapshot Replication Synology seed iniziale (può richiedere ore-giorni in base al volume)
3.7Replica continuaConfigurare cron btrbk + schedule Snapshot Replication ogni 15 min
3.8cloudflared 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.9Migrare Uptime KumaSul G8 replica per monitoring meta-cross (probe verso il sito attivo da fuori)
3.10Drill DR #1Documentare e testare procedura di failover end-to-end. Recovery from primary down → tutto su replica entro RTO 30 min. Documentare imprevisti per iterare
3.11Dismettere DS718+ #2Recupero HDD se non già usati in step 2.18

Output Fase 3 Ridondanza geografica live. RPO 15 min. RTO 30 min. Drill DR esercitato.

Fase 4 - Maturazione (mesi 7-12)

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.

#StepDettaglio
4.1DR drill semestraleFailover esercitato 2×/anno minimum, documentato. Cap soft 30 min RTO da rispettare
4.2Onboarding utenti aggiuntiviParenti/amici fidati (max 4 ulteriori per restare sotto cap "≤15 servizi → 4-6 utenti effettivi")
4.3Audit sicurezza completoLynis + ClamAV scan + Authentik audit log review + risposta a RA-001..008 dello syst3m. Re-run audit cyb3r + c0mpl14nc3 annuale
4.4Valutazione LUKS NASEstendere LUKS at-rest oltre G8 → DS720+ #1/#2 dischi (DSM 7.x supporta encrypted shared folder; perf hit ~5-10%)
4.5j4rv1s F3 Memory + personaSQLite + 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.6j4rv1s 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 layerOpzionale. Event watchers, trigger temporali, regole "quando X allora Y" ("alle 8 dimmi meteo + agenda", "se piove ricorda ombrello")
4.8 *j4rv1s F6 Vision + mobileOpzionale. 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 + satellitiOpzionale. Web dashboard con metriche, voice tuning, persona refinement. Valutare 3°/4° satellite (salotto + camera) — D1 j4rv1s differita
4.10Re-run audit syst3mAnnuale (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.

12 - Costi (Capex + Opex)

Capex (una tantum)

VoceCostoFase
Hardware G8 primario (gia' posseduto)0 EUR0
NVMe Samsung 990 PRO 1TB (riuso da G5)0 EUR0
NVMe Kioxia XG6 512GB (gia' nel G8)0 EUR0
SATA Samsung 870 EVO 500GB (gia' posseduto)0 EUR0
Samsung 870 EVO 4TB x2 (gia' posseduti)0 EUR2
DS720+ #1 (gia' posseduto)0 EUR2
DS720+ #2 (gia' posseduto)0 EUR3
DS918+ (riuso)0 EUR2
HP EliteDesk 800 G8 #2 (usato)~400-500 EUR3
UCG-Ultra (UniFi gateway genitori)~160 EUR3
UPS piccolo casa genitori (1 KVA)~120 EUR3
Cavetteria + switch piccolo genitori~80 EUR3
Enclosure USB-C 3.2 Gen2 per 870 EVO (backup locale)~25 EUR1
TOTALE CAPEX~785-885 EUR-

Recupero da dismissioni (parziale offset)

VoceRecupero 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.

Opex (mensile)

VoceCosto 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 / Pages0 EUR (free tier)
Cloudflare Realtime TURN (audio chat)0 EUR (free tier)
Dominio d0mus.com (gia' posseduto)~1 EUR (annuo / 12)
UniFi Site Magic0 EUR (incluso UniFi)
TOTALE OPEX~26-33 EUR/mese

Equivalente annuo: ~310-400 EUR/anno.

13 - Operations e Manutenzione

Calendario tipico

FrequenzaTask
SettimanaleVerifica salute container (docker compose ps), check spazio disco, scan log Authentik per anomalie
SettimanaleVerifica esito backup B2 (ultima snapshot < 26 h)
MensileUpdate OS Ubuntu + reboot pianificato (drift di 1-2 settimane tra primary e replica)
MensileUpdate immagini Docker (con snapshot btrfs preventivo, rollback se rotto)
TrimestraleTest restore Restic da B2 (pull random subset, verifica integrita')
TrimestraleAudit utenti Authentik: disabilita account non usati, revisione 2FA enrollati
SemestraleDR drill: failover completo a sito B, test 24 h, switch back
AnnualeRinnovo credenziali Cloudflare TURN (TTL 1 anno)
AnnualeAudit sicurezza: Lynis, ClamAV, review CVE Synapse/Authentik/altre app
AnnualeAggiornamento documentazione (questo documento) con cambiamenti reali

Notifiche e alerting

Documentazione runbook

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).

Plan B Cloudflare — exit strategy (mitigazione RA-001)

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 CFPlan BEffort migrazionePre-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 fileBackup 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 decommissionVPS 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 public1 ora: decommentare blocco Caddyfile + bind-mount Docker già prontiAuthentik 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) Authelia2-4 ore: creare Application Authentik per ciascun servizio CF Access-protected, route Caddy con forward_authAuthentik live (Fase 1+)
Cloudflare WAF(a) Caddy + CrowdSec (community-driven crowdsourced threat intel, EU) · (b) Caddy + ModSecurity · (c) fail2ban + ipset + nginx1 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.

Bus factor mitigation — letter to family + DR runbook (RA-002)

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.

LayerCosaDoveAggiornamento
L1 — Letter to familyDocumento 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 techBusta 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-stepProcedura "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-techPDF 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 onboardedUna 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 annualeAnnuale 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).

Awareness training famiglia (audit c0mpl14nc3 ISO A.6.3)

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.

ArgomentoCosa coprire (15-30 min ciascuno)Quando
Password manager + MFAWalk-through Vaultwarden (creazione vault, browser extension, mobile app), enrollment TOTP per ogni servizio, recovery key offline. Ognuno setup col proprio device sotto guidaOnboarding utente, post-Fase 1
Phishing recognitionEsempi 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 fallbackPost-Fase 1, quando passkey abilitato
Cosa fare se device perso/rubatoProcedura: chiamare Aldo, lui revoca sessioni Authentik, blocca SIM mobile, reset master password. Tempo target: < 1 oraOnboarding
Cosa NON fareMai inviare master password a chiunque (incluso Aldo). Mai disabilitare 2FA "per fare prima". Mai aprire link non richiesti. Mai installare app da store non ufficialiOnboarding + refresh annuale

Effort: ~2 ore prima sessione + ~30 min refresh annuale per persona. Status: TODO. Priorità: dopo onboarding 2 utenti iniziali Fase 1.

DPA archive — vendor compliance documentation

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.

VendorDocumentoPath nel repoFrequenza review
CloudflareCloudflare DPA (incluso CCPA/GDPR addendum) + AUPdocs/dpa/cloudflare-dpa-v$(YYYY).pdfAnnuale o quando CF aggiorna
Backblaze (B2)Backblaze DPA + EU Data Processing Addendum (per regione EU del bucket)docs/dpa/backblaze-dpa-v$(YYYY).pdfAnnuale
Mistral (Le Plateforme)Terms of Service + DPA (Mistral è francese, EU-native, GDPR diretto)docs/dpa/mistral-tos-v$(YYYY).pdfAnnuale
Anthropic (Claude API)Anthropic Commercial Terms + Acceptable Use Policydocs/dpa/anthropic-terms-v$(YYYY).pdfAnnuale
Nabu Casa (HA Voice PE hardware)HA Voice PE manuale firmware + Nabu Casa privacy policy se userai HA Clouddocs/dpa/nabucasa-firmware.pdfQuando esce firmware update significativo

Effort: ~30 min download + commit iniziale, ~30 min/anno review. Status: TODO. Cartella: docs/dpa/ da creare al primo commit.

14 - Decisioni e Rationale

ADR-light registry: ogni decisione architetturale ha ID stabile (D-NNN), data, status (ACTIVE / SUPERSEDED / DEFERRED), alternativa scartata, motivo. Raggruppate per area tematica.

Identita' & Auth

IDDataStatusDecisioneAlternativeMotivo
D-0012026-05-03ACTIVEAuthentik come IdP unicoKeycloak / AutheliaUI moderna, stack Go/Python piu' leggero, OIDC stato dell'arte, supporto Site Magic-friendly
D-0022026-05-03ACTIVEVaultwarden vs Bitwarden self-host ufficialeBitwarden ufficiale (PHP/.NET pesante)Stesso protocollo, 1/10 della RAM, single binary Rust, 100% compatibile client

Application stack

IDDataStatusDecisioneAlternativeMotivo
D-0102026-05-03ACTIVESynapse / Matrix per chatRocket.Chat / Mattermost / Nextcloud Talk / HuLaE2EE robusto, app mobile mature (Element X), federation disattivabile, lock-in zero
D-0112026-05-03ACTIVEImmich per fotoNextcloud Photos / PhotoPrismPerformance superiore con librerie grandi, ML faces locale eccellente, mobile native top
D-0122026-05-03ACTIVESeafile per documentiNextcloud / OpenCloud / PydioSync velocita' top di categoria, mobile polished, OIDC OK, community grande, basso risk pivot
D-0132026-05-03ACTIVEPaperless-ngx per knowledge PDFDocSpell / Mayan EDMSMaturita' superiore, OCR integrato, OIDC supportato, footprint contenuto
D-0142026-05-03ACTIVEMailpiler per archivio mailStalwart / DocSpell / Dovecot DIYSpecializzato per archivio (no SMTP), full-text search nativo, doc abbondante
D-0152026-05-06ACTIVEHome Assistant in Docker (Container) sul G8HAOS in VM KVM / Supervised / mantenere host attualeCoerente 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-0162026-05-06ACTIVEBlinko per note-taking AI / second-brainMemos / Trilium Next / Joplin Server / Logseq syncRAG 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-0172026-05-08ACTIVEModulo 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

Storage & Backup

IDDataStatusDecisioneAlternativeMotivo
D-0202026-05-03ACTIVECompute = NUC/G8, Storage = NASTutto-in-uno NAS Synology / TrueNASVendor independence vera, replaceability separata, stack Linux puro
D-0212026-05-03ACTIVEbtrfs sui NVMe del G8ext4 / ZFSSnapshot e send/receive nativi, in-tree (niente DKMS), ottima per replica futura
D-0222026-05-03ACTIVE2x SSD 4TB in DS720+ SHR-1HDD spinning + cache NVMeLatenza migliore per Immich/Seafile, redundancy mirror nativa
D-0232026-05-03ACTIVESynology Snapshot ReplicationSynology HA / DRBD / DIY rsyncSHA non funziona su WAN, Snap Repl funziona perfetta su Site Magic
D-0242026-05-03ACTIVEbtrbk per replica G8 -> G8syncoid (ZFS) / DIY scriptsbtrfs-native, retention policy buona, configurazione semplice
D-0252026-05-03ACTIVEBackblaze B2 backup off-siteStorj / S3 / IDrive E2 / NAS off-site dedicatoPrezzo ottimo per piccoli volumi, regione EU, integrazione Restic perfetta
D-0262026-05-06ACTIVEKopia per backup endpoint famigliaUrBackup / Duplicati / Restic CLI / BorgBackup+VortaGUI nativa Mac/Win/Linux, dedup globale block-level, E2EE client-side, repo-agnostic

Network & Hosting

IDDataStatusDecisioneAlternativeMotivo
D-0302026-05-03ACTIVECloudflare Tunnel + niente porte apertePort forwarding + Let's Encrypt HTTP-01Superficie d'attacco minima, niente CGNAT issue, WAF gratis al bordo. Lock-in tracciato in RA-001 con Plan B in §13
D-0312026-05-03ACTIVECloudflare Realtime TURNcoturn self-host + UDP espostoFree tier sufficiente, no UDP da aprire, audio quality ottima
D-0322026-05-03ACTIVESite Magic VPN UniFiWireGuard manuale / TailscaleGestione tramite UniFi console, gia' integrata, zero account terzi
D-0332026-05-03ACTIVE2 siti (casa + genitori)VPS Hostinger come secondarioFTTH simmetrica gratis, dati 100% on-prem, zero dipendenza commerciale
D-0342026-05-06SUPERSEDEDLanding m41n.d0mus.com: HTML statico via Caddy + Authentik forward-authIndex pubblico senza auth / Forward-auth Authentik su tutto / Dashboard container HomepageEra 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-0352026-05-08ACTIVELanding st4ck.d0mus.com su Cloudflare Pages + CF Access (supersedes D-034)Caddy interno + Authentik (D-034) / GitHub PagesSupersedes 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

Ops & Lifecycle

IDDataStatusDecisioneAlternativeMotivo
D-0402026-05-03ACTIVEUbuntu Server LTSDebian / Proxmox / TrueNAS ScaleDoc abbondantissima, supporto 5-10 anni, kernel recente per CPU 11th gen
D-0412026-05-08ACTIVEVincolo 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 vincoloVincolo 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.

15 - Open Questions e Next Steps

Stato avanzamento fasi

Snapshot al 2026-05-08. Aggiornato manualmente quando milestone completate. Per il backlog operativo dettagliato vedi backlog & next steps.

Fase 0 Preparazione [###################-] 95% in corso -- documentazione completa, hardware da spostare Fase 1 Core stack [#-------------------] 5% pronta -- runbook scritto, deploy non iniziato Fase 2 Espansione apps [--------------------] 0% pianificata Fase 3 DR off-site [--------------------] 0% pianificata Fase 4 Maturazione [--------------------] 0% pianificata Modulo j4rv1s ============ F0a Scaffold codice [--------------------] 0% pronto a partire (file-only, eseguibile NOW) F0b Deploy voice infra [--------------------] 0% bloccato da st4ck Fase 1 F1 Voice loop [--------------------] 0% bloccato da hardware HA Voice PE (lead time 2-4w) F2 Brain + skill [--------------------] 0% bloccato da F1 F3-F7 Memory/Skills/Vis [--------------------] 0% post decision-point Fase 4 Audit periodici (cumulativo 6 review fatte 2026-05-06..08) ========================================================== arch / perf [####################] 100% chiuso (refresh u1 2026-05-08) cyb3r / c0mpl14nc3 [####################] 100% chiuso syst3m [####################] 100% chiuso (RA-001..008 generati) Re-run cyb3r post-deploy [--------------------] 0% pianificato Fase 1 chiusura

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.

Open questions per fase

FaseDomandaStato
Fase 1Workspace fisico per setup G8 (monitor + tastiera + mouse)DA RISPONDERE
Fase 1UniFi gateway casa: modello esatto + versione firmware (compat Site Magic)DA RISPONDERE
Fase 1Timeline: avvio Fase 1 entro 2 settimane o più tardi?DA RISPONDERE
Fase 1Hardware key 2FA per CF account già acquistata? (YubiKey/Titan)DA RISPONDERE
Fase 2HA Voice PE ordinati? (lead time 2-4 settimane Nabu Casa)DA RISPONDERE
Fase 2Persona di fiducia onboardata per Bus factor mitigation?DA RISPONDERE
Fase 3Spazio fisico genitori: dove posizionare G8 + DS720+ + UCG + UPS?DA RISPONDERE
Fase 3HP EliteDesk 800 G8 #2 sul mercato usato (o classe equivalente: Lenovo M90q, Dell OptiPlex 7000)DA REPERIRE
Fase 3Runbook DR step-by-step scritto e testatoDA SCRIVERE

ISSUE tracker — audit interno

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.

IDStatoSevTitoloOwnerDeadline
ISSUE-001OPENP0Authentik SPoF + procedura break-glassAldoPre-Fase 1
ISSUE-002OPENP0Failover cloudflared esplicito + runbook DRAldoPre-Fase 3
ISSUE-003DEFERREDP1DB sprawl PG14 (Blinko) vs PG16 standardAldoFine Fase 2
ISSUE-004OPENP0chattr +C su volume Postgres pre-deployAldoFase 1 step 4
ISSUE-005OPENP0Indici Mailpiler obbligatori su NVMe localeAldoFase 2
ISSUE-006RESOLVEDP0Rigenerazione PDF dossier manuale → migrato a HTML print-on-demandAldo2026-05-08 ✓
ISSUE-007OPENP0LUKS at-rest encryption sui NVMe G8AldoFase 1 step 1
ISSUE-008RESOLVEDP0Data retention policy esplicita per servizioAldo2026-05-07 ✓ (v1.6) + estensione j4rv1s 2026-05-08
ISSUE-009OPENP0Procedura off-boarding utente (GDPR art. 17)AldoPre-Fase 2
ISSUE-010RESOLVEDP0Hardening account Cloudflare (2FA TOTP gia' attivo) — sub-action raccomandate ma non bloccanti: hardware key + email separata + CT monitoring + API token least-privAldo2026-05-08 ✓ (TOTP)
ISSUE-011TRACKINGP1Sequencing modulo j4rv1s vs fasi st4ckAldoImplicito nelle fasi

Riepilogo: 11 ISSUE totali · 8 OPEN (di cui 5 P0, 2 P0 differite a Fase 2/3, 1 tracking) · 3 RESOLVED (006 PDF→HTML, 008 retention policy, 010 CF 2FA TOTP gia' attivo) · 1 DEFERRED. Top 2 P0 cronologicamente vincolati: #007 LUKS (Fase 1 step 1), #004 chattr +C Postgres (Fase 1 step 4).

Dettaglio ISSUE (testo esteso)

Vedi action items dettagliati di ogni ISSUE nel testo originale qui sotto. Tabella sopra è il quick reference.

  1. ISSUE-001 - Authentik Single Point of Failure di accesso. Se Authentik down, tutti gli 11 servizi diventano inaccessibili (no login). Manca procedura di emergenza. Action: aggiungere a §13 una sotto-sezione "Authentik down - procedura break-glass" che definisca: (a) container con utente locale admin pre-configurato in vault offline (Vaultwarden export su carta o YubiKey), (b) bypass temporaneo OIDC per servizi che lo permettono (Synapse, Vaultwarden, Paperless), (c) RTO target per ripristino Authentik < 30 min con restore Postgres da snapshot btrfs. Owner: Aldo. Deadline: prima di Fase 1.
  2. ISSUE-002 - Failover cloudflared non documentato. §06 dichiara che gli hostname puntano "dinamicamente al tunnel attivo (sito A o B in caso di failover)" ma il meccanismo concreto non e' specificato. Action: esplicitare in §13 ops: (a) named tunnel cloudflared replicato sui due G8 con stesso UUID e credenziali, (b) priorita' di routing CF Tunnel via metric / weight, (c) detection del down (heartbeat?), (d) tempo medio di switchover. Aggiungere step in runbook DR di Fase 3. Owner: Aldo. Deadline: prima di Fase 3 (deploy del 2nd cloudflared).
  3. ISSUE-003 - DB sprawl Postgres 14 vs 16-alpine. Blinko vincolato a PG14 dall'upstream, resto dello stack su PG16. Doppia superficie CVE, doppia immagine da pull, drift baseline. Action: a fine Fase 2, testare Blinko su PG16 in staging (Prisma di solito tollera). Se OK, collassare a singolo Postgres 16. Se NO, valutare alternative (Memos / Trilium) con compatibilita' PG16 nativa. Owner: Aldo. Deadline: fine Fase 2.
  4. ISSUE-004 - 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.
  5. ISSUE-005 - Indici Mailpiler potenzialmente su NFS. Bind path indici (MariaDB + Sphinx/Manticore) deve forzatamente essere NVMe locale, non NFS DS720+ #1. Se finiscono su NFS, search query passa da sub-secondi a secondi. Action: in deploy Mailpiler (Fase 2), separare volume data/ (NFS, raw .eml) da volume indexes/ (NVMe /srv/data2). Documentare in runbook Fase 2. Owner: Aldo. Deadline: Fase 2.
  6. ISSUE-006 - Rigenerazione PDF dossier manuale. RISOLTA 2026-05-08: il PDF e' stato eliminato dal progetto. La documentazione e' ora HTML statico (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.
  7. ISSUE-007 - LUKS at-rest encryption (promosso da "decisioni differite" a P0 dopo audit cyb3r/c0mpl14nc3). NVMe del G8 oggi non cifrati a riposo: chiunque acceda fisicamente al disco (furto, manutenzione tecnica, smaltimento futuro) legge tutto in plaintext (vault, foto, mail, chat, secrets). Coperto sia da audit tecnico (cyb3r scenario S3) che da audit GDPR (art. 5(f) integrita' e riservatezza). Action: setup LUKS gia' in fase di install Ubuntu (step 1 di Fase 1, gia' aggiornato in §11). Passphrase salvata in 3 posti: YubiKey, safe fisico, Vaultwarden offline export. Trade-off: passphrase a ogni boot — accettato; se diventa fastidioso valutare TPM2-LUKS auto-unlock dopo Fase 1 stabile. Owner: Aldo. Deadline: Fase 1 step 1.
  8. ISSUE-008 - Data retention policy esplicita per servizio. Stack mantiene foto/mail/chat for-ever senza policy scritta: rischio storage runaway + posizione difficile davanti a richiesta di cancellazione di un familiare (GDPR art. 5(c) minimizzazione + art. 5(e) conservazione limitata). Action: tabella retention introdotta in §08 del dossier (3 colonne: dati attivi, backup, log applicativi, per ognuno degli 11 servizi). Storage growth check semestrale. Owner: Aldo. Deadline: CHIUSO con v1.6. Estensione 2026-05-08 (v1.7): aggiunte 3 righe per il modulo j4rv1s (conversation 10gg, audit skill 30gg, episodic+semantic memory indefinita) come da decisione 8 design doc j4rv1s.
  9. ISSUE-009 - Procedura off-boarding utente assente. Cosa succede quando un familiare esce dal sistema (separazione, figli adulti che vogliono autonomia, decesso)? Oggi: revoca Authentik basta lato login, ma residui dati personali in Synapse, Immich, Vaultwarden, Blinko, Mailpiler, Home Assistant, Kopia. GDPR art. 17 (diritto alla cancellazione). Action: scrivere 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).
  10. ISSUE-010 - Hardening account Cloudflare. Compromise dell'account CF = MITM totale di tutto lo stack (tunnel rerouted, certificate issuance, DNS hijack). Audit cyb3r scenario S1 = catastrofico. Action: (a) hardware key 2FA (YubiKey/Titan) come unico fattore secondario sul login CF, (b) email separata mai usata altrove (es. 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).
  11. ISSUE-011 - Sequencing modulo j4rv1s vs fasi st4ck. Il modulo j4rv1s ha dipendenze incrociate non banali con la roadmap st4ck principale: (a) j4rv1s F0a (scaffold codice + blocchi compose/Caddyfile commentati) é eseguibile in Fase 0 di st4ck, (b) j4rv1s F0b (deploy container internal + OIDC client + DNS) richiede st4ck Fase 1 chiusa con Authentik+Caddy+cloudflared live, (c) j4rv1s F1 (voice loop) richiede in piú i 2× HA Voice PE fisicamente arrivati a casa (lead time Nabu Casa 2-4 settimane: ordinare in Fase 0), (d) j4rv1s F2 (brain + skill loader) richiede j4rv1s F1 chiusa + immagini custom 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.

Risk register architetturale (audit syst3m, 2026-05-08)

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.

IDRischioTrigger / ProbabilitàImpattoMitigazione raccomandata
RA-001Lock-in Cloudflare consolidato (DNS + Tunnel + Pages + Access + WAF tutto CF)CF cambia pricing/policy/free tier · Probabilità bassa-media (~10% in 5 anni)CatastroficoPlan 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-002Bus factor = 1 (Aldo unico operator)Aldo indisponibile temporaneamente (malattia, viaggio) o permanentemente · Probabilità media (15-25% in 10 anni)Critico per famigliaLetter to family + DR runbook step-by-step + chiavi master in safe fisico + persona di fiducia onboarded con minimo know-how
RA-003Postgres 14 EOL (vincolo upstream Blinko)PG14 EOL Nov 2026; Blinko upstream non aggiorna in tempo · Probabilità mediaMedioTest PG16 in staging fine Fase 2 (gia' ISSUE-003); fallback: switch Blinko → Memos / Trilium se necessario
RA-004Hardware lock-in classe HP G8Mercato usato i7-11th gen secca / prezzi salgono · Probabilità bassa-mediaMedio (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-005Modulo j4rv1s gonfia il monorepoF4-F7 → 1500+ righe Python + 18+ skill + worker + dashboard · Probabilità alta se progetto procedeMedio (cognitive load)Submodule git o sub-repo separato prima di j4rv1s F4. Decisione architetturale, non urgente
RA-006DSM Synology EOL/breakingDSM 7 → DSM 8 (~2027), incompatibilità feature SHR-1 / Snapshot Replication · Probabilità mediaMedioTrueNAS Scale familiarizzazione lab Fase 3 su DS720+ #2 dual-boot; preparazione migrazione PRIMA del bisogno reale (gia' tracciato come decisione differita)
RA-007OS sprawl se Mac mini M4 entraRiapertura 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-008Tech debt da scelte 2026 invecchiano male36+ mesi senza review architetturale strategica · Probabilità alta se non si codifica il loopVariabile (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).

Decisioni differite (rivedere a fine Fase 2)

Action items immediati per Aldo

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#ActionEffortPri
AA1Acquisto hardware key 2FA (YubiKey 5C NFC o Titan, ~50 EUR)30 minP0
A2Hardening account Cloudflare (hw key + email separata + CT monitoring + API token least-priv)2 hP0
A3Spostare NVMe 990 PRO 1TB dal G5 al G830 minP1
A4Verificare BIOS G8 (secure boot off, AHCI on, virt on)15 minP1
A5Ordinare 2× HA Voice Preview Edition Nabu Casa (~140 EUR, lead time 2-4 settimane)15 minP1
A6Vendere G5 dopo cannibalizzazione (~250 EUR)1-2 sett mercatoP3
A7Acquisto enclosure USB-C 3.2 Gen2 + cassettino backup locale (~25 EUR)30 minP1
A8Conferma timeline avvio Fase 15 minDECISION
A9Verifica modello UniFi gateway casa + firmware10 minP1
BB1Letter to family (busta sigillata in safe + persona di fiducia)1 hRA-002
B2DR runbook step-by-step scenario-driven (PDF stampato)5 hRA-002
B3Persona di fiducia onboardata2 h + annualeRA-002
B4docs/runbooks/offboarding.md4 hP0 ISSUE-009
B5docs/dpa/ + 5 PDF vendor (CF, B2, Mistral, Anthropic, Nabu Casa)30 minA.5.23
B6docs/runbooks/restore-test.md2 h + cronA.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.

Appendice A - Inventario Completo

Hardware compute

IdentificativoSpecificheStatoDestinazione
HP EliteDesk 800 G8Intel 11th gen, 64 GB DDR4, mobo con 2x M.2 (no SATA bay)In usoCompute primario casa
HP EliteDesk 800 G5Intel 9th gen, 16 GB DDR4DisponibileVENDI dopo cannibalizzazione
Intel NUC10FNKIntel 10th gen U-series, 32 GB DDR4DisponibileVENDI dopo cannibalizzazione
HP EliteDesk 800 G8 #2(da acquisire usato, generation 11)Da reperireCompute 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 N5AMD Ryzen AI 9 HX 370 (12c), 32GB DDR5, 1TB NVMe, NPU 50 TOPSPotenzialeService node LLM (~1500 EUR, Linux nativo)
Mac mini M4 base ricondizionatoApple M4 (10c CPU/10c GPU), 24GB unified, 512GB SSD, Neural Engine 38 TOPSPotenziale (RECOMMENDED)Service node LLM (~800 EUR, MLX-accelerated)
Mac mini M4 Pro ricondizionatoApple M4 Pro (12c CPU/16c GPU), 24GB unified, 512GB SSDPotenzialeService node LLM (~1250 EUR, room per modelli 14-22B)

Storage NVMe / SSD

ModelloCapacita'OrigineDestinazione finale
Samsung MZV9P1T0 (990 PRO)1 TBEra nel G5G8 primary - M.2 Gen4
Kioxia KXG60ZNV512G XG6512 GBEra nel G8G8 primary - M.2 Gen3
Samsung MZ-V7S500 (970 EVO+)500 GBEra nel NUC10G8 replica - M.2 (futuro)
Samsung 870 EVO 500 GB (2.5" SATA)500 GBSpareG8 primary - USB-C esterno (Restic locale)
Samsung MZNTY256HDHP (M.2 SATA)256 GBEra nel G8RIMOSSO - cassetto / vendi (cede slot M.2 al 990 PRO)
Samsung 870 EVO 4 TB x24 TB cadSpareDS720+ #1 - SHR-1

Storage NAS

ModelloConfigurazione attualeDestinazione finale
Synology DS720+ #1Vuoto / pulitoCasa - hot storage SHR-1
Synology DS720+ #2Vuoto / pulitoGenitori - replica via Site Magic
Synology DS918+HDD esistenti con filmCasa - cold film server NFS
Synology DS718+ (legacy)Synology Chat/Drive/Photos in usoDISMETTI dopo fase 2
Synology DS718+ (backup)SpentoVENDI

Hardware di rete

ModelloSitoStato
UDM Pro / UCG-Max (verificare)CasaEsistente
UCG-UltraGenitoriDa acquistare ~160 EUR
Switch UniFi Lite 8 / equivGenitoriVerificare se gia' presente
UPS APC 1 KVACasaEsistente, autonomia 35 min
UPS piccolo (~600 VA)GenitoriDa acquistare ~120 EUR

BOM modulo j4rv1s — edge satelliti

ComponenteQuantita'EUR/unita'EUR totaleNote
HA Voice Preview Edition (Nabu Casa)2~70~140ESP32-S3, 2× XMOS far-field, speaker built-in, mute hardware, microWakeWord pre-trained "jarvis"
Alimentatori USB-C 5V/2A2~10~20Standard, qualsiasi marca certificata
Cavi USB-C 2m2~7~14Per posizionamento flessibile lontano da prese
Totale capex edge j4rv1s F1~174 EURServizi 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.

Software stack a regime

ServizioContainer imageVersione target
Ubuntu Server(host OS)24.04 LTS
Docker Engine(host)27.x
Caddycaddy:2-alpine2.x stable
AdGuard Homeadguard/adguardhomelatest stable
Authentik serverghcr.io/goauthentik/server2025.10+
Authentik workerghcr.io/goauthentik/server2025.10+
Synapse (Matrix)matrixdotorg/synapsev1.119+
Element Web(static su CF Pages)v1.11.91+
Vaultwardenvaultwarden/server1.32+
Immich serverghcr.io/immich-app/immich-serverv1.140+
Immich MLghcr.io/immich-app/immich-machine-learningv1.140+
Seafile serverseafileltd/seafile-mc11.x community
OnlyOffice Document Serveronlyoffice/documentservercommunity
Paperless-ngxghcr.io/paperless-ngx/paperless-ngx2.14+
Mailpiler(community image)1.4+
Home Assistantghcr.io/home-assistant/home-assistant2025.10+
Blinkoblinkospace/blinkolatest stable
Postgres dedicato Blinkopostgres14 (vincolo upstream Blinko)
Kopia Serverkopia/kopia0.17+
j4rv1s API + dashboardghcr.io/<user>/j4rv1s-api (custom)0.1+ (sviluppo iniziale)
j4rv1s LLM (Llama 3.1 8B locale)ghcr.io/ggerganov/llama.cpp:serverlatest stable
j4rv1s Qdrant (vector DB)qdrant/qdrant1.x stable
j4rv1s worker (skill executor + APScheduler)ghcr.io/<user>/j4rv1s-worker (custom)0.1+ (sviluppo iniziale)
Wyoming faster-whisper (STT)rhasspy/wyoming-whisperlarge-v3 italiano
Wyoming Piper (TTS)rhasspy/wyoming-pipervoce it_IT-riccardo-x_low
Wyoming openWakeWord (fallback)rhasspy/wyoming-openwakewordpreload model "jarvis"
PostgreSQL (per ogni app)postgres16-alpine
Redisredis7-alpine
Resticrestic/restic0.17+
Watchtowercontainrrr/watchtower1.7+
Uptime Kumalouislam/uptime-kuma1.23+
cloudflaredcloudflare/cloudflaredlatest

// FINE DOCUMENTO //
st4ck.d0mus.com - Project Dossier v2.6
Aggiornato 2026-05-08 (v2.6: §02 h2 Topologia + cross-ref j4rv1s, §09 layer security matrix dedupe, §11 roadmap 4 fasi in tabelle scannabili, §13 Plan B Cloudflare + Bus factor mitigation. Cumulato v2.0: KPI bar, Stato Progetto, ISSUE table, risk register RA-001..008, vincolo soft §14, audit log, D2 j4rv1s+M4)
Documento privato Aldo Brunello