#!/bin/bash # dev.sh — GnommoEditor local development # Requires gu_common to be running (postgres :5432, minio :9000). # # Usage: # ./dev.sh [--port ] [--api-port ] # # Services (gu_common): This script runs natively: # - PostgreSQL :5432 - Express backend : # - MinIO :9000 - Vite frontend : set -e # ── Args ─────────────────────────────────────────────────────────────────────── FRONTEND_PORT=5173 BACKEND_PORT=3001 while [[ $# -gt 0 ]]; do case "$1" in --port) FRONTEND_PORT="$2"; shift 2 ;; --api-port) BACKEND_PORT="$2"; shift 2 ;; *) echo "Unknown option: $1" >&2; exit 1 ;; esac done # ── Setup ────────────────────────────────────────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LOG_FILE="$SCRIPT_DIR/dev.log" RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' log() { local c="$1"; shift; echo -e "${c}$*${NC}"; echo "$*" >> "$LOG_FILE"; } echo "=== dev.sh started $(date -u '+%Y-%m-%d %H:%M:%S UTC') ===" > "$LOG_FILE" log "$GREEN" "Starting GnommoEditor..." log "$GREEN" " Frontend : http://localhost:${FRONTEND_PORT}" log "$GREEN" " Backend : http://localhost:${BACKEND_PORT}" log "$GREEN" " Log file : ${LOG_FILE}" # ── Node version guard ───────────────────────────────────────────────────────── REQUIRED_NODE=20 CURRENT_NODE=$(node --version 2>/dev/null | sed 's/v//' | cut -d. -f1) if [ -z "$CURRENT_NODE" ]; then log "$RED" "Error: node not found."; log "$YELLOW" "Run: nvm use ${REQUIRED_NODE}"; exit 1 fi if [ "$CURRENT_NODE" -lt "$REQUIRED_NODE" ]; then log "$RED" "Error: Node ${CURRENT_NODE} too old (need >= ${REQUIRED_NODE})." log "$YELLOW" "Fix: nvm use ${REQUIRED_NODE}"; exit 1 fi log "$GREEN" "✓ Node v${CURRENT_NODE}" # ── Load .env ────────────────────────────────────────────────────────────────── if [ -f "$SCRIPT_DIR/.env" ]; then set -a; source "$SCRIPT_DIR/.env"; set +a log "$GREEN" "✓ Loaded .env" fi # ── npm install ──────────────────────────────────────────────────────────────── if [ ! -d "$SCRIPT_DIR/node_modules" ]; then log "$YELLOW" "Installing frontend dependencies..." npm install --prefix "$SCRIPT_DIR" >> "$LOG_FILE" 2>&1 log "$GREEN" "✓ Frontend deps installed" fi if [ ! -d "$SCRIPT_DIR/backend/node_modules" ]; then log "$YELLOW" "Installing backend dependencies..." npm install --prefix "$SCRIPT_DIR/backend" >> "$LOG_FILE" 2>&1 log "$GREEN" "✓ Backend deps installed" fi # ── Check gu_common services ─────────────────────────────────────────────────── if ! docker ps --format "{{.Names}}" | grep -qE "gnommo.?db"; then log "$RED" "Error: postgres (gnommo-db) is not running." log "$YELLOW" "Start gu_common first: cd ../gu_common && ./dev.sh" exit 1 fi log "$GREEN" "✓ PostgreSQL is running" if ! docker ps --format "{{.Names}}" | grep -q "gnommo-minio"; then log "$YELLOW" "⚠ MinIO not running — file uploads won't work" else log "$GREEN" "✓ MinIO is running" fi # ── Ensure gnommoeditor database exists ──────────────────────────────────────── DB_CONTAINER=$(docker ps --format "{{.Names}}" | grep -E "gnommo.?db" | head -1) docker exec "$DB_CONTAINER" psql -U gnommo \ -c "CREATE DATABASE gnommoeditor;" 2>/dev/null \ && log "$GREEN" "✓ Database gnommoeditor created" \ || log "$GREEN" "✓ Database gnommoeditor already exists" # ── Environment ──────────────────────────────────────────────────────────────── export NODE_ENV=development export PORT=$BACKEND_PORT export DATABASE_URL="postgresql://gnommo:${POSTGRES_PASSWORD:-gnommo_secret}@localhost:5432/gnommoeditor" export CORS_ORIGIN="http://localhost:${FRONTEND_PORT}" export INGEST_API_KEY="${INGEST_API_KEY:-dev-ingest-key-change-me}" export JWT_SECRET="${JWT_SECRET:-dev-jwt-secret-change-me}" export MINIO_ENDPOINT="http://localhost:9000" export MINIO_PUBLIC_URL="http://localhost:9000" export MINIO_BUCKET="${MINIO_BUCKET:-glitch-university}" export MINIO_ROOT_USER="${MINIO_ROOT_USER:-minioadmin}" export MINIO_ROOT_PASSWORD="${MINIO_ROOT_PASSWORD:-minioadmin}" # ── Cleanup trap ─────────────────────────────────────────────────────────────── cleanup() { echo "" log "$YELLOW" "Shutting down..." kill $BACKEND_PID 2>/dev/null || true kill $FRONTEND_PID 2>/dev/null || true echo "=== dev.sh stopped $(date -u '+%Y-%m-%d %H:%M:%S UTC') ===" >> "$LOG_FILE" log "$YELLOW" "gu_common services left running." exit 0 } trap cleanup SIGINT SIGTERM # ── Migrations ───────────────────────────────────────────────────────────────── log "$GREEN" "Running migrations..." cd "$SCRIPT_DIR/backend" npm run migrate:up >> "$LOG_FILE" 2>&1 \ && log "$GREEN" "✓ Migrations up to date" \ || { log "$RED" "Migration failed — check dev.log"; exit 1; } # ── Start backend ────────────────────────────────────────────────────────────── log "$GREEN" "Starting backend on port ${BACKEND_PORT}..." npm run dev >> "$LOG_FILE" 2>&1 & BACKEND_PID=$! sleep 2 # ── Start frontend ───────────────────────────────────────────────────────────── log "$GREEN" "Starting frontend on port ${FRONTEND_PORT}..." cd "$SCRIPT_DIR" npm run dev -- --port "$FRONTEND_PORT" >> "$LOG_FILE" 2>&1 & FRONTEND_PID=$! echo "" echo -e "${GREEN}============================================${NC}" echo -e "${GREEN} GnommoEditor is running!${NC}" echo -e "${GREEN}============================================${NC}" echo "" echo -e " Frontend : ${YELLOW}http://localhost:${FRONTEND_PORT}${NC}" echo -e " Backend : ${YELLOW}http://localhost:${BACKEND_PORT}${NC}" echo -e " Database : ${YELLOW}localhost:5432 / gnommoeditor${NC}" echo -e " MinIO : ${YELLOW}localhost:9000${NC}" echo -e " Log file : ${YELLOW}${LOG_FILE}${NC}" echo "" echo -e " Press ${RED}Ctrl+C${NC} to stop (gu_common keeps running)" echo "" wait