Templates System, Docker Image Update and Bug Fixes
⚠️ 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 (
FolderOpenicon) 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). AddedMMM(short month name, e.g.Jan) andMMMM(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 todate-fnsformat, 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 thecaching_sha2_passwordauth plugin. The Docker base image has been migrated from Alpine (node:24-alpine) to Debian Slim (node:24-slim). The Debian packagemariadb-clientships withlibmariadb3 3.3.x, which supportscaching_sha2_passwordnatively - the Alpine MariaDB client was too old to handle this auth method. (#48) - SQLite backups: Fixed missing
sqlite3CLI 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 (
ustarat offset 257). (#58)
🗑️ Removed
- Telegram MarkdownV2: Removed the
MarkdownV2parse mode option from Telegram notification adapters. It caused silent delivery failures while the UI incorrectly reported success. UseHTMLorMarkdowninstead. (#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
getNamingTemplateupdated to verify the returned value (was only checking the call, not the result).
🔧 CI/CD
- Docker base image: Migrated from
node:24-alpinetonode:24-slim(Debian bookworm). The Debian packagemariadb-clientships withlibmariadb3 3.3.x, which supports thecaching_sha2_passwordauthentication plugin natively - fixing the Alpine limitation where the bundled MariaDB client was too old.su-execreplaced withgosu. MongoDB Database Tools bumped to100.16.1via direct CDN download (MongoDB ships no Debian 12 arm64 packages - arm64 uses theubuntu2204-arm64build, which is compatible with Debian bookworm). - Healthcheck: Fixed healthcheck failing when the
PORTenvironment 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