feat: script de arranque automatizado universal con Docker
This commit is contained in:
@@ -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}"
|
||||
|
||||
# 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}" &
|
||||
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
|
||||
|
||||
# Ejecutar servidor Django (Daphne integrado con soporte para Static Files)
|
||||
python manage.py runserver 0.0.0.0:${PORT}
|
||||
|
||||
Reference in New Issue
Block a user