DevOps

Cloud Deployment Showcase | Docker

Infraestrutura pronta para produção demonstrando orquestração de contêineres, infraestrutura como código e pipelines automatizados de CI/CD

Contexto do problema, stack e tipo de sistema

Este projeto documenta a automação de implantação para serviços de backend, com conteinerização, CI/CD e controles operacionais para fluxos de trabalho de produção.

Escopo Técnico

  • Stack: Docker, Nginx, GitHub Actions, configuração de implantação
  • Tipo de sistema: sistema de automação de implantação de backend, fluxo de trabalho de CI/CD
  • Palavras-chave no contexto: sistema de automação, operações de backend, implantação de API

Projetos de backend operacionais relacionados: Event-Driven Integration Service e Aegis Sentinel.

Documentação completa do projeto

Cloud Deployment Showcase

Status de construção Plataforma: Ferrovia Docker Licença: MIT Infraestrutura: IaC

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

Etapa 1: configuração ferroviária

  1. 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 init
    
  2. Adicionar 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.

GitHub Sponsors

Stack tecnológica

Docker
Kubernetes
GitHub Actions
Nginx
Infraestrutura como código

Veja o código-fonte

Abrir em GitHub