immich-app / immich

High performance self-hosted photo and video management solution.
https://immich.app
GNU Affero General Public License v3.0
44.58k stars 2.17k forks source link

Video cannot be uploaded #11314

Closed joselsegura closed 1 month ago

joselsegura commented 1 month ago

The bug

I tried to sync a video from Immich Android, and later uploading a copy of it from my computer in my Immich instance webpage and it failed with 409. It's a 2GB video and finally my only way to upload it was using an external program (immich-go in my case).

Now that the video is already uploaded correctly, the Android app is always trying to upload it again (and failing). I guessed that Immich app should recognise that it is the same video was already uploaded and avoid trying to upload it again.

I can remove the video from my Android phone to stop this behaviour and download it, if I needed it, from the app... but maybe it is something that can be improved.

The OS that Immich Server is running on

Docker container

Version of Immich Server

v1.108.0

Version of Immich Mobile App

v1.109.0 build.149

Platform with the issue

Your docker-compose.yml content

services:
  redis:
    container_name: redis
    image: docker.io/redis:latest
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  database:
    container_name: immich_postgres
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    healthcheck:
      test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
      interval: 5m
      start_interval: 30s
      start_period: 5m
    command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wa\
l_compression=on"]
    restart: always

  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:
      - ${IMMICH_LIBRARY}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    depends_on:
      - redis
      - database
    restart: always
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.immich.rule=Host(`XXXXXXXXXXX.org`)"

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, openvino] 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://immich.app/docs/features/ml-hardware-acceleration
    #   file: hwaccel.ml.yml
    #   service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always

Your .env content

IMMICH_LIBRARY=/media/hdd/images
DB_DATA_LOCATION=/media/hdd/db
TZ=Europe/Madrid
DB_PASSWORD=XXXXXXXX
DB_USERNAME=YYYYYYYY
DB_DATABASE_NAME=immich

Reproduction steps

1. Open my mobile app, wait until new photos and videos are uploaded.
2. Tap de "cloud" button in top of the main screen
3. See that there is a "1" in the "Remaining" section and there is information about my 1.99GB file being uploaded.
4. Wait until it reaches around 20% and the shown uploading speed increases, the percentage goes up, but the archive is not uploaded at the end (if I close the app, I can repeat the exact same steps)

Relevant log output

No response

Additional information

It looks like 2 different issues reported together: not being able to upload a big archive to my server and the Android app unable to recognise that both files (local mobile video and uploaded using immich-go) are exactly the same.

I'm focusing on the second one for this issue.

Best regards

alextran1502 commented 1 month ago

Are you using a reverse proxy? If so, can you check if your reverse proxy allows large file uploads?

joselsegura commented 1 month ago

Hi Alex.

Yes, I'm using traefik and I think that it allows large size uploads because I uploaded the video using the API, but with a third party program instead official ones.

In any case, I want to focus mainly on the Android app problem about not recognising an already uploaded file, more than the upload problem, as this one can be a configuration related problem at the end.

alextran1502 commented 1 month ago

Can you send the log where you see error code 409?

joselsegura commented 1 month ago

I saw it when trying, before testing with the third party app, to upload the file from the browser. I'm trying to reproduce right now... but again, this issue is NOT about the upload problem. As you mentioned, it can be caused by a misconfiguration on my reverse proxy or whatever problem in the network...

The problem I'm trying to expose here is that the Android app is not able to detect that the video is already uploaded on the server, so there is no need to sync it again and again

joselsegura commented 1 month ago

I cannot reproduce it because the web page is able to recognise that the video is already uploaded, so it didn't try.

I'm going to create a modified version of the video just to make sure that it's different from the previous one and I'll try to reproduce

joselsegura commented 1 month ago

I was able to reproduce, but I cannot see any status code, only "ApiError"

image

From my reverse proxy logs I was able to see a 502, not a 409.

alextran1502 commented 1 month ago

Any log from the server?

joselsegura commented 1 month ago

Nothing relevant, just a few websocket connect/disconnect logs.

As I can reproduce it easily, I can try to upload Immich to latest version and enable some more verbose logging, if possible, just let me know.

alextran1502 commented 1 month ago

Is that upload form you shown is on local IP?

joselsegura commented 1 month ago

Yes, it's in local network, but using the reverse proxy (I'm not exposing the immich web server to my local network)

alextran1502 commented 1 month ago

Look like here is the solution https://github.com/immich-app/immich/discussions/8872