Initial commit: homelab configuration and documentation
This commit is contained in:
235
services/swarm/stacks/media-stack.yml
Normal file
235
services/swarm/stacks/media-stack.yml
Normal file
@@ -0,0 +1,235 @@
|
||||
version: '3.9'
|
||||
|
||||
networks:
|
||||
traefik-public:
|
||||
external: true
|
||||
media-backend:
|
||||
driver: overlay
|
||||
|
||||
volumes:
|
||||
plex_config:
|
||||
jellyfin_config:
|
||||
immich_upload:
|
||||
immich_model_cache:
|
||||
immich_db:
|
||||
immich_redis:
|
||||
homarr_config:
|
||||
|
||||
services:
|
||||
homarr:
|
||||
image: ghcr.io/homarr-labs/homarr:1.43.0
|
||||
networks:
|
||||
- traefik-public
|
||||
- media-backend
|
||||
volumes:
|
||||
- homarr_config:/app/data
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
environment:
|
||||
- TZ=America/Chicago
|
||||
deploy:
|
||||
placement:
|
||||
constraints:
|
||||
- node.labels.leader == true
|
||||
- node.role == manager
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.homarr-router.rule=Host(`homarr.sj98.duckdns.org`)"
|
||||
- "traefik.http.routers.homarr-router.entrypoints=websecure"
|
||||
- "traefik.http.routers.homarr-router.tls.certresolver=leresolver"
|
||||
- "traefik.http.services.homarr.loadbalancer.server.port=7575"
|
||||
- "traefik.docker.network=traefik-public"
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
cpus: '1.0'
|
||||
reservations:
|
||||
memory: 128M
|
||||
cpus: '0.2'
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
|
||||
plex:
|
||||
image: plexinc/pms-docker:latest
|
||||
hostname: plex
|
||||
networks:
|
||||
- traefik-public
|
||||
- media-backend
|
||||
volumes:
|
||||
- plex_config:/config
|
||||
- /mnt/media:/media:ro
|
||||
environment:
|
||||
- TZ=America/Chicago
|
||||
- PLEX_CLAIM=${PLEX_CLAIM}
|
||||
- ADVERTISE_IP=http://192.168.1.196:32400/
|
||||
deploy:
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.plex-router.rule=Host(`plex.sj98.duckdns.org`)"
|
||||
- "traefik.http.routers.plex-router.entrypoints=websecure"
|
||||
- "traefik.http.routers.plex-router.tls.certresolver=leresolver"
|
||||
- "traefik.http.services.plex.loadbalancer.server.port=32400"
|
||||
- "traefik.docker.network=traefik-public"
|
||||
resources:
|
||||
limits:
|
||||
memory: 1G
|
||||
cpus: '2.0'
|
||||
reservations:
|
||||
memory: 512M
|
||||
cpus: '0.5'
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
|
||||
jellyfin:
|
||||
image: jellyfin/jellyfin:latest
|
||||
networks:
|
||||
- traefik-public
|
||||
- media-backend
|
||||
volumes:
|
||||
- jellyfin_config:/config
|
||||
- /mnt/media:/media:ro
|
||||
environment:
|
||||
- TZ=America/Chicago
|
||||
deploy:
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.jellyfin-router.rule=Host(`jellyfin.sj98.duckdns.org`)"
|
||||
- "traefik.http.routers.jellyfin-router.entrypoints=websecure"
|
||||
- "traefik.http.routers.jellyfin-router.tls.certresolver=leresolver"
|
||||
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
|
||||
- "traefik.docker.network=traefik-public"
|
||||
resources:
|
||||
limits:
|
||||
memory: 1G
|
||||
cpus: '2.0'
|
||||
reservations:
|
||||
memory: 512M
|
||||
cpus: '0.5'
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
|
||||
immich-server:
|
||||
image: ghcr.io/immich-app/immich-server:release
|
||||
networks:
|
||||
- traefik-public
|
||||
- media-backend
|
||||
volumes:
|
||||
- immich_upload:/usr/src/app/upload
|
||||
- /mnt/media/Photos:/usr/src/app/upload/library:rw
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
environment:
|
||||
- DB_HOSTNAME=immich-db
|
||||
- DB_USERNAME=immich
|
||||
- DB_PASSWORD=immich
|
||||
- DB_DATABASE_NAME=immich
|
||||
- REDIS_HOSTNAME=immich-redis
|
||||
- TZ=America/Chicago
|
||||
- IMMICH_MEDIA_LOCATION=/usr/src/app/upload/library
|
||||
depends_on:
|
||||
- immich-redis
|
||||
- immich-db
|
||||
deploy:
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.immich-server-router.rule=Host(`immich.sj98.duckdns.org`)"
|
||||
- "traefik.http.routers.immich-server-router.entrypoints=websecure"
|
||||
- "traefik.http.routers.immich-server-router.tls.certresolver=leresolver"
|
||||
- "traefik.http.services.immich-server.loadbalancer.server.port=2283"
|
||||
- "traefik.docker.network=traefik-public"
|
||||
# Immich-specific headers and settings
|
||||
- "traefik.http.routers.immich-server-router.middlewares=immich-headers"
|
||||
- "traefik.http.middlewares.immich-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
|
||||
- "traefik.http.services.immich-server.loadbalancer.passhostheader=true"
|
||||
resources:
|
||||
limits:
|
||||
memory: 2G
|
||||
cpus: '2.0'
|
||||
reservations:
|
||||
memory: 1G
|
||||
cpus: '0.5'
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
|
||||
immich-machine-learning:
|
||||
image: ghcr.io/immich-app/immich-machine-learning:release
|
||||
networks:
|
||||
- media-backend
|
||||
volumes:
|
||||
- immich_model_cache:/cache
|
||||
environment:
|
||||
- TZ=America/Chicago
|
||||
depends_on:
|
||||
- immich-server
|
||||
deploy:
|
||||
placement:
|
||||
constraints:
|
||||
- node.labels.heavy == true
|
||||
- node.labels.ai == true
|
||||
resources:
|
||||
limits:
|
||||
memory: 4G
|
||||
cpus: '4.0'
|
||||
reservations:
|
||||
memory: 2G
|
||||
cpus: '2.0'
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
|
||||
immich-redis:
|
||||
image: redis:7-alpine
|
||||
networks:
|
||||
- media-backend
|
||||
volumes:
|
||||
- immich_redis:/data
|
||||
deploy:
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
resources:
|
||||
limits:
|
||||
memory: 256M
|
||||
cpus: '0.5'
|
||||
reservations:
|
||||
memory: 64M
|
||||
cpus: '0.1'
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
|
||||
immich-db:
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.2.0
|
||||
networks:
|
||||
- media-backend
|
||||
volumes:
|
||||
- immich_db:/var/lib/postgresql/data
|
||||
environment:
|
||||
- POSTGRES_PASSWORD=immich
|
||||
- POSTGRES_USER=immich
|
||||
- POSTGRES_DB=immich
|
||||
deploy:
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
cpus: '1.0'
|
||||
reservations:
|
||||
memory: 256M
|
||||
cpus: '0.25'
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
Reference in New Issue
Block a user