Files
kleiderboerse/docker-compose.betrieb.yml
T
StefanandClaude Opus 5 31f59fd3c8 Phase 5: Gitea Actions, Betriebs-Compose und README
Ein Versions-Tag (v*) löst den Bau aus, ein Push auf main nicht - so bleibt
das Zusammenführen von Branches folgenlos und ein Release ist ein bewusster
Schritt. Die CI baut, testet das FERTIGE Image und veröffentlicht erst
danach; "latest" nur bei echten Tags.

Beim Durchspielen des Prüfschritts zwei Fehler gefunden, die beide erst in
der CI aufgefallen wären - und einer davon gar nicht:

1. "docker exec" ohne -i hängt kein stdin an. Das Here-Dokument lief damit
   ins Leere, python bekam ein leeres Programm, tat nichts und meldete
   Erfolg. Ein Test, der nie hätte fehlschlagen können. Lokal nachgestellt
   und mit -i behoben.
2. Die YAML war ungültig: eingebettete Python-Blöcke standen links vom
   Einzug und brachen den run-Block auf. Das Prüfskript liegt jetzt als
   scripts/image-pruefen.py vor - dadurch lässt es sich auch lokal gegen
   ein gebautes Image laufen lassen - und die Warteschleife ist einzeilig.

Aus der Kantone-App übernommen: github.ref_name geht über env in die
Shell statt direkt als Ausdruck (Tag-Namen dürfen " und $ enthalten, und
der Job hält ein Registry-Token), Anmeldung per --password-stdin, docker
logout mit if: always(), Rechte auf contents:read und packages:write.

docker-compose.betrieb.yml liefert bewusst KEIN Passwort mit: ohne eigenes
bleibt der Erfassungsbereich gesperrt. Genau das war die schwerste Lücke
der Kantone-App.

Ausserdem fehlte eine .dockerignore - der ganze Kontext samt .git und .env
ging an den Docker-Daemon, obwohl das Dockerfile nur gezielt kopiert.

81 Tests grün, der CI-Prüfschritt lokal gegen das gebaute Image
durchgespielt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GR4bNaj9GtRu57J4Niii8o
2026-08-30 08:40:57 +02:00

54 lines
2.0 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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"
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: