Utiliser un support externe pour les médias Django

Le problème exposé dans ce sujet a été résolu.

Bonjour !

Je suis actuellement sur un petit projet personnel consistant en un serveur Django installé sur un Raspberry Pi 4. Pour gagner de la place, je cherche à stocker les fichiers médias de Django sur un disque dur externe, branché en USB au Raspberry Pi. Or, se pose alors une question : comment prévoir le cas où le disque dur serait débranché ? Je n’ai pas vraiment l’habitude du sysadmin, donc j’avoue ne pas vraiment connaitre les canons ou les « bonnes pratiques » à ce sujet. Du coup : auriez-vous des recommandations sur une façon « propre » de s’assurer que le disque dur est bien branché avant d’y accéder ?

Le disque dur étant chiffré, j’ai pour l’instant un petit script bash qui le déchiffre et le monte dans /media/HDD. Or, même lorsqu’il est démonté, le dossier /media/HDD existe toujours, je ne peux donc pas me contenter de vérifier que le dossier existe. Devrais-je configurer Django pour utiliser un lien symbolique vers /media/HDD/django-medias (en vérifiant donc que le dossier existe bien), ou utiliser os.path.ismount() ? Ou y a-t-il une solution plus simple / plus propre qui m’échappe ?

Bref, j’avoue être un peu perdu… ^^
Merci d’avance pour votre aide !

rezemika

+0 -0

La pratique normalement c’est de se baser sur l’UUID du disque. Donc avec la commande blkid.

En Python, je pense que le plus simple est encore de lancer la commande blkid avec un sous processus. Ou d’utiliser /dev/disk/by-uuid.

Si l’UUID du disque est présent alors il est branché. Maintenant il faut encore vérifier qu’il est monté. C’est encore une autre histoire.

+0 -0

Comme l’a dit @ache, tu peux utiliser un sous processus. La commande lsblk -o UUID,MOUNTPOINT va te donner l’uuid et le point de montage:

lsblk -o UUID,MOUNTPOINT

: ' si monté:
UUID                                 MOUNTPOINT                                     
74A6FFEF46E0CFC3                     /media/thib/data

si non monté:
UUID                                 MOUNTPOINT                                     
74A6FFEF46E0CFC3     
'                
+1 -0

Salut à toi.

Je n’ai pas vraiment l’habitude du sysadmin, donc j’avoue ne pas vraiment connaitre les canons ou les « bonnes pratiques » à ce sujet. Du coup : auriez-vous des recommandations sur une façon « propre » de s’assurer que le disque dur est bien branché avant d’y accéder ? rezemika

rezemika

D’avance je risque de te répondre à côté de la plaque mais c’est pour la bonne cause.

En théorie l’objectif d’un développeur Django c’est de développer un site pour fournir un service aux internautes. Je pense donc sincèrement que, à moins que ton projet personnel le requière (monitorer le montage / démontage d’un disque ?), tu ne devrais pas avoir à te soucier du montage de ton disque depuis Django.

Cela veut donc dire que tu dois t’assurer en amont, d’un point de vue sysadmin, que le disque est monté correctement, ensuite tu peux lancer Django l’esprit tranquille.

Maintenant, en aval, tu dois aussi gérer les erreurs, c’est-à-dire les cas qui ne devraient normalement pas se produire lorsque tu n’arrives pas à accéder à un média. Et ceci tout en restant abstrait, si tu vois ce que je veux dire. Pour moi ça se fait lorsque tu essaies d’accéder aux médias via le navigateur ou le backend. Tu n’aurais qu’à traiter des erreurs 404 (dans le navigateur tu vois des images cassées, tu n’as qu’à monter le disque). Côté backend tu peux gérer ça plus proprement peut-être et bloquer toutes les requêtes si tu n’arrives pas à accéder à une ressource en particulier (avec un middleware) ?

Bonne chance dans tes recherches !

En théorie l’objectif d’un développeur Django c’est de développer un site pour fournir un service aux internautes. Je pense donc sincèrement que, à moins que ton projet personnel le requière (monitorer le montage / démontage d’un disque ?), tu ne devrais pas avoir à te soucier du montage de ton disque depuis Django.

Cela veut donc dire que tu dois t’assurer en amont, d’un point de vue sysadmin, que le disque est monté correctement, ensuite tu peux lancer Django l’esprit tranquille.

Je suis tout à fait de cet avis.

Or, se pose alors une question : comment prévoir le cas où le disque dur serait débranché ? Je n’ai pas vraiment l’habitude du sysadmin, donc j’avoue ne pas vraiment connaitre les canons ou les « bonnes pratiques » à ce sujet. Du coup : auriez-vous des recommandations sur une façon « propre » de s’assurer que le disque dur est bien branché avant d’y accéder ?

Pourquoi le disque serait débranché ? Même en cas de reboot, si tu mets la bonne entrée dans ton /etc/fstab (ou que tu as ton fameux script pour le faire), tu ne devrais pas avoir de problème.

Sinon, pour s’assurer que le disque reste toujours monté, tu peux faire en sorte que ton script de montage écoute les évènements et qui le remonte aussitôt si jamais il venait à être démonté ou « perdu ». Tu peux cron-er ton script ou le faire tourner en service systemd, par exemple.

Or, même lorsqu’il est démonté, le dossier /media/HDD existe toujours, je ne peux donc pas me contenter de vérifier que le dossier existe.

Si tu veux rester en script Bash : tu peux lire le fichier /proc/mounts (ou appeler mount), le parser et voir si ton volume est bien monté. Ton script de montage pourrait s’en occuper, justement. (pas l’app Django)

+0 -0

Merci beaucoup pour vos réponses !

Du coup, j’ai fais un petit script BASH comme ceci, lancé par une crontab (par le superutilisateur) toutes les 30 minutes.

if lsblk -o UUID,MOUNTPOINT | grep -q "HDD-UUID-XXXXXXXX /media/HDD"
then
        echo "HDD mounted"
else
        echo "HDD not mounted"
        a2dissite example.com
        service apache2 reload
        echo "example.com stopped"
fi

Donc je rajoute un petit middleware Django qui vérifie que le dossier settings.MEDIA_ROOT existe bien (je pensais à un pathlib.Path.exists(), qui du coup marcherait aussi sur ma machine de dev) et tout devrait être bon ? Désolé je pose beaucoup de questions, je suis encore assez mal à l’aise avec le sysadmin… ^^

Merci ! :)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte