&1 | grep -q "NoSuchBucket"; then
echo "❌ Bucket '$S3_BUCKET' does not exist"
echo "🪣 Creating bucket '$S3_BUCKET'..."
s3cmd mb s3://"$S3_BUCKET"
fi
```
Note:
- Dans notre CI, on vérifie si le bucket existe
- S'il n'existe pas, on le crée automatiquement
---
```
# Sync files to S3 bucket
s3cmd sync \
--acl-public \ # Make files public
--no-mime-magic \ # Disable automatic MIME type detection
--guess-mime-type \ # Enable file extension MIME type detection
source-repo/dist/ s3://"$S3_BUCKET"/
# Configure S3 bucket
s3cmd ws-create s3://"$S3_BUCKET" \
--ws-index=index.html --ws-error=index.html
# Deployment complete!
```
Note:
- s3cmd sync : synchronise le contenu d’un dossier local avec un bucket S3 (upload les fichiers manquants ou modifiés)
- --acl-public : rend les fichiers copiés accessibles publiquement
- --no-mime-magic : désactive l’utilisation de la lib python-magic pour détecter le type MIME (ça peut éviter des erreurs ou incohérences)
- --guess-mime-type : force s3cmd à deviner le type MIME à partir de l’extension du fichier (par ex. .html → text/html)
---
### 🗺️ Exposition du front
- Infrastructure sur **Kubernetes**
- **Istio** fait office de reverse proxy aux buckets S3
- Routes *SPA* de Vue.js réécrites pour renvoyer vers `/`
Note:
- Istio : outil pour gérer les microservices dans un cluster Kubernetes
- Ici utilisé comme reverse proxy (serveur "passe-plats" qui fait passer les demandes des utilisateurs vers un autre serveur)
- Pas d'exposition directe des buckets
- Flexibilité dans la configuration qui s'adapte à chaque instance
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: {{ include "campulse.fullname" . }}-front
labels:
{{- include "campulse.labels" . | nindent 4 }}
annotations:
link.argocd.argoproj.io/frontend: 'https://{{ .Values.frontBaseURL }}'
spec:
hosts:
- {{ .Values.frontBaseURL }}
gateways:
- istio-gateway/wildcard-pprd-etu-campulse-fr-gateway
http:
- match:
- port: 80
redirect:
scheme: https
port: 443
- match:
- uri:
prefix: /assets
- uri:
exact: /favicon.ico
- uri:
regex: '.*\.(css|gif|ico|jpg|js|png|swf|txt|svg|woff|ttf|eot|woff2)$'
route:
- destination:
host: {{ .Values.bucketURL }}
port:
number: 443
headers:
request:
set:
host: {{ .Values.bucketURL }}
- match:
- uri:
regex: "/(.*)"
rewrite:
uri: /
headers:
request:
set:
host: {{ .Values.bucketURL }}
route:
- destination:
host: {{ .Values.bucketURL }}
port:
number: 443
Note:
- Fichier de configuration Istio, ressource VirtualService qui sert à gérer et contrôler le routage du trafic (reverse proxy)
- Redirige automatiquement tout le trafic HTTP (port 80) vers HTTPS (port 443) pour sécuriser les connexions
- Toutes les requêtes visant des ressources statiques telles que les images, polices, ou fichiers CSS/JS restent accessibles directement depuis leur emplacement d’origine
- Toute requête est réécrite vers /, ce qui est typiquement utilisé pour les applications monopage (SPA), cela permet, par exemple, qu’une requête vers /dashboard ou /profile renvoie le fichier index.html (et donc l’application front-end), qui gérera ensuite le routage côté client.
---
### 💡 Avantages de cette solution
- **Scalabilité** : 2 buckets par établissement, facilement déployables
- **Sécurité** : pas de clé SSH dans la CI, accès S3 uniquement
- **Simplicité** : console S3 facile à utiliser pour gérer l'ensemble des buckets à partir de 2 endpoints
- **Pertinence** : fichiers statiques, non sensibles
---
### 🧪 Conclusion
- Hébergement **statique, sécurisé, multi-locataire**
- Parfaitement adapté aux contextes institutionnels
- Allie **automatisation**, **personnalisation** et **robustesse**
- Compatible avec des pipelines DevOps modernes
Note:
- Fonctionne aussi avec des VM dans le cas d'une archi en transition
---
### 🙏 Merci !
Merci d’avoir suivi la présentation, vos questions et retours sont les bienvenus.
Contact : pgilg@unistra.fr