Skip to content

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 bash
2set -Eeuo pipefail
3umask 022
4[[ $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; }
6SOURCE=$(realpath -- "$1")
7BASE=/opt/archforge-status
8mkdir -p "$BASE/releases"
9TMP=$(mktemp -d "$BASE/.incoming.XXXXXXXX")
10trap 'rm -rf "$TMP"' EXIT
11mkdir -p "$TMP/app"
12rsync -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.js
15if [[ -d "$BASE/app" ]]; then
16 /bin/bash "$BASE/app/scripts/backup.sh"
17 systemctl stop archforge-status
18 SNAP="$BASE/releases/release-$(date -u +%Y%m%d-%H%M%S)"
19 mv "$BASE/app" "$SNAP"
20 echo "$SNAP" > "$BASE/previous-release"
21fi
22mv "$TMP/app" "$BASE/app"
23chown -R root:root "$BASE/app"
24chmod 755 "$BASE/app"
25systemctl start archforge-status
26sleep 2
27if ! systemctl is-active --quiet archforge-status; then
28 echo 'New version failed to start! Restoring previous release...' >&2
29 systemctl stop archforge-status || true
30 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; fi
32 exit 1
33fi
34echo 'Deployment successful.'