OliveTin EZ-Start: A New Way to Deploy OliveTin-for-Channels Using Just Two Environment Variables to Get Started!

Given the kind of download numbers OliveTin-for-Channels has enjoyed (pushing towards 25K), it's clear that most users have been able to spin-it-up without assistance.

Having said that, there's also clearly another group of users that would like to have it in their toolkit, but have found the environment variables required challenging. Well, this project is for you! We're going to use the power of OliveTin to create the set of env vars you'll need to be able to take full advantage of that power.

I'm rolling out stage one now: which requires CDVR Server, Docker and Portainer to be installed first. Future stages will whittle that down to only requiring Docker, where you'll be able to install OliveTin from the command line, followed by Portainer and CDVR (Docker version) using OliveTin's Project One-Click!

Here's how to use it (with Docker and Portainer up-and-running). Also, be aware this EZ-Start process assumes you have CDVR Server and Docker/Portainer installed on the same system. I'll list a couple of optional env vars for those with Docker/Portainer on a separate system, and for those that are using a non-standard port for Channels, at the end of this write-up:

In Portainer-Stacks, create a new stack called olivetin. Go into the Stacks-Editor, and paste in this Docker Compose:

version: '3.9'
services:
  olivetin: # This docker-compose typically requires no editing. Use the Environment variables section of Portainer to set your values.
    # 2025.03.17
    # 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:-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} # 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:
      - 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_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.
      - PERSISTENT_LOGS=${PERSISTENT_LOGS:-false} # For supported Actions, log files are retained on an ongoing basis. false is the default.
    volumes:
      - ${HOST_DIR:-olivetin}${EZ_START:-/olivetin}:/config # Add the parent directory on your Docker you'd like to use.
      - ${DVR_SHARE:-olivetin}${EZ_START}:/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:-olivetin}${EZ_START}:/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}:/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}:/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}:/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}:/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.
      - /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:-8080}:8080
    environment:
      - FOLDER=${FOLDER:-/web}
    volumes:
      - ${HOST_DIR}/olivetin/data:${FOLDER:-/web}
    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.
  olivetin-ezstart:
    name: olivetin-ezstart
  #channels-dvr:
    #external: true
  #channels-dvr-logs:
    #external: true
  #tubearchivist:
    #external: true

You will not need to make any changes to the Docker Compose itself. However, you will need to add two environment variables:

EZ_START=-ezstart
CHANNELS_DVR_HOST=ip.address.of.your.cdvr.server

Two things to note. First the value of EZ_START is -ezstart (begins with a dash and is lowercase). Second, use the IP address of your CDVR server only without the port number (no 8089) for CHANNELS_DVR_HOST.

Next click the Update the stack button, followed by selecting the Re-pull and Redeploy slider. Once the success message is seen, you should be able to find the OliveTin-for-Channels WebUI at http://ip.address.of.your.cdvr.server:1337

Now, select the new OliveTin Environment Variables Generator/Tester Action, and you'll be able to step through the process of adding the values, particularly those that are required. Once you click Start you'll get a new list of env vars ready to be pasted into Portainer!

Armed with this list, you can stop the olivetin stack you created and paste the new list into the Environment variables section of the Stack-Editor. You'll want to replace the values from earlier, as those are no longer required! Click Update the stack, and you'll be up-and-running.

TAG=latest
DOMAIN=localdomain tailxxxxx.ts.net
HOST_PORT=1337
CHANNELS_DVR_HOST=media-server8
CHANNELS_DVR_PORT=8089
ALERT_EMAIL_SERVER=smtp.gmail.com:587
ALERT_EMAIL_FROM=[Redacted]
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted]
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
TZ=US/Mountain
HOST_DIR=/data
DVR_SHARE=/mnt/dvr
LOGS_SHARE=/mnt/channelsdvr
TUBEARCHIVIST_SHARE=/mnt/dvr
HOST_SFS_PORT=8080
FOLDER=/web
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=htpc6
PORTAINER_PORT=9443
PORTAINER_ENV=2
PERSISTENT_LOGS=false

This new Action is designed to allow you to add values later, which is why most of the fields contain environment variables by default (those cryptic looking things that start with a $). Any values you've supplied in the past do not need to be added again, simply input whatever new ones you know, and generate a new list to paste into the stack.

Finally, you can run the OliveTin Post-Install Healthcheck to verify all of the basics are covered.

Checking your OliveTin-for-Channels installation...
(extended_check=false)

Version 2025.03.17

----------------------------------------

Checking that your selected Channels DVR server (media-server8:8089) is reachable by URL:
HTTP Status: 200 indicates success...

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  1276  100  1276    0     0   178k      0 --:--:-- --:--:-- --:--:--  178k
HTTP Status: 200
Effective URL: http://media-server8:8089/

----------------------------------------

Checking that your selected Channels DVR server's data files (/mnt/media-server8-8089) are accessible:
Folders with the names Database, Images, Imports, Logs, Movies, Streaming and TV should be visible...

total 8
drwxr-xr-x 2 1000 1000 4096 Jan 20 01:44 .
drwxr-xr-x 1 root root 4096 Mar 17 16:09 ..
drwxr-xr-x 2 1000 1000    0 Mar 17 12:18 Database
drwxr-xr-x 2 1000 1000    0 Mar 16 22:22 Images
drwxr-xr-x 2 1000 1000    0 Sep 25 08:43 Imports
drwxr-xr-x 2 1000 1000    0 Sep 25 08:43 Logs
drwxr-xr-x 2 1000 1000    0 Mar 15 10:30 Movies
drwxr-xr-x 2 1000 1000    0 Nov 18 06:35 PlayOn
drwxr-xr-x 2 1000 1000    0 Mar 16 23:29 Streaming
drwxr-xr-x 2 1000 1000    0 Mar  5 22:10 TV
drwxr-xr-x 2 1000 1000    0 Jan 20 01:44 tubearchivist

If the listed folders are NOT visible, AND you have your Channels DVR and Docker on the same system:

Channels reports this path as...
G:\dvr

When using a Windows path in Portainer, change the backslashes to slashes like this...
G:/dvr

When using WSL with a Linux distro and Docker Desktop, it's also possible to use...
/mnt/g/dvr

----------------------------------------

Checking that your selected Channels DVR server's log files (/mnt/media-server8-8089_logs) are accessible:
Folders with the names data and latest should be visible...

total 12
drwxr-xr-x 2 1000 1000 4096 Feb 19 12:31 .
drwxr-xr-x 1 root root 4096 Mar 17 16:09 ..
drwxr-xr-x 2 1000 1000    0 Sep 21 02:23 2024.09.10.2115
drwxr-xr-x 2 1000 1000    0 Dec  5 19:40 2024.12.05.1913
drwxr-xr-x 2 1000 1000    0 Dec  7 13:40 2024.12.07.0453
drwxr-xr-x 2 1000 1000    0 Dec  9 19:40 2024.12.10.0055
drwxr-xr-x 2 1000 1000    0 Dec 28 02:37 2024.12.27.0121
drwxr-xr-x 2 1000 1000    0 Jan 21 16:30 2025.01.18.0528
-rwxr-xr-x 1 1000 1000  829 Feb 19 12:31 Channels DVR Server.lnk
drwxr-xr-x 2 1000 1000    0 Mar 17 17:33 data
drwxr-xr-x 2 1000 1000    0 Feb 19 12:31 latest

If the listed folders are NOT visible, AND you have your Channels DVR and Docker on the same system:

Channels reports this path as...
C:\ProgramData\ChannelsDVR

When using a Windows path in Portainer, change the backslashes to slashes like this...
C:/ProgramData/ChannelsDVR

When using WSL with a Linux distro and Docker Desktop, it's also possible to use...
/mnt/c/ProgramData/ChannelsDVR

----------------------------------------

Checking if your Portainer token is working on ports 9000 and/or 9443:

Portainer http response on port 9000 reports version 2.27.0
Portainer Environment ID for local is 2
Portainer https response on port 9443 reports version 2.27.0
Portainer Environment ID for local is 2

----------------------------------------

Here's a list of your current OliveTin-related settings:

HOSTNAME=olivetin
CHANNELS_DVR=media-server8:8089
CHANNELS_DVR_ALTERNATES=utheater-pc:8089
CHANNELS_CLIENTS=appletv4k firestick-master amazon-aftkrt
ALERT_SMTP_SERVER=smtp.gmail.com:587
ALERT_EMAIL_FROM=[Redacted]@gmail.com
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted]@gmail.com
UPDATE_YAMLS=false
UPDATE_SCRIPTS=false
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=htpc6
PORTAINER_PORT=9443
PORTAINER_ENV=2

----------------------------------------

Here's the contents of /etc/resolv.conf from inside the container:

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
search localdomain tail[Redacted].ts.net
options ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [100.100.100.100]
# Overrides: [search]
# Option ndots from: internal

----------------------------------------

Here's the contents of /etc/hosts from inside the container:

127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.26.0.3	olivetin

For those of you with Docker/Portainer on a separate system, or are using a non-standard port for CDVR, here are a couple of other env vars you could use in OliveTin EZ-Start:

CHANNELS_DVR_PORT=
PORTAINER_HOST=

So I think I did this right but don't think the check looks correct.

Checking your OliveTin-for-Channels installation...
(extended_check=false)

Version 2025.03.17

----------------------------------------

Checking that your selected Channels DVR server (192.168.50.219:8089) is reachable by URL:
HTTP Status: 200 indicates success...

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  1276  100  1276    0     0   415k      0 --:--:-- --:--:-- --:--:--  415k
HTTP Status: 200
Effective URL: http://192.168.50.219:8089/

----------------------------------------

Checking that your selected Channels DVR server's data files (/mnt/192.168.50.219-8089) are accessible:
Folders with the names Database, Images, Imports, Logs, Movies, Streaming and TV should be visible...

total 8
drwxr-xr-x 2 root root 4096 Mar 18 00:40 .
drwxr-xr-x 1 root root 4096 Mar 18 00:40 ..

If the listed folders are NOT visible, AND you have your Channels DVR and Docker on the same system:

Channels reports this path as...
/mnt/md0/DVR-storage/DVR

----------------------------------------

Checking that your selected Channels DVR server's log files (/mnt/192.168.50.219-8089_logs) are accessible:
Folders with the names data and latest should be visible...

total 4
drwxr-xr-x 2 root root   40 Mar 18 00:40 .
drwxr-xr-x 1 root root 4096 Mar 18 00:40 ..

If the listed folders are NOT visible, AND you have your Channels DVR and Docker on the same system:

Channels reports this path as...
/home/terry/channels-dvr

----------------------------------------

Checking if your Portainer token is working on ports 9000 and/or 9443:

Portainer http response on port 9000 reports version 2.21.1
Portainer Environment ID for local is 
Portainer https response on port 9000 reports version 
Portainer Environment ID for local is 

----------------------------------------

Here's a list of your current OliveTin-related settings:

HOSTNAME=olivetin
CHANNELS_DVR=192.168.50.219:8089
CHANNELS_DVR_ALTERNATES=
CHANNELS_CLIENTS=
ALERT_SMTP_SERVER=
ALERT_EMAIL_FROM=[Redacted]@
ALERT_EMAIL_PASS=[Redacted]
ALERT_EMAIL_TO=[Redacted]@
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
PORTAINER_HOST=192.168.50.149
PORTAINER_PORT=9000
PORTAINER_ENV=2

----------------------------------------

Here's the contents of /etc/resolv.conf from inside the container:

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
search 
options ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [host(192.168.65.7)]
# Overrides: [search]
# Option ndots from: internal

----------------------------------------

Here's the contents of /etc/hosts from inside the container:

127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::	ip6-localnet
ff00::	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.20.0.3	olivetin

Just above is what Channels says is the path to your recordings. Is that what your env var list showed?

And, above is where Channels DVR says your CDVR logs are stored. How does that compare with the env var list?

yes that is what Env Var shows.

TAG=latest
DOMAIN=
HOST_PORT=1337
CHANNELS_DVR_HOST=192.168.50.219
CHANNELS_DVR_PORT=8089
ALERT_EMAIL_SERVER=
ALERT_EMAIL_FROM=
ALERT_EMAIL_PASS=
ALERT_EMAIL_TO=
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
TZ=
HOST_DIR=/data
DVR_SHARE=/mnt/md0/DVR-storage/DVR
LOGS_SHARE=/home/terry/channels-dvr
TUBEARCHIVIST_SHARE=/mnt/md0/DVR-storage/DVR
HOST_SFS_PORT=8080
FOLDER=/web
PORTAINER_TOKEN=
PORTAINER_HOST=192.168.50.149
PORTAINER_PORT=9000
PORTAINER_ENV=2
PERSISTENT_LOGS=false

I only have the DVR-storage and channels-dvr folders shared via SMB if that makes any difference.

OK, so I see your CDVR server and Docker/Portainer host are on different systems. Are both of those paths mounted on the Docker/Portainer host via SMB, or are you sharing them to the CDVR host via SMB?

As a side note, the PORTAINER_PORT setting is only for https, 9000 is used for http -- and that port is fixed at 9000. So, you'd want to leave that value empty or set to 9443. 9000 is used first via http.

both can be seen and browsed. I was using 9000 so as to avoid any insecure site warnings.

On the Docker/Portainer host? And if so, on what paths? If I'm understanding what you're doing, the paths that Channels is reporting, are likely not the same paths as you're using as mount points on the Docker/Portainer host -- and those are the paths we need.

So you're using http:// and port 9000, that's not a problem. But you don't want to set the the https:// port to 9000 too. PORTAINER_PORT is only for changing https://. http:// is automatically at 9000.