How to generate a Google Drive (Full Access) AuthID

Hi Kenneth,

I installed the latest Canary release (2.1.0.120) and I’m testing synctool using --src-options to specify the oauth-url. I guess I’m not doing this properly, as I am getting a timeout error.

If I just remove the --src-options parameter, it works.

Any clues of what I am doing wrong?

PS C:\Program Files\Duplicati 2> .\Duplicati.CommandLine.SyncTool.exe `
>>   googledrive://0Backup/Duplicati?authid=$SrcAuthID `
>>   gcs://$GCSBucket/duplicati-test?authid=$DstAuthID `
>>   --progress `
>>   --log-file C:\users\Gaston\Desktop\synctool2.log `
>>   --log-level profiling `
>>   --src-options oauth-url=https://duplicati-oauth-handler.appspot.com
Starting - Prepare | List source
Prepare | List source took 0:00:00:32.062
Unhandled exception: System.TimeoutException: The operation has timed out.
   at Duplicati.Library.Utility.Utility.WithTimeout[T](TimeSpan timeout, CancellationToken token, Func`2 func)
   at Duplicati.Library.OAuthHelperHttpClient.GetAccessTokenAsync(CancellationToken cancellationToken)
   at Duplicati.Library.OAuthHelperHttpClient.GetAccessTokenAsync(CancellationToken cancellationToken)
   at Duplicati.Library.OAuthHelperHttpClient.CreateRequestAsync(String url, HttpMethod method, Boolean noAuthorization, CancellationToken cancellationToken)
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.<GetAboutInfoAsync>b__41_0(CancellationToken ct)
   at Duplicati.Library.Utility.Utility.WithTimeout[T](TimeSpan timeout, CancellationToken token, Func`2 func)
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.GetFolderIdAsync(String path, Boolean autocreate, CancellationToken cancelToken)
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.GetCurrentFolderIdAsync(CancellationToken cancelToken)
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.ListAsync(CancellationToken cancelToken)+MoveNext()
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.ListAsync(CancellationToken cancelToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at System.Linq.AsyncEnumerable.<ToListAsync>g__Core|424_0[TSource](IAsyncEnumerable`1 source, CancellationToken cancellationToken) in /_/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToList.cs:line 36
   at System.Linq.AsyncEnumerable.<ToListAsync>g__Core|424_0[TSource](IAsyncEnumerable`1 source, CancellationToken cancellationToken) in /_/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToList.cs:line 36
   at RemoteSynchronization.Program.PrepareFileLists(IStreamingBackend b_src, IStreamingBackend b_dst, Config config, CancellationToken cancelToken)
   at RemoteSynchronization.Program.Run(Config config)
   at System.CommandLine.NamingConventionBinder.CommandHandler.GetExitCodeAsync(Object returnValue, InvocationContext context)
   at System.CommandLine.NamingConventionBinder.ModelBindingCommandHandler.InvokeAsync(InvocationContext context)
   at System.CommandLine.Invocation.InvocationPipeline.<>c__DisplayClass4_0.<<BuildInvocationChain>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass17_0.<<UseParseErrorReporting>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass12_0.<<UseHelp>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass22_0.<<UseVersionOption>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass19_0.<<UseTypoCorrections>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<UseSuggestDirective>b__18_0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass16_0.<<UseParseDirective>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<RegisterWithDotnetSuggest>b__5_0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass8_0.<<UseExceptionHandler>b__0>d.MoveNext()

Not sure really. The timeout happens, that much is clear. But the weird part is that you are setting the option to the default value, so it should work exactly the same with and without …

A suggestion would be to bake in the oauth-url into the connection strings (requires 2.1.0.120):

C:\Program Files\Duplicati 2> .\Duplicati.CommandLine.SyncTool.exe `
>>   googledrive://0Backup/Duplicati?authid=$SrcAuthID&oauth-url=https://duplicati-oauth-handler.appspot.com `
>>   gcs://$GCSBucket/duplicati-test?authid=$DstAuthID&oauth-url=https://oauth-service.duplicati.com `
>>   --progress `
>>   --log-file C:\users\Gaston\Desktop\synctool2.log `
>>   --log-level profiling `

This should avoid the argument parsing in the synctool, in case that is messing up something.

Hi Kenneth,

Thanks. Unfortunately it still does not work.

To do some divide & conquer, I tried 3 variations of the command. The results are quite curious:

  1. Without any oauth-url → this works fine
  2. With oauth-url only at the source → error Unhandled exception: System.TimeoutException
  3. With ouath-url only at the destination → error Unhandled exception: System.IO.IOException: Invalid JSON data

Here’s the transcript of the 3 commands (with sensitive data replaced by [ANONYMIZED]):

PS C:\Program Files\Duplicati 2> .\Duplicati.CommandLine.SyncTool.exe "googledrive://0Backup/Duplicati?authid=$SrcAuthID" "gcs://$GCSBucket/duplicati-test?authid=$DstAuthID" --progress --log-file C:\users\Gaston\Desktop\synctool2.log --log-level profiling
Starting - Prepare | List source
Prepare | List source took 0:00:00:43.554
Starting - Prepare | List destination
Prepare | List destination took 0:00:00:00.762
The remote synchronization plan is to delete 0 files from Google Cloud Storage, then copy 6506 files from Google Drive to Google Cloud Storage.
This will perform the following actions (in order):
    - Delete 0 files from gcs://[ANONYMIZED]/duplicati-test?authid=[ANONYMIZED]
    - Copy 6506 files from googledrive://0Backup/Duplicati?authid=[ANONYMIZED] to gcs://[ANONYMIZED]/duplicati-test?authid=[ANONYMIZED]

Do you want to continue? [y/N]
n
Aborted
PS C:\Program Files\Duplicati 2> .\Duplicati.CommandLine.SyncTool.exe "googledrive://0Backup/Duplicati?authid=$SrcAuthID&oauth-url=https://duplicati-oauth-handler.appspot.com" "gcs://$GCSBucket/duplicati-test?authid=$DstAuthID" --progress --log-file C:\users\Gaston\Desktop\synctool2.log --log-level profiling
Starting - Prepare | List source
Prepare | List source took 0:00:00:32.099
Unhandled exception: System.TimeoutException: The operation has timed out.
   at Duplicati.Library.Utility.Utility.WithTimeout[T](TimeSpan timeout, CancellationToken token, Func`2 func)
   at Duplicati.Library.OAuthHelperHttpClient.GetAccessTokenAsync(CancellationToken cancellationToken)
   at Duplicati.Library.OAuthHelperHttpClient.GetAccessTokenAsync(CancellationToken cancellationToken)
   at Duplicati.Library.OAuthHelperHttpClient.CreateRequestAsync(String url, HttpMethod method, Boolean noAuthorization, CancellationToken cancellationToken)
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.<GetAboutInfoAsync>b__41_0(CancellationToken ct)
   at Duplicati.Library.Utility.Utility.WithTimeout[T](TimeSpan timeout, CancellationToken token, Func`2 func)
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.GetFolderIdAsync(String path, Boolean autocreate, CancellationToken cancelToken)
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.GetCurrentFolderIdAsync(CancellationToken cancelToken)
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.ListAsync(CancellationToken cancelToken)+MoveNext()
   at Duplicati.Library.Backend.GoogleDrive.GoogleDrive.ListAsync(CancellationToken cancelToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at System.Linq.AsyncEnumerable.<ToListAsync>g__Core|424_0[TSource](IAsyncEnumerable`1 source, CancellationToken cancellationToken) in /_/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToList.cs:line 36
   at System.Linq.AsyncEnumerable.<ToListAsync>g__Core|424_0[TSource](IAsyncEnumerable`1 source, CancellationToken cancellationToken) in /_/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToList.cs:line 36
   at RemoteSynchronization.Program.PrepareFileLists(IStreamingBackend b_src, IStreamingBackend b_dst, Config config, CancellationToken cancelToken)
   at RemoteSynchronization.Program.Run(Config config)
   at System.CommandLine.NamingConventionBinder.CommandHandler.GetExitCodeAsync(Object returnValue, InvocationContext context)
   at System.CommandLine.NamingConventionBinder.ModelBindingCommandHandler.InvokeAsync(InvocationContext context)
   at System.CommandLine.Invocation.InvocationPipeline.<>c__DisplayClass4_0.<<BuildInvocationChain>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass17_0.<<UseParseErrorReporting>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass12_0.<<UseHelp>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass22_0.<<UseVersionOption>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass19_0.<<UseTypoCorrections>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<UseSuggestDirective>b__18_0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass16_0.<<UseParseDirective>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<RegisterWithDotnetSuggest>b__5_0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass8_0.<<UseExceptionHandler>b__0>d.MoveNext()
PS C:\Program Files\Duplicati 2> .\Duplicati.CommandLine.SyncTool.exe "googledrive://0Backup/Duplicati?authid=$SrcAuthID" "gcs://$GCSBucket/duplicati-test?authid=$DstAuthID&oauth-url=https://duplicati-oauth-handler.appspot.com" --progress --log-file C:\users\Gaston\Desktop\synctool2.log --log-level profiling
Starting - Prepare | List source
Prepare | List source took 0:00:00:42.286
Starting - Prepare | List destination
Prepare | List destination took 0:00:00:32.099
Unhandled exception: System.IO.IOException: Invalid JSON data: "<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Duplicati OAuth Handler</title>

    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="//oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="//oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <style type="text/css">
      .btn-lg { margin: 10px; min-width: 300px; }
      .btn-lg > .btn-text { display:"
 ---> Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
   at Newtonsoft.Json.JsonTextReader.ParseValue()
   at Newtonsoft.Json.JsonTextReader.Read()
   at Newtonsoft.Json.JsonReader.ReadAndMoveToContent()
   at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)
   at Duplicati.Library.JsonWebHelperHttpClient.ReadJsonResponseAsync[T](HttpResponseMessage response, CancellationToken cancellationToken)
   at Duplicati.Library.JsonWebHelperHttpClient.ReadJsonResponseAsync[T](HttpResponseMessage response, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at Duplicati.Library.JsonWebHelperHttpClient.ReadJsonResponseAsync[T](HttpResponseMessage response, CancellationToken cancellationToken)
   at Duplicati.Library.JsonWebHelperHttpClient.ReadJsonResponseAsync[T](HttpResponseMessage response, CancellationToken cancellationToken)
   at Duplicati.Library.JsonWebHelperHttpClient.ReadJsonResponseAsync[T](HttpResponseMessage response, CancellationToken cancellationToken)
   at Duplicati.Library.OAuthHelperHttpClient.<>c__DisplayClass25_0.<<GetAccessTokenAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Utility.Utility.WithTimeout[T](TimeSpan timeout, CancellationToken token, Func`2 func)
   at Duplicati.Library.OAuthHelperHttpClient.GetAccessTokenAsync(CancellationToken cancellationToken)
   at Duplicati.Library.OAuthHelperHttpClient.GetAccessTokenAsync(CancellationToken cancellationToken)
   at Duplicati.Library.OAuthHelperHttpClient.CreateRequestAsync(String url, HttpMethod method, Boolean noAuthorization, CancellationToken cancellationToken)
   at Duplicati.Library.Backend.GoogleCloudStorage.GoogleCloudStorage.<>c__DisplayClass17_0.<<ListAsync>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Utility.Utility.WithTimeout[T](TimeSpan timeout, CancellationToken token, Func`2 func)
   at Duplicati.Library.Backend.GoogleCloudStorage.GoogleCloudStorage.HandleListExceptions[T](Func`1 func)
   at Duplicati.Library.Backend.GoogleCloudStorage.GoogleCloudStorage.ListAsync(CancellationToken cancelToken)+MoveNext()
   at Duplicati.Library.Backend.GoogleCloudStorage.GoogleCloudStorage.ListAsync(CancellationToken cancelToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at System.Linq.AsyncEnumerable.<ToListAsync>g__Core|424_0[TSource](IAsyncEnumerable`1 source, CancellationToken cancellationToken) in /_/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToList.cs:line 36
   at System.Linq.AsyncEnumerable.<ToListAsync>g__Core|424_0[TSource](IAsyncEnumerable`1 source, CancellationToken cancellationToken) in /_/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToList.cs:line 36
   at RemoteSynchronization.Program.PrepareFileLists(IStreamingBackend b_src, IStreamingBackend b_dst, Config config, CancellationToken cancelToken)
   at RemoteSynchronization.Program.Run(Config config)
   at System.CommandLine.NamingConventionBinder.CommandHandler.GetExitCodeAsync(Object returnValue, InvocationContext context)
   at System.CommandLine.NamingConventionBinder.ModelBindingCommandHandler.InvokeAsync(InvocationContext context)
   at System.CommandLine.Invocation.InvocationPipeline.<>c__DisplayClass4_0.<<BuildInvocationChain>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass17_0.<<UseParseErrorReporting>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass12_0.<<UseHelp>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass22_0.<<UseVersionOption>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass19_0.<<UseTypoCorrections>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<UseSuggestDirective>b__18_0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass16_0.<<UseParseDirective>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<RegisterWithDotnetSuggest>b__5_0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass8_0.<<UseExceptionHandler>b__0>d.MoveNext()

Thanks for that, I tried to reproduce your setup directly and I found the problem.
I gave you the wrong urls, thinking that Duplicati would automatically fix it, but it turns out that is not the case. On top of that there is some retry logic that gets invoked repeatedly and this logic eats the error message. So triple failure there :confused:

I have fixed most of it now, but it is not in the 2.1.0.121 release.

Instead you simply need to use these OAuth urls instead (note the /refresh part):

  • https://oauth-service.duplicati.com/refresh
  • https://duplicati-oauth-handler.appspot.com/refresh

With those, I can get the url-based approach to reach the auth server.

Hi Kenneth,

The kind of stuff that makes even state of the art planes go down :smiley:

After adding /refresh to the URL, it seems to be working! I’ll keep you posted on the results.

Cheers,

Gaston

Hi Kenneth,

You may remember that initially I was hitting below error on 2.1.0.116:

Error copying duplicati-xxxxxxx.dindex.zip.aes: Failed to authorize using the OAuth service: Authentication provider for googledocs gave error: { “error”: { “code”: 400, “message”: “Invalid JSON payload received. Unexpected token.\nclient_id=xxxxxxxxxx\n^”, “status”: “INVALID_ARGUMENT” }}. If the problem persists, try generating a new authid token from: Duplicati OAuth Handler

Since I am now using 2.1.0.120, in order to do a good divide and conquer I started by trying to reproduce the exact same problem by still using the “old” OAUTH server (https://duplicati-oauth-handler.appspot.com), but to my surprise the result is a bit different now.

What happens now is that after a while, it starts hitting HTTP 500 errors, and it continues to hit the same error for every subsequent file it tries to copy (until eventually I cancel the process). When I retry the command, it picks up from the first previously failed files, and copies them successfully but eventually it starts hitting again HTTP 500 errors and does not seem to recover from it…

Here’s a log extract (anonymized and summarized):

PS C:\Program Files\Duplicati 2> $SrcAuthURL = “https://duplicati-oauth-handler.appspot.com/refresh
PS C:\Program Files\Duplicati 2> $DstAuthURL = “https://duplicati-oauth-handler.appspot.com/refresh
PS C:\Program Files\Duplicati 2>
PS C:\Program Files\Duplicati 2> .\Duplicati.CommandLine.SyncTool.exe “googledrive://0Backup/Duplicati?authid=$SrcAuthID” “gcs://$GCSBucket/duplicati-test?authid=$DstAuthID” --progress --log-file C:\users\Gaston\Desktop\synctool2.log --log-level profiling
Starting - Prepare | List source
Prepare | List source took 0:00:00:52.089
Starting - Prepare | List destination
Prepare | List destination took 0:00:00:00.415
The remote synchronization plan is to delete 0 files from Google Cloud Storage, then copy 6506 files from Google Drive to Google Cloud Storage.
This will perform the following actions (in order):
- Delete 0 files from gcs://[HIDDEN]/duplicati-test?authid=[HIDDEN]
- Copy 6506 files from googledrive://0Backup/Duplicati?authid=[HIDDEN] to gcs://[HIDDEN]/duplicati-test?authid=[HIDDEN]

Do you want to continue? [y/N]
y
Starting - Delete operation
Deleting: 0/0
Delete operation took 0:00:00:00.000
Deleted 0 files from Google Cloud Storage
Copying: 0/6506Copying duplicati-i515[HIDDEN]efd3.dindex.zip.aes from Google Drive to Google Cloud Storage
Copying: 1/6506Copying duplicati-bd31[HIDDEN]eead.dblock.zip.aes from Google Drive to Google Cloud Storage
Copying: 2/6506Copying duplicati-2025[HIDDEN]108Z.dlist.zip.aes from Google Drive to Google Cloud Storage

[successful copy of 3~408]

Copying: 409/6506Copying duplicati-i75f[HIDDEN]7dca.dindex.zip.aes from Google Drive to Google Cloud Storage
Error copying duplicati-i75f[HIDDEN]7dca.dindex.zip.aes: The operation has timed out. => The operation has timed out.
Copying: 410/6506Copying duplicati-b835[HIDDEN]ba22.dblock.zip.aes from Google Drive to Google Cloud Storage

[successful copy of 411~887]

Copying: 888/6506Copying duplicati-b0cb[HIDDEN]af62.dblock.zip.aes from Google Drive to Google Cloud Storage
Error copying duplicati-b0cb[HIDDEN]af62.dblock.zip.aes: Response status code does not indicate success: 500 (Internal Server Error). => Response statuscode does not indicate success: 500 (Internal Server Error).
Copying: 889/6506Copying duplicati-i4a0[HIDDEN]15d5.dindex.zip.aes from Google Drive to Google Cloud Storage
Error copying duplicati-i4a0[HIDDEN]15d5.dindex.zip.aes: Response status code does not indicate success: 500 (Internal Server Error). => Response statuscode does not indicate success: 500 (Internal Server Error).

[same error 500 for 890~910 until CTRL+C]

Copying: 910/6506Copying duplicati-i122[HIDDEN]6219.dindex.zip.aes from Google Drive to Google Cloud Storage
Error copying duplicati-i122[HIDDEN]6219.dindex.zip.aes: Response status code does not indicate success: 500 (Internal Server Error). => Response statuscode does not indicate success: 500 (Internal Server Error).
Copying: 911/6506Copying duplicati-i03b[HIDDEN]b24b.dindex.zip.aes from Google Drive to Google Cloud Storage

[CTRL+C]

2nd execution (retry):

PS C:\Program Files\Duplicati 2> .\Duplicati.CommandLine.SyncTool.exe “googledrive://0Backup/Duplicati?authid=$SrcAuthID” “gcs://$GCSBucket/duplicati-test?authid=$DstAuthID” --progress --log-file C:\users\Gaston\Desktop\synctool2.log --log-level profiling
Starting - Prepare | List source
Prepare | List source took 0:00:00:53.770
Starting - Prepare | List destination
Prepare | List destination took 0:00:00:01.688
Starting - Prepare | Build lookup for source and destination
Prepare | Build lookup for source and destination took 0:00:00:00.004
Starting - Prepare | Check the files that are present in source against destination
Prepare | Check the files that are present in source against destination took 0:00:00:00.002
Starting - Prepare | Check the files that are present in destination against source
Prepare | Check the files that are present in destination against source took 0:00:00:00.000
Starting - Prepare | Lookup the files to delete
Prepare | Lookup the files to delete took 0:00:00:00.000
The remote synchronization plan is to delete 0 files from Google Cloud Storage, then copy 5619 files from Google Drive to Google Cloud Storage.
This will perform the following actions (in order):
- Delete 0 files from gcs://[HIDDEN]/duplicati-test?authid=[HIDDEN]
- Copy 5619 files from googledrive://0Backup/Duplicati?authid=[HIDDEN] to gcs://[HIDDEN]/duplicati-test?authid=[HIDDEN]

Do you want to continue? [y/N]
y
Starting - Delete operation
Deleting: 0/0
Delete operation took 0:00:00:00.000
Deleted 0 files from Google Cloud Storage
Copying: 0/5619Copying duplicati-i75f[HIDDEN]7dca.dindex.zip.aes from Google Drive to Google Cloud Storage
Copying: 1/5619Copying duplicati-b0cb[HIDDEN]af62.dblock.zip.aes from Google Drive to Google Cloud Storage
Copying: 2/5619Copying duplicati-i4a0[HIDDEN]15d5.dindex.zip.aes from Google Drive to Google Cloud Storage

[successful copy of 3~22]

Copying: 23/5619Copying duplicati-i122[HIDDEN]6219.dindex.zip.aes from Google Drive to Google Cloud Storage
Copying: 24/5619Copying duplicati-i03b[HIDDEN]b24b.dindex.zip.aes from Google Drive to Google Cloud Storage
Copying: 25/5619Copying duplicati-b620[HIDDEN]ec19.dblock.zip.aes from Google Drive to Google Cloud Storage

[successful copy of 26~554, with a few intermittent 403 errors on files 47, 49~74, 80~83, 85~86]

Copying: 554/5619Copying duplicati-bd66[HIDDEN]8f00.dblock.zip.aes from Google Drive to Google Cloud Storage
Copying: 555/5619Copying duplicati-b56f[HIDDEN]3af4.dblock.zip.aes from Google Drive to Google Cloud Storage
Error copying duplicati-b56f[HIDDEN]3af4.dblock.zip.aes: Response status code does not indicate success: 500 (Internal Server Error). => Response statuscode does not indicate success: 500 (Internal Server Error).
Copying: 556/5619Copying duplicati-b865[HIDDEN]78b0.dblock.zip.aes from Google Drive to Google Cloud Storage
Error copying duplicati-b865[HIDDEN]78b0.dblock.zip.aes: Response status code does not indicate success: 500 (Internal Server Error). => Response statuscode does not indicate success: 500 (Internal Server Error).
Copying: 557/5619Copying duplicati-ie61[HIDDEN]1727.dindex.zip.aes from Google Drive to Google Cloud Storage
Error copying duplicati-ie61[HIDDEN]1727.dindex.zip.aes: Response status code does not indicate success: 500 (Internal Server Error). => Response statuscode does not indicate success: 500 (Internal Server Error).

[same error for 558~1367 until I hit CTRL+C]

Copying: 1367/5619Copying duplicati-bc59[HIDDEN]6071.dblock.zip.aes from Google Drive to Google Cloud Storage
Error copying duplicati-bc59[HIDDEN]6071.dblock.zip.aes: Response status code does not indicate success: 500 (Internal Server Error). => Response statuscode does not indicate success: 500 (Internal Server Error).
Copying: 1368/5619Copying duplicati-i1d1[HIDDEN]4608.dindex.zip.aes from Google Drive to Google Cloud Storage

[CTRL+C]

Since the problem is a bit different than before, shall I test with the new OAUTH server?

Thanks,

Gaston

I can see that the sync code does not discard the backend instance on error, so my guess is that the token expires and then it keeps trying with an expired token. It should give a 403 error, but it might be something else that causes a 500 error.

But, since it is a 500 error, the logic to reset the token is not invoked, so you keep getting the error.

We need to update the sync tool to be more resilient.

Please do test it, but I would imagine the results are the same.
I would assume

Hi Kenneth,

Thanks. In that case, no worries. Let’s close this point for now.

I am glad that my tests helped identify the issue, which is probably not super high priority now but eventually will get improved.

I did manage to copy the data (It just took a few retries), so I am not blocked.

Thanks again for your great support and this great product!

Gaston

Could I request if anyone has any latest info on this one. Is it still the case that duplicati is still not usable with google drive since google made the changes on their end.

For me, with the latest duplicati as of today, I still can’t use google drive as I get these permission errors accessing some files still. Does this still require a code fix on the duplicati side, or with the latest duplicati is there some recommendation, eg remove all backups, start from scratch etc etc? Cheers.

Welcome to the forum @Mark_Kennedy

That was never the case. Have you tried limited login to make new backup on personal drive?
Organizational drives have sometimes had other access challenges and needed admin assist.

Please give the actual message.

Limited login should be able to access files created by Duplicati. Don’t copy files in another way.
If you did that before and can’t get a full access login, then the files appear invisible to Duplicati. Accessing them some other way then uploading them with SyncTool “should” solve the problem.

Your situation is very unclear and needs explanation. I’ll let the dev talk OAuth servers if desired. Running your own sounds pretty extreme to me. All should just work if all files are from Duplicati.

Ah ok my bad, ill maybe start from scratch. Last time I did start from scratch with a new token / new backup folder on my drive / new backup configuration in duplicati, I managed to get a few backups / restores to work but all of a sudden I started receiving permission denied errors on very specific duplicati files on my drive. I’ll start from scratch with a clean slate, if I can reproduce I’ll post back. Thanks again.

That sequence sounds pretty odd if they were all from new backup without other change.

If you mean at https://github.com/duplicati/duplicati/releases it’s v2.1.2.3_beta_2025-10-11.
https://duplicati.com/download doesn’t have test releases so is 2.1.0.5_stable_2025-03-04.
Release channels and versions discusses channels, and each channel can have a “latest”.

I don’t think this matters to what I wrote, but if you found another bug, version might matter.

If you can reproduce this, then please let us know!

I have seen it reported a few times but still don’t know what triggers it.
Sadly, once Google Drive has marked the file as owned by someone else than Duplicat, there is no way to get the file back to Duplicati.

One manual annoying way is to download the file, delete it from Google Drive, and then use the backend tool to re-upload it with the same token.

If you want to use full-access tokens, there is no public service for this (as Google does not like full-access tokens and require approvals). You can instead run your own OAuth server. There is a walkthrough on how to get this set up for Google Drive here:

Hi Mark,

My experience after years of using Google Drive backend is that one or two times per year this issue will occur. As explained elsewhere, this seems to be a problem on Google Side, not on Duplicati side. The workaround was to use “Google Drive (Full access)”, but that is not allowed anymore by Google.

I did not want that additional stress when I needed to restore my data following a crash, so I migrated to GCS backend. By doing so, I solved the issue and also made savings since GCS can be much cheaper, depending on the storage class you select. In my case I selected Coldline class which has a lower storage cost (I pay around 2.7 USD / month for 232 GB of storage and the in/out operations required for a weekly backup to run), but higher cost when you need to restore (which will only incur during your yearly DRP test or when your hard disk actually crashed, in my tests this was around 30 USD which is not a lot either).

Hope it helps,

Gaston

Thanks Gaston,

I had completely cleared my duplicati installation and Google drive directory since my last post and started from scratch.

I started seeing successful weekly backups until this week when I am again getting 403 errors like below.

To me it does seem a repeatable pattern, after a few weeks or as you say, a few times per year, this seems to creep back in.

“2025-11-13 20:54:05 +00 - [Error-Duplicati.Library.Main.Operation.BackupHandler-FatalError]: Fatal error\nHttpRequestException: Response status code does not indicate success: 403 (Forbidden).”

I might look into the gcs idea but hope someone else can get to the bottom of this as it’s be great if it worked consistently over many months.

Regards,

Mark

Based on several reports above, that person would be at Google.
I suppose you could see if there’s any channel to bring it to them.

I pasted my logs into chatgpt. It suggested to see if the files that give 403 during deletion exist. And when I check, they actually don’t exist. I never hand delete these.

Could it be possible that some previous error during a backup have actually succeeded in deletion of a file on the drive side but left reference to it in duplicati. Meaning could there be a duplicati fix / improvement here. Eg if it can’t find the file in the remote list (as it’s literally not there) yet it’s still in its local db, then treat the drive list as the source of truth and in this case don’t try to delete it as it’s not there and would forever give a 403.

Was any posted here? If so, please post link.

How did we jump to deletion? Prior posts are talking about access.

Google Drive’s documentation on status codes is in Resolve errors.

A reference to a missing file should be 404. Permission error is 403.

This is the usual plan. Please Google http 403 vs 404 for AI opinion.

Existence of Resource:

A 403 error implies the resource exists but is inaccessible, while a 404 error implies the resource does not exist or its existence is being concealed.

Logs should be able to show generally what’s going on when the error occurs.
That could happen in log-file even at log-file-log-level=information.

  --log-http-requests (Boolean): Log HTTP requests
    Enable logging of HTTP request diagnostics. Messages are
    logged at the Verbose level, so make sure the log outputs at
    that level.
    * default value: false

will likely give fuller view, but it’s a new option I haven’t tried on Google Drive.
Even without that, I need a view of events – and the 403 error being returned.

I’m also wondering if you posted to the wrong topic if file genuinely is missing.
A lack of full access means files you can see in (e.g.) Google web UI can’t be
accessed by Duplicati because it didn’t create them initially (or Google forgot).

Thanks for those inputs yeah I would think the AI can’t be trusted. I turned verbose logging on and enabled http logging requests. But at least in this log output below, I can’t see any further verbose messages to help diagnose whats going on. If its 100% google side I might just give up and backup elsewhere / in some other way I guess.

{“DeletedFiles”: 0,“DeletedFolders”: 0,“ModifiedFiles”: 13,“ExaminedFiles”: 5441,“OpenedFiles”: 13,“AddedFiles”: 0,“SizeOfModifiedFiles”: 27753277,“SizeOfAddedFiles”: 0,“SizeOfExaminedFiles”: 1458149407,“SizeOfOpenedFiles”: 27753446,“NotProcessedFiles”: 0,“AddedFolders”: 0,“TooLargeFiles”: 0,“FilesWithError”: 0,“TimestampChangedFiles”: 0,“ModifiedFolders”: 7,“ModifiedSymlinks”: 0,“AddedSymlinks”: 0,“DeletedSymlinks”: 0,“PartialBackup”: false,“Dryrun”: false,“MainOperation”: “Backup”,“CompactResults”: {“DeletedFileCount”: 0,“DownloadedFileCount”: 0,“UploadedFileCount”: 0,“DeletedFileSize”: 0,“DownloadedFileSize”: 0,“UploadedFileSize”: 0,“Dryrun”: false,“VacuumResults”: null,“MainOperation”: “Compact”,“ParsedResult”: “Success”,“Interrupted”: false,“Version”: “2.2.0.1 (2.2.0.1_stable_2025-11-09)”,“EndTime”: “0001-01-01T00:00:00”,“BeginTime”: “2025-11-14T20:36:53.004839Z”,“Duration”: “00:00:00”,“MessagesActualLength”: 0,“WarningsActualLength”: 0,“ErrorsActualLength”: 0,“Messages”: null,“Warnings”: null,“Errors”: null,“BackendStatistics”: {“RemoteCalls”: 16,“BytesUploaded”: 14528032,“BytesDownloaded”: 103584913,“FilesUploaded”: 3,“FilesDownloaded”: 2,“FilesDeleted”: 3,“FoldersCreated”: 0,“RetryAttempts”: 5,“UnknownFileSize”: 0,“UnknownFileCount”: 0,“KnownFileCount”: 85,“KnownFileSize”: 1857811994,“KnownFilesets”: 3,“LastBackupDate”: “2025-11-14T20:22:09+00:00”,“BackupListCount”: 3,“TotalQuotaSpace”: 2201170739200,“FreeQuotaSpace”: 2118245001391,“AssignedQuotaSpace”: -1,“ReportedQuotaError”: false,“ReportedQuotaWarning”: false,“MainOperation”: “Backup”,“ParsedResult”: “Success”,“Interrupted”: false,“Version”: “2.2.0.1 (2.2.0.1_stable_2025-11-09)”,“EndTime”: “0001-01-01T00:00:00”,“BeginTime”: “2025-11-14T20:36:23.6571859Z”,“Duration”: “00:00:00”,“MessagesActualLength”: 0,“WarningsActualLength”: 0,“ErrorsActualLength”: 0,“Messages”: null,“Warnings”: null,“Errors”: null}},“VacuumResults”: null,“DeleteResults”: {“DeletedSetsActualLength”: 0,“DeletedSets”: null,“Dryrun”: false,“MainOperation”: “Delete”,“CompactResults”: {“DeletedFileCount”: 0,“DownloadedFileCount”: 0,“UploadedFileCount”: 0,“DeletedFileSize”: 0,“DownloadedFileSize”: 0,“UploadedFileSize”: 0,“Dryrun”: false,“VacuumResults”: null,“MainOperation”: “Compact”,“ParsedResult”: “Success”,“Interrupted”: false,“Version”: “2.2.0.1 (2.2.0.1_stable_2025-11-09)”,“EndTime”: “0001-01-01T00:00:00”,“BeginTime”: “2025-11-14T20:36:53.004839Z”,“Duration”: “00:00:00”,“MessagesActualLength”: 0,“WarningsActualLength”: 0,“ErrorsActualLength”: 0,“Messages”: null,“Warnings”: null,“Errors”: null,“BackendStatistics”: {“RemoteCalls”: 16,“BytesUploaded”: 14528032,“BytesDownloaded”: 103584913,“FilesUploaded”: 3,“FilesDownloaded”: 2,“FilesDeleted”: 3,“FoldersCreated”: 0,“RetryAttempts”: 5,“UnknownFileSize”: 0,“UnknownFileCount”: 0,“KnownFileCount”: 85,“KnownFileSize”: 1857811994,“KnownFilesets”: 3,“LastBackupDate”: “2025-11-14T20:22:09+00:00”,“BackupListCount”: 3,“TotalQuotaSpace”: 2201170739200,“FreeQuotaSpace”: 2118245001391,“AssignedQuotaSpace”: -1,“ReportedQuotaError”: false,“ReportedQuotaWarning”: false,“MainOperation”: “Backup”,“ParsedResult”: “Success”,“Interrupted”: false,“Version”: “2.2.0.1 (2.2.0.1_stable_2025-11-09)”,“EndTime”: “0001-01-01T00:00:00”,“BeginTime”: “2025-11-14T20:36:23.6571859Z”,“Duration”: “00:00:00”,“MessagesActualLength”: 0,“WarningsActualLength”: 0,“ErrorsActualLength”: 0,“Messages”: null,“Warnings”: null,“Errors”: null}},“ParsedResult”: “Success”,“Interrupted”: false,“Version”: “2.2.0.1 (2.2.0.1_stable_2025-11-09)”,“EndTime”: “0001-01-01T00:00:00”,“BeginTime”: “2025-11-14T20:36:51.2679263Z”,“Duration”: “00:00:00”,“MessagesActualLength”: 0,“WarningsActualLength”: 0,“ErrorsActualLength”: 0,“Messages”: null,“Warnings”: null,“Errors”: null,“BackendStatistics”: {“RemoteCalls”: 16,“BytesUploaded”: 14528032,“BytesDownloaded”: 103584913,“FilesUploaded”: 3,“FilesDownloaded”: 2,“FilesDeleted”: 3,“FoldersCreated”: 0,“RetryAttempts”: 5,“UnknownFileSize”: 0,“UnknownFileCount”: 0,“KnownFileCount”: 85,“KnownFileSize”: 1857811994,“KnownFilesets”: 3,“LastBackupDate”: “2025-11-14T20:22:09+00:00”,“BackupListCount”: 3,“TotalQuotaSpace”: 2201170739200,“FreeQuotaSpace”: 2118245001391,“AssignedQuotaSpace”: -1,“ReportedQuotaError”: false,“ReportedQuotaWarning”: false,“MainOperation”: “Backup”,“ParsedResult”: “Success”,“Interrupted”: false,“Version”: “2.2.0.1 (2.2.0.1_stable_2025-11-09)”,“EndTime”: “0001-01-01T00:00:00”,“BeginTime”: “2025-11-14T20:36:23.6571859Z”,“Duration”: “00:00:00”,“MessagesActualLength”: 0,“WarningsActualLength”: 0,“ErrorsActualLength”: 0,“Messages”: null,“Warnings”: null,“Errors”: null}},“RepairResults”: null,“TestResults”: null,“ParsedResult”: “Fatal”,“Interrupted”: false,“Version”: “2.2.0.1 (2.2.0.1_stable_2025-11-09)”,“EndTime”: “2025-11-14T20:40:53.9609146Z”,“BeginTime”: “2025-11-14T20:36:23.6571849Z”,“Duration”: “00:04:30.3037297”,“MessagesActualLength”: 37,“WarningsActualLength”: 0,“ErrorsActualLength”: 2,“Messages”: [“2025-11-14 20:36:23 +00 - [Information-Duplicati.Library.Main.Controller-StartingOperation]: The operation Backup has started”,“2025-11-14 20:36:23 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()”,“2025-11-14 20:36:35 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (85 bytes)”,“2025-11-14 20:36:35 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: QuotaInfo - Started:  ()”,“2025-11-14 20:36:35 +00 - [Information-Duplicati.Library.Main.Operation.FilelistProcessor-RemoteUnwantedMissingFile]: Removing file listed as Temporary: duplicati-b5bc70b9ad7384e2387d22f4fa371c190.dblock.zip”,“2025-11-14 20:36:35 +00 - [Information-Duplicati.Library.Main.Operation.FilelistProcessor-RemoteUnwantedMissingFile]: Removing file listed as Temporary: duplicati-ieaf7e10937614c39b27263f2d97f8678.dindex.zip”,“2025-11-14 20:36:43 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-b87c1466176b04476b8483c4af3dd4d26.dblock.zip (13.469 MiB)”,“2025-11-14 20:36:46 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-b87c1466176b04476b8483c4af3dd4d26.dblock.zip (13.469 MiB)”,“2025-11-14 20:36:46 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-i75e593d665c740a9a5e6526b97b44a03.dindex.zip (3.380 KiB)”,“2025-11-14 20:36:49 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-i75e593d665c740a9a5e6526b97b44a03.dindex.zip (3.380 KiB)”,“2025-11-14 20:36:49 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-20251114T203623Z.dlist.zip (392.381 KiB)”,“2025-11-14 20:36:51 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-20251114T203623Z.dlist.zip (392.381 KiB)”,“2025-11-14 20:36:51 +00 - [Information-Duplicati.Library.Main.Operation.DeleteHandler-DeleteRemoteFileset]: Deleting 1 remote fileset(s) …”,“2025-11-14 20:36:51 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Started: duplicati-20251113T213128Z.dlist.zip (392.344 KiB)”,“2025-11-14 20:36:52 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Completed: duplicati-20251113T213128Z.dlist.zip (392.344 KiB)”,“2025-11-14 20:36:53 +00 - [Information-Duplicati.Library.Main.Operation.DeleteHandler-DeleteResults]: Deleted 1 remote fileset(s)”,“2025-11-14 20:36:53 +00 - [Information-Duplicati.Library.Main.Database.LocalDeleteDatabase-CompactReason]: Compacting because there are 1 fully deletable volume(s)”,“2025-11-14 20:36:53 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Started: duplicati-b692c999e40e44150aa1122151fa3dcf8.dblock.zip (13.487 MiB)”,“2025-11-14 20:36:55 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Completed: duplicati-b692c999e40e44150aa1122151fa3dcf8.dblock.zip (13.487 MiB)”,“2025-11-14 20:36:55 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Started: duplicati-i8dfe49c01933443c8246566b75849ebd.dindex.zip (3.272 KiB)”],“Warnings”: ,“Errors”: [“2025-11-14 20:40:53 +00 - [Error-Duplicati.Library.Main.Operation.BackupHandler-FatalError]: Fatal error\nHttpRequestException: Response status code does not indicate success: 403 (Forbidden).”,“2025-11-14 20:40:54 +00 - [Error-Duplicati.Library.Main.Controller-FailedOperation]: The operation Backup has failed\nHttpRequestException: Response status code does not indicate success: 403 (Forbidden).”],“BackendStatistics”: {“RemoteCalls”: 16,“BytesUploaded”: 14528032,“BytesDownloaded”: 103584913,“FilesUploaded”: 3,“FilesDownloaded”: 2,“FilesDeleted”: 3,“FoldersCreated”: 0,“RetryAttempts”: 5,“UnknownFileSize”: 0,“UnknownFileCount”: 0,“KnownFileCount”: 85,“KnownFileSize”: 1857811994,“KnownFilesets”: 3,“LastBackupDate”: “2025-11-14T20:22:09+00:00”,“BackupListCount”: 3,“TotalQuotaSpace”: 2201170739200,“FreeQuotaSpace”: 2118245001391,“AssignedQuotaSpace”: -1,“ReportedQuotaError”: false,“ReportedQuotaWarning”: false,“MainOperation”: “Backup”,“ParsedResult”: “Success”,“Interrupted”: false,“Version”: “2.2.0.1 (2.2.0.1_stable_2025-11-09)”,“EndTime”: “0001-01-01T00:00:00”,6“BeginTime”: “2025-11-14T20:36:23.6571859Z”,“Duration”: “00:00:00”,“MessagesActualLength”: 0,“WarningsActualLength”: 0,“ErrorsActualLength”: 0,“Messages”: null,“Warnings”: null,“Errors”: null}}

Then please comment on the log-file, because you’re not posting.
Can you tell what operation and file got the 403?

It doesn’t affect the default log file. It affects the log-file=<path> option you did.
If you just added log-file-log-level and log-http-requests, they’re wasted.

Another limitation of the default job log is it limits logged messages to 20 per type.
It says you have 37. It shows 20, we don’t know what happened after the limit, but start of the messages was backup, then delete per retention policy, then compact.

Backup
“2025-11-14 20:36:23 +00 - [Information-Duplicati.Library.Main.Controller-StartingOperation]: The operation Backup has started”
“2025-11-14 20:36:23 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()”
“2025-11-14 20:36:35 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (85 bytes)”
“2025-11-14 20:36:35 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: QuotaInfo - Started:  ()”
“2025-11-14 20:36:35 +00 - [Information-Duplicati.Library.Main.Operation.FilelistProcessor-RemoteUnwantedMissingFile]: Removing file listed as Temporary: duplicati-b5bc70b9ad7384e2387d22f4fa371c190.dblock.zip”
“2025-11-14 20:36:35 +00 - [Information-Duplicati.Library.Main.Operation.FilelistProcessor-RemoteUnwantedMissingFile]: Removing file listed as Temporary: duplicati-ieaf7e10937614c39b27263f2d97f8678.dindex.zip”
“2025-11-14 20:36:43 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-b87c1466176b04476b8483c4af3dd4d26.dblock.zip (13.469 MiB)”
“2025-11-14 20:36:46 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-b87c1466176b04476b8483c4af3dd4d26.dblock.zip (13.469 MiB)”
“2025-11-14 20:36:46 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-i75e593d665c740a9a5e6526b97b44a03.dindex.zip (3.380 KiB)”
“2025-11-14 20:36:49 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-i75e593d665c740a9a5e6526b97b44a03.dindex.zip (3.380 KiB)”
“2025-11-14 20:36:49 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-20251114T203623Z.dlist.zip (392.381 KiB)”
“2025-11-14 20:36:51 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-20251114T203623Z.dlist.zip (392.381 KiB)”
Delete
“2025-11-14 20:36:51 +00 - [Information-Duplicati.Library.Main.Operation.DeleteHandler-DeleteRemoteFileset]: Deleting 1 remote fileset(s) …”
“2025-11-14 20:36:51 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Started: duplicati-20251113T213128Z.dlist.zip (392.344 KiB)”
“2025-11-14 20:36:52 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Completed: duplicati-20251113T213128Z.dlist.zip (392.344 KiB)”
“2025-11-14 20:36:53 +00 - [Information-Duplicati.Library.Main.Operation.DeleteHandler-DeleteResults]: Deleted 1 remote fileset(s)”
Compact
“2025-11-14 20:36:53 +00 - [Information-Duplicati.Library.Main.Database.LocalDeleteDatabase-CompactReason]: Compacting because there are 1 fully deletable volume(s)”
“2025-11-14 20:36:53 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Started: duplicati-b692c999e40e44150aa1122151fa3dcf8.dblock.zip (13.487 MiB)”
“2025-11-14 20:36:55 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Completed: duplicati-b692c999e40e44150aa1122151fa3dcf8.dblock.zip (13.487 MiB)”
“2025-11-14 20:36:55 +00 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Delete - Started: duplicati-i8dfe49c01933443c8246566b75849ebd.dindex.zip (3.272 KiB)”]

Sometime later, in next 17 messages that we don’t see, something got the 403.
If you really like, you can turn on no-auto-compact and see if manual one fits, however an actual log-file ensures you catch it all. If you find verbose too revealing (and it can be, as it will show source file names), start information.