From 36d7186a5434e344cbb4de47ac70ec7c9ac9f6ee Mon Sep 17 00:00:00 2001 From: david raistrick <1108844+keen99@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:55:37 -0400 Subject: [PATCH] scripts: dev-start/dev-stop for local stack (backend+frontend) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dev-start.sh: starts node backend (better-sqlite3, :4001) + react frontend (ws storage mode, :3999). Uses absolute DB_PATH to avoid workspace cwd ambiguity (npm run server:dev runs in server/ subdir). Idempotent — skips ports already in use. dev-stop.sh: kills procs on :3999/:4001, sweeps node --watch + react-scripts. Both write tmp/*.log + tmp/*.pid for debugging. --- scripts/dev-start.sh | 54 ++++++++++++++++++++++++++++++++++++++++++++ scripts/dev-stop.sh | 35 ++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100755 scripts/dev-start.sh create mode 100755 scripts/dev-stop.sh diff --git a/scripts/dev-start.sh b/scripts/dev-start.sh new file mode 100755 index 0000000..f49b1fa --- /dev/null +++ b/scripts/dev-start.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# Start local dev stack: node backend (sqlite) + react frontend, ws storage mode. +# Usage: ./scripts/dev-start.sh +# Stop: ./scripts/dev-stop.sh +set -euo pipefail +cd "$(dirname "$0")/.." +mkdir -p tmp data + +# kill anything on the ports (zombies) +for port in 3999 4001; do + pids=$(lsof -ti :$port 2>/dev/null || true) + if [ -n "$pids" ]; then + echo "port $port in use by: $pids — leaving as-is." + echo " (run ./scripts/dev-stop.sh first to restart clean)" + fi +done + +# backend: better-sqlite3, :4001 +if ! lsof -ti :4001 >/dev/null 2>&1; then + echo "starting backend :4001..." + DB_PATH=$(pwd)/data/tracker.sqlite PORT=4001 \ + nohup npm run server:dev > tmp/server.log 2>&1 & + echo $! > tmp/server.pid +else + echo "backend already on :4001" +fi + +# frontend: ws storage, :3999 +if ! lsof -ti :3999 >/dev/null 2>&1; then + echo "starting frontend :3999..." + REACT_APP_STORAGE=ws \ + REACT_APP_BACKEND_URL=http://127.0.0.1:4001 \ + REACT_APP_BACKEND_WS=ws://127.0.0.1:4001/ws \ + BROWSER=none PORT=3999 \ + nohup npm start > tmp/fe.log 2>&1 & + echo $! > tmp/fe.pid +else + echo "frontend already on :3999" +fi + +# wait for ports to listen +echo "waiting for ports..." +for port in 4001 3999; do + for i in {1..30}; do + lsof -ti :$port >/dev/null 2>&1 && break + sleep 1 + done +done + +echo "" +echo "backend : http://127.0.0.1:4001 (curl http://127.0.0.1:4001/health)" +echo "frontend : http://127.0.0.1:3999 (admin / player /display)" +echo "logs : tmp/server.log tmp/fe.log" +echo "stop : ./scripts/dev-stop.sh" diff --git a/scripts/dev-stop.sh b/scripts/dev-stop.sh new file mode 100755 index 0000000..4e67595 --- /dev/null +++ b/scripts/dev-stop.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Stop local dev stack. Usage: ./scripts/dev-stop.sh +set -uo pipefail +cd "$(dirname "$0")/.." + +stopped=0 +for port in 3999 4001; do + pids=$(lsof -ti :$port 2>/dev/null || true) + if [ -n "$pids" ]; then + echo "stopping :$port (pid: $pids)" + kill $pids 2>/dev/null || true + stopped=1 + fi +done + +# also kill recorded pids +for f in tmp/server.pid tmp/fe.pid; do + if [ -f "$f" ]; then + pid=$(cat "$f") + kill "$pid" 2>/dev/null || true + rm -f "$f" + fi +done + +# node --watch spawns children — sweep by port pattern +pids=$(pgrep -f "node --watch index.js|react-scripts start" 2>/dev/null || true) +if [ -n "$pids" ]; then + echo "sweeping node dev procs: $pids" + kill $pids 2>/dev/null || true +fi + +if [ "$stopped" = "0" ]; then + echo "nothing running." +fi +echo "stopped."