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.
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]
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]
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 guidanceAre 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
- 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 failure → Is the asset actually absent, not skipped or excluded?
- No, a different observation → Investigate the actual Immich observation
- 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 absent → Does the upload also fail with the app open?
- No, skipped by selection or dedup → Correct selection or accept the dedup skip
- Cannot confirm absence → Collect an upload failure evidence packet
- 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 too → Does the same asset work over trusted LAN but fail through the proxy?
- No, only background stalls → Satisfy the background backup conditions
- Cannot confirm the comparison → Collect an upload failure evidence packet
- 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 fails → Correct the responsible proxy hop
- No, both paths fail → Does the evidence show storage failure or a dependency failure?
- Cannot confirm the comparison → Collect an upload failure evidence packet
- 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 evidence → Hand storage evidence to the operator
- Quota, database, or queue failure → Hand the exact failed operation to the operator
- Accepted upload, derivatives missing → Exit accepted uploads to the post-upload diagnosis
- Cannot classify the evidence → Collect an upload failure evidence packet
- 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]
- 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]
- 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]
- 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]
- 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]
- 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]
- Investigate the actual Immich observation
External-library scans, restore and recovery, and uploads accepted but missing later derivatives each need their own diagnosis.[2]
- 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
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]
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]
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]
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]
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]
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
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]
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]
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]
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]
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]
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
Sources
Links were reviewed on 2026-09-08. Reachability and automated validation do not replace editorial verification of each claim.
- Immich 3.1.0 stable release record
Immich project · Tier B · accessed 2026-09-08 - Mobile backup behavior
Immich project · Tier A · accessed 2026-09-08 - Reverse proxy upload limits and routing
Immich project · Tier A · accessed 2026-09-08 - Immich 3.1.0 Compose services (tagged)
Immich project · Tier B · accessed 2026-09-08 - Immich 3.1.0 asset upload path (tagged)
Immich project · Tier B · accessed 2026-09-08 - System integrity checks
Immich project · Tier A · accessed 2026-09-08