Files

137 lines
6.2 KiB
Bash
Executable File

#!/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