Skip to content

Releases: lugoues/borgmatic-manager

v1.10.0

Choose a tag to compare

@github-actions github-actions released this 28 Aug 00:24
39e7860

Changelog

  • 68f8935 chore(deps): update github actions
  • 39e7860 docs(readme): replace em dashes with plain punctuation throughout
  • 9aff028 feat(toolchain): provision a pinned borgmatic via uv so host Python churn cannot break backups
  • 6af33ef feat(toolchain): the manager owns borgmatic; host installs are ignored unless borgmatic_path is set
  • 68eded8 fix(deps): update go dependencies to v1.45.0

v1.9.0

Choose a tag to compare

@github-actions github-actions released this 06 Aug 23:20

Changelog

  • f6ba841 chore(deps): bump opentelemetry to v1.44.0
  • 8eb6b6f docs(scheduler): correct the cycle observer timing contract
  • d25b0d4 docs: document the OpenTelemetry metrics and how to alert on a group that has never run
  • c50edd7 feat(config): validate metrics protocol and endpoint at load so a typo fails startup
  • 3c888a0 feat(metrics): add Grafana dashboard for exported backup metrics
  • b8662de feat(metrics): emit from one-shot run too, so a manual backup is a recorded data point
  • 1bfb115 feat(metrics): emit per-repository OpenTelemetry backup metrics over OTLP
  • 4a7191c feat(metrics): report a group's volume inventory by name and total, not only its offline count
  • f230954 feat(restore): render a restore-only config for a group refused for archive overlap; extracts neither prune nor create
  • cad3f28 feat(runner): capture per-repository backup outcomes with failure-confirmation probe
  • 64a00bd feat(runner): export cross-process lock helpers for restore coordination
  • cd22281 feat(status): show per-repository breakdown and partial fan-out state in status and inspect
  • ab64ba0 fix(cli): back up the merged set in run and generate so a stopped container's volumes do not silently drop out
  • d8b026f fix(cli): include refused groups in the status and inspect repository inventory
  • e684e07 fix(cli): reconcile repository inventory for refused groups and in inspect, and redact exporter setup errors
  • 7aed7c9 fix(cli): reject a negative run_timeout instead of silently disabling the timeout
  • 9b5945c fix(cli): remove the restore's credential-carrying config dir on completion; redaction requires a complete reference
  • 1726809 fix(cli): skip groups left empty by offline database stripping, matching the scheduler
  • 6239fdb fix(config): cover every timestamp value when testing for overlap, and stop treating an at-sign in a local path as a remote spec
  • e00e097 fix(config): detect overlapping archive patterns from the names a format generates, not from group names
  • f3f3c13 fix(config): distinguish an unreadable repository list from an empty one
  • c3a9845 fix(config): honour pattern text after an unknown placeholder, and spare groups that only point into a refused conflict cycle
  • dc22e30 fix(config): judge archive pattern collisions against the groups that will actually run
  • 7bfb21b fix(config): match archive patterns against the format's structure instead of sampled timestamps
  • dd444b2 fix(config): match archive patterns with borg's glob syntax, and stop guessing values the host cannot reproduce
  • a5385f8 fix(config): match glob wildcards by character rather than by byte
  • 5e8b925 fix(config): model open-ended timestamp directives as digit runs so a past year still collides
  • abe6a2c fix(config): refuse a group whose archive pattern claims a sibling's archives instead of only warning
  • 9164d21 fix(config): render formatted timestamps across the year when testing archive patterns for overlap
  • 23e5e52 fix(config): render known placeholders when testing for overlap, and scope ambiguity to the repositories that collide
  • 55ffcf7 fix(config): resolve defined environment repositories before locking, and reject manager options left at the top level
  • cc18841 fix(config): settle pattern refusals in rounds so a refused group cannot condemn a sibling that only conflicted with it
  • 935d4aa fix(config): shell-quote the runtime dir in helper dump commands
  • 3f7a2b9 fix(config): stop minting throwaway run ids in the non-writing generation passes
  • 225722a fix(config): stop modelling locale-dependent timestamp directives in English
  • bc44912 fix(config): strict-decode the manager section so a misspelled key fails instead of silently dropping the setting
  • 5f5bd3f fix(config): treat an absolute path as local however its components are punctuated
  • be46a00 fix(config): treat an unparsable endpoint carrying a credential as unprintable
  • abcfdfd fix(discovery): keep a stopped container's sqlite databases; only namespace-dependent dumps need the container executing
  • a06cbcc fix(discovery): keep hostname-mode dumps too when the container is not executing; only namespace joins need it
  • c4470b3 fix(discovery): keep the raw spec label out of parse errors so database passwords cannot leak into logs
  • cde6f0f fix(discovery): reject a dangling symlink in the sqlite containment check instead of reading it as a missing file
  • 573dba2 fix(discovery): resolve symlinks in the sqlite containment check so a link inside the volume cannot point the root-run backup outside it
  • d718657 fix(discovery): skip a paused container's databases too; holding mounts is not the same question as accepting an exec
  • 1c2978d fix(discovery): skip a stopped container's databases so the dump helper does not fail every cycle joining a dead namespace
  • 9bd1faa fix(doctor): diagnose labels and config shape even when borgmatic is not installed
  • 81d6a8f fix(grafana): derive the failed-run stat from the group counter, which carries the verdict the per-repository counter deliberately does not
  • 4833548 fix(grafana): query backup_volume_offline and build the filter variables from the inventory metrics
  • 2a54435 fix(inspect): redact brace-prefixed literals; only real {credential}/{env} references stay visible
  • 5c3c1d2 fix(metrics): apply the legacy stand-in only while a group's repository inventory is unknown
  • 7f6168d fix(metrics): carry repository destinations through the inventory, report it from one-shot runs, and redact the shutdown error
  • 23ea371 fix(metrics): count a repository the run reached but could not judge as an attempt
  • 7a8209c fix(metrics): count a terminated run against every configured repository and let the environment name the service
  • c127248 fix(metrics): count every run in the group counter, and export gauges only for groups the inventory still has
  • 2f48013 fix(metrics): count exported series rather than instruments, and log one line per export
  • 1765f22 fix(metrics): count the group's own verdict, and keep each process's counter stream separate
  • b39d2b7 fix(metrics): emit backup_group_info and feed the one-shot run's inventory, so a group that has never backed up is visible
  • f662e01 fix(metrics): give a newly configured repository an inventory series, and redact single-slash URLs
  • 715c84c fix(metrics): honour the OTLP protocol environment, report sizes from the last measured run, and emit a per-repository inventory series
  • b308695 fix(metrics): keep a repointed repository joinable, and redact URLs whose scheme is malformed
  • 7e3c3c0 fix(metrics): keep maintenance cycles out of the per-repository backup counter entirely
  • 9faff55 fix(metrics): keep maintenance-only cycles out of the backup counter and report the transport actually resolved
  • 82dd1fe fix(metrics): reconcile repository gauges each cycle, and redact URLs inside exporter errors
  • 2441033 fix(metrics): redact a whole URL including its query, and report a legacy record's group success
  • 40c3c3d fix(metrics): redact credentials from the logged endpoint, and drop gauges when the last group is removed
  • acdab84 fix(metrics): redact rejected endpoints too, and keep the service identity when the resource fails to build
  • 8ffee32 fix(metrics): redact the error handed back to the reader, and show a repository that has never run
  • 32c0531 fix(metrics): report every run under the counter's documented result labels
  • e4b6f66 fix(packaging): drop the enablement symlink directly on purge and restart a preserved service on reinstall
  • 5f2a754 fix(packaging): leave disabling to purge so remove-then-reinstall keeps the enabled state
  • 8517aec fix(packaging): read the stopped-service st...
Read more

v1.8.0

Choose a tag to compare

@github-actions github-actions released this 26 Jul 02:24
ce87161

Changelog

  • 6e5db79 chore(ci): add renovate config to keep action SHA pins and go deps updated
  • ce87161 chore(ci): tell renovate to skip the charmbracelet v2 majors (they live at charm.land and need a manual migration)
  • 043dc74 chore(deps): update golang.org/x/term to v0.45.0 and docker to v28
  • de5f768 feat(cli): doctor command diagnoses config, socket, versions, labels, and generated configs
  • 30616d5 feat(cli): mark offline members in discover/status/inspect and restore them through the passthrough
  • 812899d feat(cli): restore-volume extracts one volume back into place, resolving destination and guarding running containers
  • f007c56 feat(config)!: group files are manager.yaml-shaped overlays with per-group manager.period
  • 09a9da9 feat(config): warn when snapshot hooks target a volumes directory that is not its own subvolume or dataset
  • f91c091 feat(inspect): render size trends with ntcharts timeseries charts instead of sparklines
  • 9554676 feat(inspect): wider smoothed trend charts with zoom floor, adaptive labels, and 90-run history
  • db67e4b feat(scheduler): per-group period override via borgmatic-manager.period label and spec field
  • 4d65540 feat(state): member-level group cache so a stopped container's volumes keep being backed up
  • f2782e1 feat(status): add --json for machine-readable output
  • ddf640f fix(doctor): satisfy errcheck, gosec, govet shadow, and staticcheck lint
  • ba11808 fix(inspect): trend charts span at least 7 days with one tick per day
  • b2087d7 style(inspect): bold chart headers, rename new to delta

v1.7.1

Choose a tag to compare

@github-actions github-actions released this 18 Jul 23:31
1a906f3

Changelog

  • 1a906f3 fix(ci): update cosign version

v1.5.1

Choose a tag to compare

@github-actions github-actions released this 09 Jul 18:12
bb61da9

Changelog

  • 1aeff36 docs: mysql/mariadb helper-dump caveat in root-manager rootless mode
  • 126d6f5 docs: recommend the root-manager mode for rootless podman
  • 0c3d801 fix(cli): pad the bottom of the discover and status output blocks
  • 2cd0eca fix(dumps): reap orphaned helper containers by per-run label

v1.5.0

Choose a tag to compare

@github-actions github-actions released this 08 Jul 15:38
72475b1

Changelog

  • 9de4ad6 build: replace Make with mise tasks; CI runs everything through mise
  • 53c8e2a chore(v2): zero-issue golangci-lint pass
  • 4ebbec0 ci(release): gate tag releases on package verification; verify deb in CI dry-run
  • a4a7f37 ci: add borg build headers (xxhash, lz4, zstd) for the pipx source build
  • 029226d ci: point the entire podman e2e at podman via DOCKER_HOST
  • d4fb5fe config: default keep_hourly so the hourly period survives pruning
  • d2b2c52 docs(v2-05): README rewrite, CI pipeline, planning docs for the host model
  • d266168 docs: add comprehensive README with usage, labels, examples, and deployment
  • b39cb12 docs: correct README claims, document the label trust boundary
  • c18d552 docs: quadlet Label= lines need systemd-level quotes around the spec
  • 38479bc feat(01-01): define core data model structs with helper methods
  • 6a181a5 feat(01-01): initialize Go module and tooling configuration
  • fcdf69e feat(01-02): implement label parser (ParseDatabaseLabels, IsBackupEnabled, GetGroup)
  • 29e0fd6 feat(02-01): define ContainerRuntime interface and runtime types
  • a5b1d08 feat(02-01): implement DockerRuntime with Docker SDK
  • 387420a feat(02-02): add manager config loading and borgmatic config structs
  • 1f35a44 feat(02-02): implement DeepMerge with TDD
  • 93e5e0e feat(02-03): create MockRuntime and Discover function
  • 2517151 feat(02-04): implement borgmatic config generation
  • 736b5bd feat(03-01): implement Runner package with RunGroup and slog log streaming
  • bc4ad40 feat(03-01): implement runtime types, Docker SDK Phase 3 methods, and MockRuntime
  • 8bfb106 feat(03-02): implement DockerRuntime.EventStream with server-side filters
  • fde5689 feat(03-02): implement event listener with debounce and reconnect
  • 813620f feat(03-03): implement periodic scheduler with parallel group execution
  • 29b9039 feat(03-04): create main.go entrypoint with signal handling and DI wiring
  • 64f564c feat(03-04): implement orchestrator with startup sequence and main loop
  • 2e4d5e7 feat(04-01): add Dockerfile, .dockerignore, and fix mise Go version
  • 7506b39 feat(04-01): add default manager.yaml configuration
  • 951e836 feat(04-02): add Docker Compose deployment example
  • 9e1991a feat(04-02): add Podman Quadlet deployment examples
  • 677f24a feat(04-03): add concurrent borg 2.x integration test
  • 53e1531 feat(cli): charmbracelet UX — fang/cobra commands, styled logs and discover output
  • 2deedee feat(cli): discover shows per-group last-backup age in a spread layout
  • 8eb7b8a feat(cli): inset one-shot output from the terminal edges
  • 4f217fc feat(cli): quiet one-shot output with a right-aligned discovery summary
  • 69cab6e feat(cli): status command showing last run, result, and next due time
  • d651993 feat(config): conf.d drop-ins; package seeds /etc once and never touches it again
  • f00bbb2 feat(config): support borgmatic's !include tag in manager.yaml and groups files
  • 64a0346 feat(config): user-configurable archive_name_format with a {group} token and shared-repo guard
  • 38f9716 feat(config): volume-named archive paths via borg's /./ marker
  • 17f5ad1 feat(discovery)!: rename the backup label/field to enable
  • 033c6cb feat(discovery): detect quadlet quote-stripping in invalid spec labels
  • c0c1133 feat(discovery): teach the invalid-spec warning the accepted syntaxes
  • f559c60 feat(packaging): complete and validate the deb (lifecycle scripts, docs, package task)
  • 787bb83 feat(runtime): autodetect the container socket (docker, then podman)
  • 1226b8b feat(scheduler): persist the group schedule so restarts resume it
  • 84cc9e1 feat(status): capture create stats (files, sizes) from borgmatic --json
  • 0abb1bc feat(v2-01): host-path discovery, portable events, label schema v2
  • 2ea0139 feat(v2-02): host-mode config generation with DB modes and run metadata
  • 3075765 feat(v2-03): host-exec runner, lock discipline, preflight, minimal CLI
  • 1ab6e2e feat(v2-04): packaging — systemd units, goreleaser, Makefile, LICENSE
  • d31f601 feat(v2.1): container-only labels, helper-container dumps, config labels, borgmatic passthrough
  • ab05bdd feat(v2.1): one-label JSON spec as an alternative configuration style
  • 318efcf fix(cli): size the discover name column to the widest entry
  • fc5bac3 fix(discovery)!: invalid spec labels fail the cycle instead of shrinking the backup set
  • 65d06b0 fix(discovery)!: the spec label is strict JSON, as designed
  • f0afc5b fix(discovery)!: the spec's database field is 'db', matching the flat labels
  • 54c7515 fix(discovery)!: treat labels as untrusted input, fail loud on bad entries
  • 8272ade fix(discovery): an empty volumes filter means all named volumes, not none
  • 49fb8e5 fix(discovery): only skip optioned volumes when their data directory is actually empty
  • 514109a fix(e2e): pre-seed app-b's marker so the event cycle is deterministic
  • b3d1ab9 fix(events): close-safe trigger sends; stop tracking the core dump
  • fa0c5b8 fix(integration): support borg 1.x in concurrent test
  • 2ef73d6 fix(mise): compute the build version inside the task, not an [env] template
  • 5b60c22 fix(packaging): 0600 seeded config, install binary where the unit expects
  • 9b23a5e fix(packaging): restart a running service on upgrade
  • 71133c6 fix(runner): bound and signal config validation, record its failures
  • d5e0adc fix(scheduler): serialize cycles, join shutdown, honest attempt marks
  • 4c5ff01 fix: address code review findings
  • e8c11db fix: scoped reconcile, label-hook warning, cycle timeout, status refusals
  • b3176dd refactor(cli): render status with lipgloss table, color-coded results
  • 9d2c69e style(cli): bold white headings on discover and status
  • 31ca5c7 test(01-02): add failing tests for label parser
  • 75fd27a test(02-03): add discovery pipeline tests with mock runtime
  • 2455151 test(02-04): add failing tests for config generation
  • 0c87e7f test(03-01): add failing tests for runner package
  • 993fd39 test(e2e): dump stack state and logs when compose up --wait fails
  • cc57aac test(packaging): verify the deb on current distros (debian:trixie, ubuntu:24.04)
  • 452318d test(v2-03): end-to-end integration test of the host-service flow
  • 0ecb8c8 test(v2.1): e2e validates content, group isolation, and a real restore
  • 859bff9 test(v2.1): hermetic docker-in-docker end-to-end harness
  • 4d0de11 test(v2.1): mariadb end-to-end — FIFO-through-mount dump and restore roundtrip
  • 9d5efef test(v2.1): rewrite e2e around a declarative compose stack with healthchecks
  • a9cf4f0 tooling: add gh; ignore local mise config