OliveTin EZ-Start: The Next Generation. Deploy OliveTin-for-Channels from the Command Line without the Need for Portainer to be Installed in Advance!

The next generation of OliveTin EZ-Start is here! With the latest bnhf/olivetin:latest (bnhf/olivetin:2025.03.27) push, you can now install OliveTin EZ-Start from the Linux command line (Windows users, via Windows Terminal and Debian or Ubuntu WSL2 distros).

Prerequisites:

Channels DVR
Docker (Docker or Docker Desktop)

Steps (more detail below):

  • Execute OliveTin EZ-Start Docker run command
  • Go to http://ip.address.you.specified:1338 (note this is NOT the standard OliveTin 1337)
  • Run the Install Portainer on your Docker Host Project One-Click Action
  • Run the OliveTin Environment Variables Generator/Tester OliveTin Action
  • Run the Create an OliveTin Stack in Portainer Project One-Click Action
  • Go to http://ip.address.you.specified:1337 (note we're now using the standard OliveTin 1337)

That's it! You now have OliveTin and Portainer running.

What can I do now you ask? Well, installing CDVR-related extensions via Project One-Click is always fun!

Below find additional details, and screenshots:

OliveTin EZ-Start Docker run command (use exactly as shown, with your system's IP address):

docker run -d --name olivetin-ezstart \
--pull always \
-p 1338:1337 \
-e EZ_START=-ezstart \
-e CHANNELS_DVR=x.x.x.x:8089 \
-e TZ=$(readlink /etc/localtime) \
-v /config \
-v /var/run/docker.sock:/var/run/docker.sock \
bnhf/olivetin:latest

Don't forget to put in your system's IP address in place of the x.x.x.x!

Go to the IP address you specified, at port 1338:

Use the "hamburger" icon to switch to the Project One-Click page, and run the Install Portainer on your Docker Host Project One-Click Action:

Back on the main Actions page, Run the OliveTin Environment Variables Generator/Tester OliveTin Action. For the typical user, running everything on a single system, you shouldn't need to touch any of the default values. Advanced users, or those with sophisticated setups, should be able to customize to their requirements:

Next, we'll install the full version of OliveTin-for-Channels. Run the Create an OliveTin Stack in Portainer Project One-Click Action:

You now have Portainer installed, complete with a PORTAINER_TOKEN, along with the full version of OliveTin. You can close your current OliveTin EZ-Start browser tab, and navigate to http://ip.address.you.specified:1337 (note we're now using the standard OliveTin 1337).

Job done!

For advanced setups, where CDVR and Docker/Portainer are not on the same system, or if you're running Tailscale with DVRs local and remote -- see this post:

I deleted my Portainer ... to test but the token is still there. Any way to get rid of the token or should I install portainer Via CLI and delete the token then portainer?

155acb57d7a6fd383a4ce13749f0500eb5251b69aede698590cb4592f57577c1
Portainer container creation failed
A Portainer token named olivetin has been created...


and a Portainer local environment initialized...

When you delete Portainer, you need to stop the container, delete the container, and then remove the portainer_data Docker Volume. And, if you really want the full test, delete the Portainer image as well.

1 Like

Looking Good

@bnhf OOPs Cannot use Port 9000 as that is used in my Java Installation.

(HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:9000 -> 127.0.0.1:0: listen tcp 0.0.0.0:9000: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

OK, I'll make that configurable. It'll be a bit before I can push a fix...

@Edwin_Perez Pull latest again, and you should now see options for alternate http and https ports for Portainer. Worked for spinning-up Portainer and the full version of OliveTin using port 9001.

I also eliminated the "Portainer Edge Agent" port of 8000, as that'll conflict for many, and the few people that use Portainer Agents are probably not configuring for that more advanced approach.

Installed flawlessly on WSL 2 docker on Ubuntu 24.04 with CDVR installed on Windows 11. I really expected something to need changing, but it all went fine. Installed a couple of one clicks and ran some actions. No issues or surprises. Great work. :+1:

1 Like

Worked ... Great Work

@bnhf I did have one thing that might be difficult for beginners .... I mistakenly added a wrong path ... So I went back into variables(Olivetin) and corrected it but it did not change it in the Stack ... I went into portainer and corrected it ... just an FYI.

1 Like

Works great so long as Docker and DVR are on the same host but that may fall into more advanced area.

After this basic spin-up, to get Portainer installed, there's a step to install the full version of OliveTin. Lots of options at that stage to support more sophisticated installations. But, the single system user can typically leave everything default.

With Portainer running, you'd be able to add whatever SMB or NFS shares to Portainer-Volumes, and then add them by name here, before the initial full OliveTin deployment. However, you can also wait, and add additional DVR share values whenever. Creating an updated list of env vars, and pasting them into a stopped OliveTin stack can be done anytime:

I definitely want to make this as easy as possible for a range of users, so let me know if you see anything in particular I could do to continue automating the process. I'm trying to walk the line between being easy enough for newbies, and having the power options available for power users. :slight_smile:

My bad I was lazy and did not read through all the options in the Generator/Tester.

@bnhf ... Want to say thanks for your contribution of OliveTin ... I recreated everything using EZ-Start and everything was so easy.... both Windows Docker and ubuntu docker.

1 Like

Containers that did not use Portainer had a ! so I simply recreated them.

Getting the following error on the last step.

JSON response from http://192.168.1.117:9000/api/stacks/create/standalone/string?endpointId=1:
{"message":"failed to deploy a stack: compose up operation failed: Error response from daemon: driver failed programming external connectivity on endpoint static-file-server (3c6202df1a2742ab33d368f45b1e44dbe9fadf0cbecf82fac7fd62390bc468ce): listen tcp4 0.0.0.0:8080: bind: address already in use","details":"Failed to deploy a stack: compose up operation failed: Error response from daemon: driver failed programming external connectivity on endpoint static-file-server (3c6202df1a2742ab33d368f45b1e44dbe9fadf0cbecf82fac7fd62390bc468ce): listen tcp4 0.0.0.0:8080: bind: address already in use"}
false

Change HOST_SFS_PORT to something other than 8080, I use 8088.
Something on your server is already using port 8080.

OliveTin EZ-Start: The Next Generation - Advanced Setup Instructions

Though OliveTin EZ-Start: The Next Generation is targeted mostly at users running CDVR server and Docker on the same system, it is in fact, not limited to that. It can easily be used with scenarios where you're running CDVR on one system, and Docker on another.

Here's an example of a Docker run command, that supports that:

docker run -d --name olivetin-ezstart \
--pull always \
-p 1338:1337 \
-e EZ_START=-ezstart \
-e CHANNELS_DVR=192.168.110.66:8089 \
-e PORTAINER_HOST=192.168.110.111 \
-e TZ=$(readlink /etc/localtime) \
-v /config \
-v /var/run/docker.sock:/var/run/docker.sock \
bnhf/olivetin:latest

All we're adding in the above is an IP address for PORTAINER_HOST, which would be the LAN IP for the system you're running Docker on.

Expanding a bit further, let's say you're running multiple DVRs, some local and some remote. In this case you're no doubt using Tailscale with MagicDNS. Here's an example where we're adding our Tailnet using --dns-search, and now we can use hostnames to refer to any systems on our far-flung Tailnet:

docker run -d --name olivetin-ezstart \
--pull always \
--dns-search tailxxxxx.ts.net \
-p 1338:1337 \
-e EZ_START=-ezstart \
-e CHANNELS_DVR=media-server8:8089 \
-e PORTAINER_HOST=convertible-pc3 \
-e TZ=$(readlink /etc/localtime) \
-v /config \
-v /var/run/docker.sock:/var/run/docker.sock \
bnhf/olivetin:latest

As soon as we start talking about multiple systems, we also have to plan for using some sort of network file sharing. You can use both NFS and SMB (aka Samba or CIFS), and in the case of Samba, I've added an OliveTin Action to allow you to create Docker/Portainer Volumes attached to those Samba shares.

For the purposes of OliveTin-for-Channels, I've established some "standard" volume names to use, with up to 3 DVRs supported out-of-the-box. The names are:

  • channels-dvr (where your CDVR recordings are stored)
  • channels-dvr-logs (where your CDVR program files aka "executables" are located)
  • tubearchivist (often in with your CDVR recordings, in which case you don't need a new volume)
  • channels-dvr2
  • channel-dvr2-logs
  • tubearchivist2
  • channels-dvr3
  • channels-dvr3-logs
  • tubearchivist3

When setting up your Docker/Portainer Volumes during the EZ-Start:TNG process, you'll want to do this after you've added Portainer, but before any other steps. That way you can use the volume names above when creating your list of env vars, and when spinning up the full version of OliveTin:

Special thanks to @TerryD for testing EZ-Start with multiple DVRs!

Even though they are already specified correctly the Generator/Tester still comes up with incorrect path for remote DVR1, just an FYI.

TAG=latest
DOMAIN=local
HOST_PORT=1337
CHANNELS_DVR_HOST=192.168.50.219
CHANNELS_DVR_PORT=8089
CHANNELS_DVR2_HOST=192.168.50.32
CHANNELS_DVR2_PORT=8089
CHANNELS_DVR3_HOST=192.168.50.149
CHANNELS_DVR3_PORT=8089
CHANNELS_CLIENTS=
ALERT_EMAIL_SERVER=
ALERT_EMAIL_FROM=
ALERT_EMAIL_PASS=
ALERT_EMAIL_TO=
UPDATE_YAMLS=true
UPDATE_SCRIPTS=true
TZ=America/Los_Angeles
HOST_DIR=/data
DVR_SHARE=/var/lib/docker/volumes/channels-dvr/_data
LOGS_SHARE=/var/lib/docker/volumes/channels-dvr-logs/_data
TUBEARCHIVIST_SHARE=/var/lib/docker/volumes/channels-dvr/_data
DVR2_SHARE=channels-dvr2
LOGS2_SHARE=channels-dvr2-logs
TUBEARCHIVIST2_SHARE=channels-dvr2
DVR3_SHARE=/mnt/f/dvr-storage/dvr
LOGS3_SHARE=/mnt/c/programdata/channelsdvr
TUBEARCHIVIST3_SHARE=/mnt/f/dvr-storage/dvr
HOST_SFS_PORT=8080
FOLDER=/web
PORTAINER_TOKEN=ptr_LcqVox4Qdta9BFVunvHSfsTwsHw/fdiVLr4eGRI111I=
PORTAINER_HOST=192.168.50.149
PORTAINER_PORT=9443
PORTAINER_ENV=1
PERSISTENT_LOGS=false

I was able to duplicate that, thanks for reporting it. Fix pushed as :latest (2025.03.31).