Meine liebsten Self-Hosted Tools (Part 2)

In diesem Post stelle ich vier weitere, selbst gehostete Tools vor und zeige dir, wie du sie bei dir installierst.

Meine liebsten Self-Hosted Tools (Part 2)
Hintergrundbild: Unsplash, Logos: Planka, ntfy, Wallos, Mealie

Hier folgt der zweite Teil meiner liebsten selbst gehosteten Tools. Ich werde wieder vier Tools vorstellen, welche ich selber betriebe und auch gerne nutze.

Planka

Beginnen wir mit Planka. Planka ist eine Open-Source Alternative zu Trello. Also ein Tool um Aufgaben zu planen. Man kann mit Planka sogenannte Kanban Boards anlegen. In einem solchen Board können dann verschiedene Listen wie Geplant, Begonnen oder Erledigt angelegt und diesen Aufgaben zugewiesen werden. Ein Board kann mit anderen Benutzern innerhalb von Planka geteilt werden, um so gemeinsam an einem Projekt zu arbeiten.

Beispiel eines Boards in Planka

Zu jeder Aufgaben können weitere Merkmale wie die zuständige Person, das Fälligkeitsdatum, Labels oder eine Stoppuhr mit der investierten Zeit hinzugefügt werden. Es ist auch möglich Anhänge und eine Beschreibung zu einer Aufgabe hinzuzufügen sowie Unteraufgaben anzulegen, welche dann visuell den Fortschritt der Aufgabe darstellen.

Aufgabe in Planka

Planka kann mithilfe folgender docker-compose.yml-Datei gestartet werden.

services:
  planka:
    image: ghcr.io/plankanban/planka:latest
    restart: unless-stopped
    volumes:
      - ./user-avatars:/app/public/user-avatars
      - ./project-background-images:/app/public/project-background-images
      - ./attachments:/app/private/attachments
    ports:
      - 1337:1337
    environment:
      - BASE_URL=https://project.example.com
      - TRUST_PROXY=0
      - DATABASE_URL=postgresql://postgres@postgres/planka
      - SECRET_KEY=langer-zufälliger-string
      - DEFAULT_ADMIN_EMAIL=admin@example.com
      - DEFAULT_ADMIN_PASSWORD=sicheres-passwort
      - ALLOW_ALL_TO_CREATE_PROJECTS=true
    depends_on:
      - postgres

  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    volumes:
      - ./db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=planka
      - POSTGRES_HOST_AUTH_METHOD=trust

docker-compose.yml

Beachte, dass du die BASE_URL an deine Domain anpassen musst. Generiere für den SECRET_KEY mit dem Befehl openssl rand --hex 32 einen zufälligen String und füge ihn in deine docker-compose.yml-Datei ein. Ebenfalls musst du die Zugangsdaten für den Administratorbenutzer definieren.

Die Variable ALLOW_ALL_TO_CREATE_PROJECTS legt fest, ob Benutzer ohne Administratorenrechte eigene Projekte erstellen dürfen oder nicht.

Nach der Installation, kannst du dich im Browser mit dem Administrator anmelden. Um weitere Benutzer anzulegen, kannst du die Benutzerverwaltung unter dem Icon in der oberen, rechten Ecke aufrufen.

Benutzerverwaltung öffnen

Auf dem "Hauptbildschirm" kann mittels "Projekt erstellen" ein neues Projekt angelegt werden.

Neues Projekt erstellen

Ntfy Server

Die zweite Software ist ntfy. Hierbei handelt es sich um einen Server, für den Versand und Erhalt von Push-Benachrichtigungen auf das Smartphone, PC, etc. Benachrichtigungen werden jeweils an ein sogenanntes Topic geschickt, welches dann von einem Client (bspw. Smartphone-App) abgerufen werden kann. Die Benachrichtigungen können mittels eines simplen HTTP-Request verschickt werden. Dadurch kann ntfy in fast alle Tools integriert werden, um Benachrichtigungen zu erhalten.

Ich nutze ntfy um Benachrichtigungen meiner Server und meines NAS zu erhalten, wenn beispielsweise ein Backup fehlschlägt oder anderweitig ein ungewöhnliches Verhalten auftritt. Ebenfalls lasse ich mich von Uptime Kuma benachrichtigen, wenn einer meiner Dienste nicht mehr erreichbar ist. Wenn ich jeweils einen Tag im Freizeitpark verbringe, nutze ich ntfy auch, um mich über Veränderungen bei den Wartezeiten zu informieren. Hierfür habe ich ein Python-Skript entwickelt, welches in einem Container betrieben werden kann. Dieses findest du hier.

Mithilfe folgender docker-compose.yml-Datei kannst du ntfy bereitstellen.

services:
  ntfy:
    image: binwiederhier/ntfy
    container_name: ntfy
    command:
      - serve
    environment:
      - TZ=Europe/Zurich
      - NTFY_BASE_URL=https://ntfy.example.com
      - NTFY_CACHE_FILE=/var/lib/ntfy/cache.db
      - NTFY_AUTH_FILE=/var/lib/ntfy/auth.db
      - NTFY_AUTH_DEFAULT_ACCESS=deny-all
      - NTFY_BEHIND_PROXY=true
      - NTFY_ATTACHMENT_CACHE_DIR=/var/lib/ntfy/attachments
      - NTFY_ENABLE_LOGIN=true
      - NTFY_UPSTREAM_BASE_URL=https://ntfy.sh
    user: 0:0
    volumes:
      - ./cache:/var/cache/ntfy
      - ./config:/etc/ntfy
      - ./db:/var/lib/ntfy/
    ports:
      - 80:80
    restart: unless-stopped

docker-compose.yml

Standardmässig kann jeder Benachrichtigungen an deinen ntfy-Server senden. Um Missbrauch zu verhindern, gibt es auch die Möglichkeit die Authentifizierung für deinen ntfy-Server zu aktivieren. Dies kannst du aktivieren, indem du die Umgebungsvariable NTFY_ENABLE_LOGIN auf true setzt. Dies habe ich in der obigen Konfiguration bereits gemacht und würde ich dir auch empfehlen.

Zudem musst du den Wert von NTFY_BASE_URL auf den Domainnamen deines ntfy-Servers setzen. Ggf. musst du noch die Konfiguration deines Reverse Proxies ergänzen. Ich empfehle die Verwendung von Traefik, um dies zu automatisieren. Details dazu findest du hier.

Die Variable NTFY_UPSTREAM_BASE_URL definiert einen Upstream-Server, welcher verwendet wird, um Benachrichtigungen an iOS Geräte zu senden. Hierbei verwende ich den Server https://ntfy.sh, welcher vom Entwickler hinter ntfy bereitgestellt wird. Das ist notwendig, da Benachrichtigungen auf iOS nur über einen zentralen Server verschickt werden können. Dabei wird beim Versand einer Benachrichtigung ein SHA256-Hash deines Topics an den Upstream Server geschickt, welcher dann auslöst, dass das betroffene iOS Gerät neue Nachrichten vom Server abruft. Dadurch wird sichergestellt, dass der Inhalt deiner Benachrichtigungen deinen Infrastruktur nicht verlässt. Wie genau das funktioniert, findest du in der Dokumentation von ntfy.

Configuration - ntfy
Send push notifications to your phone via PUT/POST

ntfy Dokumentation

Nachdem du den Container gestartet hast, sollte dein ntfy Server im Browser erreichbar sein. Da wir die Authentifizierung aktiviert haben, musst du nun zuerst Benutzer anlegen, welche Benachrichtigungen verschicken und abrufen dürfen. Hierzu musst du dich zuerst auf die Shell des Containers verbinden. Dies gelingt mit folgendem Befehl:

docker exec -it ntfy sh

Auf Container verbinden

Folgenden Befehle sind verfügbar:

Befehl Beschreibung
ntfy user add --role=admin <USERNAME> Hiermit kannst du ein neuer Admin-Benutzer anlegen. Dieser hat immer Lese- und Schreibrechte auf alle Topics.
ntfy user add <USERNAME> Dieser Befehl legt einen Benutzer ohne speziellen Rechte an. Alle Berechtigungen müssen nach Bedarf gesetzt werden.
ntfy access <USERNAME> <TOPIC> <PERMISSION> Dieser Befehl legt die Berechtigungen eines Benutzers für ein bestimmtes Topic fest.

Berechtigungen:
ro = read only = Nur Leserechte
rw = read-write = Lesen und Schreiben
wo = write-only = Nur Schreibrechte
none/deny = Keinen Zugriff
ntfy token list <USERNAME> Zeigt alle Access Tokens eines Benutzer sein.
ntfy token add <USERNAME> Erstellt ein neues Access Token für einen Benutzer

Ersetze jeweils die Felder <USERNAME>, <TOPIC> & <PERMISSION> durch die entsprechendnen Werte.

Mit exit verlässt du die Shell des Containers wieder.

Um nun eine Benachrichtigung zu verschicken, kann deine Applikation beispielsweise folgenden HTTP Request verschicken (zur Veranschaulichung anhand eines curl-Befehls):

curl \
  -u <BENUTZERNAME>:<PASSWORD> \
  -d "Schreibe hier den Inhalt deiner Nachricht" \
  https://ntfy.example.com/<TOPIC>

Versand einer Nachricht (BasicAuth + Benutzername/PW)

In diesem Befehl wurde der Benutzer anhand von Benutzername und Passwort mittels BasicAuth authentifiziert. Ohne BasicAuth müssen die Zugangsdaten als base64 Hash verschickt werden. Anstelle der Authentifizierung mit Benutzername und Passwort kann auch ein Access Token verwendet werden. Dies würde folgendermassen aussehen:

curl \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -d "LSchreibe hier den Inhalt deiner Nachricht" \
  https://ntfy.example.com/<TOPIC>

Versand einer Nachricht (Header + Access Token)

💡
Das Topic muss nicht auf dem Server erstellt werden, es ist bei Bedarf automatisch verfügbar. Es muss lediglich die Berechtigung auf das Topic konfiguriert werden.

Weitere Beispiele und Informationen zur Authentifizierung kannst du der offiziellen Dokumentation von ntfy entnehmen.

Sending messages - ntfy
Send push notifications to your phone via PUT/POST

ntfy Dokumentation

Um die Benachrichtigungen zu erhalten, kannst du einerseits die Website deines ntfy-Servers im Browser aufrufen und dich dort mit einem Benutzer anmelden, welcher ausreichende Benachrichtigungen hat. Andererseits kannst du auf deinem Smartphone oder PC die entsprechende App/Software installieren. Letzteres würde ich auch empfehlen, um immer up-to-date zu sein. Die Mobile-Apps findest du hier.

Wallos

Das dritte Tool, welches ich heute vorstellen möchte, ist Wallos. Bei Wallos handelt es sich um einen Abo-Tracker. Man kann damit alle seine Abos bei Online-Diensten oder auch andere regelmässige Ausgaben eintragen und einen Überblick darüber behalten.

Pro Abo kann man nebst dem Preis und der Abrechnungshäufigkeit auch folgende Details einstellen:

  • Währung
  • Zahlungsmethode
  • Kategorie
  • Person, welche das Abo bezahlt (Familie, Freunde, etc.)
  • Benachrichtigungen als Kündigungserinnerung
  • Notizen
  • Link zum Dienst
Bild eines Eintrages

Anschliessend sieht man alle Abos aufgelistet, beispielsweise nach Preis, Kategorie oder Zeitpunkt der nächsten Abrechnung sortiert.

Beispiel Auflistung Abos

Zudem gibt es die Möglichkeit die Abos in einem Kalender anzeigen zu lassen und auch Statistiken über die eigenen Abos anzusehen. In diesen Statistiken sieht man beispielsweise die totalen Kosten über einen Monat oder ein Jahr, oder auch Dinge wie das teuerste Abo, dass man besitzt.

Wallos kann mit folgender docker-compose.yml-Datei gestartet werden.

services:
  wallos:
    container_name: wallos
    image: bellamy/wallos:main
    ports:
      - "80:80/tcp"
    environment:
      TZ: 'Europe/Zurich'
    volumes:
      - './db:/var/www/html/db'
      - './logos:/var/www/html/images/uploads/logos'
    restart: unless-stopped

docker-compose.yml

Anschliessend kannst du die URL von deinem Wallos-Server im Browser öffnen und den ersten Benutzer anlegen. Dieser Benutzer hat automatisch administrative Rechte, um beispielsweise die Servereinstellungen zu verwalten oder neue Benutzer anzulegen.

Mealie

Das letzte Tool für heute ist Mealie. Mealie ist eine Rezeptverwaltungssoftware. Darin kannst du jegliche Rezepte ablegen und an einem zentralen Ort auffinden. Rezepte können ganz leicht von einer URL importiert oder manuell erstellt werden.

Rezept importieren

Du kannst Rezepte in Kategorie, Tags sowie Kochbücher einsortieren und anhand deren Eigenschaften (Utensilien, Lebensmittel, etc.) filtern.

Filterfunktion (Bsp. nur Rezepte mit Ovo)

Die Darstellung der Rezepte ist dann überall einheitlich und du kannst diese auch mit anderen Personen teilen. Du hast jederzeit auch die Möglichkeit die ursprüngliche Website des Rezeptes wieder aufzurufen.

Darstellung eines Rezeptes

Nun fragst du dich wie du Mealie hosten kannst? Ganz einfach mit folgendem docker-compose.yml.

services:
    mealie:
        image: ghcr.io/mealie-recipes/mealie:latest
        container_name: mealie
        restart: unless-stopped
        ports:
            - 9000:9000
        environment:
            - TZ=Europe/Zurich
            - PUID=0
            - PGID=0
            - ALLOW_SIGNUP=false
            - BASE_URL=https://cook.example.com
            - SECURITY_MAX_LOGIN_ATTEMPTS=10
            - DEFAULT_GROUP=home
        volumes:
            - ./data:/app/data

docker-compose.yml

Anschliessend kannst du Mealie in deinem Browser aufrufen und dich mit dem standardmässigen Administratorkonto anmelden. Der Benutzername ist changeme@example.com und das Passwort MyPassword. Ich empfehle dir, dies gleich nach dem ersten Anmelden anzupassen und ein langes, zufälliges Passwort zu setzen. Zudem würde ich dir empfehlen einen Benutzer für dich in den Einstellungen unter Benutzer anzulegen.

Du kannst auch mehrere Haushalte anlegen um beispielsweise den Essensplanner oder die Rezepte getrennt zu halten.


Das waren nun also einige der Tools, die ich bei mir hoste. Vielleicht war ja etwas passendes für dich dabei. Ansonsten wird vielleicht wird Mal ein Post kommen, indem ich das eine oder andere Tool vorstellen.