# Collectoh — https://collectoh.com/docs/install/ # # mkdir collectoh && cd collectoh # curl -fsSLO https://collectoh.com/docker-compose.yml # printf 'SECRET_KEY=%s\nDB_PASSWORD=%s\nMEDIA_DIR=/path/to/your/media\n' "$(openssl rand -hex 32)" "$(openssl rand -hex 16)" > .env # docker compose up -d # # then open http://localhost:8080 for the setup wizard. For hardware transcoding, add the GPU # overlay: curl -fsSLO https://collectoh.com/docker-compose.gpu.yml and run # docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d # # To update: docker compose pull && docker compose up -d name: collectoh services: server: image: ${COLLECTOH_IMAGE:-collectoh/server:latest} restart: unless-stopped ports: - '${PORT:-8080}:8080' environment: DATABASE_URL: postgres://collectoh:${DB_PASSWORD:?set DB_PASSWORD in .env}@postgres:5432/collectoh REDIS_URL: redis://redis:6379 SECRET_KEY: ${SECRET_KEY:?set SECRET_KEY in .env (32+ random bytes)} PUBLIC_URL: ${PUBLIC_URL:-http://localhost:8080} PUID: ${PUID:-1000} PGID: ${PGID:-1000} TZ: ${TZ:-UTC} # Optional: keys of your own for the online catalogues. Without them, your server asks # through your Collectoh account, with nothing to set up (https://collectoh.com/docs/metadata/). TMDB_API_KEY: ${TMDB_API_KEY:-} TVDB_API_KEY: ${TVDB_API_KEY:-} TVDB_PIN: ${TVDB_PIN:-} FANART_API_KEY: ${FANART_API_KEY:-} AUDIODB_API_KEY: ${AUDIODB_API_KEY:-} OMDB_API_KEY: ${OMDB_API_KEY:-} OPENSUBTITLES_API_KEY: ${OPENSUBTITLES_API_KEY:-} OPENSUBTITLES_USERNAME: ${OPENSUBTITLES_USERNAME:-} OPENSUBTITLES_PASSWORD: ${OPENSUBTITLES_PASSWORD:-} volumes: - ${CONFIG_DIR:-./config}:/config - ${METADATA_DIR:-./metadata}:/metadata # artwork and previews: back this up - transcode-cache:/cache # disposable - ${MEDIA_DIR:?set MEDIA_DIR in .env}:/media:ro # your media, read-only: Collectoh never writes to it depends_on: postgres: condition: service_healthy redis: condition: service_started stop_grace_period: 20s postgres: # PostgreSQL 16 with pgvector. image: ${COLLECTOH_POSTGRES_IMAGE:-collectoh/postgres:16} restart: unless-stopped environment: POSTGRES_USER: collectoh POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: collectoh volumes: - ${PGDATA_DIR:-./pgdata}:/var/lib/postgresql/data healthcheck: test: ['CMD-SHELL', 'pg_isready -h 127.0.0.1 -U collectoh -d collectoh'] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine restart: unless-stopped command: redis-server --save "" --appendonly no # queues only; nothing durable lives here volumes: - redis-data:/data volumes: # With 8 GB of RAM or more, the transcode cache can live in memory instead: # transcode-cache: # driver: local # driver_opts: { type: tmpfs, device: tmpfs, o: "size=8g" } transcode-cache: redis-data: