#!/bin/bash # Script de inicio robusto para Anexo76 # Este script inicializa el proyecto completo con validaciones set -e echo "=========================================" echo " Anexo76 - Inicio Rápido" echo "=========================================" echo "" # Colores GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # Función para verificar si un servicio está saludable wait_for_healthy() { local service=$1 local max_attempts=60 local attempt=1 echo -e "${BLUE}Esperando a que ${service} esté saludable...${NC}" while [ $attempt -le $max_attempts ]; do if docker compose ps | grep "$service" | grep -q "healthy"; then echo -e "${GREEN}✓ ${service} está saludable${NC}" return 0 fi echo " Intento $attempt/$max_attempts..." sleep 3 attempt=$((attempt + 1)) done echo -e "${RED}✗ ${service} no estuvo disponible después de $max_attempts intentos${NC}" echo "Logs del servicio:" docker compose logs --tail=50 "$service" return 1 } # 1. Verificar Docker echo -e "${BLUE}[1/7] Verificando Docker...${NC}" if ! command -v docker &> /dev/null; then echo -e "${RED}✗ Docker no está instalado. Por favor instala Docker primero.${NC}" exit 1 fi if ! command -v docker compose &> /dev/null; then echo -e "${RED}✗ Docker Compose no está instalado. Por favor instala Docker Compose primero.${NC}" exit 1 fi if ! docker info &> /dev/null; then echo -e "${RED}✗ Docker daemon no está corriendo. Por favor inicia Docker.${NC}" exit 1 fi echo -e "${GREEN}✓ Docker está instalado y corriendo${NC}" echo "" # 2. Configurar variables de entorno echo -e "${BLUE}[2/7] Configurando variables de entorno...${NC}" if [ ! -f .env ]; then if [ -f .env.example ]; then cp .env.example .env echo -e "${GREEN}✓ Archivo .env creado desde .env.example${NC}" else echo -e "${YELLOW}⚠ .env.example no existe, creando .env básico${NC}" cat > .env </dev/null || echo "dev-sync-token-$(date +%s)") read -p "Ingrese el Token de Sincronización Secreto [Presione Enter para generar uno aleatorio: $GENERATED_TOKEN]: " SYNC_TOKEN SYNC_TOKEN=${SYNC_TOKEN:-$GENERATED_TOKEN} if [ "$SERVER_ROLE" == "1" ]; then echo -e "${GREEN}Configurando como HUB...${NC}" CENTRAL_URL="" SPOKE_URLS="" HUB_MODE="true" else echo -e "${GREEN}Configurando como CLIENTE...${NC}" HUB_MODE="false" read -p "Ingrese la URL del Hub [http://100.78.6.108:8000/api/v1/core/help-center/sync/]: " CENTRAL_URL CENTRAL_URL=${CENTRAL_URL:-http://100.78.6.108:8001/api/v1/core/help-center/sync/} SPOKE_URLS="" fi # Aplicar configuraciones sed -i "s|^CENTRAL_SERVER_URL=.*|CENTRAL_SERVER_URL=$CENTRAL_URL|" .env 2>/dev/null || echo "CENTRAL_SERVER_URL=$CENTRAL_URL" >> .env sed -i "s|^SPOKE_URLS=.*|SPOKE_URLS=$SPOKE_URLS|" .env 2>/dev/null || echo "SPOKE_URLS=$SPOKE_URLS" >> .env if ! grep -q "SYNC_SECRET_TOKEN=" .env; then echo "SYNC_SECRET_TOKEN=$SYNC_TOKEN" >> .env fi if grep -q "VITE_HUB_MODE=" .env; then sed -i "s|^VITE_HUB_MODE=.*|VITE_HUB_MODE=$HUB_MODE|" .env else echo "VITE_HUB_MODE=$HUB_MODE" >> .env fi echo -e "${GREEN}✓ Configuración de rol aplicada al .env${NC}" fi else echo -e "${YELLOW}⚠ .env ya contiene configuración de rol. Para cambiarlo, ejecuta con RECONFIGURE=true${NC}" fi echo "" # 3. Limpiar contenedores previos si existen echo -e "${BLUE}[3/7] Limpiando contenedores previos...${NC}" docker compose down 2>/dev/null || true echo -e "${GREEN}✓ Contenedores previos limpiados${NC}" echo "" # 4. Iniciar PostgreSQL databases echo -e "${BLUE}[4/7] Iniciando bases de datos PostgreSQL...${NC}" echo "Esto puede tardar 30-60 segundos..." docker compose up -d postgres-a76 postgres-keycloak if wait_for_healthy "postgres-a76" && wait_for_healthy "postgres-keycloak"; then echo -e "${GREEN}✓ Bases de datos PostgreSQL iniciadas y saludables${NC}" else echo -e "${RED}✗ Error iniciando bases de datos${NC}" exit 1 fi echo "" # 5. Iniciar Keycloak echo -e "${BLUE}[5/7] Iniciando Keycloak...${NC}" echo "Esto puede tardar 60-90 segundos..." docker compose up -d keycloak if wait_for_healthy "keycloak"; then echo -e "${GREEN}✓ Keycloak iniciado y saludable${NC}" else echo -e "${RED}✗ Error iniciando Keycloak${NC}" exit 1 fi echo "" # 6. Iniciar Backend echo -e "${BLUE}[6/7] Iniciando Backend FastAPI...${NC}" echo "Esto puede tardar 30-60 segundos..." docker compose up -d backend if wait_for_healthy "backend"; then echo -e "${GREEN}✓ Backend iniciado y saludable${NC}" else echo -e "${RED}✗ Error iniciando Backend${NC}" echo "Verificando logs..." docker compose logs --tail=50 backend exit 1 fi echo "" # 7. Iniciar Frontend echo -e "${BLUE}[7/7] Iniciando Frontend SvelteKit...${NC}" echo "Esto puede tardar 30-45 segundos..." docker compose up -d frontend if wait_for_healthy "frontend"; then echo -e "${GREEN}✓ Frontend iniciado y saludable${NC}" else echo -e "${YELLOW}⚠ Frontend puede estar iniciando, verifica los logs si es necesario${NC}" fi echo "" # Resumen echo "=========================================" echo -e "${GREEN} ✓ Instalación Completada${NC}" echo "=========================================" echo "" echo "Servicios disponibles:" echo -e " ${GREEN}•${NC} Frontend: ${BLUE}http://localhost:5173${NC}" echo -e " ${GREEN}•${NC} Backend: ${BLUE}http://localhost:8000/api${NC}" echo -e " ${GREEN}•${NC} API Docs: ${BLUE}http://localhost:8000/api/docs${NC}" echo -e " ${GREEN}•${NC} Keycloak: ${BLUE}http://localhost:8080${NC}" echo "" echo "Credenciales de Keycloak Admin:" echo " • Usuario: admin" echo " • Password: admin" echo "" echo -e "${YELLOW}⚠ IMPORTANTE:${NC}" echo " Debes configurar Keycloak antes de poder usar la aplicación." echo " Sigue la guía en: docs/KEYCLOAK_SETUP.md" echo "" echo "Usuario de prueba (después de configurar Keycloak):" echo " • Usuario: demo" echo " • Password: demo123" echo "" echo "Comandos útiles:" echo " • Ver logs: docker compose logs -f" echo " • Ver logs servicio: docker compose logs -f [servicio]" echo " • Estado servicios: docker compose ps" echo " • Detener todo: docker compose down" echo " • Detener y limpiar: docker compose down -v" echo "" echo -e "${GREEN}¡Disfruta desarrollando con Anexo76!${NC}" echo ""