151 lines
3.9 KiB
Bash
151 lines
3.9 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Script de inicio rápido para desarrollo
|
||
|
|
# Combina las mejores estrategias: detección, paralelismo, SQLite
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||
|
|
BACKEND_PORT=5000
|
||
|
|
FRONTEND_PORT=4200
|
||
|
|
|
||
|
|
# Colores para output
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
NC='\033[0m'
|
||
|
|
|
||
|
|
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||
|
|
|
||
|
|
# Verificar si un puerto está en uso
|
||
|
|
port_in_use() {
|
||
|
|
lsof -i :$1 >/dev/null 2>&1
|
||
|
|
}
|
||
|
|
|
||
|
|
# Esperar a que un servicio esté listo
|
||
|
|
wait_for_service() {
|
||
|
|
local url=$1
|
||
|
|
local max_attempts=${2:-30}
|
||
|
|
local attempt=1
|
||
|
|
|
||
|
|
while [ $attempt -le $max_attempts ]; do
|
||
|
|
if curl -s "$url" >/dev/null 2>&1; then
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
sleep 1
|
||
|
|
((attempt++))
|
||
|
|
done
|
||
|
|
return 1
|
||
|
|
}
|
||
|
|
|
||
|
|
# Iniciar Backend con SQLite (desarrollo rápido)
|
||
|
|
start_backend() {
|
||
|
|
if port_in_use $BACKEND_PORT; then
|
||
|
|
log_info "Backend ya corriendo en puerto $BACKEND_PORT"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_info "Iniciando Backend (.NET) con SQLite..."
|
||
|
|
cd "$PROJECT_ROOT/src/backend/Host"
|
||
|
|
|
||
|
|
# Usar SQLite para desarrollo (sin necesidad de Docker/SQL Server)
|
||
|
|
export ConnectionStrings__DefaultConnection="Data Source=$PROJECT_ROOT/data/dev.db"
|
||
|
|
export ASPNETCORE_ENVIRONMENT=Development
|
||
|
|
export USE_SQLITE=true
|
||
|
|
|
||
|
|
nohup dotnet run --no-build > /tmp/backend.log 2>&1 &
|
||
|
|
echo $! > /tmp/backend.pid
|
||
|
|
|
||
|
|
log_info "Esperando Backend (max 20s)..."
|
||
|
|
if wait_for_service "http://localhost:$BACKEND_PORT/health" 20; then
|
||
|
|
log_info "Backend listo!"
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
log_error "Backend no respondió a tiempo"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# Iniciar Frontend
|
||
|
|
start_frontend() {
|
||
|
|
if port_in_use $FRONTEND_PORT; then
|
||
|
|
log_info "Frontend ya corriendo en puerto $FRONTEND_PORT"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_info "Iniciando Frontend (Angular)..."
|
||
|
|
cd "$PROJECT_ROOT/src/frontend"
|
||
|
|
|
||
|
|
nohup npm start > /tmp/frontend.log 2>&1 &
|
||
|
|
echo $! > /tmp/frontend.pid
|
||
|
|
|
||
|
|
log_info "Esperando Frontend (max 30s)..."
|
||
|
|
if wait_for_service "http://localhost:$FRONTEND_PORT" 30; then
|
||
|
|
log_info "Frontend listo!"
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
log_error "Frontend no respondió a tiempo"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# Detener servicios
|
||
|
|
stop_services() {
|
||
|
|
log_info "Deteniendo servicios..."
|
||
|
|
[ -f /tmp/backend.pid ] && kill $(cat /tmp/backend.pid) 2>/dev/null && rm /tmp/backend.pid
|
||
|
|
[ -f /tmp/frontend.pid ] && kill $(cat /tmp/frontend.pid) 2>/dev/null && rm /tmp/frontend.pid
|
||
|
|
fuser -k $BACKEND_PORT/tcp 2>/dev/null || true
|
||
|
|
fuser -k $FRONTEND_PORT/tcp 2>/dev/null || true
|
||
|
|
log_info "Servicios detenidos"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Main
|
||
|
|
case "${1:-start}" in
|
||
|
|
start)
|
||
|
|
log_info "=== Inicio Rápido de Desarrollo ==="
|
||
|
|
|
||
|
|
# Crear directorio de datos si no existe
|
||
|
|
mkdir -p "$PROJECT_ROOT/data"
|
||
|
|
|
||
|
|
# Iniciar en paralelo
|
||
|
|
start_backend &
|
||
|
|
BACKEND_PID=$!
|
||
|
|
|
||
|
|
start_frontend &
|
||
|
|
FRONTEND_PID=$!
|
||
|
|
|
||
|
|
# Esperar ambos
|
||
|
|
wait $BACKEND_PID
|
||
|
|
BACKEND_STATUS=$?
|
||
|
|
|
||
|
|
wait $FRONTEND_PID
|
||
|
|
FRONTEND_STATUS=$?
|
||
|
|
|
||
|
|
if [ $BACKEND_STATUS -eq 0 ] && [ $FRONTEND_STATUS -eq 0 ]; then
|
||
|
|
log_info "=== Todos los servicios listos ==="
|
||
|
|
log_info "Backend: http://localhost:$BACKEND_PORT/graphql"
|
||
|
|
log_info "Frontend: http://localhost:$FRONTEND_PORT"
|
||
|
|
else
|
||
|
|
log_error "Algunos servicios fallaron"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
stop)
|
||
|
|
stop_services
|
||
|
|
;;
|
||
|
|
restart)
|
||
|
|
stop_services
|
||
|
|
sleep 2
|
||
|
|
$0 start
|
||
|
|
;;
|
||
|
|
status)
|
||
|
|
echo "Backend: $(port_in_use $BACKEND_PORT && echo 'Running' || echo 'Stopped')"
|
||
|
|
echo "Frontend: $(port_in_use $FRONTEND_PORT && echo 'Running' || echo 'Stopped')"
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
echo "Uso: $0 {start|stop|restart|status}"
|
||
|
|
exit 1
|
||
|
|
;;
|
||
|
|
esac
|