From 4e0d27c4a6cfe2630bcd7cf65d3ef8444d5eeef3 Mon Sep 17 00:00:00 2001 From: irrlicht Date: Sun, 27 Sep 2026 00:10:01 +0200 Subject: [PATCH] dev-up.sh: DEV-Container neu bauen und starten, auch als post-commit-Hook Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TiXsPUqw7oeomZ8wZrQW5q --- .containerignore | 2 ++ dev-up.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++ githooks/post-commit | 8 ++++++ notes/frontend.md | 8 ++++++ 4 files changed, 78 insertions(+) create mode 100755 dev-up.sh create mode 100755 githooks/post-commit diff --git a/.containerignore b/.containerignore index 40bb3cb..f754b95 100644 --- a/.containerignore +++ b/.containerignore @@ -17,3 +17,5 @@ Containerfile .containerignore frontend/node_modules/ web/ +dev-up.sh +githooks/ diff --git a/dev-up.sh b/dev-up.sh new file mode 100755 index 0000000..8a26597 --- /dev/null +++ b/dev-up.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# +# dev-up.sh — baut das Image aus dem aktuellen Arbeitsverzeichnis neu und +# startet den lokalen DEV-Container (kver-dev) damit neu. +# +# Verwendung: +# ./dev-up.sh +# +# Läuft auch automatisch nach jedem Commit (githooks/post-commit, im +# Hintergrund, Log in .git/dev-up.log). Einrichten einmalig per: +# git config core.hooksPath githooks +# +# Voraussetzungen: +# - dev.env mit KVER_DSN (Host "localhost" wird für den Container auf +# host.containers.internal umgeschrieben) +# - Daten/Medien aus dem PROD-Dump unter $KVER_DEV_DATA (read-only gemountet) +# +set -euo pipefail + +cd "$(dirname "$0")" + +NAME=kver-dev +IMAGE=localhost/kver:dev +PORT="${KVER_DEV_PORT:-8081}" +DATA="${KVER_DEV_DATA:-./prod_backup/2026-09-26}" + +# Nur ein Lauf gleichzeitig (schnell aufeinanderfolgende Commits). +exec 9>.git/dev-up.lock +flock 9 + +DSN="$(grep '^KVER_DSN=' dev.env | cut -d= -f2- | sed 's/@localhost:/@host.containers.internal:/')" +if [[ -z "$DSN" ]]; then + echo "FEHLER: KVER_DSN fehlt in dev.env." >&2 + exit 1 +fi + +echo "== $(date '+%F %T') Baue $IMAGE ($(git rev-parse --short HEAD))" +podman build -q -t "$IMAGE" . + +mounts=() +[[ -d "$DATA/data" ]] && mounts+=(-v "$DATA/data:/app/data:ro" -e KVER_GEOIP_ASN=/app/data/GeoLite2-ASN.mmdb) +[[ -d "$DATA/media" ]] && mounts+=(-v "$DATA/media:/app/static/media:ro") + +podman rm -f "$NAME" >/dev/null 2>&1 || true +podman run -d --name "$NAME" -p "127.0.0.1:$PORT:8080" \ + -e KVER_DSN="$DSN" \ + "${mounts[@]}" \ + --security-opt label=disable "$IMAGE" >/dev/null + +# Warten, bis die API antwortet. +for _ in $(seq 30); do + if curl -fs -o /dev/null "http://127.0.0.1:$PORT/api/stats"; then + echo "== läuft: http://127.0.0.1:$PORT" + exit 0 + fi + sleep 1 +done +echo "FEHLER: $NAME antwortet nicht. Log:" >&2 +podman logs --tail 20 "$NAME" >&2 +exit 1 diff --git a/githooks/post-commit b/githooks/post-commit new file mode 100755 index 0000000..0956f29 --- /dev/null +++ b/githooks/post-commit @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Nach jedem Commit den DEV-Container im Hintergrund neu bauen und starten, +# damit der Commit nicht auf den Build wartet. Ausgabe: .git/dev-up.log +# Aussetzen für einen Commit: KVER_NO_DEV_UP=1 git commit ... +[[ -n "${KVER_NO_DEV_UP:-}" ]] && exit 0 +root="$(git rev-parse --show-toplevel)" +nohup "$root/dev-up.sh" >"$root/.git/dev-up.log" 2>&1