One agent. Every machine you actually own.
The Borg Backup Server agent is a single stdlib-only Python file and a one-line installer. It runs on modern Linux, the enterprise distros nobody has retired yet, macOS, Windows, FreeBSD, NAS boxes, and even the set-top box in the living room. No inbound ports, no VPN, no per-OS builds to babysit.
If it has a shell, it’s probably on this list.
One installer detects the platform, picks the right package manager and service supervisor, and matches a borg build to the CPU, libc, and OS — automatically.
Package-manager installs, family by family.
The installer reads /etc/os-release, installs borg and Python the way that distro expects, and registers a service with whatever init system is actually running.
| Family | Distros recognised | How borg is installed | Service |
|---|---|---|---|
| Debian family | Ubuntu, Debian, Pop!_OS, Linux Mint, Raspberry Pi OS | apt |
systemd |
| Enterprise Linux | RHEL, CentOS, Rocky Linux, AlmaLinux | dnf / yum + EPEL; PowerTools/CRB enabled automatically; falls back to a server-hosted borg build |
systemd (SysV init on CentOS 6) |
| Fedora | Fedora | dnf |
systemd |
| Arch family | Arch, Manjaro, EndeavourOS, CachyOS | pacman -Syu (full sync — no partial upgrades) |
systemd |
| SUSE | openSUSE Leap & Tumbleweed, SLES | zypper |
systemd |
| NixOS | NixOS | nix-env; borg updates stay under your Nix config |
systemd |
Anything with /etc/os-release |
Any other distro | Install borg + python3 yourself, re-run the installer | systemd, SysV /etc/init.d, or OpenRC |
Still running CentOS 7? So are we.
Upstream borg binaries won’t even start on a glibc 2.17 system. Most tools shrug. BBS ships its own signed borg 1.4.x build for glibc 2.17 and serves it to those clients automatically, based on the glibc version the agent reports. Verified on real CentOS 7 hosts.
- CentOS 7 / RHEL 7 / Amazon Linux 2 and anything else on glibc 2.17 — a borg build that actually runs.
- Python 3.4 and up. The agent avoids anything newer — its own
subprocess.run()polyfill, no f-strings, nojson.JSONDecodeError— so Debian 8 and CentOS 6-era interpreters still work. - Old OpenSSH. Compatible with the OpenSSH CentOS 7 ships; the server keeps legacy
ssh-rsaavailable for older clients. - Non-UTF-8 locales. ASCII-locale systems with non-ASCII filenames are handled.
The agent reports its platform, architecture, and glibc; the server hands back the right binary and keeps it updated.
Macs, Windows boxes, NAS units, and the odd set-top box.
Containers & virtualisation
- LXC / LXD system containers (Proxmox and friends) — the installer judges by PID 1, so systemd, sysvinit, and OpenRC containers all work.
- Docker agent for hosts with no service manager — Docker hosts, appliances. See Docker Agent Setup in the wiki.
- Immutable hosts like NixOS keep borg under your own config.
NAS appliances
- Synology DSM — runs the Docker agent via Container Manager; mount shared folders into the container.
- TrueNAS SCALE — runs the Docker agent as a custom app with datasets mounted in.
- TrueNAS CORE — uses the native FreeBSD installer.
- Unraid — the BBS server has a Community Applications template; the Docker agent runs alongside it for local shares.
FreeBSD
- Detected natively; borg and Python installed via
pkg. - Installed as an
rc.dservice (bbsagent), using FreeBSD’spipconventions. - FreeBSD x86_64 borg binaries matched from upstream releases.
macOS
- Apple Silicon and Intel — universal wrapper; Homebrew at
/opt/homebrewor/usr/local. - Installer offers to install Homebrew, then installs borg + python3 as the invoking user — never as root.
- Runs as a launchd daemon with a code-signed
.appwrapper, so it shows up properly in Full Disk Access and can back up Desktop, Documents, Mail, and Photos. - Works with the stock bash 3.2;
caffeinatekeeps the Mac awake during backups.
Windows
Pre-release- Windows 10 (1607+), Windows 11, Server 2016 / 2019 / 2022 / 2025 — 64-bit.
- Zero-dependency PowerShell 5.1 one-liner: bundles an embeddable Python runtime and Borg for Windows. No WSL, no Cygwin, no Python install.
- Runs as a native Windows Service with automatic restart on failure.
- Drive-letter aware file browser and restore (“This PC” root, multi-drive restore).
- The installer refuses Windows 7 / 8 / 8.1 and Server 2008 R2 / 2012 / 2012 R2 with a clear message.
Embedded & unusual
- Enigma2 set-top boxes (Dreambox, OpenATV, OE-Alliance) — detected via
/proc/stb, reporting image name and version. - Dropbear SSH on BusyBox / embedded Linux — the agent spots
dbclient, rewrites unsupported SSH flags, and converts the server-issued key to Dropbear format. - armv7l boards (older Raspberry Pi and friends) — runs; borg auto-update is skipped where pip isn’t available.
Synology and TrueNAS support is community-run via the Docker agent — the agent runs on them; there is no DSM- or SCALE-specific package.
Small, outbound-only, and self-maintaining.
One file, stdlib only
A single Python file with no dependencies — nothing to pip install, nothing to break on upgrade.
No inbound connections
Polls the server over HTTPS and backs up over SSH to the server. Works behind NAT, CGNAT, and strict firewalls.
Centrally version-managed
The agent self-updates from the server; borg binaries are matched to each client’s platform, architecture, and glibc.
Wake-on-LAN
Sleeping machines are woken before their scheduled backup window.
Plugins run client-side
MySQL, PostgreSQL, MongoDB, and shell-script hooks run on the client before the backup starts.
What’s not on the list.
A short list, kept deliberately honest.
Not supported
- Alpine / musl-based Linux — no musl borg build. May work if you install borg yourself.
- OpenWrt routers
- 32-bit Windows
- Windows Server 2012 R2 and older
One line. Any platform.
Every client gets its own one-liner from the BBS Add Client → Install tab, with the server URL and enrolment key already filled in.
Your fleet is more mixed than you think.
Ubuntu on the web tier, a CentOS 7 box nobody will touch, a Mac Studio in design, Windows Server in accounting, a Synology under someone’s desk. One server, one agent, one place to see all of it.