Release: 2.1.0.113 (Canary) 2025-04-11

2.1.0.113_canary_2025-04-11

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

Major changes in this version

The ServerUtil tool can now ouput JSON instead of regular text.

Support for Zip64 is now always enabled, so manual data extraction requires a Zip64 enabled tool.

Added support for creating pre-authenticated headers to better support proxy setups.

Improved handling of duplicated blocks, both on compact and on backup.

Added support for Filen and Filejump storage destinations.

Potentially breaking changes (from 2.1.0.109)

  • Location of data folder has changed in some cases, refer to previous release for details
  • Permissions are now applied to the data folder, refer to previous release for details
  • New user interface, ngclient is the default; there is a button to switch between the two

Detailed list of changes:

  • Improved build process and added checks for missing and outdated libraries
  • Improved anti-sleep on Windows
  • Added option to emit machine-readable JSON from ServerUtil / duplicati-server-util
  • Fixed issue with Mega backend not authenticating
  • Added back missing options to MSGraph based backends
  • Improved Zip64 support (always on)
  • Prevent crashes when unable to set permissions on data folder or database
  • Added Filen.io backend
  • Fixed some delivery failures to Telegram
  • Prevent setting permissions on data folder from ServerUtil
  • Added support for pre-authenticated headers in selfhosted (proxy) setups
  • Stop early if restoring a backup and no passphrase is supplied
  • Removed a warning show when using relative restore version time
  • Removed positional arguments from SQL queries
  • Improved number of blocks that can be discarded during compact
  • Improved storage re-use if files are added/removed/added
  • Fixed a case where connections were not closed after use
  • Updated Wasabi S3 endpoints
  • Fixed locale-sensitive parsing bug for fr-CA
  • Added rclone to Docker images, thanks @wjansenw
  • Added Filejump backend
  • Fixed some error flows during restore with missing data

Ngclient changes:

  • Fixed external links opening in new window
  • Show error messages when testing connection
  • Fixed bug with not setting server interface
  • Added a tab to show crash log data
  • Added sorting to list of backups
  • Added Filen backend support
  • Fixed removing backup when deleting
  • Fixed dropping config file for restore
  • Error messages can be dismissed
  • Added support for date-time options
  • Added live-logs and improved logs area
  • Added controls for entering timespans
  • Improved status bar and loading messages
  • Fixed cases of white start screen
  • Fixed issues with settings page not updating
  • Fixed issue with loading exported config with path-encoded url
  • Fixed File browser starting in broken state if path is missing
  • Added support for Filejump backend
  • Fixed issues with parsing dblock-size
  • Added support for retention settings
  • Fixed issues with timespans on edits
2 Likes

has been filed (and I personally would prefer they come here to post, but we’ll see).

Mine came up fine on first use, but I use a script specifying its server-datafolder.

Simply typing Duplicati.GUI.TrayIcon from my out-of-the-way .zip file install starts,
however jobs are missing. I use Resource Monitor search for Duplicati-server.sqlite.

2.1.0.112 uses the folder I expect, %LOCALAPPDATA%\Duplicati
2.1.0.113 uses a data folder it made below executable. I didn’t set portable-mode.

As a side issue, are all these language folders doing anything besides adding clutter?

EDIT 1:

This use of the wrong server database also explains my early surprise when I got this:

but I didn’t make much of it then, as it’s a test database and can be in many odd ways.
To clarify my tests with different versions above, I just cd to different zip-extract folder.

1 Like

I ran the installer for the previous Canary build, intending to revert. It threw an error, but running it again with the Repair option completed the reversion.

I’ll know next time to post here and not at github :sweat_smile:

My message there is v2.1.0.113_canary_2025-04-11 crashes on startup · Issue #6150 · duplicati/duplicati · GitHub

I find this an easier discussion forum, especially for early dialogs with multiple people.

It’s also good to have new Canary bugs in one place to warn users, alert the dev, etc.

Sometimes they turn into GitHub issues that backreference here. My opinion anyway.

I think you put an extra underscore on your link somehow, but I think you’re clavelm.

https://forum.duplicati.com/u/clavelm80/summary is who I thought you are here.

Anyway, I installed 2.1.0.113 on Windows to see if it would show a problem like yours.

It does. Launch from Desktop shortcut starts and stops. Same from Command Prompt, which is disappointing since that’s sometimes a way to see messages other ways miss.

Event Viewer → Windows logs → Application does find one:

Application: Duplicati.GUI.TrayIcon.exe
CoreCLR Version: 8.0.1224.60305
.NET Version: 8.0.12
Description: The process was terminated due to an unhandled exception.
Exception Info: System.TypeInitializationException: The type initializer for 'Duplicati.Library.AutoUpdater.PreloadSettingsLoader' threw an exception.
 ---> System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Duplicati 2\data\' is denied.
   at System.IO.FileSystem.CreateDirectory(String fullPath, Byte[] securityDescriptor)
   at System.IO.Directory.CreateDirectory(String path)
   at Duplicati.Library.AutoUpdater.DataFolderManager.GetDataFolder(AccessMode mode)
   at Duplicati.Library.AutoUpdater.PreloadSettingsLoader..cctor()
   --- End of inner exception stack trace ---
   at Duplicati.Library.AutoUpdater.PreloadSettingsLoader.GetExecutableMergedSettings(NamedExecutable executable, Boolean portableMode)
   at Duplicati.Library.AutoUpdater.PreloadSettingsLoader.ConfigurePreloadSettings(String[]& arguments, NamedExecutable executable, Dictionary`2& dbsettings)
   at Duplicati.Library.AutoUpdater.PreloadSettingsLoader.ConfigurePreloadSettings(String[]& arguments, NamedExecutable executable)
   at Duplicati.GUI.TrayIcon.Program.Main(String[] _args)
   at Duplicati.GUI.TrayIcon.Net8.Program.<>c__DisplayClass0_0.<Main>b__0()
   at Duplicati.Library.Crashlog.CrashlogHelper.WrapWithCrashLog[T](Func`1 method)
   at Duplicati.GUI.TrayIcon.Net8.Program.Main(String[] args)

so these might all be the same bug (or at least the same first crash). I previously said that --server-datafolder option on launch seems to avoid it, but that’s not always the case.

Next crash looks like this:

C:\Program Files\Duplicati 2>Duplicati.GUI.TrayIcon --server-datafolder=%LOCALAPPDATA%\Duplicati

C:\Program Files\Duplicati 2>Crash!
Duplicati.Library.Interface.UserInformationException: Server crashed on startup
 ---> System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Duplicati 2\Duplicati-trayicon.debug.log' is denied.
   at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at Duplicati.Library.Logging.StreamLogDestination..ctor(String filename)
   at Duplicati.Server.LogWriteHandler.SetServerFile(String path, LogMessageType level)
   at Duplicati.Server.Program.ConfigureLogging(Dictionary`2 commandlineOptions)
   at Duplicati.Server.Program.Main(String[] _args)
   at Duplicati.GUI.TrayIcon.HostedInstanceKeeper.<>c__DisplayClass3_0.<.ctor>b__0(Object _)
   --- End of inner exception stack trace ---
   at Duplicati.GUI.TrayIcon.HostedInstanceKeeper..ctor(String[] args)
   at Duplicati.GUI.TrayIcon.Program.Main(String[] _args)
   at Duplicati.GUI.TrayIcon.Net8.Program.<>c__DisplayClass0_0.<Main>b__0()
   at Duplicati.Library.Crashlog.CrashlogHelper.WrapWithCrashLog[T](Func`1 method)
Failed to write crashlog: System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Duplicati 2\Duplicati.GUI.TrayIcon-crashlog.txt' is denied.
   at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.File.OpenHandle(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize)
   at System.IO.File.WriteToFile(String path, FileMode mode, String contents, Encoding encoding)
   at Duplicati.Library.Crashlog.CrashlogHelper.LogCrashException(Exception ex)
Unhandled exception. Duplicati.Library.Interface.UserInformationException: Server crashed on startup
 ---> System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Duplicati 2\Duplicati-trayicon.debug.log' is denied.
   at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at Duplicati.Library.Logging.StreamLogDestination..ctor(String filename)
   at Duplicati.Server.LogWriteHandler.SetServerFile(String path, LogMessageType level)
   at Duplicati.Server.Program.ConfigureLogging(Dictionary`2 commandlineOptions)
   at Duplicati.Server.Program.Main(String[] _args)
   at Duplicati.GUI.TrayIcon.HostedInstanceKeeper.<>c__DisplayClass3_0.<.ctor>b__0(Object _)
   --- End of inner exception stack trace ---
   at Duplicati.GUI.TrayIcon.HostedInstanceKeeper..ctor(String[] args)
   at Duplicati.GUI.TrayIcon.Program.Main(String[] _args)
   at Duplicati.GUI.TrayIcon.Net8.Program.<>c__DisplayClass0_0.<Main>b__0()
   at Duplicati.Library.Crashlog.CrashlogHelper.WrapWithCrashLog[T](Func`1 method)
   at Duplicati.GUI.TrayIcon.Net8.Program.Main(String[] args)

and it isn’t current directory based. Still uses the program install folder from cd elsewhere.

I haven’t yet run with portable-mode explicitly = false, but am wondering if it’s wired on:

Seems not, as if I run with --portable-mode=false (instead of default), failure changes:

C:\Program Files\Duplicati 2>Duplicati.GUI.TrayIcon

C:\Program Files\Duplicati 2>Duplicati.GUI.TrayIcon --portable-mode=true

C:\Program Files\Duplicati 2>Duplicati.GUI.TrayIcon --portable-mode=false

C:\Program Files\Duplicati 2>Crash!
Duplicati.Library.Interface.UserInformationException: Server crashed on startup
 ---> System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Duplicati 2\Duplicati-trayicon.debug.log' is denied.
   at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at Duplicati.Library.Logging.StreamLogDestination..ctor(String filename)
   at Duplicati.Server.LogWriteHandler.SetServerFile(String path, LogMessageType level)
   at Duplicati.Server.Program.ConfigureLogging(Dictionary`2 commandlineOptions)
   at Duplicati.Server.Program.Main(String[] _args)
   at Duplicati.GUI.TrayIcon.HostedInstanceKeeper.<>c__DisplayClass3_0.<.ctor>b__0(Object _)
   --- End of inner exception stack trace ---
   at Duplicati.GUI.TrayIcon.HostedInstanceKeeper..ctor(String[] args)
   at Duplicati.GUI.TrayIcon.Program.Main(String[] _args)
   at Duplicati.GUI.TrayIcon.Net8.Program.<>c__DisplayClass0_0.<Main>b__0()
   at Duplicati.Library.Crashlog.CrashlogHelper.WrapWithCrashLog[T](Func`1 method)
Failed to write crashlog: System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Duplicati 2\Duplicati.GUI.TrayIcon-crashlog.txt' is denied.
   at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.File.OpenHandle(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize)
   at System.IO.File.WriteToFile(String path, FileMode mode, String contents, Encoding encoding)
   at Duplicati.Library.Crashlog.CrashlogHelper.LogCrashException(Exception ex)
Unhandled exception. Duplicati.Library.Interface.UserInformationException: Server crashed on startup
 ---> System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Duplicati 2\Duplicati-trayicon.debug.log' is denied.
   at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at Duplicati.Library.Logging.StreamLogDestination..ctor(String filename)
   at Duplicati.Server.LogWriteHandler.SetServerFile(String path, LogMessageType level)
   at Duplicati.Server.Program.ConfigureLogging(Dictionary`2 commandlineOptions)
   at Duplicati.Server.Program.Main(String[] _args)
   at Duplicati.GUI.TrayIcon.HostedInstanceKeeper.<>c__DisplayClass3_0.<.ctor>b__0(Object _)
   --- End of inner exception stack trace ---
   at Duplicati.GUI.TrayIcon.HostedInstanceKeeper..ctor(String[] args)
   at Duplicati.GUI.TrayIcon.Program.Main(String[] _args)
   at Duplicati.GUI.TrayIcon.Net8.Program.<>c__DisplayClass0_0.<Main>b__0()
   at Duplicati.Library.Crashlog.CrashlogHelper.WrapWithCrashLog[T](Func`1 method)
   at Duplicati.GUI.TrayIcon.Net8.Program.Main(String[] args)

Maybe the dev can come up with some good set of workarounds to get things operating?

1 Like

makes me wonder if DEBUG_MODE is on somehow, but I saw a chance to give my own
--log-file and that kept it from trying to make one in the install folder that it can’t write.

So combine that with a workaround for trying to create a portable-mode style data folder:

C:\Program Files\Duplicati 2>Duplicati.GUI.TrayIcon --server-datafolder=%LOCALAPPDATA%\Duplicati --log-file=C:\tmp\duplicati.log

C:\Program Files\Duplicati 2>No database encryption key was found. The database will be stored unencrypted. Supply an encryption key via the environment variable SETTINGS_ENCRYPTION_KEY or disable database encryption with the option --disable-db-encryption
Server has started and is listening on localhost, port 8200

I haven’t tested Linux, but --server-datafolder would likely be ~/.config/Duplicati
Log file can be put anywhere you like. Possibly Linux users can even put it to /dev/null.
Windows didn’t like NUL though.

EDIT:

The --server-datafolder workaround also keeps things like CommandLine operating.
Without that, one can’t even run an examples command. TrayIcon help also needs that.

I upgraded from canary .108 to .113 on Docker which left me with no settings.
Settings on Docker are stored in /data/Duplicati

I am aware that the settings path was changed

but I thought this was only affecting Windows.

Reverting back to .108 gives me my setting back.

Was the path for Docker changed too?

Ditto on being prompted for a new GUI interface password (the old one is not recognized), and having no backups listed on the GUI. I had upgraded from Canary 112 to Canary 113, on MacOS Sequoia 15.4.

I had this problem upon upgrading before, but don’t remember how to permanently reset the location of the DB. The instructions in Canary 109 are not useful for a non-programmer. I was able to revert to Canary 112 successfully, and my backups were again listed in the GUI (I run both the new and old GUI, and both reflect the same backups).

Thanks for reporting.

I have investigated a bit and it happens because some files are built in debug mode and others in release mode. In debug mode it uses portable mode by default (and a few other settings are different).

We monitor both, so feel free to post in either place. Github is more a working list of thing, but it can be hard to know initially. Forum is better for things that require a lot of follow up.

It is a the log-file that has a different default for debug builds.

Yes, that is exactly what has happened.

Yes, it is reading from a wrong folder. I will make a new build soon.

1 Like

Installed on my various Windows 2025 servers and Linux (Debian, Fedora, RPi-OS), and I got all to work. It was not straightforward.

In all cases I needed to add --server-datafolder= to all service commands, for Linux /root/.config/Duplicati and for Windows C:\ProgramData\Duplicati - this fixed all the connection issues I had the last time I tried because it set Duplicati to defaults which included only listening on 127.0.0.1 for IPv4 - but IPv6 was all interfaces.

For Linux using rpm, it’s still overwriting the duplicati settings file in /etc/sysconfig, but ok once I revert the file back from a copy

For all Linux installs, the about page shows debug as version:

On all versions, the new UI doesn’t know what the date is of last backups, the old UI is still accurate:


On all versions, the new UI still doesn’t present date/time in correct format

I’m now testing actual backups so will report if anything comes up, especially with my S3 backups, but at least I’m on .113 on all the machines now.

Wow, amazing that you got it working!

I have put up 2.1.0.114 now which has release builds.

Yes, I just saw that - should I bother installing .114 as I’d still have to fix the issues caused by the installer on Linux? I think that now I have the service commands correct that my Window installs would be fine as their service commands don’t seem to get touched by the MSI installer.

I would do that. The problem with .113 is that some libraries are built in debug mode, which can cause slowdowns or increased memory usage.

Correct. The MSI will only (attempt to) restart the service during install. It does not change the configuration of the service or recreate it.

Sorry, this seems to be a bit of a mess. I paused the backup of a Debian machine running .113 and stopped the service. I upgraded to .114 and the GUI refused to let me log in. I noticed the password had some special characters and I’ve noticed that the service command can have issues with these even when escaped, so I changed it and re-entered it in the service command:

DAEMON_OPTS="--webservice-port=8200 --webservice-interface=any --webservice-password=<redacted> --webservice-sslcertificatefile=/usr/share/Duplicati/kang.mydomain.com.pfx --webservice-sslcertificatepassword=<redacted> --disable-db-encryption --server-datafolder=/root/.config/Duplicati"

Restarted the service, still could not log in.

Shut down Duplicati, reverted to .113 without changing anything else and I can log in with the new password.

I then found out the pause did not hold between service starts and it ran the backup anyway.

Oh no… that seems to indicate the issue from .112 is back where it ships with wrong versions of the dlls…

Looks like it is, I reinstalled it and tried the command line utility and got:

Connecting to https://kang.mydomain.com:8200/...
Failed to obtain a signin token: Could not load file or assembly 'Microsoft.IdentityModel.Abstractions, Version=7.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. The system cannot find the file specified.

Failed to connect to server: Server error (401): Failed to log in

I’ve upgraded the gui from .112 to .114 on linux Mint, and it fixes the bug I was getting with .113 where config was not loaded from ~/.config/Duplicati
:+1:

Thanks for reporting. I have narrowed it down to the CLI builds (not GUI and not Agent).

The issue is that the CLI needs fewer packages, so it does not pull in the newer versions, and since it is built last, the end result is output where some libraries are in outdated versions.

New version 2.1.0.115 is up which fixes both the issues in 2.1.0.113 and 2.1.0.114.