Thumbnails in custom bind mounts #3388

Closed
opened 2026-02-05 08:15:09 +03:00 by OVERLORD · 0 comments
Owner

Originally created by @coolmule0 on GitHub (May 31, 2024).

The bug

I'm using custom location bind mounts in my docker-compose. The upload and thumbs directories are different places on disk. The issue is that thumbs appear in both locations (upload/thumbs and ./thumbs) on my actual drives.

It seems to be stored according to the account-ID and album on the device. One user has all thumbs stored in upload/thumbs. Another has it split according to the different albums.

I also use a custom storage template {{y}}/{{MM}}/{{filename}}

Also of note is that an empty profile folder is also create under upload. Again, I would expect this not to happen. In this case, all the profile data is written to ./profile as expected.

All this occurs because I want to store my immich photos in the same directory as my other non-phone pictures on disk. If there is a recommended solution for this that is not custom bind mounts, this would also help solve my issue, but not necessarily the bug

The OS that Immich Server is running on

Debian 5

Version of Immich Server

1.105.1

Version of Immich Mobile App

1.105.0

Platform with the issue

  • Server
  • Web
  • Mobile

Your docker-compose.yml content

#
# WARNING: Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
#

name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    command: ['start.sh', 'immich']
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs
      - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video
      - ${PROFILE_LOCATION}:/usr/src/app/upload/profile
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - 2283:3001
    networks:
      - t2_proxy
      - internal
    depends_on:
      - redis
      - database
    restart: always

  immich-microservices:
    container_name: immich_microservices
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/hardware-transcoding
    #   file: hwaccel.transcoding.yml
    #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    command: ['start.sh', 'microservices']
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs
      - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video
      - ${PROFILE_LOCATION}:/usr/src/app/upload/profile
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    networks:
      - internal
    depends_on:
      - redis
      - database
    restart: always

  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
    networks:
      - internal
    restart: always

  redis:
    container_name: immich_redis
    image: registry.hub.docker.com/library/redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672
    networks:
      - internal
    restart: always

  database:
    container_name: immich_postgres
    image: registry.hub.docker.com/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
    networks:
      - internal
    restart: always
    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", "wal_compression=on"]

volumes:
  model-cache:

networks:
  t2_proxy:
    name: t2_proxy
    external: true
  internal:
    external: false

Your .env content

# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your uploaded files are stored
UPLOAD_LOCATION=/home/me/pictures/phones/
THUMB_LOCATION=./thumbs
ENCODED_VIDEO_LOCATION=./encoded-video
PROFILE_LOCATION=./profile
# The location where your database files are stored
DB_DATA_LOCATION=./postgres

# 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
DB_PASSWORD=password

# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Reproduction steps

1. `docker compose up`
2. Notice that `thumbs` and `profile` folders are created under `uploads` as well as in `./`
3. Set up a client phone for backup
4. See thumbnails being generated in both `uploads/thumbs` and `./thumbs`
Originally created by @coolmule0 on GitHub (May 31, 2024). ### The bug I'm using custom location bind mounts in my docker-compose. The `upload` and `thumbs` directories are different places on disk. The issue is that `thumbs` appear in both locations (`upload/thumbs` and `./thumbs`) on my actual drives. It seems to be stored according to the account-ID and album on the device. One user has all thumbs stored in `upload/thumbs`. Another has it split according to the different albums. I also use a custom storage template `{{y}}/{{MM}}/{{filename}}` Also of note is that an empty `profile` folder is also create under `upload`. Again, I would expect this not to happen. In this case, all the profile data is written to `./profile` as expected. All this occurs because I want to store my immich photos in the same directory as my other non-phone pictures on disk. If there is a recommended solution for this that is not custom bind mounts, this would also help solve my issue, but not necessarily the bug ### The OS that Immich Server is running on Debian 5 ### Version of Immich Server 1.105.1 ### Version of Immich Mobile App 1.105.0 ### Platform with the issue - [X] Server - [ ] Web - [ ] Mobile ### Your docker-compose.yml content ```YAML # # WARNING: Make sure to use the docker-compose.yml of the current release: # # https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml # # The compose file on main may not be compatible with the latest release. # name: immich services: immich-server: container_name: immich_server image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} command: ['start.sh', 'immich'] volumes: - ${UPLOAD_LOCATION}:/usr/src/app/upload - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video - ${PROFILE_LOCATION}:/usr/src/app/upload/profile - /etc/localtime:/etc/localtime:ro env_file: - .env ports: - 2283:3001 networks: - t2_proxy - internal depends_on: - redis - database restart: always immich-microservices: container_name: immich_microservices image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/hardware-transcoding # file: hwaccel.transcoding.yml # service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding command: ['start.sh', 'microservices'] volumes: - ${UPLOAD_LOCATION}:/usr/src/app/upload - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video - ${PROFILE_LOCATION}:/usr/src/app/upload/profile - /etc/localtime:/etc/localtime:ro env_file: - .env networks: - internal depends_on: - redis - database restart: always 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 networks: - internal restart: always redis: container_name: immich_redis image: registry.hub.docker.com/library/redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672 networks: - internal restart: always database: container_name: immich_postgres image: registry.hub.docker.com/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 networks: - internal restart: always 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", "wal_compression=on"] volumes: model-cache: networks: t2_proxy: name: t2_proxy external: true internal: external: false ``` ### Your .env content ```Shell # You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables # The location where your uploaded files are stored UPLOAD_LOCATION=/home/me/pictures/phones/ THUMB_LOCATION=./thumbs ENCODED_VIDEO_LOCATION=./encoded-video PROFILE_LOCATION=./profile # The location where your database files are stored DB_DATA_LOCATION=./postgres # 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 DB_PASSWORD=password # The values below this line do not need to be changed ################################################################################### DB_USERNAME=postgres DB_DATABASE_NAME=immich ``` ### Reproduction steps ```bash 1. `docker compose up` 2. Notice that `thumbs` and `profile` folders are created under `uploads` as well as in `./` 3. Set up a client phone for backup 4. See thumbnails being generated in both `uploads/thumbs` and `./thumbs` ```
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: immich-app/immich#3388