Bash · 2808 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 "$RELEASES"
17 sudo install -d -m 0755 "$WEB_ROOT"
18
19 # ── stage ───────────────────────────────────────────────────────────────
20 echo "▶ Stage files → $STAGE"
21 mkdir -p "$STAGE"
22 rsync -az --delete \
23 --exclude deploy.sh --exclude .git \
24 "$PROJECT_DIR"/ "$STAGE"/
25
26 # ── publish ─────────────────────────────────────────────────────────────
27 echo "▶ Publish → $RELEASES/$STAMP"
28 sudo rsync -az --delete "$STAGE"/ "$RELEASES/$STAMP"/
29
30 # ── flip symlink (with rollback trap) ───────────────────────────────────
31 echo "▶ Flip symlink"
32 prev="$(readlink -f "$CURRENT" || true)"
33 sudo ln -nfs "$RELEASES/$STAMP" "$CURRENT"
34
35 rollback() {
36 echo "⚠️ Rolling back symlink to previous release"
37 [[ -n "${prev:-}" ]] && sudo ln -nfs "$prev" "$CURRENT"
38 }
39 trap 'rollback' ERR
40
41 # ── selinux restore (safe if SELinux is permissive/disabled) ────────────
42 echo "▶ Restore SELinux context"
43 sudo restorecon -Rv "$RELEASES/$STAMP" >/dev/null || true
44 sudo restorecon -v "$CURRENT" >/dev/null || true
45
46 # ── nginx reload (only if config passes) ────────────────────────────────
47 echo "▶ Test & reload Nginx"
48 if sudo nginx -t; then
49 sudo systemctl reload nginx
50 else
51 echo "✗ nginx -t failed"; exit 1
52 fi
53
54 # ── prune old releases ──────────────────────────────────────────────────
55 echo "▶ Prune old releases (keep $KEEP)"
56 sudo bash -c "ls -1dt $RELEASES/* 2>/dev/null | tail -n +$((KEEP+1)) | xargs -r rm -rf"
57
58 echo "✓ Deployed $STAMP$SITE"