groupchat/dev.sh
Jason Tudisco 6cb423b342 feat: add database backup on startup and isolate dev environment
Add automatic SQLite database backup before migrations on every server
start. Backups are timestamped and stored in backups/, with WAL/SHM
files included. Old backups are pruned to keep only the 10 most recent.

Update dev.sh to use separate ports and database from production so both
can run simultaneously on the same machine:
  - Production: server :3001, DB chat.db
  - Development: server :3002, Vite :3003, DB chat-dev.db

Make Vite config dynamic via VITE_PORT and VITE_API_PORT env vars.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:27:32 -06:00

95 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# GroupChat2 Dev Script (macOS/Linux)
# Runs both server (Rust/Axum) and client (Vite) with unified console output.
# Uses separate ports and database from production so both can run simultaneously.
#
# Production: server :3001, DB chat.db
# Development: server :3002, Vite client :3003, DB chat-dev.db
#
# Ctrl+C stops both processes.
set -e
ROOT="$(cd "$(dirname "$0")" && pwd)"
# ─── Dev environment (separate from production) ─────────────────────
DEV_SERVER_PORT=3002
DEV_CLIENT_PORT=3003
DEV_DATABASE="chat-dev.db"
export DATABASE_URL="sqlite:${DEV_DATABASE}?mode=rwc"
export BIND_ADDR="0.0.0.0:${DEV_SERVER_PORT}"
export VITE_PORT="${DEV_CLIENT_PORT}"
export VITE_API_PORT="${DEV_SERVER_PORT}"
export RUST_LOG="${RUST_LOG:-info}"
# Colors
MAGENTA='\033[0;35m'
YELLOW='\033[0;33m'
CYAN='\033[0;36m'
RED='\033[0;31m'
GRAY='\033[0;90m'
NC='\033[0m'
# Load .env for API keys (shared with production)
if [ -f "$ROOT/server/.env" ]; then
set -a
source "$ROOT/server/.env"
set +a
# Override DB and port with dev values (in case .env sets them)
export DATABASE_URL="sqlite:${DEV_DATABASE}?mode=rwc"
export BIND_ADDR="0.0.0.0:${DEV_SERVER_PORT}"
fi
# Install client deps if needed
if [ ! -d "$ROOT/client/node_modules" ]; then
echo -e "${CYAN}[dev] Installing client dependencies...${NC}"
(cd "$ROOT/client" && npm install)
fi
echo ""
echo -e " ${MAGENTA}GroupChat2 Dev Server${NC}"
echo -e " ${YELLOW}Server: http://localhost:${DEV_SERVER_PORT}${NC} ${GRAY}(DB: ${DEV_DATABASE})${NC}"
echo -e " ${CYAN}Client: http://localhost:${DEV_CLIENT_PORT}${NC}"
echo -e " ${GRAY}Press Ctrl+C to stop both${NC}"
echo ""
# Track child PIDs for cleanup
SERVER_PID=""
CLIENT_PID=""
cleanup() {
echo ""
echo -e "${RED}[dev] Shutting down...${NC}"
# Kill background jobs
[ -n "$SERVER_PID" ] && kill "$SERVER_PID" 2>/dev/null
[ -n "$CLIENT_PID" ] && kill "$CLIENT_PID" 2>/dev/null
# Kill any lingering processes on dev ports
lsof -ti:${DEV_CLIENT_PORT} 2>/dev/null | xargs kill -9 2>/dev/null || true
lsof -ti:${DEV_SERVER_PORT} 2>/dev/null | xargs kill -9 2>/dev/null || true
echo -e "${RED}[dev] Stopped.${NC}"
exit 0
}
trap cleanup INT TERM
# Start server (Rust/Axum) on dev port with dev database
(cd "$ROOT/server" && cargo run 2>&1 | while IFS= read -r line; do
[ -n "$line" ] && echo -e "${YELLOW}[server]${NC} $line"
done) &
SERVER_PID=$!
# Start client (Vite) on dev port, proxying to dev server
(cd "$ROOT/client" && npm run dev 2>&1 | while IFS= read -r line; do
[ -n "$line" ] && echo -e "${CYAN}[client]${NC} $line"
done) &
CLIENT_PID=$!
# Wait for either to exit
wait -n "$SERVER_PID" "$CLIENT_PID" 2>/dev/null
echo -e "${RED}[dev] A process exited unexpectedly.${NC}"
cleanup