205 lines
5.5 KiB
YAML
205 lines
5.5 KiB
YAML
name: media
|
|
|
|
services:
|
|
# --- Jellyfin (Port 8096) ---
|
|
jellyfin:
|
|
image: lscr.io/linuxserver/jellyfin:latest
|
|
container_name: jellyfin
|
|
restart: unless-stopped
|
|
ports:
|
|
- "7003:8096"
|
|
environment:
|
|
- PUID=${PUID}
|
|
- PGID=${PGID}
|
|
- TZ=${TZ}
|
|
volumes:
|
|
- ./config/jellyfin:/config
|
|
- ${MEDIA_ROOT}:/data/media # Pfad aus der .env
|
|
# Hardware Transcoding (Intel/AMD):
|
|
#devices:
|
|
# - /dev/dri:/dev/dri
|
|
|
|
# --- Audiobookshelf (Port 13378) ---
|
|
audiobookshelf:
|
|
image: ghcr.io/advplyr/audiobookshelf:latest
|
|
container_name: audiobookshelf
|
|
restart: unless-stopped
|
|
ports:
|
|
- "7001:80"
|
|
volumes:
|
|
- ./config/audiobookshelf/config:/config
|
|
- ./config/audiobookshelf/metadata:/metadata
|
|
- ${MEDIA_ROOT}/audiobooks:/audiobooks
|
|
- ${MEDIA_ROOT}/podcasts:/podcasts
|
|
|
|
# --- RomM (Port 7000) ---
|
|
romm:
|
|
image: rommapp/romm:latest
|
|
container_name: romm
|
|
restart: unless-stopped
|
|
ports:
|
|
- "7000:8080"
|
|
environment:
|
|
- DB_HOST=romm-db
|
|
- DB_NAME=romm
|
|
- DB_USER=romm-user
|
|
- DB_PASSWD=romm-password
|
|
volumes:
|
|
- ./config/romm/resources:/romm/resources
|
|
- ${MEDIA_ROOT}/games:/romm/library
|
|
depends_on:
|
|
- romm-db
|
|
|
|
# Datenbank für RomM (nur intern sichtbar)
|
|
romm-db:
|
|
image: mariaDB:10.6
|
|
labels:
|
|
- "wud.watch=false"
|
|
environment:
|
|
- MYSQL_ROOT_PASSWORD=root-pass
|
|
- MYSQL_DATABASE=romm
|
|
- MYSQL_USER=romm-user
|
|
- MYSQL_PASSWORD=romm-password
|
|
volumes:
|
|
- romm_db_data:/var/lib/mysql
|
|
|
|
# --- Immich (Port 7002) ---
|
|
# ACHTUNG: Immich ist komplex. Das ist die vereinfachte All-in-One Struktur.
|
|
immich-server:
|
|
image: ghcr.io/immich-app/immich-server:release
|
|
container_name: immich_server
|
|
command: ["start.sh", "immich"]
|
|
restart: always
|
|
ports:
|
|
- "7999:2283"
|
|
environment:
|
|
- DB_HOSTNAME=immich-postgres
|
|
- DB_USERNAME=postgres
|
|
- DB_PASSWORD=postgres
|
|
- DB_DATABASE_NAME=immich
|
|
- REDIS_HOSTNAME=immich-redis
|
|
volumes:
|
|
- ${MEDIA_ROOT}/photos:/usr/src/app/upload
|
|
depends_on:
|
|
- immich-redis
|
|
- immich-postgres
|
|
|
|
immich-microservices:
|
|
image: ghcr.io/immich-app/immich-server:release
|
|
container_name: immich_microservices
|
|
command: ["start.sh", "microservices"]
|
|
restart: always
|
|
environment:
|
|
- DB_HOSTNAME=immich-postgres
|
|
- DB_USERNAME=postgres
|
|
- DB_PASSWORD=postgres
|
|
- DB_DATABASE_NAME=immich
|
|
- REDIS_HOSTNAME=immich-redis
|
|
volumes:
|
|
- ${MEDIA_ROOT}/photos:/usr/src/app/upload
|
|
depends_on:
|
|
- immich-redis
|
|
- immich-postgres
|
|
|
|
# Immich braucht seine eigene DB (Vectordaten etc.)
|
|
immich-postgres:
|
|
image: tensorchord/pgvecto-rs:pg14-v0.2.0
|
|
container_name: immich_postgres
|
|
labels:
|
|
- "wud.watch=false"
|
|
restart: always
|
|
environment:
|
|
- POSTGRES_PASSWORD=postgres
|
|
- POSTGRES_USER=postgres
|
|
- POSTGRES_DB=immich
|
|
volumes:
|
|
- immich_pg_data:/var/lib/postgresql/data
|
|
|
|
immich-redis:
|
|
image: redis:6.2-alpine
|
|
container_name: immich_redis
|
|
restart: always
|
|
labels:
|
|
- "wud.watch=false"
|
|
|
|
immich-drop:
|
|
image: ghcr.io/nasogaa/immich-drop:latest
|
|
pull_policy: always
|
|
container_name: immich-drop
|
|
restart: unless-stopped
|
|
# Configure all settings here (no .env required)
|
|
environment:
|
|
# Immich connection (must include /api)
|
|
IMMICH_BASE_URL: https://immich.example.com/api
|
|
IMMICH_API_KEY: ${IMMICH_API_KEY}
|
|
# Optional behavior
|
|
IMMICH_ALBUM_NAME: dead-drop
|
|
PUBLIC_UPLOAD_PAGE_ENABLED: "false" # keep disabled by default
|
|
PUBLIC_BASE_URL: https://drop.example.com
|
|
# Large files: chunked uploads (bypass 100MB proxy limits)
|
|
CHUNKED_UPLOADS_ENABLED: "false" # enable chunked uploads
|
|
CHUNK_SIZE_MB: "95" # per-chunk size (MB)
|
|
# App internals
|
|
SESSION_SECRET: ${SESSION_SECRET}
|
|
# Expose the app on the host
|
|
ports:
|
|
- 7998:8080
|
|
# Persist local dedupe cache (state.db) across restarts
|
|
volumes:
|
|
- immich_drop_data:/data
|
|
# Simple healthcheck
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "python - <<'PY'\nimport os,urllib.request,sys; url=f\"http://127.0.0.1:{os.getenv('PORT','8080')}/\";\ntry: urllib.request.urlopen(url, timeout=3); sys.exit(0)\nexcept Exception: sys.exit(1)\nPY"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 10s
|
|
|
|
immich-public-proxy:
|
|
image: alangrainger/immich-public-proxy:latest
|
|
container_name: immich-public-proxy
|
|
restart: always
|
|
ports:
|
|
- "7997:3000"
|
|
environment:
|
|
PUBLIC_BASE_URL: https://your-proxy-url.com
|
|
IMMICH_URL: http://your-internal-immich-server:2283
|
|
healthcheck:
|
|
test: curl -s http://localhost:3000/share/healthcheck -o /dev/null || exit 1
|
|
start_period: 10s
|
|
timeout: 5s
|
|
|
|
|
|
immich-kiosk:
|
|
image: ghcr.io/damongolding/immich-kiosk:latest
|
|
container_name: immich-kiosk
|
|
tty: true
|
|
environment:
|
|
LANG: "de_DE"
|
|
TZ: "Europe/Berlin"
|
|
ports:
|
|
- 7996:3000
|
|
volumes:
|
|
- ./config:/config
|
|
# - ./custom.css:/custom.css
|
|
# - ./offline-assets:/offline-assets
|
|
restart: always
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 10s
|
|
|
|
power-tools:
|
|
image: ghcr.io/varun-raj/immich-power-tools:latest
|
|
ports:
|
|
- "7995:3000"
|
|
env_file:
|
|
- .env
|
|
|
|
|
|
volumes:
|
|
romm_db_data:
|
|
immich_pg_data:
|
|
immich_drop_data: |