Trying to sync, half-way getting a error 504

trying to sync gramps-web from my gramps with the sync add-on, it starts OK, I can login, the comparison starts and gives a result. The next step, making changes to the external database, ends with a “error 504” any idee??

my gramps: 6.0.8

My gramps-web on my synoogy-NAS in Docker:

Gramps 6.0.6
Gramps Web API 3.7.1
Gramps Web Frontend 26.2.0
Gramps QL 0.4.0
Sifts 1.1.1
locale: en
multi-tree: false
task queue: false
OCR: true
chat: false

the debug-log:

C:\\Program Files\\GrampsAIO64-6.0.8>gramps --debug grampswebsync
foutopsporing instellen grampswebsync
2026-07-15 14:56:00.190: DEBUG: grampswebsync.py: line 104: Initializing Gramps Web Sync addon.
2026-07-15 14:56:13.928: DEBUG: grampswebsync.py: line 80: Retrieving password for user hans_eggels
2026-07-15 14:56:13.929: WARNING: grampswebsync.py: line 84: Keyring is not installed, cannot retrieve password.
2026-07-15 14:56:16.682: DEBUG: grampswebsync.py: line 232: Moving to next page from page 0.
2026-07-15 14:56:16.684: DEBUG: grampswebsync.py: line 232: Moving to next page from page 1.
2026-07-15 14:56:31.250: DEBUG: grampswebsync.py: line 232: Moving to next page from page 1.
2026-07-15 14:57:07.282: DEBUG: grampswebsync.py: line 232: Moving to next page from page 1.
2026-07-15 14:57:07.283: DEBUG: grampswebsync.py: line 232: Moving to next page from page 2.
2026-07-15 14:57:07.285: DEBUG: webapihandler.py: line 161: Fetching an access token from the server
2026-07-15 14:57:07.359: DEBUG: webapihandler.py: line 161: Fetching an access token from the server
2026-07-15 14:57:07.665: DEBUG: grampswebsync.py: line 232: Moving to next page from page 2.
2026-07-15 14:57:07.672: INFO: grampswebsync.py: line 514: Downloading Gramps XML file.
2026-07-15 14:57:09.558: DEBUG: grampswebsync.py: line 518: The file name of the downloaded file is: C:\\Users\\HANS_E\~1\\AppData\\Local\\Temp\\tmpaqke9n70.gramps
2026-07-15 14:57:09.560: DEBUG: grampswebsync.py: line 519: Importing Gramps XML file.
100%2026-07-15 14:57:13.553: DEBUG: grampswebsync.py: line 524: Successfully imported Gramps XML file.
2026-07-15 14:57:13.555: INFO: grampswebsync.py: line 528: Comparing local and remote data...
2026-07-15 14:57:13.555: DEBUG: grampswebsync.py: line 532: Loading last sync timestamp from config: 1761770964.360164 (2025-10-29 21:49:24 )
2026-07-15 14:57:16.076: DEBUG: diffhandler.py: line 87: Last synced timestamp from config: 1761770964.360164 (2025-10-29 21:49:24 )
2026-07-15 14:57:16.077: DEBUG: diffhandler.py: line 90: Latest common timestamp calculated: 1761766793 (2025-10-29 20:39:53 )
2026-07-15 14:57:16.077: DEBUG: diffhandler.py: line 97: Using last synced timestamp as cutoff: 1761770964 (2025-10-29 21:49:24 )
2026-07-15 14:57:16.175: DEBUG: diffhandler.py: line 236: === SYNC DECISION SUMMARY ===
2026-07-15 14:57:16.176: DEBUG: diffhandler.py: line 237: Cutoff timestamp used: 1761770964 (2025-10-29 21:49:24 )
2026-07-15 14:57:16.176: DEBUG: diffhandler.py: line 240: Added to local (remote objects): 16
2026-07-15 14:57:16.176: DEBUG: diffhandler.py: line 241: Added to remote (local objects): 0
2026-07-15 14:57:16.176: DEBUG: diffhandler.py: line 242: Deleted from local: 0
2026-07-15 14:57:16.177: DEBUG: diffhandler.py: line 243: Deleted from remote: 2
2026-07-15 14:57:16.177: DEBUG: diffhandler.py: line 244: Modified in local: 16
2026-07-15 14:57:16.178: DEBUG: diffhandler.py: line 245: Modified in remote: 0
2026-07-15 14:57:16.276: DEBUG: diffhandler.py: line 246: Modified in both: 371
2026-07-15 14:57:16.277: DEBUG: diffhandler.py: line 247: === END SUMMARY ===
2026-07-15 14:57:16.277: DEBUG: grampswebsync.py: line 232: Moving to next page from page 2.
2026-07-15 14:58:59.586: DEBUG: grampswebsync.py: line 232: Moving to next page from page 3.
2026-07-15 14:58:59.587: DEBUG: grampswebsync.py: line 232: Moving to next page from page 4.
2026-07-15 14:58:59.588: INFO: grampswebsync.py: line 651: Committing all changes to the databases.
2026-07-15 14:58:59.589: DEBUG: grampswebsync.py: line 658: No changes to apply to local database.
2026-07-15 14:58:59.790: DEBUG: webapihandler.py: line 151: Fetching metadata from the server
2026-07-15 14:59:00.044: DEBUG: grampswebsync.py: line 232: Moving to next page from page 4.
2026-07-15 14:59:00.054: DEBUG: grampswebsync.py: line 683: Committing changes to remote database.
2026-07-15 15:00:00.216: WARNING: grampswebsync.py: line 493: Fout 504 tijdens het verbinden met de server.
2026-07-15 15:00:00.216: DEBUG: grampswebsync.py: line 232: Moving to next page from page 4.
2026-07-15 15:00:00.216: DEBUG: grampswebsync.py: line 234: Skipping to last page due to error.
2026-07-15 15:00:23.746: DEBUG: grampswebsync.py: line 216: Closing Gramps Web Sync addon.
2026-07-15 15:00:23.747: DEBUG: grampswebsync.py: line 219: Closing in-memory remote database.

The dockerlog from this time-frame:

Gramps-Web
date,stream,content
2026/07/15 15:01:08,stderr,  warnings.warn(

2026/07/15 15:01:08,stderr,/usr/local/lib/python3.11/dist-packages/flask_limiter/\_extension.py:364: UserWarning: Using the in-memory storage for tracking rate limits as no storage was explicitly specified. This is not recommended for production use. See: https://flask-limiter.readthedocs.io#configuring-a-storage-backend for documentation about configuring the storage backend.

2026/07/15 15:01:07,stderr,(gunicorn:6059): Gtk-CRITICAL \*\*: 13:01:07.036: gtk_icon_theme_get_for_screen: assertion 'GDK_IS_SCREEN (screen)' failed

2026/07/15 15:01:07,stderr,

2026/07/15 15:01:02,stderr,\[2026-07-15 13:01:02 +0000\] \[6059\] \[INFO\] Booting worker with pid: 6059

2026/07/15 15:01:02,stderr,\[2026-07-15 13:01:02 +0000\] \[27\] \[ERROR\] Worker (pid:28) was sent SIGKILL! Perhaps out of memory?

2026/07/15 15:01:01,stderr,\[2026-07-15 13:01:01 +0000\] \[28\] \[INFO\] Worker exiting (pid: 28)

2026/07/15 15:01:01,stderr,SystemExit: 1

2026/07/15 15:01:01,stderr,    sys.exit(1)

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gunicorn/workers/base.py", line 204, in handle_abort
"
2026/07/15 15:01:01,stderr,    dbapi_connection.commit()

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/engine/default.py", line 715, in do_commit
"
2026/07/15 15:01:01,stderr,    self.engine.dialect.do_commit(self.connection)

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/engine/base.py", line 1145, in \_commit_impl
"
2026/07/15 15:01:01,stderr,    raise exc_info\[1\].with_traceback(exc_info\[2\])

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/engine/base.py", line 2366, in \_handle_dbapi_exception
"
2026/07/15 15:01:01,stderr,"    self.\_handle_dbapi_exception(e, None, None, None, None)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/engine/base.py", line 1147, in \_commit_impl
"
2026/07/15 15:01:01,stderr,    self.connection.\_commit_impl()

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/engine/base.py", line 2716, in \_connection_commit_impl
"
2026/07/15 15:01:01,stderr,    self.\_connection_commit_impl()

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/engine/base.py", line 2745, in \_do_commit
"
2026/07/15 15:01:01,stderr,    self.\_do_commit()

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/engine/base.py", line 2640, in commit
"
2026/07/15 15:01:01,stderr,    trans.commit()

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/orm/session.py", line 1318, in commit
"
2026/07/15 15:01:01,stderr,                ^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,"    ret_value = fn(self, \*arg, \*\*kw)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/orm/state_changes.py", line 137, in \_go
"
2026/07/15 15:01:01,stderr,"  File "", line 2, in commit
"
2026/07/15 15:01:01,stderr,    trans.commit(\_to_root=True)

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/sqlalchemy/orm/session.py", line 2030, in commit
"
2026/07/15 15:01:01,stderr,    session.commit()

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps_webapi/undodb.py", line 283, in append
"
2026/07/15 15:01:01,stderr,                ^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,    self.last = self.commitdb.append(

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps/gen/db/txn.py", line 193, in add
"
2026/07/15 15:01:01,stderr,    trans.add(

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps/plugins/db/dbapi/dbapi.py", line 699, in \_commit_base
"
2026/07/15 15:01:01,stderr,"    self.\_commit_base(media, MEDIA_KEY, transaction, change_time)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps/gen/db/generic.py", line 2293, in commit_media
"
2026/07/15 15:01:01,stderr,"    com_func(obj, trans)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/tasks.py", line 577, in handle_commit
"
2026/07/15 15:01:01,stderr,"    handle_commit(trans, class_name, new_obj)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/tasks.py", line 524, in process_transactions
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,"    return self.run(\*args, \*\*kwargs)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps_webapi/util/celery.py", line 18, in **call**
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,"    return self.\_get_current_object()(\*a, \*\*kw)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/celery/local.py", line 182, in **call**
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,    return task(\*\*kwargs)

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/tasks.py", line 80, in run_task
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^

2026/07/15 15:01:01,stderr,    task = run_task(

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/resources/transactions.py", line 63, in post
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,"    return func(\*args, \*\*kwargs)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/webargs/core.py", line 652, in wrapper
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,    return current_app.ensure_sync(meth)(\*\*kwargs)  # type: ignore\[no-any-return\]

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/flask/views.py", line 191, in dispatch_request
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,    return current_app.ensure_sync(self.dispatch_request)(\*\*kwargs)  # type: ignore\[no-any-return\]

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/flask/views.py", line 110, in view
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,"    return func(\*args, \*\*kwargs)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/auth.py", line 44, in wrapper
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,    return self.ensure_sync(self.view_functions\[rule.endpoint\])(\*\*view_args)  # type: ignore\[no-any-return\]

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/flask/app.py", line 902, in dispatch_request
"
2026/07/15 15:01:01,stderr,         ^^^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,    rv = self.dispatch_request()

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/flask/app.py", line 917, in full_dispatch_request
"
2026/07/15 15:01:01,stderr,               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,    response = self.full_dispatch_request()

2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/flask/app.py", line 1511, in wsgi_app
"
2026/07/15 15:01:01,stderr,           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,"    return self.wsgi_app(environ, start_response)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/flask/app.py", line 1536, in **call**
"
2026/07/15 15:01:01,stderr,               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2026/07/15 15:01:01,stderr,"    respiter = self.wsgi(environ, resp.start_response)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gunicorn/workers/sync.py", line 177, in handle_request
"
2026/07/15 15:01:01,stderr,"    self.handle_request(listener, req, client, addr)
"
2026/07/15 15:01:01,stderr,"  File "/usr/local/lib/python3.11/dist-packages/gunicorn/workers/sync.py", line 134, in handle
"
2026/07/15 15:01:01,stderr,Traceback (most recent call last):

2026/07/15 15:01:01,stderr,\[2026-07-15 13:01:01 +0000\] \[28\] \[ERROR\] Error handling request /api/transactions/?force=1&background=1

2026/07/15 15:01:01,stderr,\[2026-07-15 13:01:01 +0000\] \[27\] \[CRITICAL\] WORKER TIMEOUT (pid:28)

That’s the culprit. You’re running Gramps Web API without a Celery background task worker, consequently the database transaction is processed synchronously in an HTTP request, which times out.

None of our documented examples do not use a Celery worker…

I guess Is that the Celery background task worker has to be installed as part off gramps-web? Is it installed when I use this image: Package grampsweb · GitHub Did I use a wrong image? (using Portainer)

I tried to find “Celery” on the gramps-web website, I couldn’t find it

Please follow the documentation at grampsweb.org.

I did some research and found the problem. The docker-compose.yml provided by the gramps-web site wasn’t working with Portainer on my Synology NAS. The alternative I found was by “Marius Hosting” witch worked fine but not included Celery!! So I started an new install where I combined the two yaml files. biggest change I made the directories by hand, and included a container name. The deployment was seamless!!

Then I Changed the port-numbers in the new install so my revers proxy (for ssl-offload) from synology points to the new correct container. Everythings works, including the sync from my gramps-desktop.

The latest gramps-web (in the process I had off cause a upgrade) looks great! Leaving me with only one question: openstreetmap was superseded with MapLibre but I only see a blank page, no map! I checked the guide but I couldn’t find anything about MapLibre. Is there something I have to do to get it loading, a firewall change to allow something??

Thank for your assistence!

-—

The Map-problem is a firefox on windows/linux problem, in other browsers (including firefox for android) it works great!

The result of some more testing: A firefox add-on is here to blame: “No Script” blocked the working of he site!