From 2d54d6abfc96d5b216c4da18d09ad17e97aecd89 Mon Sep 17 00:00:00 2001 From: Nurfog Date: Tue, 31 Mar 2026 10:10:44 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20A=C3=B1adir=20scripts=20para=20generar?= =?UTF-8?q?=20y=20sincronizar=20archivos=20.env,=20actualizar=20configurac?= =?UTF-8?q?iones=20de=20Docker=20y=20mejorar=20el=20despliegue=20en=20prod?= =?UTF-8?q?ucci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 108 ++++++++----------------- deploy.sh | 166 +++++++++++++++++++++++--------------- docker-compose.yml | 8 ++ generate_env.sh | 63 +++++++++++++++ sync-env.sh | 48 +++++++++++ web/experience/Dockerfile | 4 + web/studio/Dockerfile | 4 + 7 files changed, 265 insertions(+), 136 deletions(-) create mode 100755 generate_env.sh create mode 100755 sync-env.sh diff --git a/.env.example b/.env.example index 10ef3ff..3e3a0c9 100644 --- a/.env.example +++ b/.env.example @@ -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 diff --git a/deploy.sh b/deploy.sh index bb8c2f1..75b18fa 100755 --- a/deploy.sh +++ b/deploy.sh @@ -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 "" - - # 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 +# 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 + +# Limpiar caché de builder +echo "Limpiando caché de Docker builder..." +$DOCKER_CMD builder prune -f 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 + +# 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 (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 +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 +echo "Iniciando servicios OpenCCB..." +run_docker_compose up -d studio experience + +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" diff --git a/docker-compose.yml b/docker-compose.yml index 994d2c5..30881bb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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: diff --git a/generate_env.sh b/generate_env.sh new file mode 100755 index 0000000..8e2f52d --- /dev/null +++ b/generate_env.sh @@ -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 "====================================================" diff --git a/sync-env.sh b/sync-env.sh new file mode 100755 index 0000000..f4a4178 --- /dev/null +++ b/sync-env.sh @@ -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 "" diff --git a/web/experience/Dockerfile b/web/experience/Dockerfile index c1bb1ba..2ae64ce 100644 --- a/web/experience/Dockerfile +++ b/web/experience/Dockerfile @@ -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/ . diff --git a/web/studio/Dockerfile b/web/studio/Dockerfile index 0fd91df..cfbf8c7 100644 --- a/web/studio/Dockerfile +++ b/web/studio/Dockerfile @@ -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/ .