From 15ed56e42c1b0655f2a4e70bce3cc89987c8eaee Mon Sep 17 00:00:00 2001 From: Oleksandr Berezovskyi Date: Sun, 31 Aug 2025 19:12:02 +0300 Subject: [PATCH] feat(docker-stack): add immich stack --- docker/stacks/immich/docker-compose.yaml | 112 +++++++++++++++++++++++ docker/stacks/immich/stack.env | 11 +++ 2 files changed, 123 insertions(+) create mode 100644 docker/stacks/immich/docker-compose.yaml create mode 100644 docker/stacks/immich/stack.env diff --git a/docker/stacks/immich/docker-compose.yaml b/docker/stacks/immich/docker-compose.yaml new file mode 100644 index 0000000..cf62e2d --- /dev/null +++ b/docker/stacks/immich/docker-compose.yaml @@ -0,0 +1,112 @@ +services: + immich-server: + image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} + volumes: + - ${UPLOAD_LOCATION}:/usr/src/app/upload + - /etc/localtime:/etc/localtime:ro + environment: + UPLOAD_LOCATION: ${UPLOAD_LOCATION} + DB_PASSWORD: ${DB_PASSWORD} + DB_USERNAME: ${DB_USERNAME} + DB_DATABASE_NAME: ${DB_DATABASE_NAME} + REDIS_HOSTNAME: redis + TZ: ${TZ} + ports: + - 2283:3001 + depends_on: + - redis + - database + restart: always + healthcheck: + disable: false + labels: + - "traefik.enable=true" + - "traefik.http.routers.immich.rule=Host(`${TRAEFIK_DOMAIN}`)" + - "traefik.http.routers.immich.entrypoints=websecure" + - "traefik.http.routers.immich.tls.certresolver=myresolver" + - "traefik.docker.network=traefik" + networks: + - immich + - traefik + + immich-machine-learning: + container_name: immich_machine_learning + image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} + volumes: + - model-cache:/cache + restart: always + healthcheck: + disable: false + networks: + - immich + + redis: + image: registry.hub.docker.com/library/redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672 + healthcheck: + test: redis-cli ping || exit 1 + restart: always + networks: + - immich + + database: + image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0 + environment: + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_USER: ${DB_USERNAME} + POSTGRES_DB: ${DB_DATABASE_NAME} + POSTGRES_INITDB_ARGS: '--data-checksums' + DB_STORAGE_TYPE: 'HDD' + volumes: + - ${SERVICE_DATA_ROOT_PATH}/database:/var/lib/postgresql/data + restart: always + networks: + - immich + + backup-files: + image: creativeprojects/resticprofile:${RP_VERSION:-latest} + entrypoint: '/bin/sh' + hostname: immich-resticprofile + restart: always + command: + - '-c' + - 'resticprofile schedule --all && crond -f' + volumes: + - ${SERVICE_DATA_ROOT_PATH}/restic/resticprofile.yaml:/etc/resticprofile/profiles.yaml:ro + - ${SERVICE_DATA_ROOT_PATH}/restic/restic.key:/etc/resticprofile/key:ro + - ${UPLOAD_LOCATION}:${UPLOAD_LOCATION}:ro + - ${SERVICE_DATA_ROOT_PATH}/db_dumps:/db_dumps:ro + environment: + TZ: ${TZ} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + + backup-database: + container_name: immich_db_dumper + image: prodrigestivill/postgres-backup-local:14 + restart: always + environment: + POSTGRES_HOST: database + POSTGRES_CLUSTER: 'TRUE' + POSTGRES_USER: ${DB_USERNAME} + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_DB: ${DB_DATABASE_NAME} + BACKUP_KEEP_MINS: "120" + SCHEDULE: "50 * * * *" + POSTGRES_EXTRA_OPTS: '--clean --if-exists' + BACKUP_DIR: /db_dumps + volumes: + - ${SERVICE_DATA_ROOT_PATH}/db_dumps:/db_dumps + depends_on: + - database + networks: + - immich + +networks: + immich: + name: immich + traefik: + name: traefik + external: true + +volumes: + model-cache: diff --git a/docker/stacks/immich/stack.env b/docker/stacks/immich/stack.env new file mode 100644 index 0000000..ae24846 --- /dev/null +++ b/docker/stacks/immich/stack.env @@ -0,0 +1,11 @@ +UPLOAD_LOCATION= +SERVICE_DATA_ROOT_PATH= +TRAEFIK_DOMAIN= +IMMICH_VERSION=release +DB_PASSWORD= +DB_USERNAME=immich +DB_DATABASE_NAME=immich +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +TZ= +