Das CMD startete uvicorn mit --forwarded-allow-ips "*": jeder, der den Container-Port direkt erreicht, konnte die Absender-IP frei erfinden und bekam pro erfundener IP einen frischen Rate-Limit-Zaehler - und die Limits sind das Einzige vor dem frei zugaenglichen Reservieren-Endpunkt. Zusaetzlich liess sich so die HTTPS-Erkennung fuers Sitzungs-Cookie faelschen. Jetzt liest uvicorn die Grenze aus FORWARDED_ALLOW_IPS (ohne Wert: nur 127.0.0.1, also keinem externen Absender trauen). docker-compose.betrieb.yml reicht die Variable mit Erklaerung durch; das README beschreibt, welche Adresse hineingehoert und dass der Port nur fuer den Proxy erreichbar sein darf. Wird die Variable nicht gesetzt, teilen sich alle Besucher die Zaehler ueber die Proxy-IP - das kleinere Uebel. Plan-Verbesserungen.md: Ergebnis der erneuten Durchsicht vom 14.09.2026 ergaenzt (GZip/Cache/Sicherung vom 13.09. nachgeprueft und fuer gut befunden; drei P3-Funde: oeffentlicher 500er ueber ?limit=abc, nicht atomares Reservieren, 500 statt Fehlermeldung in Betreiber-Formularen). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
64 lines
2.6 KiB
YAML
64 lines
2.6 KiB
YAML
# Fertiges Image starten – ohne Quellcode, ohne selbst zu bauen.
|
||
#
|
||
# So geht's:
|
||
# 1. Diese Datei als "docker-compose.yml" in einen leeren Ordner legen
|
||
# 2. Unten ein eigenes Passwort und einen eigenen SECRET_KEY eintragen
|
||
# 3. Im Ordner ausführen: docker compose up -d
|
||
# 4. Im Browser öffnen: http://localhost:8090
|
||
#
|
||
# Beenden: docker compose down
|
||
# Aktualisieren: docker compose pull && docker compose up -d
|
||
|
||
services:
|
||
app:
|
||
image: gitea.boing86.myds.me/docker/kleiderboerse:latest
|
||
restart: unless-stopped
|
||
|
||
ports:
|
||
# links der Port am eigenen Rechner, rechts der im Container.
|
||
# Ist 8090 schon belegt, einfach auf z.B. "8091:8000" ändern.
|
||
- "8090:8000"
|
||
|
||
environment:
|
||
# Passwort fürs Erfassen. Solange hier nichts steht, ist der
|
||
# Erfassungsbereich gesperrt; Galerie und Reservieren funktionieren
|
||
# trotzdem. Bewusst leer ausgeliefert: ein mitgeliefertes Passwort
|
||
# stünde in dieser Anleitung und wäre damit allgemein bekannt.
|
||
ADMIN_PASSWORD: ""
|
||
|
||
# Signiert das Sitzungs-Cookie. Ohne festen Wert ist man nach jedem
|
||
# Neustart abgemeldet. Einen erzeugen mit:
|
||
# docker run --rm python:3.11-slim python -c \
|
||
# "import secrets; print(secrets.token_urlsafe(48))"
|
||
SECRET_KEY: ""
|
||
|
||
# Die App läuft hinter einem Reverse-Proxy mit HTTPS. Auf "false" nur
|
||
# zum Testen über http://localhost - sonst ginge das Sitzungs-Cookie
|
||
# auch über unverschlüsselte Verbindungen mit.
|
||
COOKIE_HTTPS_ONLY: "true"
|
||
|
||
# Reservieren ist ohne Anmeldung möglich. Diese Grenze ist damit das
|
||
# Einzige, was zwischen einem Skript und dem ganzen Bestand steht.
|
||
RATE_LIMIT_RESERVE: "5/hour"
|
||
RATE_LIMIT_LOGIN: "10/hour"
|
||
|
||
# Nur diesem Absender werden die X-Forwarded-*-Kopfzeilen geglaubt.
|
||
# Hier gehört die Adresse hin, mit der der Reverse-Proxy im Container
|
||
# ankommt - bei Docker meist das Bridge-Gateway (nachsehen mit:
|
||
# docker compose logs, oder "172.17.0.1" bzw. "172.18.0.1" probieren).
|
||
# Leer = keinem trauen: die App läuft trotzdem, aber alle Besucher
|
||
# teilen sich dann die Rate-Limits über die Adresse des Proxys.
|
||
# Niemals "*" eintragen: dann kann jeder, der den Port direkt
|
||
# erreicht, mit erfundenen Adressen die Rate-Limits umgehen.
|
||
FORWARDED_ALLOW_IPS: ""
|
||
|
||
volumes:
|
||
# Hier liegen Datenbank und Bilder. Ohne diese beiden Zeilen wäre nach
|
||
# einem Neustart alles weg.
|
||
- kleiderboerse-db:/data
|
||
- kleiderboerse-bilder:/uploads
|
||
|
||
volumes:
|
||
kleiderboerse-db:
|
||
kleiderboerse-bilder:
|