Visão Geral

Este guia orienta você na implantação do CaseBender no DigitalOcean usando imagens Docker pré-construídas com Kubernetes (DOKS) e serviços gerenciados.

Pré-requisitos

  1. Conta DigitalOcean
  2. doctl CLI instalado
  3. kubectl instalado
  4. Docker instalado

Passo 1: Configuração Inicial

Instalar e Configurar doctl

# Usando Homebrew
brew install doctl

# Autenticar com token API

doctl auth init

# Configurar Docker para o Container Registry

doctl registry login

Passo 2: Criar Cluster Kubernetes

# Criar cluster DOKS
doctl kubernetes cluster create casebender \
  --region nyc1 \
  --size s-2vcpu-4gb \
  --count 3 \
  --version latest

# Obter kubeconfig
doctl kubernetes cluster kubeconfig save casebender

Passo 3: Configurar Serviços Gerenciados

Criar Spaces para Armazenamento de Objetos

# Criar bucket Spaces
doctl spaces create casebender-storage \
  --region nyc3

# Criar chave de acesso Spaces
doctl spaces access-key create

# Nota: Salve a chave de acesso e a chave secreta com segurança
# Elas serão necessárias para a configuração da aplicação

Criar PostgreSQL Gerenciado

# Criar cluster de banco de dados
doctl databases create \
  --engine pg \
  --name casebender-db \
  --region nyc1 \
  --size db-s-2vcpu-4gb \
  --version 14 \
  --num-nodes 1

# Criar banco de dados
doctl databases db create casebender-db casebender

# Obter detalhes de conexão
doctl databases connection casebender-db --format ConnectionString

Criar Redis Gerenciado

# Criar cluster Redis
doctl databases create \
  --engine redis \
  --name casebender-redis \
  --region nyc1 \
  --size db-s-1vcpu-2gb \
  --version 7

# Obter detalhes de conexão
doctl databases connection casebender-redis --format ConnectionString

Passo 4: Configurar Container Registry

# Criar container registry
doctl registry create casebender-registry

# Obter endpoint do registry
REGISTRY_ENDPOINT=$(doctl registry get-endpoint)

# Baixar imagens do CaseBender
docker pull casebender/casebender:latest
docker pull casebender/workflow-processor:latest
docker pull casebender/misp-processor:latest

# Marcar imagens para o registry
docker tag casebender/casebender:latest registry.digitalocean.com/casebender-registry/app:latest
docker tag casebender/workflow-processor:latest registry.digitalocean.com/casebender-registry/workflow-processor:latest
docker tag casebender/misp-processor:latest registry.digitalocean.com/casebender-registry/misp-processor:latest

# Enviar imagens
docker push registry.digitalocean.com/casebender-registry/app:latest
docker push registry.digitalocean.com/casebender-registry/workflow-processor:latest
docker push registry.digitalocean.com/casebender-registry/misp-processor:latest

# Adicionar registry ao cluster Kubernetes
doctl kubernetes cluster registry add casebender

Passo 5: Implantar no Kubernetes

Criar Namespace

kubectl create namespace casebender

Criar Secrets

# Criar secrets para banco de dados e Redis
kubectl create secret generic db-credentials \
  --namespace casebender \
  --from-literal=postgres-url="postgresql://doadmin:password@casebender-db-do-user-1234567-0.b.db.ondigitalocean.com:25060/casebender?sslmode=require" \
  --from-literal=redis-url="rediss://default:password@casebender-redis-do-user-1234567-0.b.db.ondigitalocean.com:25061"

# Criar secrets para aplicação
kubectl create secret generic app-secrets \
  --namespace casebender \
  --from-literal=auth-secret="seu-segredo-de-autenticação" \
  --from-literal=auth-salt="seu-salt-de-autenticação"

Implantar Aplicações

Crie o arquivo deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: casebender-app
  namespace: casebender
spec:
  replicas: 2
  selector:
    matchLabels:
      app: casebender-app
  template:
    metadata:
      labels:
        app: casebender-app
    spec:
      containers:
        - name: app
          image: registry.digitalocean.com/casebender-registry/app:latest
          ports:
            - containerPort: 3000
          env:
            - name: AUTH_SECRET
              valueFrom:
                secretKeyRef:
                  name: app-secrets
                  key: auth-secret
            - name: AUTH_SALT
              valueFrom:
                secretKeyRef:
                  name: app-secrets
                  key: auth-salt
            - name: POSTGRES_PRISMA_URL
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: postgres-url
            - name: REDIS_URL
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: redis-url
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: workflow-processor
  namespace: casebender
spec:
  replicas: 1
  selector:
    matchLabels:
      app: workflow-processor
  template:
    metadata:
      labels:
        app: workflow-processor
    spec:
      containers:
        - name: processor
          image: registry.digitalocean.com/casebender-registry/workflow-processor:latest
          env:
            - name: POSTGRES_PRISMA_URL
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: postgres-url
            - name: REDIS_URL
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: redis-url
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: misp-processor
  namespace: casebender
spec:
  replicas: 1
  selector:
    matchLabels:
      app: misp-processor
  template:
    metadata:
      labels:
        app: misp-processor
    spec:
      containers:
        - name: processor
          image: registry.digitalocean.com/casebender-registry/misp-processor:latest
          env:
            - name: POSTGRES_PRISMA_URL
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: postgres-url
            - name: REDIS_URL
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: redis-url

Aplique os deployments:

kubectl apply -f deployment.yaml

Criar Serviços

Crie o arquivo service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: casebender-app
  namespace: casebender
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 3000
  selector:
    app: casebender-app

Aplique o serviço:

kubectl apply -f service.yaml

Passo 7: Configurar Ingress

Instalar Controlador NGINX Ingress

# Adicionar repositório Helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Instalar Controlador NGINX Ingress
helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace casebender \
  --set controller.publishService.enabled=true

Configurar Ingress

Crie o arquivo ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: casebender-ingress
  namespace: casebender
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - seu-dominio.com
      secretName: casebender-tls
  rules:
    - host: seu-dominio.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: casebender-app
                port:
                  number: 80

Aplique o ingress:

kubectl apply -f ingress.yaml

Passo 8: Configurar SSL com cert-manager

# Instalar cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml

# Criar ClusterIssuer
cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: seu-email@dominio.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx
EOF

Monitoramento e Manutenção

Configurar Monitoramento

# Instalar metrics server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# Implantar Prometheus e Grafana
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace

Configurar Escalonamento Horizontal de Pods

Crie o arquivo hpa.yaml:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: casebender-app-hpa
  namespace: casebender
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: casebender-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 80

Aplique o HPA:

kubectl apply -f hpa.yaml

Backup e Recuperação de Desastres

Backups de Banco de Dados

Os bancos de dados gerenciados do DigitalOcean lidam automaticamente com backups. Você também pode:

# Criar backup manual
doctl databases backup casebender-db

Configurar Failover de Banco de Dados

# Habilitar failover automático
doctl databases replica casebender-db create \
  --region sfo2

Melhores Práticas de Segurança

  1. Habilitar Firewall na Nuvem do DigitalOcean
  2. Usar rede privada
  3. Implementar políticas de rede
  4. Atualizações regulares de segurança
  5. Habilitar registro de auditoria

Otimização de Custos

  1. Usar tamanhos de nós apropriados
  2. Implementar auto-escalonamento
  3. Usar armazenamento em bloco com sabedoria
  4. Monitorar uso de recursos
  5. Considerar droplets reservados

Próximos Passos

  • Configurar pipeline de CI/CD
  • Configurar alertas de monitoramento
  • Implementar solução de registro
  • Revisar medidas de segurança