Skip to main content

Cleanup Failed Backups (cleanback) 🚮⚡

GitHub Sponsors Patreon Buy Me a Coffee PayPal

Repository: https://github.com/kevinveenbirkenbach/cleanup-failed-backups

cleanback validates and (optionally) cleans up failed Docker backup directories in a production-safe way.

It scans backup folders under a configurable backups root (for example /Backups), uses dirval to validate each backup subdirectory, and removes only those backups that are confirmed to be invalid.

Validation runs in parallel for performance; deletions are explicitly controlled and can be interactive or fully automated.


✨ Highlights

  • Parallel validation of backup subdirectories
  • Uses dirval (directory validator) via CLI
  • Safe deletion model: only truly invalid backups are removed
  • Interactive or non-interactive cleanup (--yes)
  • Supports validating a single backup ID or all backups
  • Clear exit code semantics for CI and system services
  • Clean Python package with pyproject.toml
  • Unit tests and Docker-based E2E tests

📦 Installation

Via pip (recommended)

pip install cleanback

This installs:

  • the cleanback CLI
  • dirval as a dependency (declared in pyproject.toml)

Editable install (for development)

git clone https://github.com/kevinveenbirkenbach/cleanup-failed-backups
cd cleanup-failed-backups
pip install -e .

🔧 Requirements

  • Python 3.8+
  • Read/write access to the backups root directory tree (e.g. /Backups)
  • dirval (installed automatically via pip dependency)

🚀 Usage

CLI entrypoint

After installation, the command is:

cleanback

Validate a single backup ID

cleanback --backups-root /Backups --id <ID>

Validates directories under:

/Backups/<ID>/backup-docker-to-local/*

Validate all backups

cleanback --backups-root /Backups --all

Scans:

/Backups/*/backup-docker-to-local/*

⚙️ Common options

Option Description
--dirval-cmd <cmd> Path or name of dirval executable (default: dirval)
--workers <n> Number of parallel validator workers (default: CPU count, minimum 2)
--timeout <sec> Per-directory validation timeout in seconds (float supported, default: 300.0)
--yes Non-interactive mode: automatically delete invalid backups (dirval rc=1 only)
--force-keep <n> In --all mode: skip the last n timestamp subdirectories inside each backup folder

Note: Backups affected by timeouts or infrastructure errors are never deleted automatically, even when --yes is used.


🧪 Examples

# Validate a single backup and prompt before deleting invalid ones
cleanback --backups-root /Backups --id 2024-09-01T12-00-00
# Validate all backups and automatically delete invalid ones
cleanback --backups-root /Backups --all --workers 8 --yes
# Use a custom dirval binary and a short timeout (testing only)
cleanback \
  --backups-root /Backups \
  --all \
  --dirval-cmd /usr/local/bin/dirval \
  --timeout 5.0

🔒 Safety & Design Notes

  • Validation and deletion are strictly separated
  • Only backups explicitly marked invalid by dirval are eligible for deletion
  • Timeouts and infrastructure errors are NOT treated as invalid backups
  • Backups affected by timeouts are never deleted automatically
  • Infrastructure problems (timeouts, missing dirval) cause a non-zero exit code
  • Deletions require confirmation unless --yes is specified
  • Tests never touch the host filesystem (E2E tests run inside Docker only)

This design makes cleanback safe for unattended operation on production systems.


🚦 Exit codes

cleanback uses exit codes to clearly distinguish between backup issues and infrastructure problems:

Exit code Meaning
0 All backups valid, or invalid backups were successfully removed
1 Validation infrastructure problem (e.g. timeout, missing dirval)
2 CLI usage or configuration error

This makes the tool suitable for CI pipelines, systemd services, and other automation.


🧪 Tests

Run all tests (unit + Docker-based E2E):

make test

🪪 License

This project is licensed under the GNU Affero General Public License v3.0. See the LICENSE file for details.


👤 Author

Kevin Veen-Birkenbach 🌐 https://www.veen.world 📧 kevin@veen.world

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cleanback-1.3.0.tar.gz (44.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cleanback-1.3.0-py3-none-any.whl (31.4 kB view details)

Uploaded Python 3

File details

Details for the file cleanback-1.3.0.tar.gz.

File metadata

  • Download URL: cleanback-1.3.0.tar.gz
  • Upload date:
  • Size: 44.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for cleanback-1.3.0.tar.gz
Algorithm Hash digest
SHA256 6baddb01fcab8492aa3888a2a561680434b87ce2e746757518b10566127d4a70
MD5 768c43877758aeb6e3eec484bd29df9a
BLAKE2b-256 00e3b09008ab88558fb1bb646e9a0cab6b6a98d6adb2119eac8594e6a9f35fd2

See more details on using hashes here.

File details

Details for the file cleanback-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: cleanback-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 31.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for cleanback-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fd8c8a3351794581be3137a88c7565968fc20bb224622c973ac4a85c8a431bb4
MD5 57e81c6935339eba86fc11c68004ab50
BLAKE2b-256 5d3b3d4550f45d3598cf28b2067943571044eefb91875cfbdaaef2d13ab489da

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.3.0 This release

2 files

1.2.1

2 files

1.2.0

2 files

1.1.0

2 files

1.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page