← back to Wallco Ai

scripts/auto-deploy-loop.sh

50 lines

#!/usr/bin/env bash
# Reliable auto-deploy loop. 60s ticks. Hard timeouts on rsync + SSH so a
# stuck connection can't freeze the whole loop. Pushes designs.json + new
# PNGs to prod, then reloads.
# Kill: pkill -f auto-deploy-loop.sh

ROOT="/Users/macstudio3/Projects/wallco-ai"
PROD_HOST="root@45.61.58.125"
PROD_PATH="/root/public-projects/wallco-ai"
COOKIE_FILE="/tmp/steve-dw-auth-cookie.txt"
LOG="/tmp/auto-deploy-loop.log"
PSQL="/opt/homebrew/opt/postgresql@14/bin/psql"

log() { echo "[$(date +%H:%M:%S)] $*" >> "$LOG"; }
tick=0
while true; do
  tick=$((tick+1))
  log "tick $tick start"
  cd "$ROOT" 2>/dev/null || { log "FAIL cd"; sleep 30; continue; }
  # macOS doesn't have `timeout` (it's GNU coreutils only). Skipping the wrap.
  "$PSQL" dw_unified -At -c \
    "SELECT json_agg(t ORDER BY id DESC) FROM (SELECT * FROM spoon_all_designs WHERE is_published AND NOT user_removed) t;" \
    > data/designs.json.NEW 2>/dev/null
  if [ -s data/designs.json.NEW ]; then
    rows=$(node -e 'console.log(JSON.parse(require("fs").readFileSync("data/designs.json.NEW","utf8")).length)' 2>/dev/null || echo "?")
    mv data/designs.json.NEW data/designs.json
    log "designs.json: $rows rows"
  else
    log "FAIL psql dump (tick $tick)"
    rm -f data/designs.json.NEW
    sleep 30; continue
  fi
  timeout 30 rsync -aq --timeout=20 data/designs.json "$PROD_HOST:$PROD_PATH/data/designs.json" 2>>"$LOG"
  rc=$?
  [ $rc -ne 0 ] && log "rsync designs.json rc=$rc"
  timeout 60 rsync -aq --timeout=20 --include='*.png' --exclude='*' \
    data/generated/ "$PROD_HOST:$PROD_PATH/data/generated/" 2>>"$LOG"
  rc=$?
  [ $rc -ne 0 ] && log "rsync pngs rc=$rc"
  if [ -f "$COOKIE_FILE" ]; then
    COOKIE=$(cat "$COOKIE_FILE")
    reload=$(timeout 10 curl -s --max-time 8 -X POST -H "Cookie: dw_auth=$COOKIE" https://wallco.ai/admin/reload-designs 2>&1 | head -c 200)
    log "reload: $reload"
  fi
  health=$(timeout 10 curl -s --max-time 5 https://wallco.ai/health 2>&1 | head -c 100)
  log "health: $health"
  log "tick $tick done — sleeping 60s"
  sleep 60
done