7 File storage
Dans le chapitre précédent, nous avons vu comment héberger des fichiers directement sur le serveur où est déployée notre application. Cependant, cette approche crée une dépendance supplémentaire qui peut compliquer le déploiement et la scalabilité. Pour surmonter ces limitations, il est essentiel d’externaliser l’hébergement des fichiers statiques et utilisateurs vers un espace de stockage décentralisé
Il existe plusieurs solutions pour externaliser le stockage des fichiers :
- Pour les architectures sur site : Un point de montage en CIFS (Common Internet File System) ou NFS (Network File System) peut être largement suffisant. Ces protocoles permettent de partager des fichiers sur un réseau privé de manière efficace. Votre application peut être simplement configurée pour pointer vers ces points de montage, et ainsi ne pas impacter la scalabilité ou la maintenance.
- Pour les architectures cloud : Les buckets compatibles S3 (Simple Storage Service) constituent une excellente solution. Ils sont disponibles chez la plupart des hébergeurs cloud, tels qu’Amazon, Scaleway et OVH. Heroku (((Heroku))) - que nous verrons au prochain chapitre - propose des espaces de déploiements, mais pas d’espace de stockage. Il est possible d’y envoyer des fichiers utilisateurs (typiquement, des media personnalisés), mais ceux-ci seront perdus lors du redémarrage du container. Il est donc primordial de configurer correctement l’hébergement des fichiers média, de préférences sur un stockage compatible S3 (((S3))).
7.1 Stockage CIFS/SMB
CIFS (Common Internet File System) est un protocole de partage de fichiers qui permet aux utilisateurs d’accéder aux fichiers et aux ressources partagées sur un réseau local (LAN) ou étendu (WAN). Développé à l’origine par Microsoft, CIFS est une extension du protocole SMB (Server Message Block) et est largement utilisé dans les environnements Windows.
Ce protocole permet aux utilisateurs d’accéder, de lire, d’écrire et de modifier des fichiers sur des serveurs distants comme s’ils étaient stockés localement, et supporte l’authentification et le chiffrement pour sécuriser les données transmises.
NFS (Network File System) est un protocole de système de fichiers distribué développé par Sun Microsystems. Il permet aux utilisateurs d’accéder aux fichiers sur un réseau de manière transparente, comme s’ils étaient stockés localement sur leur propre machine.
CIFS et NFS sont suffisants pour une utilisation locale, pour les raisons suivantes :
- Simplicité : CIFS et NFS sont faciles à configurer et à gérer, ce qui les rend idéaux pour les réseaux locaux où les ressources sont centralisées.
- Performance : Les protocoles sont optimisés pour les réseaux locaux, offrant des vitesses de transfert de données élevées et une faible latence.
- Coût : Les solutions CIFS et NFS sont généralement moins coûteuses à mettre en œuvre et à maintenir que les solutions de stockage cloud.
- Intégration : Ils s’intègrent bien avec les systèmes d’exploitation existants et les infrastructures réseau, ce qui facilite leur adoption.
7.2 Stockage S3
Un bucket S3 (Simple Storage Service) est un conteneur de stockage offert initialement par Amazon Web Services (AWS) et compatible avec d’autres fournisseurs de cloud. Il permet de stocker et de récupérer des objets (fichiers) via une interface de programmation (API). Les buckets S3 sont conçus pour offrir une scalabilité, une disponibilité et une durabilité élevées.
Grosso-modo, nous pouvons extrapoler le protocole S3 comme étant une alternative “cloud” et sous-traitée aux protocoles réseaux classiques.
Pour illustrer l’approche d’un hébergement S3, nous allons utiliser l’https://www.scaleway.com/en/object-storage/[Object Storage de Scaleway], qui offre 75 Go de stockage et de transfert par mois. Voici les étapes pour configurer un bucket S3 et héberger vos fichiers :
- Configurer un bucket S3
- Ajouter les bibliothèques nécessaires,
- Configurer les clés d’accès
- Configurer Django
- Optimisation des performances.
7.2.1 Configuration du bucket S3
- Créez un compte sur Scaleway et accédez à la console d’administration.
- Naviguez vers la section Object Storage et créez un nouveau bucket.
7.2.2 Ajout des bibliothèques nécessaires
# requirements.txt
django==3.2.8
gunicorn
boto3
django-storages

L’idée est qu’au moment de la construction des fichiers statiques, Django aille simplement les héberger sur un espace de stockage compatible S3. La complexité va être de configurer correctement les différents points de terminaison. Pour héberger nos fichiers sur notre bucket S3, il va falloir suivre et appliquer quelques étapes dans l’ordre :
- Configurer un bucket compatible S3 - je parlais de Scaleway, mais il y en a - littéralement - des dizaines.
- Ajouter la librairie
boto3, qui s’occupera de dialoguer avec ce type de protocole - Ajouter la librairie
django-storage, qui va elle s’occuper de faire le câblage entre le fournisseur (via+boto3+) et Django, qui s’attend à ce qu’on lui donne un moteur de gestion via la clé https://docs.djangoproject.com/en/3.2/ref/settings/#std:setting-STATICFILES_STORAGE[DJANGO_STATICFILES_STORAGE].
7.2.3 Configuration des clés d’accès
- Accédez à la console d’administration Scaleway et créez un nouveau jeton d’API.
- Notez les clés d’accès (AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY).
La première étape consiste à se rendre dans https://console.scaleway.com/project/credentials[la console d’administration Scaleway], pour gérer ses identifiants et créer un jeton.

7.2.4 Configuration de Django
Selon la documentation de https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings[django-storages], de https://boto3.amazonaws.com/v1/documentation/api/latest/index.html[boto3] et de https://www.scaleway.com/en/docs/tutorials/deploy-saas-application/[Scaleway], vous aurez besoin des clés suivantes au niveau du fichier settings.py.
Ajoutez les clés d’accès et les paramètres de configuration dans votre fichier settings.py :
AWS_ACCESS_KEY_ID = os.getenv('ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME = os.getenv('AWS_S3_REGION_NAME')
AWS_DEFAULT_ACL = 'public-read'
AWS_LOCATION = 'static'
AWS_S3_SIGNATURE_VERSION = 's3v4'
AWS_S3_HOST = 's3.%s.scw.cloud' % (AWS_S3_REGION_NAME,)
AWS_S3_ENDPOINT_URL = 'https://%s' % (AWS_S3_HOST, )
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3ManifestStaticStorage'
STATIC_URL = '%s/%s/' % (AWS_S3_ENDPOINT_URL, AWS_LOCATION)
# General optimization for faster delivery
AWS_IS_GZIPPED = True
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
Idéalement et pour respecter nos 12-facteurs, tous ces paramètres devraient pouvoir être modifiés depuis les variables d’environnement.
7.2.5 Optimisation des performances
- Utilisez la compression GZIP pour améliorer les performances de livraison des fichiers.
- Configurez les paramètres de cache pour optimiser la vitesse de chargement.
7.3 Conclusion
Externaliser le stockage des fichiers est essentiel pour garantir la scalabilité et la fiabilité de votre application. En utilisant des solutions comme les buckets S3, vous pouvez facilement gérer et déployer vos fichiers statiques et utilisateurs de manière efficace. Assurez-vous de suivre les bonnes pratiques de sécurité et d’optimisation pour tirer le meilleur parti de votre solution de stockage.