Gramps Web Media import not matching checksums

I have Gramps Web installed and running via the 1-click droplet on Digital Ocean. I cannot get my media to import via ZIP. It’s as if the files are not there: I can’t find them on the server, and no checksums match.

I have run the Media Manager utilities and converted to relative paths, and most (not those 37 referenced above) have checksums. My import of the .gramps file was successful.

I can upload new images to the droplet and they show up on the server. However, when I try to replace an existing image with the same local copy, it tells me that there already exists a file with that checksum and refuses to upload.

I have a feeling that there is some kind of problem where the zip file upload creates a reference to the files, but does not actually upload the files. I’ve tried uploading differently sized zip files to the same effect.

Can someone advise? I’ve scoured these forums and found folks with similar problems, but have yet to find a solution. I’m not overly familiar with droplets or accessing config files therein, so if you can recognize my problem, go easy on me with explanations on how to fix it. I know how to shh in but I’ll need clear instructions on command syntax.

Thanks in advance!

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

Hi,

can you confirm that you didn’t modify anything in the configuration of the 1-click app manually (in that case there is no need to share details about your setup).

You can provide the following information to help diagnose this:

  • When you open one of the media objects in Gramps Web where you’re sure there is a checksum and the checksum is correct, and you use “replace file” to upload the file in Gramps Web, please report the detailed error message (if any) as well as
    • The response of the API call in the network tab of the browser dev tools (F12)
    • The log of your grampsweb container
    • The log of your celery container

The logs are obtained via

cd /opt/grampsweb
docker compose logs --tail 100 grampsweb
docker compose logs --tail 100 grampsweb_celery
  • When you upload a ZIP file, please provide
    • The error message
    • The log of your grampsweb container
    • The log of your celery container

Thanks for the response.

I did not modify anything in the 1-click app.

I deleted the entire tree and media objects and started over, re-importing the .gramps file an images.zip file. There is no error message when the .zip is loaded. It gives the green success error. But this is the status after uploading:
540 Media Objects
36 media objects with missing checksum
539 media objects with missing file

Here is the grampsweb log:

/opt/grampsweb# docker compose logs --tail 100 grampsweb
grampsweb | self.execute(
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps/plugins/db/dbapi/sqlite.py”, line 138, in execute
grampsweb | self.__cursor.execute(*args, **kwargs)
grampsweb | sqlite3.OperationalError: database is locked
grampsweb |
grampsweb | (main.py:8): Gtk-CRITICAL **: 22:14:40.762: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | INFO [alembic.runtime.migration] Context impl SQLiteImpl.
grampsweb | INFO [alembic.runtime.migration] Will assume non-transactional DDL.
grampsweb | [2025-12-24 22:14:45 +0000] [10] [INFO] Starting gunicorn 23.0.0
grampsweb | [2025-12-24 22:14:45 +0000] [10] [INFO] Listening at: ``http://0.0.0.0:5000`` (10)
grampsweb | [2025-12-24 22:14:45 +0000] [10] [INFO] Using worker: sync
grampsweb | [2025-12-24 22:14:45 +0000] [11] [INFO] Booting worker with pid: 11
grampsweb | [2025-12-24 22:14:45 +0000] [12] [INFO] Booting worker with pid: 12
grampsweb | [2025-12-24 22:14:45 +0000] [13] [INFO] Booting worker with pid: 13
grampsweb |
grampsweb | (gunicorn:11): Gtk-CRITICAL **: 22:14:52.715: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb |
grampsweb | (gunicorn:12): Gtk-CRITICAL **: 22:14:52.758: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb |
grampsweb | (gunicorn:13): Gtk-CRITICAL **: 22:14:52.883: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | [2025-12-26 18:07:19 +0000] [10] [ERROR] Worker (pid:12) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:07:19 +0000] [56] [INFO] Booting worker with pid: 56
grampsweb |
grampsweb | (gunicorn:56): Gtk-CRITICAL **: 18:07:21.839: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | [2025-12-26 18:08:36 +0000] [10] [ERROR] Worker (pid:13) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:08:36 +0000] [57] [INFO] Booting worker with pid: 57
grampsweb |
grampsweb | (gunicorn:57): Gtk-CRITICAL **: 18:08:38.442: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | [2025-12-26 18:09:00 +0000] [10] [ERROR] Worker (pid:57) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:09:00 +0000] [60] [INFO] Booting worker with pid: 60
grampsweb |
grampsweb | (gunicorn:60): Gtk-CRITICAL **: 18:09:03.643: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | [2025-12-26 18:22:12 +0000] [10] [ERROR] Worker (pid:11) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:22:12 +0000] [63] [INFO] Booting worker with pid: 63
grampsweb |
grampsweb | (gunicorn:63): Gtk-CRITICAL **: 18:22:14.208: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | [2025-12-26 18:22:16 +0000] [10] [ERROR] Worker (pid:56) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:22:16 +0000] [64] [INFO] Booting worker with pid: 64
grampsweb |
grampsweb | (gunicorn:64): Gtk-CRITICAL **: 18:22:18.755: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | Exception possibly due to cache backend.
grampsweb | Traceback (most recent call last):
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/cache.py”, line 62, in make_cache_key_thumbnails
grampsweb | obj = db_handle.get_media_from_handle(handle)
grampsweb | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps/gen/db/generic.py”, line 1487, in get_media_from_handle
grampsweb | return self._get_from_handle(MEDIA_KEY, Media, handle)
grampsweb | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps/gen/db/generic.py”, line 1460, in _get_from_handle
grampsweb | raise HandleError(f"Handle {handle} not found")
grampsweb | gramps.gen.errors.HandleError: Handle deefd4c3a3447e2630d not found
grampsweb |
grampsweb | During handling of the above exception, another exception occurred:
grampsweb |
grampsweb | Traceback (most recent call last):
grampsweb | File “/usr/local/lib/python3.11/dist-packages/flask_caching/init.py”, line 374, in decorated_function
grampsweb | cache_key = make_cache_key(*args, **kwargs)
grampsweb | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/cache.py”, line 64, in make_cache_key_thumbnails
grampsweb | abort_with_message(404, f"Handle {handle} not found")
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/util.py”, line 740, in abort_with_message
grampsweb | raise exc
grampsweb | werkzeug.exceptions.HTTPException: 404 Not Found: Handle deefd4c3a3447e2630d not found
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb |
grampsweb | (main.py:7): Gtk-CRITICAL **: 14:34:25.834: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | INFO [alembic.runtime.migration] Context impl SQLiteImpl.
grampsweb | INFO [alembic.runtime.migration] Will assume non-transactional DDL.
grampsweb | [2025-12-29 14:34:30 +0000] [9] [INFO] Starting gunicorn 23.0.0
grampsweb | [2025-12-29 14:34:30 +0000] [9] [INFO] Listening at: ``http://0.0.0.0:5000`` (9)
grampsweb | [2025-12-29 14:34:30 +0000] [9] [INFO] Using worker: sync
grampsweb | [2025-12-29 14:34:30 +0000] [10] [INFO] Booting worker with pid: 10
grampsweb | [2025-12-29 14:34:31 +0000] [11] [INFO] Booting worker with pid: 11
grampsweb | [2025-12-29 14:34:31 +0000] [12] [INFO] Booting worker with pid: 12
grampsweb |
grampsweb | (gunicorn:10): Gtk-CRITICAL **: 14:34:38.235: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb |
grampsweb | (gunicorn:11): Gtk-CRITICAL **: 14:34:38.381: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb |
grampsweb | (gunicorn:12): Gtk-CRITICAL **: 14:34:38.384: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed

And the celery log:
/opt/grampsweb# docker compose logs --tail 100 grampsweb_celery
grampsweb_celery | [2025-12-29 14:32:19,491: INFO/ForkPoolWorker-1] Looking for invalid name format references
grampsweb_celery | [2025-12-29 14:32:19,741: INFO/ForkPoolWorker-1] OK: no invalid name formats found found
grampsweb_celery | [2025-12-29 14:32:19,747: INFO/ForkPoolWorker-1] Looking for broken family links
grampsweb_celery | [2025-12-29 14:32:20,334: INFO/ForkPoolWorker-1] OK: no broken family links found
grampsweb_celery | [2025-12-29 14:32:20,335: INFO/ForkPoolWorker-1] Looking for broken parent relationships
grampsweb_celery | [2025-12-29 14:32:20,435: INFO/ForkPoolWorker-1] OK: no broken parent relationships found
grampsweb_celery | [2025-12-29 14:32:20,435: INFO/ForkPoolWorker-1] Looking for empty families
grampsweb_celery | [2025-12-29 14:32:20,450: INFO/ForkPoolWorker-1] OK: no empty families found
grampsweb_celery | [2025-12-29 14:32:20,450: INFO/ForkPoolWorker-1] Looking for duplicate spouses
grampsweb_celery | [2025-12-29 14:32:20,573: INFO/ForkPoolWorker-1] OK: no duplicate spouses found
grampsweb_celery | [2025-12-29 14:32:20,575: INFO/ForkPoolWorker-1] Looking for Duplicated Gramps ID problems
grampsweb_celery | [2025-12-29 14:32:20,784: INFO/ForkPoolWorker-1] Looking for event problems
grampsweb_celery | [2025-12-29 14:32:20,961: INFO/ForkPoolWorker-1] OK: no event problems found
grampsweb_celery | [2025-12-29 14:32:20,963: INFO/ForkPoolWorker-1] Looking for person reference problems
grampsweb_celery | [2025-12-29 14:32:21,039: INFO/ForkPoolWorker-1] OK: no event problems found
grampsweb_celery | [2025-12-29 14:32:21,041: INFO/ForkPoolWorker-1] Looking for family reference problems
grampsweb_celery | [2025-12-29 14:32:21,120: INFO/ForkPoolWorker-1] OK: no event problems found
grampsweb_celery | [2025-12-29 14:32:21,123: INFO/ForkPoolWorker-1] Looking for place reference problems
grampsweb_celery | [2025-12-29 14:32:21,296: INFO/ForkPoolWorker-1] OK: no place reference problems found
grampsweb_celery | [2025-12-29 14:32:21,299: INFO/ForkPoolWorker-1] Looking for source reference problems
grampsweb_celery | [2025-12-29 14:32:21,321: INFO/ForkPoolWorker-1] OK: no source reference problems found
grampsweb_celery | [2025-12-29 14:32:21,322: INFO/ForkPoolWorker-1] Looking for citation reference problems
grampsweb_celery | [2025-12-29 14:32:21,500: INFO/ForkPoolWorker-1] OK: no citation reference problems found
grampsweb_celery | [2025-12-29 14:32:21,501: INFO/ForkPoolWorker-1] Looking for media object reference problems
grampsweb_celery | [2025-12-29 14:32:21,662: INFO/ForkPoolWorker-1] OK: no media reference problems found
grampsweb_celery | [2025-12-29 14:32:21,664: INFO/ForkPoolWorker-1] Looking for repository reference problems
grampsweb_celery | [2025-12-29 14:32:21,665: INFO/ForkPoolWorker-1] OK: no repository reference problems found
grampsweb_celery | [2025-12-29 14:32:21,666: INFO/ForkPoolWorker-1] Looking for note reference problems
grampsweb_celery | [2025-12-29 14:32:21,818: INFO/ForkPoolWorker-1] OK: no note reference problems found
grampsweb_celery | [2025-12-29 14:32:21,820: INFO/ForkPoolWorker-1] Looking for tag reference problems
grampsweb_celery | [2025-12-29 14:32:22,093: INFO/ForkPoolWorker-1] OK: no tag reference problems found
grampsweb_celery | [2025-12-29 14:32:22,094: INFO/ForkPoolWorker-1] Looking for media source reference problems
grampsweb_celery | [2025-12-29 14:32:22,097: INFO/ForkPoolWorker-1] Looking for backlink reference problems
grampsweb_celery | [2025-12-29 14:32:22,409: WARNING/ForkPoolWorker-1] No errors were found: the database has passed internal checks.
grampsweb_celery | [2025-12-29 14:32:22,416: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.check_repair_database[caa5d772-bb4c-455b-9d7e-b2d4b46c2505] succeeded in 3.253950660000555s: {‘num_errors’: 0, ‘message’: ‘’}
grampsweb_celery |
grampsweb_celery | worker: Warm shutdown (MainProcess)
grampsweb_celery |
grampsweb_celery | (main.py:8): Gtk-CRITICAL **: 14:34:25.833: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb_celery | INFO [alembic.runtime.migration] Context impl SQLiteImpl.
grampsweb_celery | INFO [alembic.runtime.migration] Will assume non-transactional DDL.
grampsweb_celery |
grampsweb_celery | (celery:1): Gtk-CRITICAL **: 14:34:34.040: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb_celery | /usr/local/lib/python3.11/dist-packages/celery/platforms.py:841: SecurityWarning: You’re running the worker with superuser privileges: this is
grampsweb_celery | absolutely not recommended!
grampsweb_celery |
grampsweb_celery | Please specify a different user using the --uid option.
grampsweb_celery |
grampsweb_celery | User information: uid=0 euid=0 gid=0 egid=0
grampsweb_celery |
grampsweb_celery | warnings.warn(SecurityWarning(ROOT_DISCOURAGED.format(
grampsweb_celery |
grampsweb_celery | -------------- celery@df430b8b2f0a v5.6.0 (recovery)
grampsweb_celery | — ***** -----
grampsweb_celery | – ******* ---- Linux-5.15.0-164-generic-x86_64-with-glibc2.36 2025-12-29 14:34:35
grampsweb_celery | - *** — * —
grampsweb_celery | - ** ---------- [config]
grampsweb_celery | - ** ---------- .> app: default:0x7f4bb67f7410 (.default.Loader)
grampsweb_celery | - ** ---------- .> transport: redis://grampsweb_redis:6379/0
grampsweb_celery | - ** ---------- .> results: redis://grampsweb_redis:6379/0
grampsweb_celery | - *** — * — .> concurrency: 2 (prefork)
grampsweb_celery | – ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
grampsweb_celery | — ***** -----
grampsweb_celery | -------------- [queues]
grampsweb_celery | .> celery exchange=celery(direct) key=celery
grampsweb_celery |
grampsweb_celery |
grampsweb_celery | [tasks]
grampsweb_celery | . gramps_webapi.api.tasks.check_repair_database
grampsweb_celery | . gramps_webapi.api.tasks.delete_objects
grampsweb_celery | . gramps_webapi.api.tasks.export_db
grampsweb_celery | . gramps_webapi.api.tasks.export_media
grampsweb_celery | . gramps_webapi.api.tasks.generate_report
grampsweb_celery | . gramps_webapi.api.tasks.import_file
grampsweb_celery | . gramps_webapi.api.tasks.import_media_archive
grampsweb_celery | . gramps_webapi.api.tasks.media_ocr
grampsweb_celery | . gramps_webapi.api.tasks.process_chat
grampsweb_celery | . gramps_webapi.api.tasks.process_transactions
grampsweb_celery | . gramps_webapi.api.tasks.search_reindex_full
grampsweb_celery | . gramps_webapi.api.tasks.search_reindex_incremental
grampsweb_celery | . gramps_webapi.api.tasks.send_email_confirm_email
grampsweb_celery | . gramps_webapi.api.tasks.send_email_new_user
grampsweb_celery | . gramps_webapi.api.tasks.send_email_reset_password
grampsweb_celery | . gramps_webapi.api.tasks.send_telemetry_task
grampsweb_celery | . gramps_webapi.api.tasks.update_search_indices_from_transaction
grampsweb_celery | . gramps_webapi.api.tasks.upgrade_database_schema
grampsweb_celery | . gramps_webapi.api.tasks.upgrade_undodb_schema
grampsweb_celery |
grampsweb_celery | [2025-12-29 14:34:36,279: INFO/MainProcess] Connected to redis://grampsweb_redis:6379/0
grampsweb_celery | [2025-12-29 14:34:36,295: INFO/MainProcess] mingle: searching for neighbors
grampsweb_celery | [2025-12-29 14:34:37,331: INFO/MainProcess] mingle: all alone
grampsweb_celery | [2025-12-29 14:34:37,354: INFO/MainProcess] celery@df430b8b2f0a ready.
grampsweb_celery | [2025-12-29 14:35:15,173: INFO/MainProcess] Task gramps_webapi.api.tasks.import_media_archive[3b124bb9-c163-461d-972a-5f9adf8bbae2] received
grampsweb_celery | [2025-12-29 14:35:15,327: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_media_archive[3b124bb9-c163-461d-972a-5f9adf8bbae2] succeeded in 0.15281892300001232s: {‘missing’: 0, ‘uploaded’: 0, ‘failures’: 0}
grampsweb_celery | [2025-12-29 14:35:27,807: INFO/MainProcess] Task gramps_webapi.api.tasks.delete_objects[1c098117-8b22-4627-a7ee-34017dff946c] received
grampsweb_celery | [2025-12-29 14:40:16,677: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.delete_objects[1c098117-8b22-4627-a7ee-34017dff946c] succeeded in 288.868596468s: None
grampsweb_celery | [2025-12-29 14:45:19,850: INFO/MainProcess] Task gramps_webapi.api.tasks.import_file[51170be8-bc58-490a-b948-58616aafe751] received
grampsweb_celery | [2025-12-29 14:45:30,329: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_file[51170be8-bc58-490a-b948-58616aafe751] succeeded in 10.477624306999928s: None
grampsweb_celery | [2025-12-29 14:46:01,795: INFO/MainProcess] Task gramps_webapi.api.tasks.import_media_archive[b56cde4b-2d41-4b28-ad0f-a2d0447eb364] received
grampsweb_celery | [2025-12-29 14:46:03,435: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_media_archive[b56cde4b-2d41-4b28-ad0f-a2d0447eb364] succeeded in 1.638208058000032s: {‘missing’: 493, ‘uploaded’: 185, ‘failures’: 0}

After that, I tried the replace file function.
API response:
Failed to load response data - Request content was evicted from inspector cache.

Error message:
Error: Upload file has the same checksum as the existing media object.

Grampsweb log:
/opt/grampsweb# docker compose logs --tail 100 grampsweb
grampsweb | INFO [alembic.runtime.migration] Context impl SQLiteImpl.
grampsweb | INFO [alembic.runtime.migration] Will assume non-transactional DDL.
grampsweb | [2025-12-24 22:14:45 +0000] [10] [INFO] Starting gunicorn 23.0.0
grampsweb | [2025-12-24 22:14:45 +0000] [10] [INFO] Listening at: ``http://0.0.0.0:5000`` (10)
grampsweb | [2025-12-24 22:14:45 +0000] [10] [INFO] Using worker: sync
grampsweb | [2025-12-24 22:14:45 +0000] [11] [INFO] Booting worker with pid: 11
grampsweb | [2025-12-24 22:14:45 +0000] [12] [INFO] Booting worker with pid: 12
grampsweb | [2025-12-24 22:14:45 +0000] [13] [INFO] Booting worker with pid: 13
grampsweb |
grampsweb | (gunicorn:11): Gtk-CRITICAL **: 22:14:52.715: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb |
grampsweb | (gunicorn:12): Gtk-CRITICAL **: 22:14:52.758: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb |
grampsweb | (gunicorn:13): Gtk-CRITICAL **: 22:14:52.883: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | [2025-12-26 18:07:19 +0000] [10] [ERROR] Worker (pid:12) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:07:19 +0000] [56] [INFO] Booting worker with pid: 56
grampsweb |
grampsweb | (gunicorn:56): Gtk-CRITICAL **: 18:07:21.839: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | [2025-12-26 18:08:36 +0000] [10] [ERROR] Worker (pid:13) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:08:36 +0000] [57] [INFO] Booting worker with pid: 57
grampsweb |
grampsweb | (gunicorn:57): Gtk-CRITICAL **: 18:08:38.442: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | [2025-12-26 18:09:00 +0000] [10] [ERROR] Worker (pid:57) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:09:00 +0000] [60] [INFO] Booting worker with pid: 60
grampsweb |
grampsweb | (gunicorn:60): Gtk-CRITICAL **: 18:09:03.643: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | [2025-12-26 18:22:12 +0000] [10] [ERROR] Worker (pid:11) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:22:12 +0000] [63] [INFO] Booting worker with pid: 63
grampsweb |
grampsweb | (gunicorn:63): Gtk-CRITICAL **: 18:22:14.208: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | [2025-12-26 18:22:16 +0000] [10] [ERROR] Worker (pid:56) was sent SIGKILL! Perhaps out of memory?
grampsweb | [2025-12-26 18:22:16 +0000] [64] [INFO] Booting worker with pid: 64
grampsweb |
grampsweb | (gunicorn:64): Gtk-CRITICAL **: 18:22:18.755: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | Exception possibly due to cache backend.
grampsweb | Traceback (most recent call last):
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/cache.py”, line 62, in make_cache_key_thumbnails
grampsweb | obj = db_handle.get_media_from_handle(handle)
grampsweb | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps/gen/db/generic.py”, line 1487, in get_media_from_handle
grampsweb | return self._get_from_handle(MEDIA_KEY, Media, handle)
grampsweb | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps/gen/db/generic.py”, line 1460, in _get_from_handle
grampsweb | raise HandleError(f"Handle {handle} not found")
grampsweb | gramps.gen.errors.HandleError: Handle deefd4c3a3447e2630d not found
grampsweb |
grampsweb | During handling of the above exception, another exception occurred:
grampsweb |
grampsweb | Traceback (most recent call last):
grampsweb | File “/usr/local/lib/python3.11/dist-packages/flask_caching/init.py”, line 374, in decorated_function
grampsweb | cache_key = make_cache_key(*args, **kwargs)
grampsweb | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/cache.py”, line 64, in make_cache_key_thumbnails
grampsweb | abort_with_message(404, f"Handle {handle} not found")
grampsweb | File “/usr/local/lib/python3.11/dist-packages/gramps_webapi/api/util.py”, line 740, in abort_with_message
grampsweb | raise exc
grampsweb | werkzeug.exceptions.HTTPException: 404 Not Found: Handle deefd4c3a3447e2630d not found
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb |
grampsweb | (main.py:7): Gtk-CRITICAL **: 14:34:25.834: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | INFO [alembic.runtime.migration] Context impl SQLiteImpl.
grampsweb | INFO [alembic.runtime.migration] Will assume non-transactional DDL.
grampsweb | [2025-12-29 14:34:30 +0000] [9] [INFO] Starting gunicorn 23.0.0
grampsweb | [2025-12-29 14:34:30 +0000] [9] [INFO] Listening at: ``http://0.0.0.0:5000`` (9)
grampsweb | [2025-12-29 14:34:30 +0000] [9] [INFO] Using worker: sync
grampsweb | [2025-12-29 14:34:30 +0000] [10] [INFO] Booting worker with pid: 10
grampsweb | [2025-12-29 14:34:31 +0000] [11] [INFO] Booting worker with pid: 11
grampsweb | [2025-12-29 14:34:31 +0000] [12] [INFO] Booting worker with pid: 12
grampsweb |
grampsweb | (gunicorn:10): Gtk-CRITICAL **: 14:34:38.235: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb |
grampsweb | (gunicorn:11): Gtk-CRITICAL **: 14:34:38.381: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb |
grampsweb | (gunicorn:12): Gtk-CRITICAL **: 14:34:38.384: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.
grampsweb | ERROR:root:Error parsing list of recent DBs from file /root/gramps/recent-files-gramps.xml: no element found: line 1, column 0.
grampsweb | This might indicate a damage to your files.
grampsweb | If you’re sure there is no problem with other files, delete it, and restart Gramps.

Celery log:
/opt/grampsweb# docker compose logs --tail 100 grampsweb_celery
grampsweb_celery | [2025-12-29 14:32:19,491: INFO/ForkPoolWorker-1] Looking for invalid name format references
grampsweb_celery | [2025-12-29 14:32:19,741: INFO/ForkPoolWorker-1] OK: no invalid name formats found found
grampsweb_celery | [2025-12-29 14:32:19,747: INFO/ForkPoolWorker-1] Looking for broken family links
grampsweb_celery | [2025-12-29 14:32:20,334: INFO/ForkPoolWorker-1] OK: no broken family links found
grampsweb_celery | [2025-12-29 14:32:20,335: INFO/ForkPoolWorker-1] Looking for broken parent relationships
grampsweb_celery | [2025-12-29 14:32:20,435: INFO/ForkPoolWorker-1] OK: no broken parent relationships found
grampsweb_celery | [2025-12-29 14:32:20,435: INFO/ForkPoolWorker-1] Looking for empty families
grampsweb_celery | [2025-12-29 14:32:20,450: INFO/ForkPoolWorker-1] OK: no empty families found
grampsweb_celery | [2025-12-29 14:32:20,450: INFO/ForkPoolWorker-1] Looking for duplicate spouses
grampsweb_celery | [2025-12-29 14:32:20,573: INFO/ForkPoolWorker-1] OK: no duplicate spouses found
grampsweb_celery | [2025-12-29 14:32:20,575: INFO/ForkPoolWorker-1] Looking for Duplicated Gramps ID problems
grampsweb_celery | [2025-12-29 14:32:20,784: INFO/ForkPoolWorker-1] Looking for event problems
grampsweb_celery | [2025-12-29 14:32:20,961: INFO/ForkPoolWorker-1] OK: no event problems found
grampsweb_celery | [2025-12-29 14:32:20,963: INFO/ForkPoolWorker-1] Looking for person reference problems
grampsweb_celery | [2025-12-29 14:32:21,039: INFO/ForkPoolWorker-1] OK: no event problems found
grampsweb_celery | [2025-12-29 14:32:21,041: INFO/ForkPoolWorker-1] Looking for family reference problems
grampsweb_celery | [2025-12-29 14:32:21,120: INFO/ForkPoolWorker-1] OK: no event problems found
grampsweb_celery | [2025-12-29 14:32:21,123: INFO/ForkPoolWorker-1] Looking for place reference problems
grampsweb_celery | [2025-12-29 14:32:21,296: INFO/ForkPoolWorker-1] OK: no place reference problems found
grampsweb_celery | [2025-12-29 14:32:21,299: INFO/ForkPoolWorker-1] Looking for source reference problems
grampsweb_celery | [2025-12-29 14:32:21,321: INFO/ForkPoolWorker-1] OK: no source reference problems found
grampsweb_celery | [2025-12-29 14:32:21,322: INFO/ForkPoolWorker-1] Looking for citation reference problems
grampsweb_celery | [2025-12-29 14:32:21,500: INFO/ForkPoolWorker-1] OK: no citation reference problems found
grampsweb_celery | [2025-12-29 14:32:21,501: INFO/ForkPoolWorker-1] Looking for media object reference problems
grampsweb_celery | [2025-12-29 14:32:21,662: INFO/ForkPoolWorker-1] OK: no media reference problems found
grampsweb_celery | [2025-12-29 14:32:21,664: INFO/ForkPoolWorker-1] Looking for repository reference problems
grampsweb_celery | [2025-12-29 14:32:21,665: INFO/ForkPoolWorker-1] OK: no repository reference problems found
grampsweb_celery | [2025-12-29 14:32:21,666: INFO/ForkPoolWorker-1] Looking for note reference problems
grampsweb_celery | [2025-12-29 14:32:21,818: INFO/ForkPoolWorker-1] OK: no note reference problems found
grampsweb_celery | [2025-12-29 14:32:21,820: INFO/ForkPoolWorker-1] Looking for tag reference problems
grampsweb_celery | [2025-12-29 14:32:22,093: INFO/ForkPoolWorker-1] OK: no tag reference problems found
grampsweb_celery | [2025-12-29 14:32:22,094: INFO/ForkPoolWorker-1] Looking for media source reference problems
grampsweb_celery | [2025-12-29 14:32:22,097: INFO/ForkPoolWorker-1] Looking for backlink reference problems
grampsweb_celery | [2025-12-29 14:32:22,409: WARNING/ForkPoolWorker-1] No errors were found: the database has passed internal checks.
grampsweb_celery | [2025-12-29 14:32:22,416: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.check_repair_database[caa5d772-bb4c-455b-9d7e-b2d4b46c2505] succeeded in 3.253950660000555s: {‘num_errors’: 0, ‘message’: ‘’}
grampsweb_celery |
grampsweb_celery | worker: Warm shutdown (MainProcess)
grampsweb_celery |
grampsweb_celery | (main.py:8): Gtk-CRITICAL **: 14:34:25.833: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb_celery | INFO [alembic.runtime.migration] Context impl SQLiteImpl.
grampsweb_celery | INFO [alembic.runtime.migration] Will assume non-transactional DDL.
grampsweb_celery |
grampsweb_celery | (celery:1): Gtk-CRITICAL **: 14:34:34.040: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb_celery | /usr/local/lib/python3.11/dist-packages/celery/platforms.py:841: SecurityWarning: You’re running the worker with superuser privileges: this is
grampsweb_celery | absolutely not recommended!
grampsweb_celery |
grampsweb_celery | Please specify a different user using the --uid option.
grampsweb_celery |
grampsweb_celery | User information: uid=0 euid=0 gid=0 egid=0
grampsweb_celery |
grampsweb_celery | warnings.warn(SecurityWarning(ROOT_DISCOURAGED.format(
grampsweb_celery |
grampsweb_celery | -------------- celery@df430b8b2f0a v5.6.0 (recovery)
grampsweb_celery | — ***** -----
grampsweb_celery | – ******* ---- Linux-5.15.0-164-generic-x86_64-with-glibc2.36 2025-12-29 14:34:35
grampsweb_celery | - *** — * —
grampsweb_celery | - ** ---------- [config]
grampsweb_celery | - ** ---------- .> app: default:0x7f4bb67f7410 (.default.Loader)
grampsweb_celery | - ** ---------- .> transport: redis://grampsweb_redis:6379/0
grampsweb_celery | - ** ---------- .> results: redis://grampsweb_redis:6379/0
grampsweb_celery | - *** — * — .> concurrency: 2 (prefork)
grampsweb_celery | – ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
grampsweb_celery | — ***** -----
grampsweb_celery | -------------- [queues]
grampsweb_celery | .> celery exchange=celery(direct) key=celery
grampsweb_celery |
grampsweb_celery |
grampsweb_celery | [tasks]
grampsweb_celery | . gramps_webapi.api.tasks.check_repair_database
grampsweb_celery | . gramps_webapi.api.tasks.delete_objects
grampsweb_celery | . gramps_webapi.api.tasks.export_db
grampsweb_celery | . gramps_webapi.api.tasks.export_media
grampsweb_celery | . gramps_webapi.api.tasks.generate_report
grampsweb_celery | . gramps_webapi.api.tasks.import_file
grampsweb_celery | . gramps_webapi.api.tasks.import_media_archive
grampsweb_celery | . gramps_webapi.api.tasks.media_ocr
grampsweb_celery | . gramps_webapi.api.tasks.process_chat
grampsweb_celery | . gramps_webapi.api.tasks.process_transactions
grampsweb_celery | . gramps_webapi.api.tasks.search_reindex_full
grampsweb_celery | . gramps_webapi.api.tasks.search_reindex_incremental
grampsweb_celery | . gramps_webapi.api.tasks.send_email_confirm_email
grampsweb_celery | . gramps_webapi.api.tasks.send_email_new_user
grampsweb_celery | . gramps_webapi.api.tasks.send_email_reset_password
grampsweb_celery | . gramps_webapi.api.tasks.send_telemetry_task
grampsweb_celery | . gramps_webapi.api.tasks.update_search_indices_from_transaction
grampsweb_celery | . gramps_webapi.api.tasks.upgrade_database_schema
grampsweb_celery | . gramps_webapi.api.tasks.upgrade_undodb_schema
grampsweb_celery |
grampsweb_celery | [2025-12-29 14:34:36,279: INFO/MainProcess] Connected to redis://grampsweb_redis:6379/0
grampsweb_celery | [2025-12-29 14:34:36,295: INFO/MainProcess] mingle: searching for neighbors
grampsweb_celery | [2025-12-29 14:34:37,331: INFO/MainProcess] mingle: all alone
grampsweb_celery | [2025-12-29 14:34:37,354: INFO/MainProcess] celery@df430b8b2f0a ready.
grampsweb_celery | [2025-12-29 14:35:15,173: INFO/MainProcess] Task gramps_webapi.api.tasks.import_media_archive[3b124bb9-c163-461d-972a-5f9adf8bbae2] received
grampsweb_celery | [2025-12-29 14:35:15,327: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_media_archive[3b124bb9-c163-461d-972a-5f9adf8bbae2] succeeded in 0.15281892300001232s: {‘missing’: 0, ‘uploaded’: 0, ‘failures’: 0}
grampsweb_celery | [2025-12-29 14:35:27,807: INFO/MainProcess] Task gramps_webapi.api.tasks.delete_objects[1c098117-8b22-4627-a7ee-34017dff946c] received
grampsweb_celery | [2025-12-29 14:40:16,677: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.delete_objects[1c098117-8b22-4627-a7ee-34017dff946c] succeeded in 288.868596468s: None
grampsweb_celery | [2025-12-29 14:45:19,850: INFO/MainProcess] Task gramps_webapi.api.tasks.import_file[51170be8-bc58-490a-b948-58616aafe751] received
grampsweb_celery | [2025-12-29 14:45:30,329: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_file[51170be8-bc58-490a-b948-58616aafe751] succeeded in 10.477624306999928s: None
grampsweb_celery | [2025-12-29 14:46:01,795: INFO/MainProcess] Task gramps_webapi.api.tasks.import_media_archive[b56cde4b-2d41-4b28-ad0f-a2d0447eb364] received
grampsweb_celery | [2025-12-29 14:46:03,435: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_media_archive[b56cde4b-2d41-4b28-ad0f-a2d0447eb364] succeeded in 1.638208058000032s: {‘missing’: 493, ‘uploaded’: 185, ‘failures’: 0}

I did notice that if I replace file with a media object that did not have a checksum (there were 36 of them for whatever reason, the file will load correctly. So that’s good!

I hope I’ve given you what you need. Thanks for the help!

@DavidMStraub I don’t want to bother, but is there anything in these logs that can help diagnose my problem?

Yes,

Worker (pid:13) was sent SIGKILL! Perhaps out of memory?

This means you don’t have enough RAM on your server, so memory intensive tasks (likely including processing of media files) will fail.

How much RAM do you have?

See here for some config tweaks you can try to improve:

Thank you! I will give that a try!

I have 2GB RAM on the server, per the install instructions.

I have edited the docker-compose.yml and reduced the workers to 1.

GUNICORN_NUM_WORKERS: 1 and command: celery -A gramps_webapi.celery worker --loglevel=INFO --concurrency=1

I then rebuilt the droplet (I think!) with these commands:
docker compose down --remove-orphans
docker compose up -d

It looked like it ran successfully, but uploads still aren’t working. The logs are different, though:

/opt/grampsweb# docker compose logs --tail 100 grampsweb
grampsweb |
grampsweb | (main.py:8): Gtk-CRITICAL **: 19:09:55.798: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb | INFO [alembic.runtime.migration] Context impl SQLiteImpl.
grampsweb | INFO [alembic.runtime.migration] Will assume non-transactional DDL.
grampsweb | [2026-01-07 19:10:00 +0000] [10] [INFO] Starting gunicorn 23.0.0
grampsweb | [2026-01-07 19:10:00 +0000] [10] [INFO] Listening at: http://0.0.0.0:5000 (10)
grampsweb | [2026-01-07 19:10:00 +0000] [10] [INFO] Using worker: sync
grampsweb | [2026-01-07 19:10:00 +0000] [11] [INFO] Booting worker with pid: 11
grampsweb |
grampsweb | (gunicorn:11): Gtk-CRITICAL **: 19:10:03.823: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed

/opt/grampsweb# docker compose logs --tail 100 grampsweb_celery
grampsweb_celery |
grampsweb_celery | (main.py:8): Gtk-CRITICAL **: 19:09:56.009: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb_celery | INFO [alembic.runtime.migration] Context impl SQLiteImpl.
grampsweb_celery | INFO [alembic.runtime.migration] Will assume non-transactional DDL.
grampsweb_celery |
grampsweb_celery | (celery:1): Gtk-CRITICAL **: 19:10:04.383: gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed
grampsweb_celery | /usr/local/lib/python3.11/dist-packages/celery/platforms.py:841: SecurityWarning: You’re running the worker with superuser privileges: this is
grampsweb_celery | absolutely not recommended!
grampsweb_celery |
grampsweb_celery | Please specify a different user using the --uid option.
grampsweb_celery |
grampsweb_celery | User information: uid=0 euid=0 gid=0 egid=0
grampsweb_celery |
grampsweb_celery | warnings.warn(SecurityWarning(ROOT_DISCOURAGED.format(
grampsweb_celery |
grampsweb_celery | -------------- celery@d757cccc9da9 v5.6.0 (recovery)
grampsweb_celery | — ***** -----
grampsweb_celery | – ******* ---- Linux-5.15.0-164-generic-x86_64-with-glibc2.36 2026-01-07 19:10:05
grampsweb_celery | - *** — * —
grampsweb_celery | - ** ---------- [config]
grampsweb_celery | - ** ---------- .> app: default:0x7f9e161d40d0 (.default.Loader)
grampsweb_celery | - ** ---------- .> transport: redis://grampsweb_redis:6379/0
grampsweb_celery | - ** ---------- .> results: redis://grampsweb_redis:6379/0
grampsweb_celery | - *** — * — .> concurrency: 1 (prefork)
grampsweb_celery | – ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
grampsweb_celery | — ***** -----
grampsweb_celery | -------------- [queues]
grampsweb_celery | .> celery exchange=celery(direct) key=celery
grampsweb_celery |
grampsweb_celery |
grampsweb_celery | [tasks]
grampsweb_celery | . gramps_webapi.api.tasks.check_repair_database
grampsweb_celery | . gramps_webapi.api.tasks.delete_objects
grampsweb_celery | . gramps_webapi.api.tasks.export_db
grampsweb_celery | . gramps_webapi.api.tasks.export_media
grampsweb_celery | . gramps_webapi.api.tasks.generate_report
grampsweb_celery | . gramps_webapi.api.tasks.import_file
grampsweb_celery | . gramps_webapi.api.tasks.import_media_archive
grampsweb_celery | . gramps_webapi.api.tasks.media_ocr
grampsweb_celery | . gramps_webapi.api.tasks.process_chat
grampsweb_celery | . gramps_webapi.api.tasks.process_transactions
grampsweb_celery | . gramps_webapi.api.tasks.search_reindex_full
grampsweb_celery | . gramps_webapi.api.tasks.search_reindex_incremental
grampsweb_celery | . gramps_webapi.api.tasks.send_email_confirm_email
grampsweb_celery | . gramps_webapi.api.tasks.send_email_new_user
grampsweb_celery | . gramps_webapi.api.tasks.send_email_reset_password
grampsweb_celery | . gramps_webapi.api.tasks.send_telemetry_task
grampsweb_celery | . gramps_webapi.api.tasks.update_search_indices_from_transaction
grampsweb_celery | . gramps_webapi.api.tasks.upgrade_database_schema
grampsweb_celery | . gramps_webapi.api.tasks.upgrade_undodb_schema
grampsweb_celery |
grampsweb_celery | [2026-01-07 19:10:05,612: INFO/MainProcess] Connected to redis://grampsweb_redis:6379/0
grampsweb_celery | [2026-01-07 19:10:05,616: INFO/MainProcess] mingle: searching for neighbors
grampsweb_celery | [2026-01-07 19:10:06,628: INFO/MainProcess] mingle: all alone
grampsweb_celery | [2026-01-07 19:10:06,644: INFO/MainProcess] celery@d757cccc9da9 ready.
grampsweb_celery | [2026-01-07 19:10:35,763: INFO/MainProcess] Task gramps_webapi.api.tasks.import_media_archive[a773f1cc-0e08-456c-9eab-a1972f350656] received
grampsweb_celery | [2026-01-07 19:10:36,080: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_media_archive[a773f1cc-0e08-456c-9eab-a1972f350656] succeeded in 0.31460663897451013s: {‘missing’: 493, ‘uploaded’: 2, ‘failures’: 0}
grampsweb_celery | [2026-01-07 19:11:24,507: INFO/MainProcess] Task gramps_webapi.api.tasks.import_media_archive[db33404d-3bc1-4bca-acb8-82f305495f24] received
grampsweb_celery | [2026-01-07 19:11:25,600: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_media_archive[db33404d-3bc1-4bca-acb8-82f305495f24] succeeded in 1.0913475309498608s: {‘missing’: 493, ‘uploaded’: 185, ‘failures’: 0}

I tried 2 uploads. One with 2 images in the zip and one with 185 images in it.

Any suggestions for moving forward?

@DavidMStraub Sorry to ping you, but hopefully the new log will help you diagnose what might be going on?

 grampsweb_celery | [2026-01-07 19:11:25,600: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_media_archive[db33404d-3bc1-4bca-acb8-82f305495f24] succeeded in 1.0913475309498608s: {‘missing’: 493, ‘uploaded’: 185, ‘failures’: 0}

This looks like it worked.

If you still can’t see them, something about your docker volume configuration is wrong. Please share your YAML.

@DavidMStraub Thanks for working with me on this.

services:
grampsweb: &grampsweb
container_name: grampsweb
image: 

restart: always
env_file: /root/letsencrypt.env
environment: &grampsweb-env
VIRTUAL_PORT: “5000”
GRAMPSWEB_TREE: Gramps Web
GUNICORN_NUM_WORKERS: 1
GRAMPSWEB_CELERY_CONFIG__broker_url: “redis://grampsweb_redis:6379/0”
GRAMPSWEB_CELERY_CONFIG__result_backend: “redis://grampsweb_redis:6379/0”
GRAMPSWEB_RATELIMIT_STORAGE_URI: redis://grampsweb_redis:6379/1
depends_on:
- grampsweb_redis
volumes:
- gramps_users:/app/users # persist user database
- gramps_index:/app/indexdir # persist search index
- gramps_thumb_cache:/app/thumbnail_cache # persist thumbnails
- gramps_cache:/app/cache  # persist export and report caches
- gramps_secret:/app/secret # persist flask secret
- gramps_db:/root/.gramps/grampsdb # persist Gramps database
- /root/gramps_media:/app/media # persist media files
- gramps_tmp:/tmp
networks:
- proxy-tier
- default

grampsweb_celery:
<<: *grampsweb  # YAML merge key copying the entire grampsweb service config
container_name: grampsweb_celery
depends_on:
- grampsweb
- grampsweb_redis
environment:
<<: *grampsweb-env  # YAML merge key copying the grampsweb environment config
# overriding let’s encrypt variables since celery is not exposed
VIRTUAL_PORT: “”
VIRTUAL_HOST: “”
LETSENCRYPT_HOST: “”
LETSENCRYPT_EMAIL: “”
command: celery -A gramps_webapi.celery worker --loglevel=INFO --concurrency=1

grampsweb_redis:
image: 

container_name: grampsweb_redis
restart: always

proxy:
image: docker.io/nginxproxy/nginx-proxy
container_name: nginx-proxy
restart: always
ports:
- “80:80”
- “443:443”
environment:
ENABLE_IPV6: “true”
volumes:
- ./nginx_proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro
- conf:/etc/nginx/conf.d
- dhparam:/etc/nginx/dhparam
- certs:/etc/nginx/certs:ro
- vhost.d:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- proxy-tier

acme-companion:
image: docker.io/nginxproxy/acme-companion
container_name: nginx-proxy-acme
restart: always
environment:
NGINX_PROXY_CONTAINER: nginx-proxy
volumes:
- certs:/etc/nginx/certs:rw
- vhost.d:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- acme:/etc/acme.sh
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- proxy-tier
depends_on:
- proxy

volumes:
acme:
certs:
conf:
dhparam:
vhost.d:
html:
gramps_users:
gramps_index:
gramps_thumb_cache:
gramps_cache:
gramps_secret:
gramps_db:
gramps_tmp:

networks:
proxy-tier:

The whitespace disappeared… apart from that I don’t see anything wrong. Anything showing up in /root/media? Would be worth exec-ing into the two containers (celery and grampsweb), touching a file in /app/media, and checking if it’s visible from the other container.

@DavidMStraub I’m not entirely sure how to do that. I can access the Digital Ocean console, which may not be the correct way to do what you are asking. Regardless, there are no files that I can see in root/media and none in /opt/grampsweb/media.

I’m afraid I don’t fully understand what are you are asking me to do. I don’t understand the “touching a file from the containers” part. It sounds like a permissions error?

cd /opt/grampsweb
docker compose grampsweb bash
touch /app/media/test-grampsweb.txt
ls -l /app/media
docker compose grampsweb_celery bash
touch /app/media/test-celery.txt
ls -l /app/media

@DavidMStraub I had to add the exec command to the docker compose line to get it to work. I think that was correct.
Here’s the results, they seem positive to me:

root@gramps:/opt/grampsweb# docker compose exec grampsweb bash
root@0711805e0e1e:/app# touch /app/media/test-grampsweb.txt
root@0711805e0e1e:/app# ls -l /app/media
total 37204
-rw-r–r-- 1 root root 1054442 Jan 5 19:38 1157d7a2d317aede5928f6a4f372c32a.jpg
-rw-r–r-- 1 root root 716000 Dec 29 15:12 1bd0853ebfc9071fa1e1b60fffa9287c.jpg
-rw-r–r-- 1 root root 656656 Dec 29 15:09 1ce52c938a389f4365093a0e0bdcea31.jpg
-rw-r–r-- 1 root root 678070 Dec 29 15:10 1f2261d0847747d42737ecc13ab18cfd.jpg
-rw-r–r-- 1 root root 210382 Dec 24 22:31 21dd29588ddd9e39080db07205892914.jpg
-rw-r–r-- 1 root root 539608 Dec 29 17:46 25bca189cf13aa5a6cce9a7b147d55a1.jpg
-rw-r–r-- 1 root root 246880 Dec 29 15:08 3ba1b10b3d7019aef2eb455ecd3f7b6d.jpg
-rw-r–r-- 1 root root 99429 Dec 29 15:58 3be9c7a0622585c73da7e70659e3ef96.pdf
-rw-r–r-- 1 root root 2209846 Dec 26 18:46 4dfa2f83181ac86f1654f45270171afd.jpg
-rw-r–r-- 1 root root 1162443 Dec 29 17:37 61bcec57c41ad31b7f06687e7f52027a.png
-rw-r–r-- 1 root root 257823 Dec 29 14:52 6b133fa45d43d09a23df78ed6ca9fde1.jpg
-rw-r–r-- 1 root root 202030 Dec 29 16:00 82561e96932f3a9f6835066f2a346ecc.pdf
-rw-r–r-- 1 root root 15337418 Dec 29 15:53 84bcaca166f9a575df81968fb23a6a94.pdf
-rw-r–r-- 1 root root 795968 Jan 5 19:31 8c7ce353bb320a9c57dea0592ac41091.jpg
-rw-r–r-- 1 root root 595376 Dec 29 16:32 8f03231f9d76140b77c85aa9cf65d36c.pdf
-rw-r–r-- 1 root root 537837 Dec 29 15:11 9608f5a2c799308f5f97531cedc3dea1.jpg
-rw-r–r-- 1 root root 241407 Dec 29 17:17 991187b3f19b3ba1037af10f905e25f8.jpg
-rw-r–r-- 1 root root 1495270 Dec 29 16:25 a0c131a7dcb7bd33ec850dad7facaacc.jpg
-rw-r–r-- 1 root root 979658 Jan 5 19:12 b41e0f74d66fcb3e5a3f9ac62d93f5d5.jpg
-rw-r–r-- 1 root root 803888 Dec 29 15:09 c0aca41d8cd99d23097fe4af7bff6a46.jpg
-rw-r–r-- 1 root root 432272 Dec 29 16:39 c877c8bb1682ea06df319e7b5a5e5198.pdf
-rw-r–r-- 1 root root 222984 Dec 29 17:11 f4c1e821b2cd1a047dfc5adc470645e4.jpg
-rw-r–r-- 1 root root 367755 Dec 29 16:09 fc21b510e9423787552138172b2d52c5.pdf
-rw-r–r-- 1 root root 671049 Dec 29 15:12 fd50456a2bffe9ac2d85be1690410467.jpg
-rw-r–r-- 1 root root 7530191 Dec 24 17:18 ‘Julian & Cecilia Wedding.jpg’
-rw-r–r-- 1 root root 0 Jan 20 13:58 test-celery.txt
-rw-r–r-- 1 root root 0 Jan 20 14:00 test-grampsweb.txt

exit
root@gramps:/opt/grampsweb# docker compose exec grampsweb_celery bash
root@d757cccc9da9:/app# touch /app/media/test-celery.txt
root@d757cccc9da9:/app# ls -l /app/media
total 37204
-rw-r–r-- 1 root root 1054442 Jan 5 19:38 1157d7a2d317aede5928f6a4f372c32a.jpg
-rw-r–r-- 1 root root 716000 Dec 29 15:12 1bd0853ebfc9071fa1e1b60fffa9287c.jpg
-rw-r–r-- 1 root root 656656 Dec 29 15:09 1ce52c938a389f4365093a0e0bdcea31.jpg
-rw-r–r-- 1 root root 678070 Dec 29 15:10 1f2261d0847747d42737ecc13ab18cfd.jpg
-rw-r–r-- 1 root root 210382 Dec 24 22:31 21dd29588ddd9e39080db07205892914.jpg
-rw-r–r-- 1 root root 539608 Dec 29 17:46 25bca189cf13aa5a6cce9a7b147d55a1.jpg
-rw-r–r-- 1 root root 246880 Dec 29 15:08 3ba1b10b3d7019aef2eb455ecd3f7b6d.jpg
-rw-r–r-- 1 root root 99429 Dec 29 15:58 3be9c7a0622585c73da7e70659e3ef96.pdf
-rw-r–r-- 1 root root 2209846 Dec 26 18:46 4dfa2f83181ac86f1654f45270171afd.jpg
-rw-r–r-- 1 root root 1162443 Dec 29 17:37 61bcec57c41ad31b7f06687e7f52027a.png
-rw-r–r-- 1 root root 257823 Dec 29 14:52 6b133fa45d43d09a23df78ed6ca9fde1.jpg
-rw-r–r-- 1 root root 202030 Dec 29 16:00 82561e96932f3a9f6835066f2a346ecc.pdf
-rw-r–r-- 1 root root 15337418 Dec 29 15:53 84bcaca166f9a575df81968fb23a6a94.pdf
-rw-r–r-- 1 root root 795968 Jan 5 19:31 8c7ce353bb320a9c57dea0592ac41091.jpg
-rw-r–r-- 1 root root 595376 Dec 29 16:32 8f03231f9d76140b77c85aa9cf65d36c.pdf
-rw-r–r-- 1 root root 537837 Dec 29 15:11 9608f5a2c799308f5f97531cedc3dea1.jpg
-rw-r–r-- 1 root root 241407 Dec 29 17:17 991187b3f19b3ba1037af10f905e25f8.jpg
-rw-r–r-- 1 root root 1495270 Dec 29 16:25 a0c131a7dcb7bd33ec850dad7facaacc.jpg
-rw-r–r-- 1 root root 979658 Jan 5 19:12 b41e0f74d66fcb3e5a3f9ac62d93f5d5.jpg
-rw-r–r-- 1 root root 803888 Dec 29 15:09 c0aca41d8cd99d23097fe4af7bff6a46.jpg
-rw-r–r-- 1 root root 432272 Dec 29 16:39 c877c8bb1682ea06df319e7b5a5e5198.pdf
-rw-r–r-- 1 root root 222984 Dec 29 17:11 f4c1e821b2cd1a047dfc5adc470645e4.jpg
-rw-r–r-- 1 root root 367755 Dec 29 16:09 fc21b510e9423787552138172b2d52c5.pdf
-rw-r–r-- 1 root root 671049 Dec 29 15:12 fd50456a2bffe9ac2d85be1690410467.jpg
-rw-r–r-- 1 root root 7530191 Dec 24 17:18 ‘Julian & Cecilia Wedding.jpg’
-rw-r–r-- 1 root root 0 Jan 20 13:58 test-celery.txt
-rw-r–r-- 1 root root 0 Jan 20 13:53 test-grampsweb.txt

However, I think that these files may be things I have manually added. I know ‘Julian & Cecilia Wedding.jpg’ is.

What does this tell you?

Thanks.

It shows that the docker volume configuration is fine and the directory is writeable. Good! C

All those files in there with MD5 file name are files created by Gramps Web. Can you confirm you have a couple of images/PDFs that show correctly in the web interface?

Yes There are some that show up, but only the ones that I have added manually.

Here’s an interesting thing, though.

Items I have added do not show up in the thumbnail view under Object Lists:

Notice the bottom left item, “Julian & Cecilia Wedding”

Once I click into the record, it shows up:

I believe this particular image record existed in my original import into GrampsWeb from Gramps, but it had no checksum, so I was able to “replace” with the file, but the behavior occurs with items I have added after the initial import.

@DavidMStraub What’s the next troubleshooting step here?

This is all very confusing, and honestly I have no idea what you mean with

I believe this particular image record existed in my original import into GrampsWeb from Gramps, but it had no checksum, so I was able to “replace” with the file, but the behavior occurs with items I have added after the initial import.

Your logs show you delete stuff, import stuff again, then upload media, but I still haven’t understood what the actual problem is. Uploading the ZIP, replacing actual files?

I suggest to go slowly, one by one.

Take a given state of your Gramps database. Please don’t reimport, delete, or do other bulk edits of your database while we are debugging, because it’s confusing. Please report:

  • Complete version info
  • Current state of “Media file status” in settings
  • Go to export and export all media files in Gramps Web. Please report how many files the resulting ZIP file contains.

If there are any errors in this process, please check

  • the grampsweb container logs
  • the celery logs
  • the browser network tab

and then please only share the log entries that are related to the error (that is, occurred at the same time as the error happened).

@DavidMStraub

The problem is uploading a ZIP. it doesn’t process the files.

A secondary problem is that when I try to manually replacing the files through the web interface, ityields an error that says the replacement file has the same checksum as the media object and cannot be replaced.

Sorry about the length of the logs. I was having a hard time parsing them. I have tried several times to re-import the files while attempting to troubleshoot myself.

Is there a way I can wipe the logs and start over? I feel that would make them easier to parse.