// DIGITAL_TWIN :: DUFFIN HOMELAB SYSTEMS

SHIELA
Digital Twin

A working model of my homelab — including the local-LLM stack running on the GPU node. What you can do here that you can't do on a status page: break it. Kill a container, saturate the database, exhaust the GPU, drain the UPS, and watch the failure propagate through the dependency graph exactly as it would at 3 AM.

Simulated, and deliberately anonymised. The topology, the dependency edges and therefore the failure behaviour are real — that is the part worth showing. Service names, container images and OS versions are role-based codenames, and port numbers are omitted entirely: publishing a live inventory of what runs where, on which version, is free reconnaissance for anyone who wants in. Telemetry is modeled, not measured — no host is polled and no figure here is a claim about current uptime. Hence MODEL.

SERVICES UP
APP P95
BLAST RADIUS 0
ERROR BUDGET 99.990%
MODEL — NOT MEASURED

// RACK_ELEVATION

SHIELA has been running for six years and is the main driving force of my IT career. NODE-02 is the hypervisor with GPU passthrough — it carries the entire local-LLM stack. NODE-03 sits on its own circuit running a deliberately preserved legacy stack.

// SERVICE_TOPOLOGY :: EDGE → PROXY → SERVICES → DATA → HOSTS

CLICK A NODE TO INSPECT · PACKET RATE SCALES WITH MODELED RPS

// NODE_INSPECTOR

P95 LATENCY · LAST 60 TICKS

IMAGE
EXPOSURE
HOST
CPU
P95
RPS
CAUSE
none
UPSTREAM
BREAKS

// EVENT_LOG

// CHAOS_CONSOLE :: INJECT FAULT

Nothing real is harmed. Watch the blast radius counter and the event log.

// SINGLE_FAULT

// SYSTEMIC

// RECOVERY

// HOW_THE_MODEL_WORKS

Causality,
Not Decoration

The point of a twin is that it reasons about consequence. Health propagates along the real dependency edges in topological order, so a failure lands exactly where it would in production — and nowhere it wouldn't.

32 NODES · REAL TOPOLOGY NAMES + PORTS MASKED HARD vs SOFT DEPENDENCIES DAG PROPAGATION · KAHN TOPO-SORT SEEDED NOISE · DETERMINISTIC BLAST RADIUS ≠ FAILURE COUNT TRANSITION-ONLY LOGGING MTTR ON INCIDENT CLOSE

Not every dependency is fatal, and a model that pretends otherwise is useless for planning. Edges here are hard or soft: lose a hard upstream and a service cannot serve at all (ERR); lose a soft one and it drops a capability but stays up (WARN). The photo vault hard-depends on its database and the bulk volume, but only soft-depends on the vision service — so a GPU crash pauses object detection and face grouping without taking the library offline. That distinction is the difference between an outage and a degraded feature.

Asymmetries worth finding. The legacy host hangs off the edge directly on its own machine, so severing the uplink kills it but killing the ingress router does not — and being on a separate circuit is why it survives a SHIELA power event. The uptime monitor carries no database and no storage dependency, because a monitor should share as little failure domain with its targets as possible: saturating Relational Store A blinds four services while the thing watching them stays up. And the LLM runtime and embedder are internal-only behind the inference gateway — so a public-facing compromise doesn't hand anyone the model host, and a GPU OOM kills completions while retrieval keeps answering.

// NEXT_MODULE

The Fleet,
Documented

VIEW FULL SPEC SHEET ▸