krona-front/deploy/kcc/deploy-kcc.sh

68 lines
2.6 KiB
Bash

#!/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 "================================================================="