Prune portable backup slot before export
This commit is contained in:
@@ -34,6 +34,13 @@ letzte Lauf am 16. September 2026 um 13:50 Uhr verzeichnet. Sie
|
|||||||
liegen unter `/data/emergency-backups`. Schutz vor Datenplattenausfall setzt
|
liegen unter `/data/emergency-backups`. Schutz vor Datenplattenausfall setzt
|
||||||
eine außerhalb Athenas aufbewahrte Kopie voraus.
|
eine außerhalb Athenas aufbewahrte Kopie voraus.
|
||||||
|
|
||||||
|
Die lokale Rotation hält fünf verschlüsselte Generationen. Da ein Paket rund
|
||||||
|
46 GB umfasst, gibt das Exportscript bei bereits erreichter Aufbewahrungszahl
|
||||||
|
vor dem Schreiben genau den ältesten Slot frei. Ohne diese Reihenfolge hätte
|
||||||
|
der Lauf am 21. September bei nur noch 17 GB freiem Speicher die neue Datei
|
||||||
|
nicht mehr vollständig schreiben können. Scheitert der neue Lauf danach,
|
||||||
|
bleiben weiterhin vier gültige Generationen erhalten.
|
||||||
|
|
||||||
Die externe Restic-Sicherung über `athena-disaster-backup.timer` ist derzeit
|
Die externe Restic-Sicherung über `athena-disaster-backup.timer` ist derzeit
|
||||||
nicht eingerichtet: Der Timer ist zwar aktiviert, aber
|
nicht eingerichtet: Der Timer ist zwar aktiviert, aber
|
||||||
`/etc/mike-ai/disaster-backup.env` fehlt. Bis ein externes
|
`/etc/mike-ai/disaster-backup.env` fehlt. Bis ein externes
|
||||||
|
|||||||
@@ -37,6 +37,22 @@ target="$OUTPUT_DIR/$name"
|
|||||||
list=$(mktemp /tmp/athena-export-list.XXXXXX)
|
list=$(mktemp /tmp/athena-export-list.XXXXXX)
|
||||||
trap 'rm -f "$list" "$partial"' EXIT
|
trap 'rm -f "$list" "$partial"' EXIT
|
||||||
|
|
||||||
|
# The encrypted export is roughly the size of its predecessor. Keeping all
|
||||||
|
# generations until after writing the next one requires one extra archive of
|
||||||
|
# free space and can deadlock a full backup disk. Release exactly one slot
|
||||||
|
# before writing when the configured retention is already reached. If the new
|
||||||
|
# export fails, KEEP-1 valid generations remain available.
|
||||||
|
mapfile -t existing < <(find "$OUTPUT_DIR" -maxdepth 1 -type f \
|
||||||
|
-name 'athena-portable-*.tar.zst.age' -printf '%T@ %p\n' \
|
||||||
|
| sort -rn | cut -d' ' -f2-)
|
||||||
|
while ((${#existing[@]} >= KEEP)); do
|
||||||
|
last_index=$((${#existing[@]} - 1))
|
||||||
|
oldest=${existing[$last_index]}
|
||||||
|
rm -f -- "$oldest" "$oldest.sha256"
|
||||||
|
unset 'existing[last_index]'
|
||||||
|
existing=("${existing[@]}")
|
||||||
|
done
|
||||||
|
|
||||||
add_path() {
|
add_path() {
|
||||||
local path=${1#/}
|
local path=${1#/}
|
||||||
[[ ! -e /$path ]] || printf '%s\0' "$path" >>"$list"
|
[[ ! -e /$path ]] || printf '%s\0' "$path" >>"$list"
|
||||||
|
|||||||
Reference in New Issue
Block a user