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: apiDeploy 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 upDeploy 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: starterDeploy 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 -fNginx 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.comVariables 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-charsMonitoreo
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! 🚀