Aller au contenu

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.

Fenêtre de terminal
# 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 :

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 delivery
AWS_IS_GZIPPED = True
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}