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

I removed that line and it loaded the stack before. The newest changes give me this error and the stack no longer loads. I am using the one from post #1 in this thread.

Failed to deploy a stack: failed to load the compose file: invalid spec: :/mnt/192.168.29.131-8089_ta: empty section between colons

That error can only be from that line I wanted you to comment out -- so something wasn't right the second time you did it. I've updated the compose in Post #1 now, so you can copy and paste it as is. Be sure to use the Re-pull and redeploy slider when you update the stack.

I haven't been able to retest this but I will soon. Thanks a lot!

2 Likes

Hoping for some guidance. I've been using CDVR for a number of years, works well & have setup some docker containers for Frndly, Tubi & Tubo in addition to Xfinity TVE & HDHR antenna. I am running on an older Intel Mac mini that I would like to retire. I have recently installed OliveTin and moving the add-ins there. I wanted to move CDVR to my wife's very lightly used M4 Mac mini as she only does light web/email sporadically. Is there a recommended, secure way to setup on her Mac? I am currently the named Apple user on the Intel & I was planning on setting up myself as a named user on her Mini to migrate that over. However as I think of a fresh setup should I setup a more generic OS user on this Mac and only use for CDVR? I am Apple using screen sharing very successfully in the house (and Tailscale remotely). Appreciate any input, thanks in advance.

1 Like

Makes sense to me to setup a separate user for CDVR and Docker/Portainer, but I'm not an everyday Mac user. Maybe @Fofer has some thoughts on this?

I have Channels DVR installed and running on my primary macOS user account. AFAIK this is the wisest path because otherwise it wouldn’t launch on its own after a reboot? As it stands now, as I understand it, I have to log in to the primary account first for CDVR hardware transcoding to work too. Maybe that’s outdated information now? I’m not really sure. Here's information I previously read that led me to those conclusions though:

@bnhf, Unfortunately, I'm still having some trouble with the Project One-Click Plex TV action on my Synology Channels DVR server. It's getting the container up and running, and installing the Plex TV-NoEPG source without any problem. However, the Plex TV "gracenote=include" source isn't making it into Channels. Deleting the containers and sources using the one-click action is nice, so that I can repeat the installation easily as I am testing things.

JSON response from http://192.168.1.100:9000/api/stacks/create/standalone/string?endpointId=2:
{"Id":139,"Name":"plex-for-channels","Type":2,"EndpointId":2,"SwarmId":"","EntryPoint":"docker-compose.yml","Env":[{"name":"TAG","value":"latest"},{"name":"HOST_PORT","value":"7779"},{"name":"PORT","value":"7777"},{"name":"HOST_DIR","value":"/volume1/docker"}],"ResourceControl":{"Id":62,"ResourceId":"2_plex-for-channels","SubResourceIds":[],"Type":6,"UserAccesses":[],"TeamAccesses":[],"Public":false,"AdministratorsOnly":true,"System":false},"Status":1,"ProjectPath":"/data/compose/139","CreationDate":1741298723,"CreatedBy":"john","UpdateDate":0,"UpdatedBy":"","AdditionalFiles":null,"AutoUpdate":null,"Option":null,"GitConfig":null,"FromAppTemplate":false,"Namespace":""}
true
{"error":"invalid source url: Get \"http://192.168.1.100:7779/plex/playlist.m3u?regions=local\u0026gracenote=include\": context deadline exceeded (Client.Timeout exceeded while awaiting headers)"}
true

Thanks for letting me know. We'll get it figured out -- it'll be a couple of days before I can look at it though. I'll get back to you.

I was able to add the 2nd source manually and seem to have things working for the time being. I'm mostly interested in helping smooth things out for anyone else who may want to use the action. Take your time. Please let me know when you need me to test it out again. :slightly_smiling_face:

1 Like

There are still issues with the latest plex container responding to requests

2025/02/23 12:25:02.530822 [ERR] Failed to request m3u for Plex: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=include": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/02/23 12:25:14.531698 [ERR] Failed to request m3u for PlexNoEpg: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=exclude": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/02/25 01:04:13.483310 [ERR] Failed to request m3u for Pluto: Get "http://192.168.1.3:8080/pluto/all/playlist.m3u?channel_id_format=slug_only": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/02/28 01:04:13.715379 [ERR] Failed to request m3u for Pluto: Get "http://192.168.1.3:8080/pluto/all/playlist.m3u?channel_id_format=slug_only": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/03/02 09:54:12.036388 [ERR] Failed to request m3u for PlexNoEpg: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=exclude": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/03/02 09:54:24.526275 [ERR] Failed to request m3u for Plex: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=include": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/03/03 10:25:55.077770 [ERR] Failed to request m3u for PlexNoEpg: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=exclude": dial tcp 192.168.1.3:7781: i/o timeout
2025/03/03 10:25:58.579338 [ERR] Failed to request m3u for Pluto: Get "http://192.168.1.3:8080/pluto/all/playlist.m3u?channel_id_format=slug_only": dial tcp 192.168.1.3:8080: connect: connection refused
2025/03/03 10:25:58.583737 [ERR] Failed to request m3u for Plex: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=include": dial tcp 192.168.1.3:7781: connect: connection refused
2025/03/03 10:27:10.585130 [ERR] Failed to request m3u for PlexNoEpg: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=exclude": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/03/03 10:27:23.529482 [ERR] Failed to request m3u for Plex: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=include": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/03/04 16:46:51.088247 [ERR] Failed to request m3u for Plex: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=include": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/03/04 16:47:03.088711 [ERR] Failed to request m3u for PlexNoEpg: Get "http://192.168.1.3:7781/plex/playlist.m3u?gracenote=exclude": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

Thanks for the heads-up. I checked my logs and see some of those errors as well.

2025/03/06 13:40:26.652470 [ERR] Failed to request m3u for PlexTV: Get "http://192.168.1.100:7776/plex/playlist.m3u?regions=local&gracenote=include": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/03/06 13:47:57.683044 [ERR] Failed to request m3u for PlexTV: Get "http://192.168.1.100:7776/plex/playlist.m3u?regions=local&gracenote=include": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
2025/03/06 14:06:10.639535 [ERR] Failed to request m3u for PlexTV: Get "http://192.168.1.100:7779/plex/playlist.m3u?regions=local&gracenote=include": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

I'm also having issues adding Plex. I changed the Host Dir from /Data to a directory I use for Channels on my Mac. Are there any other values I need to change? This is the error I get every time:

JSON response from http://192.168.150.242:9000/api/stacks/create/standalone/string?endpointId=2:
404 page not found

I am getting this error when trying to create a onclick of watchtower ...

JSON response from https://192.168.50.66:9443/api/stacks/create/standalone/string?endpointId=2:
{"message":"Unable to find an environment with the specified identifier inside the database","details":"Object not found inside the database (bucket=endpoints, key=2)"}
false

Could you hover over the local environment (as shown in the linked post screenshot) and let me know the environment number shown?

Where are you seeing this error? Are you seeing this in Standard Output or Standard Error? Does a Plex stack exist in Portainer?

The error shows in the Standard Output; no stack is created in Portainer. Below is what I get for the Standard Error:

exit status 1

  • dvr=192.168.150.242: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 192.168.150.242 ]]

  • extensionURL=192.168.150.242:7779

  • regions=local

  • [[ false == \f\a\l\s\e ]]

  • mjhCompatibility=

  • [[ # == # ]]

  • cdvrStartingChannel=

  • [[ -n '' ]]

  • cdvrIgnoreM3UNumbers=

  • [[ -n '' ]]

  • curl -s -o /dev/null http://192.168.150.242:7779

  • envVars=("TAG=$2" "HOST_PORT=$3" "PORT=$4" "HOST_DIR=$7")

  • printf '%s\n' TAG=latest HOST_PORT=7779 PORT=7777 HOST_DIR=/Users/jasontrippe

  • sed -i /=#/d /tmp/plex-for-channels.env

  • /config/portainerstack.sh plex-for-channels

  • stackName=plex-for-channels

  • portainerHost=192.168.150.242

  • [[ -n 9443 ]]

  • portainerPort=9443

  • [[ -n '' ]]

  • portainerEnv=2

  • curl -s -o /dev/null http://192.168.150.242:9000

  • portainerURL='http://192.168.150.242:9000/api/stacks/create/standalone/string?endpointId=2'

  • portainerToken=ptr_TP3q1aaHghJfhw94AMoa6ulP04EI93wfbogZlsKSb3c=

  • 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=
    ++ grep NETWORK_MODE= /tmp/plex-for-channels.env
    ++ grep -v '#'
    ++ awk -F= '{print $2}'

  • networkMode=
    ++ grep DEVICES= /tmp/plex-for-channels.env
    ++ grep -v '#'
    ++ awk -F= '{print $2}'

  • transcoderDevice=
    ++ grep CDVR_CONTAINER= /tmp/plex-for-channels.env
    ++ grep -v '#'
    ++ awk -F= '{print $2}'

  • stackNumber=

  • [[ -n '' ]]

  • [[ -n '' ]]

  • [[ -n '' ]]

  • [[ -n '' ]]
    ++ sed 's/\/\\/g' /tmp/plex-for-channels.yaml
    ++ sed 's/"/\"/g'
    ++ awk '{printf "%s\n", $0}'

  • stackContent='version: '''3.9'''\nservices:\n # 2025.02.26\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}:${PORT}\n environment:\n - PORT=${PORT}\n volumes:\n - ${HOST_DIR}/plex:/app/data\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": "PORT", "value": "7777"},'

  • IFS==

  • read -r key value

  • stackEnvVars='[{"name": "TAG", "value": "latest"},{"name": "HOST_PORT", "value": "7779"},{"name": "PORT", "value": "7777"},{"name": "HOST_DIR", "value": "/Users/jasontrippe"},'

  • IFS==

  • read -r key value

  • stackEnvVars='[{"name": "TAG", "value": "latest"},{"name": "HOST_PORT", "value": "7779"},{"name": "PORT", "value": "7777"},{"name": "HOST_DIR", "value": "/Users/jasontrippe"}]'
    ++ cat

  • stackJSON='{
    "Name": "plex-for-channels",
    "SwarmID": "",
    "StackFileContent": "version: '''3.9'''\nservices:\n # 2025.02.26\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}:${PORT}\n environment:\n - PORT=${PORT}\n volumes:\n - ${HOST_DIR}/plex:/app/data\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": "PORT", "value": "7777"},{"name": "HOST_DIR", "value": "/Users/jasontrippe"}]
    }'

  • echo 'JSON response from http://192.168.150.242:9000/api/stacks/create/standalone/string?endpointId=2:'
    ++ curl -k -X POST -H 'Content-Type: application/json' -H 'X-API-Key: ptr_TP3q1aaHghJfhw94AMoa6ulP04EI93wfbogZlsKSb3c=' -d '{
    "Name": "plex-for-channels",
    "SwarmID": "",
    "StackFileContent": "version: '''3.9'''\nservices:\n # 2025.02.26\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}:${PORT}\n environment:\n - PORT=${PORT}\n volumes:\n - ${HOST_DIR}/plex:/app/data\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": "PORT", "value": "7777"},{"name": "HOST_DIR", "value": "/Users/jasontrippe"}]
    }' 'http://192.168.150.242:9000/api/stacks/create/standalone/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 938 100 19 100 919 19000 897k --:--:-- --:--:-- --:--:-- 916k

  • portainerResponse='404 page not found'

  • [[ -z 404 page not found ]]

  • echo 404 page not found

  • echo '404 page not found'

  • jq -e '.Id != null'
    jq: error (at :1): Cannot index number with string "Id"
    parse error: Invalid numeric literal at line 1, column 9

  • exit 1

  • [[ 1 == 1 ]]

  • exit 1

Could you please run the OliveTIn Post-Install Healthcheck again, and post the results here?

Don't forget to use 3 backticks before and after log blocks like these in your posts, to improve readability.

image

Similar to the user in the post I linked, your Portainer "Environment" ID has changed from 2 to 3 -- I'm still trying to figure out how that can happen (it's probably something Portainer is doing in the latest update). However, I've created a new env var to deal with it. Check post #1 in this thread, for the latest OliveTin Docker Compose, and be sure to use 3 for PORTAINER_ENV:

PORTAINER_ENV=3

See below:

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

Version 2025.03.05


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


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

total 12
drwxr-xr-x 9 root root 288 Feb 21 17:38 .
drwxr-xr-x 1 root root 4096 Mar 5 17:29 ..
-rw-r--r-- 1 root root 6148 Feb 11 22:18 .DS_Store
drwxr-xr-x 33 root root 1056 Mar 6 19:14 Database
drwxr-xr-x 6 root root 192 Mar 5 19:30 Images
drwxr-xr-x 6 root root 192 Feb 2 17:37 Imports
drwxr-xr-x 4 root root 128 Feb 16 19:30 Logs
drwxr-xr-x 14 root root 448 Mar 6 21:09 Streaming
drwxr-xr-x 4 root root 128 Mar 5 19:00 TV

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

Channels reports this path as...
/Volumes/External Drive/Channels DVR


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

total 12
drwxr-xr-x 9 root root 288 Feb 21 17:38 .
drwxr-xr-x 1 root root 4096 Mar 5 17:29 ..
-rw-r--r-- 1 root root 6148 Feb 11 22:18 .DS_Store
drwxr-xr-x 33 root root 1056 Mar 6 19:14 Database
drwxr-xr-x 6 root root 192 Mar 5 19:30 Images
drwxr-xr-x 6 root root 192 Feb 2 17:37 Imports
drwxr-xr-x 4 root root 128 Feb 16 19:30 Logs
drwxr-xr-x 14 root root 448 Mar 6 21:09 Streaming
drwxr-xr-x 4 root root 128 Mar 5 19:00 TV

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

Channels reports this path as...
Support/ChannelsDVR


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

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


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

HOSTNAME=olivetin
CHANNELS_DVR=192.168.150.242:8089
CHANNELS_DVR_ALTERNATES=
CHANNELS_CLIENTS=192.168.150.231 192.168.150.194 146.12.197.19 192.168.150.177
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.150.242
PORTAINER_PORT=9443
PORTAINER_ENV=


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 local
options ndots:0

Based on host file: '/etc/resolv.conf' (internal resolver)

ExtServers: [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::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2 olivetin