dev-up.sh: DEV-Container neu bauen und starten, auch als post-commit-Hook

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TiXsPUqw7oeomZ8wZrQW5q
This commit is contained in:
irrlicht
2026-09-27 00:10:01 +02:00
co-authored by Claude Opus 5.5
parent 9a7282ed1d
commit 4e0d27c4a6
4 changed files with 78 additions and 0 deletions
+2
View File
@@ -17,3 +17,5 @@ Containerfile
.containerignore .containerignore
frontend/node_modules/ frontend/node_modules/
web/ web/
dev-up.sh
githooks/
Executable
+60
View File
@@ -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
+8
View File
@@ -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 </dev/null &
echo "dev-up: DEV-Container wird neu gebaut (Log: .git/dev-up.log)"
+8
View File
@@ -24,6 +24,14 @@ Vite reicht `/api` und `/static` ans Backend durch (`frontend/vite.config.ts`,
(gitignored). Von dort liefert das Go-Backend aus (`frontend.go`), lokal also (gitignored). Von dort liefert das Go-Backend aus (`frontend.go`), lokal also
auch ohne Vite: `npm run build`, dann `go run .`. auch ohne Vite: `npm run build`, dann `go run .`.
### DEV-Container
`./dev-up.sh` baut das Image aus dem Arbeitsverzeichnis und startet den
Container `kver-dev` auf http://127.0.0.1:8081 neu (DSN aus `dev.env`, Daten
und Medien read-only aus `prod_backup/`). Mit `git config core.hooksPath
githooks` läuft das nach jedem Commit automatisch im Hintergrund (Log:
`.git/dev-up.log`); einmalig aussetzen mit `KVER_NO_DEV_UP=1 git commit …`.
## Aufbau ## Aufbau
| Datei | Zweck | | Datei | Zweck |