feat: Add database reset and SSL preserve options to deploy script

- Add option to keep or reset database (preserves data by default)
- Add option to preserve existing SSL certificates
- Show warnings before database reset with confirmation
- Skip certificate regeneration when preserve SSL is selected
- Update deployment summary with new options

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
2026-03-27 11:12:12 -03:00
parent 1d419ee9f3
commit 76c9a4a2d4
+179 -48
View File
@@ -203,6 +203,34 @@ ADMIN_PASS=${ADMIN_PASS:-Admin123!}
read -p "Nombre de la organización [Norteamericano]: " ORG_NAME read -p "Nombre de la organización [Norteamericano]: " ORG_NAME
ORG_NAME=${ORG_NAME:-Norteamericano} ORG_NAME=${ORG_NAME:-Norteamericano}
echo ""
echo "========================================"
echo " Configuración de Base de Datos"
echo "========================================"
echo ""
echo "¿Qué deseas hacer con la base de datos?"
echo " 1) Mantener datos existentes (recomendado para actualizaciones)"
echo " 2) Reiniciar base de datos (BORRAR todos los datos)"
echo ""
read -p "Opción [1/2]: " DB_OPTION
DB_OPTION=${DB_OPTION:-1}
if [[ "$DB_OPTION" =~ ^[2]$ ]]; then
RESET_DATABASE="true"
echo ""
echo "⚠️ ADVERTENCIA: Se borrarán TODOS los datos de la base de datos"
read -p "¿Estás seguro de continuar? [y/N]: " CONFIRM_RESET
if [[ ! "$CONFIRM_RESET" =~ ^[Yy]$ ]]; then
echo "❌ Operación cancelada - manteniendo base de datos"
RESET_DATABASE="false"
else
echo "✅ Base de datos será reiniciada"
fi
else
RESET_DATABASE="false"
echo "✅ Se mantendrán los datos existentes"
fi
echo "" echo ""
echo "----------------------------------------" echo "----------------------------------------"
echo "Configuración SSL" echo "Configuración SSL"
@@ -218,33 +246,48 @@ USE_SSL=${USE_SSL:-N}
if [[ "$USE_SSL" =~ ^[Yy]$ ]]; then if [[ "$USE_SSL" =~ ^[Yy]$ ]]; then
echo "" echo ""
echo "----------------------------------------" echo "----------------------------------------"
echo "Configuración de Let's Encrypt" echo "Configuración de Certificados SSL"
echo "----------------------------------------" echo "----------------------------------------"
echo "" echo ""
echo "¿Usar servidor de STAGING (certificados de prueba)?" echo "¿Ya tienes certificados SSL funcionando?"
echo " - SI: Sin rate limits, pero el navegador muestra advertencias" echo " - SI: Preservar certificados existentes (recomendado)"
echo " - NO: Certificados reales, pero con rate limits (5 por semana)" echo " - NO: Generar nuevos certificados"
echo "" echo ""
read -p "¿Usar STAGING? [y/N]: " USE_STAGING read -p "¿Preservar certificados? [y/N]: " PRESERVE_CERTS
USE_STAGING=${USE_STAGING:-Y} PRESERVE_CERTS=${PRESERVE_CERTS:-Y}
if [[ "$USE_STAGING" =~ ^[Yy]$ ]]; then if [[ "$PRESERVE_CERTS" =~ ^[Yy]$ ]]; then
LETSENCRYPT_STAGING="true" PRESERVE_SSL_CERTS="true"
PROTOCOL="http" echo "✅ Se preservarán los certificados SSL existentes"
echo ""
echo "✅ Configuración: STAGING (HTTP por ahora)"
echo " Los certificados de staging no son válidos para producción"
echo " Las llamadas API usarán HTTP para evitar errores de SSL"
else else
LETSENCRYPT_STAGING="false" PRESERVE_SSL_CERTS="false"
PROTOCOL="https"
echo "" echo ""
echo "✅ Configuración: PRODUCTION (HTTPS)" echo "¿Usar servidor de STAGING (certificados de prueba)?"
echo " Se usarán certificados reales de Let's Encrypt" echo " - SI: Sin rate limits, pero el navegador muestra advertencias"
echo " - NO: Certificados reales, pero con rate limits (5 por semana)"
echo ""
read -p "¿Usar STAGING? [y/N]: " USE_STAGING
USE_STAGING=${USE_STAGING:-Y}
if [[ "$USE_STAGING" =~ ^[Yy]$ ]]; then
LETSENCRYPT_STAGING="true"
PROTOCOL="http"
echo ""
echo "✅ Configuración: STAGING (HTTP por ahora)"
echo " Los certificados de staging no son válidos para producción"
echo " Las llamadas API usarán HTTP para evitar errores de SSL"
else
LETSENCRYPT_STAGING="false"
PROTOCOL="https"
echo ""
echo "✅ Configuración: PRODUCTION (HTTPS)"
echo " Se usarán certificados reales de Let's Encrypt"
fi
fi fi
else else
LETSENCRYPT_STAGING="false" LETSENCRYPT_STAGING="false"
PROTOCOL="http" PROTOCOL="http"
PRESERVE_SSL_CERTS="false"
echo "" echo ""
echo "✅ Configuración: HTTP (sin SSL)" echo "✅ Configuración: HTTP (sin SSL)"
fi fi
@@ -259,18 +302,32 @@ echo " Email: $ADMIN_EMAIL"
echo " Organización: $ORG_NAME" echo " Organización: $ORG_NAME"
echo " Protocolo: $PROTOCOL" echo " Protocolo: $PROTOCOL"
echo " SSL Staging: $LETSENCRYPT_STAGING" echo " SSL Staging: $LETSENCRYPT_STAGING"
echo " Preservar SSL: $PRESERVE_SSL_CERTS"
echo " Reiniciar DB: $RESET_DATABASE"
echo "" echo ""
# Crear script remoto en un archivo temporal # Crear script remoto en un archivo temporal
cat > /tmp/remote-deploy.sh << 'REMOTE_SCRIPT_CONTENT' cat > /tmp/remote-deploy.sh << REMOTE_SCRIPT_CONTENT
set -e set -e
# Variables pasadas desde el script local
LETSENCRYPT_STAGING=$LETSENCRYPT_STAGING
RESET_DATABASE=$RESET_DATABASE
PRESERVE_SSL_CERTS=$PRESERVE_SSL_CERTS
PROTOCOL=$PROTOCOL
cd /var/www/openccb cd /var/www/openccb
echo "========================================" echo "========================================"
echo " OpenCCB Remote Deployment" echo " OpenCCB Remote Deployment"
echo "========================================" echo "========================================"
echo "" echo ""
echo "Configuración:"
echo " LETSENCRYPT_STAGING: \$LETSENCRYPT_STAGING"
echo " RESET_DATABASE: \$RESET_DATABASE"
echo " PRESERVE_SSL_CERTS: \$PRESERVE_SSL_CERTS"
echo " PROTOCOL: \$PROTOCOL"
echo ""
# ======================================== # ========================================
# GENERAR .ENV CORRECTO PARA PRODUCCION # GENERAR .ENV CORRECTO PARA PRODUCCION
@@ -322,12 +379,24 @@ echo "DATABASE_URL=postgresql://user:${DB_PASS}@db:5432/openccb_cms" >> .env
# Configurar Let's Encrypt - staging o production # Configurar Let's Encrypt - staging o production
echo " Configurando Let's Encrypt..." echo " Configurando Let's Encrypt..."
if [ "$LETSENCRYPT_STAGING" = "true" ]; then if [ "$PRESERVE_SSL_CERTS" = "true" ]; then
echo "LETSENCRYPT_STAGING=true" >> .env echo " Preservando configuración SSL existente"
echo " Usando STAGING - certificados de prueba" # No modificar LETSENCRYPT_STAGING - mantener el valor existente
if ! grep -q "^LETSENCRYPT_STAGING=" .env; then
echo "LETSENCRYPT_STAGING=false" >> .env
fi
else else
echo "LETSENCRYPT_STAGING=false" >> .env if [ "$LETSENCRYPT_STAGING" = "true" ]; then
echo " Usando PRODUCTION - certificados reales" # Remover valor existente si existe
sed -i "/^LETSENCRYPT_STAGING=/d" .env 2>/dev/null || true
echo "LETSENCRYPT_STAGING=true" >> .env
echo " Usando STAGING - certificados de prueba"
else
# Remover valor existente si existe
sed -i "/^LETSENCRYPT_STAGING=/d" .env 2>/dev/null || true
echo "LETSENCRYPT_STAGING=false" >> .env
echo " Usando PRODUCTION - certificados reales"
fi
fi fi
echo "" echo ""
REMOTE_SCRIPT_CONTENT REMOTE_SCRIPT_CONTENT
@@ -437,6 +506,82 @@ echo "Eliminando contenedores antiguos..."
$DOCKER_CMD rm openccb-studio 2>/dev/null || true $DOCKER_CMD rm openccb-studio 2>/dev/null || true
$DOCKER_CMD rm openccb-experience 2>/dev/null || true $DOCKER_CMD rm openccb-experience 2>/dev/null || true
# ========================================
# GESTIÓN DE BASE DE DATOS
# ========================================
if [ "$RESET_DATABASE" = "true" ]; then
echo ""
echo "⚠️ REINICIANDO BASE DE DATOS ⚠️"
echo ""
# Detener contenedores de nginx y ssl también para limpiar volúmenes
echo "Deteniendo todos los contenedores..."
run_docker_compose down
# Eliminar volúmenes de base de datos
echo "Eliminando volúmenes de base de datos..."
$DOCKER_CMD volume rm openccb_postgres_data 2>/dev/null || true
# Reiniciar contenedores
echo "Reiniciando contenedores..."
run_docker_compose up -d db
echo "Esperando a que la base de datos este lista..."
sleep 10
# Crear bases de datos desde cero
echo "Creando bases de datos..."
$DOCKER_CMD exec openccb-db psql -U user -d postgres -c "DROP DATABASE IF EXISTS openccb_cms;" 2>/dev/null || true
$DOCKER_CMD exec openccb-db psql -U user -d postgres -c "DROP DATABASE IF EXISTS openccb_lms;" 2>/dev/null || true
$DOCKER_CMD exec openccb-db psql -U user -d postgres -c "CREATE DATABASE openccb_cms;" 2>/dev/null || echo " Error al crear openccb_cms"
$DOCKER_CMD exec openccb-db psql -U user -d postgres -c "CREATE DATABASE openccb_lms;" 2>/dev/null || echo " Error al crear openccb_lms"
echo "✅ Base de datos reiniciada correctamente"
else
echo ""
echo "✅ Manteniendo base de datos existente"
echo ""
# Iniciar base de datos
echo "Iniciando base de datos..."
run_docker_compose up -d db
echo "Esperando a que la base de datos este lista..."
sleep 10
# Verificar si las bases de datos existen, si no, crearlas
echo "Verificando bases de datos..."
$DOCKER_CMD exec openccb-db psql -U user -d postgres -c "CREATE DATABASE openccb_cms;" 2>/dev/null || echo " openccb_cms ya existe"
$DOCKER_CMD exec openccb-db psql -U user -d postgres -c "CREATE DATABASE openccb_lms;" 2>/dev/null || echo " openccb_lms ya existe"
fi
# ========================================
# GESTIÓN DE CERTIFICADOS SSL
# ========================================
if [ "$PRESERVE_SSL_CERTS" = "true" ]; then
echo ""
echo "✅ Preservando certificados SSL existentes"
echo " Iniciando nginx-proxy y acme-companion sin regenerar certificados..."
# Iniciar nginx-proxy y acme-companion (los certificados ya existen)
run_docker_compose up -d nginx-proxy acme-companion
echo "Esperando a que nginx-proxy este listo..."
sleep 10
else
echo ""
echo "Iniciando nginx-proxy y acme-companion para SSL..."
# Iniciar nginx-proxy y acme-companion
run_docker_compose up -d nginx-proxy acme-companion
echo "Esperando a que nginx-proxy este listo..."
sleep 10
if [ "$LETSENCRYPT_STAGING" = "false" ]; then
echo " Generando certificados SSL de producción..."
else
echo " Generando certificados SSL de staging..."
fi
fi
# Limpiar caché de builder # Limpiar caché de builder
echo "Limpiando caché de Docker builder..." echo "Limpiando caché de Docker builder..."
$DOCKER_CMD builder prune -f 2>/dev/null || true $DOCKER_CMD builder prune -f 2>/dev/null || true
@@ -445,23 +590,6 @@ $DOCKER_CMD builder prune -f 2>/dev/null || true
echo "Reconstruyendo contenedores con las URLs configuradas..." echo "Reconstruyendo contenedores con las URLs configuradas..."
run_docker_compose build --no-cache studio experience run_docker_compose build --no-cache studio experience
# Iniciar nginx-proxy y acme-companion primero
echo "Iniciando nginx-proxy y acme-companion - SSL..."
run_docker_compose up -d nginx-proxy acme-companion
echo "Esperando a que nginx-proxy este listo..."
sleep 10
# Iniciar base de datos
echo "Iniciando base de datos..."
run_docker_compose up -d db
echo "Esperando a que la base de datos este lista..."
sleep 10
# Crear bases de datos
echo "Creando bases de datos..."
$DOCKER_CMD exec openccb-db psql -U user -d postgres -c "CREATE DATABASE openccb_cms;" 2>/dev/null || echo " openccb_cms ya existe"
$DOCKER_CMD exec openccb-db psql -U user -d postgres -c "CREATE DATABASE openccb_lms;" 2>/dev/null || echo " openccb_lms ya existe"
# Iniciar servicios # Iniciar servicios
echo "Iniciando servicios OpenCCB..." echo "Iniciando servicios OpenCCB..."
run_docker_compose up -d studio experience run_docker_compose up -d studio experience
@@ -583,13 +711,22 @@ echo " Contraseña: $ADMIN_PASS"
echo "" echo ""
echo "Organizacion: $ORG_NAME" echo "Organizacion: $ORG_NAME"
echo "" echo ""
if [ "$LETSENCRYPT_STAGING" = "true" ]; then
if [ "$PRESERVE_SSL_CERTS" = "true" ]; then
echo "✅ Certificados SSL existentes preservados"
echo " Los certificados ya están activos y funcionando"
elif [ "$LETSENCRYPT_STAGING" = "true" ]; then
echo "⚠️ Usando Let's Encrypt STAGING" echo "⚠️ Usando Let's Encrypt STAGING"
echo " Los certificados son de prueba - el navegador mostrara advertencias" echo " Los certificados son de prueba - el navegador mostrara advertencias"
echo " Las APIs usan HTTP para evitar errores de SSL" echo " Las APIs usan HTTP para evitar errores de SSL"
echo " Certificados se generaran en ~1 hora"
elif [ "$USE_SSL" = "y" ] || [ "$USE_SSL" = "Y" ]; then
echo "✅ Usando Let's Encrypt PRODUCTION"
echo " Certificados reales se generaran en 2-5 minutos"
else else
echo "✅ Usando HTTP (produccion o pruebas)" echo "✅ Usando HTTP (sin SSL)"
fi fi
echo "" echo ""
echo "Credenciales de Base de Datos - GUARDAR EN LUGAR SEGURO:" echo "Credenciales de Base de Datos - GUARDAR EN LUGAR SEGURO:"
echo " DB_PASSWORD: $(grep "^DB_PASSWORD=" .env | cut -d"=" -f2)" echo " DB_PASSWORD: $(grep "^DB_PASSWORD=" .env | cut -d"=" -f2)"
@@ -601,12 +738,6 @@ echo " docker logs acme-companion --tail 50"
echo " docker logs openccb-studio --tail 20" echo " docker logs openccb-studio --tail 20"
echo " sudo docker compose restart" echo " sudo docker compose restart"
echo "" echo ""
if [ "$LETSENCRYPT_STAGING" = "true" ]; then
echo "Certificados SSL se generaran en 1 hora - STAGING"
else
echo "Certificados SSL se generaran en 2-5 minutos - PRODUCTION"
fi
echo ""
REMOTE_SCRIPT_CONTENT REMOTE_SCRIPT_CONTENT
# Copiar script al servidor # Copiar script al servidor