Files
2026-04-12 00:17:29 +02:00

164 lines
7.2 KiB
Bash
Executable File

#!/bin/bash
# dev.sh — GnommoEditor local development
# Requires gu_common to be running (postgres :5432, minio :9000).
#
# Usage:
# ./dev.sh [--port <frontend_port>] [--api-port <backend_port>]
#
# Services (gu_common): This script runs natively:
# - PostgreSQL :5432 - Express backend :<BACKEND_PORT>
# - MinIO :9000 - Vite frontend :<FRONTEND_PORT>
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