60 lines
1.4 KiB
Bash
60 lines
1.4 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
trap "echo 'Server stopped by user'; exit 0" SIGINT
|
|
|
|
MAX_BACKOFF=60
|
|
FAIL_COUNT=0
|
|
PID_FILE="bun.pid"
|
|
PORT=${PORT:-3005}
|
|
ENTRYPOINT="backend/server.ts"
|
|
|
|
mkdir -p logs
|
|
|
|
while true; do
|
|
# Check if previous server PID exists
|
|
if [ -f "$PID_FILE" ]; then
|
|
PREV_PID=$(cat "$PID_FILE")
|
|
if ps -p $PREV_PID > /dev/null 2>&1; then
|
|
echo "Previous server (PID $PREV_PID) still running. Waiting 2 seconds..."
|
|
sleep 2
|
|
continue
|
|
else
|
|
# Clean up stale PID file
|
|
rm "$PID_FILE"
|
|
fi
|
|
fi
|
|
|
|
echo "Starting Bun server on port $PORT..." | tee -a logs/server.log
|
|
|
|
# Start Bun in background and store PID
|
|
bun run $ENTRYPOINT 2>&1 | tee -a logs/server.log &
|
|
SERVER_PID=$!
|
|
echo $SERVER_PID > "$PID_FILE"
|
|
|
|
# Wait for server to exit
|
|
wait $SERVER_PID
|
|
EXIT_CODE=$?
|
|
|
|
echo "Server exited with code $EXIT_CODE" | tee -a logs/server.log
|
|
|
|
# Remove PID file
|
|
rm -f "$PID_FILE"
|
|
|
|
# Backoff logic
|
|
FAIL_COUNT=$((FAIL_COUNT + 1))
|
|
BACKOFF=$((2 ** FAIL_COUNT))
|
|
[ $BACKOFF -gt $MAX_BACKOFF ] && BACKOFF=$MAX_BACKOFF
|
|
JITTER=$((RANDOM % 4))
|
|
SLEEP_TIME=$((BACKOFF + JITTER))
|
|
|
|
echo "Restarting in $SLEEP_TIME seconds (failures: $FAIL_COUNT)..." | tee -a logs/server.log
|
|
sleep $SLEEP_TIME
|
|
|
|
if [ $FAIL_COUNT -ge 10 ]; then
|
|
echo "High number of failures — cooling down for 5 minutes..." | tee -a logs/server.log
|
|
sleep 300
|
|
FAIL_COUNT=0
|
|
fi
|
|
|
|
done
|