I
Immichβ€’6mo ago
Bard

Storage template folder in docker

I have immich installed on truenas at the moment and I can specify where to put the upload folder, the storage template folder, where to keep profiles, configs, thumbs, encoded? videos, etc... I'd like to move it to a VM running docker as the NAS has not enough performance for face recognition, encoding, etc but I can't find a way to configure each folder (ideally I want most of them to point as the NAS, either with cifs volumes on docker or pointing at folders mounted locally with fstab) since I don't have storage for everything in the docker VM. Normally I'd just check the location of the various folders in the container and configure it accordingly, but the docker compose provided looks quite weird and unusual to me where there's a lot of things marked as "do not change" and so on.
19 Replies
Immich
Immichβ€’6mo ago
:wave: Hey @Bard, Thanks for reaching out to us. Please follow the recommended actions below; 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 compose ps docs - Reverse Proxy: https://immich.app/docs/administration/reverse-proxy Checklist 1. :ballot_box_with_check: I have verified I'm on the latest release(note that mobile app releases may take some time). 2. :ballot_box_with_check: I have read applicable release notes. 3. :ballot_box_with_check: I have reviewed the FAQs for known issues. 4. :ballot_box_with_check: I have reviewed Github for known issues. 5. :ballot_box_with_check: I have tried accessing Immich via local ip (without a custom reverse proxy). 6. :ballot_box_with_check: I have uploaded the relevant logs, docker compose, and .env files, making sure to use code formatting. 7. :ballot_box_with_check: I have 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) If this ticket can be closed you can use the /close command, and re-open it later if needed. Successfully submitted, a tag has been added to inform contributors. :white_check_mark:
Bard
BardOPβ€’6mo ago
nice that solves 90% of it... what about the storage template location? in Truenas I have "Immich Uploads Storage" for the uploads and "Immich Library Storage" where stuff gets moved when the Storage Template gets applied
bo0tzz
bo0tzzβ€’6mo ago
Those are covered in there
Bard
BardOPβ€’6mo ago
is it the note below where it talks about the library? in the list I only see Upload, Thumb, Encoded, Profile, Backup I'm confused.. well I'll try deploying it like that and see, maybe I'm just being dumb
bo0tzz
bo0tzzβ€’6mo ago
yes
Bard
BardOPβ€’5mo ago
Thanks! I'll give it a try later and close this if it works πŸ˜„ took me a while to try but everything worked, thanks!
a ant
a antβ€’5mo ago
Hey @Bard I’m trying to do the same thing and am getting a little confused, would you mind sending me your docker compose yaml and .env that you got working so I can cross check to see what I’m doing wrong? I want to set all mounts to my nas along with setting a specific mount path for the config file too.
Bard
BardOPβ€’5mo ago
Hi @a ant sorry for the delay, didn't have access to the docker files until today πŸ˜„ In the docker compose I only changed the ".env" entries to "stack.env" since I'm using portainer, but otherwise it's untouched. Then I mounted the root of the share of my NAS that I use for app storage using fstab in /mnt/nas_service and I edited the .env file (renamed stack.env) adding the various folder entries like this: UPLOAD_LOCATION=/mnt/nas_service/Apps/Immich/photos THUMB_LOCATION=/mnt/nas_service/Apps/Immich/thumbs ENCODED_VIDEO_LOCATION=/mnt/nas_service/Apps/Immich/encoded-video PROFILE_LOCATION=/mnt/nas_service/Apps/Immich/profile BACKUP_LOCATION=/mnt/nas_service/Apps/Immich/backups DB_DATA_LOCATION=/configs/immich/postgres As a note, I also tried putting photos on a different share than everything else, so at first I tried something like this: UPLOAD_LOCATION=/mnt/nas_storage/Photos THUMB_LOCATION=/mnt/nas_service/Apps/Immich/thumbs ENCODED_VIDEO_LOCATION=/mnt/nas_service/Apps/Immich/encoded-video PROFILE_LOCATION=/mnt/nas_service/Apps/Immich/profile BACKUP_LOCATION=/mnt/nas_service/Apps/Immich/backups but for some reason it didn't work and just put everything inside the nas_storage/Photos folder. Not sure if I did something wrong or if it is just not possible, but I didn't care enough to try and find out πŸ˜„
a ant
a antβ€’5mo ago
Thank you! Every time I try to change the mounts in the env file all directories get created under the upload directory and ignore my mount locations for thumbs, profiles etc
Zeus
Zeusβ€’5mo ago
It sort of sounds like you are just adding env vars without changing the compose The vars themself are meaningless and only used with matching mounts in the compose
a ant
a antβ€’5mo ago
this is my compose for the immich server `` name: immich services: immich-server: container_name: immich_server image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} extends: file: ${HWACCEL_TRANSCODING} #hwaccel.transcoding.yml service: nvenc #set to one of [cpu, nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding volumes: # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file #- ${IMMICH_CONFIG_FILE}:/usr/src/app/config/immich.json - ${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 - ${BACKUP_LOCATION}:/usr/src/app/upload/backups - /etc/localtime:/etc/localtime:ro - /mnt/hdd/data/media/photos:/mnt/hdd/data/media/photos #external directory read - /mnt/hdd/docker/immich/config - /mnt/hdd/docker/immich/config:/usr/src/app #config directory read env_file: - .env ports: - 2283:2283 depends_on: - redis - database restart: always healthcheck: disable: false # # ``` and my .env The location where your database files are stored DB_DATA_LOCATION=/mnt/hdd/docker/immich/postgresdata config file IMMICH_CONFIG_FILE=/mnt/hdd/docker/immich/config/immich.json additional immich hostpaths UPLOAD_LOCATION=/mnt/hdd/docker/immich/upload THUMB_LOCATION=/mnt/hdd/docker/immich/thumbs ENCODED_VIDEO_LOCATION=/mnt/hdd/docker/immich/encodedvideo PROFILE_LOCATION=/mnt/hdd/docker/immich/profile BACKUP_LOCATION=/mnt/hdd/docker/immich/backups To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: TZ=Europle/London
Zeus
Zeusβ€’5mo ago
You should NOT be mounting /usr/src/app Where did you read that lol
a ant
a antβ€’5mo ago
ha sorry i think i was probbaly messing with the compose at some point to get it to work but does the rest look correct?
Zeus
Zeusβ€’5mo ago
Please use code blocks it’s very hard to read The full compose and env
a ant
a antβ€’5mo ago
one sec trying to figure out how to paste code blocks
a ant
a antβ€’5mo ago
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your database files are stored
DB_DATA_LOCATION=/mnt/hdd/docker/immich/postgresdata

# config file
IMMICH_CONFIG_FILE=/mnt/hdd/docker/immich/config/immich.json

# additional immich hostpaths
UPLOAD_LOCATION=/mnt/hdd/docker/immich/upload
THUMB_LOCATION=/mnt/hdd/docker/immich/thumbs
ENCODED_VIDEO_LOCATION=/mnt/hdd/docker/immich/encodedvideo
PROFILE_LOCATION=/mnt/hdd/docker/immich/profile
BACKUP_LOCATION=/mnt/hdd/docker/immich/backups

# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
TZ=Europle/London

# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release

#ml hardwarware accel
HWACCEL_LOCATION=/mnt/hdd/docker/immich/config/hwaccel.ml.yml
HWACCEL_TRANSCODING=/mnt/hdd/docker/immich/config/hwaccel.transcoding.yml


# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=postgres

# The values below this line do not need to be changed
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your database files are stored
DB_DATA_LOCATION=/mnt/hdd/docker/immich/postgresdata

# config file
IMMICH_CONFIG_FILE=/mnt/hdd/docker/immich/config/immich.json

# additional immich hostpaths
UPLOAD_LOCATION=/mnt/hdd/docker/immich/upload
THUMB_LOCATION=/mnt/hdd/docker/immich/thumbs
ENCODED_VIDEO_LOCATION=/mnt/hdd/docker/immich/encodedvideo
PROFILE_LOCATION=/mnt/hdd/docker/immich/profile
BACKUP_LOCATION=/mnt/hdd/docker/immich/backups

# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
TZ=Europle/London

# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release

#ml hardwarware accel
HWACCEL_LOCATION=/mnt/hdd/docker/immich/config/hwaccel.ml.yml
HWACCEL_TRANSCODING=/mnt/hdd/docker/immich/config/hwaccel.transcoding.yml


# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=postgres

# The values below this line do not need to be changed
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
compose
# 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
#
#
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
extends:
file: ${HWACCEL_TRANSCODING} #hwaccel.transcoding.yml
service: nvenc #set to one of [cpu, nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
volumes:
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
#- ${IMMICH_CONFIG_FILE}:/usr/src/app/config/immich.json
- ${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
- ${BACKUP_LOCATION}:/usr/src/app/upload/backups
- /etc/localtime:/etc/localtime:ro
- /mnt/hdd/data/media/photos:/mnt/hdd/data/media/photos #external directory read

env_file:
- .env
ports:
- 2283:2283
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
# 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
#
#
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
extends:
file: ${HWACCEL_TRANSCODING} #hwaccel.transcoding.yml
service: nvenc #set to one of [cpu, nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
volumes:
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
#- ${IMMICH_CONFIG_FILE}:/usr/src/app/config/immich.json
- ${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
- ${BACKUP_LOCATION}:/usr/src/app/upload/backups
- /etc/localtime:/etc/localtime:ro
- /mnt/hdd/data/media/photos:/mnt/hdd/data/media/photos #external directory read

env_file:
- .env
ports:
- 2283:2283
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
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}-cuda
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
extends:
# uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
file: ${HWACCEL_LOCATION} #file: hwaccel.ml.yml
service: cuda # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- /mnt/hdd/docker/immich/modelcache:/cache
- /mnt/hdd/docker/immich/config
env_file:
- .env
restart: always
healthcheck:
disable: false
#
#
redis:
container_name: immich_redis
image: docker.io/redis:6.2-alpine@sha256:eaba718fecd1196d88533de7ba49bf903ad33664a92debb24660a922ecd9cac8
healthcheck:
test: redis-cli ping || exit 1
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}-cuda
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
extends:
# uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
file: ${HWACCEL_LOCATION} #file: hwaccel.ml.yml
service: cuda # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- /mnt/hdd/docker/immich/modelcache:/cache
- /mnt/hdd/docker/immich/config
env_file:
- .env
restart: always
healthcheck:
disable: false
#
#
redis:
container_name: immich_redis
image: docker.io/redis:6.2-alpine@sha256:eaba718fecd1196d88533de7ba49bf903ad33664a92debb24660a922ecd9cac8
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:
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
- ${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
- wal_compression=on
restart: always
#
#

volumes:
model-cache: null
networks: {}
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:
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
- ${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
- wal_compression=on
restart: always
#
#

volumes:
model-cache: null
networks: {}

Did you find this page helpful?