68 lines
2.6 KiB
Bash
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 "================================================================="
|