• v0.9.2 b402ac4270

    v0.9.2
    All checks were successful
    CI / Build / Publish / Shellcheck (push) Successful in 2s
    CI / Build / Publish / Validate CHANGELOG structure (push) Successful in 2s
    CI / Build / Publish / PR build & smoke test (push) Has been skipped
    CI / Build / Publish / Bats unit tests (push) Successful in 6s
    CI / Build / Publish / Host-driven integration (entrypoint + storage sidecars) (push) Successful in 1m50s
    CI / Build / Publish / Round-trip + scheduler smoke (push) Successful in 3m15s
    CI / Build / Publish / Build multi-arch and push (push) Successful in 5m0s
    CI / Build / Publish / Reconcile releases across registries (push) Successful in 1m17s
    CI / Build / Publish / Workflow summary (push) Successful in 1s
    Stable

    Cody Bryant released this 2026-07-10 20:23:33 -07:00 | 17 commits to main since this release

    Added

    • Automatic recovery kit: with the recovery_password secret present (at /run/secrets/recovery_password or via RECOVERY_PASSWORD_FILE), after each backup archiver assembles a kit holding the full effective configuration (every non-secret setting, every secret, and the keys — exactly what archiver migrate emits), generated recreation notes (RECREATE.txt: hostname, schedule, every container path that needs a mount, required capabilities), and the deployment manifests when mounted read-only at /opt/archiver/deployment (a compose bind, a Kubernetes ConfigMap — e.g. a kustomize configMapGenerator under Flux/Argo — or a NixOS bind; captured verbatim), encrypts it to that password (AES-256, pbkdf2), and uploads it as a plain file beside the duplicacy data on every storage target (archiver-recovery-kit-<hostname>.tar.enc plus a companion README with the decrypt command). archiver init now generates the recovery password, includes it in the emitted materials, and displays it once for the user's password manager, and the shipped compose template mounts both the secret and its own compose.yaml — so new deployments maintain a kit by default; existing deployments enable it with openssl rand -base64 24 > secrets/recovery_password plus a secrets: entry (archiver migrate prints this hint when unconfigured). Disaster recovery needs only one reachable storage location — even just a provider web UI — plus the single recovery password: openssl enc -d -aes-256-cbc -pbkdf2 -in <file> | tar -xvf - on any machine yields archiver.env + secrets/ + RECREATE.txt (+ deployment/), everything required to recreate the deployment (the recovery password itself is included, so the recreated deployment maintains its kit immediately). The kit is re-uploaded only when its content actually changes or a target is missing it; the fingerprint deliberately ignores runtime state (for example the prune|retain rotation override), so an unchanged config is a nightly no-op. archiver recovery-kit pushes on demand and archiver recovery-kit force re-pushes everywhere. Upload failures are logged and notified but never fail the backup, and failed targets are retried on the next run. The recovery password must be at least 8 characters and differ from STORAGE_PASSWORD (it is the only thing protecting the kit at rest, and the kit contains the storage password). Unlike the bundle, the kit is write-only: nothing at runtime ever reads it back, so it is never a boot dependency.
    • The shipped compose template now consumes the emitted archiver.env directly via env_file: instead of inlining values — nothing to transcribe at setup or recovery, and the file holds no secrets so it can be committed to git alongside the compose file (inlining under environment: remains equivalent).

    Fixed

    • Removed the /opt/archiver/bundle entry from the image's VOLUME declaration. Docker Compose carries the previous container's mount over for image-declared volume paths when recreating, so converting a bundle-mode deployment to env-native with up --force-recreate inherited the old bundle mount and crash-looped on the bundle-without-password fail-fast. Until you run an image with this fix, convert with docker compose down && docker compose up -d instead. Env-native containers also no longer accumulate a useless anonymous volume at that path.

    Dependencies

    • chore(deps): update actions/checkout action to v7
    • chore(deps): update docker/setup-qemu-action action to v4.2.0
    • chore(deps): update bats/bats docker tag to v1.13.0
    • chore(deps): update dependency moby/moby to v29.6.1
    • chore(deps): update docker/setup-buildx-action action to v4.2.0
    • chore(deps): update docker/metadata-action action to v6.2.0
    • chore(deps): update docker/build-push-action action to v7.3.0
    Downloads