PI-hole auf einer Kodi Box als docker Service installieren

Erstellt: 22.01.2023 Bearbeitet: 29.09.2024

Ich habe mir vor einiger Zeit eine recht leistungsstarke und mit genug Ressourcen ausgestattete Kodi Box zugelegt die ich nun zum Testen mit ein paar Service auf Docker Basis nutzten wollte um nicht noch einen Server betreiben zu müssen bzw. die Existierenden Ressourcen einfach zu nutzten. Die Basis auf Docker hat hier 2. gründe. erstens Benutzte ich CoreELEC als Distribution, weswegen ich nur ein sehr minimales Linux System habe wo ich nicht einfach Pakete installieren kann und zweitens, ich mit einem fertigen Docker alles Nötige ohne Große spielen, in einem packet habe, welsches von dem restlichen System gut genug getrennt ist.

Installation

Dockerd installieren

Wir brauchen das Kodi addon docker in Dienste wenn wir ein minimal System nutzen um einen dockerd zu haben.

Install xbmc.service Docker

systemd

Das service file speichere ich in '/storage/.config/system.d/pi-hole.docker.service'

[Unit]
Description=%p container
Requires=service.system.docker.service
Requires=network-online.service
After=service.system.docker.service
After=network-online.service
Befora=kodi.service

[Service]
[Unit]
Description=%p container
Requires=service.system.docker.service
Requires=network-online.service
After=service.system.docker.service
After=network-online.service
Before=kodi.service

[Service]
Restart=always
RestartSec=10s
TimeoutStartSec=0
ExecStartPre=-/bin/sh -c "mkdir -p /storage/dockerdata/%p/config/etc-pihole /storage/dockerdata/%p/config/dnsmasq"
ExecStartPre=-/bin/sh -c "/storage/.kodi/addons/service.system.docker/bin/docker rm %p"
ExecStartPre=-/bin/sh -c "ntpd -d -n -q -p 157.90.24.29"
ExecStart=/storage/.kodi/addons/service.system.docker/bin/docker run \
    --rm \
    --name %p \
    -p 53:53/tcp -p 53:53/udp \
    -p 8053:80 \
    -e TZ="Europe/Berlin" \
    #-e # WEBPASSWORD: 'set a secure password here or it will be random' \
    -v "/storage/dockerdata/%p/config/etc-pihole:/etc/pihole" \
    -v "/storage/dockerdata/%p/config/dnsmasq:/etc/dnsmasq.d" \
    --dns=192.168.1.1 --dns=192.168.8.1 \
    #--restart=unless-stopped \
    --hostname coreelec \
    -e VIRTUAL_HOST="coreelec" \
    -e FTLCONF_LOCAL_IPV4="192.168.8.190" \
    pihole/pihole:latest
    # before set a new docker have u to pull it manual
    # docker pull pihole/pihole:latest
    # ohne dns kein pull ohne pull kein docker :)
ExecStop=/storage/.kodi/addons/service.system.docker/bin/docker stop %p

[Install]
WantedBy=multi-user.target

Steuerung des Services mit systemd

Systemd Konfiguration neu einlesen.
  systemctl daemon-reload
Service starten
  systemctl start pi-hole.docker.service
Service status
  systemctl status pi-hole.docker.service
Start Service on reboot
  systemctl enable pi-hole.docker.service
Service stoppen
  systemctl stop pi-hole.docker.service
Logs lesen
   journalctl -u pi-hole.docker.service

Password für die Web-UI von Pi-hole

Wenn man ein Pi Hole das erste Mal aufsetzt, muss man ein neues Password setzten. Dafür gibt es 2 Wege.

  1. Im dem Service File WEBPASSWORD setzten.

  2. Neu setzten des Web-Passwords in dem Docker selbst mit dem Befehl

      docker exec pi-hole.docker pihole -a -p
    

Zeit stellen

Meine Kodi Box hat keine Akku gepufferte Uhr weswegen ich nach jedem Reboot die Zeit neu stellen muss, das habe ich auch in dem Service Init eingebaut weil ohne richtige Zeit viele Probleme mit z.B. SSL auftreten und so Downloads fehlschlagen könnten oder diverse Crypto nicht richtig funktioniert.

Ermittel eine $IP aus pool.ntp.org

  ntpd -d -n -q -p $IP

Der Grund für die ip ist, ohne DNS Server keine DNS Auflösung und man startet den Service ja erst :)

IP-Hole über DHCP als Primären DNS auf einen OpenWRT Router einrichten

Router via ssh Verbinden und dann die DHCP-Konfiguration anpassen.

  /etc/config/dhcp

und yourDNSIP mit der ip vom IP-Hole ersetzten

config 'dhcp' 'lan'
    ...
    list 'dhcp_option' '6,yourDNSIP'

So hat jeder Client den PI-hole als DNS Server und nicht den Router, so kann man in PI-hole genau sehen welscher Client welsche anfrage gemacht hat.

HDMI Suspend verhindern

Die Kodi Box ging bisher immer in den Suspend Modus, wenn der Fernseher ausgeschaltet wurde. Das ist aber jetzt nicht mehr gewollt, wenn wichtige Dienste auf der Box Parallel Laufen. Deswegen schalte ich aus, dass die Box auf das HDMI-Signal reagieren soll und verhindere so das Ungewollte einschlafen.

    # HDMI CEC Control
    #   Setup custom options by enable these flags:
    #
    #     Function                   bit
    #     CEC_FUNC_MASK              0
    #     ONE_TOUCH_PLAY_MASK        1
    #     ONE_TOUCH_STANDBY_MASK     2
    #     AUTO_POWER_ON_MASK         3
    #     STREAMPATH_POWER_ON_MASK   4
    #     CEC_INPUT_MASK             5
    #     ACTIVE_SOURCE_MASK         6
    #
    # default: cec_func_config=7f

Wir wollen kein ONE_TOUCH_STANDBY_MASK also das 2. Bit auf 0, ich setzte cec_func_config also auf 0b1101111 = 0x6F. zum Hinzufügen von cec_func_config=6f muss man mit ssh auf die Box und den /flash Mount Point auf Beschreibbar umstellen und die config anpassen.

  ssh to CE
  mount -o rw,remount /flash
  nano /flash/config.ini
  mount -o ro,remount /flash

Blocklisten

Pi-hole bringt zwar eine Block Liste mit, aber es gibt weit mehr nützliche listen, um sein internetleben Freier zu verbringen :)

Viel Spaß beim Nachbauen