Immich / Troubleshooting

Immich Mobile Backup Stalls or Uploads Keep Failing

Verify whether expected originals are actually missing server-side on Immich 3.1.0, then separate album selection, background constraints, proxy path, storage, and dependency failures before touching any data or database.

The version-pinned 3.1.0 Compose file defines the deployment under diagnosis: immich-server, immich-machine-learning, database, a service named redis whose image is Valkey 9, and model-cache. There is no separate microservices container in this topology, and the service name must never be mistaken for the image it runs.[4]

The tagged upload path checks access and quota, creates database state, queues metadata extraction, handles duplicates, and then returns its created response; machine learning is a separate service for model work, not the original-upload transport. Queue availability therefore cannot be dismissed as irrelevant to an upload request, while an ML outage alone never explains an upload refusal.[5][4]

Applicability

Products
Immich
Scope
For Immich 3.1.0 stable server with a matching mobile release in a supported Compose deployment, where expected original photo or video assets are not reaching the server or the mobile app reports a backup or sync failure. Record the exact server and mobile versions; 3.2 release candidates are excluded. This page does not cover external-library scans, restore or recovery, uploads already accepted whose later thumbnails or search fail, or generic database repair.[1][2]
Last verified

Symptoms

  • Expected original assets are absent from the server, or the mobile app reports a backup or sync failure. Assets skipped because their checksum already exists server-side, and uploads accepted but missing later derivatives, are different observations.[2]

Quick diagnosis

Prove the original is actually missing before blaming selection, background work, proxy, storage, or dependencies.

Read-only

Verify the asset is actually missing server-side

Check the expected server view for the asset, then the mobile album selection, exclusions, and whether an identical checksum already exists server-side. Already-backed-up assets being skipped is normal deduplication, not a failure, and must be excluded before any failure reasoning.[2]

Safe / low risk

Compare foreground upload against background behavior

Observe whether backup progresses with the app open but stalls in background. Background execution belongs to the mobile OS with its Wi-Fi, charging, delay, and permission constraints; for iCloud-backed assets, phone download and cache capacity must be inspected before server storage is blamed.[2]

Read-only

Do not reset, wipe, flush, or delete anything to diagnose

Do not reset SQLite, wipe app data, delete database rows, flush Valkey, delete originals, recreate the database, disable integrity checks, or reinstall as a generic fix. None of these is established as a general remedy for upload failures, and several destroy the very originals under diagnosis.[2]

Interactive troubleshooter

Your answers stay in this browser tab. The tool does not connect to your systems or send diagnostic results.

Guided check / step 1

Safe diagnostic guidance

Are expected originals missing server-side, or does the app report backup failure?

Confirm genuinely absent expected originals or an explicit mobile backup or sync failure. Skipped duplicates and accepted uploads with missing derivatives are different observations.[2]

Read the complete diagnostic tree without using the controls
  1. Are expected originals missing server-side, or does the app report backup failure?

    Confirm genuinely absent expected originals or an explicit mobile backup or sync failure. Skipped duplicates and accepted uploads with missing derivatives are different observations.[2]

    • Yes, missing originals or backup failureIs the asset actually absent, not skipped or excluded?
    • No, a different observationInvestigate the actual Immich observation
  2. Is the asset actually absent, not skipped or excluded?

    Check album selection, exclusions, and whether the checksum already exists server-side. A skipped duplicate ends the failure reasoning for that asset.[2]

    • Yes, genuinely absentDoes the upload also fail with the app open?
    • No, skipped by selection or dedupCorrect selection or accept the dedup skip
    • Cannot confirm absenceCollect an upload failure evidence packet
  3. Does the upload also fail with the app open?

    Compare an observed foreground attempt against background behavior. Foreground success with background stalls isolates mobile OS constraints; foreground failure continues toward path comparison.[2]

    • Yes, foreground fails tooDoes the same asset work over trusted LAN but fail through the proxy?
    • No, only background stallsSatisfy the background backup conditions
    • Cannot confirm the comparisonCollect an upload failure evidence packet
  4. Does the same asset work over trusted LAN but fail through the proxy?

    Test the same account and asset over an existing trusted LAN path and through the proxy with synchronized evidence. A proxy-only failure selects the proxy branch; failure on both continues to server evidence. Never open a new insecure port for this comparison.[3]

    • Yes, LAN works but proxy failsCorrect the responsible proxy hop
    • No, both paths failDoes the evidence show storage failure or a dependency failure?
    • Cannot confirm the comparisonCollect an upload failure evidence packet
  5. Does the evidence show storage failure or a dependency failure?

    Read mounts, access, capacity, and integrity output against the exact failed quota, database, or queue operation. Storage evidence selects the storage handoff; a named operation failure selects the dependency handoff; accepted uploads with missing derivatives exit to the post-upload diagnosis.[6][5]

    • Storage failure evidenceHand storage evidence to the operator
    • Quota, database, or queue failureHand the exact failed operation to the operator
    • Accepted upload, derivatives missingExit accepted uploads to the post-upload diagnosis
    • Cannot classify the evidenceCollect an upload failure evidence packet
  6. Correct selection or accept the dedup skip

    Select the album or remove the mistaken exclusion, or accept the checksum-matched skip as normal. Verify the asset server-side afterwards.[2]

  7. Satisfy the background backup conditions

    Grant the documented OS permissions and meet the charging, Wi-Fi, and capacity conditions, then verify with an observed background cycle rather than a timer assumption.[2]

  8. Correct the responsible proxy hop

    Correct the responsible hop's limits, timeouts, TLS, headers, or routing within documented bounds, treating example values as comparison references only. Retest the same asset through the proxy afterwards.[3]

  9. Hand storage evidence to the operator

    Hand measured mounts, access, capacity, and integrity evidence to the operator for repair under backup protection. Never create markers on unmounted volumes.[6]

  10. Hand the exact failed operation to the operator

    Hand the exact failed quota, database, or queue operation with dependency health to the operator. Never flush Valkey and never equate the failure with corruption.[5]

  11. Exit accepted uploads to the post-upload diagnosis

    An accepted original with missing derivatives belongs to a separate post-upload processing diagnosis. Preserve state and logs; do not reinstall.[5]

  12. Investigate the actual Immich observation

    External-library scans, restore and recovery, and uploads accepted but missing later derivatives each need their own diagnosis.[2]

  13. Collect an upload failure evidence packet

    Preserve versions, asset and album state, foreground and background behavior, the LAN-versus-proxy comparison with synchronized logs, and storage and dependency evidence. Send the sanitized evidence to the operator.[1][2]

Detailed diagnosis

Read-only

1. Establish that an expected original is actually absent

Confirm absence from the expected server view after accounting for album selection, exclusions, and checksum-matched skips. A skipped duplicate ends the failure reasoning for that asset; only a genuinely absent expected original continues.[2]

Read-only

2. Separate background-only stalls from foreground failures

Determine whether backup progresses with the app open. Background-only stalls implicate mobile OS constraints, permissions, charging and Wi-Fi allowances, and for iCloud-backed assets the phone download and cache capacity. No fixed completion timer is defensible for background work.[2]

Safe / low risk

3. Compare a trusted LAN path against the proxy path

Test the same account and asset over an existing trusted LAN path and through the proxy, recording one small and one failing larger asset with exact responses and synchronized client, proxy, and server evidence. A proxy-only failure selects the proxy branch with its upload limits, timeouts, TLS, headers, and root-path routing; failure on both paths continues toward server evidence. Never expose a new insecure port or disable certificate checks for the comparison.[3]

Read-only

4. For server-side failure evidence, inspect mounts, access, and integrity

When the server is unhealthy or logs identify filesystem failure, inspect actual mounts, runtime access, capacity, and existing integrity results. Missing marker files never authorize creating markers on an unmounted or incorrect volume or disabling mount checks.[6][4]

Read-only

5. For quota, database, or queue failures, identify the exact operation

When the server responds but upload logs show quota, database, or queue failure, identify the exact failed operation and the health of the dependency it names. Never equate an upload failure with a corrupt database, and never flush Valkey to make a queue look healthy.[5][4]

Read-only

6. Exit accepted uploads with missing derivatives to a separate diagnosis

When the API accepted the asset and the original is accessible but thumbnails, search, or other derivatives are absent, stop: that is post-upload processing, not the mobile-upload path, and it needs its own diagnosis. Conflicting mobile backup state for existing originals likewise needs version-specific sync investigation with state preserved, never automatic reinstall.[5]

Supported scenarios

These observations narrow the next investigation; they do not establish a unique cause.

The asset was never selected for backup or was already backed up

Album selection, exclusions, or checksum deduplication explains the absence without any failure: the mobile app skips what is not selected and what already exists server-side.[2]

How to check: Confirm the album selection and exclusions for the asset and confirm whether its checksum already exists server-side before any failure reasoning.[2]

The mobile OS constrains background backup work

Backup progresses in the foreground but stalls in the background because the OS restricts background execution, network use, or permissions, or because iCloud-backed originals cannot download within phone capacity. Foreground success with background stalls isolates this class.[2]

How to check: Confirm foreground progress with background stalls, then inspect OS background permissions, charging and Wi-Fi allowances, and phone download and cache capacity.[2]

The proxy path rejects or breaks the upload

The same account and asset succeed over a trusted LAN path but fail through the proxy, implicating the responsible hop's upload limits, timeouts, TLS handling, forwarded headers, or root-path and well-known routing.[3]

How to check: Confirm the LAN-versus-proxy difference with the same asset and synchronized evidence, then inspect the responsible hop's limits, timeouts, TLS, headers, and routing.[3]

Server storage is unmounted, inaccessible, full, or failing integrity

The server cannot persist the upload because a mount is missing or wrong, the runtime lacks access, capacity is exhausted, or integrity results already report failure. Marker output alone never proves a disk is full.[6][4]

How to check: Confirm the storage evidence in mounts, runtime access, measured capacity, and existing integrity results before any storage change.[6]

A quota, database, or queue operation in the upload path fails

The upload request reaches the server but a named step fails: access or quota rejection, a database operation error, or a queue failure. The tagged upload flow names these steps explicitly, which is what makes the failure attributable instead of generic.[5]

How to check: Confirm the exact failed operation and the health of the dependency it names in the upload logs.[5]

Next actions and procedure boundaries

Safe / low risk

Correct album selection or accept deduplication

Select the asset's album for backup and remove the mistaken exclusion, or accept the checksum-matched skip as normal behavior. Verify the asset appears server-side afterwards; never re-upload duplicates to force the issue.[2]

Safe / low risk

Satisfy the documented background backup conditions

Grant the documented OS permissions and meet the charging, Wi-Fi, and delay conditions for background backup, and ensure iCloud-backed originals can download within phone capacity. Verify with an observed background cycle rather than a timer assumption.[2]

Potentially disruptive

Correct the responsible proxy hop within documented bounds

Correct the responsible hop's upload limits, timeouts, TLS handling, forwarded headers, or root-path and well-known routing to match the documented proxy requirements for the deployment. Treat documented example values as references to compare against, never as values to adopt blindly, and retest the same asset over the proxy path afterwards.[3]

Before changing anything

Risk
Proxy changes affect every client behind that hop, not only the failing upload. A wrong limit, timeout, or TLS change can break all remote access instead of fixing one upload.[3]
Safer check
Confirm the LAN-versus-proxy difference with the same asset and synchronized evidence, identify the responsible hop, and record its current limits, timeouts, TLS, header, and routing settings before editing.[3]
Expected result
After the correction, the same asset uploads through the proxy path while LAN uploads keep working; other proxied services are unaffected.[3]
Backup / recovery access
Preserve the recorded prior proxy settings so the previous hop behavior can be restored exactly.[3]
Rollback
Restore the recorded prior proxy settings if uploads do not recover, then re-collect the LAN-versus-proxy evidence before further changes.[3]
Read-only

Storage evidence: hand mounts, access, and integrity to the operator

Hand the measured storage evidence to the operator: actual mounts, runtime access results, capacity figures, and existing integrity output. Mount repair, permission changes, and capacity work stay with the operator under backup protection; markers are never created on unmounted or incorrect volumes.[6][4]

Read-only

Dependency evidence: hand the exact failed operation to the operator

Hand the exact failed quota, database, or queue operation with the dependency health evidence to the operator. Database, queue, and integrity repair stay outside this page; flushing Valkey or equating the failure with corruption is never the response.[5]

Read-only

If no branch is proven: preserve the evidence

Record the exact server and mobile versions, the asset and album state, the foreground and background behavior, the LAN-versus-proxy comparison with synchronized logs, and the storage and dependency evidence. Send the sanitized evidence to the operator; an unproven failure never justifies reset or reinstall.[1][2]

Warnings and boundaries

Never reset SQLite, wipe app data, delete database rows, flush Valkey, delete originals, recreate the database, disable integrity checks, or reinstall as a generic upload fix. A phone-only original must remain intact, and a visible thumbnail never proves recoverability.[2]
A successful upload is not backup validation: protect originals under an independently recoverable backup strategy instead of treating one completed upload as durability proof.[2]

Sources

Links were reviewed on 2026-09-08. Reachability and automated validation do not replace editorial verification of each claim.

  1. Immich 3.1.0 stable release record
    Immich project · Tier B · accessed 2026-09-08
  2. Mobile backup behavior
    Immich project · Tier A · accessed 2026-09-08
  3. Reverse proxy upload limits and routing
    Immich project · Tier A · accessed 2026-09-08
  4. Immich 3.1.0 Compose services (tagged)
    Immich project · Tier B · accessed 2026-09-08
  5. Immich 3.1.0 asset upload path (tagged)
    Immich project · Tier B · accessed 2026-09-08
  6. System integrity checks
    Immich project · Tier A · accessed 2026-09-08