Files
csf-docker/deploy.sh
2025-09-20 19:00:44 +02:00

225 líneas
5.9 KiB
Bash
Archivo Ejecutable

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