#!/usr/bin/env bash # ============================================================ # EFINTEL ERP Interno (Django) — Script de Arranque Universal # ============================================================ # Uso en Mac / Linux: # chmod +x start.sh # ./start.sh # ============================================================ set -e # Colores RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' CYAN='\033[0;36m' YELLOW='\033[1;33m' BOLD='\033[1m' NC='\033[0m' echo "" echo -e "${CYAN}${BOLD}╔══════════════════════════════════════════════════════╗${NC}" echo -e "${CYAN}${BOLD}║ EFINTEL ERP Interno I+D+i — Instalador Universal ║${NC}" echo -e "${CYAN}${BOLD}║ Portabilidad al 100% (Mac / Linux / Docker) ║${NC}" echo -e "${CYAN}${BOLD}╚══════════════════════════════════════════════════════╝${NC}" echo "" cd "$(dirname "$0")" echo -e "¿Cómo deseas iniciar el entorno de desarrollo/producción?" echo " 1) Docker (Recomendado - Incluye Postgres, Redis y Celery)" echo " 2) Local Nativo (Python Venv + SQLite en memoria)" echo "" read -p "Elige una opción [1 o 2]: " START_MODE PORT=8000 URL="http://localhost:${PORT}" if [ "$START_MODE" == "1" ]; then echo -e "\n${BLUE}➤ Iniciando en modo Docker...${NC}" if ! command -v docker &> /dev/null; then echo -e "${RED}❌ Docker no está instalado o no está en el PATH.${NC}" echo "Por favor instala Docker Desktop (Mac) o Docker Engine (Linux)." exit 1 fi echo -e " ${GREEN}✅ Docker detectado.${NC}" if [ ! -f ".env" ]; then echo -e " ${YELLOW}⚠ Archivo .env no encontrado. Creando desde .env.example...${NC}" # Activar configs de docker en el .env generado sed 's/# DATABASE_URL=/DATABASE_URL=/g' .env.example | sed 's/# REDIS_URL=/REDIS_URL=/g' > .env echo -e " ${GREEN}✅ .env configurado para Docker.${NC}" fi echo -e " ${BLUE}Construyendo y levantando contenedores (en 2do plano)...${NC}" docker compose up --build -d echo -e " ${BLUE}Aplicando migraciones en Postgres...${NC}" sleep 3 # Esperar a que la DB levante completamente docker compose exec web python manage.py migrate --run-syncdb --verbosity 0 echo -e " ${GREEN}✅ Migraciones aplicadas en el contenedor.${NC}" # Crear roles y usuarios si no existen if ! docker compose exec web python -c "import os, django; os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings'); django.setup(); from django.contrib.auth.models import User; exit(0 if User.objects.filter(username='admin').exists() else 1)" 2>/dev/null; then echo -e " ${YELLOW}⚠ Creando usuarios y roles base...${NC}" docker compose exec web python setup_roles.py fi echo "" echo -e "${GREEN}${BOLD} ┌──────────────────────────────────────────────────────┐${NC}" echo -e "${GREEN}${BOLD} │ 🐳 EFINTEL ERP corriendo en: ${URL} │${NC}" echo -e "${GREEN}${BOLD} │ 🔑 Admin Django: ${URL}/admin/ │${NC}" echo -e "${GREEN}${BOLD} │ 📋 Usa 'docker compose stop' para detener │${NC}" echo -e "${GREEN}${BOLD} └──────────────────────────────────────────────────────┘${NC}" if [[ "$OSTYPE" == "darwin"* ]]; then sleep 2 && open "${URL}" & elif command -v xdg-open &> /dev/null; then sleep 2 && xdg-open "${URL}" & fi # Mostrar logs en vivo del contenedor web echo -e "${CYAN}Mostrando logs del servidor web (Ctrl+C para salir, el contenedor seguirá corriendo):${NC}" docker compose logs -f web else echo -e "\n${BLUE}➤ Iniciando en modo Local Nativo (Sin Docker)...${NC}" if ! command -v python3 &> /dev/null; then echo -e "${RED}❌ Python 3 no está instalado.${NC}" exit 1 fi echo -e " ${GREEN}✅ $(python3 --version) detectado.${NC}" if [ ! -d "venv" ] || [ ! -f "venv/bin/activate" ]; then echo -e " ${YELLOW}⚠ Creando entorno virtual (venv)...${NC}" rm -rf venv python3 -m venv venv fi source venv/bin/activate echo -e " ${GREEN}✅ venv activado.${NC}" echo -e " ${BLUE}Instalando dependencias (puede demorar la primera vez)...${NC}" pip install --quiet --upgrade pip pip install --quiet -r requirements.txt # Desactivar explícitamente variables de DB y Redis para forzar SQLite en local export DATABASE_URL="" export REDIS_URL="" echo -e " ${BLUE}Aplicando migraciones en SQLite...${NC}" python manage.py migrate --run-syncdb --verbosity 0 if ! python -c "import os, django; os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings'); django.setup(); from django.contrib.auth.models import User; exit(0 if User.objects.filter(username='admin').exists() else 1)" 2>/dev/null; then echo -e " ${YELLOW}⚠ Creando usuarios y roles base...${NC}" python setup_roles.py fi echo "" echo -e "${GREEN}${BOLD} ┌──────────────────────────────────────────────────────┐${NC}" echo -e "${GREEN}${BOLD} │ 🚀 EFINTEL ERP corriendo en: ${URL} │${NC}" echo -e "${GREEN}${BOLD} │ 🔑 Admin Django: ${URL}/admin/ │${NC}" echo -e "${GREEN}${BOLD} │ 📋 Presiona Ctrl+C para detener el servidor │${NC}" echo -e "${GREEN}${BOLD} └──────────────────────────────────────────────────────┘${NC}" if [[ "$OSTYPE" == "darwin"* ]]; then sleep 2 && open "${URL}" & elif command -v xdg-open &> /dev/null; then sleep 2 && xdg-open "${URL}" & fi python manage.py runserver 0.0.0.0:${PORT} fi