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 :

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 :

  1. Configurer un bucket S3
  2. Ajouter les bibliothèques nécessaires,
  3. Configurer les clés d’accès
  4. Configurer Django
  5. 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',
}
Note

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.