Availability classification
20 entities · policy adoptedAvailability classes, SLOs, redundancy and health checks for every declared entity. Classes are promises; src/slo.js refuses to let a promise contradict the dependency graph it stands on. Nothing here changes runtime behaviour — it is the policy the console measures against.
Open gaps
Declared policy the estate does not currently meet-
Open gap: Health is self-reported: a wedged process that still answers looks healthy. vinVIN / VPS reports its own health (jarvisos-agent heartbeat every 90s); nothing outside it confirms.
-
Open gap: Health is self-reported: a wedged process that still answers looks healthy. jarvisos-control-planeJarvisOS Control Plane reports its own health (self-reported status every 60s); nothing outside it confirms.
-
Open gap: Health is self-reported: a wedged process that still answers looks healthy. jarvisos-authJarvisOS Auth (SSO) reports its own health (self-reported status every 60s); nothing outside it confirms.
tier-0 Fleet-fatal
RTO ≤ 30m · RPO ≤ 15m · 99.5%Loss stops the estate serving, or risks losing data that cannot be reconstructed. Everything else waits while this is being fixed.
| Service | Now | State | Redundancy | Failover | RTO | Achievable | RPO | Health check | Domain |
|---|---|---|---|---|---|---|---|---|---|
| Caddy (reverse proxy) | No signal | rebuildable | single node risk accepted | none | 10m | 15m | — | independent | fd-vps |
| Google OAuth | No signal | none | vendor HA | vendor | — | — | — | independent | fd-identity |
| Home1 | No signal | rebuildable | active / passive | manual → vin | 30m | 30m | — | independent | fd-home-rack |
| ISP Uplink | No signal | none | single node risk accepted | none | — | — | — | independent | fd-home-rack |
| JarvisOS Auth (SSO) | No signal | rebuildable | single node risk accepted | none | 15m | 30m | — | self-reported | fd-vps |
| JarvisOS Control Plane | No signal | rebuildable | active / passive | manual → vin | 20m | 30m | 1h | self-reported | fd-home-rack |
| Postgres (primary) | No signal | durable | active / passive | manual → postgres-replica | 25m | 25m | 15m | independent | fd-home-rack |
| Public DNS | No signal | none | vendor HA | vendor | — | — | — | independent | fd-edge-dns |
| Redis (cache / queue) | No signal | rebuildable | single node risk accepted | none | 15m | 30m | — | independent | fd-home-rack |
| VIN / VPS | No signal | rebuildable | single node risk accepted | none | 15m | 15m | — | self-reported | fd-vps |
| WireGuard (Home1 <-> VIN) | No signal | none | single node risk accepted | none | 15m | 15m | — | independent | fd-mesh |
tier-1 Estate-critical
RTO ≤ 4h · RPO ≤ 1d · 99%The estate keeps serving without it, but a major capability or the ability to recover is gone. A tier-1 outage that lasts is how a tier-0 outage becomes unrecoverable.
| Service | Now | State | Redundancy | Failover | RTO | Achievable | RPO | Health check | Domain |
|---|---|---|---|---|---|---|---|---|---|
| GWSCLI / S3 | No signal | none | vendor HA | vendor | 4h | 4h | — | self-reported | fd-offsite |
| Internal DNS | No signal | rebuildable | active / passive | automatic → vin | 20m | 20m | — | independent | fd-home-rack |
| NAS | No signal | rebuildable | single node | none | 2h | 2h | — | independent | fd-home-rack |
| NAS backup dataset | No signal | durable | single node | none → gwscli-s3-offsite | 1h | 2h | 1h | self-reported | fd-home-rack |
| Offsite backup replica | No signal | durable | vendor HA | none | 4h | 4h | 1d | self-reported | fd-offsite |
| Postgres (replica) | No signal | durable | single node | none | 45m | 45m | continuous | independent | fd-vps |
tier-2 Degraded-tolerable
RTO ≤ 8h · RPO ≤ 7d · 95%Loss is visible and annoying; nothing else is at risk. Fix it in hours, during waking ones.
| Service | Now | State | Redundancy | Failover | RTO | Achievable | RPO | Health check | Domain |
|---|---|---|---|---|---|---|---|---|---|
| JarvisOS Worker (VIN) | No signal | ephemeral | single node | none | 30m | 30m | — | self-reported | fd-vps |
| VPS1 / de-james-vps1 | No signal | none | single node | none | 1h | 1h | — | independent | fd-vps-nbg |
tier-3 Best-effort
RTO ≤ n/a · RPO ≤ n/a · no targetLoss is accepted by policy. No objective, no page, no incident priority above P4.
| Service | Now | State | Redundancy | Failover | RTO | Achievable | RPO | Health check | Domain |
|---|---|---|---|---|---|---|---|---|---|
| NAS media dataset | No signal | durable | single node | none | — | 2h | — | self-reported | fd-home-rack |
Single-node register
What may stay on one host, and on whose signatureEverything else is clustered or active/passive. A service appears here only if someone accepted the exposure in writing, with a date to look at it again.
| Service | Class | Redundancy required | Accepted by | Review | Reason |
|---|---|---|---|---|---|
| Caddy (reverse proxy) | tier-0 | yes | homelab-operator | 2027-02-15 | Inherited from VIN being the only public-ingress node. A second proxy would need a second public node and DNS failover. The Caddyfile is managed configuration restored from the crown-jewels tier in minutes. |
| ISP Uplink | tier-0 | yes | homelab-operator | 2027-02-15 | One circuit, no second uplink. A backup uplink is recurring cost against a zero-new-spend policy, and the estate is designed so that the edge node keeps serving during a home outage. |
| JarvisOS Auth (SSO) | tier-0 | yes | homelab-operator | 2027-02-15 | Inherited from VIN being the only public-ingress node; a standby would have nowhere independent to run. Restored in minutes from configuration, and the recovery console is deliberately reachable without it. |
| Redis (cache / queue) | tier-0 | yes | homelab-operator | 2026-11-15 | Contents are rebuildable and a restart is seconds. A Sentinel cluster needs a third voting domain this estate does not have, and would introduce split-brain risk to buy availability for data we are willing to lose. The exposure is the auth coupling below, not the data. |
| VIN / VPS | tier-0 | yes | homelab-operator | 2027-02-15 | VIN is the only public-ingress node in the estate. A second edge means a second VPS bill and DNS-level failover; the fleet's cost policy is zero new recurring spend. A 15 minute rebuild from the crown-jewels backup is the accepted answer. |
| WireGuard (Home1 <-> VIN) | tier-0 | yes | homelab-operator | 2027-02-15 | One WAN path per side. A second path means a second circuit or an LTE failover device — recurring cost against a fleet policy of none. Mitigation is detection, not redundancy: the handshake probe exists so a partition is not misdiagnosed as a dead node. |
| NAS | tier-1 | no | not required | — | tier-1 does not require redundancy; state is rebuildable. |
| NAS backup dataset | tier-1 | no | not required | — | tier-1 does not require redundancy; state is durable with a 1h RPO. |
| Postgres (replica) | tier-1 | no | not required | — | tier-1 does not require redundancy; state is durable with a continuous RPO. |
| JarvisOS Worker (VIN) | tier-2 | no | not required | — | tier-2 does not require redundancy; state is ephemeral. |
| VPS1 / de-james-vps1 | tier-2 | no | not required | — | tier-2 does not require redundancy; state is none. |
| NAS media dataset | tier-3 | no | not required | — | tier-3 does not require redundancy; state is durable. |
Failure domains
3 of them can run computeA failover target only counts if it is in another domain. These are the boundaries every redundancy claim on this page is measured against.
Home rack
- Mains power loss takes both hosts at once
- ISP uplink loss removes the whole domain from the network
- Fire, flood or theft — the only risk the offsite copy exists for
- Single-operator administrative error across both hosts
Two hosts, one room, one circuit. Treat home1 and nas as one domain for every failover decision: a standby on nas does not survive what kills home1.
VPS provider
- Provider or region outage
- Account suspension or billing failure — an administrative fault with the blast radius of a hardware one
- Monthly egress allowance exhaustion
The only domain this estate publishes from, and — until 2026-08-17 — the only compute domain believed independent of the home rack. fd-vps-nbg is now a second one, measured rather than assumed. That makes this domain slightly less load-bearing and not one bit less of a single point for public ingress, because nothing published has been moved.
VPS provider · nbg1
- Provider or region (nbg1) outage
- Account suspension or billing failure — shared with fd-vps, since both nodes sit behind one vendor account
- A co-tenant's root-level automation, which JarvisOS neither owns nor may stop
- Memory exhaustion caused by workloads this estate does not own
A second compute domain, in a second region, running its own complete deployment control plane. It carries no estate service, so nothing in this classification depends on it — which is exactly why its loss is a tier-2 event and its existence is still the most valuable thing in this file.
Offsite object storage
- Vendor outage or account action
- Credential loss
- Loss of the encryption passphrase, which makes the copy unreadable — indistinguishable from not having it
Storage only. It cannot host a standby, so it can never be the third domain a quorum would need.
Private link plane
- A dynamic home-side IP change breaks the peer endpoint
- Loss of the link makes a healthy home rack indistinguishable from a dead one, seen from VIN
- Coordination-plane or relay dependence adds latency, not an outage
Public DNS plane
- DNS outage makes every published route unresolvable regardless of node health
- Certificate renewal depends on it — failures surface as TLS errors a day or two later
Identity plane
- New logins fail while existing sessions survive
- Every published route is forward-authed, so an identity outage reads as a total outage
Accepted risks
Decisions on record, each with a review date-
Accepted risk: The class requires redundancy and there is none. vinVIN / VPS is single-node but tier-0 requires a redundancy model.Accepted by homelab-operator, review 2027-02-15: VIN is the only public-ingress node in the estate. A second edge means a second VPS bill and DNS-level failover; the fleet's cost policy is zero new recurring spend. A 15 minute rebuild from the crown-jewels backup is the accepted answer.
-
Accepted risk: The class requires redundancy and there is none. caddyCaddy (reverse proxy) is single-node but tier-0 requires a redundancy model.Accepted by homelab-operator, review 2027-02-15: Inherited from VIN being the only public-ingress node. A second proxy would need a second public node and DNS failover. The Caddyfile is managed configuration restored from the crown-jewels tier in minutes.
-
Accepted risk: The class requires redundancy and there is none. redisRedis (cache / queue) is single-node but tier-0 requires a redundancy model.Accepted by homelab-operator, review 2026-11-15: Contents are rebuildable and a restart is seconds. A Sentinel cluster needs a third voting domain this estate does not have, and would introduce split-brain risk to buy availability for data we are willing to lose. The exposure is the auth coupling below, not the data.
-
Accepted risk: The class requires redundancy and there is none. jarvisos-authJarvisOS Auth (SSO) is single-node but tier-0 requires a redundancy model.Accepted by homelab-operator, review 2027-02-15: Inherited from VIN being the only public-ingress node; a standby would have nowhere independent to run. Restored in minutes from configuration, and the recovery console is deliberately reachable without it.
-
Accepted risk: The class requires redundancy and there is none. wireguard-tunnelWireGuard (Home1 <-> VIN) is single-node but tier-0 requires a redundancy model.Accepted by homelab-operator, review 2027-02-15: One WAN path per side. A second path means a second circuit or an LTE failover device — recurring cost against a fleet policy of none. Mitigation is detection, not redundancy: the handshake probe exists so a partition is not misdiagnosed as a dead node.
-
Accepted risk: The class requires redundancy and there is none. isp-uplinkISP Uplink is single-node but tier-0 requires a redundancy model.Accepted by homelab-operator, review 2027-02-15: One circuit, no second uplink. A backup uplink is recurring cost against a zero-new-spend policy, and the estate is designed so that the edge node keeps serving during a home outage.
Structural notes
-
Note: An accepted risk no longer matches any finding. vps1An accepted risk for "single-node-unaccepted" no longer matches any finding; it can be removed.
How to read these numbers
- RTO is measured from fault detection to service restored, for a fault in the component itself. The worst case including dependency recovery is derived, not declared: see achievableRtoMinutes on the availability page.
- RPO applies to the data a service owns. A service whose durable state lives elsewhere records that in stateHeldIn and carries only a configuration RPO.
- Availability targets are stated over a rolling 30 days and are aspirations, not contracts: nothing here measures uptime yet. The honest figure is the incident log.
- This estate has two independent compute domains. Majority quorum needs three, so every stateful failover is manual and fenced by hand. That is a deliberate choice, not an oversight: automatic promotion across two sites turns a partition into split-brain.
Source: config/service-classes.json · machine-readable at
/api/v1/availability · narrative in
docs/HA-CLASSIFICATION.md.