Brandon Seamer

Services

Seven services, each in its own unprivileged container on a bridge the host filters. A container reaches the reverse proxy and the internet, and nothing else on the bridge, so a compromise of one service is a compromise of one container.

What it runs

The game server

A Minecraft world kept for friends, one of two services here that people outside the household reach. Players arrive through the edge node rather than through the house, and are invited by name rather than the world being open.

invited players only reached through the edge

A platform for a robotics program

The teams of a youth robotics program build and run their own web applications here, in a virtual machine apart from the containers, on a network of its own that reaches the internet and nothing else in the house. Each team is kept from the others, and none of it can reach the estate. How it is built, and what was chosen over what.

Docker PostgreSQL Cloudflare Tunnel

The alert relay

Self-hosted notifications, and the one service that must work when nothing else does. The auxiliary node runs a second copy, so a message still leaves the house when the usual sender is itself what failed. Alerts are plain text, and test messages never go to the live topics.

self-hosted a copy on the other node

The reverse proxy

One front door for everything with a name, holding the certificates and deciding what each name is allowed to reach. It is the only container the others may talk to, which is what makes the bridge filter simple enough to reason about.

TLS the only hub on the bridge

This site

The application serving these pages, and a private half that is not on the internet at all. Public pages leave through an outbound-only tunnel, so nothing here waits for a connection from outside.

public and private tiers outbound only

Latency and uptime monitoring

Two different questions, so two services. One samples the path to the internet every few minutes and draws it, which is how a sustained problem is told from a single poor evening; the other checks that each service answers, and says so when one stops.

a graph over months a check every minute

DNS filtering

The household's name resolution, filtered, with the queries logged per device. It is the one service here the rest of the house depends on without knowing it, which is why it is on the node that is always up rather than the one by the television.

for the whole house per-device log

What they run on

Platform

A type-1 hypervisor runs every service in its own isolated Linux environment. Containers rather than full virtual machines: lower overhead, faster backups, and a restore measured in seconds.

Proxmox VE Debian LXC systemd

Storage

A copy-on-write filesystem with end-to-end checksums, so silent corruption is detected and repaired from the mirrored copy rather than quietly served. Compression, instant snapshots, and scheduled integrity scrubs come with it. The RAID controller runs in pass-through mode so the filesystem sees real disks.

ZFS mirrored vdevs lz4 compression SMART monitoring

Network

A private WireGuard mesh links every device — desktop, phone, server — into one network regardless of physical location. Peers connect directly rather than through a middleman. The router forwards nothing to a service: no port forward, nothing exposed, nothing that answers a stranger.

Tailscale WireGuard policy-based ACLs split DNS

Public edge

The rare service that should be public — this page, for instance — is published through an outbound tunnel. The server dials out; visitors are served by the edge network. Still no inbound path, and DNS, certificates, and caching are handled upstream.

Cloudflare Tunnel Cloudflare DNS automatic TLS

Data protection

Nightly snapshot-based backups run without interrupting anything, with daily, weekly and monthly retention. A second copy is encrypted locally and pushed to object storage off-site, so what leaves the building is unreadable to the provider, and a third lands on the auxiliary node, which re-reads and checksums what it holds every week. Restores are rehearsed monthly by a scheduled job, not assumed.

Cloudflare R2 rclone client-side encryption snapshot backups

Operations

The server pushes alerts to a phone when a backup fails, a drive reports errors, or an off-site copy does not complete — through a self-hosted notification service rather than a public one, so nothing can be read or spoofed from outside.

ntfy self-hosted authenticated push

Secrets

Nothing on the server can reach the vault, on purpose. Each automated job holds one narrowly scoped credential in a file only it can read, placed there from the desktop and checked hourly, and every key does a single job — the backup key reaches one bucket, the network key cannot create more keys.

1Password per-job credentials scoped API tokens

Workloads

A game server for friends, invited individually rather than left open to the internet. The alert relay, latency and uptime monitoring, DNS filtering for the house, the reverse proxy that fronts everything, and the application serving this page. Ahead: network file shares and a virtual tabletop for the campaign.

Minecraft Caddy ntfy AdGuard Home ASP.NET Core

architecture view

Open the SVG in a new tab.