> ## Documentation Index
> Fetch the complete documentation index at: https://docs.casebender.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Implantar no DigitalOcean

> Implante o CaseBender no DigitalOcean

## 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](https://cloud.digitalocean.com/)
2. [doctl](https://docs.digitalocean.com/reference/doctl/how-to/install/) CLI instalado
3. [kubectl](https://kubernetes.io/docs/tasks/tools/) instalado
4. [Docker](https://docs.docker.com/get-docker/) instalado

## Passo 1: Configuração Inicial

### Instalar e Configurar doctl

<CodeGroup>
  ```bash macOS theme={null}
  # Usando Homebrew
  brew install doctl

  # Autenticar com token API

  doctl auth init

  # Configurar Docker para o Container Registry

  doctl registry login

  ```

  ```bash Linux theme={null}
  # Baixar a versão mais recente
  cd ~/Downloads
  wget https://github.com/digitalocean/doctl/releases/download/v1.XX.X/doctl-1.XX.X-linux-amd64.tar.gz

  # Extrair e mover para o path
  tar xf ~/Downloads/doctl-1.XX.X-linux-amd64.tar.gz
  sudo mv ~/Downloads/doctl /usr/local/bin

  # Autenticar com token API
  doctl auth init

  # Configurar Docker para o Container Registry
  doctl registry login
  ```

  ```powershell Windows theme={null}
  # Usando Chocolatey
  choco install doctl

  # Autenticar com token API
  doctl auth init

  # Configurar Docker para o Container Registry
  doctl registry login
  ```
</CodeGroup>

## Passo 2: Criar Cluster Kubernetes

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
# 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

```bash theme={null}
kubectl create namespace casebender
```

### Criar Secrets

```bash theme={null}
# 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`:

```yaml theme={null}
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:

```bash theme={null}
kubectl apply -f deployment.yaml
```

### Criar Serviços

Crie o arquivo `service.yaml`:

```yaml theme={null}
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:

```bash theme={null}
kubectl apply -f service.yaml
```

## Passo 7: Configurar Ingress

### Instalar Controlador NGINX Ingress

```bash theme={null}
# 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`:

```yaml theme={null}
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:

```bash theme={null}
kubectl apply -f ingress.yaml
```

## Passo 8: Configurar SSL com cert-manager

```bash theme={null}
# 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

```bash theme={null}
# 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`:

```yaml theme={null}
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:

```bash theme={null}
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:

```bash theme={null}
# Criar backup manual
doctl databases backup casebender-db
```

### Configurar Failover de Banco de Dados

```bash theme={null}
# 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
