#!/usr/bin/env bash # # Blue/Green-Deployment mit Podman und nginx. # Aufruf: ./bluegreen.sh # set -euo pipefail NEUES_IMAGE="$1" PROXY_KONF="/etc/nginx/conf.d/kfz-upstream.conf" # --- Welche Farbe ist gerade aktiv? --- if grep -q "8081" "$PROXY_KONF"; then AKTIV="blau"; AKTIV_PORT=8081 NEU="gruen"; NEU_PORT=8082 else AKTIV="gruen"; AKTIV_PORT=8082 NEU="blau"; NEU_PORT=8081 fi echo "Aktiv: ${AKTIV} (${AKTIV_PORT}). Neue Version geht nach ${NEU} (${NEU_PORT})." # --- Neue Version in der inaktiven Farbe starten --- podman rm -f "kfz-${NEU}" 2>/dev/null || true podman run -d --name "kfz-${NEU}" \ -p "127.0.0.1:${NEU_PORT}:8080" \ -e "UMGEBUNG=produktion" \ --health-cmd 'curl -f http://localhost:8080/health || exit 1' \ --health-interval 5s \ "$NEUES_IMAGE" # --- Warten, bis sie gesund ist --- echo "Warte auf Gesundheitsstatus ..." for i in {1..30}; do status=$(podman inspect "kfz-${NEU}" --format '{{.State.Health.Status}}') [[ "$status" == "healthy" ]] && break sleep 2 done if [[ "$status" != "healthy" ]]; then echo "FEHLER: Neue Version wird nicht gesund. Umschaltung unterbleibt." podman logs --tail 50 "kfz-${NEU}" podman rm -f "kfz-${NEU}" exit 1 fi # --- Fachliche Stichprobe vor der Umschaltung --- ergebnis=$(curl -fsS "http://127.0.0.1:${NEU_PORT}/api/praemie?sf=5&alter=3" | jq -r '.betrag') if [[ "$ergebnis" != "288.00" ]]; then echo "FEHLER: Fachliche Prüfung fehlgeschlagen (${ergebnis}). Umschaltung unterbleibt." podman rm -f "kfz-${NEU}" exit 1 fi # --- Umschalten --- echo "Schalte um auf ${NEU} ..." sed -i "s/127.0.0.1:${AKTIV_PORT}/127.0.0.1:${NEU_PORT}/" "$PROXY_KONF" nginx -t && systemctl reload nginx echo "Umschaltung erfolgt. ${AKTIV} bleibt als Rückfallebene stehen." echo "Zurückschalten: sed -i 's/${NEU_PORT}/${AKTIV_PORT}/' ${PROXY_KONF} && systemctl reload nginx"