DevOps

Cloud Deployment Showcase | acoplador

Infraestructura lista para producción que demuestra la orquestación de contenedores, infraestructura como código y canales automatizados de CI/CD.

Contexto del problema, stack y tipo de sistema

Este proyecto documenta la automatización de la implementación para servicios backend, con contenedorización, CI/CD y controles operativos para flujos de trabajo de producción.

Alcance técnico

  • Stack: Docker, Nginx, GitHub Actions, configuración de implementación
  • Tipo de sistema: sistema de automatización de implementación backend, flujo de trabajo CI/CD
  • Palabras clave en contexto: sistema de automatización, operaciones backend, implementación de API

Proyectos backend operativos relacionados: Event-Driven Integration Service y Aegis Sentinel.

Documentación completa del proyecto

Cloud Deployment Showcase

Estado de construcción Plataforma: Ferrocarril acoplador Licencia: MIT Infraestructura: IaC

Descripción general del proyecto

Una demostración completa de patrones de implementación en la nube listos para producción para aplicaciones web modernas. Este proyecto muestra estrategias de implementación de nivel empresarial que incluyen implementación de múltiples nubes, orquestación de contenedores, infraestructura como código, mejores prácticas de seguridad, monitoreo y flujos de trabajo de CI/CD.

Arquitectura

Mapa de infraestructura visual

graph TD
    A[Internet] -->|HTTPS| B(Railway Load Balancer)
    B --> C[Nginx Reverse Proxy]
    C --> D[Node.js App:3001]
    D --> E[(PostgreSQL)]
    D --> F[(Redis Cache)]
    D --> G[Jaeger Tracing]
    
    style B fill:#f9f,stroke:#333,stroke-width:2px
    style D fill:#bbf,stroke:#333,stroke-width:2px

Impacto de la ingeniería e interés nacional

Componente Implementación Valor de la industria
Alta disponibilidad Escalado horizontal + curación automática Minimiza el tiempo de inactividad del servicio digital
Arquitectura de seguridad Confianza cero y endurecimiento de Nginx Protege los datos confidenciales contra las amenazas cibernéticas
Observabilidad Seguimiento distribuido de Jaeger Respuesta rápida a incidentes y optimización del rendimiento
Automatización CI/CD completo a través de GitHub Actions Acelera el ciclo de vida de entrega de software (SDLC)

Componentes

  • Plataforma ferroviaria: Alojamiento en la nube con escalado automático y servicios gestionados.
  • nginx: Proxy inverso, equilibrador de carga y puerta de enlace de seguridad
  • PostgreSQL: Servicio de base de datos administrada con copias de seguridad automáticas.
  • Redis: Servicio de cola y caché administrado para un alto rendimiento
  • Jäger: Plataforma distribuida de seguimiento y observabilidad.
  • acoplador: Contenedorización para entornos de implementación consistentes

Guía de implementación

Requisitos previos

Paso 1: Configuración del ferrocarril

  1. Crear proyecto ferroviario

    # Connect your GitHub repository
    git clone https://github.com/PkLavc/cloud-deployment-showcase.git
    cd cloud-deployment-showcase
    railway login
    railway init
    
  2. Agregar servicios

    # Add PostgreSQL
    railway add postgresql
    
    # Add Redis
    railway add redis
    
    # Add Jaeger (optional, for tracing)
    railway add jaeger
    

Paso 2: variables de entorno

Establezca las siguientes variables de entorno en el panel de Ferrocarril:

# Database (auto-provided by Railway)
DATABASE_URL=${{Postgres.DATABASE_URL}}

# Redis (auto-provided by Railway)
REDIS_URL=${{Redis.REDIS_URL}}

# Webhook Secrets (generate secure random strings)
STRIPE_WEBHOOK_SECRET=whsec_your_secure_stripe_secret
PAYPAL_WEBHOOK_SECRET=your_secure_paypal_secret
GITHUB_WEBHOOK_SECRET=your_secure_github_secret

# OpenTelemetry
OTEL_SERVICE_NAME=event-driven-integration-service
JAEGER_ENDPOINT=${{Jaeger.JAEGER_ENDPOINT}}

# Application
NODE_ENV=production
PORT=3001

Paso 3: Migración de la Base de Datos

# Run migrations on Railway
railway run npm run prisma:migrate

# Generate Prisma client
railway run npm run prisma:generate

Paso 4: implementar

# Deploy to Railway
railway up

Railway se construirá e implementará automáticamente utilizando el Dockerfile proporcionado.

Archivos de configuración

Dockerfile (producción optimizada)

# Build stage
FROM node:18-alpine AS builder

WORKDIR /app

COPY package*.json./
RUN npm ci --only=production

COPY..
RUN npm run build

# Production stage
FROM node:18-alpine AS production

WORKDIR /app

# Install dumb-init for proper signal handling
RUN apk add --no-cache dumb-init

# Copy built application
COPY --from=builder /app/dist./dist
COPY --from=builder /app/node_modules./node_modules
COPY --from=builder /app/package*.json./
COPY --from=builder /app/prisma./prisma

# Create logs directory
RUN mkdir -p logs

# Switch to non-root user
USER node

EXPOSE 3001

# Use dumb-init to handle signals properly
ENTRYPOINT ["dumb-init", "--"]
CMD ["npm", "run", "start:prod"]

Configuración de Nginx

events {
    worker_connections 1024;
}

http {
    upstream app_backend {
        server app:3001;
    }

    server {
        listen 80;
        server_name your-domain.com;

        # Security headers
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-XSS-Protection "1; mode=block" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header Referrer-Policy "no-referrer-when-downgrade" always;
        add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

        # Health check endpoint
        location /health {
            proxy_pass http://app_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        # endpoints de API
        location / {
            proxy_pass http://app_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # Timeout settings
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
        }

        # Logs
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
    }
}

Configuración ferroviaria

[build]
builder = "dockerfile"

[deploy]
healthcheckPath = "/health"
healthcheckTimeout = 300
restartPolicyType = "ON_FAILURE"
restartPolicyMaxRetries = 10

Medidas de seguridad

Variables de entorno

  • Todos los secretos almacenados de forma segura en Railway
  • No hay credenciales codificadas en el código
  • Configuraciones específicas del entorno

Seguridad de la red

  • El cortafuegos integrado del ferrocarril
  • HTTPS habilitado de forma predeterminada
  • Redes privadas entre servicios.

Seguridad de aplicaciones

  • Validación y desinfección de entradas
  • Verificación de firma HMAC para webhooks
  • Limitación de tarifa (ferrocarril incorporado)
  • Encabezados de seguridad a través de Nginx

Monitoreo y observabilidad

Controles de salud

  • Endpoint público: https://your-app.railway.app/health
  • Comprueba la conectividad de la base de datos y el uso de la memoria.
  • El ferrocarril monitorea y reinicia instancias en mal estado

Acceso a registros

# View application logs
railway logs

# View specific service logs
railway logs --service postgresql

Seguimiento

  • Interfaz de usuario de Jaeger accesible a través del panel de Railway
  • Seguimiento distribuido para flujos de solicitudes
  • Supervisión y depuración del rendimiento

Pipeline de CI/CD

GitHub Actions Flujo de trabajo

name: Deploy to Railway

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'
      - run: npm ci
      - run: npm run build
      - run: npm run test

  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - name: Deploy to Railway
        uses: railwayapp/railway-deploy@v1
        with:
          railway-token: ${{ secrets.RAILWAY_TOKEN }}

Estimación de costos

Tarifa ferroviaria (aproximada)

  • Solicitud: $5/mes (plan hobby)
  • PostgreSQL: $5/mes
  • Redis: $3/mes
  • Jäger: Nivel gratuito
  • Ancho de banda: Incluido en los planes

Costo Total Mensual: ~$13/mes

Estrategia de escalamiento

Escalado vertical

  • Aumentar el plan ferroviario para obtener más CPU/memoria
  • Actualizar instancias de base de datos

Escala horizontal

  • El ferrocarril maneja la escala automática
  • Múltiples instancias de aplicaciones detrás del balanceador de carga

Escalado de bases de datos

  • Agrupación de conexiones a través de Prisma
  • Leer réplicas para mucho tráfico

Solución de problemas

Problemas comunes

Error de conexión a la base de datos

# Check Railway variables
railway variables

# Test connection
railway run npm run prisma:studio

La firma del webhook no es válida

  • Verificar los secretos del webhook en el panel de Railway
  • Verifique la configuración del webhook del proveedor

Error en el control de salud

# Check logs
railway logs

# Manual health check
curl https://your-app.railway.app/health

Lista de verificación de implementación

  • Proyecto ferroviario creado
  • Servicios agregados (PostgreSQL, Redis)
  • Variables de entorno configuradas
  • Base de datos migrada
  • Aplicación implementada
  • Pasando el control de salud
  • Dominio configurado (opcional)
  • Endpoints de webhook probados
  • Configuración de monitoreo

Alternativas consideradas

AWS EC2 + RDS

Ventajas: Más control, ecosistema AWS familiar Contras: Configuración más compleja, mayor mantenimiento

renderizar

Ventajas: Implementación simple, servicios administrados Contras: Personalización limitada, dependencia del proveedor

Ferrocarril (Elegido)

Ventajas: Servicios integrados, escalado automático y fácil de usar para desarrolladores Contras: Menos control que la infraestructura autogestionada

Resultados de aprendizaje

Esta implementación muestra:

  • Estrategias de implementación de plataformas en la nube
  • Conceptos básicos de infraestructura como código
  • Mejores prácticas de seguridad para la producción.
  • Configuración de monitoreo y observabilidad.
  • Implementación de pipeline de CI/CD
  • Optimización de costos para aplicaciones pequeñas

Autor

Patrick Araujo - Ingeniero Informático Para ver otros proyectos y detalles de el portafolio, visite: https://pklavc.com/projects/


Esta exhibición demuestra habilidades prácticas de implementación en la nube para aplicaciones de producción.

GitHub Sponsors

Stack tecnológico

acoplador
Kubernetes
GitHub Actions
nginx
Infraestructura como código

Ver el código fuente

Abrir en GitHub