From e64aa64c73ee0e15a174479dab9521c67c5cb64f Mon Sep 17 00:00:00 2001 From: Moritz Graf Date: Wed, 1 Jul 2026 17:28:11 +0200 Subject: [PATCH] velero: implement three-tier backup retention policy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace single daily schedule (240h TTL) with three tiered schedules: - daily-backup: 02:00 nightly, 192h TTL → keeps last 7 daily backups - weekly-backup: 03:00 Sundays, 1032h TTL → keeps last 6 weekly backups - monthly-backup: 04:00 on 1st, 4392h TTL → keeps last 6 monthly backups Kopia handles incremental deduplication at the block level automatically, so each Velero backup only stores changed data despite being a full logical snapshot. No additional incremental configuration required. Update README with retention policy table and updated backup commands. --- k8s/README.md | 19 +++++++++++++++++++ k8s/velero/velero.secret.yaml | Bin 1330 -> 2249 bytes 2 files changed, 19 insertions(+) diff --git a/k8s/README.md b/k8s/README.md index c14e2e6..0c0c9f1 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -141,6 +141,25 @@ DATE=$( date +%Y%m%d ) velero backup create $DATE --include-namespaces coder,home-assistant,n8n,influxdb --wait ``` +### Backup Retention Policy + +Three schedules run automatically, providing a tiered retention policy. Kopia (used for fs-backup) deduplicates at the block level, so each backup only stores changed data — incrementals come for free. + +| Schedule | Cron | TTL | Keeps | +|---|---|---|---| +| `velero-daily-backup` | `0 2 * * *` | 8 days | Last 7 daily backups | +| `velero-weekly-backup` | `0 3 * * 0` | 43 days | Last 6 weekly backups (Sundays) | +| `velero-monthly-backup` | `0 4 1 * *` | 183 days | Last 6 monthly backups (1st of month) | + +```sh +# Check all schedules and their last run +velero schedule get + +# Check current backups and their expiry +velero backup get +``` + + ## coder Coder is a code server see [https://coder.com/docs/v2/latest/install/kubernetes](https://coder.com/docs/v2/latest/install/kubernetes). diff --git a/k8s/velero/velero.secret.yaml b/k8s/velero/velero.secret.yaml index 494373669c9979c0753ddad70fe45d1ab3922080..6cf5787103b76a3644971a73d2119de72aef3a85 100644 GIT binary patch literal 2249 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