You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fixes two backup-path bugs and adds the revision-browsing UI that was
implicitly requested by the "feat: local git repo" issue (local git
destinations already work; what was missing was a way to browse and
compare revisions in the web UI).
Bug fixes
- Manual backup trigger now honors the destination selection.
/backups/trigger previously dropped destination_ids on the floor and
fell back to "the first enabled local destination", so picking SMB +
local from the UI silently saved only to local. POST handler now
accepts destination_ids and the form renders a destination checkbox
group.
- Backup row now records every destination that actually received the
backup, not only the last. The text handler used to overwrite
destination_type/destination_path inside its save loop, so a backup
written to both local and SMB would only show one in the UI. A new
_summarize_results helper aggregates successful (dest_type, path)
tuples; destination_type is set to a comma-joined label ("local, smb")
and destination_path keeps the local copy when one exists so the
in-app Download / Delete buttons stay pointed at the local file.
- Proxmox / binary-archive backups now ship to every selected
destination, not only local. _handle_binary_backup used to call
_save_binary_local unconditionally and hardcode destination_type =
"local". Added an optional save_binary(hostname, data, extension,
config) method on DestinationBackend (default raises
NotImplementedError so git-style backends can be cleanly skipped);
LocalDestination and SMBDestination implement it. The binary handler
now loops destinations, records all that accepted the archive, and
only marks the backup failed when none did.
New UI
- Per-device backup history at /backups/device/<id>/history — full
timeline with First / Changed / Unchanged badges computed from
config_hash (no difflib per row) and checkboxes to pick any two
revisions to compare.
- Compare view at /backups/compare?a=<id>&b=<id> — unified diff
between any two backups of the same device. Normalises older→newer
automatically, handles identical configs, archive bundles, and
missing content with distinct banners.
- Destination badges: new partials/destination_badges.html renders
colored Bootstrap badges per destination type (local gray, smb teal,
git/gitea/github/forgejo blue); wired into list / detail / history.
- Backup detail gains "History" and "Compare with previous" buttons;
device detail's Backup History card gains a "View all / Compare"
link.
Housekeeping
- .dockerignore added to keep .env, *.db, ssh_keys/, backups/,
staging-backups/, venv/, .git/ out of the Docker build context
(previous builds baked all of these into the image).
- .gitignore adds staging-backups/* !staging-backups/.gitkeep so test
artifacts generated during local runs don't show up as untracked.
Verification
- tests/: 50 passed, 1 skipped (baseline: same on upstream 1.6.6)
- Unit smoke: multi-dest text save records "git, local, smb";
binary-to-SMB calls save_binary on local+smb, skips git with
NotImplementedError warning; binary-only-git fails cleanly with
"could not be written to any destination".
- HTTP smoke: history + compare routes render correctly, list +
detail + history pages show destination badges, trigger form
renders the destination picker.
- Upgrade smoke: running upstream _apply_migrations against the old
staging.db (alembic_version=d4e5f6g7h8i9, credentials.username NOT
NULL) correctly ran v09/v15/v16/v161/v161_repair and preserved all
3 credentials / 3 devices / 98 backups.
@@ -109,6 +109,14 @@ Open `http://<your-server-ip>:5005` — default credentials are shown during ins
109
109
110
110
## Changelog
111
111
112
+
### v1.6.7 (2026-04-23)
113
+
-**Per-device backup history** — new timeline view at `/backups/device/<id>/history` with "First / Changed / Unchanged" markers computed from config hash, and checkboxes to pick any two revisions to compare
114
+
-**Diff-any-two-backups view** — new compare page at `/backups/compare?a=<id>&b=<id>` renders a unified diff between arbitrary backups of the same device; handles identical-config, archive-bundle, and a/b-order-swap cases
115
+
-**Manual backup now honors destination selection** — the trigger form gained a destination checkbox group; the POST handler accepts `destination_ids` so manual runs write to the destinations you pick instead of falling back to "first local"
116
+
-**Multi-destination recording** — when a backup writes to multiple destinations (e.g. local + SMB), the `Backup` row now records all of them (`destination_type` = `"local, smb"`), displayed as colored badges in the list / detail / history views. Previously only the last successful destination showed
117
+
-**Proxmox → SMB / remote destinations** — binary/archive backups (Proxmox tarballs) now ship to every selected destination, not only local. New optional `save_binary(hostname, data, extension, config)` method on `DestinationBackend`; `LocalDestination` and `SMBDestination` implement it; git-family destinations are skipped with a warning (archives in git are unusual)
118
+
-**`.dockerignore`** — added to keep `.env`, `staging*.db`, `ssh_keys/`, `backups/`, `venv/`, `.git/`, and test caches out of the Docker build context
119
+
112
120
### v1.5.7 (2026-04-10)
113
121
-**SSH Proxy / Jump Host** — Netmiko and SCP engines can now connect through a bastion/jump host before reaching the target device. Useful for remote sites where devices are only reachable via an intermediate SSH server (e.g. autossh tunnels). Configure per device: proxy host, proxy port, and optionally a separate proxy credential when the jump host uses different credentials than the device
114
122
-**Separate proxy credentials** — Jump host and target device can authenticate with different username/password pairs, reusing the existing encrypted credential store
0 commit comments