Cloud Deployment Showcase
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
- Cuenta ferroviaria (https://railway.app)
- GitHub repositorio
- Nombre de dominio (opcional)
Paso 1: Configuración del ferrocarril
Crear proyecto ferroviario
# Connect your GitHub repository git clone https://github.com/PkLavc/cloud-deployment-showcase.git cd cloud-deployment-showcase railway login railway initAgregar 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.