#!/bin/bash # Deploy-Script: Promotion nach PROD (manuelles OK erforderlich) # Wird manuell aufgerufen, nachdem test-prod verifiziert wurde. # Uebernimmt die getesteten Images aus test-prod per docker tag (kein Rebuild, # kein git pull). Die Compose-Datei und .env werden nicht aktualisiert — # prod startet mit exakt dem Stand, der in test-prod verifiziert wurde. # Voraussetzungen auf dem Server: git, docker, docker compose. # # Server-spezifische Konfiguration (Pfade, Ports, Projekt-Namen) wird aus # einer Datei deploy.env geladen, die im gleichen Verzeichnis wie dieses # Script liegen muss. Diese Datei ist NICHT Teil des Repos und wird nicht # per git pull ueberschrieben. Die Defaults unten greifen, falls deploy.env # fehlt oder einzelne Werte nicht setzt. set -euo pipefail # === Script-Verzeichnis ermitteln (fuer deploy.env) === SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # === Server-Konfiguration laden (ausserhalb des Repos, nicht per git pull ueberschreibbar) === DEPLOY_CONFIG="$SCRIPT_DIR/deploy.env" if [ -f "$DEPLOY_CONFIG" ]; then source "$DEPLOY_CONFIG" fi # === Defaults — werden verwendet, falls deploy.env fehlt oder Werte nicht setzt === # COMPOSE_FILE verweist auf das test-prod-Repo — die Compose-Datei wurde # dort verifiziert und soll in prod identisch sein. Prod hat kein eigenes Repo. COMPOSE_FILE="${DEPLOY_PROD_COMPOSE_FILE:-/opt/kbcrm/test-prod/repo/docker-compose.prod.yaml}" ENV_FILE="${DEPLOY_PROD_ENV_FILE:-/opt/kbcrm/prod/.env}" PROJECT_NAME="${DEPLOY_PROD_PROJECT_NAME:-kbpprod}" TEST_PROJECT_NAME="${DEPLOY_PROD_TEST_PROJECT_NAME:-kbptest}" HEALTH_PORT="${DEPLOY_PROD_HEALTH_PORT:-443}" # === NGINX_SERVER_NAME aus .env laden (fuer Health-Check Host-Header) === # Die .env wird per --env-file an Docker Compose uebergeben, aber die Variablen # stehen nicht als Shell-Variablen im Script zur Verfuegung. Daher laden wir # NGINX_SERVER_NAME manuell, damit der Health-Check den richtigen Host-Header # sendet (sonst liefert NGINX 404 wegen server_name-Mismatch). NGINX_SERVER_NAME="" if [ -f "$ENV_FILE" ]; then NGINX_SERVER_NAME=$(grep -E "^NGINX_SERVER_NAME=" "$ENV_FILE" | cut -d= -f2- | tr -d '\r\n') fi echo "=== Deploy KB-CRM PROD ===" # Sicherheitsabfrage — nur bei manueller Eingabe von "yes" wird fortgesetzt echo "This will deploy to PRODUCTION. Continue? (yes/no)" read -r confirmation if [ "$confirmation" != "yes" ]; then echo "Aborted." exit 1 fi # 1. Getestete Images aus test-prod uebernehmen (kein Rebuild, kein git pull) # docker tag erzeugt eine zusaetzliche Referenz auf das gleiche Image — # die Original-Tags (kbptest-*) bleiben unangetastet. echo "=== Promoting tested images from test-prod to prod ===" docker tag "${TEST_PROJECT_NAME}-pythonapp" "${PROJECT_NAME}-pythonapp" docker tag "${TEST_PROJECT_NAME}-nginx-proxy" "${PROJECT_NAME}-nginx-proxy" # 2. Container starten (ohne --build — Images wurden per tag uebernommen) # -p setzt den Projekt-Namen (fuer Container-Namen) # --env-file laedt die Container-Variablen (Ports, Zertifikate, DB, OIDC) # -f gibt die Compose-Datei explizit an (ignoriert COMPOSE_FILE aus .env) echo "=== Starting prod containers ===" docker compose -p "$PROJECT_NAME" --env-file "$ENV_FILE" \ -f "$COMPOSE_FILE" up -d # 3. Health-Check echo "=== Waiting for container startup ===" sleep 10 if curl -sf -H "Host: ${NGINX_SERVER_NAME}" "http://localhost:${HEALTH_PORT}/xhr/health-check" >/dev/null 2>&1; then echo "Health check: OK" else echo "WARNING: Health check failed — check container logs with:" echo " docker compose -p $PROJECT_NAME --env-file $ENV_FILE -f $COMPOSE_FILE logs" fi echo "=== Deploy PROD complete ==="