build: Docker-Images, Compose-Setup und Gitea-Workflows

- Mehrstufige Dockerfiles je Dienst mit Stufen für Entwicklung und Betrieb,
  beide Images laufen als unprivilegierter Benutzer
- Backend-Entrypoint wartet auf die Datenbank, migriert und seedt nur bei
  leerem Kategoriebaum (neues Flag --if-empty)
- docker-compose.yml mit Netz-Trennung, Healthchecks und benannten Volumes;
  die Datenbank ist ausschließlich im internen Netz erreichbar
- nginx liefert das Bundle aus und reicht /api weiter; index.html ungecacht,
  gehashte Assets ein Jahr
- Gitea-Workflows: ci.yml für Lint, Tests und Bundle-Bau, build.yml für die
  Images nach linux/amd64 ohne Deploy-Schritt
- docs/runner.md und docs/deployment.md, .dockerignore je Dienst

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014e7t8UpmoVNMtWivY5LiSH
This commit is contained in:
moneyfy
2026-09-09 17:14:44 +02:00
co-authored by Claude Opus 5
parent 54c59c9f71
commit 87bee9b72a
17 changed files with 1184 additions and 10 deletions
+6 -4
View File
@@ -18,7 +18,9 @@ TAG=latest
POSTGRES_DB=moneyfy
POSTGRES_USER=moneyfy
POSTGRES_PASSWORD=bitte-aendern
# Vom Backend genutzte DSN. `postgresql://` wird automatisch auf asyncpg umgestellt.
# Wird beim Betrieb mit Compose aus den drei Werten darüber zusammengesetzt und
# muss dort nicht gesetzt werden. Nur für den Betrieb ohne Compose nötig.
# `postgresql://` wird automatisch auf asyncpg umgestellt.
DATABASE_URL=postgresql+asyncpg://moneyfy:bitte-aendern@moneyfy-db:5432/moneyfy
# --- Sicherheit --------------------------------------------------------------
@@ -42,9 +44,9 @@ OIDC_CLIENT_SECRET=
OIDC_SCOPES=openid profile email
# --- Logo-Service ------------------------------------------------------------
# Verzeichnis für den lokalen Logo-Cache (im Container auf das Volume gemountet).
# Logos werden ausschließlich von hier ausgeliefert im Seitenaufruf entsteht
# kein Zugriff auf fremde Dienste.
# Verzeichnis für den lokalen Logo-Cache. Beim Betrieb mit Compose zeigt es fest
# auf das Volume und muss hier nicht gesetzt werden. Logos werden ausschließlich
# von dort ausgeliefert im Seitenaufruf entsteht kein Zugriff nach außen.
LOGO_STORAGE_DIR=/data/logos
# Der lokale simple-icons-Katalog deckt die meisten Marken ohne Netzzugriff ab.