# Verified compose for Immich (no machine learning), tested 2026-10-02 by the SelfHostBench lab. # Lab host: Intel(R) Xeon(R) Processor @ 2.10GHz, 4 vCPU, 15.7 GiB RAM, x86_64, Docker 29.6.2. # Floating image tags below were replaced by the version resolved at test time; # the registry digest is in the comment on each image line. # Measurements: immich-no-ml.json (schema 2). # Companion env file: immich-no-ml.env (save it as .env next to this file). # Secrets are not published: the lab's values are public. In immich-no-ml.env: # DB_PASSWORD=CHANGE_ME_DB_PASSWORD. Replace it with your own before the first start. # Immich: self-hosted photo and video library (this variant: machine learning disabled). # # Based on the compose file of the current Immich release: # https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml # Changes from the release file (everything else is as shipped): # * the upload and database folders are named volumes instead of the ./library and # ./postgres bind mounts, so the stack can run on a remote Docker host and `down -v` # leaves nothing behind. Use bind mounts (UPLOAD_LOCATION / DB_DATA_LOCATION in .env) # if you want photos in a folder you can see. # * the extends/hardware-acceleration comments are removed (not tested here). # Put DB_PASSWORD and friends in the .env file next to this file. # # VARIANT (SelfHostBench lab): same stack, WITHOUT machine learning. # Done the way Immich's FAQ describes (https://docs.immich.app/FAQ#how-can-i-disable-machine-learning): # 1. Machine learning is switched off under Administration > Settings > Machine Learning # (the lab does this through the API in disable_ml.py), and # 2. the `immich-machine-learning` section is removed from the compose file, so the container never starts. # The model-cache volume is removed with it. No memory limits. name: immich services: immich-server: container_name: immich_server image: ghcr.io/immich-app/immich-server:v3.2.4 # sha256:d317916b28090c33eb36b308464ea391f8b7df1d850fcfea227a39ec879718c2 (version v3.2.4, from label:org.opencontainers.image.version) volumes: # Originals, thumbnails, encoded video. This is your photo library: back it up. - immich-upload:/data - /etc/localtime:/etc/localtime:ro env_file: - .env ports: - '2283:2283' depends_on: - redis - database restart: always healthcheck: disable: false redis: container_name: immich_redis image: docker.io/valkey/valkey:9@sha256:70739f85ad2ee01a726a965584a0f94895f01b0c60b3cc8b0aeef11eaa6888cf # version 9.1.1 (from exec); no registry tag for it could be verified, so the digest is pinned instead healthcheck: test: redis-cli ping | grep -q PONG || exit 1 restart: always database: container_name: immich_postgres image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 # sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23 (version 14-vectorchord0.4.3-pgvector0.8.1-pgvectors0.2.0, from label:org.opencontainers.image.version) environment: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_USER: ${DB_USERNAME} POSTGRES_DB: ${DB_DATABASE_NAME} POSTGRES_INITDB_ARGS: '--data-checksums' # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs # DB_STORAGE_TYPE: 'HDD' volumes: # The Immich database (albums, users, search index). Back this up with pg_dump. - immich-db:/var/lib/postgresql/data shm_size: 128mb restart: always healthcheck: disable: false volumes: immich-upload: immich-db: