Stockage de fichiers
Nous avons pris comme parti dans le chapitre précédent d’héberger nos fichiers sur le serveur où est déployée notre application. En cas de nécessité de déplacer ou redéployer le serveur, nous créons de facto une dépendance supplémentaire. La solution consiste à externaliser l’hébergement des fichiers statiques et utilisateurs vers un espace de stockage décentralisé (de notre application).
Il existe plusieurs manières de réaliser ceci ; le tout est de s’accorder sur une solution :
- Pour une architecture déployée sur site - sur un réseau privé ou autre -, un point de montage en CIFS ou NFS peut être largement suffisant,
- Dès que votre application dépassera les murs de votre réseau privé, les buckets compatibles S3 constituent une très bonne solution - et sont disponibles chez pratiquement tous les hébergeurs connus (Amazon, Scaleway ou OVH, pour ne citer qu’eux).
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))).
Hébergement S3
Pour cette partie, nous allons nous baser sur l’https://www.scaleway.com/en/object-storage/[Object Storage de Scaleway]. Ils offrent 75GB de stockage et de transfert par mois, ce qui va nous laisser suffisament d’espace pour jouer un peu.
# requirements.txt
django==3.2.8gunicornboto3django-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].
La première étape consiste à se rendre dans la console d’administration Scaleway, pour gérer ses identifiants et créer un jeton.
Selon la documentation de
django-storages, de
boto3
et de Scaleway, vous aurez besoin des clés suivantes au niveau du 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 deliveryAWS_IS_GZIPPED = TrueAWS_S3_OBJECT_PARAMETERS = { 'CacheControl': 'max-age=86400',}