The copy that survives the bad day.

Snapshots protect you from yourself. Replication protects you from a host. DR Manager is the layer under both — encrypted restic repositories on an appliance that lives outside the fleet it protects, and stays closed until a host proves who it is.

Built on QEMU / KVMCloud HypervisorOpenZFSWireGuardLeilFSPrometheusUbuntuRocky LinuxGo

Three layers, and only one of them survives losing the rack.

Each answers a different question. Running the first two and calling it a backup strategy is the common mistake.

you lose how high each failure reaches
nothing reachesthis high the site is gone a host dies a bad change
vm-104live data
click me
zfs snapshotsame pool
replica on host-bthe next machine
DR Repositoryoff-site instance
Snapshots — you broke somethingInstant, cheap, and local. A ZFS snapshot rolls back a bad change in seconds. It also lives on the same pool as the thing it protects, so it is gone when that pool is.
Replication — a host diedIncremental zfs send to another machine. The guest comes back on a neighbour with minutes of data loss rather than hours — as long as the neighbour is still standing.
DR Manager — everything is goneEncrypted restic repositories on an appliance that is deliberately not part of the fleet. Different site, different power, different failure domain. The copy that is still there.

Retention is a tier you pick, not a spreadsheet you maintain.

Six tiers ship with the appliance. Applying one copies its counts onto the resource, so editing a tier later never silently rewrites machines that already have a policy.

Tier Daily Weekly Monthly Yearly For
Scratch3 Short-lived workloads — a few days of rollback, nothing more
Bronze743 Baseline protection for non-critical resources
Silver146121 Standard production, with a year of monthly history
Gold308123 Important production — deep dailies and multi-year history
Platinum6012247 Business-critical — maximum practical depth at every cadence
Archival30123610 Compliance-grade long-term evidence retention

Retention

Applies the tier and prunes what falls outside it. The log records the snapshots kept and restic's reason for keeping each one, so a deletion is never unexplained.

Integrity check

Reads the repository back and verifies it. A backup you have never read is a hypothesis, and this is the job that turns it into a fact before you need it to be one.

Cloud sync

Mirrors the repository, already encrypted, into an archive target that is never mounted. A second off-site copy for the machines that warrant one.

Every repository is closed until a host knocks.

Ordinary backup systems keep long-lived credentials on every machine they back up. Take one host and you can read — or delete — everything. DR Manager inverts that.

the knock
host-03vm-104
  • name
  • uuid
  • repo
  • credential
the proxy checks
  • the credential maps to one repo
  • the uuid matches
  • the name matches
  • the repo name matches
  • the resource is not disabled
Refused, at the proxy Any one of them wrong and the knock is rejected there. No repository is opened, and no byte is read.
One repository opens Repo 7, for that credential and that transfer. Every other repository stays closed to it.
repo 5repo 6repo 7repo 8repo 9

What that buys you

  • Hosts hold no encryption keys. The restic password comes back with the knock, is written to a private temporary file for the length of the run, and goes with it. There is nothing on the host to steal.
  • A compromised host reaches one repository. Its own. Not the fleet's — and only while it is mid-transfer.
  • The ingress is append-only. A machine that has been taken over cannot erase its own history to cover the tracks. Deleting anything is the appliance's job, on the appliance's schedule.
  • Nothing is provisioned out of band. Each guest carries its own DR address and credential in its own config. No key distribution, no rotation across the estate.

Backups that never stop the guest.

A running machine is a moving target, so nothing is read from it. The backup reads a frozen clone instead.

  1. Snapshot zfs snapshot A point-in-time snapshot of the guest, taken in milliseconds.
  2. Clone zfs clone Cloned to a temporary dataset and stamped as a copy, so nothing anywhere mistakes it for the guest or tries to start it.
  3. Stream restic backup restic reads the clone and streams it through the door the knock opened.
  4. Clean up zfs destroy Clone and snapshot are destroyed — including when the run failed partway.

Interrupted runs resume

A transfer that dies halfway leaves its clone in place, and the next run continues incrementally rather than starting the whole thing again. Over a slow link to another site, that is the difference between a backup that completes and one that never does.

Schedules build themselves

Enable DR on a guest and the scheduler grows a job for it — daily, weekly, monthly or yearly. There is no plan to regenerate and nothing to remember after adding a machine. Jobs run one at a time, so a fleet does not put a fleet of transfers on one host at once.

Replicas are skipped

A backup copy sitting on another host is not the machine. Backing it up would store the same data twice under two identities, so DR runs on primaries only.

The parts that touch your data are not ours.

DR Manager writes no cryptography and speaks no storage protocol. It runs restic and rclone — two of the most heavily exercised tools in their field — and its job is deciding who may run them, against what, and when.

restic

The repository. Everything about how your data is stored.

Content-defined chunking and deduplication, so the twentieth backup of a 40 GB guest is not the twentieth 40 GB. AES-256 encryption and authentication applied on the machine holding the data, before a byte leaves it — the appliance stores ciphertext it did not create and could not have created differently.

It runs on both sides, and the sides do not have the same powers. Hosts get init, backup and — under a separate short-lived grant — restore. Everything destructive or administrative, forget, prune, check, snapshots, ls, stats, only ever runs on the appliance.

rclone

The reach. Everything about where that storage physically is.

A repository does not have to live on the appliance's own disk. rclone mounts an S3 bucket or an SFTP directory as a filesystem, and repositories are created on it exactly as they would be locally — the ingress never learns the difference.

It also runs the archive tier: rclone sync mirrors a repository's already-encrypted files into a target that is never mounted and never hosts a live repository. rclone only ever runs on the appliance, which is the reason no host in your fleet holds an object-storage credential.

The repositories outlive us

They are ordinary restic repositories in restic's documented on-disk format. Point the restic binary at one with its password and you get your snapshots back, with no DR Manager involved and nothing of ours in the path. A backup system you cannot leave is not a backup system, and the exit here is a published CLI rather than a promise.

Versions are stated, not assumed

The appliance runs restic version and rclone version and prints what it found across the top of its own dashboard. When an operation fails, the log carries the tool's own output rather than a paraphrase of it — the thing you actually need at three in the morning.

A restore is a link, and it lands anywhere.

Authorisation is a short-lived capability URL issued for one snapshot of one resource — deliberately not tied to a destination, so you paste it into whichever machine has room.

restore onto any host — clone-safe by default

$ hoster dr restore 'https://dr.example/restore/9f2c…#token=…' \

--parent-dataset zroot/vm-encrypted \

--name restore-drill --start

The token never reaches a server log

It rides in the URL fragment, which browsers and clients do not send. What is transmitted is the grant's id; the secret that redeems it stays client-side. Grants expire in an hour by default and can never be minted for longer than a day.

Invisible until it is real

The host claims the capability, restores into a hidden temporary dataset, validates that the expected configuration is present, and makes it visible with one atomic zfs rename. A half-restored guest never appears in inventory and nothing starts it by accident. A failed restore removes what it created.

Safe by default, exact on request

A restored guest is treated as a copy unless you say otherwise: new UUID, new addresses, regenerated cloud-init, and its DR schedule and replication settings dropped. That is what makes a restore drill safe to run against production repositories — it cannot collide with the machine it came from. Recovering the machine for real? Opt each piece of its identity back in, or take all of it at once with --preserve-identity.

Nine screens. Everything the appliance knows, and nothing it does not.

It is a compose stack. Where it runs is your call.

Run it on bare metal, in a virtual machine, or as a microVM on a Hoster node — the last of those ships ready-made. The only rule is that it does not live on the fleet it protects.

One port, one origin

The operator interface, the API and the restic ingress share one HTTPS endpoint — one origin to publish, and one to firewall.

Immutable tags only

Images are built and pushed under a timestamped tag that is never moved. Upgrading is a one-line change and rolling back is the same line with the previous value — which is what you want from the system you reach for during an incident.

Encrypted storage, and you mean it

The appliance holds the repository passwords, because that is what lets hosts hold none. Its own dataset is therefore the crown jewels, and it belongs on encrypted storage with its key database backed up somewhere that is not the backup system it unlocks.

Nothing dials in

Hosts reach out to the endpoint you publish. Nothing has to reach into a host's network to take a backup, which is what makes this work across sites and behind NAT.

Full deployment steps, the environment it takes, and what to back up are in the documentation.

Run Hoster on your hardware. Start with one server.