services: jellyfin: image: jellyfin/jellyfin:latest container_name: jellyfin restart: unless-stopped environment: - PUID=1000 - PGID=1000 - TZ=Europe/Berlin volumes: - ./config/jellyfin:/config - ./cache/jellyfin:/cache - /mnt/r2-media:/media:ro networks: - media-network - traefik-public depends_on: - r2-mount labels: - "traefik.enable=true" - "traefik.http.routers.jellyfin.rule=Host(`movies.jeffemmett.com`)" - "traefik.http.routers.jellyfin.entrypoints=web" - "traefik.http.routers.jellyfin.middlewares=jellyfin-headers" - "traefik.http.services.jellyfin.loadbalancer.server.port=8096" - "traefik.http.middlewares.jellyfin-headers.headers.customRequestHeaders.X-Forwarded-Proto=https" - "traefik.http.middlewares.jellyfin-headers.headers.customRequestHeaders.X-Forwarded-Host=movies.jeffemmett.com" - "traefik.docker.network=traefik-public" r2-mount: image: rclone/rclone:latest container_name: r2-mount restart: unless-stopped cap_add: - SYS_ADMIN devices: - /dev/fuse security_opt: - apparmor:unconfined environment: - RCLONE_CONFIG=/config/rclone/rclone.conf volumes: - ./config/rclone:/config/rclone:ro - /mnt/r2-media:/mnt/r2-media:shared - ./cache/rclone:/cache command: > mount r2:plex-media /mnt/r2-media --allow-other --allow-non-empty --vfs-cache-mode full --vfs-cache-max-size 50G --vfs-cache-max-age 72h --vfs-read-chunk-size 128M --vfs-read-chunk-size-limit 1G --buffer-size 512M --dir-cache-time 72h --poll-interval 15s --log-level INFO --cache-dir /cache networks: - media-network sonarr: image: linuxserver/sonarr:latest container_name: sonarr restart: unless-stopped environment: - PUID=1000 - PGID=1000 - TZ=Europe/Berlin volumes: - ./config/sonarr:/config - /mnt/r2-media/tv:/tv - ./downloads:/downloads ports: - 8989:8989 networks: - media-network depends_on: - r2-mount radarr: image: linuxserver/radarr:latest container_name: radarr restart: unless-stopped environment: - PUID=1000 - PGID=1000 - TZ=Europe/Berlin volumes: - ./config/radarr:/config - /mnt/r2-media/movies:/movies - ./downloads:/downloads ports: - 7878:7878 networks: - media-network depends_on: - r2-mount prowlarr: image: linuxserver/prowlarr:latest container_name: prowlarr restart: unless-stopped environment: - PUID=1000 - PGID=1000 - TZ=Europe/Berlin volumes: - ./config/prowlarr:/config ports: - 9696:9696 networks: - media-network transmission: image: linuxserver/transmission:latest container_name: transmission restart: unless-stopped environment: - PUID=1000 - PGID=1000 - TZ=Europe/Berlin - TRANSMISSION_WEB_HOME=/web volumes: - ./config/transmission:/config - ./downloads:/downloads - ./watch:/watch ports: - 9091:9091 - 51413:51413 - 51413:51413/udp networks: - media-network r2-sync: build: context: ./services/r2-sync dockerfile: Dockerfile container_name: r2-sync restart: unless-stopped environment: - R2_ACCOUNT_ID=${R2_ACCOUNT_ID} - R2_ACCESS_KEY=${R2_ACCESS_KEY} - R2_SECRET_KEY=${R2_SECRET_KEY} - R2_BUCKET=plex-media - WATCH_DIR=/downloads/complete - SYNC_INTERVAL=300 volumes: - ./downloads/complete:/downloads/complete:ro - ./config/rclone:/config/rclone:ro - ./logs/r2-sync:/logs networks: - media-network cost-monitor: build: context: ./services/cost-monitor dockerfile: Dockerfile container_name: cost-monitor restart: unless-stopped environment: - R2_BUCKET=plex-media - RCLONE_CONFIG=/config/rclone/rclone.conf - METRICS_PORT=9100 - UPDATE_INTERVAL=3600 volumes: - ./config/rclone:/config/rclone:ro ports: - 9100:9100 networks: - media-network networks: media-network: driver: bridge traefik-public: external: true