Stirr, Samsung TV+, FrndlyTV and PlutoTV all-in-one Docker-Compose for Portainer-Stacks

For those that would like to use Docker and Portainer where possible, I've put together this single Portainer-Stack where you can spin-up Stirr, SamsungTV+, FrndlyTV and PlutoTV all at the same time:

If you're new to Docker, and wanting to install it on a linux-based machine, I'd recommend the Docker "convenience script". Here's the Debian version, but there are versions for most popular linux distros:

https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script

If you have Docker installed but not Portainer, consider this the last time you'll need to execute anything Docker related from the command line: :slight_smile:

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

Portainer can then be accessed through your favorite browser at http://[hostname or ip]:9000 or https://[hostname or ip]:9443

And here's the promised stack, which will launch containers for the four mentioned TV services:

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:latest
    container_name: stirr-for-channels
    ports:
      - 8181:80
    restart: unless-stopped

  # 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:latest
    container_name: samsung-tvplus-for-channels
    ports:
      - 8182:80
    restart: unless-stopped

  # 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:
  frndlytv-for-channels:
    image: matthuisman/frndlytv-for-channels:latest
    container_name: frndlytv-for-channels
    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)
    ports:
      - 8183:80
    restart: unless-stopped

  # 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:latest
    container_name: pluto-for-channels
    ports:
      - 8184:80
    restart: unless-stopped

You'll need to add a couple of environment variables in the section below your Docker-Compose. The FrndlyTV extension requires the username and password you used when you setup your account. It should look like this when you are done (no quotes required or desirable around the values):

Setup instructions for each, which are added as "Custom Channels" from the Channels DVR settings area, can typically be found on the GitHub page for the project.

You can also add a project called Watchtower to easily update your running containers on demand. Create another stack called watchtower with the following compose:

version: '3.9'
services:
  watchtower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    environment:
      - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      - WATCHTOWER_RUN_ONCE=true
    labels:
      - 'com.centurylinklabs.watchtower.enable=true'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Watchtower will now run once and then show as "exited". Leave it in this state until the next time you want to check for container updates. Select it with the tick-box in Portainer-Containers, click "Start", and it will update any running container to the latest version.

If you don't want it to update a specific container for any reason, stop that container before starting Watchtower. That container can then be re-started once Watchtower has completed. Watchtower will update Portainer, and itself, as well.

A full-on Channels DVR related set of containers might look something like this:

You can see I'm also running several of the Channels HDMI encoder and capture projects, along with an orchestration system for multiple APC UPS units (battery backups for everything electronics related) and the excellent Tailscale mesh VPN to be able to access it all from outside the house without having to open any ports.

3 Likes

FYI, if you run Docker Desktop (I do on Windows), you can install Portainer as an extension:

It's super easy and there is no need to even do that command line to get Portainer up and running. Plus you access it directly in the app instead of a webpage.

2 Likes

I don't think too many people have noticed this, but I've added a Portainer-Stacks generator to OliveTin-for-Channels. This will give you a recommended docker compose for all of the Channels-related extensions I could come up with including:

  • ADBTuner
  • ah4c (formerly androidhdmi-for-channels)
  • cc4c (ChromeCapture-for-Channels
  • EPlusTV
  • FrndlyTV-for-Channels
  • Organizr
  • Pluto-for-Channels
  • Stirr-for-Channels
  • SamsungTVPlus-for-Channels
  • Tailscale
  • VLC-Bridge-Fubo
  • VLC-Bridge-UK
  • Watchtower (for bulk container updating)

Once you have Docker and Portainer installed, get the Channels version of OliveTin up-and-running:

OliveTin docker-compose
version: '3.9'
services:
  olivetin:
    image: bnhf/olivetin:${TAG} # Add the tag like latest or test to the environment variables below
    container_name: olivetin
    dns_search: ${TAILNET} # For Tailscale users using Magic DNS, add your Tailnet (tailxxxxx.ts.net) to use hostnames for remote nodes
    ports:
      - 1337:1337
    environment:
      - CHANNELS_DVR=${CHANNELS_DVR} # Add your Channels DVR server in the form hostname:port or ip: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
    volumes:
      - ${HOST_DIR}/olivetin:/config # Add the parent directory on your Docker you'd like to use
      - ${DVR_SHARE}:/mnt/media-server6-8089 # 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 /mnt/dvr inside the container
  #channels-dvr:
    #external: true
OliveTin environment variables sample
TAG=latest
TAILNET=tailxxxxx.ts.net
CHANNELS_DVR=media-server6:8089
CHANNELS_DVR_ALTERNATES=utheater-pc:8089
CHANNELS_CLIENTS=appletv4k firestick-master
PERSISTENE_LOGS=false
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
TZ=US/Mountain
HOST_DIR=/data
DVR_SHARE=/mnt/dvr

From there, anything else you want to add by way of extensions you'll have a recommended compose right at your fingertips:

Select the project and look in Logs-stdout for the recommended compose. If there are sample environment variables, they'll be output to stderr (just to keep them separate):

Both the compose for the extension, and the environment variables (if supplied), can by copied-and-pasted into Portainer.

Portainer does a fantastic job of giving one better visibility into all things Docker: what you have running, what you used to get it running, and what container images and data volumes are on your system. Combined with Watchtower, container updates (including updating Portainer itself) are a breeze.

1 Like