Releases: marcpope/borgbackupserver
v2.51.1
Bug-fix release. Server 2.51.0 → 2.51.1, agent 2.29.8 → 2.29.9.
Fixes
- Backup progress showed nonsense like "83 GB of 17 B" (#234): borg 1.4 fires
progress_percentevents during backup for internal phases where current/total are item counts, not bytes. The agent was forwarding those asbytes_total. Now restore-only. - Long file paths still overflowed the queue-detail card (#233): earlier #108 / #209 fixes wrapped text inside the progress card, but the page column itself (
.main-content, a flex child) lackedmin-width: 0, so unbreakable strings could blow past the viewport regardless. Site-wide fix. - Dashboard "Errors (24h)" tile linked to all errors (#232): the link had no time filter, so clicking the 24h count showed errors days old. LogController now accepts
?hours=Nand the tile passeshours=24. - OIDC login broken on PHP 8.4 (#231):
jumbojett/openid-connect-phpdeprecation warnings (implicit nullable params) hit the response body before the redirect Location header, triggering "headers already sent". DropE_DEPRECATEDfor the OIDC call so upstream's noise stays out of our output. - Archive delete marked completed despite agent stall-abandon (#227):
archive_deletewas missing from the agent's stall-detection exclusion list, so agents flagged it abandoned ~30 min into a long delete; then scheduler's unconditional finalize UPDATE clobbered the resulting 'failed' with 'completed'. Both fixed (exclusion list + finalize scoped toWHERE status='running'). - Upgrade page stretched to full viewport on wide displays (#226): wrapped in a 1100px max-width centered container so steps and release-notes paragraphs stay readable.
v2.51.0
The brand-cleanup work continues. This release is primarily UI polish — consistent visual language across the app, smaller and tighter type, less noise in the activity log, plus a few real bug fixes. No database changes; safe in-place upgrade.
UI overhaul
- Card headers — one consistent style. Settings (light blue), Clients (transparent), and Dashboard (dark gradient) used three different palettes for what should be the same thing. Standard
.card-headeris now a subtle neutral surface in both themes; the dark navy gradient on Dashboard / Schedules / Archive Detail collapses to the same neutral in light mode so a light page is never broken up by a dark block. - Tighter type, site-wide. Card headers shrunk from ~16px to 14px. Table headers switched from ALL-CAPS 13.6px to mixed-case 14px. Table body cells capped at 14px (was Bootstrap's 16px default). Topbar page title and username dropdown nudged down ~2px each.
- Storage Locations page — three floating
<h5>section titles ("Local Storage", "Remote SSH", "S3 Offsite Sync") replaced with proper card-headers. Each section now has a card frame with the action button (Add Location / Add SSH Host) inside the header, matching the rest of the app. - Schedules page colors toned down. Per-agent block colors went from
hsl(h, 55%, 45%)tohsl(h, 32%, 38%)so they sit in the dark-navy palette instead of looking like a saturated bar chart. - Server Health card (dashboard) — fixed-width label and value columns so every progress bar starts and ends at the same x-coordinate across rows. Smaller, tighter type. No more dead whitespace between bar and short values like "0.48".
- Recent Activity on the client status tab — list reformatted as a proper table (Status / Task / Repo / Time / Date), 14px text, 20 rows instead of 10.
table-responsiveso it scrolls horizontally on phones. - Sidebar version pill — was illegible in light mode (gray-on-dark-navy). Now uses light-on-dark colors hardcoded since the sidebar is always dark.
- Mobile login gets a small header logo above the form (uses your branded navbar icon if set, otherwise the favicon mascot). Form pane fills the screen on phones.
- Light theme login is back. Auth layout now respects the Login Page Theme override in Branding settings (which is also re-enabled — was temporarily disabled while the light variant was missing).
Branding system
- New "App Icon / Favorite Icon" upload in Branding settings. Single 512×512 transparent PNG; BBS resizes it on demand to every favicon / Apple touch / PWA size needed. No more uploading half a dozen sizes manually. Bundled mascot is the default fallback.
- Navbar Icon description now mentions it doubles as the small mobile-login header logo.
- Topbar mascot image was 1536×1024 / 2.4MB shipping for a 115px display. Resized to 400×266 / 82KB — ~30× smaller. (#223)
- Static-asset caching added via
mod_headersinpublic/.htaccess: 7-day cache for images and fonts, 1-day for CSS/JS. Previous behavior issued a conditional GET on every page load.
Bug fixes
- Activity log noise filtered. Routine borg warnings (
Permanently added <host> to known hosts,file changed while we backed it up,stat: [Errno 2]on transient files) no longer flag a backup as "completed with warnings" or fire a notification. Added-o LogLevel=ERRORtoBORG_RSHto suppress the SSH known-hosts notice at the source. Agents pick this up via the auto-update mechanism. (#225 / #223) - Upgrade page no longer cropped by the login mascot artwork. The post-upgrade result page now suppresses the split-pane art and uses the full frame for the upgrade log. (#222)
- Long file paths in
/notificationsnow wrap properly instead of overflowing the message column off the right edge. - Queue page duration (PR #207 by @c0dr1ver) — durations ≥ 1 hour now format as
Hh Mm Ssinstead of dropping the hour. Completed-row durations also get a colored progress bar showing relative job length. - Files in Archive count (#192) — tile now headlines the catalog-derived count (what's actually navigable in the restore browser); borg's
nfilesshown as a small caption only when it differs by more than 1% (typical on systems with heavy hardlinks where borg over-counts).
Heads-up
If you've customized the Branding section, the navbar-icon and login-logo upload limits changed in v2.50.0. The new App Icon section is additive — your existing logos still work. The Login Page Theme override is functional again in light mode.
AGENT_VERSION bumped to 2.29.8; existing agents will pick this up via the server-pushed update mechanism. No manual reinstall needed.
v2.50.1
Patch release with two fixes and one small UI improvement on top of v2.50.0.
Fixes
-
Backup jobs no longer fail when borg's cache lock cleanup hiccups (#214). Borg occasionally raises
borg.locking.NotLockedat the very end of a successful backup when releasing its local cache lock — the archive is already written and intact, but the cleanup error caused BBS to mark the job as failed. The agent now detects this specific case and reports the job as completed with warnings instead of failed. The full traceback is preserved in the job log so the underlying cause is still visible. BumpsAGENT_VERSIONto 2.29.7; existing agents will pick this up on the next server-pushed update. -
Smaller PNG payloads across the UI (#220). All bundled PNG assets compressed via
pngquant— no visual change, just smaller files and faster page loads. Thanks to the contributor for the PR.
UI
- Mobile login screen now shows a header logo. The split-pane art is hidden on phones, so the form pane was previously untethered from any branding cue. Phone widths now show an 88px logo above the form. Falls back through: branded navbar icon (if set in Branding settings) → bundled mascot favicon as default. The larger login-page logo is intentionally not used on mobile because it's sized for a 500px column and would crowd a phone-width pane.
Heads-up
If you saw the SSH lockout from the brief chown root:root authorized_keys change earlier today: that was reverted before this release was tagged. v2.50.1 ships the corrected behavior — authorized_keys is back to user-owned mode 600, which is the supported configuration.
v2.50.0
A fresh start on branding
This release kicks off a brand cleanup that's been a long time coming. There's a new mascot logo, a redesigned login screen, and rebuilt favicon/PWA icons — all wired through a new branding system that lets you upload larger custom logos and see the new defaults in the preview pane.
What's new
- New mascot logo in the topbar, on the login screen, and across favicons (browser tab, Apple home-screen, PWA install).
- Redesigned login page — split-pane layout with the mascot artwork on the left, a glassy feature ribbon, drifting binary-stream background, and a unified dark theme across login / forgot-password / 2FA / reset-password.
- Branding settings rework — bigger upload limits (Navbar Icon up to 360×200, Login Logo up to 800×800), preview pane that mocks the actual rendering, and the default-fallback previews now show what the app actually ships with rather than a stale legacy icon.
- Files-in-archive count (#192) now headlines the catalog-derived total (what's actually navigable in the restore browser), with borg's
nfilesshown as a small caption when it differs noticeably — it can run 2-3× higher on systems with heavy hardlinks.
Heads-up if you rely on custom branding
The branding system still needs more work. Upload limits and preview rendering have changed, the login page is dark-only for now (the Login Page Theme override is temporarily disabled while the design settles), and not every screen has been re-checked against custom logos yet.
If you've customized BBS with your own logo or login theme, please test this release on a non-production install first to see how things look before rolling it out on a production server. If the new defaults work for you, you'll have the smoothest upgrade path.
What's coming
There's still a lot of interface work ahead. Expect more polish landing in the coming weeks — small fixes, larger redesigns, and more thoughtful defaults across the dashboard, schedules, and settings screens. This release is the starting point, not the finish line.
I hope you like the new logo. It's here to stay.
v2.29.5
Server bumps from 2.29.1 → 2.29.5 to re-align with the agent (also at 2.29.5).
Fixes
- Queue list / detail badges (#208): Running, Sent, and Queued now use Bootstrap 5.3
text-bg-*tokens to match the Dashboard — no more cyan-on-white or white-on-yellow. - Queue detail overflow (#209): when borg's
status_messagecontains a long file path, the running progress card no longer stretches past the viewport. The original #108 fix only covered Directories / Borg Options / log content. - Import existing repository (#210): the local-storage branch had been dropped from the dispatch in an earlier refactor, so POSTing the import form for a local repo returned no body and the browser sat on a blank
/repositories/import. Restored theelsebranch that callsimportLocal(). - Queued agent updates blocking backups (#206): management tasks (update_borg / update_agent) bypassed the slot-count check on the way in but still incremented the counter on the way out, so a batch of queued updates for offline agents could fill the imaginary slot budget and block backups. Counter now stays in sync with the bypass.
- Schedules view (#202, thanks @c0dr1ver): current-time indicators on the schedule view, dashboard duration formatting fixed for jobs over an hour, and missed-schedule alerts surfaced on the dashboard.
Features
- Telegram thread/topic support (#205, thanks @c0dr1ver): Apprise notification setup now has an optional Thread field that emits
tgram://bot_token/chat_id:thread, for groups with topics enabled. - Dropbear SSH key conversion (#201, thanks @MegaV0lt): install.sh now detects a Dropbear
sshand runsdropbearconvertso the server-issued OpenSSH key works on embedded systems (OpenATV / Enigma2 receivers, etc.). Plus a follow-up agent change so the same conversion runs whenever the agent re-downloads the key after an auth failure (e.g. after a server-side rotation).
v2.29.1
Highlights
🐋 New: Containerized agent image
The BBS agent now ships as a Docker image for hosts where the native installer isn't practical — TrueNAS Scale, Synology DSM, unRAID, UGreen NAS, and any appliance OS where you can't persist a system-installed package.
docker hub: marcpope/borgbackupserver-agent:latest
- Multi-arch (
linux/amd64andlinux/arm64) - Includes borg, ssh, and clients for MySQL, PostgreSQL, and MongoDB so one image covers every backup type
- Self-updates from the server on protocol bumps; reset by pulling a new image tag
- Fully documented in the Docker Agent Setup wiki page
Bring it up with a docker-compose.yml that mirror-mounts the host paths you want backed up — see the wiki for examples. Addresses #193.
Bug fixes
- Restore jobs now report failure correctly. Previously
borg extractwarnings (exit code 1) were treated as success and a path-filter mismatch returned 0 with no error — both showed a green check on the queue page. Restores now fail loudly when borg reports warnings or extracts nothing. - Restore stats are accurate. The Stats panel for restore jobs (Files Total / Files Processed / Bytes Total / Bytes Processed) used to be empty or show byte counts in the file fields. All four are now populated correctly using
borg extract --listoutput. - Restore triggers land on the queue detail page. Previously, manually triggering a file/MySQL/Postgres/Mongo restore redirected back to the client page, forcing you to navigate to Queue and find the new job. Now restores land directly on
/queue/<job_id>, matching the existing manual-backup behavior.
v2.29.0
Fixes
- Server Health layout (#199): label column now content-sized (left-aligned, ellipsis past 140px) so short labels like CPU/Memory hug the card edge and the progress bars keep the rest of the row on narrow cards.
- Badge consistency (#200): solid-color badges across the app now use Bootstrap 5.3's
text-bg-*tokens so text contrast is automatic and uniform. Semantic "info" (log-level badge, Upgrade Agents pill, notification Info/New pills) switches from cyan to blue where the cyan+white combo was hard to read. - Manual borg updates now register (#198): the agent re-reports system info hourly, so clients that can't use auto-update (e.g. armv7l without pip) will have their version picked up on the server within an hour of a manual install. AGENT_VERSION bumped to 2.29.0 to match.
Polish
- Footer: "Open Source & Made with ❤ by Marc Pope — Sponsor" replaces the standalone heart/Sponsor link; footer text size trimmed a notch.
Agent and server versions now match at 2.29.0.
v2.28.9
Bug Fixes
- Windows installer (#195): Fresh installs failed with a
DirectoryNotFoundExceptionwhen writing the SSH-path marker file. The installer now createsC:\ProgramData\bbs-agent\up front before any writes. - Dedup savings display (#191): Rounding lifted 99.95%+ to
100%even when the repo still held bytes on disk. The dashboard, storage cards, email reports, and archive detail now clamp at99.9%when dedupe size is non-zero. - borg lock timeout (#194): Agent-side
borg createandborg extractran without--lock-wait, so borg's 1-second default turned any brief lock contention into an immediateFailed to create/acquire the lock ... (timeout)failure. Agent commands now pass--lock-wait=600(10 minutes), matching the server-side operations. - Mail settings (#197): The Email Settings UI had no encryption control and the Mailer hardcoded STARTTLS for port 587 only, so SMTP servers on port 465 (implicit TLS) just hung. Added an Encryption dropdown (STARTTLS / SSL/TLS / None) with a port-based default, and taught the Mailer and Test SMTP button to honor it. Also fixed Test SMTP passing the still-encrypted password to AUTH LOGIN.
v2.28.8
Fixes
- ClickHouse self-heal (#189): container start now also repairs mode bits (not just ownership) and stops hiding chown errors. Resolves
directory_iterator: Permission denied/ASYNC_LOAD_WAIT_FAILEDon thefile_catalogtable and surfaces real problems on FUSE filesystems (Unraid/mnt/usershfs) where ownership changes are silently dropped. - Failure email mislabels the task (#185): every failed task (update_borg, check, prune, compact, catalog_rebuild, …) now sends an email with the correct label instead of always saying "Backup Failed".
- Email time in user's timezone (#186): the
Time:line in notification emails is now formatted in each recipient's configured timezone with the zone abbreviation (e.g.CEST) instead of always UTC. - Upgrade gate blocked by offline agents (#184): the server-upgrade precheck now ignores jobs stuck
sentto an offline agent, and skips management/server-side task types — matching the filter the queue scheduler already uses. - Daily borg-update spam on unsupported arches (#187): agents whose architecture has no GitHub or server-hosted binary (armv7l, some BSDs) are no longer auto-queued for daily updates they can't complete. Manual Update Borg from the client page still works.
- Backup duration formatting (#190, thanks @c0dr1ver): completion logs and notifications now show
1h 12m/27m 5sinstead of raw seconds. - CachyOS support (#188, thanks @ChrSchu90): agent installer recognizes CachyOS alongside Arch/Manjaro/EndeavourOS.
v2.28.7
Bug fixes, enhancements, and UI polish. Agent bumped to v2.25.1 for the restore-progress change.
Fixes
- Daily email report counted only one repo per client (#175): the report picked a single "last backup" per client, so clients with two or more backup plans reported only one plan's size and file count. It now aggregates the latest completed/failed backup per plan per client and sums size and files across all of them. Clients with a mix of ok and failed plans now show as "Partial" (orange) so it's visible at a glance.
- "Last generated" timestamp always showed the current time (#176): the scheduler regenerates the day's report every minute to keep numbers fresh, and an earlier fix was bumping
created_aton every regenerate. Now only the manual "Generate Report Now" button updates the timestamp; scheduled refreshes leave it alone. - Restore stuck on "Starting task..." (#168):
borg extractnow runs with--progressand the agent forwardsprogress_percentevents so the UI shows a live progress bar during restore, matching the backup experience. - Schedule page descenders clipped on hover (#171): the
:hovertransform was scaling the block, which clipped the bottom pixel row of letters like g/p/y. Replaced with a stronger box-shadow — same lift cue without the clipping. - Repo detail status badges hard to read (#169): warning/info badges now use
text-darkfor contrast instead of default white-on-light.
Enhancements
- Auto-update stops re-queueing up-to-date agents (#174): the daily
update_borgsweep compares each agent's current borg version against the target and skips the ones already at or past it, instead of re-installing the same binary every day. Log line now breaks out queued vs already-current vs incompatible counts. - Per-user low-storage alert thresholds were already added in 2.28.5 — if you missed it, each user now sets their own trigger (percent used or free GB) under Profile → Account → Low-Storage Alerts.
- Activity icons on Dashboard Recently Completed (#172): same task-type icon vocabulary as the Queue page — backup / prune / compact / restore / update / etc. — so the two pages read consistently.
- Server Health drops redundant root row (#178): when
/var/bbssits on the root filesystem, the widget no longer shows/and/var/bbsas two identical rows. - Clients sorted alphabetically (#182): the Clients list is now sorted by name instead of creation order.
- Version prefix consistency (#170): the Clients page showed raw version numbers where the rest of the app said
v<num>; aligned them.