---
id: w1/m1/t004
title: Snapshot retention + documented restore
worker: worker1
status: done
estimate: 20m
depends_on: [w1/m1/t003]
---

## Objective

Bound backup storage and prove recoverability: keep a rolling window and document (and test) the restore onto a fresh node.

## Context

- Builds on the t003 CronJob. `etcdctl snapshot restore` onto a fresh node.

## Steps

1. Add retention (e.g. keep 7 daily) — bucket lifecycle rule or a prune step.
2. Write the restore runbook; test that a restore recovers the `App` objects.

## Files

- `deploy/gitops/base/` (retention) · `docs/` (restore runbook)

## Acceptance criteria

- [x] Only the retention window is kept in Wasabi. — in-job prune keeps the newest 7 (no out-of-band lifecycle rule needed); tested by seeding 10 objects and watching the job delete the 3 oldest.
- [x] A documented restore onto a fresh node recovers the `App` objects. — docs/ADR011-etcd-backup-restore.md; the selective re-apply path was tested: throwaway etcd from a real snapshot recovered `/registry/app.bex.co/apps/default/beancount-cms` as re-appliable JSON.

## Out of scope

- The snapshot/upload job (t003).
