# jellybird + Jellyfin example stack. # # Setup: # 1. `cp .env.example .env` and paste your API keys into .env # 2. `cp config.example.yaml config.yaml` (already shipped: tweak if needed) # 3. `docker compose up -d` services: jellybird: build: . # image: ghcr.io/yourname/jellybird:latest # once published container_name: jellybird restart: unless-stopped ports: - "8097:8097" volumes: - ./config.yaml:/config.yaml:ro - media:/media - data:/data # - downloads:/downloads environment: # Base URL written into every .strm file. It must be reachable from # the PLAYBACK DEVICES, not just from Jellyfin: clients that direct # play (Roku, Android TV / Google TV) open this URL themselves. The # compose service name ("http://jellybird:8097") only resolves inside # the container network, so those clients fail to play unless they # use an external player. Set it in .env to this host's LAN address # or DNS name (e.g. http://192.168.1.50:8097), recreate the container, # then run "Scan All Libraries" in Jellyfin. No library wipe needed: # the next sync rewrites the .strm contents in place. JELLYBIRD_SERVER_EXTERNAL_URL: "${JELLYBIRD_SERVER_EXTERNAL_URL:-http://jellybird:8097}" # `${VAR:-}` defaults to empty and stays quiet when an integration is # off. jellybird needs at least ONE provider key; if neither is set the # container exits with a clear message — check `docker logs jellybird`. JELLYBIRD_REALDEBRID_API_KEY: "${JELLYBIRD_REALDEBRID_API_KEY:-}" JELLYBIRD_TORBOX_API_KEY: "${JELLYBIRD_TORBOX_API_KEY:-}" JELLYBIRD_TMDB_API_KEY: "${JELLYBIRD_TMDB_API_KEY:-}" JELLYBIRD_JELLYSEERR_URL: "${JELLYBIRD_JELLYSEERR_URL:-}" JELLYBIRD_JELLYSEERR_API_KEY: "${JELLYBIRD_JELLYSEERR_API_KEY:-}" JELLYBIRD_SERVER_TOKEN: "${JELLYBIRD_SERVER_TOKEN:-}" JELLYBIRD_ADMIN_USERNAME: "${JELLYBIRD_ADMIN_USERNAME:-}" JELLYBIRD_ADMIN_PASSWORD: "${JELLYBIRD_ADMIN_PASSWORD:-}" # Where "keep local" copies go; empty = inside the library. # JELLYBIRD_DOWNLOADS_PATH: /downloads jellyfin: image: jellyfin/jellyfin:latest container_name: jellyfin restart: unless-stopped ports: - "8096:8096" devices: - /dev/dri:/dev/dri volumes: - jellyfin-config:/config - media:/media:ro # Same path as in jellybird; add /downloads/Movies and # /downloads/Shows to your Jellyfin libraries. # - downloads:/downloads:ro # Ships the Jellybird Jellyfin plugin (built from the sibling # jellyfin-plugin-jellybird repo) straight into Jellyfin's plugin dir. # Jellyfin reads the version from plugin/meta.json, so the folder # name carries none and stays the same across plugin upgrades. - ./plugin:/config/plugins/Jellybird:z # Jellyfin reaches jellybird over the compose network using the # external_url above; no extra config needed. volumes: media: # Optional: store "keep local" downloads on a NAS (the library and .strm # files stay in `media`). Uncomment ONE block, the two `downloads` mounts # and JELLYBIRD_DOWNLOADS_PATH above, then fill in JELLYBIRD_NAS_* in .env. # See "Downloads on a NAS" in the README. # NFS: # downloads: # driver: local # driver_opts: # type: nfs # o: "addr=${JELLYBIRD_NAS_HOST},nfsvers=4,rw" # device: ":${JELLYBIRD_NAS_EXPORT}" # SMB / CIFS: # downloads: # driver: local # driver_opts: # type: cifs # o: "username=${JELLYBIRD_NAS_USER},password=${JELLYBIRD_NAS_PASSWORD},vers=3.0,uid=0,gid=0,file_mode=0664,dir_mode=0775" # device: "//${JELLYBIRD_NAS_HOST}/${JELLYBIRD_NAS_SHARE}" data: jellyfin-config: