Every source behind this page, graded. All links were fetched and read on
2026-09-11. No papers and no talks appear: their hosts were unreachable from this
session's network, which is stated rather than papered over.
Postmortem
GitLab2017-02-10
Postmortem of database outage of January 31
The canonical backup-failure postmortem, read here from its markdown source in the
website repository at a 2017 commit. Five mechanisms enumerated, each with the
specific reason it produced nothing restorable.
Carry forwardOverlapping backup mechanisms are one
mechanism until each has an independently exercised restore path.
gitlab.com/gitlab-com/www-gitlab-com @ 30d10754
Decision record
GitLab2017-02-01
Issue #1102: Automated testing of recovering PostgreSQL database backups
Written the day after the outage: a weekly host restores the latest backup with the
production tools, checks that users, projects and issues contain data, and alarms on
failure. The design the next decade implemented and tightened to daily.
Carry forwardThe restore test must use the same tools an
engineer would use at 3 a.m., or it verifies the wrong procedure.
gitlab-com/gl-infra #1102
Postmortem
GitLab2017-02-11
Issue #1168: Backup system and replication is not working
Eleven days after the outage, one day after the postmortem published: the WAL
segment the secondary needed was already gone, and "our backups are simply not
working". The rawest artifact in this corpus.
Carry forwardPost-incident fixes fail at the same rate as
other new systems. Verification, not resolve, is what changed the curve.
gitlab-com/gl-infra #1168
Decision record
GitLab2017-02-10
Issue #1161: Disaster recovery for everything that is not the database
The widening of scope, twelve numbered workstreams, and the sentence quoted at the
top of section 02 distinguishing having snapshots from having a recoverable backup.
Carry forwardInventory every datastore that is not the
headline database; the postmortem's list had eight of them.
gitlab-com/gl-infra #1161
Source
GitLabchecked 2026-09
Runbooks: disaster-recovery/README.md
The operator-facing map: backups tolerant of zonal and regional loss via
multi-region object storage, with restore validation running "in CI pipelines for
both the Postgresql database and disk snapshots".
Carry forwardThe runbook links the validation pipelines
inline; recovery documentation that does not link its own proof is aspiration.
gitlab-com/runbooks
Source
GitLabchecked 2026-09
Runbooks: gameday.md
Mock DR events "almost every week", explicit roles, and a four-level confidence
taxonomy per service in which High confidence requires recovery tested in
production, not in a production-like environment.
Carry forwardGrade every service on that four-level scale;
the honesty of "No confidence: we have not tested recovery" is the point.
gitlab-com/runbooks
Case study
GitLab2024-2026
Runbooks: recovery-measurements.md
A running log of drill timings: Gitaly VM recreation between 14 and 76 minutes
across eight dated entries, a 2 h 38 m zonal DR process, notes on the drill where
node boot-up needed debugging.
Carry forwardRTO is a measurement with a date and a
worst-case column, not a target in a slide.
gitlab-com/runbooks
Source
GitLab2021, checked 2026-09
Runbooks: PostgreSQL backups with WAL-G
The operational anatomy: daily base backup from a Consul-elected secondary, WAL
shipped continuously to one bucket per environment, ~9 h for ~14 TiB, restore
automated in the gitlab-restore CI project, delayed replica for fast PITR.
Carry forwardRun the base backup on a replica and treat
its IO as budgeted load; 2021's #3338 is what unbudgeted looks like.
gitlab-com/runbooks
Policy
GitLabchecked 2026-09
Controlled document: Backups of GitLab.com
The audited policy: hourly full database backups with continuous log archival,
14-day retention, GCS soft delete at 7 days, snapshot restore validation by random
sampling, and object storage explicitly exempted with the reason written down.
Carry forwardExemptions from restore testing belong in a
controlled document with their threat-model assumption attached.
handbook source
Policy
GitLabchecked 2026-09
Controlled document: Disaster Recovery of GitLab.com
Daily PITR restore testing with data-integrity queries for the main and
subscriptions databases; hourly random-disk Gitaly snapshot restores verified by
recent commits; quarterly gamedays validating RTO and RPO against recorded
measurements.
Carry forwardThree cadences, three depths: daily full
restore, hourly sample, quarterly human drill. Copy the structure before the tools.
handbook source
Postmortem
GitLab2021-03-24
Incident #4056: Our database backups are failing to verify
A declared production incident whose customer impact field reads "DB Backup
Verification". The verification pipeline failing is treated with the same machinery
as user-facing outages: declared, timelined, given corrective actions.
Carry forwardPage on a failing verifier with the same
urgency as a failing service; it is the same risk on a delay.
gl-infra/production #4056
Postmortem
GitLab2021-01-16
Incident #3338: database failover triggered by GCP snapshots
Concurrent snapshots on all database nodes, begun "under the mistaken impression
that the snapshot process was a transparent background transaction", cost the
primary its Patroni lock inside four minutes.
Carry forwardStagger snapshots, prefer replicas, and load
test the backup path itself.
gl-infra/production #3338
Postmortem
GitLab2026-07-20
Incident #22543: gitlab-restore/postgres-gprd snitch missing
The surprise at the top of this page: post-upgrade version drift, 2017's signature
failure, caught by the restore pipeline's dead-man switch as a severity-4 item with
no customer impact. Sibling incidents in May and June 2026 show the switch working
repeatedly.
Carry forwardJudge a backup program by what severity its
recurring failure classes land at, not by whether they recur.
gl-infra/production #22543
Source
GitLab2026-04, closed unmerged
MR !231770: Remove --unlink-first and --recursive-unlink from tar extract
A distribution's security patch to GNU tar broke GitLab's restore invocation on
EL9+. The change removes flags the restore never needed; closed without merge, the
argument preserved.
Carry forwardRestores fail on environments, not just on
artifacts; the test matrix has an OS dimension.
gitlab-org/gitlab !231770
Source
GitLab2026-03, closed unmerged
MR !229743: Add Barman backup option for large database (draft)
A closed draft that names the gap in official guidance: bundled databases over
roughly 100 GB have outgrown pg_dump-based backups, and the documented answer,
cloud-managed databases, is unavailable to many self-managed customers.
Carry forward~100 GB is a documented flip point where
logical dumps stop being a disaster mechanism.
gitlab-org/gitlab !229743
Documentation
GitLabchecked 2026-09
Docs: Restore GitLab
The restore contract, stated flatly: "You can only restore a backup to exactly the
same version and type (CE or EE)" of GitLab it was created on. The sentence that
makes version drift a standing threat rather than an edge case.
Carry forwardRecord the full version matrix beside every
backup artifact; the artifact alone is not restorable knowledge.
gitlab-org/gitlab docs
Source
GitLabgroup since 2019-01
The gitlab-restore group
The practice as an org chart artifact: "Backup restore procedures for GitLab", with
CI projects for the gprd database, the subscriptions database, Gitaly snapshot
verification, and snapshot verification for Production, Staging and Ops.
Carry forwardOne restore pipeline per datastore, named,
owned and visible; a shared script named backup.sh is none of those.
gitlab.com/gitlab-restore
Postmortem
Google Cloud2024-05-24
Details of Google Cloud GCVE incident
Google's own account of deleting UniSuper's private cloud: the blank parameter, the
unknown one-year term, the 24x7 multi-day recovery, and the sentence crediting the
customer's third-party backup software as instrumental.
Carry forwardYour provider's control plane is a single
failure domain spanning all your regions. Hold one copy beyond it.
cloud.google.com
Design doc
resticchecked 2026-09
restic: doc/design.rst
The repository format's threat model in one line: "The host system a backup is
created on is trusted", the storage is not, and everything in the format follows
from making integrity checkable against untrusted storage.
Carry forwardDecide explicitly which side of the backup
you trust; the design of verification follows from that answer.
restic/restic
Documentation
resticchecked 2026-09
restic: checking integrity and consistency
The default check is structural; verifying actual data needs --read-data, which
downloads every pack file, and the docs say so with a bandwidth warning. Sampling
via --read-data-subset, by fraction or percentage, is the documented compromise.
Carry forwardFull verification has a cost curve; write
the sampling schedule down before the repository grows past affording it.
restic/restic
Documentation
PostgreSQLchecked 2026-09
PostgreSQL: backup.sgml (continuous archiving)
The constraints that shape every serious deployment: file-system backups restore
the whole cluster or nothing; WAL archiving must be monitored or it silently loses
its guarantee; corrupted WAL ends recovery early at an implicit target.
Carry forwardPITR's precision is bounded by the health of
the archive chain; monitor the chain, not the base backup.
postgres/postgres
Documentation
etcdv3.5 docs, checked 2026-09
etcd: snapshot and restore
Restoring is documented as a semantic event, not a copy: clients can observe the
revision going backwards, Kubernetes informers may hold caches the restore
invalidates, and a snapshot taken by copying the db file can miss unflushed WAL.
Carry forwardPlan the re-entry: what do clients,
caches and downstream systems do when the store's clock rolls back?
etcd-io/website
Source
GitHubchecked 2026-09
github/backup-utils
GitHub Enterprise Server's backup tooling: incremental snapshots transferring only
changes, configurable retention, parallel backup and restore, and a deprecation
notice as backup moves into the product ("backup-service becomes GA in GHES 3.20").
Carry forwardBackup tooling migrates like any other
dependency; a deprecation on the backup path is an action item with a date.
github/backup-utils
Design doc
Velerochecked 2026-09
Velero: restore progress reporting design
The design opens by recording the asymmetry it fixes: backups had real-time
progress, restores exposed only a phase. The operator watching a long restore had
no way to distinguish progress from a hang.
Carry forwardA restore without progress observability
becomes an unmeasurable RTO the first time it is slow.
vmware-tanzu/velero
Design record
Kuberneteschecked 2026-09
KEP-177: CSI volume snapshots
The platform's snapshot primitive, with the consistency contract stated in passing:
the application "is usually quiesced before taking a snapshot", which is to say the
platform snapshot is crash-consistent and application consistency is your hook to
write.
Carry forwardKnow which consistency your snapshots
actually promise; test restores of a busy workload, not an idle one.
kubernetes/enhancements