I
Immich3w ago
caezar

TypeError: fetch failed on upload

I am trying to use the docker image immich-cli (v2.2.61) to upload files. It looks like I am able to connect to my server (v1.31.3) running on a local pi cluster. but I get an upload failure...
Crawling for assets...
Hashing files | ████████████████████████████████████████ | 100% | ETA: 0s | 1/1 assets
Checking for duplicates | ████████████████████████████████████████ | 100% | ETA: 0s | 1/1 assets
Found 1 new files and 0 duplicates
Uploading assets | ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ | 0% | ETA: 0s | 0/115.8 kB
Successfully uploaded 0 new assets (0 B)
Failed to upload 1 asset:
- /import/klingons.jpg - TypeError: fetch failed
Crawling for assets...
Hashing files | ████████████████████████████████████████ | 100% | ETA: 0s | 1/1 assets
Checking for duplicates | ████████████████████████████████████████ | 100% | ETA: 0s | 1/1 assets
Found 1 new files and 0 duplicates
Uploading assets | ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ | 0% | ETA: 0s | 0/115.8 kB
Successfully uploaded 0 new assets (0 B)
Failed to upload 1 asset:
- /import/klingons.jpg - TypeError: fetch failed
The logs say the following:
[Nest] 17 - 04/11/2025, 3:35:09 PM DEBUG [Api:LoggingInterceptor] GET /.well-known/immich 200 0.26ms 10.42.0.0
[Nest] 17 - 04/11/2025, 3:35:09 PM DEBUG [Api:LoggingInterceptor~0ii0lsmj] GET /api/users/me 200 2.97ms 10.42.0.0
[Nest] 17 - 04/11/2025, 3:35:09 PM DEBUG [Api:LoggingInterceptor~xc3ezc5m] GET /api/server/media-types 200 0.22ms 10.42.0.0
[Nest] 17 - 04/11/2025, 3:35:09 PM DEBUG [Api:LoggingInterceptor~tpeutmqs] POST /api/assets/bulk-upload-check 200 2.04ms 10.42.0.0
[Nest] 17 - 04/11/2025, 3:35:09 PM VERBOSE [Api:LoggingInterceptor~tpeutmqs] {"assets":[{"id":"/import/klingons.jpg","checksum":"b94fefb2e95501ddcb7fc182f99048e1117a5eeb"}]}
[Nest] 17 - 04/11/2025, 3:35:09 PM DEBUG [Api:LoggingInterceptor] GET /.well-known/immich 200 0.26ms 10.42.0.0
[Nest] 17 - 04/11/2025, 3:35:09 PM DEBUG [Api:LoggingInterceptor~0ii0lsmj] GET /api/users/me 200 2.97ms 10.42.0.0
[Nest] 17 - 04/11/2025, 3:35:09 PM DEBUG [Api:LoggingInterceptor~xc3ezc5m] GET /api/server/media-types 200 0.22ms 10.42.0.0
[Nest] 17 - 04/11/2025, 3:35:09 PM DEBUG [Api:LoggingInterceptor~tpeutmqs] POST /api/assets/bulk-upload-check 200 2.04ms 10.42.0.0
[Nest] 17 - 04/11/2025, 3:35:09 PM VERBOSE [Api:LoggingInterceptor~tpeutmqs] {"assets":[{"id":"/import/klingons.jpg","checksum":"b94fefb2e95501ddcb7fc182f99048e1117a5eeb"}]}
It doesn't matter the machine I use to run the container or the image folder. Edited (added version numbers above).
13 Replies
Immich
Immich3w ago
:wave: Hey @caezar, Thanks for reaching out to us. Please carefully read this message and follow the recommended actions. This will help us be more effective in our support effort and leave more time for building Immich :immich:. References - Container Logs: docker compose logs docs - Container Status: docker ps -a docs - Reverse Proxy: https://immich.app/docs/administration/reverse-proxy - Code Formatting https://support.discord.com/hc/en-us/articles/210298617-Markdown-Text-101-Chat-Formatting-Bold-Italic-Underline#h_01GY0DAKGXDEHE263BCAYEGFJA Checklist I have... 1. :ballot_box_with_check: verified I'm on the latest release(note that mobile app releases may take some time). 2. :ballot_box_with_check: read applicable release notes. 3. :ballot_box_with_check: reviewed the FAQs for known issues. 4. :ballot_box_with_check: reviewed Github for known issues. 5. :ballot_box_with_check: tried accessing Immich via local ip (without a custom reverse proxy). 6. :ballot_box_with_check: uploaded the relevant information (see below). 7. :ballot_box_with_check: tried an incognito window, disabled extensions, cleared mobile app cache, logged out and back in, different browsers, etc. as applicable (an item can be marked as "complete" by reacting with the appropriate number) Information In order to be able to effectively help you, we need you to provide clear information to show what the problem is. The exact details needed vary per case, but here is a list of things to consider: - Your docker-compose.yml and .env files. - Logs from all the containers and their status (see above). - All the troubleshooting steps you've tried so far. - Any recent changes you've made to Immich or your system. - Details about your system (both software/OS and hardware). - Details about your storage (filesystems, type of disks, output of commands like fdisk -l and df -h). - The version of the Immich server, mobile app, and other relevant pieces. - Any other information that you think might be relevant. Please paste files and logs with proper code formatting, and especially avoid blurry screenshots. Without the right information we can't work out what the problem is. Help us help you ;) If this ticket can be closed you can use the /close command, and re-open it later if needed.
caezar
caezarOP3w ago
env:
REDIS_HOSTNAME: '{{ printf "%s-redis-master" .Release.Name }}'
DB_HOSTNAME: "{{ .Values.postgresql.global.postgresql.auth.hostname }}"
DB_USERNAME: "{{ .Values.postgresql.global.postgresql.auth.username }}"
DB_DATABASE_NAME: "{{ .Values.postgresql.global.postgresql.auth.database }}"
# -- You should provide your own secret outside of this helm-chart and use `postgresql.global.postgresql.auth.existingSecret` to provide credentials to the postgresql instance
DB_PASSWORD: "{{ .Values.postgresql.global.postgresql.auth.password }}"
IMMICH_MACHINE_LEARNING_URL: '{{ printf "http://%s-machine-learning:3003" .Release.Name }}'

image:
tag: v1.131.3

immich:
persistence:
library:
existingClaim: library-pvc

server:
ingress:
main:
hosts:
- host: redacted
paths:
- path: "/"

redis:
enabled: true
architecture: standalone
auth:
enabled: false

postgresql:
primary:
containerSecurityContext:
readOnlyRootFilesystem: false
initdb:
scripts:
create-extensions.sql: |
CREATE EXTENSION cube;
CREATE EXTENSION earthdistance;
CREATE EXTENSION vectors;
global:
postgresql:
auth:
hostname: postgres-immich-service
username: redacted
database: immich
password: redacted
env:
REDIS_HOSTNAME: '{{ printf "%s-redis-master" .Release.Name }}'
DB_HOSTNAME: "{{ .Values.postgresql.global.postgresql.auth.hostname }}"
DB_USERNAME: "{{ .Values.postgresql.global.postgresql.auth.username }}"
DB_DATABASE_NAME: "{{ .Values.postgresql.global.postgresql.auth.database }}"
# -- You should provide your own secret outside of this helm-chart and use `postgresql.global.postgresql.auth.existingSecret` to provide credentials to the postgresql instance
DB_PASSWORD: "{{ .Values.postgresql.global.postgresql.auth.password }}"
IMMICH_MACHINE_LEARNING_URL: '{{ printf "http://%s-machine-learning:3003" .Release.Name }}'

image:
tag: v1.131.3

immich:
persistence:
library:
existingClaim: library-pvc

server:
ingress:
main:
hosts:
- host: redacted
paths:
- path: "/"

redis:
enabled: true
architecture: standalone
auth:
enabled: false

postgresql:
primary:
containerSecurityContext:
readOnlyRootFilesystem: false
initdb:
scripts:
create-extensions.sql: |
CREATE EXTENSION cube;
CREATE EXTENSION earthdistance;
CREATE EXTENSION vectors;
global:
postgresql:
auth:
hostname: postgres-immich-service
username: redacted
database: immich
password: redacted
I'm running in kubernetes following the official chart, with a modified ingress.
Immich
Immich3w ago
Successfully submitted, a tag has been added to inform contributors. :white_check_mark:
bo0tzz
bo0tzz3w ago
with a modified ingress.
Plese specify what you mean by this And also try whether this issue still happens if you bypass the ingress
caezar
caezarOP3w ago
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: immich-ingress
namespace: immich
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 50m
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: "nginx"
tls:
- hosts:
- redacted
secretName: immich-tls
rules:
- host: redacted
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: immich-server
port:
number: 2283
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: immich-ingress
namespace: immich
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 50m
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: "nginx"
tls:
- hosts:
- redacted
secretName: immich-tls
rules:
- host: redacted
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: immich-server
port:
number: 2283
How do I try bypassing the ingress?
bo0tzz
bo0tzz3w ago
nginx.ingress.kubernetes.io/proxy-body-size: 50m
This is probably too small
caezar
caezarOP3w ago
I'm not uploading videos But I can increase, although I can upload images fine through the UI.
Zeus
Zeus3w ago
You really should test with nothing in between as bo0tzz asked You can Google for that I believe, I’m not sure how to
caezar
caezarOP3w ago
I can port forward the immich service and try connecting to localhost. Do you think that is it?
Zeus
Zeus3w ago
Probably yeah
caezar
caezarOP3w ago
OK, I port forwarded to 8080 on my local machine and mapped it to 8080 on the docker container. Now I get an ECONNREFUSD, so I must be doing something wrong.
docker run -it -p 8000:8080 -v "$(pwd)":/import:ro -e IMMICH_INSTANCE_URL=http://localhost:8000/api -e IMMICH_API_KEY=<redacted> ghcr.io/immich-app/immich-cli:latest upload /import
node:internal/deps/undici/undici:13502
Error.captureStackTrace(err);
^

TypeError: fetch failed
at node:internal/deps/undici/undici:13502:13
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
at async p (file:///usr/src/app/dist/index.js:3135:12)
at async e (file:///usr/src/app/dist/index.js:3087:16)
at async Object.i [as fetchJson] (file:///usr/src/app/dist/index.js:3101:66)
at async Object.y [as ok] (file:///usr/src/app/dist/index.js:3188:13)
at async scan (file:///usr/src/app/dist/index.js:19616:28)
at async upload (file:///usr/src/app/dist/index.js:19600:21) {
[cause]: AggregateError [ECONNREFUSED]:
at internalConnectMultiple (node:net:1139:18)
at afterConnectMultiple (node:net:1712:7) {
code: 'ECONNREFUSED',
[errors]: [
Error: connect ECONNREFUSED ::1:8000
at createConnectionError (node:net:1675:14)
at afterConnectMultiple (node:net:1705:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '::1',
port: 8000
},
Error: connect ECONNREFUSED 127.0.0.1:8000
at createConnectionError (node:net:1675:14)
at afterConnectMultiple (node:net:1705:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 8000
}
]
}
}

Node.js v22.14.0
docker run -it -p 8000:8080 -v "$(pwd)":/import:ro -e IMMICH_INSTANCE_URL=http://localhost:8000/api -e IMMICH_API_KEY=<redacted> ghcr.io/immich-app/immich-cli:latest upload /import
node:internal/deps/undici/undici:13502
Error.captureStackTrace(err);
^

TypeError: fetch failed
at node:internal/deps/undici/undici:13502:13
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
at async p (file:///usr/src/app/dist/index.js:3135:12)
at async e (file:///usr/src/app/dist/index.js:3087:16)
at async Object.i [as fetchJson] (file:///usr/src/app/dist/index.js:3101:66)
at async Object.y [as ok] (file:///usr/src/app/dist/index.js:3188:13)
at async scan (file:///usr/src/app/dist/index.js:19616:28)
at async upload (file:///usr/src/app/dist/index.js:19600:21) {
[cause]: AggregateError [ECONNREFUSED]:
at internalConnectMultiple (node:net:1139:18)
at afterConnectMultiple (node:net:1712:7) {
code: 'ECONNREFUSED',
[errors]: [
Error: connect ECONNREFUSED ::1:8000
at createConnectionError (node:net:1675:14)
at afterConnectMultiple (node:net:1705:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '::1',
port: 8000
},
Error: connect ECONNREFUSED 127.0.0.1:8000
at createConnectionError (node:net:1675:14)
at afterConnectMultiple (node:net:1705:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 8000
}
]
}
}

Node.js v22.14.0
bo0tzz
bo0tzz3w ago
It's running in a container so localhost refers to the container not your PC (which is where the portforward is listening)
caezar
caezarOP3w ago
If I run the container in the kubernetes cluster and mount the drive on one of the nodes, I can get it to work.
apiVersion: v1
kind: Pod
metadata:
name: upload-cli-pod
namespace: immich
spec:
nodeName: <NODE_NAME>
containers:
- name: immich-cli
image: "ghcr.io/immich-app/immich-cli:latest"
args: ["upload", "/import" ]
volumeMounts:
- name: volume
mountPath: /import
env:
- name: IMMICH_INSTANCE_URL
value: "http://immich-server:2283"
- name: IMMICH_API_KEY
value: <API_KEY>
volumes:
- name: volume
hostPath:
path: <PATH_TO_IMAGES>
apiVersion: v1
kind: Pod
metadata:
name: upload-cli-pod
namespace: immich
spec:
nodeName: <NODE_NAME>
containers:
- name: immich-cli
image: "ghcr.io/immich-app/immich-cli:latest"
args: ["upload", "/import" ]
volumeMounts:
- name: volume
mountPath: /import
env:
- name: IMMICH_INSTANCE_URL
value: "http://immich-server:2283"
- name: IMMICH_API_KEY
value: <API_KEY>
volumes:
- name: volume
hostPath:
path: <PATH_TO_IMAGES>
Here it uploads.

Did you find this page helpful?