| 1 | #!/usr/bin/env bash |
| 2 | set -euo pipefail |
| 3 | |
| 4 | STAMP=$(date +%Y-%m-%d-%H%M%S) |
| 5 | OUTDIR=~/builds/$STAMP |
| 6 | SITE=/var/www/dougk.world |
| 7 | |
| 8 | # Detect distro |
| 9 | if [ -f /etc/os-release ]; then |
| 10 | . /etc/os-release |
| 11 | DISTRO="${ID:-unknown}" |
| 12 | else |
| 13 | DISTRO="unknown" |
| 14 | fi |
| 15 | |
| 16 | echo "▶ Detected distro: $DISTRO" |
| 17 | |
| 18 | # Ensure builds directory exists |
| 19 | mkdir -p ~/builds |
| 20 | |
| 21 | echo "▶ npm ci" |
| 22 | npm ci |
| 23 | |
| 24 | echo "▶ npm run build" |
| 25 | npm run build |
| 26 | mv dist "$OUTDIR" |
| 27 | |
| 28 | echo "▶ copy into releases" |
| 29 | sudo mkdir -p "$SITE/releases" |
| 30 | sudo rsync -az --delete "$OUTDIR"/ "$SITE/releases/$STAMP/" |
| 31 | |
| 32 | # SELinux context fix (Alma/RHEL/Fedora only) |
| 33 | case "$DISTRO" in |
| 34 | almalinux|rhel|centos|fedora|rocky) |
| 35 | echo "▶ fix selinux context" |
| 36 | sudo restorecon -Rv "$SITE/releases/$STAMP" |
| 37 | ;; |
| 38 | nixos|arch|manjaro|endeavouros) |
| 39 | echo "▶ skipping selinux (not used on $DISTRO)" |
| 40 | ;; |
| 41 | *) |
| 42 | # Fallback: run restorecon if available |
| 43 | if command -v restorecon &>/dev/null; then |
| 44 | echo "▶ fix selinux context" |
| 45 | sudo restorecon -Rv "$SITE/releases/$STAMP" |
| 46 | fi |
| 47 | ;; |
| 48 | esac |
| 49 | |
| 50 | echo "▶ flip current symlink" |
| 51 | sudo rm -rf "$SITE/current" |
| 52 | sudo ln -s "$SITE/releases/$STAMP" "$SITE/current" |
| 53 | |
| 54 | echo "▶ reload nginx" |
| 55 | sudo systemctl reload nginx |
| 56 | |
| 57 | echo "✓ Deployed dougk $STAMP on $DISTRO" |