A docker-compose for every Channels-related extension -- suitable for Portainer-Stacks!

I've just updated my docker-compose examples, in OliveTin-for-Channels, for the many excellent container projects that are suitable for use with Channels -- via the WebUI for Docker -- Portainer. I thought I'd post them here as well, for anyone not using OliveTin yet. :slight_smile:

The idea with the way these yamls are structured, is that you shouldn't need to do ANY editing of the yaml itself, all installation specific values should be set via the environment variables in that section of Portainer-Stacks:

In alphabetical order:

ADBTuner
services:
  adbtuner: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: Caution! This project is not open source, and is not available on GitHub
    # Docker Hub home for this project: https://hub.docker.com/u/turtletank99
    image: turtletank99/adbtuner:${TAG:-stable}
    container_name: adbtuner
    dns_search: ${DOMAIN:-localdomain} # Change to the name of your LAN's domain, which is usually local or localdomain
    init: true
    ports:
      - ${HOST_PORT:-5592}:5592 # Use the same port number the container is using, or optionally change it if the port is already in use on your host.
    environment:
      - KNOWN_STREAM_DEFAULT_TIMEOUT=${KNOWN_STREAM_DEFAULT_TIMEOUT:-8}
    volumes:
      - adbtuner:/app/.config
    restart: unless-stopped
volumes:
  adbtuner:
    name: ${HOST_VOLUME:-adbtuner_config}

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=stable
DOMAIN=localdomain
HOST_PORT=5592
KNOWN_STREAM_DEFAULT_TIMEOUT=8
HOST_VOLUME=adbtuner_config
ah4c (formerly AndroidHDMI-for-Channels)
services:
  # 2026.09.01
  # GitHub home for this project with setup instructions: https://github.com/sullrich/ah4c
  # Docker Hub home for this project: https://hub.docker.com/repository/docker/bnhf/ah4c
  ah4c: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    image: bnhf/ah4c:${TAG:-latest}
    container_name: ${CONTAINER_NAME:-ah4c}
    hostname: ${HOSTNAME:-ah4c}
    dns_search: ${DOMAIN:-localdomain} # Specify the name of your LAN's domain, usually local or localdomain
    runtime: ${DOCKER_RUNTIME:-runc} # Closed captions only. Set DOCKER_RUNTIME=nvidia for an NVIDIA GPU with the CUDA engine build. Requires the NVIDIA container toolkit.
    devices:
      - ${GPU_DEVICE:-/dev/null} # Closed captions only. Set GPU_DEVICE=/dev/dri to let the Vulkan engine build use an Intel or AMD GPU. Left at the default it passes /dev/null, which always exists and does nothing.
    ports:
      - ${HOST_PORT:-7654}:7654 # Port used by this ah4c proxy
    environment:
      - AH4C_COMPOSE=2026.09.01 # Compose file date stamp - do not change. The startup log flags it when out of date.
      # ── Proxy identity ──────────────────────────────────────────────────────
      - IPADDRESS=${IPADDRESS} # Hostname or IP address of this ah4c extension to be used in M3U file (also add port number if not in M3U)
      # ── Tuners ──────────────────────────────────────────────────────────────
      # One trio per tuner: TUNERn_IP is the box to tune; video comes from CMDn if set, otherwise ENCODERn_URL.
      - NUMBER_TUNERS=${NUMBER_TUNERS} # Number of tuners you'd like defined - add a matching TUNERn_IP, ENCODERn_URL and CMDn trio below for each beyond 9
      - TUNER1_IP=${TUNER1_IP} # Streaming device #1 with adb port in the form hostname:port or ip:port
      - ENCODER1_URL=${ENCODER1_URL} # Tuner #1 source URL (http://hostname/stream). Streamed directly when CMD1 is blank; otherwise referenced by CMD1 as ${ENCODER1_URL}.
      - CMD1=${CMD1} # Optional tuner #1 command; ah4c streams its stdout (end it with "-f mpegts -") instead of fetching ENCODER1_URL. No shell.
      - TUNER2_IP=${TUNER2_IP} # Streaming device #2 with adb port in the form hostname:port or ip:port
      - ENCODER2_URL=${ENCODER2_URL} # Tuner #2 source URL. Streamed directly when CMD2 is blank; otherwise referenced by CMD2 as ${ENCODER2_URL}.
      - CMD2=${CMD2} # Optional tuner #2 command; ah4c streams its stdout instead of fetching ENCODER2_URL. See CMD1.
      - TUNER3_IP=${TUNER3_IP} # Streaming device #3 with adb port in the form hostname:port or ip:port
      - ENCODER3_URL=${ENCODER3_URL} # Tuner #3 source URL. Streamed directly when CMD3 is blank; otherwise referenced by CMD3 as ${ENCODER3_URL}.
      - CMD3=${CMD3} # Optional tuner #3 command; ah4c streams its stdout instead of fetching ENCODER3_URL. See CMD1.
      - TUNER4_IP=${TUNER4_IP} # Streaming device #4 with adb port in the form hostname:port or ip:port
      - ENCODER4_URL=${ENCODER4_URL} # Tuner #4 source URL. Streamed directly when CMD4 is blank; otherwise referenced by CMD4 as ${ENCODER4_URL}.
      - CMD4=${CMD4} # Optional tuner #4 command; ah4c streams its stdout instead of fetching ENCODER4_URL. See CMD1.
      - TUNER5_IP=${TUNER5_IP} # Streaming device #5 with adb port in the form hostname:port or ip:port
      - ENCODER5_URL=${ENCODER5_URL} # Tuner #5 source URL. Streamed directly when CMD5 is blank; otherwise referenced by CMD5 as ${ENCODER5_URL}.
      - CMD5=${CMD5} # Optional tuner #5 command; ah4c streams its stdout instead of fetching ENCODER5_URL. See CMD1.
      - TUNER6_IP=${TUNER6_IP} # Streaming device #6 with adb port in the form hostname:port or ip:port
      - ENCODER6_URL=${ENCODER6_URL} # Tuner #6 source URL. Streamed directly when CMD6 is blank; otherwise referenced by CMD6 as ${ENCODER6_URL}.
      - CMD6=${CMD6} # Optional tuner #6 command; ah4c streams its stdout instead of fetching ENCODER6_URL. See CMD1.
      - TUNER7_IP=${TUNER7_IP} # Streaming device #7 with adb port in the form hostname:port or ip:port
      - ENCODER7_URL=${ENCODER7_URL} # Tuner #7 source URL. Streamed directly when CMD7 is blank; otherwise referenced by CMD7 as ${ENCODER7_URL}.
      - CMD7=${CMD7} # Optional tuner #7 command; ah4c streams its stdout instead of fetching ENCODER7_URL. See CMD1.
      - TUNER8_IP=${TUNER8_IP} # Streaming device #8 with adb port in the form hostname:port or ip:port
      - ENCODER8_URL=${ENCODER8_URL} # Tuner #8 source URL. Streamed directly when CMD8 is blank; otherwise referenced by CMD8 as ${ENCODER8_URL}.
      - CMD8=${CMD8} # Optional tuner #8 command; ah4c streams its stdout instead of fetching ENCODER8_URL. See CMD1.
      - TUNER9_IP=${TUNER9_IP} # Streaming device #9 with adb port in the form hostname:port or ip:port
      - ENCODER9_URL=${ENCODER9_URL} # Tuner #9 source URL. Streamed directly when CMD9 is blank; otherwise referenced by CMD9 as ${ENCODER9_URL}.
      - CMD9=${CMD9} # Optional tuner #9 command; ah4c streams its stdout instead of fetching ENCODER9_URL. See CMD1.
      # ── Streaming app and DVR ───────────────────────────────────────────────
      - STREAMER_APP=${STREAMER_APP} # Streaming device name and streaming app you're using in the form scripts/streamer/app (use lowercase with slashes between as shown)
      - PYATV=${PYATV:-false} # Set to TRUE to run docker-start-pyatv.sh at container start for Apple TV tuners via pyatv, instead of the default docker-start.sh used for adb-based tuners. Case-insensitive; anything else runs the default.
      - CHANNELSIP=${CHANNELSIP} # Hostname or IP address of the Channels DVR server itself
      # ── Failure alerts ──────────────────────────────────────────────────────
      # Email via SMTP and/or a webhook GET, sent when a tune fails. Leave blank to disable.
      - ALERT_SMTP_SERVER=${ALERT_SMTP_SERVER} # The domainname:port of the SMTP server you'll be using like smtp.gmail.com:587. This is for sending ah4c alerts if tuning fails.
      - ALERT_AUTH_SERVER=${ALERT_AUTH_SERVER} # The auth server for the e-mail you'll be using like smtp.gmail.com
      - ALERT_EMAIL_FROM=${ALERT_EMAIL_FROM} # The e-mail address you'd like your ah4c failure alert e-mails to show as being from.
      - ALERT_EMAIL_PASS=${ALERT_EMAIL_PASS} # Gmail and Yahoo both support the creation of app-specific e-mail passwords, and this is the way to go! It's NOT recommended to use your everyday e-mail password.
      - ALERT_EMAIL_TO=${ALERT_EMAIL_TO} # The e-mail address you'd like your alert e-mails sent to.
      - ALERT_WEBHOOK_URL=${ALERT_WEBHOOK_URL} # URL to GET when an alert fires (same failures that trigger the e-mail); put $reason in the URL and it's replaced with the URL-encoded message. Blank disables it.
      # ── Guide tuning and content updates ────────────────────────────────────
      - LIVETV_ATTEMPTS=${LIVETV_ATTEMPTS} # For FireTV Live Guide tuning only, set maximum number of attempts at finding the desired channel
      - CREATE_M3US=${CREATE_M3US:-false} # Set to true to create device-specific M3Us for use with Amazon Prime Premium channels -- requires a FireTV device
      - UPDATE_SCRIPTS=${UPDATE_SCRIPTS:-true} # Set to true if you'd like the sample scripts and STREAMER_APP scripts updated whether they exist or not
      - UPDATE_M3US=${UPDATE_M3US:-true} # Set to true if you'd like the sample m3us updated whether they exist or not
      # ── Timezone and session handling ───────────────────────────────────────
      - TZ=${TZ} # Your local timezone in Linux "tz" format
      - SPEED_MODE=${SPEED_MODE:-false} # Set to false if you'd like the target streaming app to be closed after each tuning cycle (limited script support).
      - KEEP_WATCHING=${KEEP_WATCHING} # In supported scripts, set the delay before resending a tuning deeplink to prevent "Are you still watching?" type messages. Examples: Use 4h for 4 hours or 240m for 240 minutes.
      # ── Autocrop (LinkPi encoders only) ─────────────────────────────────────
      - AUTOCROP_CHANNELS=${AUTOCROP_CHANNELS} # Space separated list of channels (by number) with black borders on 4 sides to autocrop while maintaining aspect ratio. Requires LinkPi Encoder!
      - LINKPI_HOSTNAME=${LINKPI_HOSTNAME} # Hostname or IP of the LinkPi Encoder's web API. Required for AUTOCROP_CHANNELS.
      - LINKPI_USERNAME=${LINKPI_USERNAME} # Username for the LinkPi Encoder's web API. Required for AUTOCROP_CHANNELS.
      - LINKPI_PASSWORD=${LINKPI_PASSWORD} # Password for the LinkPi Encoder's web API. Required for AUTOCROP_CHANNELS; not currently read by the bundled scripts, which log in with the LinkPi default password instead.
      # ── Custom startup script ───────────────────────────────────────────────
      - USER_SCRIPT=${USER_SCRIPT} # Path to a custom script to run alongside ah4c at container startup. Blank runs nothing extra.
      # ── Recording continuity and playback timing ────────────────────────────
      # Keep recordings starting on the program and free of gaps within the DVR's 30s tune window.
      - NULL_FRAME_INSERTION=${NULL_FRAME_INSERTION:-false} # Set to TRUE to fill encoder stalls with MPEG-TS NULL packets (PID 0x1FFF) so the DVR never sees a zero-byte gap mid-recording. Case-insensitive (true/True/TRUE all work); anything else, including 1/yes, leaves the feature off.
      - PLAYBACK_DETECTION=${PLAYBACK_DETECTION:-false} # Set to TRUE to hold the stream until the device reports audio playing and the picture moving, then start on a keyframe, so recording begins on the program, not the loading screen. Requires adb; network tuners only. Case-insensitive; anything but true leaves it off.
      - PLAYBACK_STATIC_TIMEOUT=${PLAYBACK_STATIC_TIMEOUT} # Only used with PLAYBACK_DETECTION=TRUE. Seconds the box may keep its prior player/session before the check falls back to gating on motion alone. Default 2 suits Ospreys; apps like DirecTV that hold one player across channel changes need more. 0 or unset uses the default.
      - PLAYBACK_DELAY=${PLAYBACK_DELAY} # Hold every tune this long before handing the DVR the program, so a slow-starting app still records within the DVR's 30s window. Black or a mounted pre-roll fills the wait; the box's own video is never passed through. Accepts a bare number (seconds) or a duration like 30s/1m, capped at 10m. Network tuners only. Empty or 0 disables it.
      - ENCODER_CODEC=${ENCODER_CODEC:-h264} # The video codec your encoder outputs: h264 (default) or h265. Filler black/pre-roll must match it, or playback won't cross to the program at hand-off. Pre-roll video is converted to match; an existing H.265 stream is copied. Leave at h264 unless your encoder is H.265. Case-insensitive; h265/hevc both work.
      - HEARTBEAT_INTERVAL=${HEARTBEAT_INTERVAL:-0} # In supported scripts (currently osprey), seconds between keepalive keyevents sent during playback to stop the app's UI inactivity timer from resetting the stream. Set to 0 to disable.
      # ── NVIDIA GPU ──────────────────────────────────────────────────────────
      # Used by the CUDA caption engine and any CMDn calling h264_nvenc/hevc_nvenc. Needs the NVIDIA container toolkit.
      - NVIDIA_VISIBLE_DEVICES=${NVIDIA_VISIBLE_DEVICES} # For the CUDA caption engine and/or an NVENC CMDn. Set to all alongside DOCKER_RUNTIME=nvidia to expose an NVIDIA GPU. Empty means no GPU and is the default.
      - NVIDIA_DRIVER_CAPABILITIES=${NVIDIA_DRIVER_CAPABILITIES} # Set to compute,utility for the CUDA caption engine. A CMDn using h264_nvenc/hevc_nvenc also needs video - use compute,utility,video (or all).
    volumes:
      - ${HOST_DIR}/ah4c/scripts:/opt/scripts # pre/stop/bmitune.sh scripts will be stored in this bound host directory under streamer/app
      - ${HOST_DIR}/ah4c/m3u:/opt/m3u # m3u files will be stored here and hosted at http://<hostname or ip>:7654/m3u for use in Channels DVR - Custom Channels settings
      - ${HOST_DIR}/ah4c/adb:/root/.android # Persistent data directory for adb keys
      - ${HOST_DIR}/ah4c/captions:/opt/captions # Closed caption settings, and the speech model, engine and any GPU driver downloaded from the Closed Captions page. Stays empty unless you turn captions on
      - ${PREROLL_FILE:-${HOST_DIR}/ah4c/preroll}:/opt/preroll # A video or still image shown to the DVR instead of NULL packets, during a PLAYBACK_DELAY/PLAYBACK_DETECTION hold or a NULL_FRAME_INSERTION stall. Set PREROLL_FILE to a host path, or drop the file into this directory. Anything ffmpeg reads; prepared once at startup, loops until the real stream is ready
    restart: unless-stopped

TAG=latest
CONTAINER_NAME=ah4c
HOSTNAME=ah4c
DOMAIN=localdomain tailxxxxx.ts.net
DOCKER_RUNTIME=runc
GPU_DEVICE=/dev/dri
HOST_PORT=7654
IPADDRESS=docker6:7654
NUMBER_TUNERS=5
TUNER1_IP=firestick-desk1:5555
ENCODER1_URL=http://linkpi-encoder2:8090/stream0
CMD1=
TUNER2_IP=firestick-desk2:5555
ENCODER2_URL=http://linkpi-encoder2:8090/stream1
CMD2=
TUNER3_IP=firestick-desk3:5555
ENCODER3_URL=http://linkpi-encoder2:8090/stream2
CMD3=
TUNER4_IP=firestick-desk4:5555
ENCODER4_URL=http://linkpi-encoder2:8090/stream3
CMD4=
TUNER5_IP=firestick-desk5:5555
ENCODER5_URL=http://linkpi-encoder2:8090/stream4
CMD5=
TUNER6_IP=
ENCODER6_URL=
CMD6=
TUNER7_IP=
ENCODER7_URL=
CMD7=
TUNER8_IP=
ENCODER8_URL=
CMD8=
TUNER9_IP=
ENCODER9_URL=
CMD9=
STREAMER_APP=scripts/firetv/dtvstreamdeeplinks
PYATV=false
CHANNELSIP=media-server10
ALERT_SMTP_SERVER=smtp.gmail.com:587
ALERT_AUTH_SERVER=smtp.gmail.com
[email protected]
ALERT_EMAIL_PASS=xxxxxxxxxxxxxxxx
[email protected]
ALERT_WEBHOOK_URL=
LIVETV_ATTEMPTS=
CREATE_M3US=false
UPDATE_SCRIPTS=true
UPDATE_M3US=true
TZ=America/Denver
SPEED_MODE=false
KEEP_WATCHING=235m
AUTOCROP_CHANNELS=
LINKPI_HOSTNAME=
LINKPI_USERNAME=
LINKPI_PASSWORD=
USER_SCRIPT=
NULL_FRAME_INSERTION=false
PLAYBACK_DETECTION=true
PLAYBACK_STATIC_TIMEOUT=12
PLAYBACK_DELAY=
PREROLL_FILE=
ENCODER_CODEC=h264
HEARTBEAT_INTERVAL=
NVIDIA_VISIBLE_DEVICES=
NVIDIA_DRIVER_CAPABILITIES=
HOST_DIR=/data

channels-app-remote
services:
  dvr-remote: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/nuken/channels-app-remote.
    # Docker container home for this project with setup instructions: https://hub.docker.com/r/rcvaughn2/channels-app-remote.
    image: rcvaughn2/channels-app-remote:${TAG:-latest} # Add the tag like latest or test to the environment variables below.
    container_name: dvr-remote
    ports:
      - ${HOST_PORT:-5000}:5000 # The container port number (to the right of the colon) needs to be left as is. Set the environment variable to the same, or change it if there's a conflict.
    environment:
      - CHANNELS_APP_CLIENTS=${CHANNELS_APP_CLIENTS} # A comma separated list of Channels clients in the form "iPad:192.168.1.2,Apple TV:192.168.1.3"
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=5010
CHANNELS_APP_CLIENTS=Family Room TV:192.168.86.35,Master TV:192.168.86.21,Front Door TV:192.168.86.60

channels-app-remote-plus
services:
  dvr-remote: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/nuken/channels-app-remote-plus.
    # Docker container home for this project with setup instructions: https://hub.docker.com/r/rcvaughn2/channels-remote-plus.
    image: rcvaughn2/channels-remote-plus:${TAG:-latest} # Add the tag like latest or test to the environment variables below.
    container_name: channels-remote
    ports:
      - ${HOST_PORT:-5000}:5000 # The container port number (to the right of the colon) needs to be left as is. Set the environment variable to the same, or change it if there's a conflict.
    environment:
      - CHANNELS_DVR_SERVERS=${CHANNELS_DVR_SERVERS}  # A comma separated list of Channels DVRs by ip:port or hostname:port.
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest # Add the tag like latest or test to the environment variables below.
HOST_PORT=5020 # The container port number (to the right of the colon) needs to be left as is. Set the environment variable to the same, or change it if there's a conflict.
CHANNELS_DVR_SERVERS=192.168.86.64:8089,192.168.1.100:8090 # A comma separated list of Channels DVRs by ip:port or hostname:port.

Channels DVR
services:
  channels-dvr: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # Docker Hub home for this project: https://hub.docker.com/r/fancybits/channels-dvr
    image: fancybits/channels-dvr:${TAG:-latest}
    container_name: channels-dvr
    #devices:
      #- /dev/dri:/dev/dri
    ports:
      - ${HOST_PORT}:${CHANNELS_PORT}
    environment:
      - CHANNELS_PORT=${CHANNELS_PORT}
      - TZ=${TZ}
    volumes:
      - ${HOST_DIR}/channels-dvr:/channels-dvr
      - ${DVR_SHARE}:${DVR_CONTAINER_DIR}
    #network_mode: host
    restart: unless-stopped
#volumes: # use this section if you've setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /channels-dvr inside the container
  #channels-dvr:
    #external: ${VOL_EXTERNAL}
    #name: ${VOL_NAME}

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=tve
HOST_PORT=8089
CHANNELS_PORT=8089
TZ=America/Denver
HOST_DIR=/data
DVR_SHARE=/mnt/dvr
DVR_CONTAINER_DIR=/shares/DVR

ChannelWatch
services:
  channelwatch: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/CoderLuii/ChannelWatch.
    # Docker container home for this project with setup instructions: https://hub.docker.com/r/coderluii/channelwatch.
    image: coderluii/channelwatch:${TAG:-latest}
    container_name: channelwatch
    init: true
    ports:
      - ${HOST_PORT:-8501}:8501
    environment:
      - TZ=${TZ:-America/New_York}
      - CHANNELWATCH_SECRET_STORAGE_KEY=${CHANNELWATCH_SECRET_STORAGE_KEY:-}
    volumes:
      - ${HOST_DIR}/channelwatch:/config
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=8501
TZ=America/New_York
CHANNELWATCH_SECRET_STORAGE_KEY=
HOST_DIR=/data

cc4c (ChromeCapture-for-Channels)
services:
  cc4c: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/bnhf/chrome-capture-for-channels.
    # Docker container home for this project with setup instructions: https://hub.docker.com/r/bnhf/cc4c.
    image: bnhf/cc4c:${TAG:-latest}
    container_name: cc4c
    shm_size: '1gb'
    #devices:
      #- /dev/dri:/dev/dri # Uncomment for Intel Quick Sync (GPU) access
    ports:
      - ${HOST_PORT:-5589}:${CC4C_PORT:-5589} # cc4c proxy port
      - ${HOST_VNC_PORT:-5900}:5900 # VNC port for entering credentials.
    environment:
      - VIDEO_BITRATE=${VIDEO_BITRATE:-6000000} # Video bitrate in bits per second  [number] [default: 6000000]
      - AUDIO_BITRATE=${AUDIO_BITRATE:-256000} # Audio bitrate in bits per second  [number] [default: 256000]
      - FRAMERATE=${FRAMERATE:-30} # Minimum frame rate  [number] [default: 30]
      - CC4C_PORT=${CC4C_PORT:-5589} # Port number for the server  [number] [default: 5589]
      - VIDEO_WIDTH=${VIDEO_WIDTH:-1920} # Video width in pixels (e.g., 1920 for 1080p)  [number] [default: 1920]
      - VIDEO_HEIGHT=${VIDEO_HEIGHT:-1080} # Video height in pixels (e.g., 1080 for 1080p)  [number] [default: 1080]
      - VIDEO_CODEC=${VIDEO_CODEC:-h264_nvenc} # Video codec (e.g., h264_nvenc, h264_qsv, h264_amf, h264_vaapi)  [string] [default: "h264_nvenc"]
      - AUDIO_CODEC=${AUDIO_CODEC:-aac} # Audio codec (e.g., aac, opus)  [string] [default: "aac"]
      - TZ=${TZ} # Your local timezone in Linux "tz" format.
    volumes:
      - cookies:/home/chrome/chromedata/Default/Cookies # Creates a persistent Docker Volume in /var/lib/docker/volumes for Chrome cookie data.
      - logins:/home/chrome/chromedata/Default/Login Data # Creates a persistent Docker Volume in /var/lib/docker/volumes for Chrome user login data.
      - localstorage:/home/chrome/chromedata/Default/Local Storage # Creates a persistent Docker Volume in /var/lib/docker/volumes for Chrome user local data.
      - prefs:/home/chrome/chromedata/Default/Preferences # Creates a persistent Docker Volume in /var/lib/docker/volumes for Chrome user preferences data.
      - secure:/home/chrome/chromedata/Default/Secure Preferences # Creates a persistent Docker Volume in /var/lib/docker/volumes for Chrome user secure data.
    restart: unless-stopped
    
volumes:
  cookies:
  logins:
  localstorage:
  prefs:
  secure:

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=5589
CC4C_PORT=5589
HOST_VNC_PORT=5900
VIDEO_BITRATE=9500000
AUDIO_BITRATE=256000
FRAMERATE=60
VIDEO_WIDTH=1920
VIDEO_HEIGHT=1080
VIDEO_CODEC=h264_vaapi
AUDIO_CODEC=aac
TZ=America/Denver

EPlusTV
services:
  eplustv: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/tonywagner/EPlusTV-NEW
    # Docker Hub home for this project: https://hub.docker.com/r/tonywagner/eplustv
    image: tonywagner/eplustv:${TAG:-latest}
    container_name: eplustv
    ports:
      - ${HOST_PORT}:${PORT} # For use with Portainer this port is being mapped to 8185, as Portainer uses port 8000
    environment:
      - START_CHANNEL=${START_CHANNEL} # What the first channel number should be.
      - NUM_OF_CHANNELS=${NUM_OF_CHANNELS} # How many channels to create? This is dependent on the networks you are using. A good number to start with is >= 150 if you are using ESPN+.
      - LINEAR_CHANNELS=${LINEAR_CHANNELS} # Break out dedicated linear channels.
      - BASE_URL=${BASE_URL} # If using a reverse proxy, m3u will be generated with this uri base.
      - PROXY_SEGMENTS=${PROXY_SEGMENTS} # Proxy keyed *.ts files.
      - PUID=${PUID} # Current user ID. Use if you have permission issues. Needs to be combined with PGID.
      - PGID=${PGID} # Current group ID. Use if you have permission issues. Needs to be combined with PUID.
      - PORT=${PORT} # Port the API will be served on. You can set this if it conflicts with another service in your environment.
    volumes:
      - eplustv:/app/config
    restart: unless-stopped
volumes:
  eplustv:
    name: ${HOST_VOLUME}

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=8185
START_CHANNEL=1
NUM_OF_CHANNELS=150
LINEAR_CHANNELS=false
BASE_URL=default
PROXY_SEGMENTS=false
PUID=1000
PGID=1000
PORT=8000
HOST_VOLUME=eplustv_config

FastChannels
services:
  fastchannels: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/kineticman/FastChannels
    # Docker container home for this project: https://github.com/kineticman/FastChannels/pkgs/container/fastchannels
    image: ghcr.io/kineticman/fastchannels:${TAG:-latest}
    container_name: fastchannels
    dns_search: ${DOMAIN:-localdomain}
    ports:
      - ${HOST_PORT:-5523}:5523
    environment:
      - TZ=${TZ:-America/New_York}
      - FASTCHANNELS_SERVER_URL=${FASTCHANNELS_SERVER_URL:-http://192.168.1.50:5523}
      - CHANNELS_DVR_SERVER_URL=${CHANNELS_DVR_SERVER_URL:-http://192.168.1.60:8089}
    volumes:
      - db_data:/data
    restart: unless-stopped
volumes:
  db_data:

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
DOMAIN=localdomain
HOST_PORT=5523
TZ=America/New_York
FASTCHANNELS_SERVER_URL=http://192.168.1.50:5523
CHANNELS_DVR_SERVER_URL=http://192.168.1.60:8089

FileBot
services:
  filebot: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/jlesage/docker-filebot
    # Docker Hub home for this project: https://hub.docker.com/r/jlesage/filebot
    image: jlesage/filebot:${TAG:-latest}
    container_name: filebot
    ports:
      - ${HOST_PORT}:5800 # The container port number (to the right of the colon) needs to be left as is. Set the environment variable to the same, or change it if there's a conflict.
    environment:
      - DARK_MODE=${DARK_MODE} # 0=off, 1=on
    volumes:
      - ${HOST_DIR}/filebot:/config:rw # Add the parent directory on your Docker host you'd like to use.
      - ${DVR_SHARE}:/storage:rw # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR network share.
#volumes: # use this section if you've setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /storage inside the container
  #channels-dvr:
    #external: ${VOL_EXTERNAL}
    #name: ${VOL_NAME}

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=5800
DARK_MODE=1
HOST_DIR=/data
DVR_SHARE=/mnt/dvr

free-iptv-channels
services:
  free-iptv-channels:  # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/dtankdempse/free-iptv-channels
    # Docker Hub home for this project: https://hub.docker.com/r/dtankdemp/free-iptv-channels
    image: dtankdemp/free-iptv-channels:${TAG:-latest}
    container_name: free-iptv-channels
    ports:
      - ${PORT:-4242}:4242
    environment:
      - TZ=${TIMEZONE:-UTC}
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
PORT=7969
TIMEZONE=America/New_York

FrndlyTV-for-Channels
services:
  frndlytv-for-channels: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/matthuisman/frndlytv-for-channels
    # Matt Huisman's webpage for this project: https://www.matthuisman.nz/2021/11/frndly-tv-for-channels.html
    # Docker Hub home for this project: https://hub.docker.com/r/matthuisman/frndlytv-for-channels
    image: matthuisman/frndlytv-for-channels:${TAG:-latest}
    container_name: frndlytv-for-channels
    ports:
      - ${HOST_PORT}:80
    environment:
      - IP=${IP} # For Geo-locating FrndlyTV to a different area.
      - USERNAME=${USERNAME} # FrndlyTV username (the email you used to sign-up)
      - PASSWORD=${PASSWORD} # FrndlyTV password (the password you chose when you signed-up)
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=8183
IP=<yourrealorfakeipforgeolocation>
USERNAME=<yourfrndlytvusername>
PASSWORD=<yourfrndlytvpassword>

FruitDeepLinks
services:
  fruitdeeplinks: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/kineticman/FruitDeepLinks
    # Docker container home for this project: https://github.com/kineticman/FruitDeepLinks/pkgs/container/fruitdeeplinks
    image: ghcr.io/kineticman/fruitdeeplinks:${TAG:-latest}
    container_name: fruitdeeplinks
    hostname: fruitdeeplinks
    shm_size: '2gb'
    ports:
      - ${FRUIT_HOST_PORT:-6655}:6655
    environment:
      - TZ=${TZ:-America/New_York}
      - SERVER_URL=${SERVER_URL:-http://localhost:6655}
      - FRUIT_HOST_PORT=${FRUIT_HOST_PORT:-6655}
      - CC_SERVER=${CC_SERVER:-localhost}
      - CC_PORT=${CC_PORT:-8080}
      - CHANNELS_DVR_IP=${CHANNELS_DVR_IP:-}
      - CHANNELS_SOURCE_NAME=${CHANNELS_SOURCE_NAME:-fruitdeeplinks}
      - FRUIT_DB_PATH=${FRUIT_DB_PATH:-/app/data/fruit_events.db}
      - OUT_DIR=${OUT_DIR:-/app/out}
      - LOG_DIR=${LOG_DIR:-/app/logs}
      - LOG_LEVEL=${LOG_LEVEL:-INFO}
      - FRUIT_LANES=${FRUIT_LANES:-50}
      - FRUIT_LANE_START_CH=${FRUIT_LANE_START_CH:-9000}
      - FRUIT_DAYS_AHEAD=${FRUIT_DAYS_AHEAD:-7}
      - FRUIT_PADDING_MINUTES=${FRUIT_PADDING_MINUTES:-45}
      - FRUIT_PLACEHOLDER_BLOCK_MINUTES=${FRUIT_PLACEHOLDER_BLOCK_MINUTES:-60}
      - FRUIT_PLACEHOLDER_EXTRA_DAYS=${FRUIT_PLACEHOLDER_EXTRA_DAYS:-5}
      - CDVR_DVR_PATH=${CDVR_DVR_PATH:-}
      - CDVR_SERVER_PORT=${CDVR_SERVER_PORT:-8089}
      - CDVR_API_PORT=${CDVR_API_PORT:-57000}
      - HEADLESS=${HEADLESS:-true}
      - NO_NETWORK=${NO_NETWORK:-false}
      - AUTO_REFRESH_ENABLED=${AUTO_REFRESH_ENABLED:-true}
      - AUTO_REFRESH_TIME=${AUTO_REFRESH_TIME:-02:30}
    volumes:
      - ${HOST_DIR:-.}/FruitDeepLinks/data:/app/data
      - ${HOST_DIR:-.}/FruitDeepLinks/out:/app/out
      - ${HOST_DIR:-.}/FruitDeepLinks/logs:/app/logs
      - ${CDVR_DVR_PATH:-/tmp/fruitdeeplinks-novol}:/mnt/dvr
    restart: unless-stopped
    logging:
      driver: json-file
      options:
        max-size: 10m
        max-file: 3

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

FRUIT_HOST_PORT=6655
TZ=America/Denver
SERVER_URL=http://htpc6:6655
CC_SERVER=cc4c2
CC_PORT=5589
CHANNELS_DVR_IP=media-server8
CHANNELS_SOURCE_NAME=FruitDeepLinks
FRUIT_LANE_START_CH=14001
FRUIT_LANES=100
CDVR_DVR_PATH=
CDVR_SERVER_PORT=8089
CDVR_API_PORT=57000
AUTO_REFRESH_ENABLED=true
AUTO_REFRESH_TIME=02:30
HOST_DIR=/data

MediaInfo
services:
  mediainfo: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/jlesage/docker-mediainfo
    # Docker Hub home for this project: https://hub.docker.com/r/jlesage/mediainfo
    image: jlesage/mediainfo:${TAG:-latest} # The version of the container you'd like to run. Typically "latest".
    container_name: mediainfo
    ports:
      - ${HOST_PORT}:5800 # The container port number (to the right of the colon) needs to be left as is. Set the environment variable to the same, or change it if there's a conflict.
    environment:
      - DARK_MODE=${DARK_MODE} # 0=off, 1=on.
    volumes:
      - ${HOST_DIR}/mediainfo:/config:rw # Add the parent directory on your Docker host you'd like to use.
      - ${DVR_SHARE}:/storage:ro # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR network share.
#volumes: # use this section if you've setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /storage inside the container.
  #channels-dvr:
    #external: ${VOL_EXTERNAL}
    #name: ${VOL_NAME}

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=5801
DARK_MODE=1
HOST_DIR=/data
DVR_SHARE=/mnt/dvr

mlbserver
services:
  mlbserver: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/tonywagner/mlbserver
    # Docker Hub home for this project: https://hub.docker.com/r/tonywagner/mlbserver
    image: tonywagner/mlbserver:${TAG:-latest}
    container_name: mlbserver
    ports:
      - ${HOST_PORT}:9999
    environment:
      - TZ=${TZ}
      - data_directory=${DATA_DIRECTORY}
      - account_username=${ACCOUNT_USERNAME}
      - account_password=${ACCOUNT_PASSWORD}
      - fav_teams=${FAV_TEAMS}
      - zip_code=${ZIP_CODE}
    volumes:
      - ${HOST_DIR}/mlbserver:${DATA_DIRECTORY}
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=9999
TZ=America/Denver
DATA_DIRECTORY=/mlbserver/data_directory
[email protected]
ACCOUNT_PASSWORD=password
FAV_TEAMS=0
ZIP_CODE=0
HOST_DIR=/data

OliveTin-for-Channels
services:
  olivetin: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/bnhf/OliveTin.
    # Docker container home for this project with setup instructions: https://hub.docker.com/r/bnhf/olivetin.
    image: bnhf/olivetin:${TAG:-latest} # Add the tag like latest or test to the environment variables below.
    container_name: ${OLIVETIN_NAME:-olivetin}${EZ_START}
    hostname: ${OLIVETIN_NAME:-olivetin}${EZ_START}
    dns_search: ${DOMAIN:+${DOMAIN}} # For Tailscale users using Magic DNS, add your Tailnet (tailxxxxx.ts.net) to use hostnames for remote nodes, otherwise use your local domain name.
    ports:
      - ${HOST_PORT:-1337}:1337
    environment:
      - OLIVETIN_COMPOSE=2025.08.25${EZ_START} # Do not change this value.
      - CHANNELS_DVR=${CHANNELS_DVR_HOST}:${CHANNELS_DVR_PORT:-8089} # Add your Channels DVR server in the form CHANNELS_DVR_HOST=<hostname or ip> and CHANNELS_DVR_PORT=<port>.
      - CHANNELS_DVR_ALTERNATES=${CHANNELS_DVR2_HOST:+${CHANNELS_DVR2_HOST}:${CHANNELS_DVR2_PORT}}${CHANNELS_DVR3_HOST:+ ${CHANNELS_DVR3_HOST}:${CHANNELS_DVR3_PORT}} # Space separated list of alternate Channels DVR servers to choose from in the form hostname:port or ip:port.
      - CHANNELS_CLIENTS=${CHANNELS_CLIENTS} # Space separated list of Channels DVR clients you'd like notifications sent to in the form hostname or IP.
      - ALERT_SMTP_SERVER=${ALERT_SMTP_SERVER} # SMTP server to use for sending alert e-mails. smtp.gmail.com:587 for example.
      - ALERT_EMAIL_FROM=${ALERT_EMAIL_FROM} # Sender address for alert e-mails.
      - ALERT_EMAIL_PASS=${ALERT_EMAIL_PASS} # SMTP "app" password established through GMail or Yahoo Mail. Do not use your everyday e-mail address.
      - ALERT_EMAIL_TO=${ALERT_EMAIL_TO} # Recipient address for alert e-mails.
      - UPDATE_YAMLS=${UPDATE_YAMLS:-true} # Set this to true to update config.yaml.
      - UPDATE_SCRIPTS=${UPDATE_SCRIPTS:-true} # Set this to true to update all included scripts.
      - TZ=${TZ} # Add your local timezone in standard linux format. E.G. US/Eastern, US/Central, US/Mountain, US/Pacific, etc.
      - PORTAINER_TOKEN=${PORTAINER_TOKEN} # Generate via <username> dropdown (upper right of WebUI), "My account", API tokens.
      - PORTAINER_HOST=${PORTAINER_HOST:-$CHANNELS_DVR_HOST} # Hostname or IP of the Docker host you're running Portainer on.
      - PORTAINER_PORT=${PORTAINER_PORT:-9443} # https port you're running Portainer on. 9443 is the default.
      - PORTAINER_ENV=${PORTAINER_ENV:-2} # Set this is if you're using an alternate Portainer Environment for some reason. 2 is the default.
      - PORTAINER_NAME=${PORTAINER_NAME:-local} # If you'd like to use a Portainer Environment other than "local", set this value to the environment's name (case sensitive).
      - PERSISTENT_LOGS=${PERSISTENT_LOGS:-false} # For supported Actions, log files are retained on an ongoing basis. false is the default.
    volumes:
      - ${HOST_DIR:-/unused}${HOST_DIR:+/olivetin:/config} # Add the parent directory on your Docker host you'd like to use.
      - ${DVR_SHARE:-/unused}${DVR_SHARE:+:/mnt/${CHANNELS_DVR_HOST}-${CHANNELS_DVR_PORT}} # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR network share.
      - ${LOGS_SHARE:-/unused}${LOGS_SHARE:+:/mnt/${CHANNELS_DVR_HOST}-${CHANNELS_DVR_PORT}_logs} # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR logs network share.
      - ${TUBEARCHIVIST_SHARE:-/unused}${TUBEARCHIVIST_SHARE:+:/mnt/${CHANNELS_DVR_HOST}-${CHANNELS_DVR_PORT}_ta} # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your TubeArchivist videos network share.
      - ${DVR2_SHARE:-/unused}${DVR2_SHARE:+:/mnt/${CHANNELS_DVR2_HOST}-${CHANNELS_DVR2_PORT}} # Note that these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between).
      - ${LOGS2_SHARE:-/unused}${LOGS2_SHARE:+:/mnt/${CHANNELS_DVR2_HOST}-${CHANNELS_DVR2_PORT}_logs} # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR logs network share.
      - ${TUBEARCHIVIST2_SHARE:-/unused}${TUBEARCHIVIST2_SHARE:+:/mnt/${CHANNELS_DVR2_HOST}-${CHANNELS_DVR2_PORT}_ta} # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your TubeArchivist videos network share.
      - ${DVR3_SHARE:-/unused}${DVR3_SHARE:+:/mnt/${CHANNELS_DVR3_HOST}-${CHANNELS_DVR3_PORT}} # Note that these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between).
      - ${LOGS3_SHARE:-/unused}${LOGS3_SHARE:+:/mnt/${CHANNELS_DVR3_HOST}-${CHANNELS_DVR3_PORT}_logs} # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR logs network share.
      - ${TUBEARCHIVIST3_SHARE:-/unused}${TUBEARCHIVIST3_SHARE:+:/mnt/${CHANNELS_DVR3_HOST}-${CHANNELS_DVR3_PORT}_ta} # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your TubeArchivist videos network share.
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

  static-file-server:
    image: halverneus/static-file-server:latest
    container_name: ${SFS_NAME:-static-file-server}${EZ_START}
    dns_search: ${DOMAIN}
    ports:
      - ${HOST_SFS_PORT:-0}:8080
    environment:
      - FOLDER=${FOLDER:-/web}
    volumes:
      - ${HOST_DIR:-/unused}${HOST_DIR:+/olivetin/data:${FOLDER:-/web}}
    restart: unless-stopped

#0#volumes: # Remove the #x# to enable. Use this section if you've setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /mnt/dvr inside the container. Set ${DVR_SHARE} to channels-dvr (DVR_SHARE=channels_dvr) in that example.
  #1#channels-dvr:
    #1#external: true
  #2#channels-dvr-logs:
    #2#external: true
  #3#tubearchivist:
    #3#external: true
  #4#channels-dvr2:
    #4#external: true
  #5#channels-dvr2-logs:
    #5#external: true
  #6#tubearchivist2:
    #6#external: true
  #7#channels-dvr3:
    #7#external: true
  #8#channels-dvr3-logs:
    #8#external: true
  #9#tubearchivist3:
    #9#external: true

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
DOMAIN=localdomain tailxxxxx.ts.net
HOST_PORT=1337
CHANNELS_DVR_HOST=local-server
CHANNELS_DVR_PORT=8089
CHANNELS_DVR2_HOST=another-server
CHANNELS_DVR2_PORT=8089
CHANNELS_CLIENTS=appletv4k firestick-master amazon-aftkrt
ALERT_SMTP_SERVER=smtp.gmail.com:587
[email protected]
ALERT_EMAIL_PASS=xxxxxxxxxxxxxxxx
[email protected]
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
TZ=America/Denver
HOST_DIR=/data
DVR_SHARE=/mnt/dvr
LOGS_SHARE=/mnt/channelsdvr
TUBEARCHIVIST_SHARE=/mnt/dvr
DVR2_SHARE=
LOGS2_SHARE=
TUBEARCHIVIST2_SHARE=
DVR3_SHARE=
LOGS3_SHARE=
TUBEARCHIVIST3_SHARE=
HOST_SFS_PORT=8080
FOLDER=/web
PORTAINER_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PORTAINER_HOST=docker-host
PORTAINER_PORT=9443
PORTAINER_ENV=2
PERSISTENT_LOGS=false

Organizr
services:
  organizr: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/causefx/Organizr
    # Docker Hub home for this project: https://hub.docker.com/r/organizr/organizr
    image: organizr/organizr:${TAG:-latest}
    container_name: organizr
    hostname: organizr
    ports:
      - ${HOST_PORT}:80
    environment:
      - PUID=nobody
      - PGID=nobody
      - TZ=${TZ}
    volumes:
      - ${HOST_DIR}/organizr:/config
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=80
TZ=America/Denver
HOST_DIR=/data

Pinchflat
services:
  pinchflat: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/kieraneglin/pinchflat
    # Docker container home for this project: https://github.com/kieraneglin/pinchflat/pkgs/container/pinchflat
    image: ghcr.io/kieraneglin/pinchflat:${TAG:-latest} # Add the tag like latest or test to the environment variables below.
    container_name: pinchflat
    environment:
      - TZ=${TZ} # Add your local timezone in standard linux format.
    ports:
      - ${HOST_PORT:-8945}:8945 # Use the recommended port number, or optionally change it if the port is already in use.
    volumes:
      - ${HOST_DIR:-/data}/pinchflat:/config # Add the parent directory on your Docker host you'd like to use.
      - ${VIDEOS_SHARE}:/downloads # This can either be a host directory or a Docker volume that's connected via Samba or NFS to your videos network share.

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=8945
TZ=America/Denver
HOST_DIR=/data
VIDEOS_SHARE=/mnt/videos

Pluto-for-Channels (kineticman)
services:
  pluto-for-channels: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/kineticman/pluto-for-channels
    # Docker container home for this project: https://hub.docker.com/r/kineticman/pluto-for-channels
    image: kineticman/pluto-for-channels:${TAG:-main}
    container_name: pluto-for-channels
    ports:
      - ${HOST_PORT:-7777}:7777 # Map your desired host port to the container's port 7777
    environment:
      - PLUTO_USERNAME=${PLUTO_USERNAME} # Your Pluto TV username. Use single quotes if it contains special characters.
      - PLUTO_PASSWORD=${PLUTO_PASSWORD} # Your Pluto TV password. Use single quotes if it contains special characters.
      - PLUTO_CODE=${PLUTO_CODE:-local,us_east,us_west,ca,uk,fr,de,all} # Optional- Customize the country codes. Default- local,us_east,us_west,ca,uk,fr,de,all.
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=main
HOST_PORT=7777
PLUTO_USERNAME=
PLUTO_PASSWORD=
PLUTO_CODE=local,us_east,us_west,ca,uk,fr,de,all

PrismCast
services:
  prismcast: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/hjdhjd/prismcast.
    # Docker container home for this project: https://github.com/hjdhjd/prismcast/pkgs/container/prismcast.
    image: ghcr.io/hjdhjd/prismcast:${TAG:-latest}
    container_name: prismcast
    hostname: prismcast
    dns_search: ${DOMAIN:-localdomain}
    shm_size: '2gb'
    #devices:
      #- /dev/dri:/dev/dri
    ports:
      - ${HOST_PORT:-5589}:${PORT:-5589}
      - ${HOST_VNC_PORT:-5900}:${VNC_PORT:-5900}
      - ${HOST_NOVNC_PORT:-6080}:${NOVNC_PORT:-6080}
      - ${HOST_HDHR_PORT:-5004}:${HDHR_PORT:-5004}
    environment:
      - PORT=${PORT:-5589}
      - VNC_PORT=${VNC_PORT:-5900}
      - NOVNC_PORT=${NOVNC_PORT:-6080}
      - HDHR_PORT=${HDHR_PORT:-5004}
      - DISPLAY_NUM=${DISPLAY_NUM:-99}
      - SCREEN_WIDTH=${SCREEN_WIDTH:-1920}
      - SCREEN_HEIGHT=${SCREEN_HEIGHT:-1080}
      - SCREEN_DEPTH=${SCREEN_DEPTH:-24}
      - TZ=${TZ:-America/New_York}
      - LIBVA_DRIVER_NAME=${LIBVA_DRIVER_NAME:-iHD} # Override below with LIBVA_DRIVER_NAME=i965 for older Intel GPUs (pre-Gen 9 aka Skylake).
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://localhost:${PORT:-5589}/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
    volumes:
      - prismcast-data:/root/.prismcast
    restart: unless-stopped
volumes:
  prismcast-data:

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
DOMAIN=localdomain
HOST_PORT=5589
PORT=5589
HOST_VNC_PORT=5900
VNC_PORT=5900
HOST_NOVNC_PORT=6080
NOVNC_PORT=6080
HOST_HDHR_PORT=5004
HDHR_PORT=5004
DISPLAY_NUM=99
SCREEN_WIDTH=1920
SCREEN_HEIGHT=1080
SCREEN_DEPTH=24
TZ=America/New_York
LIBVA_DRIVER_NAME=iHD

Roku-Channels-Bridge
services:
  roku-channels-bridge: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/nuken/roku-bridge
    # Docker Hub home for this project: https://hub.docker.com/r/rcvaughn2/roku-ecp-tuner
    image: rcvaughn2/roku-ecp-tuner:${TAG:-latest} # Add the tag like latest or test to the environment variables below.
    container_name: roku-channels-bridge
    #devices:
      #- /dev/dri:/dev/dri
    ports:
      - ${HOST_PORT:-5006}:5000 # Use the same port number the container is using, or optionally change it if the port is already in use on your host.
    environment:
      - ENCODING_MODE=${ENCODING_MODE:-proxy} # Set a global, default stream handling mode.
      - AUDIO_BITRATE=${AUDIO_BITRATE:-192k} # Set audio quality for reencode mode (e.g., -e AUDIO_BITRATE=192k).
      - AUDIO_CHANNELS=${AUDIO_CHANNELS:-5.1} # Set the number of audio channels (e.g., -e AUDIO_CHANNELS=5.1).
      - ENABLE_DEBUG_LOGGING=${ENABLE_DEBUG_LOGGING:-false} # Set audio quality for reencode mode (e.g., -e AUDIO_BITRATE=192k).
    volumes:
      - roku-bridge-config:/app/config
    restart: unless-stopped
volumes:
  roku-bridge-config:
    name: ${HOST_VOLUME} # This project will store its data in /var/lib/docker/volumes/${HOST_VOLUME}. <project-name_config> is a good name choice.

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=5006
ENCODING_MODE=proxy
AUDIO_BITRATE=192k
AUDIO_CHANNELS=5.1
ENABLE_DEBUG_LOGGING=false
HOST_VOLUME=roku-bridge-config

Samsung-TVPlus-for-Channels
services:
  samsung-tvplus-for-channels: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/matthuisman/samsung-tvplus-for-channels
    # Docker Hub home for this project: https://hub.docker.com/r/matthuisman/samsung-tvplus-for-channels
    image: matthuisman/samsung-tvplus-for-channels:${TAG:-latest}
    container_name: samsung-tvplus-for-channels
    ports:
      - ${HOST_PORT}:80 # Use the same port number the container is using, or optionally change it if the port is already in use on your host.
    environment:
      - REGIONS=${REGIONS} # Vertical bar separated list of regions to use. us|kr|it|in|gb|fr|es|de|ch|ca|at or all supported.
      - TZ=${TZ} # Add your local timezone in standard linux format. E.G. US/Eastern, US/Central, US/Mountain, US/Pacific, etc.
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=8182
REGIONS=us
TZ=America/Denver

Stirr-for-Channels
services:
  stirr-for-channels: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/robbiet480/stirr-for-channels
    # Docker Hub home for this project: https://hub.docker.com/r/robbiet480/stirr-for-channels
    image: robbiet480/stirr-for-channels:${TAG:-latest}
    container_name: stirr-for-channels
    ports:
      - ${HOST_PORT}:80 # Use the same port number the container is using, or optionally change it if the port is already in use on your host.
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=8181
Stream-Link-Manager-for-Channels
services:
  slm: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/babsonnexus/stream-link-manager-for-channels
    # Docker container home for this project: https://ghcr.io/babsonnexus/stream-link-manager-for-channels
    image: ghcr.io/babsonnexus/stream-link-manager-for-channels:${TAG:-latest}
    container_name: slm
    ports:
      - ${SLM_PORT:-5000}:5000
    environment:
      - TZ=${TIMEZONE:-UTC}
    volumes:
      - ${SLM_HOST_FOLDER:-slm_files}:/app/program_files
      - ${CHANNELS_FOLDER}:/app/channels_folder
    restart: unless-stopped
volumes:
  slm_files:

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
SLM_PORT=5000
TIMEZONE=America/Denver
SLM_HOST_FOLDER=slm_files
CHANNELS_FOLDER=/mnt/dvr

Tailscale
services:
  tailscale: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/tailscale/tailscale
    # Docker Hub home for this project: https://hub.docker.com/r/tailscale/tailscale
    image: tailscale/tailscale:${TAG:-latest}
    container_name: tailscaled
    cap_add:
      - NET_ADMIN
      - NET_RAW
    devices:
      - /dev/net/tun
    environment:
      - TS_HOSTNAME=${TS_HOSTNAME:-} # Usually not necessary for your hostname to be the same name on the tailscale network.
      - TS_AUTHKEY=${TS_AUTHKEY:-} # Generate auth keys here: https://login.tailscale.com/admin/settings/keys. For standard authentication, check the log for the link after initial container start.
      - TS_AUTH_ONCE=${TS_AUTH_ONCE:-} # Set true to only log in when the node isn't already authenticated.
      - TS_ROUTES=${TS_ROUTES:-} # Creates a subnet router for Tailscale; use your subnet's CIDR in the form 192.168.1.0/24
      - TS_ACCEPT_DNS=${TS_ACCEPT_DNS:-true} # Set to false for Pi-hole Docker setups.
      - TS_SOCKET=${TS_SOCKET:-/var/run/tailscale/tailscaled.sock} # Path to the tailscaled control socket.
      - TS_EXTRA_ARGS=${TS_EXTRA_ARGS:---accept-routes} # Defaults to --accept-routes; add other supported arguments in the docker commandline style, e.g. --advertise-exit-node
      - TS_STATE_DIR=${TS_STATE_DIR:-/var/lib/tailscale} # Required to create a persistent container state that will survive reboots.
    volumes:
      - ${HOST_DIR:-/data}:/var/lib # Creates a tailscale directory under HOST_DIR for persistence.
    network_mode: host
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
TS_SOCKET=/var/run/tailscale/tailscaled.sock
TS_EXTRA_ARGS=--accept-routes
TS_STATE_DIR=/var/lib/tailscale
HOST_DIR=/data
Tubi-for-Channels
services:
  tubi-for-channels: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/jgomez177/tubi-for-channels
    # Docker container home for this project: https://ghcr.io/jgomez177/tubi-for-channels
    image: ghcr.io/jgomez177/tubi-for-channels:${TAG:-latest}
    container_name: tubi-for-channels
    ports:
      - ${HOST_PORT}:${TUBI_PORT} # Use the recommended port number, or optionally change it if the port is already in use on your host.
    environment:
      - TUBI_PORT=${TUBI_PORT} # Change the port this container uses internally.
      - TUBI_USER=${TUBI_USER} # Optional variable to sign into Tubi Account.
      - TUBI_PASS=${TUBI_PASS} # Optional variable to sign into Tubi Account.
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=7778
TUBI_PORT=7777
TUBI_USER=
TUBI_PASS=
VLC-Bridge-Fubo
services:
  vlc-bridge-fubo: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitLab home for this project: https://gitlab.com/vlc-bridge-fubo-test/vlc-bridge-fubo
    # Docker Hub home for this project: https://hub.docker.com/r/genericchannelsuser/vlc-bridge-fubo
    image: genericchannelsuser/vlc-bridge-fubo:${TAG:-latest}
    container_name: vlc-bridge-fubo
    ports:
      - ${HOST_PORT}:7777 # Use the same port number the container is using, or optionally change it if the port is already in use on your host.
    environment:
      - FUBO_USER=${FUBO_USER}
      - FUBO_PASS=${FUBO_PASS}
    volumes:
      - vlc-bridge-fubo:/app/Config
    restart: unless-stopped
volumes:
  vlc-bridge-fubo:
    name: ${HOST_VOLUME} # This project will store its data in /var/lib/docker/volumes/${HOST_VOLUME}. <project-name_config> is a good name choice.

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=7777
FUBO_USER=<yourfubousername>
FUBO_PASS=<yourfubopassword>
HOST_VOLUME=vlc-bridge-fubo_config

VLC-Bridge-PBS
services:
  vlc-bridge-pbs: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitLab home for this project: https://gitlab.com/miibeez/vlc-bridge-pbs
    # Docker container home for this project: https://gitlab.com/miibeez/vlc-bridge-pbs/container_registry
    image: registry.gitlab.com/miibeez/vlc-bridge-pbs:${TAG:-latest}
    container_name: vlc-bridge-pbs
    ports:
      - ${HOST_PORT}:7777
    environment:
      - TZ=${TZ}
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=7777
TZ=America/Denver

VLC-Bridge-UK
services:
  vlc-bridge-uk: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitLab home for this project: https://gitlab.com/miibeez/vlc-bridge-uk
    # Docker container home for this project: https://gitlab.com/miibeez/vlc-bridge-uk/container_registry
    image: registry.gitlab.com/miibeez/vlc-bridge-uk:${TAG:-latest}
    container_name: vlc-bridge-uk
    ports:
      - ${HOST_PORT}:7777
    environment:
      - ITV_USER=${ITV_USER}
      - ITV_PASS=${ITV_PASS}
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=7777
ITV_USER=<youritvusername>
ITV_PASS=<youritvpassword>

Watchtower (for bulk container updating)
services:
  watchtower: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project: https://github.com/nicholas-fedor/watchtower
    # Docker Hub home for this project: https://hub.docker.com/r/nickfedor/watchtower
    image: nickfedor/watchtower:${TAG:-latest}
    container_name: watchtower
    environment:
      - PATH=${PATH:-/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin}
      - WATCHTOWER_RUN_ONCE=${WATCHTOWER_RUN_ONCE:-true}
    labels:
      - 'com.centurylinklabs.watchtower.enable=true'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
WATCHTOWER_RUN_ONCE=true

WeatherStar 4000+
services:
  weatherstar4k: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/netbymatt/ws4kp
    # Docker container home for this project: https://ghcr.io/netbymatt/ws4kp
    image: ghcr.io/netbymatt/ws4kp:${TAG:-latest}
    container_name: weatherstar4k
    hostname: weatherstar4k
    ports:
      - ${HOST_PORT}:8080
    environment:
      - WSQS_settings-wide-checkbox=${WIDE:-true}
      - WSQS_settings-kiosk-checkbox=${KIOSK:-true}
      - TZ=${TZ}
    restart: unless-stopped

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
HOST_PORT=8090
TZ=America/Denver

YouTub3r
services:
  youtub3r: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2026.08.31
    # GitHub home for this project with setup instructions: https://github.com/maddox/youtub3r
    # Docker container home for this project: https://hub.docker.com/r/jonmaddox/youtub3r
    image: jonmaddox/youtub3r:${TAG:-latest} # Add the tag like latest or test to the environment variables below.
    container_name: youtub3r
    environment:
      - SERVER_HOST=${SERVER_HOST} # Host of Channels DVR Server. In the form ip:port or hostname:port.
      - WAIT_IN_SECONDS=${WAIT_IN_SECONDS:-60} # Number of seconds between scans.
    volumes:
      - ${YOUTUBE_SHARE}:/youtube_videos # Bind mount of your YouTube video directory or Docker Volume.

# A sample set of Environment variables can be found below -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode.

TAG=latest
SERVER_HOST=media-server8:8089
WAIT_IN_SECONDS=60
YOUTUBE_SHARE=/mnt/videos

All of these examples are available via this OliveTin Action as well:

screenshot-htpc6-2024.02.23-15_22_24

via this pull-down:

with results shown, as usual, in the log under stdout (the docker-compose itself and environment variable samples for use in that section of Portainer-Stacks -- copy and paste using "Advanced mode"):

10 Likes
OliveTin for Channels: An Interface for Misc Channels DVR Scripts & Tricks
Plex Live TV Channels M3U?
Tubi for Channels docker
Pluto for Channels
MLB.TV for Channels
Samsung and Pluto dockers on Synology
ESPN+ & FOX Sports with Custom Channels via EPlusTV
TVE Lockouts
Project One-Click: All-in-One Installations of Docker Extensions and CDVR Custom Channels
Frndly TV for Channels
OliveTin for Channels links
Important PSA Regarding Portainer 2.33.0 LTS
Plex Custom Channel fail "too many requests"?
[RELEASE] Stream Link/File Manager for Channels [Streaming Library Manager Extension]
Synology NAS - Docker Help
ESPN+ & FOX Sports with Custom Channels via EPlusTV
[RELEASE] Stream Link/File Manager for Channels [Streaming Library Manager Extension]
Roku Tuner Bridge Official Release
Tubi for Channels docker
Roku Tuner Bridge Official Release
Samsung TV Plus for Channels
Building a new system
ChannelWatch: Real-Time Alerts for Your Channels DVR[Archived]
Channels App Remote Plus
AndroidHDMI for Channels (ah4c): A virtual channel tuner using HDMI Encoder(s) + streaming stick(s)
A Complete Site Map to OliveTin-for-Channels + Project One-Click Actions and the Posts that Inspired Them!
Mlb.tv update
Can't Find OliveTin Output File
Feature Request: Limit Continuous Streaming Time or Data
CDVR Virtual Channels for External Players and the CDVR WebUI
OliveTin for Channels: An Interface for Misc Channels DVR Scripts & Tricks
Channels-dvr docker compose setup
OliveTin EZ-Start: A New Way to Deploy OliveTin-for-Channels Using Just Two Environment Variables to Get Started!
OliveTin EZ-Start: A New Way to Deploy OliveTin-for-Channels Using Just Two Environment Variables to Get Started!
Introducing PrismCast: Browser-based Live TV Capture for Channels DVR and Plex
OliveTin EZ-Start: A New Way to Deploy OliveTin-for-Channels Using Just Two Environment Variables to Get Started!
Synology NAS - Docker Help
Zinwell NextGen TV Box + Encoder + ah4c = Success (But What About HDR?)
Frndly TV for Channels
ESPN+ & FOX Sports with Custom Channels via EPlusTV
Fubo TV project
Project One-Click: All-in-One Installations of Docker Extensions and CDVR Custom Channels
AndroidHDMI for Channels (ah4c): A virtual channel tuner using HDMI Encoder(s) + streaming stick(s)
TiVo user going to Channels DVR
ADBTuner: A "channel tuning" application for networked Google TV / Android TV devices
Synology NAS - Docker Help
OliveTin for Channels: An Interface for Misc Channels DVR Scripts & Tricks
Project One-Click: All-in-One Installations of Docker Extensions and CDVR Custom Channels
OliveTin for Channels: An Interface for Misc Channels DVR Scripts & Tricks
Samsung TV Plus for Channels [retired]
Project One-Click: All-in-One Installations of Docker Extensions and CDVR Custom Channels
OliveTin for Channels: An Interface for Misc Channels DVR Scripts & Tricks
Fubo TV project
Fubo TV project
Samsung TV Plus for Channels [retired]
Pluto for Channels
How to add docker container as a source on Channels DVR
ADBTuner: A "channel tuning" application for networked Google TV / Android TV devices

Great work, thanks for this.
MLB tv is another one

1 Like

This is outstanding, thank you!

1 Like

Great -- I'll add it. I also realized I should include the MediaInfo and FileBot containers, as installing them via container allows them to be used from anywhere on your LAN or Tailnet without needing to install them on every network node.

1 Like

Great job!
Of course now that you publish it, things change. Pluto for Channels - #606 by joagomez
Anyway to update some files without updating the OliveTin-for-Channels docker image?
Maybe pulling updated files like Channels DVR does when you update pre/release versions.

1 Like

I've added FileBot, MediaInfo and MLB.tv-for-Channels to the list in the first post. The advantage of having FileBot and MediaInfo containerized is that you can access them from any system on your LAN or Tailnet. Bind mount a directory or Docker Volume, so that you'll have access to all of your Channels-related media.

They'll look something like this via your browser:

FileBot:

MediaInfo:

3 Likes

Has anyone got filebot to run under Synology DSM 7? I'm using the compose example in olive-tin but I'm getting a permission error when it is launching.

[supervisor ] starting service 'nginx'...
[nginx ] Listening for HTTP connections on port 5800.
[nginx ] nginx: [alert] could not open error log file: open() "/config/log/nginx/error.log" failed (13: Permission denied)
[nginx ] 2024/02/25 10:50:54 [emerg] 722#722: open() "/config/log/nginx/error.log" failed (13: Permission denied)
[supervisor ] service 'nginx' failed to be started: not ready after 5000 msec, giving up.
[supervisor ] stopping service 'nginx'...
[supervisor ] service 'nginx' exited (with status 1).
[supervisor ] stopping service 'xvnc'...
[xvnc ] Sun Feb 25 10:50:59 2024
[xvnc ] ComparingUpdateTracker: 0 pixels in / 0 pixels out
[xvnc ] ComparingUpdateTracker: (1:-nan ratio)
[supervisor ] service 'xvnc' exited (with status 0).
[finish ] executing container finish scripts...
[finish ] all container finish scripts executed.

Looking at the docs in GitHub, they suggest setting the USER_ID and GROUP_ID environment variables.
https://github.com/jlesage/docker-filebot?tab=readme-ov-file#usergroup-ids

So I modified my compose to add USER_ID and GROUP_ID and set the those to 1026 and 100 respectively (for my particular case).

environment:
  - USER_ID=${USER_ID}
  - GROUP_ID=${GROUP_ID}
  - DARK_MODE=${DARK_MODE}

Ok, now it gets past the permission denied error in the log file.
However now it is getting errors loading the 'OpenboxTheme'.

[nginx ] Listening for HTTP connections on port 5800.
[supervisor ] starting service 'openbox'...
[openbox ] ObRender-Message: Unable to load the theme 'OpenboxTheme'
[openbox ] ObRender-Message: Falling back to the default theme 'Clearlooks'
[openbox ] ObRender-Message: Unable to load the theme 'Clearlooks'
[openbox ] Openbox-Message: Unable to load a theme.
[supervisor ] service 'openbox' failed to be started: not ready after 5000 msec, giving up.
[supervisor ] stopping service 'openbox'...
[supervisor ] service 'openbox' exited (with status 1).
[supervisor ] stopping service 'nginx'...
[supervisor ] service 'nginx' exited (with status 0).
[supervisor ] stopping service 'xvnc'...
[xvnc ] Sun Feb 25 14:20:16 2024
[xvnc ] ComparingUpdateTracker: 0 pixels in / 0 pixels out
[xvnc ] ComparingUpdateTracker: (1:-nan ratio)
[supervisor ] service 'xvnc' exited (with status 0).
[finish ] executing container finish scripts...
[finish ] all container finish scripts executed.

A little searching and I found this thread that discusses the exact problem I'm having.
https://github.com/jlesage/docker-filebot/issues/84
In that thread it was suggested to try mapping /config in the filebot compose to /tmp/filebot. Now filebot launches without error and I'm able to access the web GUI! Clearly there is a permissions issue but I can't figure out how to fix it.
Mapping /config to /tmp is not a fix because on a NAS reboot the /tmp directory gets cleared.

Anyone have any ideas about what is going on with the Openbox unable to load themes?

Maybe try mapping /config to a Docker-Volume instead of doing a directory binding. Something like:

    volumes:
      - filebot:/config:rw # Add the parent directory on your Docker host you'd like to use
      - ${DVR_SHARE}:/storage:rw # This can either be a Docker volume or a host directory that's connected via Samba or NFS to your Channels DVR network share.
volumes: # use this section if you've setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /storage inside the container
  filebot:
    name: ${HOST_VOLUME}
HOST_VOLUME=filebot_config
DVR_SHARE=/mnt/dvr
2 Likes

Thanks for that @bnhf! That did the trick. For anyone running filebot on Synology, here is my working configuration.
Compose:

Environment:
image

To summarize for Synology docker compose folks, take the example compose from olive-tin and add the USER_ID and GROUP_ID environment variables. Also map /config to a Docker-Volume instead of doing a directory binding.

1 Like

Has anyone tried the UK one?

2 Likes

That's mostly for people in/from the UK. You need to have a UK "TV license", and if you were using it from the US you'd need to have a residential Tailscale Exit Node or similar in the UK. Some commercial VPNs might work, but most are blocked to prevent geo-relocation.

1 Like

Have you tried using the /volume1/docker shared folder directory that Synology creates when you install the Docker package?

I find that's easier.

/volume1/docker/filebot_config:/config:rw
and you don't need to specify the :rw (Read/Write), since that is the default.

I discovered this when I first started using docker for Channels DVR and it wouldn't work using other shared folders. Channels DVR on docker - #38 by chDVRuser

1 Like

That's interesting. At some point Synology changed the name from Docker to Container Manager which I think I installed from Package Center. Container Manager is built by Docker Inc. Anyway it never created a /docker directory.

1 Like

/volume1/docker

2 Likes

Installing Portainer:

Here's my recommended command line to install Portainer, which works for Linux and Docker Desktop based installations:

docker run -d -p 8000:8000 -p 9000:9000 -p 9443:9443 --name portainer \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    cr.portainer.io/portainer/portainer-ce:latest
1 Like

Docker desktop for Windows has a Portainer extension.

2 Likes

After the recent WB kerfuffle, I switched to these docker compose files to continue receiving Samsung, Plex, and Pluto.

Things are working well, however I am only getting six hours of guide data at any given time. This is vs using nocordz for Pluto, which gives 24 hours.

Is this "just the way it is", or can I change a config to increase the amount of guide data retrieved/stored?

Thanks!

1 Like

I get 6hrs from the Samsung TV Plus for Channels docker and 24hrs with the Pluto for Channels (jonmaddox) docker. Don't use a Plex docker, so not sure about that.

Using the jgomez177 dockers as installed through Olivetin Project One Click, my program guide for Plex goes out to around 72 hours (3 days). Pluto looks to be around 24 hours. Samsung is the shortest at roughly 6 hours.

1 Like

Thanks for the responses, @chDVRuser and @jsfullam .

I was planning on using the weekend to spin up a new Linux install to try Project One Click. I'll do that and see if I get improved results.

2 Likes