← back to IWasCute
verification/TK-11380/deploy-remote.sh
78 lines
#!/usr/bin/env bash
set -euo pipefail
APP=/root/Projects/iwascute
RUN=TK11380-20260910T172500Z
STATE=/root/.local/state/iwascute-deploy/$RUN
STAGE=/root/Projects/.iwascute-$RUN
PATCH=/tmp/TK11380-iwascute.patch
cd "$APP"
if [[ "${1:-}" == prepare || "${1:-}" == activate ]]; then
test "$(date +%s)" -lt 1789118350 || { echo 'AdSense approval window expired' >&2; exit 3; }
fi
recover() {
trap - ERR
pm2 stop gap-iwascute > "$STATE/recovery-stop.log" 2>&1 || true
for part in .next node_modules; do
local previous="$STATE/previous.${part#.}"
if [[ -d "$previous" ]]; then
if [[ -e "$APP/$part" ]]; then mv "$APP/$part" "$STATE/failed.${part#.}"; fi
mv "$previous" "$APP/$part"
fi
done
if git apply -R --check "$PATCH"; then git apply -R "$PATCH"; fi
pm2 restart gap-iwascute > "$STATE/recovery-start.log" 2>&1
printf 'ROLLED_BACK %s\n' "$STATE"
}
case "${1:-}" in
prepare)
test ! -e "$STATE"
test ! -e "$STAGE"
git apply --check "$PATCH"
nginx -t
install -d -m 700 "$STATE" "$STAGE"
git status --short > "$STATE/before-status.txt"
git rev-parse HEAD > "$STATE/before-head.txt"
sha256sum src/app/layout.tsx src/app/api/admin/route.ts > "$STATE/before-sha256.txt"
rsync -a --exclude=.git --exclude=.next --exclude=node_modules ./ "$STATE/source/"
# Only reviewed non-secret files enter the existing Git repository.
git add -- .gitignore package.json package-lock.json src/app/layout.tsx public/ads.txt
git -c user.name='Steve Abrams' -c user.email=steve@designerwallcoverings.com commit -m 'snapshot before TK-11380 IWasCute targeted deployment'
git rev-parse HEAD > "$STATE/snapshot-head.txt"
rsync -a --exclude=.git --exclude=.next --exclude=node_modules ./ "$STAGE/"
cd "$STAGE"
git apply --check "$PATCH"
git apply "$PATCH"
npm ci --ignore-scripts --no-audit --no-fund > "$STATE/install.log" 2>&1
NEXT_TELEMETRY_DISABLED=1 npm run build > "$STATE/build.log" 2>&1
node /tmp/TK11380-iwascute-normalize.cjs "$STAGE" > "$STATE/normalized-links.json"
test -s .next/BUILD_ID
cat .next/BUILD_ID > "$STATE/new-build-id.txt"
printf 'PREPARED %s\n' "$STATE"
;;
activate)
test -s "$STATE/new-build-id.txt"
test ! -e "$STATE/previous.next"
test ! -e "$STATE/previous.node_modules"
sha256sum --check "$STATE/before-sha256.txt"
git apply --check "$PATCH"
git apply "$PATCH"
trap 'recover; exit 1' ERR
pm2 stop gap-iwascute > "$STATE/activation-stop.log" 2>&1
mv .next "$STATE/previous.next"
mv node_modules "$STATE/previous.node_modules"
mv "$STAGE/.next" .next
mv "$STAGE/node_modules" node_modules
pm2 restart gap-iwascute > "$STATE/activation-start.log" 2>&1
sleep 1
node /tmp/TK11380-iwascute-http.cjs http://127.0.0.1:9636 > "$STATE/post-activation-http.json"
trap - ERR
printf 'ACTIVATED %s\n' "$STATE"
;;
rollback)
test -d "$STATE/previous.next"
test -d "$STATE/previous.node_modules"
recover
;;
*) echo 'Expected prepare, activate or rollback' >&2; exit 2 ;;
esac