Bash · 3522 bytes Raw Blame History
1 #!/usr/bin/env bash
2 set -Eeuo pipefail
3
4 # ── config ──────────────────────────────────────────────────────────────
5 SITE="cob.musicsian.com"
6 WEB_ROOT="/var/www/$SITE"
7 RELEASES="$WEB_ROOT/releases"
8 CURRENT="$WEB_ROOT/current"
9 STAMP="${1:-$(date +%Y-%m-%d-%H%M%S)}" # you can pass a stamp manually if you want
10 KEEP="${KEEP:-10}" # how many releases to keep
11 PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
12 STAGE="${STAGE_DIR:-$HOME/builds/$SITE/$STAMP}"
13
14 # ── ensure dirs exist ───────────────────────────────────────────────────
15 echo "▶ Ensure web root"
16 sudo install -d -m 0755 "$WEB_ROOT"
17 sudo install -d -m 0755 "$RELEASES"
18
19 # ── stage ───────────────────────────────────────────────────────────────
20 echo "▶ Stage files → $STAGE"
21 mkdir -p "$STAGE"
22 # Only ship the static site files we care about
23 rsync -az --delete \
24 --include '/index.html' \
25 --include '/css/***' \
26 --include '/js/***' \
27 --exclude '*' \
28 "$PROJECT_DIR"/ "$STAGE"/
29
30 echo "▶ Verify staged content"
31 ls -l "$STAGE"
32 test -f "$STAGE/index.html" || { echo "✗ index.html missing in stage"; exit 1; }
33 test -d "$STAGE/css" || { echo "✗ css/ missing in stage"; exit 1; }
34 test -d "$STAGE/js" || { echo "✗ js/ missing in stage"; exit 1; }
35
36 # ── publish ─────────────────────────────────────────────────────────────
37 echo "▶ Publish → $RELEASES/$STAMP"
38 sudo rsync -az --delete "$STAGE"/ "$RELEASES/$STAMP"/
39
40 echo "▶ Verify release contents"
41 sudo test -f "$RELEASES/$STAMP/index.html" || { echo "✗ index.html missing in release"; exit 1; }
42 sudo test -d "$RELEASES/$STAMP/css" || { echo "✗ css/ missing in release"; exit 1; }
43 sudo test -d "$RELEASES/$STAMP/js" || { echo "✗ js/ missing in release"; exit 1; }
44
45 # ── flip symlink (with rollback trap) ───────────────────────────────────
46 echo "▶ Flip symlink"
47 prev="$(readlink -f "$CURRENT" || true)"
48 sudo ln -nfs "$RELEASES/$STAMP" "$CURRENT"
49
50 rollback() {
51 echo "⚠️ Rolling back symlink to previous release"
52 [[ -n "${prev:-}" ]] && sudo ln -nfs "$prev" "$CURRENT"
53 }
54 trap 'rollback' ERR
55
56 # ── selinux restore (safe if SELinux is permissive/disabled) ────────────
57 echo "▶ Restore SELinux context"
58 sudo restorecon -Rv "$RELEASES/$STAMP" >/dev/null || true
59 sudo restorecon -v "$CURRENT" >/dev/null || true
60
61 # ── nginx reload (only if config passes) ────────────────────────────────
62 echo "▶ Test & reload Nginx"
63 if sudo nginx -t; then
64 sudo systemctl reload nginx
65 else
66 echo "✗ nginx -t failed"; exit 1
67 fi
68
69 # ── prune old releases ──────────────────────────────────────────────────
70 echo "▶ Prune old releases (keep $KEEP)"
71 sudo bash -c "ls -1dt $RELEASES/* 2>/dev/null | tail -n +$((KEEP+1)) | xargs -r rm -rf"
72
73 echo "✓ Deployed $STAMP$SITE"