feat: Añadir scripts para generar y sincronizar archivos .env, actualizar configuraciones de Docker y mejorar el despliegue en producción
This commit is contained in:
+35
-73
@@ -1,115 +1,71 @@
|
||||
# ========================================
|
||||
# OpenCCB Environment Configuration
|
||||
# ========================================
|
||||
# Copia este archivo a .env y configura tus variables
|
||||
# cp .env.example .env
|
||||
# Producción - AWS EC2
|
||||
# ========================================
|
||||
|
||||
# ----------------------------------------
|
||||
# Database Configuration
|
||||
# Database Configuration (Docker)
|
||||
# Las URLs usan 'db' como hostname (contenedor PostgreSQL)
|
||||
# Puerto interno de Docker: 5432
|
||||
# ----------------------------------------
|
||||
# DB_PASSWORD: Genera uno seguro con: ./generate_jwt_secret.sh
|
||||
DB_PASSWORD=tu_password_seguro
|
||||
DB_PASSWORD=CHANGE_ME_GENERATE_SECURE_PASSWORD
|
||||
CMS_DATABASE_URL=postgresql://user:CHANGE_ME_GENERATE_SECURE_PASSWORD@db:5432/openccb_cms
|
||||
LMS_DATABASE_URL=postgresql://user:CHANGE_ME_GENERATE_SECURE_PASSWORD@db:5432/openccb_lms
|
||||
DATABASE_URL=postgresql://user:CHANGE_ME_GENERATE_SECURE_PASSWORD@db:5432/openccb_cms
|
||||
|
||||
# JWT_SECRET: Genera uno seguro con: ./generate_jwt_secret.sh
|
||||
JWT_SECRET=tu_jwt_secret_seguro
|
||||
|
||||
# Database URLs
|
||||
# Producción (Docker): db:5432
|
||||
# Desarrollo (Local): localhost:5433 o localhost:5434
|
||||
CMS_DATABASE_URL=postgresql://user:DB_PASSWORD@localhost:5433/openccb_cms
|
||||
LMS_DATABASE_URL=postgresql://user:DB_PASSWORD@localhost:5433/openccb_lms
|
||||
DATABASE_URL=postgresql://user:DB_PASSWORD@localhost:5433/openccb_cms
|
||||
|
||||
# SAM Database (External MySQL)
|
||||
SAM_DATABASE_URL=mysql://usuario:password@host:3306/sige_sam_v3
|
||||
|
||||
# Bridge Database
|
||||
BRIDGE_DATABASE_URL=postgresql://user:password@localhost:5432/openccb_cms?sslmode=disable
|
||||
# ----------------------------------------
|
||||
# JWT Secret (64 caracteres mínimo)
|
||||
# ----------------------------------------
|
||||
JWT_SECRET=CHANGE_ME_GENERATE_SECURE_SECRET
|
||||
|
||||
# ----------------------------------------
|
||||
# Logging
|
||||
# ----------------------------------------
|
||||
RUST_LOG=info
|
||||
# Opciones: error, warn, info, debug, trace
|
||||
|
||||
# ----------------------------------------
|
||||
# Environment
|
||||
# ----------------------------------------
|
||||
ENVIRONMENT=dev
|
||||
# Opciones: dev, prod
|
||||
|
||||
# ----------------------------------------
|
||||
# Let's Encrypt Configuration
|
||||
# ----------------------------------------
|
||||
LETSENCRYPT_STAGING=true
|
||||
# true = Staging (certificados de prueba, sin rate limits)
|
||||
# false = Production (certificados reales, con rate limits)
|
||||
ENVIRONMENT=prod
|
||||
|
||||
# ----------------------------------------
|
||||
# AI Configuration
|
||||
# ----------------------------------------
|
||||
AI_PROVIDER=local
|
||||
# Opciones: 'openai' o 'local'
|
||||
|
||||
OPENAI_API_KEY=tu_api_key_de_openai
|
||||
OPENAI_API_KEY=
|
||||
|
||||
# Local AI (Ollama & Whisper)
|
||||
LOCAL_WHISPER_URL=http://localhost:9000
|
||||
LOCAL_OLLAMA_URL=http://localhost:11434
|
||||
LOCAL_WHISPER_URL=http://t-800.norteamericano.cl:9000
|
||||
LOCAL_OLLAMA_URL=http://t-800.norteamericano.cl:11434
|
||||
|
||||
# Model Configuration - Optimized for each use case
|
||||
# Model Configuration
|
||||
LOCAL_LLM_MODEL=llama3.2:3b
|
||||
# Chat/Tutor: llama3.2:3b - Rápido y eficiente para IA conversacional
|
||||
|
||||
LOCAL_LLM_MODEL_COMPLEX=qwen3.5:9b
|
||||
# Razonamiento complejo/análisis: qwen3.5:9b
|
||||
|
||||
LOCAL_LLM_MODEL_ADVANCED=gpt-oss:latest
|
||||
# Tareas pesadas: gpt-oss:latest - Modelo más capaz
|
||||
|
||||
# Embeddings: nomic-embed-text - Optimizado para búsqueda semántica
|
||||
# Embeddings
|
||||
EMBEDDING_MODEL=nomic-embed-text
|
||||
|
||||
# Audio transcription (Whisper)
|
||||
WHISPER_MODEL=whisper-large-v3
|
||||
|
||||
# Bark TTS API (Text-to-Speech para preguntas)
|
||||
BARK_API_URL=http://localhost:8443
|
||||
|
||||
# ----------------------------------------
|
||||
# Development URLs (Red local)
|
||||
# External Database Integration (SAM)
|
||||
# ----------------------------------------
|
||||
DEV_OLLAMA_URL=http://t-800.norteamericano.cl:11434
|
||||
DEV_WHISPER_URL=http://t-800.norteamericano.cl:9000
|
||||
DEV_BARK_URL=http://t-800:8000
|
||||
|
||||
# ----------------------------------------
|
||||
# Production URLs (Red local)
|
||||
# ----------------------------------------
|
||||
PROD_OLLAMA_URL=http://t-800.norteamericano.cl:11434
|
||||
PROD_WHISPER_URL=http://t-800.norteamericano.cl:9000
|
||||
|
||||
# Video Bridge URL
|
||||
LOCAL_VIDEO_BRIDGE_URL=http://t-800.norteamericano.cl:8080
|
||||
MYSQL_DATABASE_URL=mysql://db_user:db_password@host:3306/database_name
|
||||
EXTERNAL_TABLE_GRADES=notas
|
||||
EXTERNAL_ID_TIPO_NOTA=1
|
||||
|
||||
# ----------------------------------------
|
||||
# Mercado Pago Configuration
|
||||
# ----------------------------------------
|
||||
MP_ACCESS_TOKEN=tu_access_token_de_mercado_pago
|
||||
MP_PUBLIC_KEY=tu_public_key_de_mercado_pago
|
||||
MP_WEBHOOK_SECRET=tu_webhook_secret_de_mercado_pago
|
||||
MP_BACK_URL_SUCCESS=http://localhost:3003/payments/success
|
||||
MP_BACK_URL_FAILURE=http://localhost:3003/payments/failure
|
||||
MP_ACCESS_TOKEN=
|
||||
MP_PUBLIC_KEY=
|
||||
MP_WEBHOOK_SECRET=
|
||||
MP_BACK_URL_SUCCESS=https://learning.norteamericano.com/payments/success
|
||||
MP_BACK_URL_FAILURE=https://learning.norteamericano.com/payments/failure
|
||||
MP_NOTIFICATION_URL=
|
||||
|
||||
# ----------------------------------------
|
||||
# External MySQL Integration
|
||||
# ----------------------------------------
|
||||
MYSQL_DATABASE_URL=mysql://usuario:password@host:3306/base_de_datos
|
||||
EXTERNAL_TABLE_GRADES=notas
|
||||
EXTERNAL_ID_TIPO_NOTA=1
|
||||
|
||||
# ----------------------------------------
|
||||
# Branding Defaults
|
||||
# ----------------------------------------
|
||||
@@ -121,8 +77,14 @@ DEFAULT_PRIMARY_COLOR="#3B82F6"
|
||||
DEFAULT_SECONDARY_COLOR="#8B5CF6"
|
||||
|
||||
# ----------------------------------------
|
||||
# Frontend API URLs (Producción)
|
||||
# Let's Encrypt Configuration
|
||||
# true = Staging (certificados de prueba)
|
||||
# false = Production (certificados reales)
|
||||
# ----------------------------------------
|
||||
LETSENCRYPT_STAGING=true
|
||||
|
||||
# ----------------------------------------
|
||||
# Frontend URLs (para producción con SSL)
|
||||
# ----------------------------------------
|
||||
# Estas URLs se usan para el build del frontend y deben apuntar a los dominios públicos
|
||||
NEXT_PUBLIC_CMS_API_URL=https://studio.norteamericano.com
|
||||
NEXT_PUBLIC_LMS_API_URL=https://learning.norteamericano.com
|
||||
|
||||
@@ -263,6 +263,8 @@ if [[ "$USE_SSL" =~ ^[Yy]$ ]]; then
|
||||
|
||||
if [[ "$PRESERVE_CERTS" =~ ^[Yy]$ ]]; then
|
||||
PRESERVE_SSL_CERTS="true"
|
||||
LETSENCRYPT_STAGING="false"
|
||||
PROTOCOL="https"
|
||||
echo "✅ Se preservarán los certificados SSL existentes"
|
||||
else
|
||||
PRESERVE_SSL_CERTS="false"
|
||||
@@ -349,38 +351,38 @@ if [ ! -f ".env" ]; then
|
||||
fi
|
||||
|
||||
# Generar DB_PASSWORD seguro
|
||||
if ! grep -q "^DB_PASSWORD=" .env || grep -q "CHANGE_ME" .env || grep -q "^DB_PASSWORD=password$" .env; then
|
||||
if ! grep -q "^DB_PASSWORD=" .env || grep -q "^DB_PASSWORD=$" .env || grep -q "CHANGE_ME" .env || grep -q "^DB_PASSWORD=password$" .env; then
|
||||
echo " Generando DB_PASSWORD segura..."
|
||||
DB_PASS=$(openssl rand -base64 32 | tr -dc "a-zA-Z0-9" | head -c 32)
|
||||
DB_PASS=\$(openssl rand -base64 32 | tr -dc "a-zA-Z0-9" | head -c 32)
|
||||
if grep -q "^DB_PASSWORD=" .env; then
|
||||
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$DB_PASS/" .env
|
||||
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=\$DB_PASS/" .env
|
||||
else
|
||||
echo "DB_PASSWORD=$DB_PASS" >> .env
|
||||
echo "DB_PASSWORD=\$DB_PASS" >> .env
|
||||
fi
|
||||
fi
|
||||
|
||||
# Generar JWT_SECRET seguro
|
||||
if ! grep -q "^JWT_SECRET=" .env || grep -q "CHANGE_ME" .env || grep -q "secret.*2025" .env || grep -q "^JWT_SECRET=supersecret" .env; then
|
||||
if ! grep -q "^JWT_SECRET=" .env || grep -q "^JWT_SECRET=$" .env || grep -q "CHANGE_ME" .env || grep -q "secret.*2025" .env || grep -q "^JWT_SECRET=supersecret" .env; then
|
||||
echo " Generando JWT_SECRET seguro..."
|
||||
JWT_SEC=$(openssl rand -base64 48 | tr -dc "a-zA-Z0-9" | head -c 64)
|
||||
JWT_SEC=\$(openssl rand -base64 48 | tr -dc "a-zA-Z0-9" | head -c 64)
|
||||
if grep -q "^JWT_SECRET=" .env; then
|
||||
sed -i "s/^JWT_SECRET=.*/JWT_SECRET=$JWT_SEC/" .env
|
||||
sed -i "s/^JWT_SECRET=.*/JWT_SECRET=\$JWT_SEC/" .env
|
||||
else
|
||||
echo "JWT_SECRET=$JWT_SEC" >> .env
|
||||
echo "JWT_SECRET=\$JWT_SEC" >> .env
|
||||
fi
|
||||
fi
|
||||
|
||||
# CORREGIR DATABASE_URL para produccion - db:5432
|
||||
echo " Configurando DATABASE_URL para Docker..."
|
||||
DB_PASS=$(grep "^DB_PASSWORD=" .env | cut -d"=" -f2)
|
||||
DB_PASS=\$(grep "^DB_PASSWORD=" .env | cut -d"=" -f2-)
|
||||
|
||||
sed -i "/^CMS_DATABASE_URL=/d" .env 2>/dev/null || true
|
||||
sed -i "/^LMS_DATABASE_URL=/d" .env 2>/dev/null || true
|
||||
sed -i "/^DATABASE_URL=/d" .env 2>/dev/null || true
|
||||
|
||||
echo "CMS_DATABASE_URL=postgresql://user:${DB_PASS}@db:5432/openccb_cms" >> .env
|
||||
echo "LMS_DATABASE_URL=postgresql://user:${DB_PASS}@db:5432/openccb_lms" >> .env
|
||||
echo "DATABASE_URL=postgresql://user:${DB_PASS}@db:5432/openccb_cms" >> .env
|
||||
echo "CMS_DATABASE_URL=postgresql://user:\${DB_PASS}@db:5432/openccb_cms" >> .env
|
||||
echo "LMS_DATABASE_URL=postgresql://user:\${DB_PASS}@db:5432/openccb_lms" >> .env
|
||||
echo "DATABASE_URL=postgresql://user:\${DB_PASS}@db:5432/openccb_cms" >> .env
|
||||
|
||||
# Configurar Let's Encrypt - staging o production
|
||||
echo " Configurando Let's Encrypt..."
|
||||
@@ -419,11 +421,11 @@ sed -i "/^NEXT_PUBLIC_CMS_API_URL=/d" .env 2>/dev/null || true
|
||||
sed -i "/^NEXT_PUBLIC_LMS_API_URL=/d" .env 2>/dev/null || true
|
||||
|
||||
# Agregar URLs correctas (sin puertos - nginx proxy maneja el routing)
|
||||
echo "NEXT_PUBLIC_CMS_API_URL=$CMS_URL" >> .env
|
||||
echo "NEXT_PUBLIC_LMS_API_URL=$LMS_URL" >> .env
|
||||
echo "NEXT_PUBLIC_CMS_API_URL=\$CMS_URL" >> .env
|
||||
echo "NEXT_PUBLIC_LMS_API_URL=\$LMS_URL" >> .env
|
||||
echo " URLs configuradas:"
|
||||
echo " CMS: $CMS_URL"
|
||||
echo " LMS: $LMS_URL"
|
||||
echo " CMS: \$CMS_URL"
|
||||
echo " LMS: \$LMS_URL"
|
||||
echo ""
|
||||
REMOTE_SCRIPT_CONTENT
|
||||
|
||||
@@ -531,54 +533,44 @@ run_docker_compose down || true
|
||||
echo "Eliminando contenedores antiguos..."
|
||||
$DOCKER_CMD rm openccb-studio 2>/dev/null || true
|
||||
$DOCKER_CMD rm openccb-experience 2>/dev/null || true
|
||||
$DOCKER_CMD rm openccb-db 2>/dev/null || true
|
||||
|
||||
# ========================================
|
||||
# GESTIÓN DE BASE DE DATOS
|
||||
# ========================================
|
||||
if [ "$RESET_DATABASE" = "true" ]; then
|
||||
echo ""
|
||||
echo "⚠️ REINICIANDO BASE DE DATOS ⚠️"
|
||||
echo ""
|
||||
# Eliminar volúmenes de base de datos para empezar desde cero
|
||||
echo "Eliminando volúmenes de base de datos (datos nuevos)..."
|
||||
$DOCKER_CMD volume rm openccb_postgres_data 2>/dev/null || true
|
||||
|
||||
# Detener contenedores de nginx y ssl también para limpiar volúmenes
|
||||
echo "Deteniendo todos los contenedores..."
|
||||
run_docker_compose down
|
||||
# Limpiar caché de builder
|
||||
echo "Limpiando caché de Docker builder..."
|
||||
$DOCKER_CMD builder prune -f 2>/dev/null || true
|
||||
|
||||
# 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
|
||||
# Reconstruir con las URLs correctas (sin cache para asegurar que tome los cambios)
|
||||
echo "Reconstruyendo contenedores con las URLs configuradas..."
|
||||
run_docker_compose build --no-cache studio experience db
|
||||
|
||||
# Reiniciar contenedores
|
||||
echo "Reiniciando contenedores..."
|
||||
run_docker_compose up -d db
|
||||
# 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
|
||||
|
||||
echo "Esperando a que la base de datos este lista..."
|
||||
sleep 10
|
||||
# Iniciar base de datos (crea nuevas bases desde cero)
|
||||
echo "Iniciando base de datos (datos nuevos)..."
|
||||
run_docker_compose up -d db
|
||||
echo "Esperando a que la base de datos este lista..."
|
||||
sleep 15
|
||||
|
||||
# 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"
|
||||
# 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"
|
||||
|
||||
echo "✅ Base de datos reiniciada correctamente"
|
||||
else
|
||||
echo ""
|
||||
echo "✅ Manteniendo base de datos existente"
|
||||
echo ""
|
||||
# Iniciar servicios
|
||||
echo "Iniciando servicios OpenCCB..."
|
||||
run_docker_compose up -d studio experience
|
||||
|
||||
# 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
|
||||
echo ""
|
||||
echo "Esperando a que los servicios esten listos..."
|
||||
sleep 15
|
||||
|
||||
# ========================================
|
||||
# GESTIÓN DE CERTIFICADOS SSL
|
||||
@@ -624,6 +616,47 @@ echo ""
|
||||
echo "Esperando a que los servicios esten listos..."
|
||||
sleep 15
|
||||
|
||||
# ========================================
|
||||
# VALIDAR / REPARAR SSL
|
||||
# ========================================
|
||||
if [ "\$PROTOCOL" = "https" ] || [ "\$PRESERVE_SSL_CERTS" = "true" ]; then
|
||||
echo ""
|
||||
echo "Verificando certificados SSL..."
|
||||
|
||||
repair_ssl_for_domain() {
|
||||
local domain="\$1"
|
||||
local crt="/etc/nginx/certs/\${domain}.crt"
|
||||
local key="/etc/nginx/certs/\${domain}.key"
|
||||
|
||||
if \$DOCKER_CMD exec nginx-proxy sh -lc "test -f '\$crt' && test -f '\$key' && openssl x509 -in '\$crt' -noout -pubkey 2>/dev/null | openssl sha256 >/tmp/cert.hash && openssl pkey -in '\$key' -pubout 2>/dev/null | openssl sha256 >/tmp/key.hash && cmp -s /tmp/cert.hash /tmp/key.hash" >/dev/null 2>&1; then
|
||||
echo " ✅ Certificado válido: \$domain"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo " ⚠️ Certificado inconsistente o faltante para \$domain"
|
||||
echo " Generando certificado temporal autofirmado para evitar error 500..."
|
||||
|
||||
\$DOCKER_CMD exec acme-companion sh -lc "rm -f '\$crt' '\$key' && openssl req -x509 -nodes -newkey rsa:2048 -keyout '\$key' -out '\$crt' -days 30 -subj '/CN=\$domain' >/dev/null 2>&1" >/dev/null 2>&1 || true
|
||||
|
||||
if \$DOCKER_CMD exec nginx-proxy sh -lc "test -f '\$crt' && test -f '\$key' && openssl x509 -in '\$crt' -noout -pubkey 2>/dev/null | openssl sha256 >/tmp/cert.hash && openssl pkey -in '\$key' -pubout 2>/dev/null | openssl sha256 >/tmp/key.hash && cmp -s /tmp/cert.hash /tmp/key.hash" >/dev/null 2>&1; then
|
||||
echo " ✅ Certificado temporal listo: \$domain"
|
||||
else
|
||||
echo " ❌ No se pudo reparar SSL para \$domain"
|
||||
fi
|
||||
}
|
||||
|
||||
repair_ssl_for_domain "studio.norteamericano.com"
|
||||
repair_ssl_for_domain "learning.norteamericano.com"
|
||||
|
||||
if \$DOCKER_CMD exec nginx-proxy nginx -t >/tmp/nginx_ssl_check.log 2>&1; then
|
||||
\$DOCKER_CMD exec nginx-proxy nginx -s reload >/dev/null 2>&1 || true
|
||||
echo " ✅ Nginx SSL validado correctamente"
|
||||
else
|
||||
echo " ⚠️ Nginx reportó problemas SSL:"
|
||||
cat /tmp/nginx_ssl_check.log || true
|
||||
fi
|
||||
fi
|
||||
|
||||
# ========================================
|
||||
# VERIFICAR VARIABLES DE ENTORNO
|
||||
# ========================================
|
||||
@@ -846,6 +879,13 @@ if [ $SCRIPT_EXIT -eq 0 ]; then
|
||||
echo " Despliegue Completado Exitosamente"
|
||||
echo "===================================================="
|
||||
echo ""
|
||||
|
||||
# Descargar .env del servidor al local
|
||||
echo "📥 Descargando .env del servidor..."
|
||||
scp -i "$PEM_PATH" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/.env" "./.env.production"
|
||||
echo " ✅ .env guardado como .env.production"
|
||||
echo ""
|
||||
|
||||
echo "Accede a tu plataforma:"
|
||||
echo " Studio - CMS: $PROTOCOL://studio.norteamericano.com"
|
||||
echo " Experience - LMS: $PROTOCOL://learning.norteamericano.com"
|
||||
|
||||
@@ -79,6 +79,10 @@ services:
|
||||
- VIRTUAL_HOST=studio.norteamericano.com
|
||||
- VIRTUAL_PORT=3000
|
||||
- LETSENCRYPT_HOST=studio.norteamericano.com
|
||||
- HTTPS_METHOD=noredirect
|
||||
- HSTS=off
|
||||
- HOSTNAME=0.0.0.0
|
||||
- DATABASE_URL=${CMS_DATABASE_URL}
|
||||
- LMS_INTERNAL_URL=http://experience:3002
|
||||
- NEXT_PUBLIC_LMS_API_URL=${NEXT_PUBLIC_LMS_API_URL}
|
||||
volumes:
|
||||
@@ -109,6 +113,10 @@ services:
|
||||
- VIRTUAL_HOST=learning.norteamericano.com
|
||||
- VIRTUAL_PORT=3003
|
||||
- LETSENCRYPT_HOST=learning.norteamericano.com
|
||||
- HTTPS_METHOD=noredirect
|
||||
- HSTS=off
|
||||
- HOSTNAME=0.0.0.0
|
||||
- DATABASE_URL=${LMS_DATABASE_URL}
|
||||
- NEXT_PUBLIC_CMS_API_URL=${NEXT_PUBLIC_CMS_API_URL}
|
||||
env_file: .env
|
||||
extra_hosts:
|
||||
|
||||
Executable
+63
@@ -0,0 +1,63 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Generate Secure .env for OpenCCB Production
|
||||
# Este script genera un archivo .env con contraseñas seguras
|
||||
|
||||
set -e
|
||||
|
||||
echo "===================================================="
|
||||
echo " 🔐 OpenCCB - Generar .env Seguro"
|
||||
echo "===================================================="
|
||||
echo ""
|
||||
|
||||
# Verificar que existe .env.example
|
||||
if [ ! -f ".env.example" ]; then
|
||||
echo "❌ ERROR: .env.example no encontrado"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Generar DB_PASSWORD seguro (32 caracteres)
|
||||
echo "🔑 Generando DB_PASSWORD segura..."
|
||||
DB_PASS=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32)
|
||||
echo " ✅ DB_PASSWORD generada: $DB_PASS"
|
||||
|
||||
# Generar JWT_SECRET seguro (64 caracteres)
|
||||
echo "🔑 Generando JWT_SECRET seguro..."
|
||||
JWT_SEC=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | head -c 64)
|
||||
echo " ✅ JWT_SECRET generado: $JWT_SEC"
|
||||
|
||||
# Copiar .env.example a .env
|
||||
echo "📋 Creando .env desde .env.example..."
|
||||
cp .env.example .env
|
||||
|
||||
# Reemplazar valores
|
||||
sed -i "s/DB_PASSWORD=CHANGE_ME_GENERATE_SECURE_PASSWORD/DB_PASSWORD=$DB_PASS/" .env
|
||||
sed -i "s/JWT_SECRET=CHANGE_ME_GENERATE_SECURE_SECRET/JWT_SECRET=$JWT_SEC/" .env
|
||||
|
||||
# Reemplazar URLs de base de datos
|
||||
sed -i "s|postgresql://user:CHANGE_ME_GENERATE_SECURE_PASSWORD@db:5432/openccb_cms|postgresql://user:${DB_PASS}@db:5432/openccb_cms|g" .env
|
||||
sed -i "s|postgresql://user:CHANGE_ME_GENERATE_SECURE_PASSWORD@db:5432/openccb_lms|postgresql://user:${DB_PASS}@db:5432/openccb_lms|g" .env
|
||||
sed -i "s|postgresql://user:CHANGE_ME_GENERATE_SECURE_PASSWORD@db:5432/openccb_cms|postgresql://user:${DB_PASS}@db:5432/openccb_cms|g" .env
|
||||
|
||||
echo ""
|
||||
echo "✅ .env generado exitosamente"
|
||||
echo ""
|
||||
echo "===================================================="
|
||||
echo " 📋 Credenciales Generadas"
|
||||
echo "===================================================="
|
||||
echo ""
|
||||
echo "DB_PASSWORD: $DB_PASS"
|
||||
echo "JWT_SECRET: $JWT_SEC"
|
||||
echo ""
|
||||
echo "⚠️ IMPORTANTE: Guarda estas credenciales en un lugar seguro"
|
||||
echo " No se pueden recuperar si se pierden"
|
||||
echo ""
|
||||
echo "📝 Para copiar al portapapeles (Linux):"
|
||||
echo " echo '$DB_PASS' | xclip -selection clipboard"
|
||||
echo " echo '$JWT_SEC' | xclip -selection clipboard"
|
||||
echo ""
|
||||
echo "📝 Para copiar al portapapeles (macOS):"
|
||||
echo " echo '$DB_PASS' | pbcopy"
|
||||
echo " echo '$JWT_SEC' | pbcopy"
|
||||
echo ""
|
||||
echo "===================================================="
|
||||
Executable
+48
@@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Sync .env.production to .env for local development
|
||||
# This allows you to use the same configuration locally
|
||||
|
||||
set -e
|
||||
|
||||
echo "===================================================="
|
||||
echo " 🔄 Sync .env.production to .env"
|
||||
echo "===================================================="
|
||||
echo ""
|
||||
|
||||
# Verificar que existe .env.production
|
||||
if [ ! -f ".env.production" ]; then
|
||||
echo "❌ ERROR: .env.production no encontrado"
|
||||
echo ""
|
||||
echo "Ejecuta ./deploy.sh primero para descargarlo del servidor"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Hacer backup del .env actual si existe
|
||||
if [ -f ".env" ]; then
|
||||
echo "📦 Creando backup de .env actual..."
|
||||
cp .env .env.backup.$(date +%Y%m%d_%H%M%S)
|
||||
echo " ✅ Backup creado"
|
||||
fi
|
||||
|
||||
# Copiar .env.production a .env
|
||||
echo "📋 Copiando .env.production a .env..."
|
||||
cp .env.production .env
|
||||
echo " ✅ .env actualizado"
|
||||
|
||||
echo ""
|
||||
echo "===================================================="
|
||||
echo " ✅ Sync Completado"
|
||||
echo "===================================================="
|
||||
echo ""
|
||||
echo "⚠️ IMPORTANTE: Las URLs de base de datos apuntan al servidor remoto"
|
||||
echo " Para desarrollo local, cambia 'db' por 'localhost' y ajusta el puerto"
|
||||
echo ""
|
||||
echo "Ejemplo para desarrollo local:"
|
||||
echo " CMS_DATABASE_URL=postgresql://user:password@localhost:5433/openccb_cms"
|
||||
echo " LMS_DATABASE_URL=postgresql://user:password@localhost:5433/openccb_lms"
|
||||
echo ""
|
||||
echo "📋 Para usar esta configuración en el servidor:"
|
||||
echo " 1. Ejecuta: ./deploy.sh"
|
||||
echo " 2. El script subirá el .env.production automáticamente"
|
||||
echo ""
|
||||
@@ -16,6 +16,10 @@ RUN cargo build --release -p lms-service
|
||||
# Build stage for Next.js Experience
|
||||
FROM node:20-alpine AS node-builder
|
||||
WORKDIR /app
|
||||
|
||||
# Configure DNS for Google Fonts access during build
|
||||
RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
||||
|
||||
COPY web/experience/package*.json ./
|
||||
RUN npm ci
|
||||
COPY web/experience/ .
|
||||
|
||||
@@ -16,6 +16,10 @@ RUN cargo build --release -p cms-service
|
||||
# Build stage for Next.js Studio
|
||||
FROM node:20-alpine AS node-builder
|
||||
WORKDIR /app
|
||||
|
||||
# Configure DNS for Google Fonts access during build
|
||||
RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
||||
|
||||
COPY web/studio/package*.json ./
|
||||
RUN npm ci
|
||||
COPY web/studio/ .
|
||||
|
||||
Reference in New Issue
Block a user