Cloud Deployment Showcase
Visão geral do projeto
Uma demonstração abrangente de padrões de implantação em nuvem prontos para produção para aplicativos Web modernos. Este projeto apresenta estratégias de implantação de nível empresarial, incluindo implantação em várias nuvens, orquestração de contêineres, infraestrutura como código, práticas recomendadas de segurança, monitoramento e fluxos de trabalho de CI/CD.
Arquitetura
Mapa de infraestrutura 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 engenharia e interesse nacional
| Componente | Implementação | Valor da Indústria |
|---|---|---|
| Alta disponibilidade | Dimensionamento horizontal + recuperação automática | Minimiza o tempo de inatividade do serviço digital |
| Arquitetura de Segurança | Confiança Zero e Endurecimento Nginx | Protege dados confidenciais contra ameaças cibernéticas |
| Observabilidade | Rastreamento Distribuído Jaeger | Resposta rápida a incidentes e otimização de desempenho |
| Automação | CI/CD completo via GitHub Actions | Acelera o ciclo de vida de entrega de software (SDLC) |
Componentes
- Plataforma Ferroviária: Hospedagem em nuvem com escalonamento automático e serviços gerenciados
- Nginx: proxy reverso, balanceador de carga e gateway de segurança
- PostgreSQL: Serviço de banco de dados gerenciado com backups automáticos
- Redis: Cache gerenciado e serviço de fila para alto desempenho
- Jaeger: Plataforma distribuída de rastreamento e observabilidade
- Docker: Conteinerização para ambientes de implantação consistentes
Guia de implantação
Pré-requisitos
- Conta ferroviária (https://railway.app)
- GitHub repositório
- Nome de domínio (opcional)
Etapa 1: configuração ferroviária
Criar projeto ferroviário
# Connect your GitHub repository git clone https://github.com/PkLavc/cloud-deployment-showcase.git cd cloud-deployment-showcase railway login railway initAdicionar serviços
# Add PostgreSQL railway add postgresql # Add Redis railway add redis # Add Jaeger (optional, for tracing) railway add jaeger
Etapa 2: Variáveis de Ambiente
Defina as seguintes variáveis de ambiente no painel Railway:
# 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
Etapa 3: migração de banco de dados
# Run migrations on Railway
railway run npm run prisma:migrate
# Generate Prisma client
railway run npm run prisma:generate
Etapa 4: implantar
# Deploy to Railway
railway up
O Railway irá construir e implantar automaticamente usando o Dockerfile fornecido.
Arquivos de configuração
Dockerfile (otimizado para produção)
# 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"]
Configuração 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;
}
}
Configuração Ferroviária
[build]
builder = "dockerfile"
[deploy]
healthcheckPath = "/health"
healthcheckTimeout = 300
restartPolicyType = "ON_FAILURE"
restartPolicyMaxRetries = 10
Medidas de segurança
Variáveis de ambiente
- Todos os segredos armazenados com segurança no Railway
- Nenhuma credencial codificada no código
- Configurações específicas do ambiente
Segurança de rede
- Firewall integrado da ferrovia
- HTTPS ativado por padrão
- Rede privada entre serviços
Segurança de aplicativos
- Validação e higienização de entrada
- Verificação de assinatura HMAC para webhooks
- Limitação de taxa (ferrovia integrada)
- Cabeçalhos de segurança via Nginx
Monitoramento e Observabilidade
Verificações de saúde
- Endpoint público:
https://your-app.railway.app/health - Verifica a conectividade do banco de dados e o uso de memória
- Railway monitora e reinicia instâncias não íntegras
Acesso aos registros
# View application logs
railway logs
# View specific service logs
railway logs --service postgresql
Rastreamento
- UI Jaeger acessível através do painel Railway
- Rastreamento distribuído para fluxos de solicitação
- Monitoramento e depuração de desempenho
Pipeline de CI/CD
GitHub Actions Fluxo de trabalho
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 }}
Estimativa de custos
Preço Ferroviário (Aproximado)
- Aplicação: $ 5/mês (plano de hobby)
- PostgreSQL: $ 5/mês
- Redis: $ 3/mês
- Jaeger: Nível gratuito
- Largura de banda: Incluído nos planos
Custo mensal total: ~$13/mês
Estratégia de escalonamento
Escala vertical
- Aumente o plano Railway para mais CPU/memória
- Atualizar instâncias de banco de dados
Escala horizontal
- Ferrovia lida com escalonamento automático
- Várias instâncias de aplicativos por trás do balanceador de carga
Dimensionamento de banco de dados
- Pool de conexões via Prisma
- Leia réplicas para alto tráfego
Solução de problemas
Problemas comuns
Falha na conexão com o banco de dados
# Check Railway variables
railway variables
# Test connection
railway run npm run prisma:studio
Assinatura do webhook inválida
- Verifique os segredos do webhook no painel do Railway
- Verifique a configuração do webhook do provedor
Falha na verificação de integridade
# Check logs
railway logs
# Manual health check
curl https://your-app.railway.app/health
Lista de verificação de implantação
- Projeto ferroviário criado
- Serviços adicionados (PostgreSQL, Redis)
- Variáveis de ambiente configuradas
- Banco de dados migrado
- Aplicativo implantado
- Aprovação no exame de saúde
- Domínio configurado (opcional)
- Endpoints de webhook testados
- Configuração de monitoramento
Alternativas consideradas
AWS EC2 + RDS
Prós: Mais controle, ecossistema AWS familiar Contras: Configuração mais complexa, maior manutenção
Renderizar
Prós: Implantação simples, serviços gerenciados Contras: Personalização limitada, dependência do fornecedor
Ferrovia (escolhida)
Prós: Fácil desenvolvimento, escalonamento automático e serviços integrados Contras: Menos controle do que a infraestrutura autogerenciada
Resultados de aprendizagem
Esta implantação mostra:
- Estratégias de implantação de plataforma em nuvem
- Infraestrutura como fundamentos do código
- Melhores práticas de segurança para produção
- Configuração de monitoramento e observabilidade
- Implementação de pipeline CI/CD
- Otimização de custos para pequenas aplicações
Autor
Patrick Araujo - Engenheiro de Computação Para visualizar outros projetos e detalhes do portfólio, visite: https://pklavc.com/projects/
Esta vitrine demonstra habilidades práticas de implantação de nuvem para aplicações de produção.