Skip to content

Changelog โ€‹

All notable changes to DBackup are documented here.

v4.0.2 - Rate Limit and Session Security, MySQL Restore Fixes, and a Faster Dashboard โ€‹

Released: Oct 12, 2026

๐Ÿ› Bug Fixes โ€‹

  • auth: A session ends after the length set under Settings > Sign-in, counted from the sign-in. Every session was extended by seven days on each visit, so the setting never took effect and nobody who came back once a week was ever signed out.
  • MySQL: A MySQL or MariaDB restore into a database of another name keeps binary data and text byte for byte. It replaced bytes that were no valid UTF-8 and could split a long row in two.
  • MySQL: Turning TLS off works with every client tool. Backups and restores of MySQL 5.7 failed with the MariaDB client of the Docker image, and the client of MySQL 8.0 or later failed over SSH.
  • WebDAV: A destination whose folder holds no backup yet no longer logs an error after every run.
  • website: The home page and the roadmap no longer scroll sideways on phones, and the cards of the roadmap fit the screen.

๐Ÿ”’ Security โ€‹

  • auth: A client can no longer get around the rate limits, among them the one on sign-in attempts, or put another address into the audit log by naming it in X-Forwarded-For. DBackup reads the header only from a reverse proxy in a private network or one named in TRUSTED_PROXIES, which also takes cloudflare for the edge servers of Cloudflare.
  • auth: The rate limits count an IPv6 address by its /64 network, so a client cannot take a new address for every request.

๐ŸŽจ Improvements โ€‹

  • dashboard: The Overview loads several times faster on instances with many jobs, destinations and a long history.
  • history: The History page counts its filters without reading the log of every run, and shows its rows and numbers loading instead of an empty list.
  • storage: A finished backup scans only the destinations of its job again instead of every destination.

๐Ÿ“ Documentation โ€‹

  • website: The answers on supported versions name the versions the test lab runs.
  • wiki: The testing guide describes the tests that exist and how to write one.
  • wiki: A new Dev Lab page explains how to run DBackup against every database engine and destination for development.
  • wiki: The installation guide explains how DBackup finds the address of a client behind a reverse proxy or Cloudflare and when to set TRUSTED_PROXIES.

๐Ÿงช Tests โ€‹

  • e2e: End-to-end tests with Playwright replace the integration tests against single containers and run the Docker image beside the servers of the dev lab. They back up and restore every database engine, a folder and to every destination with the content compared, and go through the first start and a backup in the browser.
  • tests: The tests of the configuration backup, Recently deleted and the restore at startup now run with the unit tests in CI.

๐Ÿ”ง CI/CD โ€‹

  • ci: Validate also runs the end-to-end tests after an approval, on pull requests into main and on those into dev that touch the app or its end-to-end tests. A last job of Validate passes once every other check passed.
  • docker: An image built from a checkout no longer contains the development database of that checkout.
  • lab: A dev lab starts every database engine, storage server and notification receiver in Docker and fills the dev database with the first user, all connections and sample jobs. pnpm lab shows its commands in a menu, with a status that says what runs, what is missing and what to run next.
  • scripts: The Multipass test VM, the old test containers with their seed scripts and four unused one-off scripts are removed.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v4.0.2
  • Also tagged as: latest, v4
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v4.0.1 - Offline First Start, Docker Socket and Rsync Fixes, and Updated Guides โ€‹

Released: Oct 10, 2026

โœจ Features โ€‹

  • website: A new integrations page lists every database, storage and notification adapter with a search. PostgreSQL, MySQL, MariaDB, MongoDB and Redis each have a page of their own in English and German.
  • website: The website is in German as well as English, follows the language of the browser and offers Auto, English and Deutsch to choose from. The blog posts are translated as well.

๐Ÿ› Bug Fixes โ€‹

  • docker: A new container starts without internet access. The image ships the Prisma schema engine, which every first start downloaded from binaries.prisma.sh before.
  • jobs: The None option of the PostgreSQL dump compression says that DBackup compresses the dump, not the whole backup.
  • Recovery Kit: The instructions in the kit and the help of the tool say that --extract writes into the folder it is given.
  • Rsync: A run over rsync no longer warns that it could not create /home/nextjs/.ssh/known_hosts. (#178)
  • website: The preview pictures of the site and of every blog post are sent as images again, so link previews can show them.
  • website: The post on vendor lock-in names the right restore tools for PostgreSQL and Redis and describes the Recovery Kit as it works today.
  • website: The home page no longer shows a weekly summary that DBackup does not send.
  • website: The website no longer hangs on an iPhone or iPad, and taps there respond right away. Phones and tablets keep its large effects still, show plain frames instead of the spinning borders and draw the glows without a blur.

๐ŸŽจ Improvements โ€‹

  • docker: An unreadable Docker socket now names the fix in the error, which is running DBackup with PGID set to the group that owns the socket (#167).
  • website: Every blog post has an illustration and a color of its own that its page takes on, and it shows the GitHub avatar of its author.
  • website: Search engines and link previews get a title, a description and a picture for every page, a sitemap without redirects and richer structured data for the app and the blog.
  • website: The plain text of a message for structured data and social cards keeps no stray angle bracket.

๐Ÿ“ Documentation โ€‹

  • docs: The Docker Volumes guide names the group ID to run DBackup with when the socket is not readable, says why group_add and user: do not work and what to do on a host whose socket belongs to no docker group (#167).
  • docs: The contributing guide asks that issues and pull requests made with AI are tested on a real setup before they are opened.
  • docs: The README says how independent researchers have reviewed DBackup so far, with a link to the published security advisories and to the documented backup format.
  • docs: The developer guide describes the steps of a release.
  • wiki: The guides for PostgreSQL, MySQL, MongoDB, Redis and Valkey describe the tools, the archive and the restore of the current version, and no longer promise Sentinel, the oplog or restore options that do not exist.
  • wiki: The pages on encryption, compression, verification, destinations and the Recovery Kit describe the archive and dbackup-recover.js as they work today.
  • wiki: The development setup lets the setup scripts install Node and pnpm, instead of the newest Node from Homebrew on macOS.

๐Ÿ”ง CI/CD โ€‹

  • ci: The release groups the entries of each changelog section by component, in the order of the alphabet, so the lines about one part of DBackup stand together.
  • ci: Every pull request writes its changelog entries into a file of its own, which the release collects into the changelog, so pull requests no longer conflict over it.
  • ci: The release thanks the author of a pull request from outside the project at the end of each of its changelog entries, with a link to the pull request.
  • ci: The dev server allows the hosts of BETTER_AUTH_URL and TRUSTED_ORIGINS, so hot reload also works when it is opened from another machine.
  • ci: The Docker build of a pull request into main runs as its own workflow, so a release no longer lists it as a skipped job.
  • ci: The Docker build of a pull request into main waits for one approval instead of one per platform, so a run sends a single review request.
  • ci: A .node-version file pins Node 24 for local development, the version CI and the Docker image use.
  • ci: The setup scripts for macOS and Debian install Node in the version of .node-version and pnpm 10, through fnm on macOS and NodeSource on Debian.
  • ci: The Debian setup script installs the Firebird 5 client tools gbak and isql as well as lz4 and zstd, like the Docker image.
  • ci: The Debian setup script now installs the MongoDB Database Tools on Ubuntu, where its apt source named the wrong component.
  • ci: The Debian setup script runs through a second time instead of stopping at the PostgreSQL signing key it already wrote.
  • ci: The version bump runs through on Linux as well, where it stopped at the OpenAPI files.
  • ci: The release no longer refuses a version whose beta the changelog lists already.
  • ci: pnpm toolbox shows the release and maintenance commands in one menu, and each still runs on its own.
  • ci: The version bump stops at CodeQL alerts open on dev until you confirm, and pnpm codeql:check lists them on its own.
  • ci: pnpm release:tag tags the release on main with the title from the changelog and pushes the tag, and pnpm release:untag deletes a tag here and on GitHub.
  • ci: pnpm changelog:amend adds the fragments to a version block the version bump wrote already.
  • ci: pnpm audit:check runs pnpm audit for the app, the docs and the website.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v4.0.1
  • Also tagged as: latest, v4
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v4.0.0 - Redesigned Interface, Global Search, Air-Gapped Destinations, and Recently Deleted โ€‹

Released: Oct 4, 2026

โš ๏ธ Before updating: Back up the database first. Stop the container and copy the folder mounted at /data, or at least /data/db with every dbackup.db file in it. The first start of this version runs all database migrations, which can take a while on an instance with a long history. Leave the container running until its log shows All migrations have been successfully applied, since a container stopped halfway leaves a migration marked as failed and the next start stops with an error.

โš ๏ธ Breaking: Retention now follows a renamed job into the folder of its old name, where its backups stayed untouched until now. The first run of such a job after updating removes the backups there that its policy no longer keeps, all at once. Locked backups stay, so lock anything in the old folder you want to keep before updating. The Backups page lists those backups under the job, and the retention step of that first run names every folder it looked at.

โš ๏ธ Breaking: The configuration backup is a copy of the whole database now, always encrypted, and restores only as a whole. One that was on without an encryption key fails until a key is picked under Settings โ†’ Configuration backup. A restore replaces the database, so what was added after the backup is gone and the history becomes the one of the backup, which is empty without Include the history. A single deleted key, login, connection, job or user comes back from Settings โ†’ Recently deleted instead, and the JSON files of older versions still restore in parts.

โš ๏ธ Breaking: The API no longer returns the configs of the connections a job uses, neither in GET /api/jobs nor in the answer to creating, changing or cloning a job, where a connection keeps its id, name and adapterId. GET /api/jobs also moved lastRunAt and nextRunAt to overview.lastRun.startedAt and overview.nextRunAt, lists the exclude presets of a folder as excludePatternPresetIds and leaves out updatedAt and the id of each destination entry.

๐Ÿ’™ Thank you to everyone who reported bugs and shared ideas for this release. DBackup stays free and open source, and if it saves you time, you can now support it through GitHub Sponsors.

โœจ Features โ€‹

  • ui: Every page is redesigned in a new color palette where dialogs, menus and buttons take the color of their task, with a sidebar that collapses to icons and a search in the header, Ctrl+K or โŒ˜K, that finds every job, connection, backup, run, person and setting you may open. Lists show their numbers as tiles and a dot on their tab for what needs a look, open a record in a side panel, offer its actions with a right click and turn into cards on a phone.
  • ui: Tables keep the columns, the order and the row height each user picks, and the profile sets the rows per page, now up to 100, and the row height every table starts with.
  • dashboard: The overview names a failing job and can run it again, shows trend cards, switches between the latest runs and the jobs and fits its backup calendar to the screen. It also works on phones.
  • setup: The Quick Setup is one page with its parts one under the other and the backup they add up to beside them. Every part takes a connection or key you have or adds a new one on the spot.
  • setup: Someone who may set DBackup up starts on the Quick Setup after signing in while there is no database, directory source, destination or job yet. The Overview stays one click away in the sidebar.
  • connections: The Connections page shows every connection with its status, response time, health checks of the last day, the jobs that use it and its last backup, as a table, as cards or as a list with the details beside it. Several connections turn their health alerts, their use for restores, their integrity checks or their air-gapped state on or off in one step.
  • connections: A new connection starts from one searchable list of types grouped by kind, and its form shows one part at a time with what is done or still missing. The folder of an S3, SFTP, FTP, WebDAV, SMB or Rsync connection is picked in a browser of its folders before it is saved.
  • jobs: The Jobs page shows each job with its last run, its error or live progress, its latest runs, its destinations and its next run, plus a timeline by the hour with the queue and a list of every planned run. The file names of a job warn when two runs would get the same name and overwrite each other.
  • jobs: The job form shows one part at a time with what is done or still missing, picks connections, keys and templates from searchable lists that also add new ones, and has parts of its own for compression and for incremental backups with a drawing of the chain. The schedule is picked as hourly, daily, weekly, monthly or cron, with the next runs and a warning when runs would wait for a free slot in the queue.
  • jobs: The API trigger dialog creates a key with the two permissions the API needs and fills it into every script and pipeline example.
  • docker: The volume picker of a job lists the volumes by Compose stack with the containers that mount each one, and shows which containers the job stops in which order.
  • storage: The Backups page lists every backup with the destinations that hold a copy and marks a missing one, as a table, a timeline by day or cards. Its Destinations tab shows the status, size, growth and alerts of every destination and changes the alerts of several at once.
  • storage: A backup opens with its copies, its chain, its content and its last integrity check. Download... packs any mix of its databases and folders into one tar.gz or writes a curl, wget or PowerShell command for a server, and Verify integrity checks one copy or all of them.
  • storage: A destination connected only now and then, like a USB disk or a NAS that is only on for its backups, can be marked Air-gapped. While it is away, runs skip it and stay a success, it raises no offline alert and no missing copy, and an optional notification reports the first run that left it out.
  • restore: The restore page shows each database of a backup beside the server it goes to with what happens to it, and restores a backup with databases and folders in two steps.
  • Redis: The restore of a Redis or Valkey backup writes one script for a Docker container, a Compose service, a Linux service or a Windows service, or shows the same commands step by step. The script checks that Redis will read the dump before it stops anything and keeps the old dump.
  • explorer: The Database Explorer lists every database of every server with the jobs that back it up and its last backup, shows the tables and rows of a database live and restores one database from a day of its timeline. Its Servers tab shows every server with the versions it ran and marks one too old for its newest backups.
  • history: The History page lists backups, restores, system tasks and notifications in one place. A run opens as a page with its steps, a summary of each step, its live progress and its log with every problem told once in plain words.
  • vault: The Vault lists saved logins with the connections that use them and encryption keys with a Key ID, the jobs and backups they protect and their last recovery kit. A new key offers its recovery kit right away, and Import key reads a key back from one.
  • templates: The Templates page lists retention policies, file names, schedule presets, notifications and exclude patterns with everything that uses them. Editing a retention policy shows what the next run removes, and deleting a template names what depends on it.
  • users: Users & Groups has tabs for users, groups, API keys, the audit log and SSO, with a side panel for every row. Admins set the password and end the sessions of a user, groups are edited area by area with a sentence for every permission, and API keys start from a task like CI/CD and can be edited without a new secret.
  • audit: The audit log tells every entry as a sentence with the address, browser or API key it came from and what changed before and after, and marks a sign-in from a new place. A timeline shows who did how much on which day, and Export CSV downloads the entries the filters keep.
  • SSO: A new sign-in provider is set up beside the steps to take in the provider, its client secret is never shown again, and the people it adds join a group picked for it instead of starting without one.
  • settings: The Settings page lists its parts with the state of each and a search, keeps changes in a bar until they are saved, and shows the system tasks and the system notifications as lists with their schedule, last run, channels and a test.
  • settings: Deleted keys, saved logins, connections, jobs and users wait under Settings โ†’ Recently deleted for 30 days, where they come back with everything that belonged to them. The message after a delete offers Undo.
  • settings: The new system task Optimize the database gives the unused space of the database back to the disk on the first of every month.
  • auth: Settings โ†’ Passwords sets what a new password needs, as Basic, Standard, Strong or rules of its own, which every password field ticks off and the server enforces. The login page is redesigned and can show a picture of your own.
  • config: The configuration backup is a copy of the whole database, so it brings back everything, and a restore shows what the backup holds before it replaces the database and restarts DBackup. A new instance restores one on its sign-up page with the key from its recovery kit.
  • profile: The Profile page is built like Settings, renames passkeys, makes new backup codes and sets the colors of every task, like Add, Edit and Delete, from a set like Colorblind friendly or one of your own.
  • api: The new GET /api/jobs/{id}/runs returns the latest runs of a job with its success rate, GET /api/jobs/schedules the schedules with the slots of the queue and GET /api/jobs/timeline the runs of every job a week back and ahead. POST /api/adapters/bulk also switches the health alerts, restores, integrity checks and air-gapped state of several connections.
  • api: New endpoints find anything with GET /api/search, list runs with GET /api/history/runs, databases and their servers with GET /api/databases and backups across every destination with GET /api/storage/explorer. GET /api/notification-logs filters by channel and adds the numbers of the last 30 days with stats=true.
  • website: The home page, the blog and the roadmap have a new design in a dark and a light theme, with a live backup run in the hero and the dialogs of the app to try out. The roadmap runs shipped work and plans along one timeline, and the blog has a table of contents in every post and an RSS feed.
  • notifications: Every mail has the look of the app, with a banner in the color of its status, the key numbers as tiles, errors in plain words and buttons that open the run, job or destination. It follows dark mode, names the instance as its sender, says why it was sent and is also what Send test sends.

๐Ÿ› Bug Fixes โ€‹

  • MySQL: Backups of MySQL and MariaDB hold stored procedures, functions and events and read InnoDB tables from one snapshot, as the guide always said, with three switches under Options to turn them off. A login that may not read events or routines gets a warning in the run instead of a failed backup.
  • Rsync: A directory source over rsync copies exactly the files its backup lists, with the exclude patterns read like everywhere else, and its folder tree works on servers without GNU find, like macOS or a NAS with BusyBox. Files in nested folders went missing before, and the run failed on a file that never arrived.
  • Rsync: An incremental backup of a directory source over rsync transfers only the files that changed. It pulled the whole source again on every run. (#166)
  • Rsync: Cancelling a run stops a running rsync directory transfer. It waited for the whole folder to arrive first.
  • Rsync: A directory source over rsync with a large tree, like 20,000 files, no longer fails while listing them with stdout maxBuffer length exceeded. (#168)
  • Rsync: Additional rsync options like -avz reach rsync as they were written. They turned into --avz before, which rsync refuses.
  • ssh: An ed25519 key generated in DBackup always works now. About one in 256 came out a byte short and never connected, so a key like that needs to be generated again.
  • retention: A job named like a deleted one no longer deletes the backups the deleted job left in its folder.
  • jobs: A run of a job waits while another run of the same job is still going, and every run keeps its temporary files in a directory of its own. With more than one queue slot, two runs could plan the same step of an incremental chain or write into the same file before.
  • jobs: A cloned job keeps the retention policy of each destination, its naming template, its integrity checks and its incremental settings, which fell back to the defaults before.
  • jobs: A finished backup no longer loses the list of its databases and destinations to the last write of its log.
  • jobs: A cron expression the scheduler cannot read can no longer be saved to a job, a schedule preset or a system task, and a deleted schedule preset hands its schedule to the jobs that followed it right away.
  • jobs: The schedule picker shows its times the way the scheduler runs them, instead of converting them through the time zone of the browser.
  • templates: The default retention policy and the default file name template can no longer be deleted or unset, and the built-in policies can no longer be deleted. Destinations that followed the default kept every backup without a word before, and jobs without a template could write files named {name}_ and a date.
  • templates: The preview of a naming template ends in .tar like the backup files and shows the time of the scheduler's time zone, instead of .sql and the time of the browser.
  • templates: The exclude groups of DBackup skip folders like node_modules, .git or .Spotlight-V100 at any depth of a backed up folder, where they matched only at its top or not at all. An incremental job with such a preset starts a new full backup on its next run.
  • storage: The storage history chart shows a destination that shrank with a minus sign.
  • storage: A destination that cannot be listed keeps the size and count of its last successful scan instead of an estimate, and the dashboard shows how old they are. The scan of a local destination no longer fails when retention deletes a backup while it runs.
  • restore: Someone who may restore but not download can restore folders, which the count of the picked files turned down before.
  • vault: Deleting an encryption key that a job or the configuration backup still uses is refused, where the job went on without encryption before.
  • api: The examples of the API trigger and the skyfay/dbackup:ci image end on a Partial or Cancelled run, where they waited forever, stopped with an unknown status or timed out. The CI image exits with 2 for a Partial run and waits up to an hour, set with DBACKUP_TIMEOUT.
  • api: GET /api/notification-logs and GET /api/notification-logs/{id} answer 403 instead of 500 to a caller without history:read.
  • connections: Authorizing a cloud drive again checks the new token instead of still reporting the old one as expired, and the file browser of a path field answers a missing login or permission with 401 or 403 instead of a server error.
  • users: Deleting a user or a group and resetting a second factor ask first, and an account can no longer delete itself. The members of a deleted group move to a group picked for them instead of losing all access.
  • users: A user created by an admin gets a group right away and no longer starts with an open session nobody signed in with.
  • audit: The audit log records sign-ins through SSO and the reset of a second factor, keeps the name of a deleted user and finds the names in its entries.
  • audit: The filters of the audit log keep every picked value instead of only the first.
  • notifications: The reminder picked for a system notification is saved and can be turned off, also for storage alerts, and each event names its own default. Every save dropped it before, so reminders kept coming every 24 hours.
  • notifications: Send a test of a system notification reports a failure when nothing went out and also works while the event is off, and removing the last own channel of an event no longer sends it to the default channels without a word.
  • notifications: A system task that stops with an error sends A system task failed, once until it runs through again. The event was listed but never sent.
  • notifications: Tab moves on from the recipients of an email channel instead of staying in the field.
  • config: A configuration restore onto a new instance no longer stops on a foreign key error and names what it could not bring back. A job whose key does not come back is paused instead of backing up unencrypted, and users with a second factor are no longer locked out. (#171)
  • config: The configuration backup deletes its oldest files again as Keeps says, and a new one shows on the Backups page right away.
  • config: Restore from a file takes configuration backups up to 10 MB, where it failed on any file over 1 MB.
  • settings: A system task set to run at start no longer runs again whenever a job or a setting is saved, and Run now answers right away and never starts a task that runs already. A task started through the API names the API key in History, and the schedule of the configuration backup applies again on instances that came from an older version.
  • settings: A new self-signed certificate keeps the old one when openssl fails, and an uploaded EC or Ed25519 key is checked against its certificate like an RSA key.
  • settings: The certificate no longer shows HTTPS as off when it cannot be read, or as expired on its last day. A certificate upload that fails no longer leaves its dialog loading.
  • settings: Passkey sign-in can no longer be turned off while DISABLE_EMAIL_LOGIN and no sign-in provider leave it the only way in.
  • SSO: Deleting a sign-in provider no longer counts people with a passkey among those who cannot sign in afterwards, and its callback URL starts with BETTER_AUTH_URL instead of the address the admin opened DBackup at.
  • profile: The profile picture takes files up to 5 MB, as the page says, where it failed on any picture over 1 MB.
  • profile: The sessions of the profile name an iPhone or iPad as iOS instead of macOS.
  • auth: A rotated API key shows the same eight characters of its start in the list as a new one, where it showed four.
  • ui: Copy buttons work on an instance served over plain HTTP, like an address in the local network, and say so when a copy fails.
  • ui: An instance without internet access no longer waits up to 5 seconds on every page for the check for new versions.
  • ui: A page opened after the session ended leads to the login page instead of a page that does not exist.

๐Ÿ”’ Security โ€‹

  • auth: The browser can no longer create an account once the first one exists. Anyone could sign up before, and an account made with the email of someone who later signed in through a provider got linked to them with a password its maker knew.
  • auth: An API key never does more than the group of its owner, checked at every request, and rotating the key of someone else needs a group that may do everything the key may. Anyone who may change API keys could give a key any permission before.
  • auth: The rate limits count over their whole window again. The counters started over every 30 seconds, which allowed twice the sign-in attempts in a window of a minute.
  • profile: What a group may change of the own profile, like the email, the password or the second factor, now holds on the server too, where only the page hid the buttons. Change password refuses a wrong current password, which it took before, so a signed-in browser was enough to change it.
  • users: Only a SuperAdmin moves, deletes, signs out or resets the second factor of a SuperAdmin, and nobody changes their own group. Anyone who may change users or groups could do so before, up to giving their own group every permission.
  • SSO: Only a SuperAdmin manages sign-in providers, a disabled provider signs nobody in, and a provider adds new people only when it is set to, which the browser decided before. The SSO tab no longer sends client secrets to the browser, and the Keycloak provider checks its URL like the others.
  • config: Only a SuperAdmin restores a configuration backup, which brings back users and groups, and Restore from a file writes the upload only into the temp folder, whatever path its name holds.
  • jobs: Listing, creating, changing and cloning a job no longer answers with the stored configs of its connections, and notification templates no longer send those of their channels. Reading jobs or templates was enough to get them before.
  • vault: The Vault no longer sends the stored key of an encryption profile to the browser when it lists, creates, imports or renames profiles.
  • connections: The health history of a connection needs the read permission of its kind, and the folder browsers of Google Drive, Dropbox and OneDrive need the right to change destinations. Reading any kind of connection was enough for both before.
  • connections: The file browser of a path field no longer follows a link into a system folder like /proc, the Google Drive folder browser only takes real folder IDs, and the Dropbox and OneDrive browsers turn down a path with a .. part.
  • audit: Changing, deleting and cloning a job, restores, downloads and deletes of a single backup, cancelled runs, settings, config imports, sign-in providers, revealed keys, sign-outs and failed sign-ins are written to the audit log. The browser can no longer write sign-ins of its own.
  • Rsync: rsync starts without a shell, so a path or file name with a semicolon or a pipe can no longer run a command on the DBackup server. The unmaintained npm package rsync is gone.
  • deps: Next.js is updated to 16.3.8 in the app and on the website, which closes a critical remote code execution in next/og, and nodemailer 10 closes five advisories in the email notifier. adm-zip, basic-ftp, undici, nanoid, @xmldom/xmldom and nine more packages move to patched releases.

๐ŸŽจ Improvements โ€‹

  • storage: Download links for databases and folders stream, so the first bytes arrive at once instead of after the whole download was written to a temp file, and a tar.gz of several databases and folders packs about twice as fast.
  • connections: Deleting connections leaves out the ones a job or a notification template still uses and names them first, and the Connections page and the dashboard stop asking for updates while their browser tab is hidden.
  • auth: While OIDC_AUTO_REDIRECT sends the login page to a provider, the page offers another way to sign in. A passkey that counts as the second factor is asked for right after the password, without a field for a code.
  • history: Cancel run asks before it stops a run and says that a stopped restore may leave its database half restored.
  • ui: An error shows a page of DBackup with Try again and an ID to find it in the log, and an unknown address a page with a way back, where both showed the bare page of Next.js before. Every page names its browser tab and shows the shape of its content while it loads.

๐Ÿ”„ Changed โ€‹

  • ui: The Storage Explorer is called Backups and sits under Backup in the sidebar, Access Management is called Users & Groups, and the system tasks, the system notification events and the lists of the Connections page have names that say what they hold. Links to the old addresses still lead to the new pages.
  • api: Deleting a job, a connection or a saved login through the API moves it to Recently deleted like in the app, also in bulk. ?permanently=true, or "permanently": true in a bulk request, deletes it for good and needs settings:write.
  • api: GET /api/adapters/{id}/health-history averages only the checks that passed and adds the slowest one, since when the status holds and when a check last passed. The success rate of GET /api/dashboard/stats counts a partial run as one that did not succeed.
  • api: POST /api/storage/{id}/download-url takes databases and selections like restore-files and returns the link as data.url with data.token and data.fileName, and a GET with the token tells its maker whether the link was fetched. A download that broke off can run again with the same link.
  • api: POST /api/settings/system-tasks turns down an unknown task or a schedule the scheduler cannot read with 400, and PUT answers 409 while the task runs already. GET also returns the last run of each task with what it did and the setting it follows.
  • settings: The configuration backup includes the history by default, and run logs are kept for a year instead of 90 days. An instance that saved either setting before keeps its choice.
  • settings: Check for updates and the stuck run watchdog follow their settings under General, so each has one switch. An update turns the setting off once where only the task was off.
  • system: The Database versions task also lists the databases of every server with their sizes, which the Database Explorer shows without asking the servers.
  • profile: A new password from Change password signs you out of every other browser, and profile pictures live in the database, so they come back with a configuration backup. Pictures saved by earlier versions move there on the first start.
  • api: A profile picture loads from GET /api/avatar/{userId} instead of /api/avatar/{filename}.
  • auth: A new API key runs out after 90 days unless another end is picked, and two keys can no longer share a name.
  • vault: Importing a key the Vault already holds is refused with the name of the key that has it.
  • SSO: The provider ID of a sign-in provider can no longer change once it is saved.
  • notifications: The title of every notification names the job, connection or destination first, like postgres-nightly failed, in every channel. Its times follow the time zone under Settings โ†’ General instead of UTC.

๐Ÿ—‘๏ธ Removed โ€‹

  • dashboard: The job status donut and the year picker of the backup calendar are gone. Past years stay available through GET /api/dashboard/calendar?year=.
  • explorer: The General and Version History tabs of the Database Explorer are gone. The timeline marks each new version of a server and the page of a server lists every version it ran.
  • history: The System Tasks tab and the log dialog of the History page are gone. The system tasks are a group of the Type filter, and a run opens as a page of its own.
  • connections: The red banner about credential profiles from the update to 2.0.0 is gone. A connection without its login still says so in its row.
  • config: The Include secrets switch of the configuration backup is gone. Every configuration backup holds the secrets now and is always encrypted.

๐Ÿ“ Documentation โ€‹

  • docs: Every guide follows the new pages, with new guides for the Backups page, History, the Database Explorer, the audit log, Settings and Recently deleted. The guides of connections, jobs, templates, the Vault, users, groups, API keys and SSO describe their new tabs, panels and dialogs.
  • docs: The guides no longer describe what DBackup does not do, like a storage:write permission, several email domains for one SSO provider or the {name} token of file names. The MySQL guide names the dump flags DBackup really passes and the rights a backup and a restore need.
  • api: The API reference documents the new endpoints, like the search, the runs of a job and of the History page, the Database Explorer, the backups of every destination, the folder browser of a connection and download links, and lists every bulk endpoint and bulk action again. The download of a recovery kit has its real address.
  • docs: The developer guide explains the task colors, the adapter form, how audit entries and deletes are kept and how the configuration backup copies the database.
  • docs: A security policy explains how to report a vulnerability privately, and the contributing guides base every pull request on the dev branch.
  • docs: The docker run examples write both secrets to a .env file once and read it with --env-file, so a container made again for an update keeps its keys.
  • docs: The installation guide backs up the right database folder before an update and says to leave the container running until the migrations are done.
  • docs: The README is shorter and opens with a banner of the new interface on a desktop and a phone instead of a video of the old one.

๐Ÿงช Tests โ€‹

  • tests: New tests cover the new pages and the server code behind them, from Settings, Recently deleted and the configuration backup to air-gapped destinations and the MySQL dump flags, partly against real SQLite files and database containers.
  • tests: The design guard also catches boxes that scroll sideways and checks the primitives, and its baselines are at zero. New guards check that every dashboard page has a loading state and a title, that the retired connection pages redirect and that both copies of the API reference match.

๐Ÿ”ง CI/CD โ€‹

  • ci: Lint, type check, unit tests and the docs build also run on pull requests into dev, not only into main.
  • ci: Every pull request also lints and builds the website.
  • ci: A pull request into main can also build the Docker image for amd64 and arm64 without publishing it and check that it starts, once a maintainer approves the run.
  • github: The repository shows a Sponsor button for GitHub Sponsors, and a daily workflow draws the sponsors into the Sponsors section of the README.
  • deps: The pending patch and minor releases are picked up across the app, the website and the docs, among them React 19.3, Better Auth 1.6.33, Zod 4.6, Vite 8.3, ESLint 10.12 and the AWS SDK. tar-stream stays on 3.2.0 and webdav on 5.10.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v4.0.0
  • Also tagged as: latest, v4
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v3.4.0 - Single Database Restores and Downloads, Data Retention Improvement, and Bug Fixes โ€‹

Released: Sep 16, 2026

โš ๏ธ Breaking: Jobs that back up only databases now write a seekable .tar archive instead of a single .sql.gz.enc style file or a TAR of dumps. Restoring and downloading inside DBackup work for old and new backups alike, but scripts that pick up backup files directly have to handle the new layout. An encrypted archive is read with the Recovery Kit's --extract mode, so download a fresh Recovery Kit, since older kits do not verify dump checksums. An unencrypted archive unpacks with plain tar -xf.

โœจ Features โ€‹

  • restore: Single databases can be restored out of a multi-database backup, and only that database is read from the destination. (#140)
  • storage: A single database can be downloaded out of a backup from the Storage Explorer, the restore page or the API with the storage:download permission. (#138)
  • jobs: Microsoft SQL Server, Azure SQL Database and SQLite sources can now be combined with directory sources in one job.
  • vault: Encryption profiles can be renamed and their description edited from the Encryption Vault. (#161)
  • history: Execution logs and History entries can be cleaned up automatically after a set period under Settings โ†’ General โ†’ Data Retention. Runs that a job still builds on are always kept.
  • settings: A new Database section under Settings โ†’ General shows the size of the DBackup database and optimizes it with VACUUM. SuperAdmins can also download a copy of the database file.

๐Ÿ› Bug Fixes โ€‹

  • backup: Backups with directory sources recorded their uncompressed size as the backup size. They now record the size of the stored archive.
  • api: A databaseMapping sent as an object of renames to POST /api/storage/{id}/restore is now applied. Restores of backups with directory sources ignored it before and restored every database under its original name.
  • storage: A prepared download that is cancelled in the browser no longer leaves its temp file behind on the server.
  • backup: An incremental chain whose full backup is missing from the execution history now starts a new chain instead of growing past its maximum age.
  • MySQL: Dumps against a MySQL server older than 5.5.3 no longer force the utf8mb4 character set, and a --default-character-set in the Additional Options now overrides the default. The job also warns when the detected version is below the supported minimum. (#151)

๐Ÿ”’ Security โ€‹

  • recovery-kit: --extract no longer writes a database dump outside the output folder when the database name contains path separators.

๐ŸŽจ Improvements โ€‹

  • history: History, the dashboard and the job queue stay fast on instances with tens of thousands of runs.

๐Ÿ”„ Changed โ€‹

  • backup: Every backup job now writes the seekable archive format, including jobs that back up only databases. Backups in the older formats stay restorable and downloadable.
  • storage: Analyzing and browsing a backup accept the storage:download permission as well as storage:restore.
  • mongodb: A job without a database selection now fails with a message asking to select the databases when the backup user cannot list them. Before, mongodump ran without a database and backed up whatever that user could read.
  • settings: The retention settings moved from Job Execution into their own Data Retention card with clearer names, where the health check retention can now be set too. Detailed execution logs older than 90 days are now removed by default while the runs stay in History.

๐Ÿ“ Documentation โ€‹

  • docs: The restore, Storage Explorer, Recovery Kit, API and archive format guides describe single database restores and downloads out of a seekable archive. A new developer page lists the code that still serves the older backup formats.
  • docs: The encryption guide describes renaming an encryption profile.
  • docs: A new guide explains what each data retention setting removes and how to optimize or download the DBackup database.

๐Ÿงช Tests โ€‹

  • tests: New integration test dumps, packs, extracts and restores one database of every test container through the seekable archive.
  • tests: New unit tests cover execution history cleanup, database maintenance, the database download route and cancelled downloads.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v3.4.0
  • Also tagged as: latest, v3
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v3.3.1 - Dashboard Stats Endpoint, Bug and Security Fixes โ€‹

Released: Sep 13, 2026

โœจ Features โ€‹

  • api: New GET /api/dashboard/stats endpoint returns the figures from the dashboard overview cards for homepage widgets and monitoring. It needs the new dashboard:read permission. (#155)

๐Ÿ› Bug Fixes โ€‹

  • postgres: A pg_dump that fails at connect time, for an unreachable host or a wrong password, now fails the backup instead of shipping an empty file to every destination as a successful run. The same race is closed for mysqldump on MySQL and MariaDB. (#154)
  • runner: The stage a backup failed in is now closed with a red failed line in the execution log instead of a green completed one.
  • history: Activity Logs, System Tasks and Notification Logs now page through the whole history on the server instead of stopping at the newest 100 entries. Nothing was ever deleted, older runs were only hidden.
  • history: The Status filter on Activity Logs and System Tasks now offers Partial, which was missing even though partial runs appear in the list.
  • ui: Long connection, destination and template names in dropdowns are now cut off with an ellipsis instead of overflowing into neighbouring fields and buttons. (#158)

๐Ÿ”’ Security โ€‹

  • deps: Next.js is updated to 16.3.5, which closes two critical advisories in the image optimizer and on Windows hosts. The bundled sharp is raised to 0.35.4 for the same libheif fix.
  • deps: nodemailer is updated to 9.1.1 and the pinned brace-expansion versions are raised, closing four high advisories in the email notifier and in file source exclude patterns.

๐Ÿ”„ Changed โ€‹

  • api: GET /api/history accepts page, pageSize, scope, type, status, trigger, search and facets query parameters and returns the total count. Without parameters it still returns the newest 100 executions.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v3.3.1
  • Also tagged as: latest, v3
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v3.3.0 - Azure SQL Database Support, S3 Upload Rework and General Improvements โ€‹

Released: Aug 15, 2026

โš ๏ธ Breaking: Retention now decides how old a backup is from the creation time DBackup recorded in its .meta.json, not from the file's modification time on the destination. Where the two still agree, which is the normal case, the same backups are kept as before and nothing needs doing. Where they were pulled apart, by moving a destination or copying it without preserving timestamps, retention keeps a different set from the next run onwards. That is the intended fix, because a reset modification time collapses the whole history into a single bucket and costs almost all of it, but it does mean the first run after updating can delete backups the run before it kept. Open the retention step of that first run and look for lines naming a backup whose recorded time and modification time disagree. Lock anything you cannot lose before a destination is moved.

โœจ Features โ€‹

  • retention: Smart (GFS) policies can now keep an hourly tier next to daily, weekly, monthly and yearly. The field stays hidden behind Add hourly tier until it is needed, so existing policies keep their behaviour unchanged.
  • azure-sql: New Azure SQL Database source type in beta, backing up through a BACPAC export.

๐Ÿ› Bug Fixes โ€‹

  • settings: The System Timezone now accepts renamed zones such as Asia/Kolkata and Europe/Kyiv, which were refused with Invalid IANA timezone in browsers that offer the modern name. Around 140 zones were affected, and the picker now also keeps the stored zone selectable in browsers that only know its legacy name. (#147)
  • retention: A policy whose mode carries no settings, such as Smart with no tiers stored, now keeps every backup instead of deleting all of them. Only configurations written through the API could reach this state.
  • mssql: Azure SQL Database and Azure SQL Managed Instance are now refused up front with a message naming the product, instead of connecting successfully and then failing partway through a backup with a raw T-SQL error. Both are also named correctly in the connection test, where they previously showed as SQL.
  • mssql: The Database Explorer now lists databases on servers that do not expose sys.master_files, showing names and table counts without sizes rather than failing the whole page with Connection Failed.
  • mssql: Restoring a database under a different name now places its files in the instance's own default data and log directories, which is what makes such a restore work against a SQL Server running on Windows. A database holding more than one data file no longer has all of them moved onto the same file. (#148)
  • s3: Listing a bucket now returns every object instead of stopping at the first 1000. Because the cut fell alphabetically and backup names carry timestamps, the newest backups were the ones missing from retention, integrity checks, the destination browser and the dashboard.
  • s3: Empty files now appear in listings on S3, Cloudflare R2, Hetzner Object Storage and S3-compatible providers. They were dropped along with folder markers, which left them out of directory backups and made them read as deleted everywhere a listing decides what still exists.

๐Ÿ”„ Changed โ€‹

  • retention: Backups are now sorted into their hourly, daily, weekly, monthly and yearly buckets by the creation time DBackup recorded when it wrote them. The file's modification time on the destination is only used for backups that have no recorded time.

๐ŸŽจ Improvements โ€‹

  • retention: Retention policies are now validated before they are saved. A negative, fractional or non numeric tier is rejected instead of stored.
  • retention: Reading backup metadata at the end of a job now runs up to 8 requests at once on S3, WebDAV, Dropbox, Google Drive, OneDrive and local destinations, and skips backups the listing already shows have no metadata. FTP, SMB, SFTP and rsync stay sequential because each read there costs a connection or a process.
  • retention: The run log now names any backup whose recorded creation time disagrees with the destination's modification time by more than an hour, and reports how many backups supplied their own time.
  • s3: Backups now upload to S3, Cloudflare R2, Hetzner Object Storage and S3-compatible providers in 8 parallel parts of 8 MB instead of the AWS SDK's 4 parts of 5 MB. A 1.29 GB archive to R2 moved at 27 MB/s before the change while the same run read and hashed it locally at over 400 MB/s.
  • s3: New Parallel Upload Parts setting on every S3 backup destination sets how many parts upload at once and how large each one may be, up to 32 parts of 64 MB. The form shows how much memory the chosen combination uses per upload.
  • s3: Part size now adapts to the backup being uploaded, never above the configured maximum. A part size too large for a given archive used to leave connections with nothing to upload, which cost a 1.39 GB backup to Cloudflare R2 a third of its throughput at 32 parts of 64 MB.
  • s3: The run log now records upload throughput and the part size actually used. Throughput was only ever shown in the live progress detail, which is gone once the run ends.
  • s3: Backing up a directory from an S3 destination now reports progress while the listing runs and stops within one request when the job is cancelled. Both previously waited for the entire listing to finish.

๐Ÿ“ Documentation โ€‹

  • installation: The installation guide now recommends mounting /tmp so a running backup is staged outside the Docker disk, and the compose and run examples carry the volume. The file backup guide and the environment reference explain the same thing where disk space comes up. (#145)
  • developer-guide: The setup guide now points at the platform setup scripts instead of listing a shorter set of packages beside them. It also warns against installing libpq for PostgreSQL, whose pg_dump is built without LZ4 and ZSTD and breaks native compression.
  • mssql: The guide now covers SQL Server on Windows, from the form the backup path has to take to setting up SSH mode against the Windows OpenSSH server. An SMB share is documented as the fallback where that server is unavailable. (#148)

๐Ÿงช Tests โ€‹

  • tests: The adapter transport lint guard no longer fails under load. It imports the entire adapter registry and was running against the default 5 second limit, which every new adapter moved a little closer to the edge.

๐Ÿ”ง CI/CD โ€‹

  • docker: The image now ships SqlPackage and the .NET runtime, which the Azure SQL Database source needs. This adds roughly 270 MB on both linux/amd64 and linux/arm64.
  • scripts: The macOS and Debian development setup scripts now install SqlPackage, which the Azure SQL Database source needs. On macOS it lands in the Homebrew prefix and is wrapped so it needs neither a PATH entry nor a DOTNET_ROOT variable.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v3.3.0
  • Also tagged as: latest, v3
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v3.2.0 - Docker Volumes Backup, SSH Key Generation, MongoDB Atlas Support, and Bug Fixes โ€‹

Released: Aug 8, 2026

โœจ Features โ€‹

  • docker: New Docker Volumes source (beta) that reads volume contents through the local Docker socket or from another host over SSH. Volumes are picked from a list of what the daemon can see, and any container holding one is stopped while it is read unless the source says otherwise.
  • credentials: An SSH credential profile can now generate its own keypair instead of taking a pasted one, in Ed25519, RSA 4096 or ECDSA and with an optional passphrase. The private key is created on the server and stored encrypted, and the public key is shown with a copy button and a .pub download so it can be installed on the host. (#143)
  • MongoDB: Sources can now reach MongoDB Atlas and other clusters that publish an SRV record. A hostname under mongodb.net is recognised on its own, and any other cluster can ask for the same by writing its host as mongodb+srv://your.host.
  • MongoDB: The Host field now takes a comma-separated seed list, so a replica set or a pair of mongos routers can be reached without a connection URI.

๐Ÿ› Bug Fixes โ€‹

  • credentials: Renaming an SSH credential profile or changing its description no longer fails with a validation error. The dialog submitted an empty secret payload whenever it was opened for editing.
  • ui: The credential profile dialog now scrolls when its content does not fit the window. The lower part was cut off instead, with no way to reach the buttons.
  • MongoDB: Connecting to an Atlas cluster no longer fails with getaddrinfo ENOTFOUND. DBackup built a plain mongodb://host:port connection for a hostname that only resolves through SRV.
  • MongoDB: A trailing slash, a scheme or a port pasted into the Host field no longer breaks the connection. The field is now read the way it is written.
  • adapters: Testing the connection of a saved source no longer fails for secrets that live in the config rather than in a credential profile, such as MongoDB's deprecated inline URI. The test ran against a config the saved source never had, so it failed while backups from the same source kept working.
  • adapters: Connection forms prefill the fields that carry a default again, such as a port or a base path. They had silently stopped being filled in for every adapter.
  • storage: Restore now opens for backups whose job name, source name, path or file name holds characters outside Latin-1, such as Chinese, Cyrillic, Greek, Hebrew or emoji. The button previously did nothing at all and only left an encoding error in the browser console. (#139)
  • storage: Downloading a file whose name is not plain ASCII no longer fails with a server error. The name is now sent as UTF-8 and arrives intact instead of mangled.

๐Ÿ”’ Security โ€‹

  • MongoDB: A password carried inside a connection string is now masked in the run log. Only a password passed as its own argument was masked before.

๐ŸŽจ Improvements โ€‹

  • restore: The progress line now shows how many bytes have been restored next to the file count, the way a backup already does.
  • adapters: A connection form with a mode picker now asks for a mode instead of leaving the area below it blank until one is chosen.

๐Ÿ”„ Changed โ€‹

  • backup: A shadow copy is now released as soon as the source that needed it has been collected, instead of at the end of the run.

๐Ÿ“ Documentation โ€‹

  • docker: New guide for the Docker Volumes source, covering socket access, what stopping containers does and does not promise, and the current limitations.
  • MongoDB: The source guide now describes how to reach Atlas, an SRV cluster and a replica set, and drops the connection URI field that the form has not offered since v2.6.0.

๐Ÿงช Tests โ€‹

  • MongoDB: Added unit tests for how the Host field is read, covering SRV clusters, seed lists, pasted connection strings and log masking.
  • adapters: Added unit tests for filling a submitted config back up with the secrets of the saved config it belongs to.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v3.2.0
  • Also tagged as: latest, v3
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v3.1.0 - SSH Connection Mode for MSSQL, SSH Transport rewrite, and Bug Fixes โ€‹

Released: Aug 1, 2026

โœจ Features โ€‹

  • mssql: SQL Server sources can now use SSH connection mode, like every other database source. The connection to SQL Server is tunnelled through SSH, so the SQL Server port no longer has to be reachable from DBackup, and backup files travel over that same connection with no separate file transfer setup. Certificate validation stays intact through the tunnel. The existing File Transfer setting is untouched and keeps working exactly as before for sources that connect directly, so no existing SQL Server source needs any change.

๐Ÿ› Bug Fixes โ€‹

  • backup: A failed run wrote its error into the log twice, and the second copy was styled as ordinary output because it carried an ERROR: prefix instead of the error level.
  • MSSQL: Testing an SQL Server connection now verifies that SQL Server and the SSH account mean the same backup directory, rather than only checking that the path exists over SSH. A containerized SQL Server writing into its own copy of that path passed the test and then failed the backup with nothing but "No such file", which the download error now explains too.
  • mysql: Restoring a database under a new name over SSH no longer corrupts the dump when the name contains a slash, backslash or ampersand. The rename was performed by a remote sed expression that the database names were pasted into; it now runs as a stream rewrite, the same one direct restores already used.
  • redis: Restore preparation on an SSH source queried the wrong server. It ran redis-cli from DBackup against the host field, which in SSH mode describes the database as seen from the SSH server, so the reported data directory and RDB filename were wrong or the step failed outright.
  • redis: Browsing keys over SSH no longer breaks on key names containing quotes or spaces. The key list was pasted into a remote shell command and is now passed as separate arguments.
  • firebird: The health check on an SSH source reported the connection as healthy whenever SSH itself worked, even when the Firebird server behind it was down. It now opens the database port as reachable from the SSH host.
  • sqlite: Browsing tables over SSH no longer fails on a database path or table name containing a quote or a space. The path and the query were assembled into a remote shell command and are now passed as separate arguments.
  • mongodb: Listing collections and browsing documents over SSH no longer break on a database or collection name containing a single quote. The query script was pasted into a quoted remote shell command and is now passed as one argument.
  • mongodb: A single-database restore no longer streams the archive through the client's standard input. It reads the archive from a path, the same way multi-database restores already did, which removes a source of truncated restores on large archives.

๐Ÿ”’ Security โ€‹

  • restore: Trimming trailing slashes off a restore target path used a regular expression that runs in quadratic time on a long run of slashes, letting a crafted target path occupy the server. Reported by CodeQL as js/polynomial-redos.
  • MSSQL: The SSH connection test now rejects a backup path that is empty or carries control characters, instead of passing whatever the request sent on to the server. It also probes the directory with the same file transfer the backup uses, rather than a remote shell command, so the check exercises what has to work and the path never reaches a command line. Remote arguments were already quoted, so this closes no known hole.
  • storage: The same quadratic slash trimming was still in use for the S3 path prefix, the Dropbox and OneDrive folder path, the SMB share, directory downloads, file exclusion patterns, and the ntfy and Gotify server URLs. All seventeen now use the linear-time helper.

๐ŸŽจ Improvements โ€‹

  • paths: Slash trimming moved into one shared helper that cannot backtrack, replacing the three hand-rolled copies that had drifted apart.
  • ssh: Added a transport layer that models direct and SSH connections as interchangeable implementations of one interface. Commands are now described as argument lists rather than assembled shell strings, so remote quoting lives in a single tested place instead of being repeated at every call site.
  • ssh: A backup or restore now opens one SSH connection for the whole run instead of one per adapter call. A combined backup of ten databases previously performed twelve separate handshakes against the same server.
  • health check: The per-adapter timeout now runs inside the connection scope. Previously a check that timed out while still connecting left its socket open, once a minute for every unreachable source.
  • mysql: SSH-mode dumps now use the same version-aware options as direct dumps. Previously the SSH path built a smaller set of arguments by hand and missed them, so a MySQL 8 dump taken over SSH did not get --default-character-set=utf8mb4.
  • mysql: Listing databases with sizes now falls back to a plain listing when information_schema is unreadable. A least-privilege backup user previously saw an error instead of the database list in direct mode.
  • postgres: Connecting, listing databases and reading sizes now run through one code path for both connection modes, so the two no longer differ in which errors they report or how they fall back between the postgres, template1 and configured databases.

๐Ÿ“ Documentation โ€‹

  • MSSQL: The SQL Server guide now documents the new SSH connection mode, and states which settings apply to direct connections only. The supported-engine tables listed SQL Server as direct-only with SSH available for file transfer.
  • MSSQL: The "Backup Permission Denied" fix now covers containers, where SQL Server runs as UID 10001 and the advice to grant the mssql user access does not apply.
  • sources: The connection mode overview was missing Firebird from the list of adapters that support SSH mode.
  • wiki: The developer guide now documents the transport layer, replacing the sections that described the removed SSH client.

๐Ÿงช Tests โ€‹

  • ssh: SSH mode is now covered by automated integration tests against a real SSH server, for MySQL, MariaDB, PostgreSQL, Redis, Valkey and SQLite. It previously had none, and every SSH code path was rewritten in this release.
  • ssh: Added a lint guard that rejects transport branching in adapter code, direct process spawning and hand-written escaping, and checks that every source offering SSH credentials actually resolves a transport.
  • paths: Added coverage that slash trimming matches what the regular expressions produced and stays linear on a pathological run of slashes.
  • mysql: The adapter suites now run every expectation against both connection modes from one table and assert on argument lists rather than assembled command strings.
  • ssh: New transport test suite covering both connection modes. Argument quoting is verified by round-tripping hostile values (command substitution, embedded quotes, newlines, non-ASCII) through a real shell and comparing the recovered arguments against the originals.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v3.1.0
  • Also tagged as: latest, v3
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v3.0.2 - Bug Fixes and Improvements for File Backups and MSSQL Restores โ€‹

Released: Aug 1, 2026

๐Ÿ› Bug Fixes โ€‹

  • file backups: Symbolic links in a directory source were silently dropped. Nothing in the run log mentioned them, so the backup reported success and was incomplete - which only surfaced during a restore. Most visibly with Nginx Proxy Manager, where letsencrypt/live/ holds only links into letsencrypt/archive/, leaving the restored instance unable to start. Links are now backed up as links, with their target preserved exactly, on Local, SFTP and Rsync sources. (#135)
  • MSSQL: Restoring onto a database whose name contains a hyphen, dot or space failed immediately with Invalid database name, even though the same database was listed and backed up without complaint. (#133)

๐ŸŽจ Improvements โ€‹

  • file backups: The collection log now counts symbolic links separately from files, and names every link a source could not hand over instead of leaving it out in silence. FTP sources report their links this way, since the protocol offers no dependable way to read a link's target.
  • restore: Restoring to a destination without symbolic links (S3, Google Drive, OneDrive, Dropbox, WebDAV) names each link it cannot recreate and finishes as Partial, rather than reporting a complete restore. The message names the destination and the working alternatives instead of reading like a transfer that broke, and the per-source summary counts skipped links apart from real failures. Restoring to a local path, over SFTP, or as a .tar.gz download recreates them.
  • execution log: Warnings are now coloured in the log viewer. Only the small level icon carried the distinction before, and a command or storage type replaces that icon - so a storage warning was indistinguishable from routine output, which is exactly where lines about missing files sit.
  • execution log: A stage whose only problems were warnings now shows the orange partial marker instead of a green tick, but only when the run itself came out Partial. A successful run with ordinary warnings is unchanged.
  • storage explorer: Symbolic links are shown in the backup file tree with their target, instead of appearing as empty files.
  • Local Filesystem: Directory sources are now collected with a walker that reports progress while it scans, prunes excluded folders instead of listing and discarding them, and reacts to a cancelled run immediately.

๐Ÿ”„ Changed โ€‹

  • archive format: The index gained an lnk field for symbolic link targets, and the manifest a counts.symlinks. Both are additive - older backups stay readable, and a reader that does not know the field behaves exactly as before. Unencrypted archives additionally carry a real TAR symlink member, so tar -xf still produces a correct tree. Encrypted archives keep targets in the sealed index alone, because a target is a path and a TAR header is cleartext.

๐Ÿ“ Documentation โ€‹

  • archive format: Documented lnk, counts.symlinks, the TAR symlink member rule for unencrypted archives, and the requirement that any extractor create links only after every regular file - which is what closes the TAR symlink traversal hole.
  • file backups: New section on what symbolic links do and do not include, which adapters support them, and the fact that permissions are not yet preserved.

๐Ÿงช Tests โ€‹

  • archive: Added symbolic link coverage - round trips through encrypted and unencrypted archives, the target staying out of the clear when encrypted, a foreign tar reading the link, path traversal through a restored link, and links being restated rather than carried forward in an incremental chain.
  • Local Filesystem: Added coverage for the collection walker: file links, folder links that are recorded but not descended into, and dangling links.
  • MSSQL: Added coverage for which database names are accepted for restore, for bracket quoting, and for the file name derived when a restore relocates its data files.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v3.0.2
  • Also tagged as: latest, v3
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v3.0.1 - File Backup Reliability Fixes and SFTP Improvements โ€‹

Released: July 28, 2026

โœจ Features โ€‹

  • settings: New Stuck Job Timeout cancels a backup or restore that has stopped reporting progress, so it can no longer occupy a concurrency slot indefinitely and hold back every queued job. Default 6 hours, Never disables it.

๐Ÿ› Bug Fixes โ€‹

  • runner: Execution progress recorded within a second of the previous update was discarded instead of written, so a job doing slow work showed the state from before it started - most visibly a file backup sitting on Taking job from queue... while it was already collecting files. Also affected restores and integrity checks.
  • SFTP: Directory listings and disconnects could hang indefinitely when a connection stopped responding without closing, which is what left file backups running for hours with nothing in the log.
  • runner: Cancelling a file backup had no effect during collection, and only took effect between two files once it did - so a source of many small files reacted instantly while a source of a few large ones ignored it for the whole transfer. Cancel now interrupts the transfer itself, and works while listing, hashing, packing and uploading.
  • shutdown: A stuck execution blocked container restarts until the runtime forced the process to exit. Shutdown now cancels runs that outlast a five-minute grace period.
  • history: The live execution view updated more slowly the more history an instance had, because every poll transferred the full logs of the last 100 executions.
  • history: A running stage showed an elapsed time frozen at its last log line instead of counting up.

๐ŸŽจ Improvements โ€‹

  • SFTP: Directory listings are substantially faster - folders are read in parallel, and a folder excluded in full is skipped instead of listed and discarded. Skipped folders are reported in the exclude summary.
  • runner: The collect phase now reports a live file and folder count while listing, byte progress for large files, and its hashing progress, instead of going silent during each.
  • runner: Checksums of collected files are computed in parallel.
  • SFTP: Downloads no longer spend an extra round trip asking for a file size the transfer already reports.

๐Ÿ”„ Changed โ€‹

  • api: GET /api/history no longer returns the logs field. It carried the complete log of all 100 returned executions on every call. Fetch a single execution's log from GET /api/executions/:id?includeLogs=true instead.

๐Ÿ“ Documentation โ€‹

  • api-docs: Corrected the GET /history specification, which declared a bare array where the endpoint has always returned { executions, systemTimezone }, and documented the path, metadata, triggerType and triggerLabel fields it returns. IntegrityCheck and Verification were missing from the execution type list.
  • file-backups: Added sections on exclude patterns and what a run reports while it works, including why node_modules/** skips a folder and node_modules does not.
  • jobs: Documented the Stuck Job Timeout setting.
  • website: The docker run command in the hero now sets the required BETTER_AUTH_URL, and its $ prompt stays on screen instead of being copied along, so the copied command runs as-is.

๐Ÿงช Tests โ€‹

  • runner: Added coverage for deferred progress writes, the SFTP tree walk, unresponsive disconnects, exclude pruning decisions, cancelling a transfer that never reports back, and the stuck execution watchdog.
  • archive: Fixed a test that counted temp files across the whole OS temp directory and failed at random when another suite ran alongside it.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v3.0.1
  • Also tagged as: latest, v3
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v3.0.0 - File & Folder Backups, Incremental Chains, and General Improvements & Fixes โ€‹

Released: July 26, 2026

Note: File backups introduce artefacts that did not exist before. A combined (database + directory source) backup is a seekable archive - compression and encryption are applied per entry rather than to the archive as a whole, which is what lets a single file be restored without fetching the rest - and it carries a <backup>.index sidecar next to the usual .meta.json. An incremental job stores its snapshots in <job>/chain-<timestamp>/ instead of flat. Tooling that walks a destination and expects two files per backup will meet a third one next to these. Nothing existing changes: database-only backups keep their format, their layout and their restore path. Only the reverse matters - a backup written by this version cannot be read by an older one.

Download your Recovery Kits again. The kit was rebuilt from scratch for this release: one tool instead of two scripts, a menu that finds your backups and asks what to do with them, launchers for all three systems, and support for the new file-backup and incremental formats. An older kit cannot read a file backup at all. Your key has not changed, so the new kit is a drop-in replacement - Vault > Encryption > Recovery Kit, then tick the profiles it should cover.

โœจ Features โ€‹

  • ui: Tables now support bulk operations. Tick several rows and act on all of them at once - delete backups, connections, jobs, users and vault entries, pause or resume jobs, lock or unlock backups. The confirmation lists what it is about to touch, entries that cannot be included say why, and anything that fails is reported per entry instead of stopping the rest.
  • jobs: Backup jobs can now back up directories and files, not just databases. A job can have one or more directory sources - any storage adapter can serve as one - alongside or instead of a database, collected into a single archive per run. Folders are picked from a checkbox tree, and reusable Exclude Pattern Presets keep glob lists in one place - editing a preset applies to every source that links it.
  • backup: File backups use a new seekable archive format. Compression and encryption are applied to each entry rather than to the archive as a whole, and a <backup>.index sidecar lists every file with its size, timestamp and checksum. That is what makes it possible to browse a backup without downloading it and to restore one file out of a 100 GB archive. Encrypted archives derive a fresh key per archive with counter-based nonces, keep no cleartext paths or checksums anywhere, and pack small files into shared bundles.
  • restore: The restore page covers everything in a backup: pick individual databases, whole directory sources, single folders or single files, each with its own target. Files can go back to their original location, into any configured destination, or come down as a .tar.gz. A backup holding both databases and files asks up front which half you want.
  • storage: Storage adapters can serve byte ranges, so restoring one file transfers that file instead of the whole backup. Implemented for every destination except SMB, which falls back to fetching the archive once.
  • storage: File backups offer a Download Decrypted Contents action instead of a plain decrypted download, since a seekable archive has no single stream to decrypt. It unpacks the archive - and the rest of its chain, for an incremental - into a .tar.gz. Asking for a decrypted download of one through the API instead fails with an explanation rather than quietly returning ciphertext.
  • jobs: Directory sources can be backed up incrementally, storing only what changed since the last run. Opt-in per job, with a configurable full-backup interval and an option to detect changes by content instead of timestamps. Each chain lives in its own folder and is retained and deleted as a unit, so a snapshot can never lose the archives it depends on.
  • templates: Naming templates gained a {chain} token that places an incremental backup's chain position (full-000, inc-001) anywhere in the filename. Left out of a template, the position is prepended automatically as before. Used but empty (any non-incremental job), it disappears together with the _ or - next to it.
  • smb: Directory sources on SMB shares can be read from a VSS shadow copy instead of the live share, so open files are readable and the backup reflects a single point in time. Uses MS-FSRVP and needs no agent on the file server. The option only unlocks once the server confirms it can deliver one, and a run whose snapshot turns out to be unavailable fails rather than quietly backing up the live share.
  • vault: The Recovery Kit is now one tool that asks what you want. Start it - by double-clicking a launcher on Windows, macOS or Linux - and it scans its own folder, lists the backups it found, and offers to restore them. It recognises every format DBackup writes, so nobody has to work out whether they are holding a database dump, a file backup or an incremental chain before they can begin, and it reads master.key itself instead of asking for the key to be pasted on a command line. The two separate scripts and the two half-finished helper launchers they came with are gone. The command line is unchanged for scripting and over SSH, and now takes a folder wherever it took an archive.
  • vault: A Recovery Kit can carry the keys of several encryption profiles at once, ticked off a list when you download it. A backup records which profile encrypted it, so the tool picks the right key by itself - there is no longer a kit per profile to keep apart and match to the right job. Untick profiles for a kit that only opens part of your backups, and note that a kit holding every key opens every backup.
  • vault: The Recovery Kit can restore a single database out of a backup that holds several, by name - in the wizard as a pick-list, on the command line as an argument. It already worked for a database inside a file backup but was undiscoverable, and was not possible at all for a database-only backup.
  • vault: The Recovery Kit unpacks a database backup holding several databases into one dump per database, and everything it restores - dumps, files, whole chains - lands in the same restored folder. Previously a multi-database backup came back as a .tar to take apart by hand, and it landed next to its own encrypted file rather than where every other kind of restore went.
  • vault: The Recovery Kit tool streams every entry it extracts, so recovering a backup that holds a 50 GB file needs no more memory than one holding text files, and a file only appears once its authentication tag and checksum both verify.
  • storage: The folder browser used when configuring a directory source now works for every storage adapter. SMB, FTP, WebDAV and S3-compatible storage previously left the Browse button disabled and the path had to be typed by hand - not for any protocol reason, it had simply never been implemented for them. On object storage the tree lists key prefixes, matching what the provider's console shows.
  • destinations: New "Create as Directory Source" action (and its reverse) copies a storage adapter into the opposite role including its credentials, so one server can serve both purposes without being set up twice.
  • jobs: Creating and editing a backup job now opens a dedicated page instead of a modal, giving the folder tree room to work.
  • vault: A backup whose encryption profile was deleted can be reopened by pasting the key itself. The key is checked against that specific backup before anything is stored - for a file backup the check is exact, since its index carries an authentication tag - and is then saved as a new vault profile. That is what makes it work everywhere afterwards, including for restores that run unattended and have nobody to ask. Pasting a key that is already in the vault points at the existing profile instead of creating a second one. Requires permission to manage the vault.
  • auth: New DISABLE_EMAIL_LOGIN environment variable switches off password sign-in, leaving SSO and passkeys. The endpoints are rejected server-side rather than only hidden, and administrators keep creating users and resetting passwords from the Users page. Set it only after the first administrator and an SSO provider exist, since there is no bootstrap exception.
  • SSO: New OIDC_AUTO_REDIRECT environment variable takes a provider ID and sends visitors straight to that provider instead of showing the login page. It is skipped after a failed sign-in and right after signing out, and an ID matching no enabled provider logs an error at startup rather than stopping the application.
  • Authelia: New pre-configured SSO adapter. Enter the Authelia URL and the endpoints are discovered automatically, no manual entry through the generic adapter.

๐Ÿ› Bug Fixes โ€‹

  • connections: Fixed deleting a connection that is still used by a notification template failing with a raw database error instead of naming what still depends on it.
  • sftp: Fixed transfers running one request per round trip, which capped a single file at about 3 MB/s over a 20 ms link regardless of bandwidth. Uploads and downloads now keep 64 chunks in flight. Downloads took the slow path unless a caller asked for progress reporting, which decided the transfer algorithm by accident. They now use the fast one either way.
  • sftp: Fixed a destination with a configured path failing with a permission error on a path nobody entered (Permission denied /volume1 for a configured /volume1/Transfer/restore). Creating a directory walked upwards until it found one that exists, which on a NAS means climbing to the filesystem root, since an account can usually write inside its share without being able to stat the volume above it. The configured path is now treated as a precondition and only folders below it are created. When it is unreachable, the error names that path, says which segment of it stops being visible, and - where SFTP is confined below the filesystem root, which is what ChrootDirectory in sshd_config and most NAS and hosted SFTP setups do - names a rewritten path after confirming that the server actually has it.
  • webdav: Fixed uploads reading the whole backup into memory before sending it, which made a backup larger than the machine's RAM fail on this destination alone. Uploads now stream, as every other destination already did.
  • backup: Fixed the storage listing cache update after an upload being fired without awaiting it, which left its failures unhandled and could let it outlive the backup run that produced it.
  • auth: Removed two debug statements that wrote the full better-auth context object to the browser console on every login attempt.
  • notifications: Fixed the notification preview showing timestamps in the browser locale instead of the user's configured timezone and format.
  • storage: Fixed the download link dialog, the SSO provider editor and the adapter type picker scrolling with the native scrollbar instead of the styled one.
  • auth: Fixed two-factor authentication failing since v2.10.1 with an empty error in the UI and an Unknown argument 'failedVerificationCount' database error in the logs. The Better Auth update added lockout tracking to the two-factor record, but the matching columns were never added to the schema, so both enabling 2FA and verifying TOTP or backup codes failed. Failed attempts are now counted and the lockout works as intended. (#130)
  • dropbox: Fixed uploads failing outright when Dropbox's API returned a rate limit error, and a disallowed filename being reported the same way as any other failure. A rate-limited upload now retries automatically, and a bad filename says so.
  • vault: Fixed the Recovery Kit shipping a master.key that nothing read. Every documented command told the user to paste the key instead, which put it in shell history and in the process list. The tool reads the file itself now, and no launcher carries the key.
  • vault: Fixed the Recovery Kit's Linux and macOS helper arriving without its executable bit and only ever starting the database half of the kit. There are working launchers for all three systems now, and they start the whole tool.

๐Ÿ”’ Security โ€‹

  • local-filesystem: Tightened the path containment check, which accepted a sibling directory whose name merely started with the configured base path (a job pointed at /srv/data could reach /srv/dataEVIL).
  • S3: Fixed pathPrefix not being applied to downloads, range reads and deletes on S3-compatible storage, which could let those operations reach outside the configured prefix root.
  • dependencies: Updated Next.js to 16.2.12, closing eight advisories including a middleware bypass, server-side request forgery in Server Actions and in rewrites, and cache confusion of response bodies.
  • dependencies: Pinned sharp, postcss and brace-expansion to patched releases, resolving eleven further advisories inherited through transitive dependencies.

๐ŸŽจ Improvements โ€‹

  • ui: The shared table component was split into a toolbar, a pager and a selection column, so the file that every list in the app renders through no longer carries all of it at once.
  • restore: Encryption keys are now resolved the same way everywhere. Database restores, file restores, storage downloads and config restores previously each had their own idea of what to try when the profile a backup names no longer exists, which meant the same backup could be recoverable in one place and a dead end in another. All of them now run the same sequence: a key you supplied, then the profile the backup names, then every profile in the vault tested against the backup. A key you supplied is verified rather than trusted, so a wrong one is reported as wrong instead of producing a file that looks corrupt.
  • restore: Every place that opens an encrypted backup now asks for a key the same way, through one dialog. Browsing, analysing, restoring and downloading each used to answer a missing key differently - a prompt in one place, a bare error in another, silence in a third. The answer belongs to the whole page rather than to the one request that happened to ask, so it carries over to browsing folders, the dry run, the download and the restore itself, and into the background job that the restore starts.
  • restore: Reading the file index of a backup no longer downloads it several times over. The restore page asks for the same index once per directory source plus once for the dry run, and each request used to fetch and decrypt the index sidecar separately - including logging the same failure once per request.
  • storage: Restore downloads, plain and decrypted alike, are now prepared server-side behind a short-lived, user-bound token and streamed by the browser's own download manager instead of being buffered in the page, so a large archive no longer risks exhausting the browser's memory.
  • settings: New Max Concurrent Files system setting (default 4, up to 16) controls how many files a job transfers in parallel while collecting or restoring a directory source.
  • backup: Files already in a compressed format are no longer recompressed. Video, audio, images, archives, ZIP containers such as .docx and .apk, web fonts and encrypted files are stored as-is even when the job has compression enabled, because a second pass gains a fraction of a percent while costing the CPU time plus a complete extra write and read through a temporary file. Nothing is left out of the backup, and restore, download and the Recovery Kit read a mixed archive without any change - including kits downloaded earlier.
  • backup: Brotli now compresses at quality 10 instead of its maximum of 11, which more than halves the time it takes for 2.5% larger output. Existing archives stay readable, since the level is recorded in the compressed stream itself.
  • SSO: Provider icons now come from one shared map instead of four copies that had drifted apart. Keycloak showed a generic globe everywhere except the add dialog.

๐Ÿ”„ Changed โ€‹

  • rsync: Transfers no longer compress in transit. -z costs CPU on both ends and changes nothing about what is stored - each archive entry is compressed in the packing stage afterwards - so it was the same work done twice, and it only pays off on data that compresses, which a backup source usually is not. Connections on a slow link with compressible data can add -z back under "Additional rsync options".
  • templates: The built-in "Standard" naming template now ends with {chain}, so an incremental backup reads Job_2026-07-24_09-18-04_inc-001 instead of inc-001-Job_2026-07-24_09-18-04. Templates you created yourself are left untouched, as is a Standard template that was already edited.
  • navigation: Sources, Destinations and Notifications are now one page, Connections, with a tab per kind: Databases, Directory Sources, Backup Destinations and Notifications. Adapters are grouped by what they are rather than by the direction a job happens to use them in - which is what made a database "a source" even when restoring into it. The old routes redirect to the matching tab, and the active tab lives in the URL so links and bookmarks keep working.
  • destinations: A storage adapter now has one exclusive role, backup destination or directory source, instead of two independent toggles. They cannot be combined because a destination owns its configured path - the runner writes job and chain folders into it - while a source only reads folders out of it, so one adapter doing both would let a job back up its own archives. Existing adapters are migrated automatically.
  • retention: The retention log now names backups that survive only because their incremental chain is still in use, so a destination holding more than its policy allows is explainable instead of looking broken.
  • charts: Upgraded Recharts from 2 to 3. Every chart renders the same data as before, with one visible difference: Recharts 3 no longer guarantees that legend entries follow the order of the data, so the Job Status legend may list its statuses differently.

๐Ÿ—‘๏ธ Removed โ€‹

  • storage: Removed the separate "Browse files" button and dialog from the Storage Explorer - browsing and per-file restore now live on the restore page.

๐Ÿ“ Documentation โ€‹

  • website: Reframed the File & Folder Backup and Restore cards and answered the scope question in the FAQ: what the feature is for, and that an agentless full run stages the tree on the DBackup host, wants roughly twice the source size in free space, and moves every byte across the network twice - with restic and Borg named as the better tool for bulk media libraries.
  • wiki: New Archive Format reference documenting the archive layout, key derivation and index format byte by byte, so a backup stays recoverable independently of DBackup - including the TAR header detail that trips up hand-written readers on entries past 8 GiB.
  • wiki: New Backup Modes guide covering incremental backups, chain storage, how retention interacts with chains, and when DBackup falls back to a full backup.
  • wiki: Updated the Recovery Kit, Storage Explorer, Restore, SMB and adapter overview guides for file backups, shadow copies and the Connections page.
  • wiki: New File & Folder Backups page with a per-adapter table of what each one supports - whether restoring a single file fetches just that file or has to download the whole archive first. It also spells out that the file tree shown when restoring comes from the backup's index sidecar and therefore works for every adapter. It also states what the feature is for and where it stops - an agentless full run stages the tree on the DBackup host, so it wants roughly twice the source size in free space and moves every byte across the network twice, with restic and Borg named as the better tool for bulk media libraries - and which adapter to pick, including what actually decides transfer speed and why the Parallel Transfers ceilings differ.
  • wiki: The reverse proxy section now states that DISABLE_HTTPS=true is needed in almost every proxy setup. DBackup serves HTTPS with a self-signed certificate by default, which a proxy rejects - usually as a 502 with nothing helpful in the log.
  • api: Documented the restore endpoint's scope parameter, storageRole on the adapter schemas, and the new snapshot-availability and adapter-role endpoints.
  • website: Repositioned for database and file backups - hero, tagline, features, integrations, FAQ, footer and page metadata now cover directory sources.
  • blog: New post on why incremental backups store whole changed files instead of deduplicated chunks, what that costs in storage, and when a chunk-based tool is the better choice.
  • README: Added a File & Folder Backup feature section, a Directory Sources overview, and file-level restore to the recovery section.
  • wiki: The documentation home page now covers file backups, incremental chains, per-adapter directory source support, and how the archive format keeps the no-lock-in promise.
  • wiki: Backup Modes explains why whole changed files are stored rather than deduplicated chunks, with the storage cost spelled out per situation.
  • wiki: Fixed the opening paragraph of the Backup Modes page, which had a sentence split across the intro note.
  • wiki: Compression now lists every format that is stored without compression, grouped by kind. File & Folder Backups links to it.

๐Ÿงช Tests โ€‹

  • ui: Coverage for bulk operations: the ordering that lets a whole incremental chain be deleted while a partial selection is still refused, the locked-backup guard, one scheduler refresh per batch instead of one per job, and the permission guards on every new bulk endpoint including the per-type check that stops a mixed connection selection from widening someone's access.
  • lint-guards: New guard that fails the build when the Recovery Kit's tool is missing from the repository or from the Docker image. A kit is assembled by reading it off disk and falls back to a placeholder when it is absent, so nothing else would have noticed.
  • Fixed the adapter DTO tests intermittently timing out in a full run. They reset the module registry before each of six tests, which re-evaluated the entire adapter graph - every storage, database and notification SDK - six times over. The graph now loads once per file.
  • backup: Round-trip coverage for the archive format against awkward inputs - paths past 100 characters, unicode, spaces, empty files - verified with real tar and the standalone recovery kit, since "an unencrypted archive extracts with tar -xf" and "the kit reads what the writer emits" are promises only running them can prove.
  • backup: Regression coverage for the format's edge cases: TAR entries at the 8 GiB size boundary, incremental chains spanning several archives, chain-aware retention and deletion, restore path guards, and the SMB shadow copy lifecycle including release on failure and cancellation.
  • lint-guards: New guards that fail the build when code enumerates storage adapters without filtering by role, or links to the retired Sources/Destinations/Notifications routes.
  • lint-guards: New guard that fails the build when the published list of already-compressed formats drifts from the code. The list ships as code so a release can extend it, and that is exactly how a table in the docs quietly stops being true.
  • lint-guards: New design system guards covering raw overflow containers, locale date formatting, ScrollArea max-height placement and palette colors without a dark mode variant. The last two carry a baseline count that may only go down, so the existing backlog is tolerated but nothing new is added.
  • lint-guards: The no-console guard no longer exempts Client Components. The exemption assumed the logger needed Node APIs, which it never did, and it was hiding 21 console calls.
  • charts: New render tests for the chart wrapper and all four chart types, asserting that the series, axes, grid, pie sectors and the legend's mapping back through the chart config actually reach the DOM. The chart components had no coverage at all, which made the Recharts 3 upgrade a change nothing could verify.
  • restore: New coverage for key resolution: the order it tries things in, that a key you supplied is reported as wrong rather than quietly replaced by another, and that an archive index seals against every key but the right one. Plus a regression test that a backup with no usable key asks for one instead of reporting an empty archive.
  • vault: New coverage for key recovery, including that a key which does not open the backup is never stored, that an existing profile is reused rather than duplicated, and that a generated profile name steps around one already taken.
  • restore: New coverage for the key prompt's own state machine: that a retry running into the same prompt keeps the dialog open with a reason instead of closing as though it had worked, that the answer is remembered for the rest of the page, and that a raw key never travels with an ordinary request.
  • vault: New coverage for the recovery tool's own helpers, now that they can be imported instead of driven through a terminal: that a menu row always fits the width it is given at four different terminal sizes, that a wrong key's output is told apart from each dump format's opening bytes, and that the decrypted output is never named over its own input.
  • vault: New coverage for multi-key kits: that each profile gets a file named after it, that two profiles sharing a name stay apart, that the index maps a backup's profile to its key, and - in the tool - that the right key is picked by profile id, that a keys folder without an index still works by trying them, and that a kit whose keys all fail says which it tried.
  • vault: New coverage for the generated kit itself: that it ships the tool rather than a placeholder, that the launchers arrive executable, and that the README gives the terminal command and the macOS workaround.
  • vault: New coverage for restoring one named database out of both backup formats, and for an unknown name being answered with the list of databases the backup does contain.
  • vault: New coverage for a multi-database backup coming out as one dump per database with no archive left behind, and for every kind of restore defaulting to the same output folder.
  • vault: New coverage for the Recovery Kit's new entry points: that a chain folder is accepted directly and resolves to its newest snapshot, encrypted or not, that a folder holding several backups names them instead of guessing, that the key is read from master.key rather than handed over, and that a whole-file database backup comes out decrypted and decompressed in one pass with nothing written when the key is wrong.

๐Ÿ”ง CI/CD โ€‹

  • lint: Upgraded ESLint from 9 to 10 in the app and the website, ahead of the v9 end of life on August 6, 2026. The rule set and its findings are unchanged.
  • types: Updated @types/mssql from 9 to 12, which had been three majors behind the installed mssql 12.7 and was type checking the adapter against an API that no longer exists.
  • types: Updated @types/node from 20 to 24, matching the Node version the container and CI actually run. The local filesystem adapter dropped a Dirent.path fallback that no supported Node version reaches.
  • tests: Upgraded Vite from 7 to 8, where Rolldown replaces esbuild and Rollup, together with @vitejs/plugin-react 6 which requires it. Vite backs only the Vitest runner here, so the application build is untouched.
  • tests: Dropped the vite-tsconfig-paths plugin in favour of the resolve.tsconfigPaths option that Vite 8 provides natively.
  • dependencies: Picked up the pending patch and minor releases across the app and the website - Better Auth 1.6.25, React 19.2.8, the Radix UI primitives, react-hook-form, @hookform/resolvers, lucide-react, dropbox, basic-ftp and the AWS SDK. Better Auth was checked field by field against schema.prisma first, since the 1.6.23 update was the one that added two-factor columns the schema never got.
  • scripts: pnpm update:check no longer ends in Command failed with exit code 1, and no longer warns about the pnpm.overrides in docs/ and website/. It now checks the three projects the way they are actually installed instead of treating them as one workspace.
  • tests: Upgraded vitest-mock-extended from 3 to 5, which had been built against Vitest 3 while the suite runs on Vitest 4. It backs the Prisma mock that 87 test files share, so the version it targets should match the runner.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v3.0.0
  • Also tagged as: latest, v3
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.10.1 - Webhook GET/HEAD Support, SSO Improvements, and Multiple Bug Fixes โ€‹

Released: July 18, 2026

โœจ Features โ€‹

  • webhooks: Generic Webhook notification channels now support GET and HEAD HTTP methods, for compatibility with heartbeat/push-monitoring services like Uptime Kuma and Healthchecks.io. Thanks @Shlok-Zanwar (#123)
  • SSO: Added a new Profile > SSO tab where users can view, disconnect, and manually connect their linked identity provider accounts.

๐Ÿ› Bug Fixes โ€‹

  • notifications: Fixed webhook and notification deliveries being logged as "Success" even when the adapter failed to send (e.g. DNS errors, timeouts). Thanks @Shlok-Zanwar (#123)
  • explorer: Fixed Database Explorer UI not updating when navigating with the browser's back/forward buttons. Thanks @Shlok-Zanwar (#126)
  • SSO: Fixed dashboard-created users failing to link to a matching SSO identity on first login, shown as "Unknown Error". (#128)
  • SSO: Deleting an identity provider now also removes every user's linked account for it, instead of leaving a permanently stale "Provider no longer available" connection behind.

๐Ÿ”’ Security โ€‹

  • dependencies: Updated adm-zip to v0.6.0, fixing a high-severity vulnerability where a crafted ZIP file could trigger a 4GB memory allocation (GHSA-xcpc-8h2w-3j85).
  • vault: The Dropbox, Google Drive, and OneDrive OAuth token validation endpoints now require the credentials:read permission, closing a gap where any authenticated API key could probe the validity of a stored OAuth credential profile.

๐ŸŽจ Improvements โ€‹

  • SSO: Deleting an identity provider now warns how many users are connected and lists which of them have no other login method and would be locked out entirely.

๐Ÿ”„ Changed โ€‹

  • deps: Bumped minor/patch versions across app, website, and docs, including better-auth, @better-auth/sso, @better-auth/passkey, next, react, react-dom, nodemailer, tailwindcss, @tailwindcss/postcss, vitest, @vitest/coverage-v8, vue, dropbox (v10.37.1), mongodb (v7.5.0), mssql (v12.7.0), @aws-sdk/client-s3 and @aws-sdk/lib-storage (v3.1090.0), node-cron (v4.6.0), radix-ui (v1.6.2), react-hook-form (v7.82.0), googleapis (v173.0.0), rate-limiter-flexible (v11.2.0), react-day-picker (v10.0.1), next-mdx-remote (v6.0.0), vitepress-plugin-tabs (v0.9.1), lucide-react (v1.25.0), and 16 @radix-ui/react-* packages.

๐Ÿ“ Documentation โ€‹

  • api-docs: Synced the standalone API reference deployment with the in-app spec, which was missing the entire Credentials/Vault section, and documented 8 previously-undocumented endpoints (version history, database table browsing, dashboard calendar, storage verification, and cloud storage OAuth authorization).

๐Ÿงช Tests โ€‹

  • SSO: Updated the deleteProvider() unit test to match the transactional delete (provider + linked accounts) introduced alongside the SSO provider deletion warning.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.10.1
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.10.0 - Firebird Support, New Website, and Multiple Bug Fixes โ€‹

Released: July 12, 2026

โœจ Features โ€‹

  • Firebird: Added Firebird (3.x/4.x/5.x) as a supported database source, with direct and SSH connection modes. Marked as Beta in the source type picker.
  • website: Launched a new website at dbackup.app with a blog, roadmap page, and product tour.

๐Ÿ› Bug Fixes โ€‹

  • Redis: Database Explorer now shows a key count per database instead of always blank.
  • rsync: Fixed SSH private-key destinations failing with "Too many authentication failures" when the local SSH agent has other keys loaded.
  • vault: Recovery Kit downloads now include decrypt_backup.js instead of a missing-script warning. Thanks @jpb0418 (#120)

๐Ÿ”ง CI/CD โ€‹

  • scripts: generate-stress-data.sh now also populates Redis and Firebird test containers.
  • scripts: Added test-vm-up.sh / test-vm-down.sh / seed-ssh-test-config.ts and a test:vm:delete shortcut to test SSH-mode adapters against a real remote host via a Multipass VM.
  • scripts: test-vm-up.sh now starts one container per database family instead of the full test matrix, to reduce VM memory usage.
  • scripts: test-vm-up.sh/seed-ssh-test-config.ts now install MongoDB's client tools and seed MongoDB and Firebird SSH sources, MSSQL is left out for now as the heaviest container.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.10.0
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.9.0 - Valkey Support, Storage Alert Fix, and Multiple Improvements โ€‹

Released: July 4, 2026

โœจ Features โ€‹

  • Valkey: Added Valkey as a supported database source. Uses the same RDB backup mechanism as Redis with correct version display.

๐Ÿ› Bug Fixes โ€‹

  • storage alerts: Fixed "Missing Backup" alert firing incorrectly when a retention policy keeps the file count stable, making the alert appear even though backups were completing successfully.

๐ŸŽจ Improvements โ€‹

  • dashboard: The Storage Usage widget now shows the adapter-specific brand icon for each destination (matching the Destinations page) instead of a generic hard drive icon.
  • adapter form: The add/edit dialog is now scrollable when configuration fields exceed the available screen height, with action buttons always pinned at the bottom.
  • system tasks: Health check log cleanup now runs once a day via the "Clean Old Data" task instead of on every health check run, reducing unnecessary database load.
  • system tasks: Removed a redundant hourly storage snapshot cleanup that duplicated the daily "Clean Old Data" cleanup.
  • database: The internal SQLite database now runs in WAL mode with a busy timeout, so readers no longer block writers and concurrent writes wait briefly instead of failing instantly with "database is locked". Configurable via the new SQLITE_WAL_MODE environment variable (default: true).

๐Ÿ“ Documentation โ€‹

  • Redis: Updated supported version documentation from 6.x to 2.8+ to reflect actual compatibility.
  • installation: Documented the -wal/-shm companion files created by the internal database's WAL mode.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.9.0
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.8.0 - Notification Templates, Per-Job Event Filters, and Multiple Bug Fixes โ€‹

Released: June 28, 2026

โš ๏ธ Breaking: The per-job notification configuration has been replaced by Notification Templates, and existing job notification settings are not migrated automatically. After updating, every backup job loses its notification setup and must be reconfigured: create a Notification Template under Templates -> Notification Templates (assign channels and pick the Success/Partial/Failed events per channel), then assign it to each job via the job edit form. You can mark one template as the default so it is pre-selected for new jobs.

โœจ Features โ€‹

  • notifications: Job notification triggers redesigned - select any combination of Success, Partial, and Failed outcomes per job instead of a fixed preset. (#117)
  • notifications: Added Notification Templates - reusable templates with per-channel event filters (Success/Partial/Failed) that can be assigned to multiple backup jobs, replacing the per-job flat channel configuration.

๐Ÿ› Bug Fixes โ€‹

  • users: Fixed "Create Group" and "Create API Key" dialogs where the footer buttons were rendered inside the scroll area instead of being fixed at the bottom, and scrolling was broken. Added missing DialogDescription to resolve the aria-describedby accessibility warnings.
  • jobs: Fixed "API Trigger" dialog where scrolling was broken due to an ineffective grid-rows class on the flex-based DialogContent.
  • dashboard: Fixed Backup Calendar "Last 12 months" view missing today's backups when the server runs in a non-UTC timezone.
  • notifications: Fixed "Skipping notifications" not being logged when the event filter excludes the current backup status (legacy path).
  • jobs: Fixed cloning a job crashing when the source job has no notification templates assigned.
  • notifications: Fixed email preview not showing the logo because the URL pattern used for local replacement did not match the current docs.dbackup.app domain.

๐ŸŽจ Improvements โ€‹

  • notifications: New backup jobs now pre-select the default notification template (if one is marked as default), so it no longer has to be added manually each time. The selection can still be removed before saving.
  • history: Notification results (sent/failed per channel) are now shown directly in the execution log dialog, with a clickable pill per channel that opens the full notification preview.
  • history: Uploading step in the execution log viewer now shows orange instead of red for partial backup executions.

๐Ÿงช Tests โ€‹

  • coverage: Raised overall unit test coverage from 84% to 92% (statements) / 94% (lines) by adding 270+ new tests across notification templates, SSH key conversion, restore pipeline, backup dump, dashboard service, storage adapters (SFTP, S3/R2/Hetzner, Google Drive, OneDrive, FTP), SSH client PKCS#8 path, integrity service, encryption service, job service, and runner initialization steps.
  • lint: Fixed 5 ESLint errors - renamed unused variables (wrapError, mockLog, callCount, capturedCallback) to underscore-prefixed equivalents, and removed stale no-throw-literal disable comment (rule was renamed to only-throw-error in newer typescript-eslint).
  • types: Fixed 7 TypeScript errors - replaced incorrect as Parameters<typeof generateKeyPairSync>[1] casts with as any for RSA/EC key generation, added as unknown as string for Ed25519 privateKey cast, and wrapped four Prisma mockImplementation async functions with as any to satisfy Prisma__SystemSettingClient return type.
  • test-infra: Reduced active test containers in docker-compose.test.yml to oldest + newest version per database family (MySQL 5.7+9.1, MariaDB 10+11, PostgreSQL 12+17, MongoDB 4.4+8.0, MSSQL 2019+2022, Redis 6+8). Middle versions are commented out and can be re-enabled on demand.
  • test-infra: Updated tests/integration/test-configs.ts to match - middle versions commented out, multiDbTestConfigs updated to use the newest active containers (MySQL 9, PG 17, MongoDB 8). Azure SQL Edge entry commented out alongside its container.
  • test-infra: Updated scripts/generate-stress-data.sh container references to the remaining active containers (MySQL 9.1, PostgreSQL 17, MongoDB 8.0).
  • test-infra: Updated scripts/setup-mssql-testdb.sh to skip the disabled mssql-edge container.
  • test-infra: scripts/seed-test-sources.ts now cleans up previously seeded but now-disabled adapter configs from the dev DB on the next pnpm test:seed run (MySQL 8.0, PG 13-16, MongoDB 5-7, Redis 7, Azure SQL Edge).

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.8.0
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.7.2 - Multiple Bug Fixes, S3 Connection Stability Improvements, and Security Updates โ€‹

Released: June 22, 2026

๐Ÿ› Bug Fixes โ€‹

  • dashboard: Fixed React "missing key prop" console warning on the dashboard bottom grid.
  • S3: Fixed intermittent ECONNRESET errors on S3 uploads caused by HTTP connections not being closed after each operation. (#115)

๐Ÿ”’ Security โ€‹

  • nodemailer: Updated to v9.0.1 to address an arbitrary file read and SSRF vulnerability via the raw message option (GHSA-p6gq-j5cr-w38f).
  • vite: Updated to v7.3.5 to address a server.fs.deny bypass on Windows via alternate paths (GHSA-fx2h-pf6j-xcff).
  • deps: Patched 7 transitive dependency vulnerabilities (shell-quote critical, form-data, undici, js-yaml, esbuild, @babel/core, dompurify) via pnpm overrides.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.7.2
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.7.1 - Backup Calendar Heatmap, Partial Integrity Status, and Multiple Improvements โ€‹

Released: June 20, 2026

โœจ Features โ€‹

  • dashboard: Added a Backup Calendar Heatmap - a 12-month GitHub-style contribution graph showing daily backup outcomes (success, partial, failed, or no backup).
  • integrity: Integrity check executions now finish with a "Partial" status when some files fail verification, instead of "Success", making partial failures visible across the System Tasks list and Jobs Activity chart.
  • integrity: System notifications are now sent when an integrity check (scheduled or manual) finds one or more checksum mismatches. (#94)

๐Ÿ› Bug Fixes โ€‹

  • storage: Periodic health checks no longer write test files to storage destinations, preventing file accumulation on storage with governance or object-lock retention policies. (#113)
  • audit: Fixed Audit Log table resetting to page 1 after every page navigation.
  • audit: Reduced Audit Log load time by skipping filter-stats queries on page changes and parallelizing the underlying DB queries.

๐ŸŽจ Improvements โ€‹

  • jobs: The edit job dialog now scrolls on small screens instead of clipping content below the fold.
  • storage: Manual connection test files are now isolated to a .dbackup/test/ subfolder with the adapter name and timestamp in the filename, and are excluded from the Storage Explorer and backup count statistics. (#113)
  • dashboard: Latest Jobs widget now fills the same height as the right column and shows as many entries as fit. Added an "Integrity Check" filter option covering both IntegrityCheck and Verification types.
  • dashboard: Jobs Activity chart and Job Status donut now include "Partial" executions with an orange indicator.

๐Ÿ“ Documentation โ€‹

  • wiki: Overhauled the developer guide - corrected 50+ inaccuracies across all pages and added three new pages covering the Integrity Check system, Storage Alert system, and Credential Profiles.
  • wiki: Audited and updated the user guide - corrected factual errors (PostgreSQL dump format, permissions reference, Redis credential requirement), added 8 missing system notification events, documented the pgCompression job option and Database Explorer feature, and filled minor config table gaps across Telegram, MongoDB, and job settings.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.7.1
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.7.0 - Backup Integrity Verification, Storage Explorer Caching, and Multiple Improvements โ€‹

Released: June 14, 2026

โœจ Features โ€‹

  • integrity: Added backup file integrity verification. The Storage Explorer shows SHA-256/MD5 checksums and last verification result per file, with a Verify Now button that runs as a tracked async execution with live progress and cancel support.
  • integrity: Native checksum verification for S3/R2/Hetzner (SHA-256 via object metadata), Google Drive (MD5 via API), OneDrive (SHA-256 via Graph API), and local filesystem - no download required. Both checksums are stored in .meta.json at upload time.
  • integrity: Post-upload verification is now opt-in for all storage destinations via system settings (local filesystem always verifies).
  • integrity: Scheduled integrity checks support two scan modes - Jobs (default, only verifies files linked to backup jobs) and All Files (full storage scan) - plus configurable filters (skip already-passed, max age, max file size). Jobs and storage destinations can individually opt out via a "Skip Verification" toggle.
  • storage: Storage Explorer file listings are now cached in SQLite for instant repeat visits. Cache is invalidated on backup create, delete, verify, and lock changes.
  • history: Execution logs can now be copied to the clipboard or downloaded as a .log file directly from the log dialog. Sensitive data (IPs, credentials, connection strings) is automatically redacted before export.

๐Ÿ› Bug Fixes โ€‹

  • storage: Google Drive, OneDrive, and Dropbox now live-validate their stored OAuth token when the Connection tab is opened, showing an expiry warning with a Re-authorize button instead of a misleading green "authorized" status.

๐ŸŽจ Improvements โ€‹

  • dev: pnpm dev now automatically applies pending Prisma migrations and regenerates the Prisma client on startup.
  • storage: Storage Explorer cache uses surgical updates - create, delete, lock, and verify each patch only the affected cache entry instead of invalidating the full cache.
  • storage: A new "Pre-warm Storage Cache" system task (enabled by default, hourly) reconciles caches against remote storage and pre-populates the cache for adapters not yet visited.
  • storage: Stale cache entries trigger a background reconciliation via adapter.list() to detect files deleted outside DBackup without re-reading sidecars.
  • storage: Long backup names in the Storage Explorer are truncated with a tooltip showing the full name on hover.
  • integrity: Manual system task runs auto-redirect to the live execution history when "Auto-redirect on job start" is enabled.
  • ui: All data tables (Storage, Jobs, Sources, Destinations, Notifications) now support horizontal scrolling when columns overflow.
  • explorer: Database version history now detects and visually distinguishes downgrades - the change log shows an orange downward arrow for downgrades vs. green upward arrow for upgrades, and downgrade notifications are sent with a distinct "Downgrade" label and warning color.
  • explorer: Database Explorer table list now supports searching by name and sorting by Name, Type, Rows, or Size via clickable column headers.

๐Ÿงช Tests โ€‹

  • tests: Updated unit tests for integrity service, upload step, storage service, and system task service to match the refactored verification interfaces.
  • tests: Fixed integrity service tests to use destinations scan mode explicitly and added skipVerification field to job service create test.
  • tests: Added unit tests for VerificationService (all verification code paths), SystemTaskRunner (execution lifecycle), logs/sanitize (credential and IP redaction), and logs/format (log text export). Extended IntegrityService tests to cover the jobs-mode scan path.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.7.0
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.6.0 - Security Update, Vault Credential Profiles, OAuth Improvements, and Multiple Bug Fixes โ€‹

Released: June 6, 2026

๐Ÿ”’ Security Update: This release fixes a security vulnerability in DBackup's own code (GHSA-cj5h-46h6-72wc). Update as soon as possible.

โš ๏ธ Breaking: OAuth storage destinations (Dropbox, Google Drive, OneDrive) and token-based notification channels (Discord, Slack, Teams, Generic Webhook, Twilio) no longer store secrets inline - they require a Vault credential profile to function. After updating, create a matching OAUTH, WEBHOOK, or TOKEN profile in the Security Vault and assign it to each affected adapter via the edit form. Adapters without an assigned profile will fail connection tests and backup/notification jobs until migrated.

โœจ Features โ€‹

  • credentials: Credential profiles now support WEBHOOK (Discord, Slack, Teams, Generic Webhook), OAUTH (Dropbox, Google Drive, OneDrive), and TOKEN (Twilio) types, allowing notification and storage secrets to be stored in the vault and resolved server-side.
  • OAuth: OAuth authorization flows (Dropbox, Google Drive, OneDrive) now require an assigned credential profile. Tokens are stored in the vault and the credential picker refreshes automatically after authorization.
  • OAuth: Authorization dialogs now open in a popup window instead of redirecting the current page.

๐Ÿ”’ Security โ€‹

  • SMB: Passwords are now redacted from error messages and logs when SMB connections fail.
  • adapters: All adapter endpoints (list, create, update, clone) now return a safe DTO that strips all sensitive fields and replaces them with a secretStatus map - decrypted secrets are no longer serialized to API responses. Thanks @YHalo-wyh (GHSA-cj5h-46h6-72wc)
  • adapters: Notification webhook URLs and tokens (webhookUrl, botToken, authToken, authHeader, appToken, accessToken) and SSH keys (sshPassword, sshPrivateKey, sshPassphrase) added to SENSITIVE_KEYS and redacted in all DTO and strip operations. Thanks @YHalo-wyh (GHSA-cj5h-46h6-72wc)
  • OAuth: Refresh tokens for Dropbox, Google Drive, and OneDrive are now stored exclusively in credential profiles instead of adapter configs.
  • adapters: Adapter update (PUT) now preserves existing secrets via mergeSecrets - re-saving an adapter form without changing secret fields no longer overwrites stored credentials with empty values.

๐ŸŽจ Improvements โ€‹

  • adapters: Secret fields in the adapter form show a "saved - leave blank to keep" placeholder when a value is already stored.
  • credentials: Credential profile dialog extended to support creating WEBHOOK and OAUTH profile types.
  • encryption: The key resolution dialog now automatically switches to the raw key tab when no vault profiles are available.

๐Ÿงช Tests โ€‹

  • adapters: Added audit tests verifying no sensitive fields are returned by any adapter API endpoint.
  • adapters: Added DTO unit tests verifying that notification secrets (Telegram botToken, Discord webhookUrl) are redacted and secretStatus flags are set correctly.
  • crypto: Added unit tests for stripSecrets, mergeSecrets, and getSecretStatus.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.6.0
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.5.1 - Security Update, Smart Recovery Improvements, and Multiple Bug Fixes โ€‹

Released: June 2, 2026

๐Ÿ”’ Security Update: This release fixes a security vulnerability in DBackup's own code (GHSA-h929-x237-c5h2). Update as soon as possible.

โœจ Features โ€‹

  • encryption: Added a "Key Required" fallback dialog for decrypted downloads and offline config restore. When Smart Recovery cannot find a matching key, users can manually select a vault profile or paste a raw hex key to complete the operation.

๐Ÿ› Bug Fixes โ€‹

  • ftp: Fixed GFS retention on FTP servers without MLSD support by falling back to dates extracted from backup filenames when server-provided modification times are unavailable.
  • encryption: Smart Recovery (try-all-keys) is now applied during offline config backup restore and decrypted file downloads from the Storage Explorer - both previously failed with "Encryption Profile not found" when the profile ID changed after a key reimport. (#108)
  • encryption: Smart Recovery key-match heuristic now correctly identifies SQLite (.db) and Redis RDB (.rdb) backup files - previously both binary formats were misidentified as "wrong key" because they are not GZIP/PGDMP/TAR/plain-SQL.
  • restore: Fixed "Restore as New Database" mode silently ignoring the typed target name - switching back to "Overwrite Existing" after typing cleared the name without any indication.
  • sqlite: Fixed restore ignoring the target filename set in the database mapping table, causing the backup to overwrite the original file instead of creating a new one.

๐Ÿ”’ Security โ€‹

  • adapters: Adapter connection-test and access-check routes now fail closed - permission checks deny access by default instead of falling through when the check is inconclusive. Thanks @endscene665 (GHSA-h929-x237-c5h2)

๐ŸŽจ Improvements โ€‹

  • retention: GFS retention calculations now use the configured system timezone for day/week/month/year bucketing instead of always using UTC.

๐Ÿงช Tests โ€‹

  • retention: Added comprehensive GFS retention unit tests with realistic multi-month backup sets.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.5.1
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.5.0 - Version History & General Improvements โ€‹

Released: May 31, 2026

โœจ Features โ€‹

  • Jobs Table: Added "Last Run" and "Next Run" columns to the Backup Jobs table. "Last Run" shows the start time of the most recent execution. "Next Run" is computed from the job's cron schedule using the system timezone and displayed in the user's configured timezone and date/time format.
  • Clone Modal: Cloning a Job, Source, Destination, or Notification now opens a confirmation dialog where the name for the clone can be customized before it is created. The default name is pre-filled as "Original Name (Copy)".
  • Database Explorer: Added a new "Version History" tab per source showing the current engine version, a step-line timeline chart of detected version changes over time, and a change log table (previous version โ†’ new version, edition, detected at). History entries are persisted to a new DbVersionHistory table.
  • System Tasks: The hourly "Update Database Versions" task now records a new DbVersionHistory entry whenever the detected server engine version (or edition for MSSQL) changes since the last check. The first observation per source is stored as a baseline.
  • Notifications: Added a new db_version_changed system notification event that fires when a database server's engine version changes between two consecutive checks. The initial baseline observation does not trigger a notification.

๐Ÿ› Bug Fixes โ€‹

  • mssql: Fixed Database Explorer showing "No tables found" for databases that use non-dbo schemas - tables in all schemas are now returned and displayed with a schema.table prefix for non-dbo objects.
  • mssql: Fixed "Total Size" showing "undefined" in the Database Explorer General tab - BIGINT size values returned as strings by the database driver are now converted to numbers.

๐Ÿ”’ Security โ€‹

  • deps: Updated better-auth, @better-auth/passkey, @better-auth/sso 1.6.9 โ†’ 1.6.13 (GHSA-34r5-q4jw-r36m SAML XML injection, passkey replay attack). Added pnpm overrides: fast-xml-builder โ†’ ^1.2.0 (GHSA-5wm8-gmm8-39j9 HIGH + GHSA-45c6-75p6-83cc, via webdav), brace-expansion@5 โ†’ 5.0.6 (GHSA-jxxr-4gwj-5jf2, via eslint-config-next), qs โ†’ ^6.15.2 (GHSA-q8mj-m7cp-5q26, via googleapis), uuid โ†’ ^11.1.1 (GHSA-w5hq-g745-h8pq, via mssql > tedious > @azure/msal-node).

๐ŸŽจ Improvements โ€‹

  • storage: SFTP, FTP, SMB, Rsync, and OneDrive adapters now reuse a single connection for the metadata sidecar (.meta.json) and the backup file upload per job. Previously each upload performed a full connect/auth/disconnect cycle, doubling the SSH/FTP handshake and OneDrive OAuth token requests. Introduced an optional openSession() method on the StorageAdapter interface, adapters without it transparently fall back to the previous stateless behavior, so S3, WebDAV, Dropbox, Google Drive, and local filesystem remain unchanged.

๐Ÿ”ง CI/CD โ€‹

  • deps: Updated next + eslint-config-next 16.2.4 โ†’ 16.2.6, react + react-dom 19.2.5 โ†’ 19.2.6, mssql 12.5.0 โ†’ 12.5.5, nodemailer 8.0.7 โ†’ 8.0.10, basic-ftp 6.0.0 โ†’ 6.0.1, zod 4.4.1 โ†’ 4.4.3, vitest + @vitest/coverage-v8 4.1.5 โ†’ 4.1.7, @types/react 19.2.14 โ†’ 19.2.15, vue (docs) 3.5.28 โ†’ 3.5.35, @aws-sdk/client-s3 + @aws-sdk/lib-storage 3.1039.0 โ†’ 3.1057.0, @hookform/resolvers 5.2.2 โ†’ 5.4.0, date-fns 4.1.0 โ†’ 4.4.0, lucide-react 1.14.0 โ†’ 1.17.0, react-hook-form 7.74.0 โ†’ 7.77.0, tailwind-merge 3.5.0 โ†’ 3.6.0, tailwindcss + @tailwindcss/postcss 4.2.4 โ†’ 4.3.0.
  • deps: Added pnpm override kysely โ†’ 0.28.17 to work around a bug in @better-auth/kysely-adapter@1.6.13 that imports the removed DEFAULT_MIGRATION_LOCK_TABLE export from kysely@0.29.x, which Turbopack now catches as a hard build error.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.5.0
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.4.1 - Multiple Bug Fixes across MSSQL, SMB, Retention, and Storage Adapters โ€‹

Released: May 27, 2026

๐Ÿ› Bug Fixes โ€‹

  • mssql: Fixed backup abort and missing remote cleanup when SSH-transferring more than ~10 databases due to SSH channel exhaustion - the SFTP session is now cached and reused instead of opening a new channel per operation.
  • mssql: Fixed "Arithmetic overflow" crash in Database Explorer and Restore for databases larger than ~2 GB.
  • smb: Fixed .connection-test-* probe files not being deleted when sendFile throws after the remote file was already created.
  • retention: Fixed SMART/GFS tier overlap that incorrectly mapped multiple tiers to the same backup, causing over-aggressive deletion. (#101)
  • storage: Fixed file descriptor leak causing deleted .tar temp files to hold disk blocks until container restart, affecting S3, SFTP, FTP, OneDrive, and tar-utils streams. (#100)

๐ŸŽจ Improvements โ€‹

  • retention: Corrected the retention algorithm abbreviation from "GVS" to "GFS" across UI, documentation, and the built-in retention template.
  • history: Retention execution logs now include the applied retention template name.

๐Ÿงช Tests โ€‹

  • notifications: Updated events.test.ts event count assertions to reflect the new db_version_changed event - NOTIFICATION_EVENTS now has 15 keys (was 14) and EVENT_DEFINITIONS now has 13 entries (was 12).
  • smb: Added unit tests for finally-block cleanup when sendFile throws and for cleanup retry when the delete itself fails.
  • retention: Added regression tests for GFS non-overlapping tier selection and template-name visibility in retention history. (#101)
  • ftp/sftp: Fixed broken upload unit tests by adding missing destroy: vi.fn() to the createReadStream mock - the adapter calls fileStream.destroy() in the finally block, which threw a TypeError without this mock method.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.4.1
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.4.0 - Database Explorer Browser, Drill-down Data Viewer, and Bug Fixes โ€‹

Released: May 25, 2026

โœจ Features โ€‹

  • Database Explorer: Added drill-down table and data viewer with server-side pagination, search, schema inspection, and deep-link URL support for all 7 database adapters. (#92)
  • sources: Added an "Exclude from Restore" toggle to database source settings. Sources marked as excluded are hidden from the restore target dropdown - backups can still be created from them. Thanks @iberlob (#97)

๐Ÿ› Bug Fixes โ€‹

  • Naming Templates: Fixed date tokens (e.g. mm for minutes, dd for day) being incorrectly expanded inside job or database names. Job names containing these substrings (e.g. "Immich" containing "mm", "Grimmory" containing "mm") no longer produce corrupted filenames. Date tokens are now resolved before job/db names are substituted. (#90)
  • DatabasePicker: Fixed the backup job edit dialog becoming unusable when a large number of databases are selected. The trigger button now shows at most 8 database badges and collapses the rest into a "+N more" indicator. (#91)
  • Queue: Fixed scheduled backup jobs remaining stuck as "Pending" indefinitely after a restore operation completes. The restore pipeline now triggers processQueue() in its finally block, mirroring the behaviour of the backup runner. (#95)

๐Ÿงช Tests โ€‹

  • Database Browser: Added unit tests for all 6 browser.ts adapter modules (MySQL, PostgreSQL, MongoDB, MSSQL, Redis, SQLite). Covers getTables and getTableData including parser logic, type mapping, TTL formatting, and search modes. 36 tests total.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.4.0
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.3.3 - Multiple Bug Fixes across MSSQL, Redis, Email, and Storage Adapters โ€‹

Released: May 19, 2026

๐Ÿ› Bug Fixes โ€‹

  • MSSQL: Fixed Database Explorer showing "No user databases found" on production instances. Databases in non-ONLINE states (e.g. RESTORING, Availability Group replicas) are now included, and connection errors are surfaced to the UI instead of silently returning an empty list.
  • Redis: Fixed A credential profile is required but none is assigned error when connecting to a Redis instance without authentication. The credential profile is now optional for Redis - when no profile is assigned, the structural config fields (inline password if any) are used directly, allowing Redis instances without ACL/password to work without a credential profile. (#86)
  • email: Fixed automated email (SMTP) notifications failing with A credential profile is required but none is assigned during backup/restore job runs and system health checks. The v2.3.2 fix only covered the test-connection path; the runner pipeline still used a stricter resolver that threw unconditionally when no profile was assigned. The credential profile is now consistently optional in all code paths - when no profile is assigned, the structural config (host, port, from, to, inline user/password if any) is used directly. (#87)
  • Storage: Fixed orphaned .connection-test-* / .dbackup-test-* files accumulating on remote storage destinations. All 10 storage adapters (FTP/FTPS, SMB, SFTP, WebDAV, S3/R2/Hetzner/AWS, Local, Rsync, Dropbox, Google Drive, OneDrive) placed the remote file deletion inside the try block without a finally guard. If the delete call threw (network hiccup, server-side error, permission edge case), the test file was left behind permanently. Every adapter now uses a remoteFileCreated flag and a finally block to guarantee a best-effort cleanup even when the delete itself fails.
  • Storage: Fixed false "-100% change" spike notifications still triggering for users with a Local Filesystem destination. The v2.3.2 fix updated all 9 cloud/network adapters but missed the Local adapter: its list() catch block returned [] on any I/O error (e.g. a temporarily unmounted fstab disk) instead of throwing. This caused a 0-byte snapshot to be saved and a spike alert to fire, identical to the original bug. The inner fs.access wrapper is removed so the original error code propagates; the outer catch now throws on all errors except ENOENT on non-root sub-paths (legitimate "no backups for this job yet" scenario). (#82)
  • Storage: Fixed the same class of bug in the SMB and FTP adapters. Both use an inner walk() helper that silently swallowed listing errors via catch { return; }. Because the SMB share connection is not established until the first client.list() call (unlike FTP/cloud adapters which connect upfront), any SMB authentication or network failure was silently turned into an empty list. The inner catch now re-throws when currentDir === startDir (root listing = connection/auth failure) and continues silently only for sub-directory errors (e.g. one folder with restricted permissions). (#82)

๐ŸŽจ Improvements โ€‹

  • Storage: Improved UX for S3 Glacier and Deep Archive storage classes. The file list now surfaces the storage class of each object from the AWS ListObjectsV2 response. In the Storage Explorer, Glacier and Deep Archive objects are labeled with an orange "Glacier" or "Deep Archive" badge. Download and Restore action buttons are disabled for archived objects with a tooltip explaining that the object must be restored via the AWS Console first. The S3 download function now throws a descriptive error (instead of returning a generic failure) when AWS returns InvalidObjectState, so the message is surfaced to the user in the UI. The "Storage Class" field description in the adapter configuration form now includes a warning that GLACIER and DEEP_ARCHIVE prevent direct download and restore. (#88)

๐Ÿงช Tests โ€‹

  • Updated Local Filesystem adapter list() tests: replaced "returns empty array on unexpected error" with three new assertions - throws on unexpected readdir errors, throws when the root path (remotePath = "") is inaccessible (ENOENT), and throws on non-ENOENT access errors on sub-paths (EACCES).
  • Updated SMB adapter list() tests: replaced the incorrect "returns empty array on list error" assertion (expected [], now expects throw) with "throws when root directory listing fails"; added "continues when a subdirectory listing fails" to document the intentional silent-skip behavior for non-root walk errors.
  • Updated FTP adapter list() tests: added "throws when initial directory listing fails after connection" covering the case where connectFTP succeeds but the first client.list() call fails (e.g. path does not exist or permission denied). The existing subdirectory-continue test is unchanged.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.3.3
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.3.2 - Backup Trigger Metadata, Job Trigger Locking, and Notification Improvements โ€‹

Released: May 17, 2026

โœจ Features โ€‹

  • Backup Metadata: The trigger source (type and actor) is now stored in each backup's .meta.json sidecar file. The trigger.type field records how the backup was initiated (Manual, Scheduler, or Api). The trigger.actor field records the username or API key name - this can be disabled via the new Privacy settings tab. (#81)
  • Settings: A new "Privacy" tab has been added to System Settings. It currently contains a toggle to opt out of storing the trigger actor (username or API key name) in unencrypted backup metadata files. The setting is enabled by default.
  • Storage Explorer: A new "Triggered by" column shows who or what initiated each backup, using the same badge style as the Activity Log (blue for Manual, violet for Scheduler, teal for API). The column is populated from the backup's metadata sidecar and only appears for backups created after this update.
  • Job Trigger API: The POST /api/jobs/{id}/run endpoint now accepts an optional JSON body with a lock boolean field. When lock: true is set, the created backup is immediately written with locked: true in its .meta.json sidecar - excluding it from all retention policies. The CI container image (skyfay/dbackup:ci) supports this via a new DBACKUP_AUTO_LOCK=1 environment variable. (#80)

๐Ÿ› Bug Fixes โ€‹

  • Notifications: The "Test Connection" button for Email (SMTP) connectors now sends an actual test email to the configured recipient instead of only verifying the SMTP handshake. The success toast shows the recipient address ("Test email sent to โ€ฆ"). If the send fails the error is shown instead of always returning success. (#79)
  • Notifications: The "Test Connection" endpoint now enforces a 10-second timeout. Previously a wrong host or unreachable port caused the loading spinner to spin indefinitely. The user now receives a clear timeout error message instead.
  • Notifications: Fixed email (SMTP) notifications failing with No credential profile assigned to the primary slot when no credential profile is set. The credential profile is now truly optional for the email adapter - if no profile is assigned the structural config (host, port, from, to, inline user/password if any) is used directly, which allows unauthenticated relays and connectors with embedded SMTP credentials to work. (#79)
  • Notifications: Backup and restore jobs no longer hang indefinitely when a notification channel (e.g. an unresponsive SMTP server) does not respond. A 30-second timeout is now enforced on every send() call in the runner pipeline and in the system notification service. A timed-out send is treated as a delivery failure and logged accordingly - the job is never blocked. (#79)
  • Notifications: The "Test" button in Settings / Notifications now correctly reports when delivery failed. Previously the action always returned "Test notification sent" even when every channel errored out internally. It now returns an explicit error when all channels failed, or a partial warning when some failed. (#79)
  • Storage: Fixed false "-100% change" spike notifications. All 10 storage adapters (Local, S3, SFTP, FTP, SMB, WebDAV, Rsync, Dropbox, Google Drive, OneDrive) were silently returning an empty file list on any connection or access error instead of throwing. This caused a 0-byte snapshot to be saved and triggered a -100% spike alert. Two changes were made: (1) all storage adapter list() functions now throw on error instead of returning [], so the existing DB fallback in the stats cache is correctly triggered; (2) storage snapshots and spike checks are skipped for any adapter that fell back to DB estimation, preventing unreliable data from creating false alert history. (#82)

๐Ÿงช Tests โ€‹

  • Updated unit tests for all 9 cloud/network storage adapters (S3, SFTP, FTP, SMB, WebDAV, Rsync, Dropbox, Google Drive, OneDrive) to expect list() to throw on connection/access errors, matching the behavior introduced by the #82 bug fix.
  • Fixed missing prisma.systemSetting mock in the multi-destination upload step tests.
  • Updated executeJob and runJob call assertions to include the third options argument introduced with the lock feature.
  • Fixed 5 system-notification-service test assertions from .toBeUndefined() to .toBeDefined() to match the updated notify() return type.
  • Fixed missing @/lib/prisma mock in tests/unit/runner/steps/03-upload.test.ts causing 10 PrismaClientInitializationError failures in CI (no DATABASE_URL available).
  • Fixed TypeScript build errors: non-nullable trigger type access in 03-upload.ts; notify() return type updated to allow undefined; null-check guard added in notification-settings.ts.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.3.2
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.3.1 - General Improvements, MySQL/MariaDB SSH Mode Fixes and SSH Key Conversion โ€‹

Released: May 11, 2026

๐ŸŽจ Improvements โ€‹

  • Activity Logs: Restore executions now record the initiating user in the "Trigger" column, showing a "Manual" badge with the user's name - the same badge style used for manually triggered backup jobs.

๐Ÿ› Bug Fixes โ€‹

  • SSH: Passphrase-protected private keys in PKCS#8 encrypted format (-----BEGIN ENCRYPTED PRIVATE KEY-----) now work natively without any manual conversion. The keys are transparently decrypted in-memory via Node.js crypto before being passed to the SSH library, which means Ed25519 and other key types with a passphrase are fully supported. This covers the SSH tunnel path (all database adapters), the SFTP storage adapter, and the MSSQL SSH transfer. The Vault credential dialog now shows a helpful amber hint when this format is detected, indicating that the passphrase field must be filled in.
  • MySQL/MariaDB SSH mode: Removed --protocol=tcp from remote command arguments. On HestiaCP and other setups where MariaDB uses the unix_socket auth plugin, forcing TCP caused ERROR 1698 ("Access denied") even with correct credentials. Remote commands now let MariaDB choose the connection method.
  • MySQL/MariaDB SSH mode: Fixed a false positive in the "Test Connection" check. A SELECT 1 step is now run after mysqladmin ping - if authentication actually fails (e.g. ERROR 1045), the test correctly returns failure with the error message instead of a misleading "version unknown" success.
  • MySQL/MariaDB SSH mode: getDatabasesWithStats now falls back to a plain SHOW DATABASES query (returning 0 for size/table count) when the information_schema stats query fails due to restricted permissions. This prevents a hard error in the Database Explorer on restricted setups.

๐Ÿ”„ Changed โ€‹

  • MySQL/MariaDB SSH mode: Passwords are no longer passed via MYSQL_PWD (silently ignored by MariaDB 11.4+). Credentials are now written to a temporary .my.cnf file locally, uploaded to the remote server via SFTP binary transfer (never visible in process lists or shell history), used with --defaults-file (which reads only the temp file, bypassing any system-level /etc/mysql/my.cnf or ~/.my.cnf that could conflict), and deleted immediately after the command completes.
  • MySQL/MariaDB Direct mode: Passwords are no longer passed via MYSQL_PWD for consistency and to support MariaDB 11.4+ client binaries. A temporary .my.cnf file (mode 0600) is now written locally and passed via --defaults-file, then deleted in a finally block.

๐Ÿ“ Documentation โ€‹

  • MySQL/MariaDB source guide: Updated SSH mode description to reflect the SFTP-based password delivery. Added SFTP requirement note (enabled by default on OpenSSH, no extra config needed), clarified SSH user permissions (write to /tmp, no sudo required), added troubleshooting entries for HestiaCP unix_socket auth and disabled SFTP subsystem.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.3.1
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.3.0 - CI Image, Activity Log Trigger and General Improvements โ€‹

Released: May 10, 2026

โœจ Features โ€‹

  • Activity Logs: Executions now record the trigger source. The history table shows a new "Trigger" column with a colored badge indicating how the job was started - "Manual" (Web UI, with the user's name), "Scheduler" (cron-based), or "Api" (with the API key name). Existing executions without trigger data gracefully show a dash. (#72)
  • Instance Name: Added an optional "Instance Name" field under Settings - General. When set, the browser tab title changes to "DBackup | {name}" (e.g. "DBackup | Production"), making it easy to distinguish multiple instances at a glance. The sidebar branding remains unchanged. (#73)
  • Date Format: Added "European (14/01/2026)" (dd/MM/yyyy) as a new date format option in Profile settings. The existing European dot format label was updated to "European (14.01.2026)" for clarity.
  • CI Image: Added skyfay/dbackup:ci - a lightweight Ubuntu-based helper image for triggering DBackup jobs from CI/CD pipelines (GitHub Actions, GitLab CI, Azure DevOps). The image contains only bash, curl, and jq. Thanks @stewieoO (#71)
  • API Trigger Dialog: GitHub Actions, GitLab CI, and new Azure DevOps tabs now use the skyfay/dbackup:ci container image. Pipeline examples are simplified to a single run: /backup/execute.sh step.

๐Ÿ”„ Changed โ€‹

  • Codecov: Set informational: true on the patch coverage check so the Codecov status check never blocks a PR, even when patch coverage is below the target.

๐Ÿ“ Documentation โ€‹

  • webhook-triggers: Replaced the old manual GitHub Actions curl/jq example with a full CI/CD section covering GitHub Actions, GitLab CI, and Azure DevOps using the skyfay/dbackup:ci container image.
  • sqlite: Fixed Docker mount instructions - changed from file-level bind mount to directory-level mount. The Online Backup API (.backup) requires access to WAL/SHM companion files; file-level mounts caused "attempt to write a readonly database" errors. Updated Backup Process section to document the .backup command instead of the old .dump approach.

๐Ÿ”ง CI/CD โ€‹

  • release.yml: Added build-ci-image job that builds and pushes skyfay/dbackup:ci (GHCR + Docker Hub) automatically on every release, running in parallel with the main image build.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.3.0
  • Also tagged as: latest, v2
  • CI Image: skyfay/dbackup:ci
  • Platforms: linux/amd64, linux/arm64

v2.2.1 - Scheduler Timezone Fixes, Smart Recovery Improvements, and more Bug Fixes โ€‹

Released: May 9, 2026

โœจ Features โ€‹

  • profile: Added an "Auto (Browser Timezone)" option to the timezone selector in Profile. New users now default to Auto instead of UTC - timestamps automatically follow the browser's detected timezone without any manual configuration.

๐Ÿ› Bug Fixes โ€‹

  • SQLite: Fixed a silent data-loss bug where backup jobs produced SQL text files instead of valid binary databases. The dump command now uses the SQLite Online Backup API (.backup) producing a proper .db file, fixing WAL-mode databases that previously produced near-empty output. The restore pipeline now uses .restore instead of SQL-via-stdin.
  • Timezone: Schedule picker preview now shows the correct time in the Scheduler Timezone (from Settings - General). The timezone name is appended to the description (e.g. Runs every day at 03:00 (Europe/Berlin)). (#66)
  • Timezone: Dashboard activity chart now groups executions by day using the Scheduler Timezone. Jobs running near midnight are now assigned to the correct day. (#65)
  • Timezone: History table "Started At" column now displays timestamps in each user's own profile timezone instead of forcing the scheduler timezone on everyone.
  • Timezone: Health history tooltip now uses the user's profile timezone for timestamps.
  • Smart Recovery: Fixed Smart Recovery failing for single-DB backups after a key delete and re-import. The content heuristic now checks GZIP magic bytes unconditionally (catches pipeline GZIP and MongoDB --gzip archives without pipeline compression), and adds detection for the PostgreSQL custom dump format (PGDMP magic at offset 0). Previously, only multi-DB TAR archives and plain-text SQL were recognized - all PostgreSQL single-DB backups (which always use pg_dump -Fc binary format) and MongoDB single-DB gzip archives fell through with no match and Smart Recovery always failed. (#58)

๐Ÿ“ Documentation โ€‹

  • Roadmap: Added Restic storage backend as a planned feature. (#68)
  • Timezones guide: Added a new Timezones page explaining the two-timezone model (Scheduler Timezone vs. User Display Timezone), configuration, and troubleshooting.
  • Scheduling guide: Updated the Time Zone section to refer to the Scheduler Timezone UI setting instead of the TZ environment variable.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.2.1
  • Also tagged as: latest, v2
  • Platforms: linux/amd64, linux/arm64

v2.2.0 - Templates System, Docker Image Update and Bug Fixes โ€‹

Released: May 7, 2026

โš ๏ธ Breaking: All existing per-destination inline retention configurations have been migrated to "Keep All (Unlimited)". The new Templates System requires retention to be configured by assigning a named Retention Policy to each job destination. Existing retention rules must be re-configured via Templates -> Retention Policies. You can also mark one policy as the system-wide default so it applies automatically to any destination that has no explicit policy assigned.

โœจ Features โ€‹

  • Templates System: Added a dedicated Templates page under Administration (/dashboard/templates) with three tabs: Retention Policies (reusable named retention rules assignable per destination, with a "Set as Default" option - the default policy is used automatically when no policy is assigned to a destination), Naming Templates (custom backup file name patterns with token insertion, one can be set as system default), and Schedule Presets (named cron expressions usable as quick-fill presets or as live-linked schedules that automatically apply to all linked jobs when updated). (#61)
  • Jobs: Destinations in the Job form now use a Retention Policy picker (instead of inline retention config tabs) to assign a named retention policy per destination. Legacy per-destination retention JSON is still respected as a fallback.
  • Jobs: The Advanced tab of the Job form now includes a Naming Template picker to override the system default file name pattern for that specific job.
  • Jobs: The Schedule field in the Job form now includes a Preset toggle that opens a searchable dropdown of saved Schedule Presets, selecting one auto-fills the cron expression.
  • Jobs: Added a "Browse Backups" button (FolderOpen icon) to the Actions column in the Jobs table, positioned after the Run button. It navigates directly to the Storage Explorer with the destination pre-selected and the job name filter automatically applied (if backups for that job exist). When a job has multiple destinations, a dropdown appears to select which one to open. (#59)
  • Naming Templates - Extended Token Set: Added {job_name} as the canonical job-name token (replaces {name}, which remains supported for backward compatibility). Added MMM (short month name, e.g. Jan) and MMMM (full month name, e.g. January) date tokens. Arbitrary literal text can now be used freely in any pattern without escaping (e.g. prod_{db_name}-yyyy-MM-dd). The template engine was rewritten to perform direct token substitution instead of delegating the full pattern string to date-fns format, eliminating silent misinterpretation of literal characters as format tokens. Token chips in the dialog now insert at the current cursor position, are grouped by category (Job Info, Date, Time), and show a tooltip with a description on hover.
  • Storage Explorer - Default sort: The file list in the Storage Explorer now defaults to sorting by "Last Modified" in descending order so the latest backups are always shown first. (#59)

๐Ÿ› Bug Fixes โ€‹

  • MySQL caching_sha2_password: Fixed authentication failure when connecting to MySQL 8 servers using the caching_sha2_password auth plugin. The Docker base image has been migrated from Alpine (node:24-alpine) to Debian Slim (node:24-slim). The Debian package mariadb-client ships with libmariadb3 3.3.x, which supports caching_sha2_password natively - the Alpine MariaDB client was too old to handle this auth method. (#48)
  • SQLite backups: Fixed missing sqlite3 CLI tools in the Docker image, which caused SQLite backup jobs to fail when the database was mounted locally inside the container. (#62)
  • Smart Recovery: Fixed a bug where restoring after a key delete and re-import always failed, even when the correct key was available. The content heuristic incorrectly rejected uncompressed TAR archives (multi-DB backups) because their headers consist mostly of null-byte padding - Smart Recovery now also detects POSIX TAR magic bytes (ustar at offset 257). (#58)

๐Ÿ—‘๏ธ Removed โ€‹

  • Telegram MarkdownV2: Removed the MarkdownV2 parse mode option from Telegram notification adapters. It caused silent delivery failures while the UI incorrectly reported success. Use HTML or Markdown instead. (#57)

๐Ÿงช Tests โ€‹

  • Improved unit test coverage across multiple services and adapters.
  • Naming Template Engine: Added missing test cases - empty pattern, plain-text passthrough, date-token-in-job-name edge case (documented behavior), and timezone day-boundary shift. Total engine tests: 16.
  • Naming Template Service: Test for getNamingTemplate updated to verify the returned value (was only checking the call, not the result).

๐Ÿ”ง CI/CD โ€‹

  • Docker base image: Migrated from node:24-alpine to node:24-slim (Debian bookworm). The Debian package mariadb-client ships with libmariadb3 3.3.x, which supports the caching_sha2_password authentication plugin natively - fixing the Alpine limitation where the bundled MariaDB client was too old. su-exec replaced with gosu. MongoDB Database Tools bumped to 100.16.1 via direct CDN download (MongoDB ships no Debian 12 arm64 packages - arm64 uses the ubuntu2204-arm64 build, which is compatible with Debian bookworm).
  • Healthcheck: Fixed healthcheck failing when the PORT environment variable was set to a non-default value. The check now uses ${PORT:-3000} and correctly follows the configured port.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.2.0
  • Also tagged as: latest, v2
  • Platforms: linux/amd64, linux/arm64

v2.1.1 - Docker Secrets support and SSH Credential Profile fixes โ€‹

Released: May 5, 2026

โœจ Features โ€‹

  • Docker Secrets: Added _FILE convention support for ENCRYPTION_KEY and BETTER_AUTH_SECRET - set ENCRYPTION_KEY_FILE=/run/secrets/encryption_key to load the value from a file instead of passing it as a plaintext environment variable. Docker Swarm secrets and any file-based secrets manager (Vault Agent, Kubernetes secrets mounted as files) are now supported without a custom entrypoint wrapper. (#53)

๐ŸŽจ Improvements โ€‹

  • Storage Explorer: The "Source" column now shows the database-specific adapter icon (MySQL, PostgreSQL, MongoDB, SQLite, etc.) instead of the generic database icon, matching the icon style used on the Sources page.

๐Ÿ› Bug Fixes โ€‹

  • sources: Fixed "SSH username is required" error when testing an SSH connection for a SQLite source that uses an SSH Credential Profile. The SQLite SSH test button now correctly passes adapterId and sshCredentialId to the test-ssh route so the credential profile is resolved server-side. The route also normalizes SQLite's unprefixed SSH fields (username, authType, etc.) to the standard ssh*-prefixed convention expected by extractSshConfig. Fixed the same credential-profile issue for the remote file browser ("Select Remote Path") in the Configuration tab - sshCredentialId is now forwarded through FieldList and SchemaField to FileBrowserDialog and resolved in the filesystem/remote API route before connecting via SFTP. (#55)

๐Ÿ“ Documentation โ€‹

  • Docker Secrets: Added "Docker Secrets (_FILE convention)" section to the Installation Guide with full setup examples for Docker Swarm and Docker Compose. Added the same convention to the Environment Variables developer reference, including error handling behavior and a link to the install guide.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.1.1
  • Also tagged as: latest, v2
  • Platforms: linux/amd64, linux/arm64

v2.1.0 - Backup Notification Subjects, Telegram Topic Support, and 2FA Setup UX โ€‹

Released: May 5, 2026

โœจ Features โ€‹

  • System Tasks: Each task row in Settings - System Tasks now shows a "Last run" timestamp and a "Next run" timestamp. Both are displayed in the system timezone (Scheduler Timezone setting) and respect the user's configured date and time format.
  • Notifications: Backup notification subjects (email, Discord, Slack, etc.) now include the job name (e.g. "Backup Successful: Production DB" / "Backup Failed: Production DB"), making it easy to identify which job triggered the notification without opening it. (#46)
  • Telegram: Added optional Topic/Thread ID field (messageThreadId) to the Telegram notification adapter, enabling notifications to be sent to a specific topic in Telegram forum groups. Leave the field empty to send to the main chat (fully backwards-compatible). (#45)
  • 2FA: The TOTP setup dialog now has a tab switcher between "QR Code" and "Manual Key". The secret key is hidden by default and can be revealed with the eye icon, supporting manual entry in authenticator apps even without clipboard access (e.g. over plain HTTP). (#39)

๐Ÿ› Bug Fixes โ€‹

  • System Configuration Backup: Credential Profiles (Vault) were missing from config backup export and import. The export now includes all credential profiles (with encrypted data decrypted to plaintext inside the backup, re-encrypted on import). The import restores credential profiles before adapters (required by FK constraint) and correctly remaps primaryCredentialId/sshCredentialId on adapters when IDs differ between systems. Invalid credential references are now silently nulled out with a warning instead of causing a transaction failure.

๐Ÿ”’ Security โ€‹

  • Dependencies: Updated webdav to 5.10.0 to pull in fast-xml-parser >= 5.7.0, fixing an XML Comment/CDATA injection vulnerability (GHSA-gh4j-gqv2-49f6).
  • Dependencies: Added pnpm overrides to force dompurify >= 3.4.0 (fixes 9 XSS/prototype-pollution CVEs in the monaco-editor transitive dependency) and postcss >= 8.5.10 (fixes XSS via unescaped </style> in Next.js transitive dependency, GHSA-qx2v-qp2m-jg93).

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.1.0
  • Also tagged as: latest, v2
  • Platforms: linux/amd64, linux/arm64

v2.0.1 - SSH Connection Fix with new Credential Profiles โ€‹

Released: May 3, 2026

๐Ÿ› Bug Fixes โ€‹

  • sources: Fixed "SSH username is required" error when testing an SSH database source connection that uses an SSH Credential Profile. The test-ssh route now resolves the credential profile before validating the username, matching the behavior of the main test-connection route.
  • sources: Fixed missing placeholder text for SSH Host and SSH Port fields in the SSH Connection tab - added generic sshHost, sshPort, sshUsername, and sshPrivateKey entries to PLACEHOLDERS in form-constants.ts.

๐Ÿงช Tests โ€‹

  • update-service: Fixed 3 failing unit tests that hardcoded '2.0.0' as currentVersion - tests now import version dynamically from package.json so they stay correct after every version bump.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.0.1
  • Also tagged as: latest, v2
  • Platforms: linux/amd64, linux/arm64

v2.0.0 - Credential Profiles, Naming Template, Cloning, and Major Refactor โ€‹

Released: May 3, 2026

โš ๏ธ Breaking: Existing Sources, Destinations and Notifications that store credentials inline will require a Credential Profile to be assigned before they come back online. Create the matching profiles in the Security Vault, then assign them to each adapter via the edit form. This has to be done manually for each adapter, so take some time before upgrading. The new Credential Profile system is a critical security improvement that centralizes and encrypts all secrets in the Vault, but it does require some manual migration effort for existing adapters. New adapters created after the update will require credential profiles from the start.

โœจ Features โ€‹

  • credentials: Added the Generic Credential Profile System - reusable, AES-256-GCM encrypted credential profiles (Username/Password, SSH Key, Access Key, Token, SMTP) that adapters reference instead of storing secrets inline. Profiles are managed in the Security Vault, assigned via a searchable picker in the adapter form, and automatically merged into every backup, restore, health check, and notification at runtime.
  • setup: Added Credential Profile picker to the Quick Setup Wizard Source, Destination, and Notification steps - the picker now renders identically to the standalone "Add Source/Destination/Notification" dialogs, including SSH credential support. The selected profile IDs are included in the adapter creation payload.
  • ui: Added clone (copy) button to Sources, Destinations, Notifications, and Backup Jobs - cloning creates a duplicate with the name suffix "(Copy)" and carries over all settings including Vault credential references. Cloned jobs start as disabled to prevent accidental execution. Resolves #34
  • storage: Added jurisdiction field to the Cloudflare R2 adapter (Standard, EU, FedRAMP) - EU-jurisdiction buckets require the *.eu.r2.cloudflarestorage.com endpoint, without this setting they return "Access Denied" or "bucket does not exist"
  • website: Added a new Website https://dbackup.app
  • scheduler: Added a UI setting in Settings > General to configure the scheduler timezone without changing the TZ environment variable. When set, the DB value takes explicit priority over TZ for all cron jobs. Thanks @iberlob (#41)
  • backup: Added a configurable filename pattern for backup files. Patterns support tokens ({name}, {db_name}, yyyy, MM, dd, HH, mm, ss) with a live preview and clickable token chips in Settings > General. Thanks @iberlob (#41)
  • 2fa: Added a "Can't scan? Copy the secret key" button to the 2FA setup dialog so users who cannot scan the QR code can manually enter the TOTP secret into their authenticator app. (#39)

๐Ÿ› Bug Fixes โ€‹

  • storage: Fixed FTP/FTPS adapter uploading to a doubled path when the job folder contains subdirectories - basic-ftp's ensureDir changes the working directory to the created directory, causing the subsequent uploadFrom call to resolve the relative path against the new CWD instead of root, resulting in a 553 Permission denied error from the server. A cd("/") is now called after ensureDir to reset the working directory before the upload.
  • notifications: Fixed Email (SMTP) From and To fields appearing in both the Connection and Configuration tabs - removed from and to from NOTIFICATION_CONNECTION_KEYS so they only render in the Configuration tab
  • storage: Fixed Google Drive, OneDrive, and Dropbox OAuth redirect URIs using req.nextUrl.origin (resolves to 0.0.0.0:3000 internally) instead of BETTER_AUTH_URL when deployed behind a reverse proxy, causing OAuth failures - Thanks @garrettstoupe
  • jobs: Fixed pipeline Compression selector being permanently disabled for all adapter types on the job form - isNativeCompressionActive now only evaluates to true when a PostgreSQL source is selected and a native compression algorithm (Legacy, Gzip, LZ4, ZSTD) is active. Non-PostgreSQL adapters can always choose a compression algorithm.

๐Ÿ”’ Security โ€‹

  • deps: Updated next from 16.2.2 to 16.2.4 - fixes DoS with Server Components (GHSA-q4gf-8mx6-v5v3)
  • deps: Updated @scalar/api-reference-react from 0.9.18 to 0.9.31 - resolves critical protobufjs arbitrary code execution (GHSA-xq3m-2v4x-88gg) via transitive dependency update
  • deps: Updated better-auth and @better-auth/sso from 1.5.6 to 1.6.9 - resolves drizzle-orm SQL injection (GHSA-gpj5-g38j-94v9) and 4 @xmldom/xmldom XML injection/DoS vulnerabilities via transitive dependency updates
  • deps: Added vite@^7.3.2 as direct devDependency - fixes 3 high-severity path traversal and arbitrary file read vulnerabilities in dev server (GHSA-v2wj-q39q-566r, GHSA-p9ff-h696-f583, GHSA-4w7w-66w2-5vf9)
  • deps: Updated nodemailer from 7.0.13 to 8.0.7 - fixes SMTP command injection via CRLF in transport name and envelope size (GHSA-vvjj-xcjg-gr5g, GHSA-c7w3-x93f-qmm8)

๐ŸŽจ Improvements โ€‹

  • history: Replaced native browser scrollbar with Shadcn ScrollArea in the Notification Log preview dialog, consistent with the Activity Log dialog
  • jobs: Renamed "Security" tab to "Advanced" in the backup job form - the tab contains both Compression and Encryption settings, so "Advanced" is more accurate
  • refactor: Major codebase reorganization - split three oversized files (config-service.ts, restore-service.ts, adapters/definitions.ts) into focused sub-modules via the Facade Pattern, and grouped all loose files in src/lib/ (20 files into 6 folders), src/services/ (19 files into 9 folders), and src/app/actions/ (14 files into 5 folders) into a clear directory structure. Also consolidated src/types.ts into src/types/index.ts, all ~600 import paths across source, tests, and docs were updated and public APIs remain unchanged

๐Ÿ”„ Changed โ€‹

  • docs: Renamed wiki/ folder to docs/ and moved documentation domain from dbackup.app to docs.dbackup.app across all configuration files, app source code, CI/CD workflows, and docs content
  • deps: Bumped minor/patch versions for react, react-dom, tailwindcss, @tailwindcss/postcss, eslint-config-next, vitest, basic-ftp, @aws-sdk/client-s3, @aws-sdk/lib-storage, jsdom, mongodb, mssql, tar-stream, zod, react-hook-form, lucide-react - no breaking changes

๐Ÿ“ Documentation โ€‹

  • SSO: Fixed incorrect SSO callback URL in all provider setup guides - the correct path is /api/auth/sso/callback/{provider-id}, not /api/auth/callback/{provider-id}.
  • credentials: Added a new user-guide page security/credential-profiles.md documenting types, slots, inline creation flow, reference tracking, REVEAL semantics, and the REST surface, added a top-of-page note to security/encryption.md clarifying that the Vault now hosts both an Encryption tab and a Credentials tab, added the page to the security sidebar in .vitepress/config.mts
  • api: Documented the full /api/credentials REST surface in public/openapi.yaml under the Vault tag, including a CredentialType enum and per-type data schemas (UsernamePasswordData, SshKeyData, AccessKeyData, TokenData, SmtpData), plus a new BadRequest shared response
  • api: Added missing POST /jobs/{id}/clone, POST /adapters/{id}/clone, and POST /executions/{id}/cancel endpoints to both public/openapi.yaml and api-docs/openapi.yaml. Fixed ExecutionStatus schema to include the Cancelled value. Extended /adapters/test-connection request body with optional primaryCredentialId and sshCredentialId fields. Synced Vault tag description between both files.
  • adapters: Updated all database source guides (MySQL, PostgreSQL, MongoDB, Redis, MSSQL, SQLite) to replace inline credential fields with Credential Profile pickers (USERNAME_PASSWORD or SSH_KEY type). Added ::: info Credential Profile required boxes with links to the credential-profiles page.
  • adapters: Updated all destination guides (SFTP, FTP, SMB, WebDAV, rsync, Amazon S3, S3-Compatible, Cloudflare R2, Hetzner Object Storage) to replace inline credential fields with Credential Profile pickers (SSH_KEY, USERNAME_PASSWORD, or ACCESS_KEY type). Added setup guide steps to create the credential profile first. Added Jurisdiction field and EU jurisdiction warning to R2 guide.
  • adapters: Updated Email (SMTP) notification guide to replace inline User/Password fields with SMTP credential profile picker.
  • jobs: Added "Filename Pattern" section to jobs/index.md documenting the configurable filename pattern setting (Settings โ†’ General), all supported tokens ({name}, {db_name}, date/time tokens), live preview, and clickable token chips.
  • first-steps: Updated Quick Setup "Advanced tab" reference (renamed from "Security" in v2.0.0) and revised Manual Setup Step 2 (MySQL example) to reference creating a USERNAME_PASSWORD credential profile before adding the source.
  • profile-settings: Added note about "Can't scan? Copy the secret key" button in the 2FA setup dialog.

๐Ÿ—‘๏ธ Removed โ€‹

  • dead-code: Removed unused checkPermission as _checkPermission alias imports from actions/backup/encryption.ts and actions/backup/upload.ts - the symbol was never called in either file
  • dead-code: Removed 43-line developer thought-stream comment block from uploadAvatar() in actions/backup/upload.ts, along with a redundant await getUserPermissions() call that served no authorization purpose

๐Ÿงช Tests โ€‹

  • coverage: Massively expanded the unit test suite across the entire codebase - added hundreds of new tests covering all database adapters (MySQL, PostgreSQL, MSSQL, MongoDB, Redis, SQLite), all storage adapters, notification adapters, the backup pipeline steps, services, auth, crypto, OIDC, and core utilities, bringing the majority of source files to 100% statement and line coverage.

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v2.0.0
  • Also tagged as: latest, v2
  • Platforms: linux/amd64, linux/arm64

v1.4.8 - Scheduler, Runner & TLS Fixes โ€‹

Released: April 24, 2026

๐Ÿ› Bug Fixes โ€‹

  • scheduler: Fixed a race condition where concurrent scheduler.refresh() calls (e.g. saving a job while config-backup settings are updated simultaneously) could create orphaned node-cron tasks that are never stopped. These ghost tasks could cause scheduled jobs to fire more than once per cron interval
  • scheduler: Fixed the scheduler singleton not being stored on globalThis in production mode (NODE_ENV=production). If the module was re-imported in a fresh module scope (a known Next.js standalone behavior), a second independent BackupScheduler instance with its own cron tasks was created
  • runner: Fixed a TOCTOU race condition in performExecution that caused duplicate backup files when two or more jobs are scheduled at the same cron minute. Both processQueue() calls ran concurrently, both found the same Pending execution, and both ran the full backup pipeline. The execution is now claimed atomically via a conditional updateMany (status: "Pending" โ†’ "Running"), the call that gets count=0 back exits immediately without running the backup (#32)
  • tls: Fixed self-signed certificate not including the hostname from BETTER_AUTH_URL as a SubjectAltName (SAN). Browsers like Brave (and per RFC, all browsers) block fetch() API calls when the SAN does not match the accessed hostname, even after manually accepting the certificate warning for the page itself. The generated SAN now includes the hostname/IP extracted from BETTER_AUTH_URL in addition to localhost and 127.0.0.1. On startup, if an existing self-signed cert is missing the configured hostname, it is automatically regenerated. The "Regenerate" button in Settings also benefits from this fix

๐ŸŽจ Improvements โ€‹

  • scheduler: scheduler.refresh() is now fire-and-forget at all call sites (job create/update/delete, config-backup settings save, system-task API). The DB write completes and the response is returned to the browser immediately, the scheduler rebuilds its task list in the background. This eliminates the UI hang that some users noticed when saving settings

๐Ÿ”ง CI/CD โ€‹

  • docker: Added a BuildKit cache mount (--mount=type=cache,target=/app/.next/cache) to the builder stage in the Dockerfile. Combined with the existing type=gha,mode=max layer cache in the release workflow, Next.js reuses its webpack/SWC artefacts for unchanged modules between releases - cutting image build times significantly

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.4.8
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.4.7 - PostgreSQL Compression, MSSQL Dump Fixes & Docker Metadata โ€‹

Released: April 22, 2026

โœจ Features โ€‹

  • postgresql: Added per-job native PostgreSQL dump compression. Jobs with a PostgreSQL source now expose an "Algorithm" selector (Legacy Gzip-6, None, Gzip, LZ4, ZSTD) and a "Level" input under the Security tab. The selection maps directly to pg_dump -Z, allowing e.g. -Z zstd:3 or -Z lz4:1 without modifying the source adapter config (#24)

๐Ÿ› Bug Fixes โ€‹

  • postgresql: Fixed hardcoded -Z 6 in the PostgreSQL dump adapter. Previously, pg_dump always ran with Gzip level 6 regardless of the job's compression setting, resulting in silent double-compression when pipeline Gzip or Brotli was enabled. The adapter now derives the -Z flag from the job's pgCompression setting (legacy jobs are unaffected) (#24)
  • mssql: Fixed Dump failed: No database specified for backup when no databases were selected in the job. The MSSQL adapter now auto-discovers all user databases (matching the behavior of MySQL/PostgreSQL adapters) instead of aborting (#30)
  • backup: Fixed all database adapters (MySQL, PostgreSQL, MSSQL, etc.) only backing up one database when no explicit selection was made in the job config. The source config's default database field was leaking through and overriding the intended "backup all" behavior (#30)

๐Ÿ”ง CI/CD โ€‹

  • docker: Added lz4 and zstd Alpine packages to the base image so that pg_dump (postgresql18-client) can use LZ4 and ZSTD native compression at runtime
  • docker: Added OCI standard labels to Docker image (title, description, url, source, version, revision, created, licenses, vendor) via docker/metadata-action@v5 for better registry compatibility and dependency bot integration (#27) - Thanks @Erwan-loot
  • codecov: Added Codecov integration - codecov.yml, @vitest/coverage-v8, test:coverage script, lcov reporter in vitest.config.ts, and coverage upload step in validate.yml using OIDC (no token secret required)

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.4.7
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.4.6 - Issue Templates and extension corrections โ€‹

Released: April 19, 2026

๐Ÿ”„ Changed โ€‹

  • backup: Multi-database backups now use .tar file extension instead of the adapter-specific extension (e.g. .sql), correctly reflecting the TAR archive format (#25)

๐Ÿ”ง CI/CD โ€‹

  • github: Added GitHub Issue templates for Bug Reports, Feature Requests, Questions/Support, and Documentation Issues

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.4.6
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.4.5 - SSH Backup Fixes with single database selection โ€‹

Released: April 19, 2026

๐Ÿ› Bug Fixes โ€‹

  • postgres: Fixed single-database backups via SSH running pg_dump locally instead of on the remote server, causing "Connection refused" errors (#22)
  • mongodb: Fixed same SSH bypass bug for single-database mongodump backups

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.4.5
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.4.4 - HTTPS Redirect Loop Fix โ€‹

Released: April 18, 2026

๐Ÿ› Bug Fixes โ€‹

  • auth: Fixed infinite redirect loop (ERR_TOO_MANY_REDIRECTS) after login in Docker/HTTPS mode caused by middleware not recognizing the __Secure- cookie prefix that browsers set for HTTPS sessions

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.4.4
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.4.3 - TypeScript Migration, Prisma Upgrade & Security Fixes โ€‹

Released: April 5, 2026

๐ŸŽจ Improvements โ€‹

  • server: Converted custom-server.js to TypeScript (custom-server.ts) for consistent type safety across the codebase - compiled to JS during Docker build via dedicated tsconfig.server.json

๐Ÿ”„ Changed โ€‹

  • database: Upgraded Prisma ORM from v5 to v6 (v6.19.3) for continued security patches and bug fixes
  • SSO: Migrated SSO credential decryption from deprecated $use middleware to $extends query extension API
  • auth: Upgraded better-auth from v1.4.17 to v1.5.6 with SSO hardening, Prisma adapter fixes, and security improvements
  • dependencies: Updated all patch/minor dependencies - Next.js, React, Tailwind CSS, Zod, AWS SDK, Vitest and 20+ other packages

๐Ÿ—‘๏ธ Removed โ€‹

  • auth: Removed deprecated @better-auth/cli package (replaced by npx auth CLI)

๐Ÿ”ง CI/CD โ€‹

  • Docker: Prisma CLI version in Dockerfile is now dynamically read from package.json at build time instead of being hardcoded, ensuring automatic version sync

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.4.3
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.4.2 - Security Fixes โ€‹

Released: April 2, 2026

๐Ÿ”’ Security โ€‹

  • OneDrive: Fixed polynomial ReDoS vulnerability (CWE-1333) in folder path sanitization by replacing regex with iterative string trimming
  • CI/CD: Added explicit permissions: contents: read to sync-gitlab.yml and validate.yml workflows to restrict default GITHUB_TOKEN privileges (CWE-275)
  • Google Drive: Fixed incomplete string escaping in query builder - backslashes are now escaped before single quotes to prevent query injection (CWE-20, CWE-116)
  • API Keys: Upgraded hash from SHA-256 to scrypt (N=16384, r=8, p=1) with automatic migration for existing keys (CWE-916)
  • Filesystem API: Expanded blocked-prefix list for sensitive system paths - now covers Linux (/proc, /sys, /dev), macOS (/System, /Library/Keychains), and Windows WSL paths with dedicated sanitizePath() validation (CWE-22)
  • TAR Extraction: Added Zip Slip protection in multi-DB TAR extraction using path.basename() validation (CWE-22)
  • MSSQL Restore: Added Zip Slip protection in MSSQL TAR extraction using path.basename() validation (CWE-22)
  • TLS Server: Removed environment-derived path from log output to prevent clear-text logging of sensitive directory info (CWE-532)

๐Ÿงช Tests โ€‹

  • Lint Guards: Fixed incomplete regex escaping in glob-to-regex conversion for no-console and no-config-any test helpers (CWE-116)
  • API Keys: Added unit tests for scrypt hashing, deterministic hash output, SHA-256 legacy migration path, and scrypt-is-not-SHA-256 verification

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.4.2
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.4.1 - PostgreSQL Client Cleanup โ€‹

Released: April 2, 2026

๐ŸŽจ Improvements โ€‹

  • PostgreSQL: Restore warning for PostgreSQL โ‰ค 16 now explains that SET transaction_timeout is a cosmetic pg_restore 18 issue and does not affect the restore
  • codebase: Replaced all em dashes with hyphens across source code, docs, and config files for typographic consistency

๐Ÿ—‘๏ธ Removed โ€‹

  • PostgreSQL: Removed multi-version pg_dump/pg_restore strategy (PG 14, 16, 17, 18) - only PostgreSQL 18 client is now installed, which is backward compatible with all supported server versions (12โ€“18)

๐Ÿ”ง CI/CD โ€‹

  • Docker: Simplified Dockerfile by removing postgresql14/16/17-client packages and multi-version symlink setup, reducing image size

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.4.1
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.4.0 - Live History Redesign โ€‹

Released: March 31, 2026

โœจ Features โ€‹

  • logging: Pipeline stage system for backups (Queued โ†’ Initializing โ†’ Dumping โ†’ Processing โ†’ Uploading โ†’ Verifying โ†’ Retention โ†’ Notifications โ†’ Completed) and restores (Downloading โ†’ Decrypting โ†’ Decompressing โ†’ Restoring Database โ†’ Completed) with automatic progress calculation and duration tracking per stage
  • ui: LogViewer redesign with pipeline stage grouping, duration badges, pending stage placeholders, and auto-expanding latest stage during execution
  • ui: Real-time speed (MB/s) and byte progress display for all backup and restore operations - dump, compress, encrypt, upload, download, decrypt, decompress, and SFTP transfer

๐ŸŽจ Improvements โ€‹

  • logging: MongoDB adapter now buffers stderr output and emits it as a single structured log entry instead of flooding the log with individual lines
  • logging: SQLite adapter logs now use typed log levels for consistent display
  • storage: Google Drive adapter now reports intermediate upload progress instead of only 100% at completion
  • storage: Download progress tracking added to S3, SFTP, Google Drive, OneDrive, WebDAV, and FTP adapters for restore operations
  • restore: MySQL/MariaDB SSH restore now shows SFTP upload progress with real-time byte tracking

๐Ÿ› Bug Fixes โ€‹

  • storage: Fixed local filesystem adapter logging "Preparing local destination" twice per upload

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.4.0
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.3.0 - SSH Remote Execution โ€‹

Released: March 29, 2026

โœจ Features โ€‹

  • ssh: SSH remote execution mode for MySQL, MariaDB, PostgreSQL, MongoDB and Redis - database tools (mysqldump, pg_dump, mongodump, redis-cli) run directly on the remote host via SSH instead of requiring a local client or SSH tunnel
  • ssh: New shared SSH infrastructure (src/lib/ssh/) with reusable client, shell escaping, remote binary detection, and per-adapter argument builders
  • ssh: Generic SSH connection test endpoint - "Test SSH" button now works for all SSH-capable adapters, not just MSSQL
  • ui: SSH configuration tab in the source editor for all SSH-capable database adapters (MySQL, MariaDB, PostgreSQL, MongoDB, Redis) with connection mode selector
  • sqlite: Added "Test SSH Connection" button to the SQLite SSH configuration tab, matching all other SSH-capable adapters

๐Ÿ› Bug Fixes โ€‹

  • backup: MySQL, PostgreSQL, and MongoDB backup jobs with no database selected now auto-discover all databases at runtime - MySQL no longer fails with "No database specified", PostgreSQL no longer defaults to the username as database name, and MongoDB SSH listing was fixed by switching mongosh --eval to single quotes to prevent bash ! history expansion from silently corrupting the command, backup metadata is now correctly populated for restore mapping.
  • restore: Restore page no longer shows SQLite-style "Overwrite / Restore as New" UI for server-based adapters - now shows a target database name input when database names are unknown, and auto-discovers database names in backup metadata for future backups
  • ssh: Fixed MySQL/MongoDB SSH restore not consuming stdout, which could cause backpressure and hang/crash the remote process
  • restore: Fixed MySQL SSH restore crashing the Node.js process with OOM (16 GB heap) when restoring large databases - stderr log output is now rate-limited (max 50 messages, 500 chars each) to prevent unbounded memory growth
  • restore: Fixed MySQL restore via SSH failing with "Server has gone away" on large dumps - mysql client now uses --max-allowed-packet=64M to handle large legacy INSERT statements
  • backup: Fixed MySQL dump producing huge INSERT statements that cause OOM kills on remote servers during restore - mysqldump now uses --net-buffer-length=16384 to limit each INSERT to ~16 KB, and mysql client --max-allowed-packet reduced from 512M to 64M to minimize client memory allocatione
  • ui: Fixed Download Link modal overflowing the viewport when a link is generated - dialog now has a max height and scrollable body
  • ui: Fixed Job Status donut chart legend breaking to multiple lines with uneven layout when 3+ statuses (e.g. Completed, Failed, Cancelled) are shown - legend items now flow naturally and stay centered

๐Ÿ”’ Security โ€‹

  • ssh: Fixed database passwords (MYSQL_PWD, PGPASSWORD) being exposed in execution logs when a remote process is killed by OOM or signal - remoteEnv() now uses export statements instead of inline env var prefix, and the MySQL stderr handler redacts known secrets from all output

๐ŸŽจ Improvements โ€‹

  • ui: Redesigned source form for SSH-capable adapters - Connection Mode selector now appears first (like SQLite), SSH Connection tab is shown first in SSH mode so users configure SSH before database credentials
  • ui: Restore page now shows skeleton loading while target databases are fetched via SSH - version compatibility, database mapping, and action buttons are blocked until loading completes
  • ui: Sources and Destinations pages now auto-refresh every 10 seconds to keep health status up to date
  • sqlite: Refactored SQLite SSH client into shared SSH module for code reuse across all database adapters
  • sqlite: SQLite SSH connection test now uses remoteBinaryCheck() from the shared SSH library instead of manual binary checks, try/finally pattern ensures SSH connections are always closed, exit code null handling fixed in dump

๐Ÿ“ Documentation โ€‹

  • wiki: Updated all database source guides (MySQL, MariaDB, PostgreSQL, MongoDB, Redis) with SSH mode configuration, prerequisites, setup guides, and troubleshooting
  • wiki: New "Connection Modes" overview section on the Sources index page explaining Direct vs SSH mode and shared SSH config fields
  • wiki: Added SSH remote execution architecture section to the Developer Guide (database adapters, adapter system, architecture)
  • wiki: Each adapter guide now lists required CLI tools for the remote host with installation commands per OS

๐Ÿงช Tests โ€‹

  • ssh: Added 60 unit tests for shared SSH utilities covering shell escaping, environment variable export, SSH mode detection, config extraction, and argument builders for MySQL, PostgreSQL, MongoDB, and Redis

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.3.0
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.2.1 - Execution Cancellation, MSSQL Progress & Dashboard Polish โ€‹

Released: March 26, 2026

โœจ Features โ€‹

  • execution: Cancel running or pending executions from the live log dialog - a "Cancel" button now appears in the execution header when a backup or restore is in progress
  • execution: New Cancelled status for executions - cancelled jobs are cleanly marked with proper log entries instead of showing as failed

๐Ÿ› Bug Fixes โ€‹

  • mssql: Fixed Database Explorer and Restore page showing 0 databases for MSSQL sources - replaced global singleton connection pool (sql.connect()) with independent per-operation pools (new ConnectionPool()) to prevent concurrent requests from closing each other's connections
  • mssql: Fixed large database backups/restores hanging and timing out - BACKUP DATABASE and RESTORE DATABASE queries now run without request timeout (previously limited to 5 minutes, causing failures on databases >5 GB)
  • explorer: Fixed Database Explorer not displaying server version - removed broken parallel test-connection call and now uses version info returned by database-stats endpoint

๐ŸŽจ Improvements โ€‹

  • mssql: SQL Server progress messages (e.g. "10 percent processed") are now streamed to the execution log in real-time instead of only appearing after the backup/restore completes
  • dashboard: All dashboard widgets (activity chart, job status donut, latest jobs list) now display the Cancelled status with a neutral gray color

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.2.1
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.2.0 - HTTPS by Default, Certificate Management & Per-Adapter Health Notifications โ€‹

Released: March 25, 2026

โš ๏ธ Breaking: Volume mounts have changed. Replace ./db:/app/db and ./storage:/app/storage with a single ./data:/data mount. Then move the current data to the new structure after first startup. Update BETTER_AUTH_URL to https:// - HTTPS is now the default protocol. Set DISABLE_HTTPS=true if you use a TLS-terminating reverse proxy but its not recommended in terms of security.

โœจ Features โ€‹

  • notifications: Per-adapter health check notification opt-out - sources and destinations can individually disable offline/recovery alerts via a toggle in the Configuration tab while health checks continue running
  • security: Built-in HTTPS support - DBackup now defaults to HTTPS with an auto-generated self-signed certificate on first start, protecting all traffic including database passwords, encryption keys, and session cookies
  • security: Certificate management UI - new "Certificate" tab in System Settings to view certificate details (issuer, expiry, fingerprint), upload custom PEM certificates, or regenerate self-signed certs
  • security: HSTS header - when accessed via HTTPS, DBackup now sends Strict-Transport-Security to enforce future HTTPS connections in the browser
  • security: Auto-renewal for self-signed certificates - expired self-signed certs are automatically regenerated on container start, custom certificates are never replaced, only a warning is logged

๐Ÿ”„ Changed โ€‹

  • server: Default protocol changed from HTTP to HTTPS - set DISABLE_HTTPS=true to use plain HTTP (e.g. behind a TLS-terminating reverse proxy)
  • docker: Consolidated volume mounts into single /data directory - replaces separate /app/db, /app/storage mounts with one ./data:/data mount containing db/, storage/, and certs/ subdirectories. /backups remains a separate optional mount for local backups

๐ŸŽจ Improvements โ€‹

  • ui: Edit Configuration dialog now uses Shadcn ScrollArea instead of native browser overflow for consistent scrollbar styling

๐Ÿงช Tests โ€‹

  • security: Added 21 unit tests for certificate-service covering certificate info parsing, upload validation (PEM format, cert-key matching, temp file cleanup), self-signed regeneration, and HTTPS toggle

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.2.0
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.1.0 - Notification System Expansion & UI Improvements โ€‹

Released: March 24, 2026

โœจ Features โ€‹

  • notifications: New "Connection Offline" system notification event - sends an alert when a source or destination becomes unreachable after repeated health check failures, with configurable repeat reminder (default 24h)
  • notifications: New "Connection Recovered" system notification event - sends an alert when a previously offline source or destination becomes reachable again, including downtime duration

๐ŸŽจ Improvements โ€‹

  • ui: Empty state on Settings โ†’ Notifications now links directly to the Notifications page to create an adapter
  • ui: Redesigned permission picker for API Key and Group dialogs - replaced cramped scroll area with a spacious 3-column category card grid, global select/deselect all, and per-category count badges for much better overview

๐Ÿ“ Documentation โ€‹

  • docs: Added "No Vendor Lock-In" messaging to README and Wiki - highlights that backups are standard dumps, decryptable offline with the Recovery Kit and a standalone script

๐Ÿงช Tests โ€‹

  • notifications: Updated event count assertions to match new health check events (14 event types, 12 system event definitions, added health category)
  • runner: Fixed "Closing rpc while fetch was pending" CI failure in notification-logic tests - added missing mocks for dashboard-service and notification-log-service to prevent unresolved dynamic imports during test teardown

๐Ÿ”ง CI/CD โ€‹

  • pipeline: Added Wiki Build stage to validate workflow - ensures the VitePress documentation builds without errors on every PR

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.1.0
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.0.7 - PostgreSQL Version Mismatch Fix & Docker Build Validation โ€‹

Released: March 22, 2026

๐Ÿ› Bug Fixes โ€‹

  • PostgreSQL: Fixed pg_dump version mismatch in Docker container - PostgreSQL 17 backups failed because postgresql17-client and postgresql18-client were not installed, causing fallback to pg_dump 16

๐Ÿ”ง CI/CD โ€‹

  • Docker: Added build-time validation for all pg_dump versions - Docker build now fails immediately if any PostgreSQL client binary is missing or has the wrong version

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.0.7
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.0.6 - Quick Setup fix & Developer Tooling โ€‹

Released: March 22, 2026

โœจ Features โ€‹

  • UI: Documentation menu in the profile dropdown now expands into a submenu with three options: Dokumentation (external docs), API Docs Local (/docs/api), and API Docs Remote (api.dbackup.app)

    Note: Dokumentation link updated to docs.dbackup.app in this release

๐Ÿ› Bug Fixes โ€‹

  • quick-setup: Added missing database selection picker to the job step for adapters that support it (MySQL, MariaDB, PostgreSQL, MongoDB, MSSQL)

๐Ÿ“ Documentation โ€‹

  • README: Replaced static dashboard screenshot with demo video showcasing backup and restore workflow
  • README: Redesigned Features section with categorized subsections, icons, and unique selling points (selective DB backup, live progress, system notifications, UI simplicity)
  • wiki: Added demo video to the documentation homepage
  • API Docs: Fixed DBackup Support link - now points to community support page instead of non-functional email

๐Ÿ”ง CI/CD โ€‹

  • scripts: Added sync-version.sh script and pnpm version:sync / pnpm version:bump <patch|minor|major> commands to sync version across all files automatically

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.0.6
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.0.5 - Docker Permissions & Environment Variables โ€‹

Released: March 20, 2026

โœจ Features โ€‹

  • Docker: Configurable PUID/PGID environment variables (default: 1001) - the entrypoint adjusts the runtime user at startup to match host volume permissions

๐ŸŽจ Improvements โ€‹

  • Dockerfile: Dedicated docker-entrypoint.sh replaces inline CMD - validates PUID/PGID, conditionally chowns /pnpm only when ownership differs, and runs node as PID 1 for proper signal handling
  • Dockerfile: Global Prisma CLI pinned to exact version (5.22.0) matching package.json to prevent version drift
  • Dockerfile: Merged Prisma generate and Next.js build into a single layer, consistent --chown=1001:1001 on all COPY directives

๐Ÿ“ Documentation โ€‹

  • wiki: Documented PUID/PGID environment variables in the environment reference

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.0.5
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.0.4 - Hotfix Release โ€‹

Released: March 20, 2026

๐Ÿ› Bug Fixes โ€‹

  • Dockerfile: Fixed container crash on startup (Can't write to @prisma/engines) caused by globally installed Prisma being owned by root instead of the runtime user

๐Ÿ”ง CI/CD โ€‹

  • pipeline: Added build verification job to release workflow - starts the built image and polls /api/health before publishing, catching runtime permission and startup failures

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.0.4
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.0.3 - Docker Optimization & MSSQL Improvements โ€‹

Released: March 19, 2026

๐Ÿ› Bug Fixes โ€‹

  • MSSQL: Backup and restore errors now show the actual SQL Server cause instead of only "terminating abnormally" by extracting preceding error messages
  • MSSQL: Database Explorer now correctly shows table counts by querying each database individually instead of using a broken cross-database INFORMATION_SCHEMA subquery

๐ŸŽจ Improvements โ€‹

  • Dockerfile: Global Prisma install switched from npm to pnpm for consistency and smaller image size
  • Dockerfile: corepack activated in the base stage so all build stages inherit pnpm without reinstalling
  • Dockerfile: Build now uses pnpm run build and pnpm prisma generate consistently instead of npm/npx
  • Dockerfile: Combined base-stage RUN layers (corepack + PG symlinks), added COPY --link for layer-independent caching, merged runner RUN layers, and added pnpm store mount-cache for faster dependency installs
  • Dockerfile: .dockerignore extended to exclude wiki/, api-docs/, README.md, and LICENSE to reduce build context size

๐Ÿ›  CI/CD โ€‹

  • pipeline: GitHub Releases are now auto-generated from wiki/changelog.md on every version tag push - no manual copy-paste required
  • pipeline: Removed QEMU from Docker builds - amd64 and arm64 now build natively on their respective GitHub runners
  • pipeline: Switched Docker layer cache from GHCR registry to GitHub Actions cache for faster cache hits
  • Dockerfile: Fixed ARM64 build failure (invalid user index: -1) by using numeric UID/GID (1001:1001) instead of user/group names in COPY --link --chown directives

๐Ÿ“ Documentation โ€‹

  • wiki: New user guide article - Encryption Key: explains what ENCRYPTION_KEY protects, what happens when the key is lost or mismatched, and recovery options

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.0.3
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.0.2 - Cleanup & File Extension Fix โ€‹

Released: March 17, 2026

๐Ÿ› Bug Fixes โ€‹

  • backup: Backup files now use adapter-specific extensions (.bak, .archive, .rdb, .db) instead of always .sql
  • restore: "Existing Databases" panel now scrolls correctly when the target server has many databases

๐ŸŽจ Improvements โ€‹

  • codebase: Removed unused components, dead exports, stale commented-out code, and empty directories
  • codebase: Removed unused ServiceResult pattern file and its advisory lint test
  • ui: API Trigger dialog "Overview" tab now shows the correct success field in the trigger and poll JSON examples

๐Ÿ›  CI/CD โ€‹

  • pipeline: Migrated CI/CD from GitLab CI to GitHub Actions with parallel lint, type-check, and unit test jobs
  • pipeline: Multi-arch Docker builds (amd64/arm64) now push to GHCR and Docker Hub with identical tag strategy
  • GitLab: Added GitHub Action to mirror all branches and tags to GitLab for commit activity sync

๐Ÿ“ Documentation โ€‹

  • wiki: Complete overhaul of all adapter guides - unified structure, 4-column config tables verified against code, and collapsible provider examples
  • wiki: Rewrote all 13 destination guides, 6 source guides, and 9 notification guides with accurate default values and required fields

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.0.2
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.0.1 - Hotfix Release & API Documentation โ€‹

Released: March 14, 2026

๐Ÿ› Bug Fixes โ€‹

  • ui: Mouse wheel now works in all CommandList-based dropdowns (Radix ScrollArea bypass)
  • MSSQL: Backup failures now include actual SQL Server error messages instead of only "terminating abnormally"
  • performance: Resolved multiple patterns causing app hangs - parallel health checks with 15s timeout, async MySQL CLI detection, async file I/O, adaptive history polling

๐Ÿ”ง CI/CD โ€‹

  • pipeline: Added validate stage running lint, type-check, and tests in parallel before Docker builds
  • pipeline: Split single docker buildx into parallel amd64/arm64 jobs, combined via imagetools create
  • Docker Hub: Automatically pushes README to Docker Hub on release with absolute image URLs

๐Ÿ“ Documentation โ€‹

  • API: Full OpenAPI 3.1 spec with interactive Scalar reference at /docs/api and api.dbackup.app
  • user guide: Getting Started rewritten and expanded into multi-page User Guide (Getting Started, First Steps, First Backup)
  • README: Revised feature list, added Community & Support section with Discord, GitLab Issues, and contact emails

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.0.1
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v1.0.0 - First Stable Release โ€‹

Released: March 10, 2026

๐ŸŽ‰ DBackup 1.0.0 - the first stable release. Stabilizes the platform after the beta phase with quality-of-life fixes, stale execution recovery, update notifications, and dashboard polish.

โš ๏ธ Breaking: All Prisma migrations squashed into a single 0_init migration. Existing beta databases are not compatible. Export your config via Settings โ†’ Config Backup before upgrading, then re-import after npx prisma migrate deploy.

โœจ Features โ€‹

  • sessions: Configurable session lifetime (1hโ€“90d), sessions tab in profile with browser/OS icons, revoke individual or all other sessions
  • backup: Stale execution recovery - on startup, detects executions stuck in Running/Pending and marks them as Failed
  • notifications: Update notifications when a new version is detected, with deduplication and configurable reminder intervals (default: 7 days)
  • notifications: Storage alerts and update notifications support repeat intervals (Disabled / 6h / 12h / 24h / 2d / 7d / 14d)
  • jobs: Multi-destination fan-out - upload to unlimited storage destinations per job with per-destination retention policies and Partial status
  • jobs: Database selection moved from Source config to Job form with multi-select DatabasePicker
  • config backup: Enhanced import with statistics toggle, smart encryption recovery, name-based deduplication, and FK remapping
  • validation: Sources, Jobs, Encryption Profiles, and Groups enforce unique names with HTTP 409 and descriptive toasts

๐Ÿ”’ Security โ€‹

  • auth: Fixed middleware matcher to correctly apply rate limiting to authentication endpoints
  • adapters: Strict Zod schemas reject shell metacharacters in adapter config fields (command injection prevention)
  • MSSQL: Database name identifiers now properly escaped with bracket notation (SQL injection prevention)
  • SSO: clientId and clientSecret encrypted at rest with AES-256-GCM

๐ŸŽจ Improvements โ€‹

  • scheduler: New dual-mode schedule picker with Simple Mode (frequency pills + dropdowns) and Cron Mode with human-readable descriptions
  • jobs: Form restructured into 4 tabs (General, Destinations, Security, Notify) with database picker and inline retention
  • ui: Replaced orange pulsing update indicator with muted blue styling

๐Ÿ› Bug Fixes โ€‹

  • Redis: Replaced incorrect multi-select database picker with 0โ€“15 dropdown
  • ui: Fixed database icon showing red instead of yellow for Pending executions
  • API: Bash trigger script checks success: true before parsing, documented history:read requirement
  • auth: Split rate limit module into Edge-safe and server-only to avoid node:crypto import in Edge Runtime
  • config backup: Fixed 7 issues including missing Zod field, download crash, meta format detection, and FK violations

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v1.0.0
  • Also tagged as: latest, v1
  • Platforms: linux/amd64, linux/arm64

v0.9.9-beta - Storage Alerts, Notification Logs & Restore Improvements โ€‹

Released: February 22, 2026

โœจ Features โ€‹

  • restore: Backup compatibility matrix - pre-restore version check with green/orange/red banners and MSSQL edition guard
  • MSSQL: SSH test button - tests SSH connectivity, backup path access, and write permissions
  • restore: Dedicated restore page with 2-column layout, file details, database mapping, privileged auth, and version checks
  • storage: Explorer with tabs (Explorer, History, Settings), side-by-side charts, and trend indicators
  • storage: Three alert types (Usage Spike, Storage Limit, Missing Backup) with per-destination config and notification integration
  • settings: Data retention settings - separate retention periods for Audit Logs and Storage Snapshots (7dโ€“5y)
  • notifications: Notification log history with adapter-specific previews (Discord, Email, Slack, Telegram, Teams) and filterable table

๐ŸŽจ Improvements โ€‹

  • email: Template redesign - Shadcn/UI style card layout with zinc palette, color-coded status badges, and dark mode support
  • restore: Rich notification context with database type, storage name, backup filename, duration, and failure details
  • backup: Selective TAR extraction - multi-database restores extract only selected databases, reducing I/O
  • ui: Skeleton loading placeholders across Storage Explorer, History, and Database Explorer
  • storage: Tab-aware refresh - refresh button reloads the active tab instead of always refreshing the file list
  • ui: Database Explorer matches Storage Explorer's visual style with empty state cards

๐Ÿ”„ Changed โ€‹

  • ui: Replaced Radix ScrollArea with native browser scrollbars across all components

๐Ÿ› Bug Fixes โ€‹

  • setup: Fixed "Please select an adapter type first" error in Quick Setup adapter selection
  • setup: Test Connection button now works in all Quick Setup steps

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.9-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.9.8-beta - Notification Adapters Expansion & Quick Setup Wizard โ€‹

Released: February 20, 2026

โœจ Features โ€‹

  • Slack: Incoming Webhooks with Block Kit formatting, color-coded attachments, channel override, and custom bot identity
  • Teams: Power Automate Workflows with Adaptive Cards v1.4 and color mapping
  • webhook: Generic webhook adapter - universal HTTP POST/PUT/PATCH with custom JSON templates, auth headers, and custom headers
  • Gotify: Self-hosted push notifications with configurable priority levels and Markdown formatting
  • ntfy: Topic-based push notifications (public or self-hosted) with priority escalation and emoji tags
  • Telegram: Bot API with HTML formatting, flexible targets (chats, groups, channels), and silent mode
  • Twilio: SMS alerts with concise formatting optimized for message length and E.164 phone numbers
  • setup: Quick Setup Wizard - 7-step guided first-run (Source โ†’ Destination โ†’ Vault โ†’ Notification โ†’ Job โ†’ Run)
  • navigation: Grouped sidebar organized into General, Backup, Explorer, and Administration groups

๐Ÿ“ Documentation โ€‹

  • notifications: Per-channel setup guides for all 9 notification channels

๐Ÿ› Bug Fixes โ€‹

  • scheduler: Enabling/disabling automated config backup now takes effect immediately without restart
  • ui: Storage History button and Health History popover now respect user permissions
  • API: Health History endpoint accepts either sources:read or destinations:read

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.8-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.9.7-beta - API Keys, Webhook Triggers, Adapter Picker & Brand Icons โ€‹

Released: February 20, 2026

โœจ Features โ€‹

  • ui: Visual adapter picker - two-step create flow with card grid, search bar, and category tabs
  • ui: Brand icons - multi-colored SVG logos via Iconify for all adapters, bundled offline for self-hosted deployments
  • MSSQL: SSH/SFTP file transfer for accessing .bak files on remote SQL Server hosts with automatic cleanup
  • MSSQL: Encryption and self-signed certificate toggles exposed in the UI
  • restore: Database stats section showing target server databases with sizes, table counts, and conflict detection
  • explorer: Database Explorer - standalone page to browse databases on any source with server overview and sortable stats
  • auth: API key management - fine-grained permissions, expiration dates, secure storage, full lifecycle
  • API: Webhook triggers - trigger backups via POST /api/jobs/:id/run with cURL, Bash, and Ansible examples
  • auth: Unified auth system - all API routes support both session cookies and API key Bearer tokens
  • Docker: Health check - polls /api/health every 30s returning app status, DB connectivity, and memory usage
  • auth: Configurable rate limits - per-category limits (Auth, API Read, API Write) with auto-save UI
  • backup: Graceful shutdown - waits for running backups, freezes queue, stops scheduler, cleans up pending jobs
  • storage: Grouped destination selector - adapters grouped into Local, Cloud Storage, Cloud Drives, and Network categories
  • adapters: getDatabasesWithStats() - all adapters expose database size and table/collection count
  • ui: Default port placeholders for MSSQL (1433), Redis (6379), and MariaDB (3306)
  • config: Zod-based startup validation for environment variables with clear error messages

๐Ÿ› Bug Fixes โ€‹

  • ui: Fixed cmdk intercepting mouse wheel scroll events in dropdowns
  • ui: Fixed conditional form fields appearing before their controlling dropdown is selected

๐Ÿ“ Documentation โ€‹

  • wiki: API Reference, API Keys, Webhook Triggers, and Rate Limits guides

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.7-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.9.6-beta - Cloud Storage, Rsync & Notification System โ€‹

Released: February 15, 2026

โœจ Features โ€‹

  • notifications: System notification framework for user logins, account creation, restore results, and system errors with per-event toggles
  • email: Multi-recipient tag/chip input with paste support for comma/semicolon-separated lists
  • Google Drive: OAuth 2.0 with encrypted refresh tokens, visual folder browser, and resumable uploads
  • Dropbox: OAuth 2.0 with visual folder browser and chunked uploads for files > 150 MB
  • OneDrive: OAuth 2.0 for personal and organizational accounts with smart upload strategy
  • rsync: Delta transfer via rsync over SSH with Password, Private Key, or SSH Agent auth
  • storage: Usage history - area charts showing storage size over time (7dโ€“1y) with automatic hourly snapshots

๐Ÿ”’ Security โ€‹

  • OAuth: Refresh tokens and client secrets encrypted at rest with AES-256-GCM
  • rsync: Passwords passed via SSHPASS env var, never as CLI arguments

๐ŸŽจ Improvements โ€‹

  • dashboard: Cached storage statistics served from DB cache instead of live API calls, auto-refreshed hourly
  • storage: All storage adapters queried in parallel instead of sequentially

๐Ÿ› Bug Fixes โ€‹

  • dashboard: Fixed Job Status chart stretching when many destinations are configured
  • ui: Fixed missing adapter details for OneDrive, MariaDB, and MSSQL in tables

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.6-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.9.5-beta - Dashboard Overhaul, Checksums & Visual Analytics โ€‹

Released: February 13, 2026

โœจ Features โ€‹

  • backup: SHA-256 checksum verification - end-to-end integrity with checksums on backup, verification on restore, and optional weekly integrity check
  • dashboard: Interactive dashboard with activity chart, job status donut, 7 KPI cards, latest jobs widget, and smart auto-refresh
  • ui: Smart type filters - faceted filters on Sources, Destinations, and Notifications pages
  • WebDAV: Nextcloud, ownCloud, Synology, and any WebDAV server support
  • SMB: Windows servers and NAS devices with configurable protocol version and domain auth
  • FTP: FTP/FTPS servers with optional TLS encryption
  • storage: Per-destination overview widget with backup count and total size from live file scanning

๐Ÿ› Bug Fixes โ€‹

  • backup: File size now reflects actual compressed/encrypted size instead of raw dump size
  • ui: Fixed crash with relative date formatting in DateDisplay component

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.5-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

Released: February 6, 2026

โœจ Features โ€‹

  • backup: wget/curl download links - temporary links with countdown timer, encrypted/decrypted format selection
  • logging: Centralized logger with child loggers, LOG_LEVEL env control, colored dev output (JSON in production)
  • errors: Custom error class hierarchy (DBackupError, AdapterError, ServiceError, etc.) with wrapError() utilities
  • logging: API request middleware logging with method, path, duration, and anonymized IP

๐ŸŽจ Improvements โ€‹

  • adapters: Type-safe adapter configs - all adapters use exported TypeScript types instead of config: any
  • MongoDB: Connection test uses native mongodb npm package instead of mongosh (Docker compatibility)

๐Ÿ—‘๏ธ Removed โ€‹

  • backup: Legacy multi-DB code - removed pg_dumpall, MySQL --all-databases, and MongoDB multi-DB parsing (replaced by TAR in v0.9.1)

๐Ÿ“ Documentation โ€‹

  • wiki: Download tokens, Storage Explorer, and Logging System developer documentation

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.4-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.9.3-beta - Redis Support, Restore UX & Smart File Extensions โ€‹

Released: February 2, 2026

โœจ Features โ€‹

  • Redis: RDB snapshot backups for Redis 6/7/8 with Standalone & Sentinel mode, ACL auth, TLS, and database index selection
  • Redis: 6-step restore wizard with secure download links (5-min expiry) and platform-specific instructions
  • backup: Smart file extensions - adapter-specific extensions: .sql, .bak, .archive, .rdb, .db
  • backup: Token-based downloads - secure, single-use download links (5-min expiry) for wget/curl without session cookies
  • settings: User preferences - auto-redirect toggle for disabling automatic History page redirection on job start
  • Docker Hub: Published at skyfay/dbackup with sensible DATABASE_URL default, TZ and TMPDIR support
  • config: TRUSTED_ORIGINS env var for multiple access URLs (comma-separated)

๐Ÿ› Bug Fixes โ€‹

  • auth: Auth client correctly uses browser origin instead of hardcoded URL

๐Ÿ“ Documentation โ€‹

  • wiki: Consolidated installation guide with Docker Compose/Run tab switcher and environment variables audit

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.3-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.9.2-beta - Branding & Documentation โ€‹

Released: February 1, 2026

โœจ Features โ€‹

  • branding: Official DBackup logo with multi-resolution favicon support and brand integration (login, sidebar, browser tab)
  • docs: Documentation portal launched at docs.dbackup.app with in-app link and Discord community
  • SEO: Meta tags, Open Graph, Twitter Cards, and structured data

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.2-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.9.1-beta - Unified Multi-DB TAR Architecture โ€‹

Released: February 1, 2026

โš ๏ธ Breaking: Multi-database backups now use TAR archives instead of inline SQL/dump streams. Old multi-DB backups cannot be restored with v0.9.1+. Single-database backups are not affected.

โœจ Features โ€‹

  • backup: Unified TAR multi-DB format - all adapters use the same TAR format with manifest.json, enabling selective restore and database renaming

๐ŸŽจ Improvements โ€‹

  • PostgreSQL: Uses pg_dump -Fc per database instead of pg_dumpall for smaller, parallel-ready backups
  • MongoDB: True multi-DB support with --nsFrom/--nsTo renaming on restore

๐Ÿงช Tests โ€‹

  • integration: 84 integration tests - multi-DB tests, MSSQL test setup, Azure SQL Edge ARM64 skip

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.1-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.9.0-beta - Microsoft SQL Server & Self-Service Security โ€‹

Released: January 31, 2026

โœจ Features โ€‹

  • MSSQL: Full adapter with auto-detection of edition/version, multi-DB TAR backups, server-side compression, and parameterized queries
  • auth: Password change from profile settings with audit logging

๐Ÿงช Tests โ€‹

  • testing: Stress test data generator, dedicated testdb container, and MSSQL /tmp cleanup

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.9.0-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.8.3-beta - Meta-Backups & System Task Control โ€‹

Released: January 30, 2026

โœจ Features โ€‹

  • config backup: Self-backup of app configuration (Users, Jobs, Settings) to storage adapters with full restore flow
  • encryption: Profile portability - export/import secret keys for server migration with Smart Recovery
  • settings: System task management - admins can enable/disable background tasks, config backup moved into standard scheduler

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.8.3-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.8.2-beta - Keycloak, Encryption Imports & Database Reset โ€‹

Released: January 29, 2026

โš ๏ธ Breaking: Database schema consolidated into a single init migration. Delete existing dev.db and let the app re-initialize. Data cannot be migrated automatically.

โœจ Features โ€‹

  • SSO: Keycloak adapter - dedicated OIDC adapter with HTTPS enforcement
  • encryption: Profile import for disaster recovery on fresh instances

๐ŸŽจ Improvements โ€‹

  • auth: 2-step email-first login flow with tabbed SSO configuration UI

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.8.2-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.8.1-beta - SQLite Support & Remote File Browsing โ€‹

Released: January 26, 2026

โœจ Features โ€‹

  • SQLite: Backup local and remote (via SSH tunnel) SQLite databases with safe restore cleanup
  • ui: Remote file browser for browsing local and SSH filesystems, integrated into adapter forms
  • SFTP: Distinct Password and Private Key authentication options

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.8.1-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.8.0-beta - The First Beta โ€‹

Released: January 25, 2026

๐Ÿš€ First official Beta with enterprise-ready features.

โœจ Features โ€‹

  • SSO: Full OpenID Connect with Authentik, PocketID, and Generic providers including account linking and auto-provisioning
  • S3: AWS S3 and compatible providers (MinIO, R2, etc.) via AWS SDK
  • SFTP: Secure backup offloading to remote servers with connection testing
  • audit: Comprehensive action tracking with IP, User Agent, change diffs, configurable retention, and faceted filtering
  • MariaDB: Dedicated adapter with dialect handling
  • adapters: Auto-detection of database version and dialect (MySQL 5.7 vs 8.0, etc.)
  • system: Update checker - notifies admins when new versions are available
  • adapters: Visual health history grid and badges for all adapters

๐Ÿ”’ Security โ€‹

  • MySQL: Password handling switched to MYSQL_PWD environment variable

๐Ÿงช Tests โ€‹

  • testing: Unit and integration tests for backup/restore pipelines, storage, notifications, and scheduler

๐Ÿณ Docker โ€‹

  • Image: skyfay/dbackup:v0.8.0-beta
  • Also tagged as: beta
  • Platforms: linux/amd64, linux/arm64

v0.5.0-dev - RBAC System, Encryption Vault & Core Overhaul โ€‹

Released: January 24, 2026

โœจ Features โ€‹

  • auth: RBAC system - user groups with granular permissions, management UI, and protected SuperAdmin group
  • encryption: Recovery kits - offline recovery kits for emergency decryption with master key reveal dialog
  • backup: Native compression support integrated into UI and pipeline
  • backup: Live progress tracking with indeterminate progress bars for streaming
  • auth: API and authentication endpoint rate limiting
  • auth: 2FA administration - admins can reset 2FA for locked-out users

๐ŸŽจ Improvements โ€‹

  • backup: Pipeline architecture - job runner refactored into modular steps with dedicated service layer
  • queue: Max 10 concurrent jobs with optimized MySQL/PostgreSQL streaming
  • ui: DataTables with faceted filtering, Command-based Popovers, and Recovery Kit card UI

Released under the GNU General Public License. | Privacy ยท Legal Notice