#!/bin/bash set -euo pipefail # Komodo Bootstrap Trockenlauf # # Verifiziert, dass `ops/komodo/docker-compose.yml` als Recovery-Anker # tauglich ist: Wegwerf-Mongo, Wegwerf-Core, Wegwerf-Periphery werden # isoliert hochgefahren und auf Bootstrap-Faehigkeit geprueft. # # Produktive Komodo-Container, produktive Mongo-Datadir und produktive # Komodo-Secrets werden NICHT angefasst. SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" . "$SCRIPT_DIR/common.sh" WHATIF=0 KEEP_DATA=0 for arg in "$@"; do case "$arg" in --what-if) WHATIF=1 ;; --keep-data) KEEP_DATA=1 ;; *) echo "Unknown argument: $arg" >&2; exit 1 ;; esac done RESTORE_ROOT="/mnt/user/backups/restore-lab/komodo" REPORT_ROOT="/mnt/user/backups/restore-reports" COMPOSE_FILE="$SCRIPT_DIR/komodo-bootstrap-compose.test.yml" PROJECT_NAME="restoretest-komodo" REPORT_FILE="$REPORT_ROOT/komodo-bootstrap-$(date +%F).md" if [ "$WHATIF" -eq 1 ]; then cat </dev/null 2>&1 || true if [ "$KEEP_DATA" -ne 1 ]; then rm -rf "$RESTORE_ROOT" fi } trap cleanup EXIT rm -rf "$RESTORE_ROOT" mkdir -p "$RESTORE_ROOT/mongo" "$RESTORE_ROOT/core" "$RESTORE_ROOT/keys" "$RESTORE_ROOT/periphery" # Stufe 1: Compose syntaktisch validieren docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME" config >/dev/null # Stufe 2: Mongo und Core hochfahren docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME" up -d \ restoretest-komodo-mongo restoretest-komodo-core >/dev/null # Stufe 3: Warten auf Mongo healthy mongo_ok=0 for _ in $(seq 1 30); do s="$(docker inspect restoretest-komodo-mongo --format '{{.State.Health.Status}}' 2>/dev/null || true)" if [ "$s" = "healthy" ]; then mongo_ok=1; break; fi sleep 2 done if [ "$mongo_ok" -ne 1 ]; then echo "Test-Mongo never reported healthy" >&2 docker logs --tail 80 restoretest-komodo-mongo >&2 || true exit 1 fi # Stufe 4: Warten bis Core HTTP antwortet http_status="" for _ in $(seq 1 60); do http_status="$(curl -s -o /tmp/komodo-bootstrap-body.html -w '%{http_code}' -L http://127.0.0.1:19120 || true)" if [ "$http_status" = "200" ] || [ "$http_status" = "302" ] || [ "$http_status" = "303" ] || [ "$http_status" = "401" ]; then break fi sleep 2 done # Stufe 5: Periphery dazustarten und Health pruefen docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME" up -d \ restoretest-komodo-periphery >/dev/null sleep 8 periphery_state="$(docker inspect restoretest-komodo-periphery --format '{{.State.Status}}' 2>/dev/null || echo missing)" # Stufe 6: Mongo-Ping mit Test-Credentials als zusaetzlicher Sanity-Check mongo_ping="n/a" if docker exec restoretest-komodo-mongo mongosh --quiet -u komodo \ -p restoretest-komodo-mongo-pwd --authenticationDatabase admin \ --eval 'db.adminCommand({ping:1}).ok' 2>/dev/null | grep -q '^1$'; then mongo_ping="ok" fi write_report "$REPORT_FILE" < $REPORT_FILE"