This version (2026/01/27 23:38) is a draft.Approvals: 0/1The Previously approved version (2025/10/24 11:21) is available.

Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Docker: TVHeadend
Very good community- Project to watch tv over network. Supports IPTV and DVB-S, like my Astra 19.2 Satellite Dash.
Forum/Docs: https://tvheadend.org/
IPTV- Channels Worldwide: https://github.com/iptv-org/iptv
or Kodinerds: https://github.com/jnk22/kodinerds-iptv
Satellite Dash Astra 19.2
Server- Web GUI TvHeadend (HTTP-Port 8891 and Stream 9982)
Clients can connect with E.g. Kodi and HTS- Addon on Port 9982 using the User, which can be created at first setup.
Hardware
I bought the PCIe/Twin-/ DVB-S- Card „Cine V7“ of Digital Devices, which i consider best choice for Linux.
Check with lspci „03:00.0 Multimedia controller: Digital Devices GmbH Cine V7“, it should be autoloaded with Kernel-Module STV0910.
Access to DVB- Inputs
Install linux- drivers video4linux:
- v4l-conf
- v4l-tools
- v4l-utils
If you have your DVB- Card in /dev/dvb, check if the settings allow user access like this:
pcserver2023:~ # sudo ls -l /dev/dvb/adapter* /dev/dvb/adapter0: total 0 crwxrwxrwx 1 root video 212, 0 Aug 27 18:22 demux0 crwxrwxrwx 1 root video 212, 1 Aug 27 18:22 dvr0 crwxrwxrwx 1 root video 212, 3 Aug 27 18:22 frontend0 crwxrwxrwx 1 root video 212, 2 Aug 27 18:22 net0 /dev/dvb/adapter1: total 0 crwxrwxrwx 1 root video 212, 4 Aug 27 18:22 demux0 crwxrwxrwx 1 root video 212, 5 Aug 27 18:22 dvr0 crwxrwxrwx 1 root video 212, 7 Aug 27 18:22 frontend0 crwxrwxrwx 1 root video 212, 6 Aug 27 18:22 net0
If not, you need a new udev-rule. Create a file to look like this:
pcserver2023:~ # cat /etc/udev/rules.d/75-dvb.rules SUBSYSTEM=="dvb", MODE:="0777"
Mind the : after Mode, otherwise this will not work!
After a restart, your DVB- Devices should look like above and TVHeadend will work.
Installing w_scan_cpp
Meanwhile, the old w_scan has become obsolete. It was replaced by w_scan_cpp. Unfortunatelly w_scan_cpp is not delivered by opensuse any more.
I got a working binary at https://github.com/wirbel-at-vdr-portal/w_scan_cpp-binaries like
The Docs can be found here: https://www.gen2vdr.de/wirbel/w_scan_cpp/index2.html
Where i needed to install librepfunc from here: https://build.opensuse.org/repositories/home:seife:vdrdevel/librepfunc
To check, if this works, try this command (while this example is for Astra 19.2E Sattelite):
./w_scan_cpp -fs -sS19E2 --femon "SAT.1 Gold HD;ProSiebenSat.1:11111:HC23M5O35P0S1:S19.2E:22000:255=27:0;259=deu@106:32:1830,1860,1843,98C,9C4,186A,98D,186D,1842,4B64,4AF4:12500:1:1043:0" ******************************************************************************* * w_scan_cpp Version 20231015 ****************************************************************************** Device0 dvb:a0f0: ST STV0910 Device1 dvb:a1f0: ST STV0910 monitoring device 'ST STV0910' lock 0 | signal 0% | lock 1 | signal 72.58dBuV | quality 81% | snr 12.90dB | lock 1 | signal 72.57dBuV | quality 81% | snr 12.90dB |
This command can be used to adjust your sattelite: look for the best snr at the right (other Values are not really important for best values). The Value should be somewhere from 11-13. Values under 10 are not good.
Now you have the best alignment to your sattelite.
Optional: Create a channel-file
If you want to, you can create a channel- file for later use:
./w_scan_cpp -fs -sS19E2 -x>channel_list_dvbv5.conf
Docker Compose
This is WIP (but works!)
Source for Docs: https://github.com/tvheadend/tvheadend/blob/master/README.Docker.md
You need
- Docker rootless as described in docker
- Caddy as described in docker-caddy
As docker-user:
Create a Folder in docker_compose named tvheadend and a Folder for Records:
docker@pcserver2023:~/docker_compose> mkdir -p /home/docker/docker_compose/tvheadend docker@pcserver2023:~/docker_compose> mkdir -p /home/docker/videorecords
Mind, that the Folder for recordings MUST have the same uid and gid than the HTS- User in the container, which may not be known users to the host.
So after docker- service is started, double check the permissions. As reference, you can check the File on your volume (after docker is running):
docker@pcserver2023:~/docker_compose> sudo ls -l /home/docker/.local/share/docker/volumes/pcserver2023_tvheadend/_data [ ... ] drwxrwxr-x 2 166530 166530 6 22. Aug 22:36 recordings [ ... ]
These permissions must be the same on /home/docker/docker_compose/tvheadend !
Create the file docker-compose.yml in docker_compose/tvheadend folder.
Currently the content looks like that:
services:
tvheadend:
# Bug in current image (20250823): https://github.com/tvheadend/tvheadend/issues/1901
# After resolve, the latest Tag should be used!
# image: ghcr.io/tvheadend/tvheadend:latest
image: ghcr.io/tvheadend/tvheadend:master-debian
cap_drop:
- all
ulimits:
nproc: 256
nofile:
soft: 8192
hard: 65535
devices:
- /dev/dvb/
# See Volumes/localtime
# environment:
# TZ: Europe/Berlin
volumes:
- tvheadend:/var/lib/tvheadend:rw
- /home/docker/videorecords:/var/lib/tvheadend/recordings:rw
- /etc/localtime:/etc/localtime:ro
networks:
- default
ports:
- "9981-9982:9981-9982/tcp"
command: --config '/var/lib/tvheadend' --nosatip --firstrun
restart: unless-stopped
#Not working on master-debian:
# healthcheck:
# test: wget -O - -q 'http://dockerstack-tvheadend-1:9981/ping' | grep -q 'PONG'
# Still needs to be defined while without it won't enable ipv6
networks:
default:
driver: bridge
enable_ipv6: true
volumes:
tvheadend:
You can now statup that container with docker compose up -d and navigate to http://localhost:9981 to set up TVheadend for the first start.
Caddy Service
After getting an Domainname and setting up DyDNS, add the Service to you Caddyfile ( https://obel1x.de/dokuwiki/doku.php?id=content:serverbasics:docker-caddy#caddy_configuration )
Add to Caddyfile:
# TVHeadend
https://tvheadend.domain.tld:443 {
header Strict-Transport-Security max-age=31536000;
reverse_proxy pcserver2023-tvheadend-1:9981
}
Mind, that this will only open the administration web-gui for TVH.
Watching TV with e.g. Kodi needs port 9982 opened at your firewall. You may *not* want that port to be reached from the Internet (or will you??? - well its up to you).
