75 lines
2.2 KiB
Bash
Executable File
75 lines
2.2 KiB
Bash
Executable File
#!/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 ✅" |