Release: 2.3.0.104 (Canary) 2026-06-04

2.3.0.104_canary_2026-06-04

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

Improved Windows installer

This change brings a major update to the Windows installers, which now integrates the ability to run as a service, as well as generate and use TLS (https). The service feature has been present for a while in the WindowsService.exe tool and the TLS certificates were added as part of the Duplicati.CommandLine.ConfigureTool.exe. With this update these things are now integrated into the installer, and exposed as simple checkboxes to toggle the features. Installing the service from a regular user account, will also auto-generate a secure password and configure the TrayIcon to connect to the service (only for the current user).

If you have installed the service manually, do not activate the new checkbox as it only works if there is no pre-existing service.

NTFS full-disk backup

This release extends the full disk backup feature to include NTFS support on Windows. With this support it is more efficient to make backups of NTFS formatted disks. To enable this feature, add the advanced option --diskimage-filesystem-parsed=true and the backups will attempt to parse the disk, and if it is one of the supported formats, it will only read the relevant sectors.

New Auto-Tune tool

This release also introduces a new AutoTune tool (Duplicati.CommandLine.AutoTuneTool / duplicati-autotune), designed to help evaluate and optimize performance-related settings automatically based on the system.

Read-only testing of backends

Backends now support read-only context-aware testing, which allows testing connections safely without risking unintended changes to the storage. The read-only testing is applied when testing a restore destination or a remote source, such that no files are attempted written to the remote storage.

New welcome page and start

The UI will now show a welcome page showing how to connect to the console with an option to continue without.
This can be suppressed with the option --webservice-suppress-welcome-page=true or environment variable DUPLICATI__SUPPRESS_WELCOME_PAGE=true.

If the connection is made from the TrayIcon, the initial dialog asking to set a password is no longer shown, as the intention is to use the TrayIcon to connect.
It is still possible to change the password from the Settings page if needed.

Detailed list of changes

  • Added handling for extended Win32 file attributes and option to ignore non-local files, such as OneDrive and Dropbox files
  • Fixed showing correct S3 lock mode values
  • Added full disk NTFS support
  • Added AutoTune tool
  • Added read-only testing to backends, thanks @realtek2017
  • Made FS parsing experimental
  • Fixed remote file locking on Windows
  • Fixed SMB source listing misclassifying directories as files, thanks @realtek2017
  • Improved MSI installer package for Service
  • Simplified console handling
  • Cleaned up state after registering
  • Removed explicit defaults in backup config
  • Hardened MSI installer

Changes in ngclient

  • Added toggle to show advanced option names instead of descriptions
  • Added confirmation popup before exporting configuration without encryption
  • Now showing remote lock results on log page
  • Toggling read-only testing of backends based on context
  • Fixed websocket not connecting on welcome page
  • Added a welcome page for simpler console connections
  • Removed attributes filter options on source page, in favor of using advanced options

Having issues with the new installer when used from the command line by my software deployment service. It installed cleanly but the service that was already set up will not start. This is what it was and always was for a very long time:

It complains that Duplicati.WindowsService.exe does not exist, which seems to be the case.

So I tried renaming it to just Duplicati.Service.exe and the service starts but gets stuck as starting then stops after a few minutes. During that time the web UI is available and looks working as I could see the new welcome window in the browser. So the executables are still running but are not controllable with the service manager so I can only kill the processes to stop it now.


Any attempt to start the service is the same

Hi

I’ve tested this release for the Hyper-V guest issue I’ve started experiencing since .103, still getting the same error. I’ve created a new test backup job in .104 as well as an existing job that worked in .102, both give the same error.

That sounds really strange, as Duplicati.WindowsService.exe is used for various things in the installer (if you enable the service there). I also tested many times with install/update scenarios, and I never experienced this.

Can you try an uninstall+install cycle to see if you get Duplicati.WindowsService.exe back?

Yes, that makes sense. The Duplicati.Service is just a generic runner, and it does not have the control interface that is needed to make it into a service. It can start, but it never signals Windows that it is running, so it won’t work.

We have not modified the Hyper-V code for this release, so not sure what is causing it.
Does it work if you downgrade to .102 ?

The error itself indicates that Duplicati tries to get the path to the VMs virtual disk, but gets a non-existing path back.

Hi, I posted this issue on the .103 release thread as well when that version was released. Same problem on .103 and .104. Downgrading to .102 the backup is sucessfull.

I first tried just to install over it but it was still the same, then I tried a repair, still the same and finally uninstall and reinstall but the file does not come back.

This is the original MSI log file and I can see the file is mentioned, it just isn’t getting placed on the server: 178501_Duplicati v2.3.zip (335.1 KB)

Probably a long shot, but did your antivirus scoop it up?

I’ve checked, nothing alerts and I only use MS defender, nothing else

Struggling to get a Fedora 43 server where I upgraded to this version, but was doing the same with .103 - the backup takes forever to start, then never finishes getting the files and all the time there is zero logging in About, Logs, Live no matter what level. Not sure how I can troubleshoot this if nothing is being logged.

*** Update ***
Eventually after a while this appeared

# Exception
System.AggregateException: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (The CancellationTokenSource has been disposed.)
 ---> System.ObjectDisposedException: The CancellationTokenSource has been disposed.
   at Duplicati.Server.Runner.<>c__DisplayClass16_2.<<RunInternalAsync>b__3>d.MoveNext()
   --- End of inner exception stack trace ---
# Message
A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (The CancellationTokenSource has been disposed.)

I think I worked out the issue - with .103 I had enabled the “Backup process isolation” but I thought I had disabled it when I thought better and give it a miss. So basically this is not working at all.

I’m currently rebuilding the job’s database as I tried that and it wasn’t even getting anywhere so I aborted it before disabling the experimental option. Now it’s running and I can also see the logging again.

The delete and repair keeps failing:

2026-06-10 15:01:56 +02 - [Error-Duplicati.Library.Main.Controller-FailedOperation]: The operation Repair has failed
CryptographicException: Failed to read 5 bytes, likely not an encrypted archive

Any suggestions?

Thanks for bringing it up again, it was a larger bug but I found it, and it will be fixed in the next canary. It does not affect stable, because the isolated process runner change that caused it is not in stable yet.

Thanks for confirming. I found the issue, and it happens if you do not install the service (self-managed service). Since the installer now integrates the service management, this apparently has the side-effect that not installing the service will omit the executable. I have fixed it, and it will be in the next canary.

Is “this” the “Backup process isolation” that is not working at all?

That means that the file size is less than 5 bytes. Can you identify a file that is 1-4 bytes? Maybe we can get closer to what is causing it if we know what kind of file it is.

Yes, with that enabled nothing works.

When I check there are around 80 .zip.aes files that are 0Kb and one that that is 5Kb - the rest are 11Kb and larger. Should I delete the 0Kb ones?

I think the 0kb means 0 bytes. If the file is zero bytes, you can certainly delete it as it has zero information.

Are the files all .dlist.zip.aes files or do you see other file types?

Yes, zero bytes - I did try to open one of them and it was empty.

No, a mix of many dblock.zip.aes and some dindex.zip.aes

So I extracted all the files from the release zip and was able to get things going while waiting for the next release. When I tried to run the main backup job it complained about some backup file inconsistencies and that I should run a repair. That didn’t fix it so I tried a delete and repair:

{
  "MainOperation": "Repair",
  "RecreateDatabaseResults": {
    "MainOperation": "Repair",
    "ParsedResult": "Success",
    "Interrupted": false,
    "Version": "2.3.0.104 (2.3.0.104_canary_2026-06-04)",
    "EndTime": "2026-06-18T09:44:49.8709894Z",
    "BeginTime": "2026-06-18T09:40:23.6309346Z",
    "Duration": "00:04:26.2400548",
    "MessagesActualLength": 0,
    "WarningsActualLength": 0,
    "ErrorsActualLength": 0,
    "Messages": null,
    "Warnings": null,
    "Errors": null,
    "BackendStatistics": {
      "RemoteCalls": 1792,
      "BytesUploaded": 0,
      "BytesDownloaded": 307676611,
      "FilesUploaded": 0,
      "FilesDownloaded": 1791,
      "FilesDeleted": 0,
      "FoldersCreated": 0,
      "RetryAttempts": 0,
      "UnknownFileSize": 0,
      "UnknownFileCount": 0,
      "KnownFileCount": 0,
      "KnownFileSize": 0,
      "KnownFilesets": 0,
      "LastBackupDate": "0001-01-01T00:00:00",
      "BackupListCount": 0,
      "TotalQuotaSpace": 0,
      "FreeQuotaSpace": 0,
      "AssignedQuotaSpace": 0,
      "ReportedQuotaError": false,
      "ReportedQuotaWarning": false,
      "MainOperation": "Repair",
      "ParsedResult": "Success",
      "Interrupted": false,
      "Version": "2.3.0.104 (2.3.0.104_canary_2026-06-04)",
      "EndTime": "0001-01-01T00:00:00",
      "BeginTime": "2026-06-18T09:40:23.4398708Z",
      "Duration": "00:00:00",
      "MessagesActualLength": 0,
      "WarningsActualLength": 0,
      "ErrorsActualLength": 0,
      "Messages": null,
      "Warnings": null,
      "Errors": null
    }
  },
  "ParsedResult": "Fatal",
  "Interrupted": false,
  "Version": "2.3.0.104 (2.3.0.104_canary_2026-06-04)",
  "EndTime": "2026-06-18T09:45:00.0397175Z",
  "BeginTime": "2026-06-18T09:40:23.4398632Z",
  "Duration": "00:04:36.5998543",
  "MessagesActualLength": 3725,
  "WarningsActualLength": 4,
  "ErrorsActualLength": 1,
  "Messages": [
    "2026-06-18 11:40:23 +02 - [Information-Duplicati.Library.Main.Controller-StartingOperation]: The operation Repair has started",
    "2026-06-18 11:40:23 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()",
    "2026-06-18 11:40:24 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (3.466 KiB)",
    "2026-06-18 11:40:24 +02 - [Information-Duplicati.Library.Main.Operation.RecreateDatabaseHandler-RebuildStarted]: Rebuild database started, downloading 32 filelists",
    "2026-06-18 11:40:24 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20240614T040021Z.dlist.zip.aes (3.520 MiB)",
    "2026-06-18 11:40:24 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20240614T040021Z.dlist.zip.aes (3.520 MiB)",
    "2026-06-18 11:40:24 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20240717T040010Z.dlist.zip.aes (3.723 MiB)",
    "2026-06-18 11:40:24 +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-06-18 11:40:24 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20240717T040010Z.dlist.zip.aes (3.723 MiB)",
    "2026-06-18 11:40:28 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20240818T040007Z.dlist.zip.aes (3.350 MiB)",
    "2026-06-18 11:40:28 +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-06-18 11:40:28 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20240818T040007Z.dlist.zip.aes (3.350 MiB)",
    "2026-06-18 11:40:31 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20240924T120341Z.dlist.zip.aes (3.496 MiB)",
    "2026-06-18 11:40:31 +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-06-18 11:40:31 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20240924T120341Z.dlist.zip.aes (3.496 MiB)",
    "2026-06-18 11:40:34 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20241101T050001Z.dlist.zip.aes (3.111 MiB)",
    "2026-06-18 11:40:34 +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-06-18 11:40:34 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20241101T050001Z.dlist.zip.aes (3.111 MiB)",
    "2026-06-18 11:40:37 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20241208T020001Z.dlist.zip.aes (4.048 MiB)",
    "2026-06-18 11:40:37 +02 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20241208T020001Z.dlist.zip.aes (4.048 MiB)"
  ],
  "Warnings": [
    "2026-06-18 11:42:43 +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-06-18 11:43:18 +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-06-18 11:43:51 +02 - [Warning-Duplicati.Library.Main.Database.LocalRecreateDatabase-MissingVolumesDetected]: Replaced blocks for 2 missing volumes; there are now 2 missing volumes",
    "2026-06-18 11:44:35 +02 - [Warning-Duplicati.Library.Main.Database.LocalRecreateDatabase-MissingVolumesDetected]: Replaced blocks for 2 missing volumes; there are now 0 missing volumes"
  ],
  "Errors": [
    "2026-06-18 11:45:00 +02 - [Error-Duplicati.Library.Main.Controller-FailedOperation]: The operation Repair has failed\r\nUserInformationException: Some zero-length metadata entries could not be repaired."
  ],
  "BackendStatistics": {
    "RemoteCalls": 1792,
    "BytesUploaded": 0,
    "BytesDownloaded": 307676611,
    "FilesUploaded": 0,
    "FilesDownloaded": 1791,
    "FilesDeleted": 0,
    "FoldersCreated": 0,
    "RetryAttempts": 0,
    "UnknownFileSize": 0,
    "UnknownFileCount": 0,
    "KnownFileCount": 0,
    "KnownFileSize": 0,
    "KnownFilesets": 0,
    "LastBackupDate": "0001-01-01T00:00:00",
    "BackupListCount": 0,
    "TotalQuotaSpace": 0,
    "FreeQuotaSpace": 0,
    "AssignedQuotaSpace": 0,
    "ReportedQuotaError": false,
    "ReportedQuotaWarning": false,
    "MainOperation": "Repair",
    "ParsedResult": "Success",
    "Interrupted": false,
    "Version": "2.3.0.104 (2.3.0.104_canary_2026-06-04)",
    "EndTime": "0001-01-01T00:00:00",
    "BeginTime": "2026-06-18T09:40:23.4398708Z",
    "Duration": "00:00:00",
    "MessagesActualLength": 0,
    "WarningsActualLength": 0,
    "ErrorsActualLength": 0,
    "Messages": null,
    "Warnings": null,
    "Errors": null
  }
}

How do I fix a The operation Repair has failed. UserInformationException: Some zero-length metadata entries could not be repaired?