scripts: dev-start/dev-stop for local stack (backend+frontend)
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.
This commit is contained in:
Executable
+54
@@ -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"
|
||||||
Executable
+35
@@ -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."
|
||||||
Reference in New Issue
Block a user