"Sync failed. Cannot process backup" persists after SQLite reset, resolved only by app reinstall
I have searched the existing issues, both open and closed, to make sure this is not a duplicate report.
- Yes
The bug
Mobile app repeatedly fails with "Sync failed. Cannot process backup." Server-side Postgres logs show duplicate key value violates unique constraint "UQ_assets_owner_checksum" errors during asset insert, even though the assets in question already exist and are visible in the web UI.
Restarting the server container temporarily resolves it, but the error returns. The in-app "Reset SQLite Database" option does not fix it — the app continues attempting to re-upload already-existing assets and fails the same way. Only a full app deletion and reinstall resolves it permanently.
This happened independently on two different iOS devices syncing to the same account, ruling out a device-specific issue. Suspect the app's local sync state is not correctly reconciled against the server's actual asset list, and that some state survives the in-app SQLite reset that only a full reinstall clears.
The OS that Immich Server is running on
Ubuntu Server 24.04 (Raspberry Pi version)
Version of Immich Server
v3.1.0
Version of Immich Mobile App
v3.1.0
Platform with the issue
- Server
- Web
- Mobile
Device make and model
iPhone 13 mini with ios 26.6 (~75% of uploads) and iPhone 15 with ios 26.5.2 (~25% of uploads) — both syncing to the same account (single admin user). Issue occurred on both devices independently.
Your docker-compose.yml content
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
# extends:
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
volumes:
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
ports:
- '2283:2283'
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- model-cache:/cache
env_file:
- .env
restart: always
healthcheck:
disable: false
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:41eacbe83eca995561fe43814fd4891e16e39632806253848efaf04d3c8a8b84
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
# Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
# DB_STORAGE_TYPE: 'HDD'
volumes:
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
shm_size: 128mb
restart: always
volumes:
model-cache:Your .env content
# You can find documentation for all the supported env variables at https://docs.immich.app/install/environment-variables
# The location where your uploaded files are stored
UPLOAD_LOCATION=/mnt/ssd/immich-app/
# The location where your database files are stored. Network shares are not supported for the database
DB_DATA_LOCATION=./postgres
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
# TZ=Etc/UTC
# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release
# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=<password>
# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
IMMICH_VERSION=v3Reproduction steps
- Run Immich server v3.1.0 (Docker) on Raspberry Pi 5 / Ubuntu Server 24.04
- Have two iOS devices logged into the same account, both with background backup enabled
- Let normal daily photo backup run over time
- At some point, the mobile app starts showing "Sync failed. Cannot process backup."
- Check server-side Postgres logs — repeated
duplicate key value violates unique constraint "UQ_assets_owner_checksum"errors appear during asset insert - Restarting the immich-server container temporarily resolves it, but the error returns after a short time
- App begins showing recently-taken photos (last ~2 days) as "not backed up" even though they are already visible in the web UI
- Using the in-app "Reset SQLite Database" option clears the local sync cache, but the app still repeatedly attempts to re-upload existing assets and fails the same way
- Confirmed server and network were reachable throughout (web UI accessible from the same device, other uploads succeeding in parallel)
- Only a full app deletion + reinstall (not just in-app SQLite reset) resolved the issue permanently — after reinstalling and logging back in, sync completed normally with no further errors
Relevant log output
Postgres (immich_postgres):
ERROR: duplicate key value violates unique constraint "UQ_assets_owner_checksum"
DETAIL: Key ("ownerId", checksum)=(<ownerId>, \\\x<checksum>) already exists.
STATEMENT: insert into "asset" ("ownerId", "libraryId", "checksum", "checksumAlgorithm", "originalPath", "fileCreatedAt", "fileModifiedAt", "localDateTime", "type", "isFavorite", "duration", "visibility", "originalFileName") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) returning *
immich_server API/microservices logs showed no corresponding errors for these failed requests, and a targeted grep for error/exception/fail/500/400 after a server restart returned nothing, despite the mobile app continuing to report "Sync failed."Additional information
Postgres (immich_postgres): ERROR: duplicate key value violates unique constraint "UQ_assets_owner_checksum" DETAIL: Key ("ownerId", checksum)=(, \\x) already exists. STATEMENT: insert into "asset" ("ownerId", "libraryId", "checksum", "checksumAlgorithm", "originalPath", "fileCreatedAt", "fileModifiedAt", "localDateTime", "type", "isFavorite", "duration", "visibility", "originalFileName") values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) returning *
immich_server API/microservices logs showed no corresponding errors for these failed requests, and a targeted grep for error/exception/fail/500/400 after a server restart returned nothing, despite the mobile app continuing to report "Sync failed."
Source: immich-app/immich