#!/bin/bash # 🛡️ AntiScam AI Pro - Script de Despliegue # Automatiza el despliegue de la aplicación en diferentes entornos set -e # Salir si cualquier comando falla # Colores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Funciones de utilidad log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # Función principal de despliegue deploy() { local environment=$1 echo "🛡️ ANTISCAM AI PRO - DESPLIEGUE" echo "======================================" echo "Entorno: $environment" echo "Fecha: $(date)" echo "======================================" case $environment in "development"|"dev") deploy_development ;; "staging") deploy_staging ;; "production"|"prod") deploy_production ;; "docker") deploy_docker ;; "huggingface"|"hf") deploy_huggingface ;; *) log_error "Entorno no válido: $environment" echo "Entornos disponibles: development, staging, production, docker, huggingface" exit 1 ;; esac } # Despliegue en desarrollo deploy_development() { log_info "Configurando entorno de desarrollo..." # Verificar Python if ! command -v python3 &> /dev/null; then log_error "Python 3 no está instalado" exit 1 fi # Crear entorno virtual si no existe if [ ! -d "venv" ]; then log_info "Creando entorno virtual..." python3 -m venv venv fi # Activar entorno virtual source venv/bin/activate # Instalar dependencias log_info "Instalando dependencias..." pip install --upgrade pip pip install -r requirements.txt # Verificar archivo .env if [ ! -f ".env" ]; then log_warning "Archivo .env no encontrado" if [ -f ".env.example" ]; then log_info "Copiando .env.example como .env" cp .env.example .env log_warning "¡IMPORTANTE! Edita .env con tus credenciales reales" fi fi # Inicializar base de datos log_info "Inicializando base de datos..." python -c "from app import init_database; init_database()" log_success "Entorno de desarrollo configurado" log_info "Ejecuta: python app.py o python start.py" } # Despliegue en staging deploy_staging() { log_info "Desplegando en staging..." # Verificar variables de entorno check_env_vars # Build y test run_tests # Desplegar con Docker log_info "Construyendo imagen Docker..." docker build -t antiscam-ai:staging . log_info "Desplegando contenedor..." docker run -d \ --name antiscam-staging \ --env-file .env \ -p 7861:7860 \ antiscam-ai:staging log_success "Staging desplegado en puerto 7861" } # Despliegue en producción deploy_production() { log_info "Desplegando en producción..." # Verificaciones críticas check_env_vars check_ssl_certs run_tests # Backup de base de datos backup_database # Desplegar con Docker Compose log_info "Desplegando con Docker Compose..." docker-compose -f docker-compose.yml up -d # Verificar salud de servicios sleep 30 check_services_health log_success "Producción desplegada exitosamente" log_info "Aplicación disponible en https://tu-dominio.com" } # Despliegue con Docker deploy_docker() { log_info "Desplegando con Docker..." # Construir imagen log_info "Construyendo imagen Docker..." docker build -t antiscam-ai:latest . # Ejecutar contenedor log_info "Ejecutando contenedor..." docker run -d \ --name antiscam-ai-pro \ --env-file .env \ -p 7860:7860 \ -v $(pwd)/uploads:/app/uploads \ --restart unless-stopped \ antiscam-ai:latest log_success "Docker desplegado en puerto 7860" } # Despliegue en Hugging Face Spaces deploy_huggingface() { log_info "Preparando para Hugging Face Spaces..." # Verificar que no hay archivos sensibles if [ -f ".env" ]; then log_warning "Archivo .env encontrado - NO subir a HF Spaces" fi # Crear directorio temporal para HF mkdir -p hf_deploy # Copiar archivos necesarios cp app.py hf_deploy/ cp requirements.txt hf_deploy/ cp README.md hf_deploy/ # Crear archivo README específico para HF cat > hf_deploy/README.md << EOF --- title: AntiScam AI Pro emoji: 🛡️ colorFrom: blue colorTo: purple sdk: gradio sdk_version: 4.44.0 app_file: app.py pinned: false license: mit --- # 🛡️ AntiScam AI Pro Protección inteligente contra estafas digitales con IA avanzada. ## Configuración Configura las siguientes variables de entorno en Settings → Variables: - \`STRIPE_SECRET_KEY\`: Tu clave secreta de Stripe - \`STRIPE_PUBLISHABLE_KEY\`: Tu clave pública de Stripe - \`EMAIL_USER\`: Tu email para verificaciones - \`EMAIL_PASSWORD\`: App password de Gmail EOF log_success "Archivos preparados en directorio hf_deploy/" log_info "Sube el contenido de hf_deploy/ a tu Hugging Face Space" log_warning "¡No olvides configurar las variables de entorno!" } # Verificar variables de entorno críticas check_env_vars() { log_info "Verificando variables de entorno..." required_vars=( "STRIPE_SECRET_KEY" "STRIPE_PUBLISHABLE_KEY" "EMAIL_USER" "EMAIL_PASSWORD" ) missing_vars=() for var in "${required_vars[@]}"; do if [ -z "${!var}" ]; then missing_vars+=("$var") fi done if [ ${#missing_vars[@]} -ne 0 ]; then log_error "Variables de entorno faltantes:" printf '%s\n' "${missing_vars[@]}" exit 1 fi log_success "Variables de entorno verificadas" } # Verificar certificados SSL check_ssl_certs() { log_info "Verificando certificados SSL..." if [ ! -f "nginx/ssl/cert.pem" ] || [ ! -f "nginx/ssl/key.pem" ]; then log_warning "Certificados SSL no encontrados" log_info "Generando certificados autofirmados para testing..." mkdir -p nginx/ssl openssl req -x509 -newkey rsa:4096 -keyout nginx/ssl/key.pem -out nginx/ssl/cert.pem -days 365 -nodes \ -subj "/C=ES/ST=State/L=City/O=AntiScam/OU=IT/CN=localhost" log_warning "¡Usa certificados válidos en producción!" fi log_success "Certificados SSL verificados" } # Ejecutar tests run_tests() { log_info "Ejecutando tests..." # Tests básicos python -c " import sys try: from app import init_database, advanced_scam_analysis print('✅ Importaciones exitosas') # Test análisis básico result = advanced_scam_analysis('Test message', 'text') if 'risk_level' in result: print('✅ Análisis básico funcional') else: print('❌ Error en análisis') sys.exit(1) except Exception as e: print(f'❌ Error en tests: {e}') sys.exit(1) " log_success "Tests completados" } # Backup de base de datos backup_database() { log_info "Creando backup de base de datos..." timestamp=$(date +%Y%m%d_%H%M%S) backup_dir="backups" mkdir -p $backup_dir if [ -f "antiscam_pro.db" ]; then cp antiscam_pro.db "$backup_dir/antiscam_pro_$timestamp.db" log_success "Backup creado: $backup_dir/antiscam_pro_$timestamp.db" else log_warning "Base de datos no encontrada para backup" fi } # Verificar salud de servicios check_services_health() { log_info "Verificando salud de servicios..." services=("antiscam-ai-pro" "antiscam-postgres" "antiscam-redis") for service in "${services[@]}"; do if docker ps --filter "name=$service" --filter "status=running" | grep -q $service; then log_success "✅ $service está corriendo" else log_error "❌ $service no está corriendo" fi done } # Función de ayuda show_help() { echo "🛡️ AntiScam AI Pro - Script de Despliegue" echo "" echo "Uso: ./deploy.sh [ENTORNO]" echo "" echo "Entornos disponibles:" echo " development, dev - Entorno de desarrollo local" echo " staging - Entorno de staging/testing" echo " production, prod - Entorno de producción" echo " docker - Despliegue con Docker simple" echo " huggingface, hf - Preparar para Hugging Face Spaces" echo "" echo "Ejemplos:" echo " ./deploy.sh development" echo " ./deploy.sh production" echo " ./deploy.sh huggingface" echo "" } # Script principal main() { if [ $# -eq 0 ]; then show_help exit 1 fi case $1 in "-h"|"--help"|"help") show_help exit 0 ;; *) deploy $1 ;; esac } # Ejecutar script principal main "$@"