Self-hosted · your servers · no Kubernetes

Production database clusters, on machines you own.

PostgreSQL, MySQL and MongoDB — highly available, pooled, backed up, and reachable at an address that survives a failover.

curl -fsSL https://quorumkit.subhamsaha.in/get | sudo sh
qkctl

Approve once. It converges, elects, and keeps going.

plan
db-1
db-2
db-3

You read it before it happens.

A plan is the whole change, rendered. Applying runs node by node, with the log of the step that is running — and stops where it fails.

Plan for pg-main+14 create0 destroy
· pull postgres:17.2 … done
· write /etc/quorumkit/pg/patroni.yml
· start container pg-main-1
· bootstrap cluster, acquire leader lock
· join mesh 100.99.0.2/32
· pg_basebackup from 100.99.0.1 … 214 MB
· start container pg-main-2
· streaming, lag 0 B
· join mesh 100.99.0.3/32
· pg_basebackup from 100.99.0.1 … 214 MB
· start container pg-main-3
· streaming, lag 0 B
· reload pgbouncer, 3 backends
· publish A record → 10.0.4.11
· verify: SELECT pg_is_in_recovery() = false

Press the button. Nothing is contacted — these are the steps a real apply of this topology emits.

Failoverpg-main · synchronous · 1 primary + 2 replicas
your appunchangedpg-main.db.internalpgbouncer · :6432db-110.0.4.11PRIMARYdb-210.0.4.12REPLICAdb-310.0.4.13REPLICA

Stop db-1 and watch the address. It does not move.

The address never moves.

Apps connect to a name. Elections happen behind it — no DNS change, no redeploy, no new connection string.

One console. Every cluster.

One console. Every cluster.

Hero
HeroHero idle
HeroHero idle
HeroHero idle
HeroHero idle
Hero

The operational work, done properly.

  • ++1 destroy

    Nothing applies without a plan

    The exact containers, files, rules and records — before they exist.

  • Battle-tested HA, assembled

    Patroni, Group Replication, replica sets. Operated, never reimplemented.

  • pg-main.db.internal

    Endpoints outlive failovers

    One pooled address per cluster. Elections happen behind it.

  • chainrestore-drilled ✓

    A backup is unverified until it restores

    PITR, chain checks, restore drills into a throwaway sandbox.

  • Agents dial out, never in

    Outbound mTLS, and an encrypted mesh between the nodes.

  • Drift is a first-class state

    Changed by hand? You are told what, and offered a re-converge.

Engines

  • PostgreSQL17 · 16 — Patroni, etcd, PgBouncer, pgBackRest PITR
  • MySQL8.4 — Group Replication, MySQL Router, XtraBackup
  • MongoDB7 · 6 — replica sets, elections, oplog point-in-time
  • RedisSentinel — not shipping yetplanned

One command, on one server.

curl -fsSL https://quorumkit.subhamsaha.in/get | sudo sh