> ## 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.

# Distribuzione su DigitalOcean

> Distribuisci CaseBender su DigitalOcean

## Panoramica

Questa guida ti accompagna attraverso la distribuzione di CaseBender su DigitalOcean utilizzando immagini Docker precostruite con Kubernetes (DOKS) e servizi gestiti.

## Prerequisiti

1. [Account DigitalOcean](https://cloud.digitalocean.com/)
2. [doctl](https://docs.digitalocean.com/reference/doctl/how-to/install/) CLI installato
3. [kubectl](https://kubernetes.io/docs/tasks/tools/) installato
4. [Docker](https://docs.docker.com/get-docker/) installato

## Passo 1: Configurazione Iniziale

### Installa e Configura doctl

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

  # Autentica con token API
  doctl auth init

  # Configura Docker per Container Registry
  doctl registry login
  ```

  ```bash Linux theme={null}
  # Scarica l'ultima versione
  cd ~/Downloads
  wget https://github.com/digitalocean/doctl/releases/download/v1.XX.X/doctl-1.XX.X-linux-amd64.tar.gz

  # Estrai e sposta nel path
  tar xf ~/Downloads/doctl-1.XX.X-linux-amd64.tar.gz
  sudo mv ~/Downloads/doctl /usr/local/bin

  # Autentica con token API
  doctl auth init

  # Configura Docker per Container Registry
  doctl registry login
  ```

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

  # Autentica con token API
  doctl auth init

  # Configura Docker per Container Registry
  doctl registry login
  ```
</CodeGroup>

## Passo 2: Crea Cluster Kubernetes

```bash theme={null}
# Crea cluster DOKS
doctl kubernetes cluster create casebender \
  --region nyc1 \
  --size s-2vcpu-4gb \
  --count 3 \
  --version latest

# Ottieni kubeconfig
doctl kubernetes cluster kubeconfig save casebender
```

## Passo 3: Configura Servizi Gestiti

### Crea Spaces per Storage Oggetti

```bash theme={null}
# Crea bucket Spaces
doctl spaces create casebender-storage \
  --region nyc3

# Crea chiave di accesso Spaces
doctl spaces access-key create

# Nota: Salva la chiave di accesso e la chiave segreta in modo sicuro
# Saranno necessarie per la configurazione dell'applicazione
```

### Crea PostgreSQL Gestito

```bash theme={null}
# Crea cluster database
doctl databases create \
  --engine pg \
  --name casebender-db \
  --region nyc1 \
  --size db-s-2vcpu-4gb \
  --version 14 \
  --num-nodes 1

# Crea database
doctl databases db create casebender-db casebender

# Ottieni dettagli connessione
doctl databases connection casebender-db --format ConnectionString
```

### Crea Redis Gestito

```bash theme={null}
# Crea cluster Redis
doctl databases create \
  --engine redis \
  --name casebender-redis \
  --region nyc1 \
  --size db-s-1vcpu-2gb \
  --version 7

# Ottieni dettagli connessione
doctl databases connection casebender-redis --format ConnectionString
```

## Passo 4: Configura Container Registry

```bash theme={null}
# Crea container registry
doctl registry create casebender-registry

# Ottieni endpoint registry
REGISTRY_ENDPOINT=$(doctl registry get-endpoint)

# Scarica immagini CaseBender
docker pull casebender/casebender:latest
docker pull casebender/workflow-processor:latest
docker pull casebender/misp-processor:latest

# Tagga immagini per 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

# Carica immagini
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

# Aggiungi registry al cluster Kubernetes
doctl kubernetes cluster registry add casebender
```

## Passo 5: Distribuisci su Kubernetes

### Crea Namespace

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

### Crea Segreti

```bash theme={null}
# Crea segreti per database 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"

# Crea segreti per applicazione
kubectl create secret generic app-secrets \
  --namespace casebender \
  --from-literal=auth-secret="your-auth-secret" \
  --from-literal=auth-salt="your-auth-salt"
```

### Distribuisci Applicazioni

Crea `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
```

Applica i deployment:

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

### Crea Servizi

Crea `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
```

Applica il servizio:

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

## Passo 7: Configura Ingress

### Installa Controller NGINX Ingress

```bash theme={null}
# Aggiungi repository Helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Installa Controller NGINX Ingress
helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace casebender \
  --set controller.publishService.enabled=true
```

### Configura Ingress

Crea `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:
        - your-domain.com
      secretName: casebender-tls
  rules:
    - host: your-domain.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: casebender-app
                port:
                  number: 80
```

Applica l'ingress:

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

## Passo 8: Configura SSL con cert-manager

```bash theme={null}
# Installa cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml

# Crea 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: your-email@domain.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx
EOF
```

## Passo 9: Configura Scalabilità Automatica

Crea `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
```

Applica l'HPA:

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

## Backup e Disaster Recovery

### Backup Database

I database gestiti DigitalOcean gestiscono automaticamente i backup. Puoi anche:

```bash theme={null}
# Crea backup manuale
doctl databases backup casebender-db
```

### Configura Failover Database

```bash theme={null}
# Abilita failover automatico
doctl databases replica casebender-db create \
  --region sfo2
```

## Migliori Pratiche di Sicurezza

1. Abilita DigitalOcean Cloud Firewall
2. Usa rete privata
3. Implementa policy di rete
4. Aggiornamenti di sicurezza regolari
5. Abilita logging di audit

## Ottimizzazione dei Costi

1. Usa dimensioni nodo appropriate
2. Implementa scalabilità automatica
3. Usa storage a blocchi con saggezza
4. Monitora utilizzo risorse
5. Considera droplet riservati

## Prossimi Passi

* Configura pipeline CI/CD
* Configura avvisi monitoraggio
* Implementa soluzione logging
* Rivedi misure di sicurezza
