#!/bin/bash # Git-pull-based deploy for Erik. Replaces the ad-hoc per-file `cat file | ssh` # uploads used on 2026-07-16, which twice missed files that server.js actually # requires (src/backend/config.js, src/backend/services/smtp.js) because # uploading was a manual, easy-to-forget step instead of a single `git pull`. # # Run this ON Erik, from /opt/peercortex-app. Deliberately manual (not wired # to a Gitea Action) -- Erik hosts many unrelated production services and # main can contain code that hasn't been live-tested yet (see project memory). # # Usage: ./deploy-from-git.sh [branch] (default: main) set -euo pipefail cd "$(dirname "$0")" BRANCH="${1:-main}" BACKUP_DIR=/opt/_rollbacks/peercortex-app TS=$(date -u +%Y%m%dT%H%M%SZ) mkdir -p "$BACKUP_DIR" echo "[1/7] Backing up current server.js + public/index.html..." cp -p server.js "$BACKUP_DIR/server.js.$TS" cp -p public/index.html "$BACKUP_DIR/index.html.$TS" echo "[2/7] Fetching + checking out $BRANCH..." git fetch origin git checkout "$BRANCH" git pull origin "$BRANCH" echo "[3/7] npm ci..." npm ci echo "[4/7] Verifying every local require() target actually exists..." MISSING=0 for f in server.js local-db-client.js bio-rd-client.js; do [ -f "$f" ] || continue for req in $(grep -oE "require\(['\"]\./[^'\"]+['\"]\)" "$f" | sed -E "s/require\(['\"]\.\/([^'\"]+)['\"]\)/\1/"); do if [ ! -f "$req" ] && [ ! -f "$req.js" ] && [ ! -d "$req" ]; then echo " MISSING: $f requires ./$req -- not found" >&2 MISSING=1 fi done done if [ "$MISSING" = "1" ]; then echo "Aborting: fix the missing file(s) above before deploying." >&2 exit 1 fi echo "[5/7] Syntax check..." node --check server.js node --check local-db-client.js echo "[6/7] Building dist/ (TypeScript API server)..." # tsc exits non-zero on pre-existing src/mcp-server/* errors unrelated to this # deploy, but still emits working output (default noEmitOnError:false) for # files that DID typecheck cleanly -- confirmed 2026-07-16. Don't let `set -e` # abort here; check the files this deploy actually needs instead. npm run build || true for f in dist/api/index.js dist/api/server.js dist/aspa/validator.js; do if [ ! -f "$f" ]; then echo "Aborting: required build output missing: $f" >&2 exit 1 fi done echo "[7/7] Restarting peercortex (and peercortex-api if configured)..." pm2 restart peercortex --update-env pm2 restart peercortex-api --update-env 2>/dev/null || echo " (peercortex-api not running yet, skipped)" echo "" echo "Done. Rollback: cp $BACKUP_DIR/server.js.$TS server.js && cp $BACKUP_DIR/index.html.$TS public/index.html && pm2 restart peercortex"