Release: 2.3.0.106 (Canary) 2026-07-03

2.3.0.106_canary_2026-07-03

This release is a canary release intended to be used for testing.

Sync copy mode

This release adds a often requested feature that enables simple copying of files from source to destination.
Where the regular backups are deduplicated, compressed, encrypted and versioned, the new sync mode will instead simply copy from source to destination.

The copy is currently a one-way sync, where the source is replicated on the destination. Files can be deleted on the destination during sync (use --sync-then-delete), but destination folders will not be deleted.

The option --sync-remote-state is by default be set to UseRemoteState which will list the destination and figure out what to upload. The setting UseLocalState uses a local database, similar to how backups work, to keep track of known remote files, and reduce the amount of remote listings done. Finally, the BlindlyUpload setting will just copy everything as-is to the remote.

The sync jobs support remote sources, snapshots, and multiple destinations. If snapshots are enabled, the copy is done from the snapshot, ensuring reliable reads.

Configuration of such a sync job is done the same way as with backup, but using a toggle option in the first step of the UI. Note that backup and sync jobs are not compatible as they use very different storage logic, so it is not possible to change the job mode after creating a job.

CLI mode also supports sync.

Multi version restore

A new option, --restore-all-files can be used to restore files matching a filter from multiple versions. This can be used to select specific versions and then restore a set of files in all versions. This option does not currently have a UI component.

Detailed list of changes

  • Fix MacOS Photos memory usage.
  • Fix Agent startup race condition.
  • Warn when VCRedist is missing on VSS failure.
  • Update localizations.
  • Fix incorrect help text for remote locks.
  • Added a restore callback module.
  • Added support for restoring files across multiple versions.
  • Added a sync command to the Controller and CLI.
  • Prevent creating a useless encryption key on startup.
  • Added an option to control OCSP/CRL failure handling.
  • Improved the secret provider loader and license checker.
  • Bumped SQLite and StreamJson dependencies.

UI changes

  • Added support for editing sync jobs
  • Show multiple destinations on overview
  • Updated localizations
  • Fixed issue with forcing lock refresh
  • Updated ShipUI and Angular

Still cannot delete+recreate a database for one of my Windows server

  "Messages": [
    "2026-07-04 10:28:05 +02 - [Information-Duplicati.Library.Main.Controller-StartingOperation]: The operation Repair has started",
    "2026-07-04 10:28:05 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()",
    "2026-07-04 10:28:05 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (3.500 KiB)",
    "2026-07-04 10:28:06 +02 - [Information-Duplicati.Library.Main.Operation.RecreateDatabaseHandler-RebuildStarted]: Rebuild database started, downloading 32 filelists",
    "2026-07-04 10:28:06 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20240614T040021Z.dlist.zip.aes (3.520 MiB)",
    "2026-07-04 10:28:06 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20240614T040021Z.dlist.zip.aes (3.520 MiB)",
    "2026-07-04 10:28:06 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20240717T040010Z.dlist.zip.aes (3.723 MiB)",
    "2026-07-04 10:28:06 +02 - [Information-Duplicati.Library.Compression.ZipCompression.FileArchiveZip-CompressionReadErrorFallback]: Failed to open file with built-in ZIP archive, falling back to SharpCompress\r\nInvalidDataException: The archive entry was compressed using LZMA and is not supported.",
    "2026-07-04 10:28:06 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20240717T040010Z.dlist.zip.aes (3.723 MiB)",
    "2026-07-04 10:28:10 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20240818T040007Z.dlist.zip.aes (3.350 MiB)",
    "2026-07-04 10:28:10 +02 - [Information-Duplicati.Library.Compression.ZipCompression.FileArchiveZip-CompressionReadErrorFallback]: Failed to open file with built-in ZIP archive, falling back to SharpCompress\r\nInvalidDataException: The archive entry was compressed using LZMA and is not supported.",
    "2026-07-04 10:28:10 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20240818T040007Z.dlist.zip.aes (3.350 MiB)",
    "2026-07-04 10:28:13 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20240924T120341Z.dlist.zip.aes (3.496 MiB)",
    "2026-07-04 10:28:13 +02 - [Information-Duplicati.Library.Compression.ZipCompression.FileArchiveZip-CompressionReadErrorFallback]: Failed to open file with built-in ZIP archive, falling back to SharpCompress\r\nInvalidDataException: The archive entry was compressed using LZMA and is not supported.",
    "2026-07-04 10:28:13 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20240924T120341Z.dlist.zip.aes (3.496 MiB)",
    "2026-07-04 10:28:16 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20241101T050001Z.dlist.zip.aes (3.111 MiB)",
    "2026-07-04 10:28:16 +02 - [Information-Duplicati.Library.Compression.ZipCompression.FileArchiveZip-CompressionReadErrorFallback]: Failed to open file with built-in ZIP archive, falling back to SharpCompress\r\nInvalidDataException: The archive entry was compressed using LZMA and is not supported.",
    "2026-07-04 10:28:16 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20241101T050001Z.dlist.zip.aes (3.111 MiB)",
    "2026-07-04 10:28:19 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20241208T020001Z.dlist.zip.aes (4.048 MiB)",
    "2026-07-04 10:28:19 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20241208T020001Z.dlist.zip.aes (4.048 MiB)"
  ],
  "Warnings": [
    "2026-07-04 10:30:29 +02 - [Warning-Duplicati.Library.Main.Operation.RecreateDatabaseHandler-MissingFileDetected]: Remote file referenced as duplicati-b64453779588246e39e271e650b085228.dblock.zip.aes by duplicati-i836147d0459948d4a5d7663528f26aab.dindex.zip.aes, but not found in list, registering a missing remote file",
    "2026-07-04 10:31:07 +02 - [Warning-Duplicati.Library.Main.Operation.RecreateDatabaseHandler-MissingFileDetected]: Remote file referenced as duplicati-bf8a849d0b03543a683c0eed123f95a0b.dblock.zip.aes by duplicati-ic6525ccb791744ec9078123e24f4896f.dindex.zip.aes, but not found in list, registering a missing remote file",
    "2026-07-04 10:31:42 +02 - [Warning-Duplicati.Library.Main.Database.Local.LocalRecreateDatabase-MissingVolumesDetected]: Replaced blocks for 2 missing volumes; there are now 2 missing volumes",
    "2026-07-04 10:32:30 +02 - [Warning-Duplicati.Library.Main.Database.Local.LocalRecreateDatabase-MissingVolumesDetected]: Replaced blocks for 2 missing volumes; there are now 0 missing volumes"
  ],
  "Errors": [
    "2026-07-04 10:32:56 +02 - [Error-Duplicati.Library.Main.Controller-FailedOperation]: The operation Repair has failed\r\nUserInformationException: Some zero-length metadata entries could not be repaired."

Not sure if this is the best place to report this, but in this version I can’t search for advanced options: there’s a search field, and it has focus, but typing does nothing.

2.3.0.106_canary_2026-07-03, macOS 26.5.2, using Safari 26.5.2 in ngclient.

Thanks for reporting! I can reproduce.

We updated the UI library with this release, and apparently something failed in the process.

Sorry, forgot to follow up on this.

This means that Duplicati was unable to make a fix for the missing metadata.
You can run with ---disable-replace-missing-metadata=true.
This will cause Duplicati to instead remove the entries that it could not repair.

So I went into job’s Database menu, and deleted it, then in the Command menu I ran a repair adding the parameter you mentioned, without the extra “-” :wink: but it still fails:
starting

 Listing remote folder ... 
   Downloading file duplicati-20240614T040021Z.dlist.zip.aes (3.520 MiB) ... 
   Downloading file duplicati-20240717T040010Z.dlist.zip.aes (3.723 MiB) ... 
 Failed to open file with built-in ZIP archive, falling back to SharpCompress => The archive entry was compressed using LZMA and is not supported. 
   Downloading file duplicati-20240818T040007Z.dlist.zip.aes (3.350 MiB) ... 
 Failed to open file with built-in ZIP archive, falling back to SharpCompress => The archive entry was compressed using LZMA and is not supported. 
   Downloading file duplicati-20240924T120341Z.dlist.zip.aes (3.496 MiB) ... 
 Failed to open file with built-in ZIP archive, falling back to SharpCompress => The archive entry was compressed using LZMA and is not supported. 
   Downloading file duplicati-20241101T050001Z.dlist.zip.aes (3.111 MiB) ... 
 Failed to open file with built-in ZIP archive, falling back to SharpCompress => The archive entry was compressed using LZMA and is not supported. 
   Downloading file duplicati-20241208T020001Z.dlist.zip.aes (4.048 MiB) ... 

ending

   Downloading file duplicati-iff89540bc11b419f8edacf0a7e7a647f.dindex.zip.aes (126.575 KiB) ... 
   Downloading file duplicati-iffa5b3e307b74252b0844fd0e7ece7df.dindex.zip.aes (97.997 KiB) ... 
 Replaced blocks for 2 missing volumes; there are now 2 missing volumes 
 Replaced blocks for 2 missing volumes; there are now 0 missing volumes 
 The operation Repair has failed => Some zero-length metadata entries could not be repaired. 
 
 
 ErrorID: MetadataRepairFailed 
 Some zero-length metadata entries could not be repaired. 
 Return code: 100 

I couldn’t find this logged anywhere on the server, nor could I get back the command it ran in case I had entered it incorrectly.

I just noticed that none of my Linux servers can connect to their SMB destinations, when I do a test in the Job settings I get


All my Windows servers are able to access their shares and I checked the ones not working from a Windows machine and it’s fine.

Ok, I am looking into it, trying to reproduce somehow. At least for the next version I have a counter on the failure.

There were no updates to the SMB module. Is this still an issue?
The error code is 0xC0000102 which translates to:

STATUS_FILE_CORRUPT_ERROR “{Corrupt File} The file or directory is corrupt and unreadable. Please run the Chkdsk utility.”

So indicating that something is really not working on the SMB server side?

I think I found the problem and it’s not on my SMB server’s side - the password has a $ symbol, so when I try a mount command on any of my Linux machines, but don’t put the password in single-quotes, it fails, when I place quotes around it, then it’s fine. Now why this has suddenly happened is beyond me as all my machines were all fine before until this latest build.

I tried to add the quotes in the UI but that doesn’t help - the account is used in many jobs so changing it just to pander to Linux’s behaviour with special characters will take me forever. I have a note to someday use the new credential storage so maybe in the future I’ll have time to look at it and save myself the headache in case it happens again.

That could make sense if the default credential provider somehow kicks in.
If the password looks like: mypass$abc then the secret provider will pick up $abc and try to resolve abc. But since that key is (most likely) not found, the whole backup should fail.

Could you try to enter the real password on the connection page before pressing “Test” and see if that works? It really should work, and if not I have to dig and see where this goes wrong.

Edit: but a wrong password is not consistent with error code. It should be access denied if the password is wrong.

I’d already tried that on the job’s destination settings, so this time I tried using the new Destinations feature and try to create a new one:


I hit browse and get

Under DUPLICATI should be two sub folders, and I tried both directtcp and netbios
I then went on a working Windows server to try the same but it also failed - when I checked its job it’s still using Local Filesystem for the destination and specifies a file:// URL that includes the path+credentials, which explains why the Windows machines all still work.

FYI, things got weirder - I did some checks using my Linux tablet and was able to get it to replicate the issue. I fixed that by running a CHKDSK of the server drive and after that the folders/files were visible - this makes no sense as from Windows machines there was no problem. I was then able to run the backups now, so that’s sorted.

However, in trying to switch my Windows server from the file:// to a stored destination I found another problem - I cannot browse folders, they always show as 0 Bytes yet if I specify the subfolder and then browse it works.

No path, cannot click on DUPLICATI, nothing happens:


DUPLICATI entered for path, again nothing clicks:

DUPLICATI/DP entered as path, so it can see files: