From d42e854079c75ba9aed8281bf98f6ee617b3430b Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Thu, 16 Jul 2026 13:51:02 -0500 Subject: [PATCH 1/9] chore: boostraping --- catalog.json | 24 ++++++++ immich/1.107.2/docker-compose.yml | 93 +++++++++++++++++++++++++++++++ immich/docker-compose.yml | 93 +++++++++++++++++++++++++++++++ immich/manifest.json | 10 ++++ 4 files changed, 220 insertions(+) create mode 100644 catalog.json create mode 100644 immich/1.107.2/docker-compose.yml create mode 100644 immich/docker-compose.yml create mode 100644 immich/manifest.json diff --git a/catalog.json b/catalog.json new file mode 100644 index 0000000..3a4d42a --- /dev/null +++ b/catalog.json @@ -0,0 +1,24 @@ +{ + "schemaVersion": 1, + "apps": [ + { + "id": "immich", + "name": "Immich", + "tagline": "Self-hosted photo and video management", + "description": "High-performance photo and video backup solution with mobile apps, machine-learning search, and multi-user libraries.", + "icon": "immich/icon.png", + "developer": "FUTO", + "website": "https://immich.app", + "sourceRepo": "https://github.com/immich-app/immich" + }, + { + "id": "fhs-enhance-media", + "name": "Enhance Media", + "tagline": "Add media streaming capability to your FUTO Home", + "description": "A streaming experience for your FUTO Home. Enhance Media allows you to stream your media files to any device on your network.", + "icon": "enhance-media/icon.png", + "developer": "FUTO", + "sourceRepo": "https://github.com//enhance-media" + } + ] +} diff --git a/immich/1.107.2/docker-compose.yml b/immich/1.107.2/docker-compose.yml new file mode 100644 index 0000000..7429256 --- /dev/null +++ b/immich/1.107.2/docker-compose.yml @@ -0,0 +1,93 @@ +# +# 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 + +x-environment: &env + DB_USERNAME: &db_username "postgres" + DB_PASSWORD: &db_password "postgres" + DB_DATABASE_NAME: &db_database_name "immich" + +services: + 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: + - ${UPLOAD_LOCATION}:/usr/src/app/upload + - /etc/localtime:/etc/localtime:ro + environment: + <<: *env + ports: + - 2283:3001 + 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 + environment: + <<: *env + restart: always + + redis: + container_name: immich_redis + image: docker.io/redis:6.2-alpine@sha256:328fe6a5822256d065debb36617a8169dbfbd77b797c525288e465f56c1d392b + environment: + <<: *env + 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: + <<: *env + 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", + "wal_compression=on", + ] + restart: always + +volumes: + model-cache: diff --git a/immich/docker-compose.yml b/immich/docker-compose.yml new file mode 100644 index 0000000..7429256 --- /dev/null +++ b/immich/docker-compose.yml @@ -0,0 +1,93 @@ +# +# 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 + +x-environment: &env + DB_USERNAME: &db_username "postgres" + DB_PASSWORD: &db_password "postgres" + DB_DATABASE_NAME: &db_database_name "immich" + +services: + 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: + - ${UPLOAD_LOCATION}:/usr/src/app/upload + - /etc/localtime:/etc/localtime:ro + environment: + <<: *env + ports: + - 2283:3001 + 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 + environment: + <<: *env + restart: always + + redis: + container_name: immich_redis + image: docker.io/redis:6.2-alpine@sha256:328fe6a5822256d065debb36617a8169dbfbd77b797c525288e465f56c1d392b + environment: + <<: *env + 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: + <<: *env + 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", + "wal_compression=on", + ] + restart: always + +volumes: + model-cache: diff --git a/immich/manifest.json b/immich/manifest.json new file mode 100644 index 0000000..7d8f786 --- /dev/null +++ b/immich/manifest.json @@ -0,0 +1,10 @@ +{ + "schemaVersion": 1, + "appId": "immich", + "releases": [ + { + "version": "1.107.2", + "requiredStop": true + } + ] +} From 917a800280344412faeff3bb79487ec7b8a76343 Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Fri, 17 Jul 2026 14:32:12 -0500 Subject: [PATCH 2/9] app icon --- catalog.json | 2 +- immich/docker-compose.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/catalog.json b/catalog.json index 3a4d42a..73cf5bc 100644 --- a/catalog.json +++ b/catalog.json @@ -6,7 +6,7 @@ "name": "Immich", "tagline": "Self-hosted photo and video management", "description": "High-performance photo and video backup solution with mobile apps, machine-learning search, and multi-user libraries.", - "icon": "immich/icon.png", + "icon": "https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/design/immich-logo.png", "developer": "FUTO", "website": "https://immich.app", "sourceRepo": "https://github.com/immich-app/immich" diff --git a/immich/docker-compose.yml b/immich/docker-compose.yml index 7429256..1ab116b 100644 --- a/immich/docker-compose.yml +++ b/immich/docker-compose.yml @@ -12,6 +12,7 @@ x-environment: &env DB_USERNAME: &db_username "postgres" DB_PASSWORD: &db_password "postgres" DB_DATABASE_NAME: &db_database_name "immich" + IMMICH_VERSION: "v1.107.2" services: immich-server: From cdbc2d4f9e6dfce8c5f0ef82015444be2fbc729e Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Fri, 17 Jul 2026 15:37:41 -0500 Subject: [PATCH 3/9] folder structure --- immich/data/library/.gitkeep | 0 immich/data/postgres/.gitkeep | 0 immich/docker-compose.yml | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 immich/data/library/.gitkeep create mode 100644 immich/data/postgres/.gitkeep diff --git a/immich/data/library/.gitkeep b/immich/data/library/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/immich/data/postgres/.gitkeep b/immich/data/postgres/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/immich/docker-compose.yml b/immich/docker-compose.yml index 1ab116b..afb25b9 100644 --- a/immich/docker-compose.yml +++ b/immich/docker-compose.yml @@ -22,7 +22,7 @@ services: # file: hwaccel.transcoding.yml # service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding volumes: - - ${UPLOAD_LOCATION}:/usr/src/app/upload + - ${APP_DATA_DIR}/library:/usr/src/app/upload - /etc/localtime:/etc/localtime:ro environment: <<: *env @@ -66,7 +66,7 @@ services: POSTGRES_DB: *db_database_name POSTGRES_INITDB_ARGS: "--data-checksums" volumes: - - ${DB_DATA_LOCATION}:/var/lib/postgresql/data + - ${APP_DATA_DIR}/postgres:/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 From 6cf58ee5a6ff92db5582988028c31aafea46808f Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Sat, 1 Aug 2026 08:50:20 -0500 Subject: [PATCH 4/9] pin version to docker image --- immich/docker-compose.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/immich/docker-compose.yml b/immich/docker-compose.yml index afb25b9..d016d08 100644 --- a/immich/docker-compose.yml +++ b/immich/docker-compose.yml @@ -12,12 +12,11 @@ x-environment: &env DB_USERNAME: &db_username "postgres" DB_PASSWORD: &db_password "postgres" DB_DATABASE_NAME: &db_database_name "immich" - IMMICH_VERSION: "v1.107.2" services: immich-server: container_name: immich_server - image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} + image: ghcr.io/immich-app/immich-server:v1.107.2 # extends: # file: hwaccel.transcoding.yml # service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding @@ -35,12 +34,7 @@ services: 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 + image: ghcr.io/immich-app/immich-machine-learning:v1.107.2 volumes: - model-cache:/cache environment: From bdffd87be02bb18ff754fe3627ac461730bad874 Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Tue, 4 Aug 2026 10:54:40 -0500 Subject: [PATCH 5/9] fix: integrate env app secret --- immich/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/immich/docker-compose.yml b/immich/docker-compose.yml index d016d08..9bf2075 100644 --- a/immich/docker-compose.yml +++ b/immich/docker-compose.yml @@ -10,7 +10,7 @@ name: immich x-environment: &env DB_USERNAME: &db_username "postgres" - DB_PASSWORD: &db_password "postgres" + DB_PASSWORD: &db_password ${APP_PASSWORD} DB_DATABASE_NAME: &db_database_name "immich" services: @@ -62,7 +62,7 @@ services: volumes: - ${APP_DATA_DIR}/postgres:/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 + 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 From 5deb758183ad635bd15bd100a2660e199ae6b299 Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Tue, 8 Sep 2026 14:51:11 -0500 Subject: [PATCH 6/9] add health_check_url --- immich/manifest.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/immich/manifest.json b/immich/manifest.json index 7d8f786..b0e6bc5 100644 --- a/immich/manifest.json +++ b/immich/manifest.json @@ -6,5 +6,6 @@ "version": "1.107.2", "requiredStop": true } - ] + ], + "health_check_url": "/api/ping" } From 377dbd884b87b40a3a5eb4e8d53335f7c54002c5 Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Tue, 8 Sep 2026 14:51:17 -0500 Subject: [PATCH 7/9] add health_check_url --- immich/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/immich/manifest.json b/immich/manifest.json index b0e6bc5..ecccdc8 100644 --- a/immich/manifest.json +++ b/immich/manifest.json @@ -7,5 +7,5 @@ "requiredStop": true } ], - "health_check_url": "/api/ping" + "health_check_url": "/api/server/ping" } From b331a37115746e0c24c6e39485dc1971a8e074d6 Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Tue, 8 Sep 2026 14:53:51 -0500 Subject: [PATCH 8/9] add app_port --- immich/manifest.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/immich/manifest.json b/immich/manifest.json index ecccdc8..ca656ef 100644 --- a/immich/manifest.json +++ b/immich/manifest.json @@ -7,5 +7,6 @@ "requiredStop": true } ], - "health_check_url": "/api/server/ping" + "health_check_url": "/api/server/ping", + "app_port": 2283 } From e7aa496da3714582a9b0cb8143cbea86c421012d Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Tue, 8 Sep 2026 15:18:01 -0500 Subject: [PATCH 9/9] fix: casing --- immich/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/immich/manifest.json b/immich/manifest.json index ca656ef..d1b0f67 100644 --- a/immich/manifest.json +++ b/immich/manifest.json @@ -7,6 +7,6 @@ "requiredStop": true } ], - "health_check_url": "/api/server/ping", - "app_port": 2283 + "healthCheckUrl": "/api/server/ping", + "appPort": 2283 }