Gramps Web Sync not syncing media even when it reports success?

I’m trying out Gramps Web on my home network in a container on my NAS, and I’m new to it so I’m not sure if what I’m seeing is a bug or if I’m just doing something wrong. I’m using the docker compose file copied directly from the setup instructions. (I did change the port away from 80, but I did try it with it set to 80 and got the same problem.) The XML import works, but when I try to upload media, either by uploading a zip file or by using the Web Sync plugin, Gramps reports a successful upload but the files don’t actually get copied to the application. I don’t see the files in the /app/media directories inside either container. I did confirm that if I create a file in there, it’s present in the other container.

What it looks like from the web UI is that the entry for the media object exists but there’s no picture, and if I try to download it I get a 404. I’ve wiped out and recreated the whole container setup a few times with the same issue.

Here’s the successful imports reported at the end of the grampsweb_celery log

[2026-04-21 19:19:04,933: INFO/MainProcess] Task gramps_webapi.api.tasks.import_file[d4e38c38-d6b8-4e85-aa0f-091f5269096f] received[2026-04-21 19:19:06,447: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_file[d4e38c38-d6b8-4e85-aa0f-091f5269096f] succeeded in 1.5129918083548546s: None[2026-04-21 19:20:57,615: INFO/MainProcess] Task gramps_webapi.api.tasks.import_media_archive[5e6a2da8-baec-4262-856a-292794d4def3] received[2026-04-21 19:20:57,668: INFO/ForkPoolWorker-1] Task gramps_webapi.api.tasks.import_media_archive[5e6a2da8-baec-4262-856a-292794d4def3] succeeded in 0.051277391612529755s: {‘missing’: 3, ‘uploaded’: 3, ‘failures’: 0}

I see this error in the gramps-grampsweb-1 log a few times

gtk_icon_theme_get_for_screen: assertion ‘GDK_IS_SCREEN (screen)’ failed

I figured that was noise from running it in a server without a GUI but maybe it’s more critical than I thought?

Let me know what other outputs might be helpful.

Version info:

Gramps 6.0.8
Gramps Web API 3.11.1
Gramps Web Frontend 26.4.1
Gramps QL 0.4.0
Sifts 1.3.0
locale: en
multi-tree: false
task queue: true
OCR: true
chat: false

Gramps Version 6.0.8

Python: 3.12.3
sqlite: 3.45.1
orjson: 3.11.8
LANG: en_US.UTF-8
OS: Linux1.4
Distribution: 6.17.0-20-generic

Gramps Web Sync v. 1.3.9

Hi, welcome to Gramps Web!

If the problem occurs both with the sync addon and with the ZIP upload, it’s a strong indication that something is wrong with your server setup. I suspect it’s something with the volumes. Can you please share your docker-compose.yml?

Please also make sure your media files meet the criteria mentioned in the docs:

  • Relative paths only
  • Checksums are present

I think I figured out the issue - I had checked the box for Relative paths when adding the media in Gramps Desktop, but I didn’t have a parent media folder set for this particular family tree. That works fine within the desktop app but I guess it breaks uploads. After I set a parent media folder and redid the relative paths so they were relative to it, syncing the media worked.

A note for anyone else with the same issue - I tried using the Media Manger utility to convert the paths to absolute and then back to relative so they would be relative to the new media folder, but for whatever reason that came up with a bogus path. I had to go through and manually select the files with “relative path” checked. I only have 3 media files added right now (it’s a new tree I’m building up) so it didn’t take long.

Here’s the docker compose just for reference - I copied it from the example and I’m pretty sure the only thing I changed was the port

services:
grampsweb: &grampsweb
image: ghcr.io/gramps-project/grampsweb:latest
restart: always
ports:
- “8150:5000”  # host:docker
environment:
GUNICORN_NUM_WORKERS: 2
GRAMPSWEB_TREE: “Gramps Web”  # will create a new tree if not exists
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
- gramps_media:/app/media  # persist media files
- gramps_tmp:/tmp

grampsweb_celery:
<<: *grampsweb  # YAML merge key copying the entire grampsweb service config
ports: 

container_name: grampsweb_celery
depends_on:
- grampsweb
- grampsweb_redis
command: celery -A gramps_webapi.celery worker --loglevel=INFO --concurrency=2

grampsweb_redis:
image: docker.io/valkey/valkey:8-alpine
container_name: grampsweb_redis
restart: always

volumes:
gramps_users:
gramps_index:
gramps_thumb_cache:
gramps_cache:
gramps_secret:
gramps_db:
gramps_media:
gramps_tmp: