Saltar al contenidoPedro Farbo
Lección 22 / 2550 min

Deploy en Producción

Deploy en Producción

Aprende a hacer deploy de tu API en diferentes plataformas.

GitHub Actions CI/CD

yaml
# .github/workflows/deploy.ymlname: Deploy on:  push:    branches: [main] jobs:  test:    runs-on: ubuntu-latest     services:      postgres:        image: postgres:15        env:          POSTGRES_USER: test          POSTGRES_PASSWORD: test          POSTGRES_DB: test        ports:          - 5432:5432     steps:      - uses: actions/checkout@v4       - name: Setup Node        uses: actions/setup-node@v4        with:          node-version: '20'          cache: 'npm'       - name: Install dependencies        run: npm ci       - name: Run migrations        run: npx prisma migrate deploy        env:          DATABASE_URL: postgresql://test:test@localhost:5432/test       - name: Run tests        run: npm test        env:          DATABASE_URL: postgresql://test:test@localhost:5432/test          JWT_SECRET: test-secret   deploy:    needs: test    runs-on: ubuntu-latest     steps:      - uses: actions/checkout@v4       - name: Deploy to Railway        uses: berviantoleo/railway-deploy@main        with:          railway_token: ${{ secrets.RAILWAY_TOKEN }}          service: api

Deploy en Railway

bash
# Instalar CLInpm install -g @railway/cli # Loginrailway login # Crear proyectorailway init # Agregar PostgreSQLrailway add --plugin postgresql # Agregar Redisrailway add --plugin redis # Deployrailway up

Deploy en Render

yaml
# render.yamlservices:  - type: web    name: ecommerce-api    env: node    buildCommand: npm install && npx prisma generate && npm run build    startCommand: npm start    envVars:      - key: NODE_ENV        value: production      - key: DATABASE_URL        fromDatabase:          name: ecommerce-db          property: connectionString      - key: JWT_SECRET        generateValue: true databases:  - name: ecommerce-db    plan: starter

Deploy con Docker (VPS)

bash
# En el servidorgit pull origin main # Build y deploydocker-compose -f docker-compose.prod.yml builddocker-compose -f docker-compose.prod.yml up -d # Ver logsdocker-compose -f docker-compose.prod.yml logs -f

Nginx como Reverse Proxy

nginx
# /etc/nginx/sites-available/apiserver {    listen 80;    server_name api.ecommerce.com;     location / {        proxy_pass http://localhost:3000;        proxy_http_version 1.1;        proxy_set_header Upgrade $http_upgrade;        proxy_set_header Connection 'upgrade';        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_cache_bypass $http_upgrade;    }}

SSL con Certbot

bash
sudo apt install certbot python3-certbot-nginxsudo certbot --nginx -d api.ecommerce.com

Variables de Entorno

bash
# ProducciónNODE_ENV=productionPORT=3000DATABASE_URL=postgresql://user:pass@host:5432/dbREDIS_URL=redis://host:6379JWT_SECRET=super-secret-key-min-32-chars

Monitoreo

typescript
// Logging estructuradoimport pino from 'pino'; const logger = pino({  level: process.env.LOG_LEVEL || 'info',  transport: process.env.NODE_ENV !== 'production'    ? { target: 'pino-pretty' }    : undefined,}); export { logger };

Resumen

  • ✅ CI/CD con GitHub Actions
  • ✅ Deploy en Railway/Render
  • ✅ Docker en VPS
  • ✅ SSL y proxy reverso

Próxima clase: Proyecto E-commerce Parte 1! 🚀

¿Te gustó el contenido? ¡Tu contribución ayuda a mantener todo online y gratuito!

PIX:0737160d-e98f-4a65-8392-5dba70e7ff3e