Releases: lugoues/borgmatic-manager
Releases · lugoues/borgmatic-manager
Release list
v1.10.0
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
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...
v1.8.0
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
Changelog
- 1a906f3 fix(ci): update cosign version
v1.5.1
v1.5.0
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