#!/usr/bin/env bash # ============================================================================== # Krona Control Center (KCC) - Atomic Zero-Downtime Deployment Script # Target: https://kccdemo.ochenstarik.ru # Target Host: 178.212.13.102 (User: kcc) # ============================================================================== set -euo pipefail APP_ROOT="/srv/kccdemo" RELEASES_DIR="$APP_ROOT/releases" CURRENT_LINK="$APP_ROOT/current" TIMESTAMP=$(date +%Y%m%d_%H%M%S) NEW_RELEASE_DIR="$RELEASES_DIR/$TIMESTAMP" echo "=================================================================" echo " [KCC Deploy] Initiating atomic release: $TIMESTAMP" echo "=================================================================" # 1. Create target release directory mkdir -p "$NEW_RELEASE_DIR" # 2. Deploy static SPA artifacts if [ -d "./dist" ]; then echo "Copying ./dist to $NEW_RELEASE_DIR..." cp -r ./dist/* "$NEW_RELEASE_DIR/" elif [ -d "../dist" ]; then echo "Copying ../dist to $NEW_RELEASE_DIR..." cp -r ../dist/* "$NEW_RELEASE_DIR/" else echo "ERROR: Production build directory 'dist' not found!" >&2 exit 1 fi # Set proper permissions for kcc user chmod -R 755 "$NEW_RELEASE_DIR" # 3. Atomic symlink switch echo "Switching active release symlink ($CURRENT_LINK -> $NEW_RELEASE_DIR)..." ln -sfn "$NEW_RELEASE_DIR" "$CURRENT_LINK" # 4. Prune older releases (keep last 3 for instant rollback) echo "Cleaning up old releases (retaining last 3)..." cd "$RELEASES_DIR" # List matching release directories sorted by date descending, remove all except top 3 ls -1dt 20* 2>/dev/null | tail -n +4 | xargs -r rm -rf # 5. Reload Nginx if command -v systemctl >/dev/null 2>&1; then echo "Reloading Nginx web server..." sudo systemctl reload nginx || systemctl reload nginx || echo "Nginx reload skipped (no sudo permission)" fi # 6. Post-deploy health verification echo "Executing health verification on local loopback..." HTTP_STATUS=$(curl -sk -o /dev/null -w "%{http_code}" https://127.0.0.1/control/gate -H "Host: kccdemo.ochenstarik.ru" || true) echo "Local Healthcheck HTTP Status: $HTTP_STATUS" if [ "$HTTP_STATUS" = "200" ] || [ "$HTTP_STATUS" = "301" ] || [ "$HTTP_STATUS" = "302" ]; then echo "=== [KCC Deploy] Health check: PASSED ===" else echo "WARNING: Health check returned status $HTTP_STATUS. Please verify Nginx configuration." fi echo "=================================================================" echo " [KCC Deploy] Release $TIMESTAMP successfully deployed and active!" echo " URL: https://kccdemo.ochenstarik.ru" echo "================================================================="