From 0213ec5d7d7998d11e3d0d0731d281664aaae40d Mon Sep 17 00:00:00 2001 From: "A. F. Dudley" Date: Mon, 2 Feb 2026 19:30:13 -0500 Subject: [PATCH] Keep timestamped backup of etcd forever Create member.backup-YYYYMMDD-HHMMSS before cleaning. Each cluster recreation creates a new backup, preserving history. Co-Authored-By: Claude Opus 4.5 --- stack_orchestrator/deploy/k8s/helpers.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/stack_orchestrator/deploy/k8s/helpers.py b/stack_orchestrator/deploy/k8s/helpers.py index 76a216cb..1d265edf 100644 --- a/stack_orchestrator/deploy/k8s/helpers.py +++ b/stack_orchestrator/deploy/k8s/helpers.py @@ -215,13 +215,16 @@ except: pass etcdutl snapshot restore /data/db --data-dir=/restore/new-etcd \ --skip-hash-check 2>/dev/null - # Only after successful restore, swap directories - docker run --rm -v {etcd_path}:/etcd -v {temp_dir}:/tmp-work $ALPINE_IMAGE \ - sh -c "mv /etcd/member /etcd/member.bak && \ - mv /tmp-work/new-etcd/member /etcd/member && \ - rm -rf /etcd/member.bak" + # Create timestamped backup of original (kept forever) + TIMESTAMP=$(date +%Y%m%d-%H%M%S) + docker run --rm -v {etcd_path}:/etcd $ALPINE_IMAGE \ + cp -a /etcd/member /etcd/member.backup-$TIMESTAMP - # Cleanup + # Replace original with cleaned version + docker run --rm -v {etcd_path}:/etcd -v {temp_dir}:/tmp-work $ALPINE_IMAGE \ + sh -c "rm -rf /etcd/member && mv /tmp-work/new-etcd/member /etcd/member" + + # Cleanup temp (but NOT the backup) docker run --rm -v /tmp:/tmp $ALPINE_IMAGE rm -rf {temp_dir} """