Ce document décrit la configuration du stockage S3 (MinIO) pour le projet CAL POC.
L'application utilise un seul bucket : cal-uploads
cal-uploads/
├── registrations/ # Certificats médicaux (PDF)
│ └── {random-id}-{filename}.pdf
├── gallery/ # Photos de la galerie
│ └── {random-id}-{filename}.jpg
├── sponsors/ # Logos des sponsors
│ └── {random-id}-{filename}.png
└── images/ # Autres images (fallback)
└── {random-id}-{filename}.jpg
Le bucket cal-uploads est créé automatiquement au démarrage de Docker Compose via le service minio-init.
Fichier : scripts/init-minio.sh
Actions effectuées :
- ✅ Attend que MinIO soit prêt (healthcheck)
- ✅ Configure le client MinIO (
mc) - ✅ Crée le bucket
cal-uploads(si inexistant) - ✅ Configure l'accès public en lecture (
s3:GetObject) - ✅ Affiche un résumé de la configuration
# Démarrer tous les services (inclut minio-init)
docker compose up -d
# Voir les logs d'initialisation
docker compose logs minio-init
# Redémarrer uniquement l'initialisation
docker compose restart minio-initSi vous préférez créer le bucket manuellement :
- Ouvrir http://localhost:9001
- Se connecter avec
minioadmin/minioadmin123 - Aller dans Buckets → Create Bucket
- Nom :
cal-uploads - Access Policy : Public (lecture seule)
# Installer le client MinIO
brew install minio/stable/mc # macOS
# ou
wget https://dl.min.io/client/mc/release/linux-amd64/mc # Linux
# Configurer l'alias
mc alias set local http://localhost:9000 minioadmin minioadmin123
# Créer le bucket
mc mb local/cal-uploads
# Configurer l'accès public
mc anonymous set download local/cal-uploadsPermet aux utilisateurs de voir les images/fichiers uploadés (galerie, sponsors) :
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": ["*"] },
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::cal-uploads/*"]
}
]
}Les uploads sont protégés :
- Authentification via credentials MinIO (API backend uniquement)
- Rate limiting (10 uploads/minute par IP)
- Validation des fichiers (type MIME, taille, extension)
Fichier : .env.local
# MinIO / S3 Configuration
S3_ENDPOINT=http://localhost:9000 # Endpoint MinIO (dev)
S3_REGION=eu-west-1 # Région fictive (MinIO)
S3_BUCKET_NAME=cal-uploads # Nom du bucket
S3_ACCESS_KEY_ID=minioadmin # Access Key
S3_SECRET_ACCESS_KEY=minioadmin123 # Secret Key
# URL publique pour les fichiers (frontend)
NEXT_PUBLIC_S3_PUBLIC_URL=http://localhost:9000/cal-uploadsPour utiliser AWS S3 en production :
S3_ENDPOINT= # Laisser vide pour AWS
S3_REGION=eu-west-1 # Région AWS
S3_BUCKET_NAME=cal-uploads-prod
S3_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXX
S3_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxx
NEXT_PUBLIC_S3_PUBLIC_URL=https://cal-uploads-prod.s3.eu-west-1.amazonaws.com# Upload d'une image (galerie)
curl -X POST http://localhost:3000/api/uploads/image \
-F "file=@photo.jpg" \
-F "context=gallery"
# Upload d'un certificat médical
curl -X POST http://localhost:3000/api/uploads/registration \
-F "file=@certificat.pdf" \
-F "turnstile-token=dev-bypass"# Lister les fichiers
mc ls local/cal-uploads
# Lister par préfixe
mc ls local/cal-uploads/gallery/
mc ls local/cal-uploads/registrations/
mc ls local/cal-uploads/sponsors/
# Télécharger un fichier
mc cp local/cal-uploads/gallery/abc123-photo.jpg ./URL : http://localhost:9001
Métriques disponibles :
- Espace disque utilisé
- Nombre d'objets par bucket
- Trafic réseau (upload/download)
- API calls
# Logs du service MinIO
docker compose logs -f minio
# Logs de l'application (uploads)
docker compose logs -f web | grep upload# Supprimer les fichiers de test
mc rm --recursive --force local/cal-uploads/test/
# Supprimer un fichier spécifique
mc rm local/cal-uploads/gallery/old-photo.jpg# Backup local
mc mirror local/cal-uploads ./backups/cal-uploads/
# Backup vers S3 AWS
mc mirror local/cal-uploads s3-prod/cal-uploads-backup/# Depuis backup local
mc mirror ./backups/cal-uploads/ local/cal-uploads/
# Depuis S3 AWS
mc mirror s3-prod/cal-uploads-backup/ local/cal-uploads/Erreur : NoSuchBucket: The specified bucket does not exist
Solution :
# Relancer l'initialisation
docker compose restart minio-init
# Ou créer manuellement
mc mb local/cal-uploadsErreur : AccessDenied: Access Denied
Solutions :
- Vérifier les credentials dans
.env.local - Vérifier la politique d'accès du bucket
- Vérifier que le bucket est bien
publicen lecture
mc anonymous get local/cal-uploads
# Devrait afficher : downloadProblème : Les URLs retournent 403 Forbidden
Solution : Configurer l'accès public
mc anonymous set download local/cal-uploadsErreur : Permission denied sur /init-minio.sh
Solution :
# Rendre le script exécutable (Linux/macOS)
chmod +x scripts/init-minio.sh
# Ou reconstruire le service
docker compose down minio-init
docker compose up -d minio-init- Console MinIO : http://localhost:9001
- API MinIO : http://localhost:9000
- URL publique : http://localhost:9000/cal-uploads
- Code source :
- src/lib/storage/s3.ts - Client S3
- src/app/api/uploads/image/route.ts - Upload images
- src/app/api/uploads/registration/route.ts - Upload PDF
Dernière mise à jour : 2025-01-23