diff --git a/start.sh b/start.sh index d34f447..8aaf113 100755 --- a/start.sh +++ b/start.sh @@ -1,12 +1,10 @@ #!/usr/bin/env bash # ============================================================ -# EFINTEL ERP Interno (Django) — Script de Arranque Local +# EFINTEL ERP Interno (Django) — Script de Arranque Universal # ============================================================ # Uso en Mac / Linux: -# chmod +x start.sh (solo la primera vez) +# chmod +x start.sh # ./start.sh -# -# Para detener: Ctrl+C # ============================================================ set -e @@ -22,113 +20,117 @@ NC='\033[0m' echo "" echo -e "${CYAN}${BOLD}╔══════════════════════════════════════════════════════╗${NC}" -echo -e "${CYAN}${BOLD}║ EFINTEL ERP Interno I+D+i — Django Server ║${NC}" -echo -e "${CYAN}${BOLD}║ Sistema de Control de Gastos & Proyectos ║${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 "" -# Cambiar al directorio del script cd "$(dirname "$0")" -# ---- Paso 1: Verificar Python 3 ---- -echo -e "${BLUE}[1/6]${NC} Verificando Python 3..." -if ! command -v python3 &> /dev/null; then - echo -e "${RED}❌ Python 3 no está instalado.${NC}" - echo "" - echo " Para instalar en macOS:" - echo " 1. Instala Homebrew:" - echo " /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"" - echo "" - echo " 2. Instala Python:" - echo " brew install python@3.12" - echo "" - exit 1 -fi -PYTHON_VERSION=$(python3 --version 2>&1) -echo -e " ${GREEN}✅ ${PYTHON_VERSION}${NC}" +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 -# ---- Paso 2: Crear venv si no existe o si es de otro OS ---- -echo -e "${BLUE}[2/6]${NC} Verificando entorno virtual (venv)..." -NEEDS_VENV=false - -if [ ! -d "venv" ]; then - NEEDS_VENV=true - echo -e " ${YELLOW}⚠ No existe venv, creando uno nuevo...${NC}" -elif [ ! -f "venv/bin/activate" ]; then - # venv corrupto o de Windows - NEEDS_VENV=true - echo -e " ${YELLOW}⚠ venv inválido detectado, recreando...${NC}" - rm -rf venv -fi - -if [ "$NEEDS_VENV" = true ]; then - python3 -m venv venv - echo -e " ${GREEN}✅ venv creado exitosamente${NC}" -else - echo -e " ${GREEN}✅ venv ya existe${NC}" -fi - -# ---- Paso 3: Activar venv ---- -echo -e "${BLUE}[3/6]${NC} Activando entorno virtual..." -source venv/bin/activate -echo -e " ${GREEN}✅ venv activado ($(which python))${NC}" - -# ---- Paso 4: Instalar dependencias ---- -echo -e "${BLUE}[4/6]${NC} Instalando dependencias de Django..." -pip install --quiet --upgrade pip -pip install --quiet -r requirements.txt -echo -e " ${GREEN}✅ 29 paquetes instalados (Django 6.1, Channels, Daphne, etc.)${NC}" - -# ---- Paso 5: Migraciones y datos iniciales ---- -echo -e "${BLUE}[5/6]${NC} Configurando base de datos..." - -# Ejecutar migraciones -python manage.py migrate --run-syncdb --verbosity 0 -echo -e " ${GREEN}✅ Migraciones aplicadas${NC}" - -# Crear roles y usuarios si no existen -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}⚠ Primera ejecución — creando usuarios y roles EFINTEL...${NC}" - python setup_roles.py - echo -e " ${GREEN}✅ Usuarios creados:${NC}" - echo -e " ${BOLD}admin${NC} / admin (Administrador)" - echo -e " ${BOLD}ginevra_ortega${NC} / ginevra123 (Administrador)" - echo -e " ${BOLD}finanzas${NC} / finanzas123 (Adm. Finanzas)" - echo -e " ${BOLD}miguel_contreras${NC} / miguel123 (Director Proyecto)" -else - echo -e " ${GREEN}✅ Usuarios ya configurados${NC}" -fi - -# ---- Paso 6: Iniciar servidor ---- PORT=8000 URL="http://localhost:${PORT}" -echo "" -echo -e "${BLUE}[6/6]${NC} Iniciando servidor Django (Daphne)..." -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 │${NC}" -echo -e "${GREEN}${BOLD} └──────────────────────────────────────────────────────┘${NC}" -echo "" -echo -e "${CYAN} Cuentas de acceso:${NC}" -echo -e " admin / admin | finanzas / finanzas123" -echo -e " ginevra_ortega / ginevra123 | miguel_contreras / miguel123" -echo "" +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 -# Abrir navegador automáticamente -if [[ "$OSTYPE" == "darwin"* ]]; then - sleep 2 && open "${URL}" & -elif command -v xdg-open &> /dev/null; then - sleep 2 && xdg-open "${URL}" & + 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 - -# Ejecutar servidor Django (Daphne integrado con soporte para Static Files) -python manage.py runserver 0.0.0.0:${PORT}