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:
co-authored by
Claude Opus 5.5
parent
9a7282ed1d
commit
4e0d27c4a6
@@ -17,3 +17,5 @@ Containerfile
|
|||||||
.containerignore
|
.containerignore
|
||||||
frontend/node_modules/
|
frontend/node_modules/
|
||||||
web/
|
web/
|
||||||
|
dev-up.sh
|
||||||
|
githooks/
|
||||||
|
|||||||
@@ -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
|
||||||
Executable
+8
@@ -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)"
|
||||||
@@ -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 |
|
||||||
|
|||||||
Reference in New Issue
Block a user