Zum Inhalt

Autor: Dennis Wilmsmann

Websites auf Änderungen überwachen mit changedetection.io

Für den Homeserver daheim steht ein nettes Tool zur Verfügung, um Websites auf Änderungen zu überwachen: changedetection.io

Wie üblich ist alles mit Docker innerhalb kürzester Zeit aufgesetzt:

version: '2'
services:
  changedetection:
    image: dgtlmoon/changedetection.io
    container_name: changedetection.io
    ports:
     - "5050:5000"
    restart: unless-stopped
    volumes:
     - ./datastore:/datastore
    environment:
     - WEBDRIVER_URL=http://browser-chrome:4444/wd/hub
  browser-chrome:
    hostname: browser-chrome
    image: selenium/standalone-chrome
    container_name: standalone-chrome
    shm_size: '2gb'
    restart: unless-stopped

Benachrichtigen kann man sich dann z.B. via eMail, Discord oder Telegram. Oder über ganz viele andere Kanäle, dann im Endeffekt wird Apprise unter der Haube benutzt.

Docker unter Windows: ext4.vhdx verkleinern

Wer Docker unter Windows nutzt, hat vielleicht auch schon bemerkt, dass das dahinterliegende Volume (z.B. C:\Users\<USER_NAME>\AppData\Local\Docker\wsl\data) nur größer werden kann, sich aber niemals verkleinert, auch nach dem Pruning von Images nicht.

Lösung: compact disk via diskpart

# Hinweis: in einer Powershell ausführen
# 1. Docker beenden
# 2. WSL beenden
wsl --shutdown

# 3. diskpart starten
diskpart
 
# 4. hier USER_NAME anpassen
select vdisk file=C:\Users\<USER_NAME>\AppData\Local\Docker\wsl\data\ext4.vhdx
compact vdisk

Der Vorgang kann dann einige Zeit dauern, danach sollte das Volume aber (deutlich) kleiner geworden sein.

Akkulaufzeit der Galaxy Watch4 verlängern

Wer ebenfalls eine Galaxy Watch4 sein Eigen nennt bzw. sich kurz zur Akkulaufzeit im Internet informiert hat, wird das Problem der relativ kurzen Akkulaufzeit kennen. Wenn viel mit der Smartwatch rumgedamelt wird, ist tägliches Aufladen angesagt.

Ich habe die Akkulaufzeit auf gut 2 Tage strecken können, indem ich WLAN auf der Smartwatch deaktiviert habe und ein sehr minimalistisches Ziffernblatt nutze: Pixel Minimal Watch Face

Gefühlt verbrauchen analoge bzw. fancy Watchfaces deutlich mehr Akku.

Grafana Loki mit Docker

Es ist relativ einfach, Grafana Loki als Logging Stack zu nutzen. Dann lassen sich sehr bequem die Logs aller Container zentral sammeln und einsehen (via Grafana).

Den passenden Treiber für Docker gibt es hier: https://grafana.com/docs/loki/latest/clients/docker-driver/

Nun noch das docker-compose.yml File um Loki zu starten (in diesem Stack könnte z.B. auch direkt Grafana mit dazugepackt werden):

version: '3.3'
services:
  loki:
    container_name: grafana-loki
    image: 'grafana/loki:latest'
    ports:
      - '3100:3100'
    command: '-config.file=/etc/loki/local-config.yaml'
    restart: unless-stopped
    volumes:
      - 'loki-data:/loki'
      - './loki/local-config.yaml:/etc/loki/local-config.yaml'
volumes:
  loki-data: null

Und noch die dazugehörige Loki Config mit einer Retention von 180 Tagen:

auth_enabled: false

server:
  http_listen_port: 3100

common:
  path_prefix: /loki
  storage:
    filesystem:
      chunks_directory: /loki/chunks
      rules_directory: /loki/rules
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093

compactor:
  working_directory: /loki/retention
  shared_store: filesystem
  compaction_interval: 10m
  retention_enabled: true
  retention_delete_delay: 2h
  retention_delete_worker_count: 150

limits_config:
  retention_period: 180d

Alexa erkennt smarte TP-Link Steckdosen nicht mehr

Ich habe diverse ältere und neuere Modelle der smarten Steckdosen von TP-Link im Einsatz, hauptsächlich HS100 und KP105. Leider hat die Alexa App die nervige Angewohnheit, die Steckdosen zwischendurch als „offline“ zu erkennen, falls die Stromversorgung oder die Verbindung zum WLAN unterbrochen wurde.

Eine einfache Lösung sieht so aus: Es reicht aus, den Namen der Steckdose in der TP-Link Kasa App zu ändern und die Liste der Steckdosen in der Alexa App zu erneuern. Die unbenannte Steckdose sollte dort dann wieder steuerbar sein. Es ist nun auch möglich, der Steckdose in der TP-Link Kasa App wieder ihren ursprünglichen Namen zu geben.

Plesk und Let’s Encrypt: http-01 oder dns-01

Aufgrund von DNS Problemen beim Hoster dieser Domain konnte ich keine Let’s Encrypt Zerfifikate via Plesk ausstellen und verwenden. Übergangsweise habe ich dann ZeroSSL benutzt und mir manuell ein valides Zertifikat besorgt.

Da ich bisher bei der Domain in Plesk immer ein Wildcard Zertifikat genutzt hatte, war mir nicht bewusst, das auch in Plesk via http-01 Domains verifiziert werden können. Dafür sind dann keine DNS TXT Records (_acme-challenge.domain.tld) notwendig, sondern es muss ein zufälliges Token unter /.well-known/acme-challenge/ abgelegt werden. Macht Plesk auch alles automatisch.

Daher: Wenn ein Wildcard Zertifikat ausgestellt werden soll, geht das in Plesk nur via dns-01, d.h. es müssen DNS TXT Records erstellt werden. Wenn ein Zertifikat ohne Wildcard ausgestellt werden soll, läuft das über http-01.

Nachlassende Akkuleistung beim Gardena SILENO+

Seit einigen Wochen konnte ich bei meinem ca. 4,5 Jahren alten Gardena SILENO+ (R130Li) beobachten, dass dieser nur noch ca. 30 Minuten mäht, dann wieder 30 Minuten lädt, usw. Das ist nur noch die Hälfte der ursprünglichen Dauer (zu Beginn jeweils ca. 60 Minuten). Das hat mich erst mal weniger gestört, leider hat es der Mower auch regelmäßig nicht mehr bis zur Ladestation zurück geschafft und ist auf dem Heimweg stehengeblieben.

Die Infos, die der Mower zur Batterie anzeigte, waren allerdings unauffällig und normal, wie mir der Gardena Support bestätigt hat. Im Hauptmenü lange 0 drücken, dann Infos und Batterie.

Letztendlich hat nur der Austausch des Akkus (584 85 28-01) geholfen. Den gibts es für ca. 100€ direkt bei Gardena, oder auch günstiger bei Amazon oder eBay.

Einen größeren Akku zu kaufen, bringt aber wohl nichts. Damit wird nicht die Mähdauer erhöht. Der Mower geht wohl immer davon aus, 1600 mAh Kapazität zur Verfügung zu haben. Daher scheint es egal zu sein, ob der neue Akku 2,1 Ah Kapazität hat, oder 2,5 Ah oder noch mehr.

Automatische Docker Image Updates

Auf meinem kleinen Ubuntu Server zu Hause tummeln sich ca. 30 Docker Container. Bisher habe ich mich via Docker-Update-Image-Notififier (DIUN) über Updates benachrichtigen lassen, wenn es neue Version der genutzten Images gab. Das Update hab ich dann aber trotzdem noch selbst gemacht bzw. machen müssen. Die Benachrichtung via eMail ist ganz ansprechend und die ganze Geschichte lässt sich sich schön individuell konfigurieren, ja nachdem, wie man es braucht.

Hier mal das dazugehörige docker-compose.yml:

version: "3.5"
services:
  diun:
    container_name: diun
    image: crazymax/diun:latest
    volumes:
      - "./data:/data"
      - "./diun.yml:/diun.yml:ro"
      - "/var/run/docker.sock:/var/run/docker.sock"
    environment:
      - "TZ=Europe/Berlin"
      - "LOG_LEVEL=info"
      - "LOG_JSON=false"
    restart: unless-stopped

Und noch die diun.yml dazu:

watch:
  workers: 20
  schedule: "30 2 * * *"
  firstCheckNotif: true

providers:
  docker:
    watchByDefault: true
    
notif:
  mail:
    host: smtp.my-email-provider.de
    port: 465
    ssl: true
    insecureSkipVerify: true
    from: docker@my-email-provider.de
    to: docker@my-email-provider.de
    username: blablabla
    password: blablubb123

Die Benachrichtigung sieht dann in etwa so aus:

Soweit, so gut. Heute habe ich dann zufällig Watchtower entdeckt. Da sehen die Benachrichtigungen zwar nicht so schön aus, aber dafür können automatische Updates gemacht werden, wenn neue Versionen der Images vorliegen.

Auch hier wieder eine komplette docker-compose.yml, inkl. eMail Relay via Postfix:

version: "3.5"

services:
  watchtower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    depends_on: 
      - postfix
    environment:
      TZ: 'Europe/Berlin'
      WATCHTOWER_MONITOR_ONLY: 'false'
      WATCHTOWER_CLEANUP: 'true'
      WATCHTOWER_SCHEDULE: '0 15 5 * * *'
      WATCHTOWER_HTTP_API_METRICS: 'true'
      WATCHTOWER_HTTP_API_TOKEN: no5theit0dooqueih2ohjoo7ya6Tai7a
      WATCHTOWER_NOTIFICATIONS: email
      WATCHTOWER_NOTIFICATION_EMAIL_FROM: docker@my-email-provider.de
      WATCHTOWER_NOTIFICATION_EMAIL_TO: docker@my-email-provider.de
      WATCHTOWER_NOTIFICATION_EMAIL_SERVER: postfix
      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT: 25
      WATCHTOWER_NOTIFICATION_EMAIL_DELAY: 5
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 9180:8080
  postfix:
    image: juanluisbaptiste/postfix:latest
    container_name: postfix
    restart: unless-stopped
    environment:
      TZ: 'Europe/Berlin'
      SMTP_SERVER: smtp.my-email-provider.de
      SMTP_PORT: 25
      SMTP_USERNAME: blablabla
      SMTP_PASSWORD: blablubb123
      SERVER_HOSTNAME: my-dockerhost

Die bereitgestellten Metriken greift mein Prometheus ab:

  - job_name: 'watchtower'
    scrape_interval: 5s
    metrics_path: /v1/metrics
    bearer_token: no5theit0dooqueih2ohjoo7ya6Tai7a
    static_configs:
      - targets: ['192.168.1.130:9180']

Wenn bestimmt Images nicht aktualisiert werden sollen, was z.B. bei auf dem System selbst gebauten Images der Fall ist, kann das mit diesem Label verhindert werden:

version: '3.3'
services:
  my-app:
    ports:
      - '8080:8080'
    container_name: my-app
    image: 'my-app:latest'
    restart: unless-stopped
    volumes:
      - './log:/app/log'
    labels:
      - com.centurylinklabs.watchtower.enable=false

Pi-hole und DNS over HTTPS (DoH)

Out of the box kann Pi-hole bisher kein DoH, aber ein Docker Container eilt zur Hilfe: crazymax/cloudflared

Diesen kann man zusammen mit Pi-Hole starten und via TUNNEL_DNS_UPSTREAM einen oder mehrere DoH Server mitgeben. Pi-Hole bekommt dann den Container als DNS Server und nutzt dann (in-) direkt DoH.

version: "2.1"

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8000:80/tcp"
      - "8443:443/tcp"
    environment:
      TZ: Europe/Berlin
      WEBPASSWORD: zaewooQu0kaequaZ
      DNS1: 192.168.1.130#5053
      DNS2: 192.168.1.105#5053
      ServerIP: 192.168.1.105
      VIRTUAL_HOST: pihole.fritz.box
    volumes:
       - './etc-pihole/:/etc/pihole/'
       - './etc-dnsmasq.d/:/etc/dnsmasq.d/'
    dns:
      - 127.0.0.1
      - 46.182.19.48
    restart: unless-stopped
    networks:
        - pihole_net
    depends_on:
        - cloudflared

  cloudflared:
    image: crazymax/cloudflared:latest
    container_name: cloudflared
    ports:
      - "5053:5053/udp"
      - "49312:49312/tcp"
    environment:
      TZ: "Europe/Berlin"
      TUNNEL_DNS_UPSTREAM: "https://anycast.uncensoreddns.org/dns-query,https://unicast.uncensoreddns.org/dns-query,https://dns.digitale-gesellschaft.ch/dns-query,https://dot.ffmuc.net/dns-query"
      TUNNEL_DNS_PORT: 5053
    restart: unless-stopped
    networks:
        - pihole_net

networks:
  pihole_net:
    enable_ipv6: true
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "true"
    ipam:
      driver: default
      config:
      - subnet: fc00::/64

Bei mir sind das dann 192.168.1.130#5053 und 192.168.1.105#5053. Redundanz muss sein. ? Und via Port 49312 gibt es noch ein paar Metriken im Prometheus Format.

DoT (DNS over TLS) wäre auch eine Alternative, habe ich bisher aber nicht ausprobiert. Vielleicht bekommt Pi-hole ja auch irgendwann einmal native DoH oder DoT Unterstützung, dann sind Bastellösungen wie diese überflüssig.

Abschließend: Braucht man das wirklich? Nein, kann man aber.

Kleines Update vom 04.02.2021: IPv6 Konfiguration hinzugefügt, damit Pi-Hole als auch Cloudflared via IPv6 erreichbar sind im LAN.