Repository files, collaboration, releases and project activity.
archforge-external-status / scripts/deploy.shmain
▤ scripts/deploy.sh1423 bytes
35 lines · Select a line number for a permalink
1
#!/usr/bin/env bash2
set -Eeuo pipefail3
umask 0224
[[ $EUID -eq 0 ]] || { echo 'Run as root through sudo.' >&2; exit 1; }5
[[ $# -eq 1 && -d "$1/src" && -f "$1/package.json" ]] || { echo 'Usage: sudo scripts/deploy.sh /path/to/git-checkout' >&2; exit 1; }6
SOURCE=$(realpath -- "$1")7
BASE=/opt/archforge-status8
mkdir -p "$BASE/releases"9
TMP=$(mktemp -d "$BASE/.incoming.XXXXXXXX")10
trap 'rm -rf "$TMP"' EXIT11
mkdir -p "$TMP/app"12
rsync -a --delete --exclude='.git' --exclude='data' --exclude='backups' --exclude='.env' --exclude='node_modules' --chmod=D755,F644 "$SOURCE/" "$TMP/app/"13
/usr/bin/node --check "$TMP/app/src/server.js"14
/usr/bin/node --test "$TMP/app/tests/"*.test.js15
if [[ -d "$BASE/app" ]]; then16
/bin/bash "$BASE/app/scripts/backup.sh"17
systemctl stop archforge-status18
SNAP="$BASE/releases/release-$(date -u +%Y%m%d-%H%M%S)"19
mv "$BASE/app" "$SNAP"20
echo "$SNAP" > "$BASE/previous-release"21
fi22
mv "$TMP/app" "$BASE/app"23
chown -R root:root "$BASE/app"24
chmod 755 "$BASE/app"25
systemctl start archforge-status26
sleep 227
if ! systemctl is-active --quiet archforge-status; then28
echo 'New version failed to start! Restoring previous release...' >&229
systemctl stop archforge-status || true30
mv "$BASE/app" "$BASE/releases/failed-$(date +%s)"31
if [[ -f "$BASE/previous-release" ]]; then mv "$(cat "$BASE/previous-release")" "$BASE/app";systemctl start archforge-status; fi32
exit 133
fi34
echo 'Deployment successful.'