-
v0.8.12
StableAll checks were successfulCI / Build / Publish / Shellcheck (push) Successful in 8sCI / Build / Publish / Validate CHANGELOG structure (push) Successful in 4sCI / Build / Publish / Bats unit tests (push) Successful in 7sCI / Build / Publish / PR build & smoke test (push) Has been skippedCI / Build / Publish / Round-trip + scheduler smoke (push) Successful in 3m24sCI / Build / Publish / Build multi-arch and push (push) Successful in 17m1sCI / Build / Publish / Reconcile releases across registries (push) Successful in 1m22sCI / Build / Publish / Workflow summary (push) Successful in 2sreleased this
2026-07-06 20:45:19 -07:00 | 55 commits to main since this releaseChanged
- Replaced the in-container Debian
crondaemon with supercronic for scheduled backups (CRON_SCHEDULE). supercronic runs jobs as the container user instead of forking withsetgid, so theSETGIDcapability is no longer required and has been removed from the documented hardened cap set (compose.yaml,README.md) — the set is nowDAC_OVERRIDE+CHOWN+FOWNER. It also passes the container environment straight through (Debian cron scrubs it). The entrypoint validates the schedule withsupercronic -test(fail-fast on a malformedCRON_SCHEDULE) and runs supercronic backgrounded so the SIGTERM graceful-stop path is preserved. Addedtzdataso a non-UTCTZresolves. A new CI scheduler smoke test asserts a job fires undercap_drop: ALLwith noSETGID. Action for hardened deployments: dropSETGIDfrom yourcap_addwhen you upgrade to this image. - Consolidated the per-storage-type credential and URL construction — previously duplicated across the primary-backup, add-copy, and restore code paths — into two shared helpers in
config-loader.sh:build_storage_urlandexport_duplicacy_storage_secrets. No behavior change. Adds bats coverage of theDUPLICACY_<NAME>_*credential mapping across all four storage types (the surface the 0.8.10/0.8.11 do-spaces incidents traced to), so a single definition is now the source of truth for both backup and restore.
Fixed
- Restore silently lost original file ownership under the recommended hardened cap set: the example
compose.yaml/README.mddidcap_drop: ALLand added back onlyDAC_OVERRIDE+SETGID, but restore preserves ownership by default (-ignore-owneris opt-in) and Duplicacy recreates the original UID/GID viachown(), which requiresCAP_CHOWN(andCAP_FOWNERto set mode/timestamps on other-UID files).DAC_OVERRIDEbypasses permission checks but notchown, so a restore completed with every file owned by root. AddedCHOWN+FOWNERto the documented cap set. (Default Docker caps already includeCHOWN; this only affected the hardenedcap_drop: ALLtemplate.)
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Replaced the in-container Debian