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
- Compte DigitalOcean
- doctl CLI installé
- kubectl installé
- Docker installé
Étape 1 : Configuration Initiale
Étape 2 : Créer un Cluster Kubernetes
# 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
Créer des Spaces pour le Stockage d’Objets
# 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
# 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é
# 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
# 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
kubectl create namespace casebender
Créer des Secrets
# 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
:
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 :
kubectl apply -f deployment.yaml
Créer des Services
Créez un fichier service.yaml
:
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 :
kubectl apply -f service.yaml
Installer le Contrôleur d’Ingress NGINX
# 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
Créez un fichier 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:
- 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 :
kubectl apply -f ingress.yaml
# 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
# 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
Créez un fichier 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
Appliquez le HPA :
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 :
# Créer une sauvegarde manuelle
doctl databases backup casebender-db
# Activer le basculement automatique
doctl databases replica casebender-db create \
--region sfo2
Meilleures Pratiques de Sécurité
- Activer le Pare-feu Cloud DigitalOcean
- Utiliser le réseau privé
- Implémenter des politiques réseau
- Mises à jour de sécurité régulières
- Activer la journalisation d’audit
Optimisation des Coûts
- Utiliser des tailles de nœuds appropriées
- Implémenter l’auto-scaling
- Utiliser le stockage par blocs judicieusement
- Surveiller l’utilisation des ressources
- 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é