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

EDITS:

  • Added FileBot, MediaInfo, and MLB.tv-for-Channels (2024.02.24)
  • Updated pluto-for-channels (joagomez) - GitHub move, PLUTO_CODE env var (2024.02.24)

ORIGINAL POST:

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
version: '3.9'
services:
  # 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
  adbtuner:
    image: turtletank99/adbtuner:${TAG}
    container_name: adbtuner
    dns_search: ${DOMAIN} # Change to the name of your LAN's domain, which is usually local or localdomain
    init: true
    ports:
      - ${HOST_PORT}:5592 # Use the same port number the container is using, or optionally change it if the port is already in use on your host
    volumes:
      - adbtuner:/app/.config
    restart: unless-stopped
volumes:
  adbtuner:
    name: ${HOST_VOLUME}

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
DOMAIN=localdomain
HOST_PORT=5592
HOST_VOLUME=adbtuner_config
ah4c (formerly AndroidHDMI-for-Channels)
version: '3.9'
services:
  ah4c:
    image: bnhf/ah4c:${TAG}
    container_name: ah4c
    hostname: ah4c
    dns_search: ${DOMAIN} # Specify the name of your LAN's domain, usually local or localdomain
    ports:
      - ${ADBS_PORT}:5037 # Port used by adb-server
      - ${HOST_PORT}:7654 # Port used by this ah4c proxy
      - ${WSCR_PORT}:8000 # Port used by ws-scrcpy
    environment:
      - IPADDRESS=${IPADDRESS} # Hostname or IP address of this ah4c extension to be used in M3U file (also add port number if not in M3U)
      - NUMBER_TUNERS=${NUMBER_TUNERS} # Number of tuners you'd like defined 1, 2, 3 or 4 supported
      - TUNER1_IP=${TUNER1_IP} # Streaming device #1 with adb port in the form hostname:port or ip:port
      - TUNER2_IP=${TUNER2_IP} # Streaming device #2 with adb port in the form hostname:port or ip:port
      - TUNER3_IP=${TUNER3_IP} # Streaming device #3 with adb port in the form hostname:port or ip:port
      - TUNER4_IP=${TUNER4_IP} # Streaming device #4 with adb port in the form hostname:port or ip:port
      - ENCODER1_URL=${ENCODER1_URL} # Full URL for tuner #1 in the form http://hostname/stream or http://ip/stream
      - ENCODER2_URL=${ENCODER2_URL} # Full URL for tuner #2 in the form http://hostname/stream or http://ip/stream
      - ENCODER3_URL=${ENCODER3_URL} # Full URL for tuner #3 in the form http://hostname/stream or http://ip/stream
      - ENCODER4_URL=${ENCODER4_URL} # Full URL for tuner #4 in the form http://hostname/stream or http://ip/stream
      - 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)
      - CHANNELSIP=${CHANNELSIP} # Hostname or IP address of the Channels DVR server itself
      - 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=""
      - LIVETV_ATTEMPTS=${LIVETV_ATTEMPTS} # For FireTV Live Guide tuning only, set maximum number of attempts at finding the desired channel
      - CREATE_M3US=${CREATE_M3US} # Set to true to create device-specific M3Us for use with Amazon Prime Premium channels -- requires a FireTV device
      - UPDATE_SCRIPTS=${UPDATE_SCRIPTS} # Set to true if you'd like the sample scripts and STREAMER_APP scripts updated whether they exist of not
      - UPDATE_M3US=${UPDATE_M3US} # Set to true if you'd like the sample m3us updated whether they exist of not
      - TZ=${TZ} # Your local timezone in Linux "tz" format
    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
    restart: unless-stopped

    # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
DOMAIN=localdomain
ADBS_PORT=5037
HOST_PORT=7654
WSCR_PORT=7655
IPADDRESS=htpc6:7654
NUMBER_TUNERS=2
TUNER1_IP=firestick-rack1:5555
ENCODER1_URL=http://encoder_48007/0.ts
TUNER2_IP=firestick-rack2:5555
ENCODER2_URL=http://encoder_48007/4.ts
STREAMER_APP=scripts/firetv/directv
CHANNELSIP=media-server6
ALERT_SMTP_SERVER=smtp.gmail.com:587
ALERT_AUTH_SERVER=smtp.gmail.com
[email protected]
ALERT_EMAIL_PASS=xxxxxxxxxxxxxxxx
[email protected]
LIVETV_ATTEMPTS=45
CREATE_M3US=false
UPDATE_SCRIPTS=true
UPDATE_M3US=true
TZ=US/Mountain
HOST_DIR=/data
cc4c (ChromeCapture-for-Channels)
version: '3.9'
services:
  cc4c:
    image: fancybits/chrome-capture-for-channels:${TAG}
    container_name: cc4c
    command:
      - sh 
      - -c 
      - |
        Xvfb :99 -screen 0 1920x1080x16 &
        x11vnc -display :99 -forever &
        sed -i '/videoBitsPerSecond/c\        videoBitsPerSecond: process.env.VIDEO,' main.js;
        sed -i '/audioBitsPerSecond/c\        audioBitsPerSecond: process.env.AUDIO,' main.js;
        exec node main.js
    #devices:
      #- /dev/dri:/dev/dri # Uncomment for Intel Quick Sync (GPU) access
    ports:
      - ${HOST_PORT}:5589 # cc4c proxy port
      - ${HOST_VNC_PORT}:5900 # VNC port for entering credentials
    environment:
      - VIDEO=${VIDEO}
      - AUDIO=${AUDIO}
      - TZ=${TZ} # Add your timezone in the Environment variables section with "name" set to TZ and "value" to your local timezone
    volumes:
      - cc4c:/home/chrome # Creates persistent Docker Volume in /var/lib/docker/volumes for Chrome data and main.js
    restart: unless-stopped
volumes:
  cc4c:
    name: ${HOST_VOLUME}

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=5589
HOST_VNC_PORT=5900
VIDEO=9500000
AUDIO=192000
TZ=US/Mountain
HOST_VOLUME=cc4c_config
EPlusTV
version: '3.9'
services:
  # GitHub home for this project with setup instructions: https://github.com/m0ngr31/EPlusTV
  # Docker Hub home for this project: https://hub.docker.com/r/m0ngr31/eplustv
  eplustv:
    image: m0ngr31/eplustv:${TAG}
    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+.
      - 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.
      - ESPNPLUS=${ESPNPLUS} # Set to false if you only want events that come from your TV provider.
      - ESPN=${ESPN} # ESPN: Set if your TV provider supports it.
      - ESPN2=${ESPN2} # ESPN2: Set if your TV provider supports it.
      - ESPN3=${ESPN3} # ESPN3: Set if your TV provider supports it.
      - ESPNU=${ESPNU} # ESPNU: Set if your TV provider supports it.
      - SEC=${SEC} # SEC Network: Set if your TV provider supports it.
      - SECPLUS=${SECPLUS} # SEC Network+: Set if your TV provider supports it.
      - ACCN=${ACCN} # ACCN: Set if your TV provider supports it.
      - ACCNX=${ACCNX} # ACCNX: Set if your TV provider supports it.
      - LONGHORN=${LONGHORN} # Longhorn Network: Set if your TV provider supports it.
      - ESPNEWS=${ESPNEWS} # ESPNews: Set if your TV provider supports it.
      - ESPN_PPV=${ESPN_PPV} # PPV: Set if you have purchased PPV events.
      - FOXSPORTS=${FOXSPORTS} # Set if your TV provider supports it.
      - FOXSPORTS_ALLOW_REPLAYS=${FOXSPORTS_ALLOW_REPLAYS} # If you would like to schedule events that aren't live.
      - MAX_RESOLUTION=${MAX_RESOLUTION} # Max resolution to use. Valid options are UHD/HDR, UHD/SDR, 1080p, 720p, and 540p (Some providers don't offer 4K or 1080p and will attempt to play the highest framerate available for selected resolution).
      - FOX_ONLY_4K=${FOX_ONLY_4K} # Only grab 4K events.
      - PARAMOUNTPLUS=${PARAMOUNTPLUS} # Set if you would like CBS Sports events.
      - MLBTV=${MLBTV} # Set if you would like to use MLB.tv.
      - MLBTV_USER=${MLBTV_USER} # MLB.tv Username.
      - MLBTV_PASS=${MLBTV_PASS} # MLB.tv Password.
      - MLBTV_ONLY_FREE=${MLBTV_ONLY_FREE} # Only schedule free games.
    volumes:
      - eplustv:/app/config
    restart: unless-stopped
volumes:
  eplustv:
    name: ${HOST_VOLUME}

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=8185
START_CHANNEL=1
NUM_OF_CHANNELS=150
PROXY_SEGMENTS=false
PUID=1000
PGID=1000
PORT=8000
ESPNPLUS=true
ESPN=false
ESPN2=false
ESPN3=false
ESPNU=false
SEC=false
SECPLUS=false
ACCN=false
ACCNX=false
LONGHORN=false
ESPNEWS=false
ESPN_PPV=false
FOXSPORTS=false
FOXSPORTS_ALLOW_REPLAYS=false
MAX_RESOLUTION=UHD/SDR
FOX_ONLY_4K=false
PARAMOUNTPLUS=false
MLBTV=false
MLBTV_USER=false
MLBTV_PASS=false
MLBTV_ONLY_FREE=false
MSGPLUS=false
MSGPLUS_USER=false
MSGPLUS_PASS=false
HOST_VOLUME=eplustv_config
FileBot
version: '3.9'
services:
  filebot:
    image: jlesage/filebot:${TAG}
    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.
    restart: unless-stopped
#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: true
TAG=latest
HOST_PORT=5800
DARK_MODE=1
HOST_DIR=/data
DVR_SHARE=/mnt/dvr
FrndlyTV-for-Channels
version: '3.9'
services:
  # 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
  frndlytv-for-channels:
    image: matthuisman/frndlytv-for-channels:${TAG}
    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

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=8183
IP=<yourrealorfakeipforgeolocation>
USERNAME=<yourfrndlytvusername>
PASSWORD=<yourfrndlytvpassword>
MediaInfo
version: '3.9'
services:
  mediainfo:
    image: jlesage/mediainfo:${TAG} # 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.
    restart: unless-stopped
#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}
TAG=latest
HOST_PORT=5801
DARK_MODE=1
HOST_DIR=/data
DVR_SHARE=/mnt/dvr
MLB.tv-for-Channels
version: '3.9'
services:
  channels-baseball:
    image: matty8199/channels-baseball:${TAG}
    container_name: channels-baseball
    ports:
      - ${HOST_PORT}:8080
    environment:
      - APP_URL=${APP_URL} # the other required environment var is APP_URL, which needs to be set to your server's IP and port 8080. so, for example, if you're running this on IP 192.168.1.100, then that env should be set as follows: APP_URL=http://192.168.1.100:8080
                           # if you have another service on your machine at port 8080, you can change this port - just make sure you change it in all applicable locations (both in your docker run command / docker-compose config, as well as in the channels m3u config).
      - LOG_LEVEL=${LOG_LEVEL} # exactly what you'd expect: defines how much information the logs will show. i would set this to warning initially to avoid a huge log file, but we may need to adjust if there are any issues that i need more detailed logs on.
      - MLB_USERNAME=${MLB_USERNAME} # Your MLB.tv username. the MLB_USERNAME and MLB_PASSWORD env vars above are both obviously required. put your valid MLB credentials into these two slots.
      - MLB_PASSWORD=${MLB_PASSWORD} # Your MLB.tv password.
      - MLB_BITRATE=${MLB_BITRATE} # the default bitrate / video quality, defaults to 720p @ 60 fps (5600). available options are (just enter the number only in the env section of the docker-compose file): 5600 (720p @ 60 fps), 3500 (720p), 2500 (540p), 1800 (504p), 1200 (360p), 800 (288p), 514 (216p), 192 (180p).
                                   # all options are in Kbps (ie. 5600 = 5600K) and are 30 fps unless otherwise specified. the following example would default to 720p, 30fps: MLB_BITRATE=3500
      - MLB_PLAYLIST_FIRST_CHANNEL=${MLB_PLAYLIST_FIRST_CHANNEL} # the first channel in the playlist (i.e. the channel number where your MLB section will start in the guide). defaults to 20000, unless you specify otherwise. in my example, i used 777 because i wanted an easy triple tap number to get to the beginning of the list.
      - MLB_TEAM_ORDER=${MLB_TEAM_ORDER} # the order you want the teams to appear in the guide (will start from the first channel variable and increment one at a time in the order you specify here). if there are teams that are blacked out in your area and you want to exclude those teams, you can just remove them from the list here.
                                         # the MLB Big Inning feed can be added by including MLB as a team short code somewhere in this list (remove MLB from the list if you don't want the Big Inning feed included).
      - MLB_TIMEZONE=${MLB_TIMEZONE} # i almost wanted to say this is required, but technically it's not. if you don't set this, things should still work as far as watching games...but the guide data will be way off. if you don't specify a timezone here, the app will default to UTC.
                                     # example USA timezone values for this variable (just enter the America/xxx or Pacific/xxx part of the timezone below into the env spot in the docker-compose file, leave out the parenthetical timezone name):
                                     # America/New_York (eastern), America/Chicago (central), America/Denver (mountain w/ DST), America/Phoenix (mountain standard, no DST), America/Los_Angeles (pacific), America/Anchorage (alaska), Pacific/Honolulu (hawaii),
      - MLB_SHOW_TV_FEEDS=${MLB_SHOW_TV_FEEDS} # these two environment variables can be set to true or false to turn the TV and/or radio feeds on or off
      - MLB_SHOW_RADIO_FEEDS=${MLB_SHOW_RADIO_FEED}
    volumes:
      - storage_app:/var/www/html/storage/app
      - storage_logs:/var/www/html/storage/logs
    restart: unless-stopped
volumes:
  storage_app:
    name: ${HOST_VOLUME_APP}
  storage_logs:
    name: ${HOST_VOLUME_LOGS}
TAG=latest
HOST_PORT=8080
APP_URL=http://server.ip.goes.here:8080
LOG_LEVEL=warning
MLB_USERNAME=
MLB_PASSWORD=
MLB_BITRATE=5600
MLB_PLAYLIST_FIRST_CHANNEL=777
MLB_TEAM_ORDER=NYM,SDP,PIT,LAA,ATL,MIA,PHI,WAS,CHC,CIN,MIL,STL,ARI,COL,LAD,SFG,BAL,BOS,NYY,TBR,TOR,CWS,CLE,DET,KCR,MIN,HOU,OAK,SEA,TEX,MLB
MLB_TIMEZONE=America/Los_Angeles
MLB_SHOW_TV_FEEDS=true
MLB_SHOW_RADIO_FEEDS=false
HOST_VOLUME_APP=MLBTV_APP
HOST_VOLUME_LOGS=MLBTV_LOGS
OliveTin-for-Channels
version: '3.9'
services:
  olivetin: # This docker-compose requires little or no editing. Set the Environment variables section of Portainer.
    # GitHub home for this project: https://github.com/bnhf/OliveTin
    # Docker container home for this project with setup instructions: https://hub.docker.com/repository/docker/bnhf/olivetin
    image: bnhf/olivetin:${TAG} # Add the tag like latest or test to the environment variables below
    container_name: olivetin
    hostname: olivetin
    dns_search: ${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
    environment:
      - CHANNELS_DVR=${CHANNELS_DVR_HOST}:${CHANNELS_DVR_PORT} # Add your Channels DVR server in the form CHANNELS_DVR_HOST=<hostname or ip> and CHANNELS_DVR_PORT=<port>
      - CHANNELS_DVR_ALTERNATES=${CHANNELS_DVR_ALTERNATES} # 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
      - UPDATE_YAMLS=${UPDATE_YAMLS} # Set this to true to update config.yaml
      - UPDATE_SCRIPTS=${UPDATE_SCRIPTS} # 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} # Hostname or IP of the Docker host you're running Portainer on.
    volumes:
      - ${HOST_DIR}/olivetin:/config # Add the parent directory on your Docker you'd like to use
      - ${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
      #- ${DVR2_SHARE}:/mnt/remote-server-8089 # Note that these volume mounts should always be to /mnt/hostname-port or /mnt/ip-port (dash rather than a colon between)
    restart: unless-stopped

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

#volumes: # 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 ${HOST_DIR} to channels-dvr (HOST_DIR=channels_dvr) in that example
  #channels-dvr:
    #external: true

# Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
DOMAIN=tailxxxxx.ts.net
HOST_PORT=1337
CHANNELS_DVR_HOST=local-server
CHANNELS_DVR_PORT=8089
CHANNELS_DVR_ALTERNATES=another-server:8089
CHANNELS_CLIENTS=appletv4k-den firestick-bedroom
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
TZ=US/Mountain
HOST_DIR=/data
DVR_SHARE=/mnt/dvr
HOST_SFS_PORT=8080
FOLDER=/web
PORTAINER_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PORTAINER_HOST=docker-host
Organizr
version: '3.9'
services:
  organizr:
    image: organizr/organizr:${TAG}
    container_name: organizr
    hostname: organizr
    ports:
      - ${HOST_PORT}:80
    environment:
      - PUID=nobody
      - PGID=nobody
      - TZ=${TZ}
    volumes:
      - ${HOST_DIR}/organizr:/config
    restart: unless-stopped

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=80
TZ=US/Mountain
HOST_DIR=/data
Plex-for-Channels
version: '3.9'
services:
  # GitHub home for this project with setup instructions: https://github.com/jgomez177/plex-for-channels
  # Docker container home for this project: https://ghcr.io/jgomez177/plex-for-channels
  plex-for-channels:
    image: ghcr.io/jgomez177/plex-for-channels:${TAG}
    container_name: plex-for-channels
    ports:
      - ${HOST_PORT}:${PLEX_PORT}
    environment:
      - PLEX_PORT=${PLEX_PORT}
      - PLEX_CODE=${PLEX_CODE}
    restart: unless-stopped

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=7779
PLEX_PORT=7777
PLEX_CODE=local
Pluto-for-Channels (jonmaddox)
version: '3.9'
services:
  # GitHub home for this project: https://github.com/maddox/pluto-for-channels
  # Docker Hub home for this project: https://hub.docker.com/r/jonmaddox/pluto-for-channels
  pluto-for-channels:
    image: jonmaddox/pluto-for-channels:${TAG}
    container_name: pluto-for-channels
    ports:
      - ${HOST_PORT}:80
    restart: unless-stopped

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=8184
Pluto-for-Channels (joagomez)
version: '3.9'
services:
  # GitHub home for this project with setup instructions: https://github.com/jgomez177/pluto-for-channels
  # Docker container home for this project: https://ghcr.io/jgomez177/pluto-for-channels
  pluto-for-channels:
    image: ghcr.io/jgomez177/pluto-for-channels:${TAG}
    container_name: pluto-for-channels
    ports:
      - ${HOST_PORT}:${PLUTO_PORT} # Use the same port number the container is using, or optionally change it if the port is already in use on your host
    environment:
      - PLUTO_PORT=${PLUTO_PORT}
      - PLUTO_CODE=${PLUTO_CODE} # ALLOWED_COUNTRY_CODES: us_east - United States East Coast, us_west - United States West Coast, local - Local IP address Geolocation, ca - Canada, uk - United Kingdom,
    restart: unless-stopped

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=7779
PLUTO_PORT=7777
PLUTO_CODE=local,us_west,us_east,ca,uk
Samsung-TVPlus-for-Channels
version: '3.9'
services:
  # 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
  samsung-tvplus-for-channels:
    image: matthuisman/samsung-tvplus-for-channels:${TAG}
    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
    restart: unless-stopped

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=8182
Stirr-for-Channels
version: '3.9'
services:
  # 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
  stirr-for-channels:
    image: robbiet480/stirr-for-channels:${TAG}
    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

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=8181
Tailscale
version: '3.9'
services:
  tailscale:
    image: tailscale/tailscale:${TAG}
    container_name: tailscaled
    cap_add:
      - NET_ADMIN
      - NET_RAW
    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
      #- TS_AUTH_ONCE=${TS_AUTH_ONCE}
      #- 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} # Set to false for Pi-hole Docker setups
      - TS_SOCKET=${TS_SOCKET}
      - TS_EXTRA_ARGS=${TS_EXTRA_ARGS} # Add any other supported arguments in the docker commandline style: e.g. --advertise-exit-node
      - TS_STATE_DIR=${TS_STATE_DIR} # Required to create a persistent container state that will survive reboots
    volumes:
      - ${HOST_DIR}:/var/lib # Creates a tailscale directory under /data for persistence
      - /dev/net/tun:/dev/net/tun
    network_mode: host
    restart: unless-stopped

  # Default Environment variables can be found below under stderr -- 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
version: '3.9'
services:
  # 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
  tubi-for-channels:
    image: ghcr.io/jgomez177/tubi-for-channels:${TAG}
    container_name: tubi-for-channels
    ports:
      - ${HOST_PORT}:${TUBI_PORT}
    environment:
      - TUBI_PORT=${TUBI_PORT}
    restart: unless-stopped

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=7778
TUBI_PORT=7777
VLC-Bridge-Fubo
version: '3.9'
services:
  vlc-bridge-fubo:
    image: jgomez177/vlc-bridge-fubo:${TAG}
    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.

  # Default Environment variables can be found below under stderr -- 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
version: '3.9'
services:
  vlc-bridge-pbs:
    image: registry.gitlab.com/miibeez/vlc-bridge-pbs:${TAG}
    container_name: vlc-bridge-pbs
    ports:
      - ${HOST_PORT}:7777
    environment:
      - TZ=${TZ}
    restart: unless-stopped

  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
HOST_PORT=7777
TZ=US/Mountain
VLC-Bridge-UK
version: '3.9'
services:
  vlc-bridge-uk:
    image: registry.gitlab.com/miibeez/vlc-bridge-uk:${TAG}
    container_name: vlc-bridge-uk
    ports:
      - ${HOST_PORT}:7777
    environment:
      - ITV_USER=${ITV_USER}
      - ITV_PASS=${ITV_PASS}
    restart: unless-stopped

  # Default Environment variables can be found below under stderr -- 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)
version: '3.9'
services:
  watchtower:
    image: containrrr/watchtower:${TAG}
    container_name: watchtower
    environment:
      - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      - WATCHTOWER_RUN_ONCE=${WATCHTOWER_RUN_ONCE}
    labels:
      - 'com.centurylinklabs.watchtower.enable=true'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

    # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode
TAG=latest
WATCHTOWER_RUN_ONCE=true

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 stderr (environment variable samples for use in that section of Portainer-Stacks -- copy and paste using "Advanced mode"):

6 Likes

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

This is outstanding, thank you!

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.

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.

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:

1 Like

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
1 Like

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?

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

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.

/volume1/docker

1 Like

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

Docker desktop for Windows has a Portainer extension.

2 Likes