#!/bin/bash # Script de despliegue para CSF Web Admin Panel set -e # Colores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Función para logs log() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}" } warn() { echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}" } error() { echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}" } info() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')] INFO: $1${NC}" } # Banner echo "==================================================" echo " CSF Web Admin Panel - Deployment Script" echo " ConfigServer Security & Firewall Management" echo "==================================================" echo # Verificar requisitos previos log "Verificando requisitos previos..." # Verificar Docker if ! command -v docker &> /dev/null; then error "Docker no está instalado. Por favor instale Docker primero." exit 1 fi # Verificar Docker Compose if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then error "Docker Compose no está instalado. Por favor instale Docker Compose primero." exit 1 fi # Verificar que estamos en el directorio correcto if [ ! -f "docker-compose.yml" ]; then error "docker-compose.yml no encontrado. Ejecute este script desde el directorio raíz del proyecto." exit 1 fi # Verificar archivos CSF if [ ! -d "scripts/csf" ]; then error "Directorio scripts/csf no encontrado. Asegúrese de que los archivos CSF estén presentes." exit 1 fi log "Requisitos previos verificados ✓" # Configurar variables de entorno if [ ! -f ".env" ]; then warn "Archivo .env no encontrado. Creando desde .env.example..." if [ -f ".env.example" ]; then cp .env.example .env warn "Por favor edite el archivo .env con sus configuraciones antes de continuar." read -p "¿Desea continuar con la configuración por defecto? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then info "Edite el archivo .env y ejecute el script nuevamente." exit 0 fi else error "Archivo .env.example no encontrado." exit 1 fi fi # Cargar variables de entorno source .env log "Variables de entorno cargadas ✓" # Función para construir e iniciar servicios deploy() { log "Iniciando despliegue de CSF Web Admin Panel..." # Detener servicios existentes info "Deteniendo servicios existentes..." docker-compose down --remove-orphans || true # Construir imágenes log "Construyendo imágenes Docker..." docker-compose build --no-cache # Iniciar servicios log "Iniciando servicios..." docker-compose up -d # Esperar a que los servicios estén listos log "Esperando a que los servicios estén listos..." sleep 30 # Verificar estado de los servicios info "Verificando estado de los servicios..." docker-compose ps # Verificar salud de los servicios log "Verificando salud de los servicios..." # Verificar CSF if docker-compose exec -T csf /usr/local/csf/bin/csf --status > /dev/null 2>&1; then log "CSF Firewall: SALUDABLE ✓" else warn "CSF Firewall: Posibles problemas" fi # Verificar Web Interface if curl -f http://localhost:${WEB_PORT:-3000}/api/health > /dev/null 2>&1; then log "Web Interface: SALUDABLE ✓" else warn "Web Interface: Posibles problemas" fi log "Despliegue completado!" echo info "Acceda al panel de administración en: http://localhost:${WEB_PORT:-3000}" info "Usuario por defecto: ${ADMIN_USERNAME:-admin}" info "Contraseña por defecto: ${ADMIN_PASSWORD:-admin123}" echo warn "IMPORTANTE: Cambie las credenciales por defecto antes de usar en producción." } # Función para mostrar logs show_logs() { echo "Mostrando logs de los servicios..." docker-compose logs -f } # Función para detener servicios stop() { log "Deteniendo servicios..." docker-compose down log "Servicios detenidos ✓" } # Función para limpiar todo clean() { warn "Esta operación eliminará todos los contenedores, imágenes y volúmenes relacionados." read -p "¿Está seguro? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then log "Limpiando sistema..." docker-compose down -v --remove-orphans docker system prune -f docker volume prune -f log "Limpieza completada ✓" else info "Operación cancelada." fi } # Función para backup backup() { log "Creando backup de configuraciones..." BACKUP_DIR="${BACKUP_DIR:-./backups}/$(date +%Y%m%d_%H%M%S)" mkdir -p "$BACKUP_DIR" # Backup de volúmenes Docker docker run --rm -v csf_config:/source -v "$PWD/$BACKUP_DIR":/backup alpine tar czf /backup/csf_config.tar.gz -C /source . docker run --rm -v csf_logs:/source -v "$PWD/$BACKUP_DIR":/backup alpine tar czf /backup/csf_logs.tar.gz -C /source . # Backup de archivo .env cp .env "$BACKUP_DIR/" log "Backup creado en: $BACKUP_DIR ✓" } # Función de ayuda show_help() { echo "Uso: $0 [COMANDO]" echo echo "Comandos disponibles:" echo " deploy - Desplegar CSF Web Admin Panel" echo " logs - Mostrar logs de los servicios" echo " stop - Detener servicios" echo " clean - Limpiar contenedores y volúmenes" echo " backup - Crear backup de configuraciones" echo " help - Mostrar esta ayuda" echo echo "Si no se especifica comando, se ejecutará 'deploy'" } # Procesar argumentos case "${1:-deploy}" in deploy) deploy ;; logs) show_logs ;; stop) stop ;; clean) clean ;; backup) backup ;; help|--help|-h) show_help ;; *) error "Comando desconocido: $1" show_help exit 1 ;; esac