Skip to main content

Guía de Despliegue

Introducción

El ecosistema Vibra está compuesto por tres artefactos desplegables independientes:

  • Vibra API — Backend basado en NestJS que expone servicios REST para los clientes web y mobile.
  • Vibra Web — Frontend Next.js que sirve la versión web de la aplicación.
  • Vibra Mobile — App móvil construida con Expo (React Native) publicada en stores.

Cada componente tiene su propio pipeline de build y despliegue. Esta guía cubre los pasos necesarios para cada uno.


Vibra API (NestJS)

Requisitos

RecursoVersión mínimaNotas
Node.js20 LTSSe recomienda usar nvm
MongoDB6.0+Requerido en producción
Redis7.0+Opcional, para caché/colas
npm / pnpm9+ / 8+Usar pnpm si el repo lo exige

Variables de entorno

Crear un archivo .env en la raíz del proyecto vibra-api/ con las siguientes variables:

# Servidor
PORT=3000
NODE_ENV=production

# Base de datos
DATABASE_URL=mongodb://usuario:password@host:27017/vibra?retryWrites=true&w=majority

# JWT
JWT_SECRET=una-clave-segura-de-al-menos-32-caracteres
JWT_EXPIRES_IN=7d

# Resend (emails transaccionales)
RESEND_API_KEY=re_xxxxxxxxxxxx

# Redis (opcional)
REDIS_URL=redis://host:6379

# Firebase Admin (notificaciones push)
FIREBASE_PROJECT_ID=proyecto-id
FIREBASE_CLIENT_EMAIL=firebase-adminsdk@proyecto.iam.gserviceaccount.com
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"

# CORS
CORS_ORIGINS=https://midominio.com,https://admin.midominio.com

# Swagger
SWAGGER_ENABLED=true
SWAGGER_PATH=api

Build y ejecución

# Compilar TypeScript a JavaScript
npm run compile

# Iniciar en producción
npm run start:prod

El comando compile genera los artefactos en la carpeta dist/. El comando start:prod ejecuta node dist/main.js con las variables de entorno cargadas.

Docker

El proyecto incluye un Dockerfile multietapa optimizado para producción:

# Etapa de build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run compile

# Etapa de producción
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
EXPOSE 3000
CMD ["node", "dist/main.js"]

Construir y ejecutar:

docker build -t vibra-api .
docker run -d --name vibra-api -p 3000:3000 --env-file .env vibra-api

También se provee un docker-compose.yml para entornos que requieran MongoDB y Redis adjuntos:

version: "3.8"
services:
api:
build: .
ports:
- "3000:3000"
env_file: .env
depends_on:
- mongo
- redis
mongo:
image: mongo:7
volumes:
- mongo-data:/data/db
redis:
image: redis:7-alpine
volumes:
mongo-data:

Swagger

Una vez desplegado, la documentación interactiva de la API está disponible en la ruta configurada:

https://api.midominio.com/api

Para entornos productivos se recomienda proteger esta ruta con un middleware de autenticación básica o deshabilitarla estableciendo SWAGGER_ENABLED=false.


Vibra Web (Next.js)

Build estático

cd vibra-web
npm run build

El output se genera en la carpeta out/ (configurado mediante output: "export" en next.config.ts).

Variables de entorno

NEXT_PUBLIC_API_URL=https://api.midominio.com
NEXT_PUBLIC_APP_NAME=Vibra

Todas las variables que comienzan con NEXT_PUBLIC_ se incluyen en el bundle del cliente. Cualquier variable sensible debe omitir ese prefijo.

Opciones de hosting

Vercel (recomendado para Next.js)

npm i -g vercel
vercel --prod

Vercel detecta automáticamente Next.js y configura el build. Las variables de entorno se configuran desde el dashboard o CLI.

Netlify

Configurar en netlify.toml:

[build]
command = "npm run build"
publish = "out"

[build.environment]
NEXT_PUBLIC_API_URL = "https://api.midominio.com"

GitHub Pages

# Agregar el action en .github/workflows/deploy.yml
npm run build
npx gh-pages -d out

Servidor web estático (Nginx)

server {
listen 443 ssl;
server_name midominio.com;

root /var/www/vibra-web/out;
index index.html;

location / {
try_files $uri $uri.html $uri/ =404;
}

# Proxy inverso hacia la API (opcional)
location /api/ {
proxy_pass https://api.midominio.com;
}
}

Nota sobre Server Components

Si el proyecto usa funcionalidades de servidor (Server Actions, API Routes, etc.), no es posible generar un build 100% estático. En ese caso desplegar en Vercel o en un VPS con Node.js usando npm run start (modo servidor).


Vibra Mobile (Expo)

Requisitos previos

  • Node.js 20 LTS
  • Expo CLI (npx expo)
  • EAS CLI (npm i -g eas-cli)
  • Cuentas de desarrollador en Google Play (USD 25, pago único) y App Store (USD 99/año)
  • Proyecto en Firebase Console con credenciales para notificaciones push

Build Android

Opción A — EAS Build (recomendada)

eas build --platform android --profile production

Opción B — Local

npx expo run:android --variant release

Requiere Android SDK y JDK 17 instalados localmente.

Build iOS

Opción A — EAS Build (recomendada)

eas build --platform ios --profile production

Opción B — Local (solo macOS)

npx expo run:ios --configuration Release

Requiere Xcode 15+ y una cuenta de Apple Developer.

Publicación en stores

Google Play Console

  1. Subir el archivo .aab generado por EAS Build
  2. Completar el formulario de ficha de la app (descripción, capturas de pantalla, clasificación de contenido)
  3. Enviar a revisión en el track de producción

App Store Connect

  1. Subir el .ipa mediante Transporter o Xcode
  2. Configurar la ficha en App Store Connect
  3. Enviar a revisión con TestFlight como paso previo opcional

Notificaciones push (Firebase Cloud Messaging)

  1. Crear un proyecto en Firebase Console
  2. Registrar la app Android (com.vibra.app) y la app iOS (com.vibra.app)
  3. Descargar google-services.json (Android) y GoogleService-Info.plist (iOS)
  4. Colocarlos en las rutas correspondientes del proyecto Expo
  5. Configurar las credenciales del servidor FCM en el módulo de notificaciones de vibra-api

EAS Update (actualizaciones OTA)

EAS Update permite enviar actualizaciones de la capa JS directamente a los usuarios sin pasar por las stores:

eas update --branch production --message "Corrige error en pantalla de login"

Los usuarios reciben la actualización al abrir la app (o en segundo plano si está configurado). Esto solo aplica a cambios en JavaScript/TypeScript; los módulos nativos requieren un nuevo build.

Configuración de ramas:

RamaPropósito
productionVersión estable en stores
stagingQA interno
developmentDesarrollo y pruebas diarias

Despliegue automatizado (CI/CD)

Se recomienda usar GitHub Actions para orquestar los despliegues. Ejemplo para Vibra API:

name: Deploy API
on:
push:
branches: [main]
paths: ["vibra-api/**"]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run compile
- run: npm test
# Despliegue en VPS via SSH
- uses: easingthemes/ssh-deploy@v5
with:
source: "vibra-api/"
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}

Checklist pre-despliegue

  • Todas las variables de entorno están definidas y son secretas
  • JWT_SECRET se generó con openssl rand -hex 64
  • MongoDB tiene índices creados (npm run migrate o scripts equivalentes)
  • CORS está configurado con los orígenes correctos
  • Swagger está deshabilitado o protegido en producción
  • Los certificados SSL están vigentes
  • Se ejecutaron las pruebas (npm test)
  • El build se probó en entorno de staging
  • Firebase Cloud Messaging está configurado y funcional
  • EAS Update apunta a la rama correcta