• v0.8.11 6939b087a4

    v0.8.11
    All checks were successful
    CI / Build / Publish / Shellcheck (push) Successful in 5s
    CI / Build / Publish / Validate CHANGELOG structure (push) Successful in 2s
    CI / Build / Publish / PR build & smoke test (push) Has been skipped
    CI / Build / Publish / Build multi-arch and push (push) Successful in 2m11s
    CI / Build / Publish / Reconcile releases across registries (push) Successful in 46s
    CI / Build / Publish / Workflow summary (push) Successful in 2s
    Stable

    Cody Bryant released this 2026-06-04 22:32:36 -07:00 | 108 commits to main since this release

    Fixed

    • The 0.8.10 do-spaces restore fix was still broken in auto-restore: sanitize_storage_name logs a "name was sanitized" WARN via log_message, and auto-restore.sh redefines log_message to also echo to stdout — so callers doing name="$(sanitize_storage_name …)" captured that log line into the name, re-corrupting DUPLICACY_<NAME>_*. The function now redirects its log_message to stderr, so only the sanitized name reaches stdout. Kept as one shared function (called by both backup and restore) so the sanitization is guaranteed identical on both paths.
    Downloads
  • v0.8.10 7ca9b341f6

    v0.8.10
    All checks were successful
    CI / Build / Publish / Shellcheck (push) Successful in 4s
    CI / Build / Publish / Validate CHANGELOG structure (push) Successful in 2s
    CI / Build / Publish / PR build & smoke test (push) Has been skipped
    CI / Build / Publish / Build multi-arch and push (push) Successful in 2m1s
    CI / Build / Publish / Reconcile releases across registries (push) Successful in 59s
    CI / Build / Publish / Workflow summary (push) Successful in 1s
    Stable

    Cody Bryant released this 2026-06-04 18:37:55 -07:00 | 110 commits to main since this release

    Fixed

    • Restore from a storage whose name contains a character invalid in a shell identifier (e.g. a hyphen, like do-spaces) failed: duplicacy-restore.sh built DUPLICACY_<NAME>_S3_ID/_SECRET/_PASSWORD from the raw name, so export rejected it ("not a valid identifier"), the credentials never reached duplicacy, and it fell through to an interactive prompt → EOF → that target was skipped. Now sanitizes the storage name (matching duplicacy-backup.sh) before building the env-var names and -storage-name.
    Downloads
  • v0.8.9 3717a0e5c9

    v0.8.9
    All checks were successful
    CI / Build / Publish / Validate CHANGELOG structure (push) Successful in 2s
    CI / Build / Publish / Shellcheck (push) Successful in 4s
    CI / Build / Publish / PR build & smoke test (push) Has been skipped
    CI / Build / Publish / Build multi-arch and push (push) Successful in 1m52s
    CI / Build / Publish / Reconcile releases across registries (push) Successful in 51s
    CI / Build / Publish / Workflow summary (push) Successful in 2s
    Stable

    Cody Bryant released this 2026-06-04 16:48:52 -07:00 | 112 commits to main since this release

    Fixed

    • auto-restore-all.sh shipped without its execute bit (mode 0644 in the repo, preserved into the image by COPY), so archiver auto-restore-all failed with "Permission denied" when the dispatcher exec'd it — breaking the tier-3 full-host restore path. Restored the script's exec bit and hardened the Dockerfile to chmod +x lib/scripts/*.sh so a missing source bit can't recur.
    Downloads
  • v0.8.8 5255f53405

    v0.8.8
    All checks were successful
    CI / Build / Publish / Shellcheck (push) Successful in 4s
    CI / Build / Publish / Validate CHANGELOG structure (push) Successful in 2s
    CI / Build / Publish / PR build & smoke test (push) Has been skipped
    CI / Build / Publish / Build multi-arch and push (push) Successful in 2m0s
    CI / Build / Publish / Reconcile releases across registries (push) Successful in 47s
    CI / Build / Publish / Workflow summary (push) Successful in 1s
    Stable

    Cody Bryant released this 2026-06-03 11:49:59 -07:00 | 114 commits to main since this release

    Added

    • RUN_RESTORE_SERVICE env toggle on auto-restore (and, via pass-through, auto-restore-all): when non-empty, runs the service's ./restore-service.sh after a successful file restore — non-interactively reloading databases and restarting the stack, mirroring what the interactive restore command prompts for. Its exit code propagates, so a failed reload surfaces as a failed restore (and a failed service in the auto-restore-all summary). Required for full-host DR where databases are backed up as dumps (not raw data dirs) and so must be reloaded post-restore. The interactive restore command also honors the toggle to skip its y/N prompt.
    Downloads
  • v0.8.7 09cb210499

    v0.8.7
    All checks were successful
    CI / Build / Publish / Shellcheck (push) Successful in 5s
    CI / Build / Publish / Validate CHANGELOG structure (push) Successful in 3s
    CI / Build / Publish / PR build & smoke test (push) Has been skipped
    CI / Build / Publish / Build multi-arch and push (push) Successful in 3m42s
    CI / Build / Publish / Reconcile releases across registries (push) Successful in 1m14s
    CI / Build / Publish / Workflow summary (push) Successful in 2s
    Stable

    Cody Bryant released this 2026-06-03 04:55:53 -07:00 | 116 commits to main since this release

    Added

    • auto-restore-all command: non-interactive restore of every service in SERVICE_DIRECTORIES in one pass. Iterates the service registry and runs auto-restore at the latest revision (trying all storage targets) for each, then aggregates — exits 0 only if every service restored, 1 if any failed, 3 if the backup lock is held. Optional env (REVISION, STORAGE_TARGET, OVERWRITE, DELETE_EXTRA, HASH_COMPARE, IGNORE_OWNERSHIP) passes through to each per-service restore. Available as archiver auto-restore-all and entrypoint run auto-restore-all. Built for full-host disaster recovery onto a blank box.

    Dependencies

    • chore(deps): update actions/checkout action to v6.0.3
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to c7d3c51
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 159006f
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 2bfc4bc
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 8f55827
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 5a74dfa
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 8c42892
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to fd4978c
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 61e442c
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 684d92c
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 59ebcd2
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 49e7bdf
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 4d6a1f3
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to bc173ba
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 96db676
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 9d905e2
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to b63ff3b
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 179b9ff
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 4139c95
    • chore(deps): update quay.io/skopeo/stable:v1.22.2 docker digest to 4d60d6c
    Downloads
  • v0.8.6 a79d1ef4d6

    v0.8.6 - CI and Dockerfile modernization
    All checks were successful
    CI / Build / Publish / Shellcheck (push) Successful in 3s
    CI / Build / Publish / Validate CHANGELOG structure (push) Successful in 2s
    CI / Build / Publish / PR build & smoke test (push) Has been skipped
    CI / Build / Publish / Build multi-arch and push (push) Successful in 7m47s
    CI / Build / Publish / Reconcile releases across registries (push) Successful in 59s
    CI / Build / Publish / Workflow summary (push) Successful in 1s
    Stable

    Cody Bryant released this 2026-05-05 14:30:49 -07:00 | 180 commits to main since this release

    No behavioral changes to the archiver application itself — only the CI pipeline, release flow, and image build process. Aligns archiver with the same externalized-repo conventions used by sibling projects on forgejo.bryantserver.com.

    Added

    • release.yml workflow for cutting releases via workflow_dispatch with bump=patch|minor|major. Promotes [Unreleased] to a versioned section, bumps image refs in compose.yaml and README.md, runs a smoke test, then tags + pushes — replaces the prior manual git tag flow.
    • .renovaterc.json introduced. Tracks the Dockerfile base image, ENV-pinned upstream versions (DUPLICACY_VERSION via github-releases against gilbertchen/duplicacy, DOCKER_CLI_VERSION via github-releases against moby/moby), Forgejo Action versions, and the inline skopeo image referenced by docker-publish.yml.

    Changed

    • CI: docker-publish.yml split from a monolithic build-and-push job into separate jobs (shellcheck, validate-changelog, pr-validate, build-and-push, create-release, summary). Each concern has its own gate; failures surface to the new aggregator job rather than silently passing.
    • CI: cluster push now builds to a local OCI archive and uses skopeo copy per tag rather than docker buildx build --push. Forgejo 15.0.1 nil-derefs in EndUploadBlob when buildx's parallel multi-arch push hits the UQE_package_blob_blake2b/sha512 unique constraint — byte-identical blobs across amd64/arm64 (e.g. arch-independent COPY layers) race two PUTs of the same digest. Skopeo walks manifests serially with TryReusingBlob HEAD-checks, so byte-identical blobs across arches dedupe before PUT.
    • CI: NAS Forgejo mirror now uses skopeo sync (full repo, self-healing) instead of docker buildx imagetools create. Same Forgejo 15.0.1 bug class as the cluster push.
    • CI: GitHub Container Registry mirror now uses skopeo copy per tag instead of docker buildx imagetools create. Different registry (no Forgejo nil-deref bug there), but skopeo's HEAD-first dedup is safer against any concurrent-PUT race in the GHCR backend.
    • CI: build cache moved from type=registry,ref=...:buildcache (separate cache push that hits the same Forgejo bug) to type=inline (cache annotations embedded on the published image manifest; cache-from: ...:0.8 reads the previous release's inline cache on subsequent builds).
    • CI: skopeo invocation stages the OCI archive into a docker-managed named volume via docker cp rather than bind-mounting from ${{ github.workspace }} — the runner-container's view of the workspace path differs from the docker host's, so a child container's -v <archive>:<target> silently creates an empty dir at the host path instead of finding the archive.
    • CI: release creation now reconciles every v*.*.* tag on every release run across all three registries (cluster Forgejo, NAS Forgejo, GitHub). A release that failed to publish on any registry (transient 5xx, NAS down, mirror lag) is picked up by the next successful release run rather than staying absent forever. Includes per-tag target_commitish from git rev-parse "${tag}^{}" for metadata normalization and defense against mirror-lag races where a reconciled tag isn't yet on the destination.
    • CI: cluster Forgejo release is now attributed to a real-user PAT (CLUSTER_REPO_WRITE_PAT) instead of the auto-injected GITHUB_TOKEN, so release commits and tags carry a stable author identity rather than appearing as "ghost".
    • CI: secret naming aligned with the bryantserver externalized-repo convention. BRYANTSERVER_REGISTRY_PATCLUSTER_REGISTRY_PUSH_PAT, NAS_FORGEJO_PATNAS_FORGEJO_WRITE_PAT. New: CLUSTER_REPO_WRITE_PAT for release.yml's commit/tag/push and create-release attribution. GHCR_PUSH_PAT and GH_RELEASE_PAT unchanged (already convention-shaped).
    • CI: tag patterns reduced to SemVer-only (was also :main/:pr-N from type=ref,event=branch/event=pr). PR builds now validate via the pr-validate job (build + smoke + arm64 dry-run) without polluting the registry with branch-name and PR-number tags.
    • CI: Forgejo Action versions digest-pinned (@v4/@v5@<digest>); Renovate tracks both major version and digest.
    • Dockerfile: base image digest-pinned (debian:trixie-20260112-slim...@sha256:...).
    • Dockerfile: removed wget, gnupg, and lsb-release from the apt install list. No longer needed once curl replaces wget for the duplicacy download and the docker-ce-cli apt repo dance is gone.
    • Dockerfile: Docker CLI install switched from the docker-ce-cli debian package (with epoch:upstream-revision versioning that has no clean Renovate datasource) to the static binary archive at download.docker.com/linux/static/stable/<arch>/docker-<version>.tgz. ENV pin becomes clean SemVer (29.4.2 instead of 5:29.1.4-1), Renovate-tracked via extractVersion=^docker-v(?<version>.+)$ against moby/moby GitHub releases. Trade-off: lose apt's auto security-patch flow within a release stream; gain explicit Renovate-managed bumps. Acceptable for a CLI talking to a host-mounted socket.
    • Dockerfile: DUPLICACY_VERSION Renovate-tracked via extractVersion=^v(?<version>.+)$ against gilbertchen/duplicacy GitHub releases. Renovate auto-opens PRs for new duplicacy releases.
    • Dockerfile: switched wgetcurl for the duplicacy binary download, since curl is already installed and wget is no longer needed.

    Notes

    • All 27 prior releases (v0.1.0 through v0.8.5) will be retroactively reconciled on the cluster + NAS Forgejos and GitHub on the next release run to set per-tag target_commitish. They previously had blank or "main" values; cosmetic backfill, no functional change.
    Downloads
  • v0.8.5 d3fef4d25e

    v0.8.5
    All checks were successful
    Build and Publish Docker Image / build-and-push (push) Successful in 3m14s
    Build and Publish Docker Image / create-release (push) Successful in 6s
    Stable

    SisyphusMD released this 2026-05-01 18:06:43 -07:00 | 182 commits to main since this release

    Changed

    • Distribution: Container images are now published to both forgejo.bryantserver.com/sisyphusmd/archiver and ghcr.io/sisyphusmd/archiver. Forgejo is the primary registry; ghcr.io remains available as a mirror. Existing image tags through 0.8.4 are unchanged on both registries.
    • Repository: Project source-of-truth has moved to forgejo.bryantserver.com/SisyphusMD/archiver. The GitHub repository at github.com/SisyphusMD/archiver is now a read-only push-mirror.
    • Documentation: README and configuration guides updated to reference the Forgejo image path as primary.
    Downloads
  • v0.8.4 fac4c7315e

    v0.8.4 Stable

    SisyphusMD released this 2026-04-23 18:14:20 -07:00 | 199 commits to main since this release

    Changed

    • archiver run backup CLI now exits 1 on per-service errors. Previously exited 0 regardless, surfacing failures only via log output and the optional Pushover notification. This makes the CLI suitable for external schedulers that key off the exit code — e.g., Kubernetes Job / CronJob (where the Complete / Failed status condition is derived from container exit code) or CI pipelines. The long-lived container deployment (archiver start, with the internal cron) is unaffected: per-service iteration and notification behavior are unchanged, and the backgrounded backup cycle's exit code remains unobserved by the daemon.

    Migration

    • Shell wrappers around archiver run backup that relied on exit 0 and chained subsequent commands: wrap with || true if the old continue-on-error behavior is desired.
    • No action needed for containerized archiver start deployments.
    Downloads
  • v0.8.3 4a0477f3ea

    v0.8.3 Stable

    SisyphusMD released this 2026-04-23 16:45:29 -07:00 | 200 commits to main since this release

    Fixed

    • Container Detection in Kubernetes: The container-deployment guard now recognizes Kubernetes Pods running on containerd or CRI-O, which create neither /.dockerenv nor /run/.containerenv. Detection now also checks $KUBERNETES_SERVICE_HOST (set automatically in every Pod) and /proc/self/cgroup (catches standalone containerd, CRI-O, LXC, rkt). Previously, running archiver:0.8.2 run backup from a Kubernetes CronJob or Job failed at startup with "Only container deployment is supported" unless the image was rebuilt with a touch /.dockerenv kludge.

    Changed

    • Internal: Renamed lib/core/require-docker.shlib/core/require-container.sh and the associated REQUIRE_DOCKER_CORE / REQUIRE_DOCKER_SH_SOURCED constants. No user-visible change; the script is sourced internally.
    Downloads
  • v0.8.2 3378e8ba41

    v0.8.2 Stable

    SisyphusMD released this 2026-04-21 18:58:35 -07:00 | 203 commits to main since this release

    Added

    • run backup Mode: New synchronous backup path for external schedulers (Kubernetes CronJob, GitHub Actions scheduled workflows, systemd timers, etc.). docker run ... archiver:0.8.2 run backup decrypts the bundle, runs a backup synchronously, and exits with the backup's result code so the scheduler can report success/failure accurately. Accepts the same optional prune / retain flags as archiver start. This complements — and does not replace — archiver start, which remains async and is the right choice for the in-container cron daemon and for fire-and-forget use from a long-lived container.
    Downloads