#30813·immich

"Sync failed. Cannot process backup" persists after SQLite reset, resolved only by app reinstall

Author: luk6iiCreated Aug 17, 2026Updated Sep 17, 2026

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

yaml
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

bash
# 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=v3

Reproduction steps

  1. Run Immich server v3.1.0 (Docker) on Raspberry Pi 5 / Ubuntu Server 24.04
  2. Have two iOS devices logged into the same account, both with background backup enabled
  3. Let normal daily photo backup run over time
  4. At some point, the mobile app starts showing "Sync failed. Cannot process backup."
  5. Check server-side Postgres logs — repeated duplicate key value violates unique constraint "UQ_assets_owner_checksum" errors appear during asset insert
  6. Restarting the immich-server container temporarily resolves it, but the error returns after a short time
  7. App begins showing recently-taken photos (last ~2 days) as "not backed up" even though they are already visible in the web UI
  8. 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
  9. Confirmed server and network were reachable throughout (web UI accessible from the same device, other uploads succeeding in parallel)
  10. 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

bash
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."