Tried this on my Windows server running 9.101, and ended up no executables in the Duplicati 2 folder - this is the MSI installer log from my deployment server:
I replaced the MSI with the 9.101 version and tried to just install back and it’s not working, but I thought I would post the above in the meantime. Hopefully I can get it back running soon.
Update: I just remembered why it won’t start, as I forgot to copy back the database, d’oh
Ok, so the issue with reverting to 9.101 was the same as upgrading to 9.106 - there were no executables. So I uninstalled 9.101 then installed 9.106 and now I have a running service - seems the installer is only working for me on a clean install. But I cannot log on, but I do get the prompt so the web service working. The tray icon will not start, so when I try it from the command-line I get:
C:\Program Files>fail: Microsoft.Extensions.Hosting.Internal.Host[11]
Hosting failed to start
System.Net.Sockets.SocketException (10013): An attempt was made to access a socket in a way forbidden by its access permissions.
at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName)
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Bind(EndPoint localEP)
at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint)
at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind()
at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<<StartAsync>g__OnBind|0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.EndpointsStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>b__15_1(IHostedService service, CancellationToken token)
at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation)
Unhandled exception. Duplicati.Library.Interface.UserInformationException: Server crashed on startup
---> System.ArgumentNullException: Value cannot be null. (Parameter 'provider')
at System.ThrowHelper.Throw(String paramName)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Duplicati.Server.Program.get_StatusEventNotifyer()
at Duplicati.Server.Program.Main(String[] _args)
at Duplicati.GUI.TrayIcon.HostedInstanceKeeper.<>c__DisplayClass5_0.<.ctor>b__0(Object dummy_arg)
--- 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.Main(String[] args)
The service is started: “C:\Program Files\Duplicati 2\Duplicati.WindowsService.exe” /localuser “–webservice-sslcertificatefile=C:\ProgramData\Duplicati\lisa.pfx” “–webservice-sslcertificatepassword=12345”
How can I get the firstime start token in Windows?
It should show in the Application Log for windows, but otherwise, you can set the password.
There is a discussion on how to do this in the 2.0.9.103 thread.
That is at least a new way for me to try to create a reproducible setup.
Yes, that is an easier way if the database is readable by the TrayIcon’s user account. It will let the TrayIcon read JWT key from the database and issue a signin token with no password requirements.
Found another issue since going from 9.101 to 9.104 - the 3rd party duplicati_client no longer works and this is critical to the way I run all my backups.
As the dev is no longer a Duplicati user it’s unlikely to get fixed, so is there going to be any way to replicate its features directly in Duplicati?
To explain my use-case:
I schedule a backup at 1pm that backs up folders/files to storage on my local network
I create two non scheduled backups, one does the same as the first but backs up to Wasabi storage, the second backs up all the Duplicati databases excluding its own (this has proven very useful in the past for recovering rebuilt machines)
When the first backup completes it uses duplicati_client in a script to start the Wasabi backup, and then when it ends, it starts the database backup with another script
I used to use normal schedules but it’s a pain to tweak them to run right after each other if the time they take varies wildly. And if you have many machines, trying to keep backups from concurrently running within a short window of time is difficult.
Oh, and I know you can submit a backup job with the Duplicati command-line but that needs either the entire job parameters in the command, or using an exported version. Not very friendly compared to duplicati_client when I all I need to specifiy is the job ID as stored i.e C:\ProgramData\Duplicati\duplicati_client.exe run 4 which means the job parameters can be changed in the GUI without affecting the script.
I do not want to become the maintainer of a Python project, but I could make a small PR that fixes the authentication issues, which would solve the problem short-term. I am not sure if this PR would be merged due to the current status of the project, but it does not look like a viable long-term solution.
We could consider re-implementing the functionality in C# and providing a binary as part of the release builds. It is not a massive task, but not trivial either.
For myself the only functionality I need from the command-line is to be able to start a specific job that’s already stored. Either by ID or by job-name, the latter being better as the only time duplicati_client slips up is when the job IDs change for any reason.
Reproduced, although I was on 9.101 before too, as it turns out. Did workaround:
Click Modify, get Duplicati Setup Wizard, click Next
Click Repair and follow prompts through Finish. There are now .exe files present.
This is similar to the discussion in an issue on the “known issues” list linked at top.
but current title is too narrow. It may be a general upgrade-without-uninstall failure.
After that come a number of new obstacles due to the new password requirement.
Is there a not-too-revealing answer available about why it’s there? This is unusual.
IMO, the Canary and Beta gather feedback for how to create a good stable release.
Beyond bug fixes, sometimes the polishing aims for easier installation and usability.
I think they’re going the wrong way, but discussion on administration pain continues.
From another point of view, a goal has been to let the installer handle service install.
Whether or not that happens, thinking through that might lead to manual procedures.
Is that Event Viewer? What fraction of Duplicati users have ever even been in there?
I would suggest trying to draft User Manual documentation which covers all the uses.
If the answer turns out to be that an interactive support session is needed, that’s bad.
Is that supposed to be the spot? The information is not there. I also can’t get it using:
--log-file=<path> and --log-file-log-level=information
The first instance of the web server is listening on TCP port 8200. Additional instances listen on port 8300 and higher.
This no longer works. Mentioned a bit in 2.0.9.103, tested better here using two actual logins, launching Duplicati from Windows Start menu. First account gets one (without browser open). Second account does not. Launching from command line shows why process has gone away:
C:\Program Files\Duplicati 2>Duplicati.GUI.TrayIcon.exe
C:\Program Files\Duplicati 2>fail: Microsoft.Extensions.Hosting.Internal.Host[11]
Hosting failed to start
System.IO.IOException: Failed to bind to address http://127.0.0.1:8200: address already in use.
---> Microsoft.AspNetCore.Connections.AddressInUseException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
---> System.Net.Sockets.SocketException (10048): Only one usage of each socket address (protocol/network address/port) is normally permitted.
at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName)
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Bind(EndPoint localEP)
at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint)
at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind()
--- End of inner exception stack trace ---
at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind()
at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<<StartAsync>g__OnBind|0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.EndpointsStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>b__15_1(IHostedService service, CancellationToken token)
at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation)
Unhandled exception. Duplicati.Library.Interface.UserInformationException: Server crashed on startup
---> System.ArgumentNullException: Value cannot be null. (Parameter 'provider')
at System.ThrowHelper.Throw(String paramName)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Duplicati.Server.Program.get_StatusEventNotifyer()
at Duplicati.Server.Program.Main(String[] _args)
at Duplicati.GUI.TrayIcon.HostedInstanceKeeper.<>c__DisplayClass5_0.<.ctor>b__0(Object dummy_arg)
--- 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.Main(String[] args)
Workaround is --webservice-port=8300 on manual launch. Both Duplicati are on loopback.
Duplicati.Server.exe can take over a minute to stop due to Control-C on Windows 10.
Tested both Windows Terminal and Command Prompt as two different user accounts.
C:\Program Files\Duplicati 2>Duplicati.Server.exe
Unhandled exception. System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'IServiceProvider'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ThrowHelper.ThrowObjectDisposedException()
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier serviceIdentifier, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Duplicati.Server.Program.get_StatusEventNotifyer()
at Duplicati.Server.Program.SignalNewEvent(Object sender, EventArgs e)
at Duplicati.Server.Program.<>c.<SetWorkerThread>b__62_4()
at WebserverCore.Services.SchedulerService.<>c__DisplayClass6_0.<SubScribeToNewSchedule>b__0(Object _, EventArgs _)
at Duplicati.Server.Scheduler.Runner()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
Error takes about a minute to show up (but can be faster). Another 5-10 sec to see prompt.
Server is idle. 2.0.8.1 goes down instantly, but beware that you might leave a child running. set AUTOUPDATER_Duplicati_SKIP_UPDATE=true can stop use of the parent/child setup.
I wonder if this is related to the same issue I saw on my RPi4 where stop/restarts never work unless I Ctrl-C the systemctl command? I do recall a few times manually running Duplicati executables to test things where the command would not return to the prompt unless I hit enter.
Be careful not to be thrown off by cases where the prompt is already there then you get output from the background below the prompt. There’s an example above. Different commands run differently…
How long do you wait? Before I found out that Duplicati is slow, I assumed it stuck and killed using Task Manager. I think systemd often uses a 90 second timeout, but my Linux Mint reduces it to 10.
Aug 22 14:24:31 LinuxMint21 systemd[1]: Stopping Duplicati web-server...
Aug 22 14:24:41 LinuxMint21 systemd[1]: duplicati.service: State 'stop-sigterm' timed out. Killing.
Aug 22 14:24:41 LinuxMint21 systemd[1]: duplicati.service: Killing process 320230 (duplicati-serve) with signal SIGKILL.
Running right after each other happens automatically if running collides, e.g. if second backup is scheduled a second after first, it will immediately miss its schedule and run after the first finishes. What happens with third compared to second is unclear. These might queue in home page order.
got it running on macos 14.6.1 (Sonoma) on a M2
no hickups during installation apart from not detecting the old database/backup,
so i created a new one that is running fine
if you start this new version for the first time and you have no password on the portal,
you are asked to set one.
If you do, you are forwarded to the settings page where it is not immediately obvious what you need to do here (click the first checkbox and fill out the 2 password fields).
Maybe you could enable that checkbox and highlight this section to make it more clear for the user
is an open feature request, your comment, and idea that jobs start in screen order.
If this is true, screen order can awkwardly be changed by using export and import.
has other discussion of missed job handling, and comment on job chain like yours.
I don’t use Mac. Did it pop a browser tab open for you? This path covers some uses.
Ones where you manually browse to new Duplicati seem to need special techniques.
My Windows 10 somehow has forgotten how to open tabs upon request by Duplicati.
Getting in required using the “Initial signin URL” sent to the terminal, if you have one.
Those without terminals have to battle their way into their new setup some other way.
Basically the “out of box experience” for new users (maybe also upgraders) is poor…
Thanks for testing Mac. This series of Canary has seemed reliable except for access.
This is sort of what is expected, as the big recent changes were in setup and access.
I think my approach is to work with the new server-cli program, so it is possible to interact with the server in various ways, including setting the password of a running server, given database access (and a few other things).
Changing the entire runtime, installer packages, and now web-server, is virtually impossible to achieve without some pains. I think from the initial .NET8 release until now, we have been progressing quite a bit.
Hopefully the new server-cli tool will ease some of that administrative pain.
Yes, I think a big part of the problem is that the documentation does not correctly reflect the required password and how to deal with it.
Arh, that explains some of the issues. The logic is to probe for an available port, and it used to work. I think the socket open process happens in another place now and the probing fails because of this. I have registered an issue for fixing the port probing.
I think the DisposedException is just a side-effect that actually crashes the server and causes it to finally stop. The problem is likely something that is running in a way where it stays running even when pressing CTRL+C.