← 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