Project One-Click: All-in-One Installations of Docker Extensions and CDVR Custom Channels

I installed container station on the qnap nas and then installed portainer through that using docker compose which is the only thing that container station would accept. I used chatgpt to translate docker commands into docker compose. Do you think this is what's wrong? Should i install docker onto the nas through an installation download somewhere instead?

Here is my portainer container list:


Here is my portainer network list:

By changing the folder "dvr" to "DVR," I think was able to get olivetin to find the directory where my CDVR recordings are located. Here is what the health check says:

Checking your OliveTin installation...
(extended_check=false)

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

Checking that your selected Channels DVR server (192.168.68.55: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  1246k      0 --:--:-- --:--:-- --:--:-- 1246k
HTTP Status: 200
Effective URL: http://192.168.68.55:8089/

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

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

total 208
drwxrwxrwx 12 root root   4096 Sep  1 11:38 .
drwxr-xr-x  1 root root   4096 Sep  1 16:07 ..
drwxr-xr-x  2 root root   4096 Aug 15  2022 @Recently-Snapshot
drwxrwxrwx  2 root root   4096 Aug 11 15:10 @Recycle
drwxr-xr-x 32 root root   4096 Sep  1 15:04 Database
drwxr-xr-x  4 root root 163840 Sep  1 10:30 Images
drwxr-xr-x  5 root root   4096 Aug 16  2022 Imports
drwxr-xr-x  4 root root   4096 Aug 16  2022 Logs
drwxrwxrwx  3 root root   4096 Sep  1 10:30 Movies
drwxr-xr-x  4 root root   4096 Aug 19  2022 PlayOn
drwxr-xr-x 19 root root   4096 Sep  1 06:45 Streaming
drwxr-xr-x 25 root root   4096 Aug 27 07:59 TV

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

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

total 112
drwxr-xr-x    4 root root  4096 Aug 16  2022 .
drwxr-xr-x    1 root root  4096 Sep  1 16:07 ..
drwxr-xr-x 2107 root root 36864 Sep  1 00:30 comskip
drwxr-xr-x 2866 root root 61440 Sep  1 03:44 recording

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

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

HOSTNAME=olivetin
CHANNELS_DVR=192.168.68.55:8089
CHANNELS_DVR_ALTERNATES=
CHANNELS_CLIENTS=192.168.68.50
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=true
UPDATE_SCRIPTS=true
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=192.168.68.55

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

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

search local
nameserver 127.0.0.11
options ndots:0

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

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.29.56.2	olivetin

Better, but you still need to figure out where your OliveTin executables are located for the LOGS_SHARE variable. We can deal with that next though.

I see your Docker gateway address is non-standard on the QNAP:

So try setting the IP address for your Portainer host to 10.0.3.1

Thanks but it still gives the error of not being able to connect:

exit status 1

+ dvr=10.0.3.1:8089
++ basename /config/plex-for-channels.sh
+ extension=plex-for-channels.sh
+ extension=plex-for-channels
+ cp /config/plex-for-channels.env /tmp
+ envFile=/tmp/plex-for-channels.env
+ [[ -n 10.0.3.1 ]]
+ extensionURL=10.0.3.1:7779
+ [[ 9500 == \# ]]
+ cdvrStartingChannel=9500
+ [[ -n 9500 ]]
+ cdvrIgnoreM3UNumbers=ignore
+ curl -s -o /dev/null http://10.0.3.1:7779
+ envVars=("TAG=$2" "HOST_PORT=$3" "PLEX_PORT=$4" "PLEX_CODE=$5" "CDVR_STARTING_CHANNEL=$6")
+ printf '%s\n' TAG=latest HOST_PORT=7779 PLEX_PORT=7777 PLEX_CODE=local CDVR_STARTING_CHANNEL=9500
+ sed -i /=#/d /tmp/plex-for-channels.env
+ /config/portainerstack.sh plex-for-channels
+ stackName=plex-for-channels
+ portainerHost=10.0.3.1
+ curl -s -o /dev/null http://10.0.3.1:9000
+ portainerURL='https://10.0.3.1:9443/api/stacks?type=2&method=string&endpointId=2'
+ portainerToken=ptr_04ckjy0u1H17MFv6OcyZAqRHc80fPqBFh6dJnfNTIqs=
+ cp /config/plex-for-channels.yaml /tmp
+ stackFile=/tmp/plex-for-channels.yaml
+ envFile=/tmp/plex-for-channels.env
++ grep DVR_SHARE= /tmp/plex-for-channels.env
++ grep -v /
++ awk -F= '{print $2}'
+ dockerVolume=
++ grep VOL_EXTERNAL= /tmp/plex-for-channels.env
++ grep -v '#'
++ awk -F= '{print $2}'
+ volumeExternal=
++ grep VOL_NAME= /tmp/plex-for-channels.env
++ grep -v '#'
++ awk -F= '{print $2}'
+ volumeName=
+ [[ -n '' ]]
++ sed 's/\\/\\\\/g' /tmp/plex-for-channels.yaml
++ sed 's/"/\\"/g'
++ awk '{printf "%s\\n", $0}'
+ stackContent='version: '\''3.9'\''\nservices:\n  # GitHub home for this project with setup instructions: https://github.com/jgomez177/plex-for-channels\n  # Docker container home for this project: https://ghcr.io/jgomez177/plex-for-channels\n  plex-for-channels:\n    image: ghcr.io/jgomez177/plex-for-channels:${TAG}\n    container_name: plex-for-channels\n    ports:\n      - ${HOST_PORT}:${PLEX_PORT}\n    environment:\n      - PLEX_PORT=${PLEX_PORT}\n    restart: unless-stopped\n\n  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode\n'
+ stackEnvVars='['
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "latest"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "latest"},{"name": "HOST_PORT", "value": "7779"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "latest"},{"name": "HOST_PORT", "value": "7779"},{"name": "PLEX_PORT", "value": "7777"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "latest"},{"name": "HOST_PORT", "value": "7779"},{"name": "PLEX_PORT", "value": "7777"},{"name": "PLEX_CODE", "value": "local"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "latest"},{"name": "HOST_PORT", "value": "7779"},{"name": "PLEX_PORT", "value": "7777"},{"name": "PLEX_CODE", "value": "local"},{"name": "CDVR_STARTING_CHANNEL", "value": "9500"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "latest"},{"name": "HOST_PORT", "value": "7779"},{"name": "PLEX_PORT", "value": "7777"},{"name": "PLEX_CODE", "value": "local"},{"name": "CDVR_STARTING_CHANNEL", "value": "9500"}]'
++ cat
+ stackJSON='{
  "Name": "plex-for-channels",
  "SwarmID": "",
  "StackFileContent": "version: '\''3.9'\''\nservices:\n  # GitHub home for this project with setup instructions: https://github.com/jgomez177/plex-for-channels\n  # Docker container home for this project: https://ghcr.io/jgomez177/plex-for-channels\n  plex-for-channels:\n    image: ghcr.io/jgomez177/plex-for-channels:${TAG}\n    container_name: plex-for-channels\n    ports:\n      - ${HOST_PORT}:${PLEX_PORT}\n    environment:\n      - PLEX_PORT=${PLEX_PORT}\n    restart: unless-stopped\n\n  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode\n",
  "Env": [{"name": "TAG", "value": "latest"},{"name": "HOST_PORT", "value": "7779"},{"name": "PLEX_PORT", "value": "7777"},{"name": "PLEX_CODE", "value": "local"},{"name": "CDVR_STARTING_CHANNEL", "value": "9500"}]
}'
+ echo 'JSON response from https://10.0.3.1:9443/api/stacks?type=2&method=string&endpointId=2:'
++ curl -k -X POST -H 'Content-Type: application/json' -H 'X-API-Key: ptr_04ckjy0u1H17MFv6OcyZAqRHc80fPqBFh6dJnfNTIqs=' -d '{
  "Name": "plex-for-channels",
  "SwarmID": "",
  "StackFileContent": "version: '\''3.9'\''\nservices:\n  # GitHub home for this project with setup instructions: https://github.com/jgomez177/plex-for-channels\n  # Docker container home for this project: https://ghcr.io/jgomez177/plex-for-channels\n  plex-for-channels:\n    image: ghcr.io/jgomez177/plex-for-channels:${TAG}\n    container_name: plex-for-channels\n    ports:\n      - ${HOST_PORT}:${PLEX_PORT}\n    environment:\n      - PLEX_PORT=${PLEX_PORT}\n    restart: unless-stopped\n\n  # Default Environment variables can be found below under stderr -- copy and paste into Portainer-Stacks Environment variables section in Advanced mode\n",
  "Env": [{"name": "TAG", "value": "latest"},{"name": "HOST_PORT", "value": "7779"},{"name": "PLEX_PORT", "value": "7777"},{"name": "PLEX_CODE", "value": "local"},{"name": "CDVR_STARTING_CHANNEL", "value": "9500"}]
}' 'https://10.0.3.1:9443/api/stacks?type=2&method=string&endpointId=2'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:04 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:06 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:07 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:08 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:09 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:10 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:11 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:12 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:13 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:14 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:15 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:16 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:17 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:18 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:19 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:20 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:21 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:22 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:23 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:24 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:25 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:26 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:27 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:28 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:29 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:30 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:31 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:32 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:33 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:34 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:35 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:36 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:37 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:38 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:39 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:40 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:41 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:42 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:43 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:44 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:45 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:46 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:47 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:48 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:49 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:50 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:51 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:52 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:53 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:54 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:55 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:56 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:57 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:58 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:59 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:00 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:02 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:03 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:04 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:05 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:06 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:07 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:08 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:09 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:10 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:11 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:12 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:13 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:14 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:15 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:16 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:17 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:18 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:19 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:20 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:21 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:22 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:23 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:24 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:25 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:26 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:27 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:28 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:29 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:30 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:31 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:32 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:33 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:34 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:35 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:36 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:37 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:38 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:39 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:40 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:41 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:42 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:43 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:44 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:45 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:46 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:47 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:48 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:49 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:50 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:51 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:52 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:53 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:54 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:55 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:56 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:57 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:58 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:01:59 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:00 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:02 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:03 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:04 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:05 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:06 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:07 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:08 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:09 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:10 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:02:11 --:--:--     0
curl: (28) Failed to connect to 10.0.3.1 port 9443: Connection timed out
+ portainerResponse=
+ [[ -z '' ]]
+ exit 1
+ [[ 1 == 1 ]]
+ exit 1

Here is the health check:

Checking your OliveTin installation...
(extended_check=false)

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

Checking that your selected Channels DVR server (10.0.3.1: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  1246k      0 --:--:-- --:--:-- --:--:-- 1246k
HTTP Status: 200
Effective URL: http://10.0.3.1:8089/

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

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

total 208
drwxrwxrwx 12 root root   4096 Sep  1 11:38 .
drwxr-xr-x  1 root root   4096 Sep  1 20:19 ..
drwxr-xr-x  2 root root   4096 Aug 15  2022 @Recently-Snapshot
drwxrwxrwx  2 root root   4096 Aug 11 15:10 @Recycle
drwxr-xr-x 32 root root   4096 Sep  1 15:04 Database
drwxr-xr-x  4 root root 163840 Sep  1 19:30 Images
drwxr-xr-x  5 root root   4096 Aug 16  2022 Imports
drwxr-xr-x  4 root root   4096 Aug 16  2022 Logs
drwxrwxrwx  3 root root   4096 Sep  1 17:43 Movies
drwxr-xr-x  4 root root   4096 Aug 19  2022 PlayOn
drwxr-xr-x 19 root root   4096 Sep  1 19:30 Streaming
drwxr-xr-x 25 root root   4096 Aug 27 07:59 TV

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

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

total 112
drwxr-xr-x    4 root root  4096 Aug 16  2022 .
drwxr-xr-x    1 root root  4096 Sep  1 20:19 ..
drwxr-xr-x 2107 root root 36864 Sep  1 00:30 comskip
drwxr-xr-x 2867 root root 61440 Sep  1 16:59 recording

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

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

HOSTNAME=olivetin
CHANNELS_DVR=10.0.3.1:8089
CHANNELS_DVR_ALTERNATES=
CHANNELS_CLIENTS=192.168.68.50
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=true
UPDATE_SCRIPTS=true
PORTAINER_TOKEN=[Redacted]
PORTAINER_HOST=10.0.3.1

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

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

search local
nameserver 127.0.0.11
options ndots:0

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

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.29.56.2	olivetin

Thanks for checking into this for me. Any other ideas? Should I just start all over with a docker installation that is not from the qnap store?

By changing the folder "dvr" to "DVR," I think was able to get olivetin to find the directory where my CDVR recordings are located.

I too have been having less than complete success getting things to work, and the difficulties have to do with case sensitivity of network shares. I haven't yet solved everything for my setup but I have found that in some environments case sensitivity can be an issue. I'm not an expert but simply provide some references I have found that might suggest this can be a real issue in some cases (no pun intended).

Case-sensitivity of file and directory names in a multiprotocol environment

Can't connect on network share because it is case sensitive

The case sensitive of CIFS share name

[Cosmetic only] Upper-case shares shown in Windows 10 as lower-case

@bnhf
Do you want to tackle creating one for a Channels DVR docker container?
The posts were specific to replacing a Synology package install with a TVE docker container install and so had to use host mode networking. But could easily be modified.

P.S. The very first docker container I used was for Channels DVR

2 Likes

I think that's a great idea. It could be nice for newbies, but also could be slick for people wanting to quickly spin-up additional CDVR servers for production or experimentation.

And... it's done... I think. I could use a couple of testers on this one, given that I don't have Intel Quick Sync hardware transcoding readily available atm, so I can't test that option (mostly just to confirm the stack deploys). Plus, there are lots of ways people handle their CDVR recordings.

@chDVRuser, if you could please give this twirl on the dance floor, and anybody else that's up for it. The stack and container name are both channels-dvr, so if you want to try this out, both those names need to be available in Docker/Portainer. In a near future update, I'll make this so that those names can have a digit appended to them, but that doesn't easily fit my current scheme.

It's pushed as bnhf/olivetin:latest, and bnhf/olivetin:2024.09.14:

EDIT: "Sub-directory will be filebot." changed to "Sub-directory will be channels-dvr."

Wow, that was quick!

Before I can test it, I'll have to bring down one of my containers, rename it and the host directory since they're both channels-dvr.

Questions;

  1. For the Channels DVR executables/log directory, Will this create that directory on a Synology NAS, or should the user create that first {HOST_DIR}/channels-dvr (/volume1/docker/channels-dvr). On a Synology, the /volume1/docker shared folder is created when the user installs the Docker or Container Manager Synology Package.
  2. For the Channels DVR recording directory, Will this create that shared folder (directory) on a Synology NAS, or should the user create that first {DVR_SHARE} (/volume1/ChDVRpoc)

Since I only use OliveTin for channel lineup change notifications, I haven't set it up to use this Project One-Click, so it may be tomorrow before I can get that setup and trial this.

I forgot about that little gotcha on Synology. Unfortunately I can't create directories on the host from inside the OliveTin container (except on paths already bound to OliveTin). But, I could add another "confirmation" check box reminding Synology users of the need to do this before clicking "Start".

Your input, and testing, are much appreciated!

You also might want to add notes that users running Synology Container Manager, Windows and Mac Docker Desktop need to use host NETWORK_MODE, but Windows and Mac Docker Desktop don't support that, so they're SOL.

Good news it looks like windows users might not be locked out from 4.34 Docker release notes:

Host networking is supported on Docker Desktop version 4.34 and later. To enable this feature:

Sign in to your Docker account in Docker Desktop.
Navigate to Settings.
Under the Resources tab, select Network.
Check the Enable host networking option.
Select Apply and restart.
This feature works in both directions. This means you can access a server that is running in a container from your host and you can access servers running on your host from any container that is started with host networking enabled. TCP as well as UDP are supported as communication protocols.

Examples
The following command starts netcat in a container that listens on port 8000:



 docker run --rm -it --net=host nicolaka/netshoot nc -lkv 0.0.0.0 8000
Port 8000 will then be available on the host and you can connect to it with the following command from another terminal:


 nc localhost 8000
3 Likes

Well the good news is it created a Channels DVR container!
The bad news is the compose sent didn't enable host mode networking or hardware transcoding.
Also, when it creates the Channels DVR container and you go into the Channels DVR web admin UI, you need to know where your recording directory is mapped to in the container. (I figured it out, but other users will be stumped). The way you set it up, it's /shares/DVR and capitalization matters.



OliveTin Standard Output
JSON response from http://192.168.1.4:9000/api/stacks?type=2&method=string&endpointId=2:
{"Id":3,"Name":"channels-dvr","Type":2,"EndpointId":2,"SwarmId":"","EntryPoint":"docker-compose.yml","Env":[{"name":"TAG","value":"tve"},{"name":"HOST_PORT","value":"8589"},{"name":"CHANNELS_PORT","value":"8589"},{"name":"TZ","value":"America/Los_Angeles"},{"name":"HOST_DIR","value":"/volume1/docker"},{"name":"DVR_SHARE","value":"/volume1/ChDVRpoc"},{"name":"NETWORK_MODE","value":"host"},{"name":"DEVICES","value":"true"}],"ResourceControl":{"Id":3,"ResourceId":"2_channels-dvr","SubResourceIds":[],"Type":6,"UserAccesses":[],"TeamAccesses":[],"Public":false,"AdministratorsOnly":true,"System":false},"Status":1,"ProjectPath":"/data/compose/3","CreationDate":1726344287,"CreatedBy":"my_portainer_username","UpdateDate":0,"UpdatedBy":"","AdditionalFiles":null,"AutoUpdate":null,"Option":null,"GitConfig":null,"FromAppTemplate":false,"Namespace":"","IsComposeFormat":false}
true
OliveTin Standard Error
++ basename /config/channels-dvr.sh
+ extension=channels-dvr.sh
+ extension=channels-dvr
+ cp /config/channels-dvr.env /tmp
+ envFile=/tmp/channels-dvr.env
+ envVars=("TAG=$1" "HOST_PORT=$2" "CHANNELS_PORT=$3" "TZ=$4" "HOST_DIR=$5" "DVR_SHARE=$6" "VOL_EXTERNAL=$7" "VOL_NAME=$8" "NETWORK_MODE=$9" "DEVICES=${10}")
+ printf '%s\n' TAG=tve HOST_PORT=8589 CHANNELS_PORT=8589 TZ=America/Los_Angeles HOST_DIR=/volume1/docker DVR_SHARE=/volume1/ChDVRpoc VOL_EXTERNAL=# VOL_NAME=# NETWORK_MODE=host DEVICES=true
+ sed -i /=#/d /tmp/channels-dvr.env
+ /config/portainerstack.sh channels-dvr
+ stackName=channels-dvr
+ portainerHost=192.168.1.4
+ curl -s -o /dev/null http://192.168.1.4:9000
+ portainerURL='http://192.168.1.4:9000/api/stacks?type=2&method=string&endpointId=2'
+ portainerToken=REDACTED
+ cp /config/channels-dvr.yaml /tmp
+ stackFile=/tmp/channels-dvr.yaml
+ envFile=/tmp/channels-dvr.env
++ grep DVR_SHARE= /tmp/channels-dvr.env
++ grep -v /
++ awk -F= '{print $2}'
+ dockerVolume=
++ grep VOL_EXTERNAL= /tmp/channels-dvr.env
++ grep -v '#'
++ awk -F= '{print $2}'
+ volumeExternal=
++ grep VOL_NAME= /tmp/channels-dvr.env
++ grep -v '#'
++ awk -F= '{print $2}'
+ volumeName=
+ [[ -n '' ]]
++ sed 's/\\/\\\\/g' /tmp/channels-dvr.yaml
++ sed 's/"/\\"/g'
++ awk '{printf "%s\\n", $0}'
+ stackContent='version: '\''3.9'\''\nservices:\n  # 2024.09.13\n  # Docker Hub home for this project: https://hub.docker.com/r/fancybits/channels-dvr\n  channels-dvr:\n    image: fancybits/channels-dvr:${TAG}\n    container_name: channels-dvr\n    #devices:\n      #- /dev/dri:/dev/dri\n    ports:\n      - ${HOST_PORT}:${CHANNELS_PORT}\n    environment:\n      - CHANNELS_PORT=${CHANNELS_PORT}\n      - TZ=${TZ}\n    volumes:\n      - ${HOST_DIR}/channels-dvr:/channels-dvr\n      - ${DVR_SHARE}:/shares/DVR\n    #network_mode: host\n    restart: unless-stopped\n#volumes: # use this section if you'\''ve setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /channels-dvr inside the container\n  #channels-dvr:\n    #external: ${VOL_EXTERNAL}\n    #name: ${VOL_NAME}\n'
+ stackEnvVars='['
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "tve"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},{"name": "CHANNELS_PORT", "value": "8589"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},{"name": "CHANNELS_PORT", "value": "8589"},{"name": "TZ", "value": "America/Los_Angeles"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},{"name": "CHANNELS_PORT", "value": "8589"},{"name": "TZ", "value": "America/Los_Angeles"},{"name": "HOST_DIR", "value": "/volume1/docker"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},{"name": "CHANNELS_PORT", "value": "8589"},{"name": "TZ", "value": "America/Los_Angeles"},{"name": "HOST_DIR", "value": "/volume1/docker"},{"name": "DVR_SHARE", "value": "/volume1/ChDVRpoc"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},{"name": "CHANNELS_PORT", "value": "8589"},{"name": "TZ", "value": "America/Los_Angeles"},{"name": "HOST_DIR", "value": "/volume1/docker"},{"name": "DVR_SHARE", "value": "/volume1/ChDVRpoc"},{"name": "NETWORK_MODE", "value": "host"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},{"name": "CHANNELS_PORT", "value": "8589"},{"name": "TZ", "value": "America/Los_Angeles"},{"name": "HOST_DIR", "value": "/volume1/docker"},{"name": "DVR_SHARE", "value": "/volume1/ChDVRpoc"},{"name": "NETWORK_MODE", "value": "host"},{"name": "DEVICES", "value": "true"},'
+ IFS==
+ read -r key value
+ stackEnvVars='[{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},{"name": "CHANNELS_PORT", "value": "8589"},{"name": "TZ", "value": "America/Los_Angeles"},{"name": "HOST_DIR", "value": "/volume1/docker"},{"name": "DVR_SHARE", "value": "/volume1/ChDVRpoc"},{"name": "NETWORK_MODE", "value": "host"},{"name": "DEVICES", "value": "true"}]'
++ cat
+ stackJSON='{
  "Name": "channels-dvr",
  "SwarmID": "",
  "StackFileContent": "version: '\''3.9'\''\nservices:\n  # 2024.09.13\n  # Docker Hub home for this project: https://hub.docker.com/r/fancybits/channels-dvr\n  channels-dvr:\n    image: fancybits/channels-dvr:${TAG}\n    container_name: channels-dvr\n    #devices:\n      #- /dev/dri:/dev/dri\n    ports:\n      - ${HOST_PORT}:${CHANNELS_PORT}\n    environment:\n      - CHANNELS_PORT=${CHANNELS_PORT}\n      - TZ=${TZ}\n    volumes:\n      - ${HOST_DIR}/channels-dvr:/channels-dvr\n      - ${DVR_SHARE}:/shares/DVR\n    #network_mode: host\n    restart: unless-stopped\n#volumes: # use this section if you'\''ve setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /channels-dvr inside the container\n  #channels-dvr:\n    #external: ${VOL_EXTERNAL}\n    #name: ${VOL_NAME}\n",
  "Env": [{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},{"name": "CHANNELS_PORT", "value": "8589"},{"name": "TZ", "value": "America/Los_Angeles"},{"name": "HOST_DIR", "value": "/volume1/docker"},{"name": "DVR_SHARE", "value": "/volume1/ChDVRpoc"},{"name": "NETWORK_MODE", "value": "host"},{"name": "DEVICES", "value": "true"}]
}'
+ echo 'JSON response from http://192.168.1.4:9000/api/stacks?type=2&method=string&endpointId=2:'
++ curl -k -X POST -H 'Content-Type: application/json' -H 'X-API-Key: REDACTED' -d '{
  "Name": "channels-dvr",
  "SwarmID": "",
  "StackFileContent": "version: '\''3.9'\''\nservices:\n  # 2024.09.13\n  # Docker Hub home for this project: https://hub.docker.com/r/fancybits/channels-dvr\n  channels-dvr:\n    image: fancybits/channels-dvr:${TAG}\n    container_name: channels-dvr\n    #devices:\n      #- /dev/dri:/dev/dri\n    ports:\n      - ${HOST_PORT}:${CHANNELS_PORT}\n    environment:\n      - CHANNELS_PORT=${CHANNELS_PORT}\n      - TZ=${TZ}\n    volumes:\n      - ${HOST_DIR}/channels-dvr:/channels-dvr\n      - ${DVR_SHARE}:/shares/DVR\n    #network_mode: host\n    restart: unless-stopped\n#volumes: # use this section if you'\''ve setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /channels-dvr inside the container\n  #channels-dvr:\n    #external: ${VOL_EXTERNAL}\n    #name: ${VOL_NAME}\n",
  "Env": [{"name": "TAG", "value": "tve"},{"name": "HOST_PORT", "value": "8589"},{"name": "CHANNELS_PORT", "value": "8589"},{"name": "TZ", "value": "America/Los_Angeles"},{"name": "HOST_DIR", "value": "/volume1/docker"},{"name": "DVR_SHARE", "value": "/volume1/ChDVRpoc"},{"name": "NETWORK_MODE", "value": "host"},{"name": "DEVICES", "value": "true"}]
}' 'http://192.168.1.4:9000/api/stacks?type=2&method=string&endpointId=2'
  % 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  1187    0     0  100  1187      0    985  0:00:01  0:00:01 --:--:--   985
100  2049  100   862  100  1187    410    565  0:00:02  0:00:02 --:--:--   977
100  2049  100   862  100  1187    410    565  0:00:02  0:00:02 --:--:--   977
+ portainerResponse='{"Id":3,"Name":"channels-dvr","Type":2,"EndpointId":2,"SwarmId":"","EntryPoint":"docker-compose.yml","Env":[{"name":"TAG","value":"tve"},{"name":"HOST_PORT","value":"8589"},{"name":"CHANNELS_PORT","value":"8589"},{"name":"TZ","value":"America/Los_Angeles"},{"name":"HOST_DIR","value":"/volume1/docker"},{"name":"DVR_SHARE","value":"/volume1/ChDVRpoc"},{"name":"NETWORK_MODE","value":"host"},{"name":"DEVICES","value":"true"}],"ResourceControl":{"Id":3,"ResourceId":"2_channels-dvr","SubResourceIds":[],"Type":6,"UserAccesses":[],"TeamAccesses":[],"Public":false,"AdministratorsOnly":true,"System":false},"Status":1,"ProjectPath":"/data/compose/3","CreationDate":1726344287,"CreatedBy":"my_portainer_username","UpdateDate":0,"UpdatedBy":"","AdditionalFiles":null,"AutoUpdate":null,"Option":null,"GitConfig":null,"FromAppTemplate":false,"Namespace":"","IsComposeFormat":false}'
+ [[ -z {"Id":3,"Name":"channels-dvr","Type":2,"EndpointId":2,"SwarmId":"","EntryPoint":"docker-compose.yml","Env":[{"name":"TAG","value":"tve"},{"name":"HOST_PORT","value":"8589"},{"name":"CHANNELS_PORT","value":"8589"},{"name":"TZ","value":"America/Los_Angeles"},{"name":"HOST_DIR","value":"/volume1/docker"},{"name":"DVR_SHARE","value":"/volume1/ChDVRpoc"},{"name":"NETWORK_MODE","value":"host"},{"name":"DEVICES","value":"true"}],"ResourceControl":{"Id":3,"ResourceId":"2_channels-dvr","SubResourceIds":[],"Type":6,"UserAccesses":[],"TeamAccesses":[],"Public":false,"AdministratorsOnly":true,"System":false},"Status":1,"ProjectPath":"/data/compose/3","CreationDate":1726344287,"CreatedBy":"my_portainer_username","UpdateDate":0,"UpdatedBy":"","AdditionalFiles":null,"AutoUpdate":null,"Option":null,"GitConfig":null,"FromAppTemplate":false,"Namespace":"","IsComposeFormat":false} ]]
+ echo '{"Id":3,"Name":"channels-dvr","Type":2,"EndpointId":2,"SwarmId":"","EntryPoint":"docker-compose.yml","Env":[{"name":"TAG","value":"tve"},{"name":"HOST_PORT","value":"8589"},{"name":"CHANNELS_PORT","value":"8589"},{"name":"TZ","value":"America/Los_Angeles"},{"name":"HOST_DIR","value":"/volume1/docker"},{"name":"DVR_SHARE","value":"/volume1/ChDVRpoc"},{"name":"NETWORK_MODE","value":"host"},{"name":"DEVICES","value":"true"}],"ResourceControl":{"Id":3,"ResourceId":"2_channels-dvr","SubResourceIds":[],"Type":6,"UserAccesses":[],"TeamAccesses":[],"Public":false,"AdministratorsOnly":true,"System":false},"Status":1,"ProjectPath":"/data/compose/3","CreationDate":1726344287,"CreatedBy":"my_portainer_username","UpdateDate":0,"UpdatedBy":"","AdditionalFiles":null,"AutoUpdate":null,"Option":null,"GitConfig":null,"FromAppTemplate":false,"Namespace":"","IsComposeFormat":false}'
+ echo '{"Id":3,"Name":"channels-dvr","Type":2,"EndpointId":2,"SwarmId":"","EntryPoint":"docker-compose.yml","Env":[{"name":"TAG","value":"tve"},{"name":"HOST_PORT","value":"8589"},{"name":"CHANNELS_PORT","value":"8589"},{"name":"TZ","value":"America/Los_Angeles"},{"name":"HOST_DIR","value":"/volume1/docker"},{"name":"DVR_SHARE","value":"/volume1/ChDVRpoc"},{"name":"NETWORK_MODE","value":"host"},{"name":"DEVICES","value":"true"}],"ResourceControl":{"Id":3,"ResourceId":"2_channels-dvr","SubResourceIds":[],"Type":6,"UserAccesses":[],"TeamAccesses":[],"Public":false,"AdministratorsOnly":true,"System":false},"Status":1,"ProjectPath":"/data/compose/3","CreationDate":1726344287,"CreatedBy":"my_portainer_username","UpdateDate":0,"UpdatedBy":"","AdditionalFiles":null,"AutoUpdate":null,"Option":null,"GitConfig":null,"FromAppTemplate":false,"Namespace":"","IsComposeFormat":false}'
+ jq -e '.Id != null'
+ exit 0
+ [[ 0 == 1 ]]
+ exit 0
Portainer stack with env vars it created
version: '3.9'
services:
  # 2024.09.13
  # Docker Hub home for this project: https://hub.docker.com/r/fancybits/channels-dvr
  channels-dvr:
    image: fancybits/channels-dvr:${TAG}
    container_name: channels-dvr
    #devices:
      #- /dev/dri:/dev/dri
    ports:
      - ${HOST_PORT}:${CHANNELS_PORT}
    environment:
      - CHANNELS_PORT=${CHANNELS_PORT}
      - TZ=${TZ}
    volumes:
      - ${HOST_DIR}/channels-dvr:/channels-dvr
      - ${DVR_SHARE}:/shares/DVR
    #network_mode: host
    restart: unless-stopped
#volumes: # use this section if you've setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /channels-dvr inside the container
  #channels-dvr:
    #external: ${VOL_EXTERNAL}
    #name: ${VOL_NAME}

TAG=tve
HOST_PORT=8589
CHANNELS_PORT=8589
TZ=America/Los_Angeles
HOST_DIR=/volume1/docker
DVR_SHARE=/volume1/ChDVRpoc
NETWORK_MODE=host
DEVICES=true
1 Like

Would be nice if you could display something like this when the action completes.

A new stack, named channels-dvr has been created in Portainer at http://{PORTAINER_HOST}:9000
You can now access your new Channels DVR container at http://{PORTAINER_HOST}:{HOST_PORT}
Setup Channels DVR to use this container directory /shares/DVR (case sensitive) for storing recordings, since that is mapped to the host directory {DVR_SHARE} you specified.

1 Like

Forgot to update the script that does that in the main repo -- so it's fixed (but haven't built a new container just yet) -- thanks.

I'm a bit less sure of how to deal with this, though adding feedback in standard output is a good suggestion. /shares/DVR is a directory inside the container, and it's as designated by the Channels devs. Here's their recommended compose from Docker Hub:

 channels-dvr:
  image: fancybits/channels-dvr:latest
  container_name: channels-dvr
  network_mode: host
  ports:
    - "8089:8089"
  restart: unless-stopped
  devices:
    - /dev/dri:/dev/dri
  volumes:
    - /mnt/disk/dvr/config:/channels-dvr
    - /mnt/disk/dvr/recordings:/shares/DVR

Have you been doing it a different way with the CDVR containers you've been running? It's possible that directory name has no significance, and could be pretty much anything -- but I don't know that for sure.

For the :/shares/DVR directory, it can be any valid linux path in the container. When the container is created, it will create that path in the container. You have to specify what it is anyway in the Channels DVR setup.
I like this (although it might not work on Windows)

And the issue with ports.
If Channels DVR container is using host network mode, it needs CHANNELS_PORT to change the port Channels DVR uses within the container, since that is the port exposed to the host.
If Channels DVR container is using bridge network mode, it needs just HOST_PORT which is port mapped to the Channels DVR container port 8089.

Using network_mode: host negates the need to map ports (not valid in host mode)

  ports:
    - "8089:8089"

And that compose wouldn't work if the user already had something using port 8089 since the compose doesn't include this

    environment:
      - CHANNELS_PORT=8190                               # MODIFY the host port number to use

This works (appears the port mapping is ignored since host mode was specified)

version: '3.9'
services:
  # 2024.09.13
  # Docker Hub home for this project: https://hub.docker.com/r/fancybits/channels-dvr
  channels-dvr:
    image: fancybits/channels-dvr:${TAG}
    container_name: channels-dvr
    devices:
      - /dev/dri:/dev/dri
    ports:
      - ${HOST_PORT}:${CHANNELS_PORT}
    environment:
      - CHANNELS_PORT=${CHANNELS_PORT}
      - TZ=${TZ}
    volumes:
      - ${HOST_DIR}/channels-dvr:/channels-dvr
      - ${DVR_SHARE}:/shares/DVR
    network_mode: host
    restart: unless-stopped
#volumes: # use this section if you've setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /channels-dvr inside the container
  #channels-dvr:
    #external: ${VOL_EXTERNAL}
    #name: ${VOL_NAME}

TAG=tve
HOST_PORT=8589
CHANNELS_PORT=8589
TZ=America/Los_Angeles
HOST_DIR=/volume1/docker
DVR_SHARE=/volume1/ChDVRpoc


Screenshot 2024-09-14 at 15-49-50 Channels Settings

Don't know how helpful this is but here is one I set up sometime back, just stopped using it because could not get hardware transcoding working.

# channels compose

version: '3.9'
services:
  channels-dvr:
    image: fancybits/channels-dvr:tve
    container_name: channels-dvr
#    network_mode: host
    ports:
      - 192.168.50.149:8089:8089
    environment:
#     - CHANNELS_DVR=192.168.50.219:8089 # Add your Channels DVR server in the form hostname:port or ip:port
#     - CHANNELS_CLIENTS=192.168.50.21 # Space separated list of Channels DVR clients you'd like notifications sent to in the form hostname or IP
#     - UPDATE_YAMLS=true # Set this to true to update config.yaml
#     - UPDATE_SCRIPTS=true # Set this to true to update all included scripts
      - TZ=US/Pacific # Add your local timezone in standard linux format. E.G. US/Eastern, US/Central, US/Mountain, US/Pacific, etc  
    devices:
#      - /dev/dri:/dev/dri
    volumes:
#      - dvr-config:/channels-dvr
      - DVR:/shares/DVR
    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
#  dvr-config:
#    external: true
  DVR:
    external: true


channels.env

NVIDIA_VISIBLE_DEVICES=all
NVIDIA_DRIVER_CAPABILITIES=compute,video,utility

then again I'm still fighting to get OliveTin fully functional, using Docker Desktop and I have trouble getting Windows and Linux playing nicely. Then again it's probably me :wink:

And finally, here is what I would want to use, making the path inside the container the same as on the host for the DVR directory. Added DVR_CONTAINER_DIRECTORY

version: '3.9'
services:
  # 2024.09.13
  # Docker Hub home for this project: https://hub.docker.com/r/fancybits/channels-dvr
  channels-dvr:
    image: fancybits/channels-dvr:${TAG}
    container_name: channels-dvr
    devices:
      - /dev/dri:/dev/dri
    ports:
      - ${HOST_PORT}:${CHANNELS_PORT}
    environment:
      - CHANNELS_PORT=${CHANNELS_PORT}
      - TZ=${TZ}
    volumes:
      - ${HOST_DIR}/channels-dvr:/channels-dvr
      - ${DVR_SHARE}:${DVR_CONTAINER_DIRECTORY}
    network_mode: host
    restart: unless-stopped
#volumes: # use this section if you've setup a docker volume named channels-dvr, with CIFS or NFS, to bind to /channels-dvr inside the container
  #channels-dvr:
    #external: ${VOL_EXTERNAL}
    #name: ${VOL_NAME}

TAG=tve
HOST_PORT=8589
CHANNELS_PORT=8589
TZ=America/Los_Angeles
HOST_DIR=/volume1/docker
DVR_SHARE=/volume1/ChDVRpoc
DVR_CONTAINER_DIRECTORY=/volume1/ChDVRpoc



But then I'm not your typical Project One-Click user

I believe we're in sync on the points you've made in your last few posts. I'll make some changes in the morning, and push a new version at some point tomorrow.

I'm planning to do the following:

  • Include the fix for uncommenting devices:, - /dev/dri:/dev/dri, and network_mode: host as required.

  • Comment out ports: and - ${HOST_PORT}:${CHANNELS_PORT} when network_mode: host is being used to avoid confusion.

  • Make the container-side folder an environment variable in - ${DVR_SHARE}:/shares/DVR.

  • Add some additional comments in the descriptions of several fields in the WebUI, and to standard output.

Hopefully that will cover what's been identified as areas for improvement. :slight_smile:

1 Like