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
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# 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:
|
||||
Reference in New Issue
Block a user