Files
NewsSite/deploy_zero_downtime.sh
2026-01-26 01:19:29 +00:00

75 lines
2.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
REPO_DIR="/root/opt/bunkerserver/NewsSite"
BRANCH="main"
BLUE="server-app-blue"
GREEN="server-app-green"
HEALTH_PATH="/health" # falls du keinen hast: "/" nehmen
HEALTH_TIMEOUT=60
lock="/tmp/deploy_newssite.lock"
exec 9>"$lock"
flock -n 9 || { echo "Deploy läuft schon."; exit 1; }
log() { echo "[$(date -Is)] $*"; }
wait_healthy() {
local svc="$1"
local deadline=$(( $(date +%s) + HEALTH_TIMEOUT ))
log "Warte bis $svc healthy ist…"
while (( $(date +%s) < deadline )); do
local cid
cid="$(docker compose ps -q "$svc" || true)"
if [[ -n "$cid" ]]; then
# test via wget oder curl im container (eins von beiden sollte meistens da sein)
if docker exec "$cid" sh -lc "command -v curl >/dev/null && curl -fsS http://127.0.0.1:8080${HEALTH_PATH} >/dev/null" 2>/dev/null; then
log "$svc healthy ✅"
return 0
fi
if docker exec "$cid" sh -lc "command -v wget >/dev/null && wget -qO- http://127.0.0.1:8080${HEALTH_PATH} >/dev/null" 2>/dev/null; then
log "$svc healthy ✅"
return 0
fi
fi
sleep 2
done
log "Healthcheck failed für $svc"
docker compose logs --tail=200 "$svc" || true
return 1
}
log "1) Git Pull (hart auf origin/$BRANCH)"
cd "$REPO_DIR"
git fetch origin "$BRANCH"
git reset --hard "origin/$BRANCH"
SHA="$(git rev-parse --short HEAD)"
TAG="bunker-server-app:${SHA}"
log "2) Build Image: $TAG"
docker build -t "$TAG" ./server-app
# Green bekommt neues Tag (damit green garantiert neu ist)
docker tag "$TAG" bunker-server-app:green
# Blue bekommt später neues Tag
docker tag "$TAG" bunker-server-app:blue
log "3) GREEN starten (parallel, ohne Downtime)"
# Wichtig: Compose-Override nur fürs Image wäre am saubersten hier nutzen wir Tags:
# => dafür muss in compose beim service-image statt latest die tags green/blue stehen (siehe Hinweis unten)
docker compose up -d --no-deps --force-recreate "$GREEN"
wait_healthy "$GREEN"
log "4) BLUE ersetzen (während GREEN ausliefert)"
docker compose up -d --no-deps --force-recreate "$BLUE"
wait_healthy "$BLUE"
log "5) GREEN stoppen & entfernen"
docker compose stop "$GREEN" || true
docker compose rm -f "$GREEN" || true
log "Deploy abgeschlossen ✅"