Wer seine Rezepte online verwalten und gleichzeitig mit der ganzen Familie teilen möchte, findet im Netz viele Lösungen zum selber hosten.
Nachdem ich ein wenig herumprobiert hatte, fand ich grundsätzlich Tandoor ansprechend und gut zu nutzen. Die Installation war jedoch GRAUSAM.
Deswegen dokumentiere ich hier wieder in aller Kürze, mit welchen Einstellungen ich vorangekommen bin.
Zuerst die Docker YAML Datei. Hier sind schon ein paar dinge nicht ganz so einfach. Zuerst muss natürlich der Wert von „SECRET_KEY“ angepasst werden, sowie alle USER und PASSWORD Felder:
services:
tandoor_db:
restart: always
image: postgres:16-alpine
volumes:
- [LOCAL-DOCKER-FOLDER]/tandoor/postgresql:/var/lib/postgresql/data
environment:
- POSTGRES_HOST=tandoor_db
- POSTGRES_PORT=5432
- POSTGRES_USER=tandoor
- POSTGRES_PASSWORD=tandoor
- POSTGRES_DB=tandoor
tandoor_web:
restart: always
image: vabene1111/recipes
environment:
- SECRET_KEY=..........................................
- DEBUG=1
- DB_ENGINE=django.db.backends.postgresql
- POSTGRES_HOST=tandoor_db
- POSTGRES_PORT=5432
- POSTGRES_USER=tandoor
- POSTGRES_PASSWORD=tandoor
- POSTGRES_DB=tandoor
- ALLOWED_HOSTS=[PUBLIC-HOSTNAME],[PRIVATE-HOSTNAME]
- CSRF_TRUSTED_ORIGINS=https://[PUBLIC-HOSTNAME],http://[PRIVATE-HOSTNAME]
# If not set, media is not loading
- GUNICORN_MEDIA=0
- STATIC_URL=static/
- MEDIA_URL=media/
ports:
- 80:8080
volumes:
- [LOCAL-DOCKER-FOLDER]/tandoor/staticfiles:/opt/recipes/staticfiles
- [LOCAL-DOCKER-FOLDER]/tandoor/mediafiles:/opt/recipes/mediafiles
depends_on:
- tandoor_db
Nachdem die nachfolgenden Werte für die eigene Instanz angepasst hat, kann die Applikation gestartet werden.
- [LOCAL-DOCKER-FOLDER] – Der eigene lokale Ordner
- [PUBLIC-HOSTNAME] – Der FQDN, über den alles online erreichbar sein soll
- [PRIVATE-HOSTNAME] – Der FQDN, übder den alles lokal erreichbar sein soll, sofern abweichend
Hier ein paar Kniffe, warum das nun alles funktioniert.
Zuerst startet man die Applikation und kann sich über den lokalen Hostnamen oder die lokale IP per http anmelden. Damit die Bilder richtig laden, nachdem man ein Rezept mit Bild eingetragen hat, muss „GUNICORN_MEDIA=0“ gesetzt werden. Sonst funktioniert das nicht richtig. Seltsamerweise hängt das aktuell noch irgendwie mit dem Debug-Modus zusammen. Ist Debug aktiviert, lädt es bei mir die Bilder. Ist Debug=0 – werden die Bilder nicht zuverlässig geladen.
Der kniffige Teil ist in der HTTPs Verbindung. Hier ist leider nicht alles so schön implementiert wie bspw. in Paperless.
Ohne das korrekte Setzen von ALLOWED_HOSTS und CSRF_TRUSTED_ORIGINS funktioniert die https Verbindung überhaupt nicht. Beim Login wird ein CSRF Fehler angezeigt.
Ist alles korrekt eingestellt, kommt man per https auf den Login, der Login funktioniert auch, aber es werden keine Inhalte angezeigt. Debuggt man dann im Browser, wird angezeigt, dass die Ressourcen nicht von HTTPs geladen werden, sondern per HTTP. Das ist so weit auch dokumentiert, dass hier bei den Proxy (Vgl. Doku – Traefik bspw.) etwas zusätzlich eingestellt werden muss. Aber explizit, wie es bei HAProxy (bei mir auf OPNsense funktioniert, ist nicht angegeben.
Die Einstellung lautet sinngemäß:
RequestHeader set X-Forwarded-Proto "https"
In HAProxy geht man dazu in „Rules & Checks“ und dort in die „Rules“ eine Neue Rule anlegen, die wie folgt aussieht:
Es wird also der Header in der Anfrage zum Tandoor System modifiziert. Es wird „X-Forwarded-Proto“ (also das ursprüngliche Protokoll) an Tandoor mit dem Wert „https“ angegeben. Diese Regel muss natürlich im Public Service referenziert werden, damit sie beim Port 443 auch zieht.
Läuft eine Anfrage nun über den Proxy, wird Tandoor mitgegeben, dass die ursprüngliche Anfrage per https einging – und damit antwortet Tandoor auch mit https verlinkten Ressourcen. Nun ist die App per HTTPs erreichbar.
https://tandoor.dev
https://docs.tandoor.dev/install/docker/
https://github.com/alexbelgium/hassio-addons/issues/1013
https://discourse.haproxy.org/t/mixed-content-warning-when-using-https/981
https://stackoverflow.com/questions/70285834/forbidden-403-csrf-verification-failed-request-aborted-reason-given-for-fail