Release: 2.0.9.102 (Canary) 2024-08-02

I have fixed the code to inject the correct links, the correct link for this release is:

I have not used the linuxserver images, but at least the argument is incorrect.
It should be:

CLI_ARGS=--webservice-allowedhostnames=*

That should be enough. The page should redirect you to /login.html, but maybe that logic got lost in the last changes.

You can manually visit the login page:

http://localhost:8200/login.html

Should be the same. I think the logic is just not redirecting properly.

The intention is that these are preserved, I will see if I can reproduce the issue.

Yes, this is emitted to the terminal.

No, I was thinking that users without the tray-icon would be able to see terminal messages.

CLI_ARGS=–webservice-allowedhostnames=*

that works

Websrrvice accesible but stuck there now.

Tried with --webservice-password=abcdefg but not working

Does the advice above to use http://localhost:8200/login.html get you a login page?

EDIT:

Actually you’re remote, so it wouldn’t be localhost, but maybe the same technique will work…

is looking more like a display problem. The next morning’s scheduled-but-not-seen task did run.

The web browser in 2.0.8.1 polled Duplicati for status (seen in developer tools), looking like this:

http://127.0.0.1:8300/api/v1/serverstate/?lasteventid=372&longpoll=true&duration=299s
{
  "ProgramState": "Running",
  "UpdatedVersion": null,
  "UpdaterState": "Waiting",
  "UpdateReady": false,
  "UpdateDownloadProgress": 0.0,
  "ActiveTask": null,
  "SchedulerQueueIds": [],
  "ProposedSchedule": [
    {
      "Item1": "2",
      "Item2": "2024-09-04T17:00:00Z"
    }
  ],
  "HasWarning": false,
  "HasError": false,
  "SuggestedStatusIcon": "Ready",
  "EstimatedPauseEnd": "0001-01-01T00:00:00",
  "LastEventID": 372,
  "LastDataUpdateID": 8,
  "LastNotificationUpdateID": 0
}

2.0.9.102 doesn’t seem to ask, although the TrayIcon does (not that that helps show the status):

C:\Duplicati\duplicati-2.0.9.102_canary_2024-08-02-win-x64-gui>netstat -ano | findstr 8200
  TCP    127.0.0.1:8200         0.0.0.0:0              LISTENING       46596
  TCP    127.0.0.1:8200         127.0.0.1:49465        ESTABLISHED     46596
  TCP    127.0.0.1:8200         127.0.0.1:51079        ESTABLISHED     46596
  TCP    127.0.0.1:49465        127.0.0.1:8200         ESTABLISHED     29124
  TCP    127.0.0.1:51079        127.0.0.1:8200         ESTABLISHED     46596

PID 29124 is Edge, so I’m looking for the poll from port 49465 in Wireshark, but not seeing it.
I also have Edge sitting in developer tools looking for network activity, but it’s not making any.

Port 51079 is the TrayIcon polling its own server, but response is not showing scheduled job.
Possibly this variation of the request isn’t supposed to, so maybe bug is lack of browser asks.

GET /api/v1/serverstate?longpoll=true&lastEventId=74&duration=5m HTTP/1.1
Host: localhost:8200
Authorization: Bearer REDACTED
User-Agent: Duplicati-TrayIcon-Monitor/2.0.9.102

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Sun, 04 Aug 2024 13:29:53 GMT
Server: Kestrel
Transfer-Encoding: chunked

{“ActiveTask”:null,“ProgramState”:“Running”,“SchedulerQueueIds”:,“HasWarning”:false,“HasError”:false,“SuggestedStatusIcon”:“Ready”,“EstimatedPauseEnd”:“0001-01-01T00:00:00”,“LastEventID”:75,“LastDataUpdateID”:11,“LastNotificationUpdateID”:0,“UpdatedVersion”:null,“UpdaterState”:“Waiting”,“UpdateDownloadLink”:null,“UpdateDownloadProgress”:0}

EDIT:

Note that this EstimatedPauseEnd is the very-zero value I’m used to seeing in System info.
I haven’t figured out where Duplicati GUI is getting its unusual uneven non-zero value from.

Thank you very much, that works:

http://localhost:8200/login.html

The scheduling works for me, but it takes a moment after the page is loaded before the jobs appear. Before that, it looks as if there are no jobs.

The logs look different than before, does anyone else have this? My language is German:

Are you using remote access and have you entered a host name? I’m not sure yet, but it may only work with an asterisk (*) as a placeholder, not with a defined hostname.

Yes. It has the same eight-empty-line look before running a backup, and isn’t changing in run:

EDIT:

I watched operation in developer tools. It was making a series of calls to
http://localhost:8200/api/v1/progressstate (and a few others)
2.0.8.1 appears to get live log information like this (missing in 2.0.9.102)
http://127.0.0.1:8300/api/v1/logdata/poll?level=Information&id=666&pagesize=100

[
  {
    "When": "2024-08-04T13:14:39.8299516-04:00",
    "ID": 670,
    "Message": "The operation Test has completed",
    "Tag": "Information-Duplicati.Library.Main.Controller-CompletedOperation",
    "MessageID": "CompletedOperation",
    "ExceptionID": null,
    "Type": "Information",
    "Exception": null,
    "BackupID": "1",
    "TaskID": "6"
  }
]

No, it looks like remote access is no longer possible:

Bad Request - Invalid Hostname
HTTP Error 400 The request hostname is invalid.

Even with an IP address, I can no longer access the web interface from outside. Remote access is enabled and marked with “*”.

How exactly did you do that? You’ve been posting command options, but I don’t see this one.
Alternatively, you can do it in GUI Settings (assuming one can get in, e.g. using local access).
Note that --webservice-allowedhostnames is (accidentally) the 2.0.9.102 spelling of option
--webservice-allowed-hostnames. The help text for each version shows the correct option, however Windows TrayIcon help is quite troublesome, which is why I suspect CLI start is rare.

EDIT:

Server help works. User manual doesn’t document either one. Code will change to take either.

The host name was adopted during the update. Due to the access problems, I entered the host name again via the WebGUI and then also tried with the asterisk, neither of which worked.

seems to be reporting the same problem using the GUI Settings configuration. How about using:

--webservice-allowedhostnames="*"

on the start line? This fixes the 400 error for me so that I can then hit the “invalid authentication”.
http://IPADDR:8200/login.html (substitute yours) gives a login page to login with password.
Host name also works, but I haven’t validated filtering in depth. Just saying the * lets me access, provided I do it by command option. Also note prior talk about 2.0.9.102 changed option spelling.

EDIT:

--webservice-allowedhostnames="cli"

attempting to use a CLI filter (since GUI doesn’t look healthy) crashes on start. Server log says:

2024-08-05 14:21:36 -04 - [Information-Duplicati.Server.WebServerLoader-ServerListening]: Server has started and is listening on 0.0.0.0, port 8200
2024-08-05 14:26:47 -04 - [Information-Duplicati.Server.WebServerLoader-ServerListening]: Server has started and is listening on 0.0.0.0, port 8200
2024-08-05 14:51:12 -04 - [Information-Duplicati.Server.WebServerLoader-ServerListening]: Server has started and is listening on 0.0.0.0, port 8200
2024-08-05 14:56:58 -04 - [Information-Duplicati.Server.WebServerLoader-ServerListening]: Server has started and is listening on 0.0.0.0, port 8200

I usually run this in the background, but I ran it from Command Prompt in hope of info, and got

C:\Duplicati\duplicati-2.0.9.102_canary_2024-08-02-win-x64-gui>Duplicati.GUI.TrayIcon.exe --webservice-allowedhostnames="cli"

C:\Duplicati\duplicati-2.0.9.102_canary_2024-08-02-win-x64-gui>Unexpected error: System.AggregateException: One or more errors occurred. (Response status code does not indicate success: 400 (Bad Request).)
 ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 400 (Bad Request).
   at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
   at Duplicati.GUI.TrayIcon.HttpServerConnection.PerformRequestInternalAsync[T](String method, String endpoint, String body, Nullable`1 timeout)
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at Duplicati.GUI.TrayIcon.HttpServerConnection.PerformRequestInternal[T](String method, String endpoint, String body, Nullable`1 timeout)
   at Duplicati.GUI.TrayIcon.HttpServerConnection.ObtainAccessToken()
   at Duplicati.GUI.TrayIcon.HttpServerConnection.PerformRequest[T](String method, String urlfragment, String body, Nullable`1 timeout)
   at Duplicati.GUI.TrayIcon.HttpServerConnection.UpdateStatus(Boolean longpoll)
   at Duplicati.GUI.TrayIcon.HttpServerConnection..ctor(Uri server, String password, PasswordSource passwordSource, Boolean disableTrayIconLogin, Dictionary`2 options)
   at Duplicati.GUI.TrayIcon.Program.StartTray(String[] _args, Dictionary`2 options, HostedInstanceKeeper hosted, String password)

so unless your luck is better, you might need to stick to asterisk, so possibly some less security.

I’ve noticed that my TrayIcon keeps crashing with this new update. The webserver keeps running though. I see these stack traces in the logs, but they don’t seem directly related to the TrayIcon. Any ideas?

Aug 05 12:31:39 terra systemd[7215]: Started Duplicati.
Aug 05 12:33:14 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:33:14 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:33:14 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:33:14 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:33:14 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:33:14 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:33:14 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:33:14 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:33:17 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:33:17 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:33:18 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:33:18 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:38:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:38:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:38:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:38:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:38:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:38:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:43:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:43:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:43:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:43:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:43:14 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:43:14 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:48:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:48:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:48:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:48:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:48:14 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:48:14 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:53:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:53:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:53:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:53:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:53:14 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:53:14 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:58:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:58:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:58:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:58:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 12:58:14 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 12:58:14 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 13:03:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 13:03:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 13:03:13 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 13:03:13 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 13:03:14 terra duplicati[2768019]: warn: Duplicati.WebserverCore.Abstractions.ISettingsService[0]
Aug 05 13:03:14 terra duplicati[2768019]:       Could not deserialize last update version information `?packagetypeid=linux-x64-gui.zip`
Aug 05 13:03:17 terra duplicati[2768019]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
Aug 05 13:03:17 terra duplicati[2768019]:       An unhandled exception has occurred while executing the request.
Aug 05 13:03:17 terra duplicati[2768019]:       System.Net.WebSockets.WebSocketException (2): The remote party closed the WebSocket connection without completing the close handshake.
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Net.WebSockets.ManagedWebSocket.ThrowEOFUnexpected()
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Net.WebSockets.ManagedWebSocket.EnsureBufferContainsAsync(Int32 minimumRequiredBytes, CancellationToken cancellationToken)
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Net.WebSockets.ManagedWebSocket.ReceiveAsyncPrivate[TResult](Memory`1 payloadBuffer, CancellationToken cancellationToken)
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Net.WebSockets.ManagedWebSocket.CloseAsyncPrivate(WebSocketCloseStatus closeStatus, String statusDescription, CancellationToken cancellationToken)
Aug 05 13:03:17 terra duplicati[2768019]:          at Duplicati.WebserverCore.Middlewares.WebsocketExtensions.<>c__DisplayClass0_0.<<UseNotifications>b__0>d.MoveNext()
Aug 05 13:03:17 terra duplicati[2768019]:       --- End of stack trace from previous location ---
Aug 05 13:03:17 terra duplicati[2768019]:          at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.<Invoke>g__Awaited|10_0(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
Aug 05 13:03:17 terra duplicati[2768019]: warn: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[2]
Aug 05 13:03:17 terra duplicati[2768019]:       The response has already started, the error handler will not be executed.
Aug 05 13:03:17 terra duplicati[2768019]: fail: Microsoft.AspNetCore.Server.Kestrel[13]
Aug 05 13:03:17 terra duplicati[2768019]:       Connection id "0HN5LDH6N6BH0", Request id "0HN5LDH6N6BH0:00000001": An unhandled exception was thrown by the application.
Aug 05 13:03:17 terra duplicati[2768019]:       System.Net.WebSockets.WebSocketException (2): The remote party closed the WebSocket connection without completing the close handshake.
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Net.WebSockets.ManagedWebSocket.ThrowEOFUnexpected()
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Net.WebSockets.ManagedWebSocket.EnsureBufferContainsAsync(Int32 minimumRequiredBytes, CancellationToken cancellationToken)
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Net.WebSockets.ManagedWebSocket.ReceiveAsyncPrivate[TResult](Memory`1 payloadBuffer, CancellationToken cancellationToken)
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
Aug 05 13:03:17 terra duplicati[2768019]:          at System.Net.WebSockets.ManagedWebSocket.CloseAsyncPrivate(WebSocketCloseStatus closeStatus, String statusDescription, CancellationToken cancellationToken)
Aug 05 13:03:17 terra duplicati[2768019]:          at Duplicati.WebserverCore.Middlewares.WebsocketExtensions.<>c__DisplayClass0_0.<<UseNotifications>b__0>d.MoveNext()
Aug 05 13:03:17 terra duplicati[2768019]:       --- End of stack trace from previous location ---
Aug 05 13:03:17 terra duplicati[2768019]:          at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.<Invoke>g__Awaited|10_0(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
Aug 05 13:03:17 terra duplicati[2768019]:          at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.HandleException(HttpContext context, ExceptionDispatchInfo edi)
Aug 05 13:03:17 terra duplicati[2768019]:          at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.<Invoke>g__Awaited|10_0(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
Aug 05 13:03:17 terra duplicati[2768019]:          at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Aug 05 13:03:17 terra duplicati[2768019]:          at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Aug 05 13:03:17 terra duplicati[2768019]:          at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

Others on the Arch AUR have reported issues, like high memory usage as well.

Mine never shows schedule after days, restarts, etc., but job ran right on schedule this morning.

Although this will likely need developer help, what is the symptom of crashing? Any pattern to it?

Not that I’ve noticed. After a little while the tray icon disappears, and the logs show this backtrace.

I was wrong: The list of jobs only appears with a significant time delay (approx. 2-3 seconds), which was not the case with the previous version.

The information on the schedules is actually missing completely in the overview. But the schedules work.

Hello, I upgraded my Docker Duplicati behind Cloudflared (Cloudflare reverse proxy tunel) and I noticed those error in browser console:

https://host.domain.com/ngax/index.html#/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://host.domain.com/notifications?token=*TOKEN*'. This request has been blocked; this endpoint must be available over WSS.

and:

Error: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.

Is there any configuration I can do solve it? Thanks

I run duplicati using the official docker image (not the one from linuxserver).
I upgraded from 2.0.9.101 to 2.0.9.102. To avoid having a random pwd issue, I set a UI password prior to upgrading. However, duplicati seems not to be running (correctly).

I get a 400 - the request hostname is invalid error.

Before upgrading, I had specified the allowed hostnames - and it was working correct.
I logged into the docker container, and I do see the process is active.
After installing curl, I do get a response in the container as well:

# curl http://127.0.0.1:8200
...
<body>
<noscript>
    <p>Duplicati web UI relies on JavaScript</p>
    <p>Please enable scripting on this page or turn off script blockers in your browser.</p>
</noscript>

</body>
</html>

Going outside the host:

# curl http://192.168.0.xxx:8200
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></ HEAD >
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>

It seems like it no longer saved the allowed hostnames? How can I specify these via docker?

Another remark: there was no indication in the release note that there was an database version jump. However, downgrading was not possible without putting the backup Duplicati-server.sqlite back due to the version increase.