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:
2026-03-31 10:10:44 -03:00
parent f6b6f84427
commit 2d54d6abfc
7 changed files with 265 additions and 136 deletions
+35 -73
View File
@@ -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
+96 -56
View File
@@ -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"
+8
View File
@@ -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:
+63
View File
@@ -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
View File
@@ -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 ""
+4
View File
@@ -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/ .
+4
View File
@@ -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/ .