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>
95 lines
2.8 KiB
Bash
Executable File
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
|