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

# Déploiement sur DigitalOcean

> Déployez CaseBender sur DigitalOcean

## Aperçu

Ce guide vous accompagne dans le déploiement de CaseBender sur DigitalOcean en utilisant des images Docker préconstruites avec Kubernetes (DOKS) et des services managés.

## Prérequis

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

## Étape 1 : Configuration Initiale

### Installer et Configurer doctl

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

  # Authentification avec un token API

  doctl auth init

  # Configurer Docker pour le Registre de Conteneurs

  doctl registry login

  ```

  ```bash Linux theme={null}
  # Télécharger la dernière version
  cd ~/Downloads
  wget https://github.com/digitalocean/doctl/releases/download/v1.XX.X/doctl-1.XX.X-linux-amd64.tar.gz

  # Extraire et déplacer dans le PATH
  tar xf ~/Downloads/doctl-1.XX.X-linux-amd64.tar.gz
  sudo mv ~/Downloads/doctl /usr/local/bin

  # Authentification avec un token API
  doctl auth init

  # Configurer Docker pour le Registre de Conteneurs
  doctl registry login
  ```

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

  # Authentification avec un token API
  doctl auth init

  # Configurer Docker pour le Registre de Conteneurs
  doctl registry login
  ```
</CodeGroup>

## Étape 2 : Créer un Cluster Kubernetes

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

# Obtenir le kubeconfig
doctl kubernetes cluster kubeconfig save casebender
```

## Étape 3 : Configurer les Services Managés

### Créer des Spaces pour le Stockage d'Objets

```bash theme={null}
# Créer un bucket Spaces
doctl spaces create casebender-storage \
  --region nyc3

# Créer une clé d'accès Spaces
doctl spaces access-key create

# Note : Sauvegardez la clé d'accès et la clé secrète en lieu sûr
# Elles seront nécessaires pour la configuration de l'application
```

### Créer une Base de Données PostgreSQL Managée

```bash theme={null}
# Créer un cluster de base de données
doctl databases create \
  --engine pg \
  --name casebender-db \
  --region nyc1 \
  --size db-s-2vcpu-4gb \
  --version 14 \
  --num-nodes 1

# Créer une base de données
doctl databases db create casebender-db casebender

# Obtenir les détails de connexion
doctl databases connection casebender-db --format ConnectionString
```

### Créer un Redis Managé

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

# Obtenir les détails de connexion
doctl databases connection casebender-redis --format ConnectionString
```

## Étape 4 : Configurer le Registre de Conteneurs

```bash theme={null}
# Créer un registre de conteneurs
doctl registry create casebender-registry

# Obtenir le point de terminaison du registre
REGISTRY_ENDPOINT=$(doctl registry get-endpoint)

# Récupérer les images CaseBender
docker pull casebender/casebender:latest
docker pull casebender/workflow-processor:latest
docker pull casebender/misp-processor:latest

# Taguer les images pour le registre
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

# Pousser les images
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

# Ajouter le registre au cluster Kubernetes
doctl kubernetes cluster registry add casebender
```

## Étape 5 : Déployer sur Kubernetes

### Créer un Namespace

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

### Créer des Secrets

```bash theme={null}
# Créer des secrets pour la base de données et 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"

# Créer des secrets pour l'application
kubectl create secret generic app-secrets \
  --namespace casebender \
  --from-literal=auth-secret="votre-secret-auth" \
  --from-literal=auth-salt="votre-sel-auth"
```

### Déployer les Applications

Créez un fichier `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
```

Appliquez les déploiements :

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

### Créer des Services

Créez un fichier `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
```

Appliquez le service :

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

## Étape 7 : Configurer l'Ingress

### Installer le Contrôleur d'Ingress NGINX

```bash theme={null}
# Ajouter le dépôt Helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Installer le Contrôleur d'Ingress NGINX
helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace casebender \
  --set controller.publishService.enabled=true
```

### Configurer l'Ingress

Créez un fichier `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:
        - votre-domaine.com
      secretName: casebender-tls
  rules:
    - host: votre-domaine.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: casebender-app
                port:
                  number: 80
```

Appliquez l'ingress :

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

## Étape 8 : Configurer SSL avec cert-manager

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

# Créer un 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: votre-email@domaine.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx
EOF
```

## Surveillance et Maintenance

### Configurer la Surveillance

```bash theme={null}
# Installer le serveur de métriques
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# Déployer Prometheus et 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
```

### Configurer l'Auto-Scaling Horizontal des Pods

Créez un fichier `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
```

Appliquez le HPA :

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

## Sauvegarde et Reprise après Sinistre

### Sauvegardes de Base de Données

Les bases de données managées de DigitalOcean gèrent automatiquement les sauvegardes. Vous pouvez également :

```bash theme={null}
# Créer une sauvegarde manuelle
doctl databases backup casebender-db
```

### Configurer le Basculement de Base de Données

```bash theme={null}
# Activer le basculement automatique
doctl databases replica casebender-db create \
  --region sfo2
```

## Meilleures Pratiques de Sécurité

1. Activer le Pare-feu Cloud DigitalOcean
2. Utiliser le réseau privé
3. Implémenter des politiques réseau
4. Mises à jour de sécurité régulières
5. Activer la journalisation d'audit

## Optimisation des Coûts

1. Utiliser des tailles de nœuds appropriées
2. Implémenter l'auto-scaling
3. Utiliser le stockage par blocs judicieusement
4. Surveiller l'utilisation des ressources
5. Envisager des droplets réservés

## Prochaines Étapes

* Configurer un pipeline CI/CD
* Configurer des alertes de surveillance
* Implémenter une solution de journalisation
* Revoir les mesures de sécurité
