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=