Un espace disque (pour ainsi dire) infini pour les podcasts
En septembre avant de partir voir Grossstadtgeflüster j’avais noté que l’espace disque du serveur qui héberge le site web de Radio Panik allait commencer à manquer, on approchait alors les 90% d’utilisation, ça ressemblait à ça :
On voit que l’année dernière déjà j’avais dû m’inquiéter et que d’une manière ou d’une autre j’avais récupéré une petite dizaine de pourcents, je ne me souviens plus trop des détails mais ça signifie sans doute que les gains faciles avaient déjà été réalisés.
Deux mois plus tard on est maintenant à 93%, à ce rythme on passe sans doute l’année mais on n’ira pas beaucoup plus loin.
Serveur d’entrée de gamme, service d’entrée de gamme, s’il faut davantage d’espace il va falloir commander et installer un nouveau serveur, qui coûtera forcément plus cher, je n’ai pas tellement envie, j’ai plutôt envie de réfléchir un peu. Mais avant ça il y a un concert et puis j’oublie.
Voix off : deux mois plus tard…
J’ai repris les choses et mis de côté des idées sophistiquées pour faire relativement simple : tout effacer après 3 mois et servir un son qui dit que désolé le podcast n’est plus disponible ? Non. Tout réencoder en qualité moindre ? Non plus. Envoyer chier les utilisateurs Apple et ne plus stocker qu’au format ogg ? Dans mes rêves, mais non.
Simplement, comme on a de toute façon tous les fichiers, hébergés à la radio, l’idée est de servir ce qu’on a depuis le serveur web, et ce qu’on n’a pas, d’aller le chercher à la volée à la radio, ça sera forcément moins rapide, DSL oblige, mais ça peut concerner uniquement les podcasts qui ont plus d’un an (par exemple) et avoir ainsi bien peu d’incidence.
Mettre ça en place se révèle assez simple, c’est surtout grâce à nginx, qui est reconfiguré ainsi : /remote_media pour faire proxy vers les fichiers hébergés à la radio, /local_media pour les fichiers locaux, et passer la main à l’applicatif pour tout ce qui est sous /meedia/sounds/ :
location /remote_media { internal; proxy_pass https://panikdb.xxx/media/; proxy_limit_rate 2000k; } location /local_media { internal; alias /var/lib/panikweb/media; } location ~ ^/media/sounds/(.+)$ { proxy_pass http://unix:/run/panikweb/panikweb.sock; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; } # avant on avait juste ces trois lignes : location /media/ { alias /var/lib/panikweb/media/; }
Côté code pour gérer /media/sounds/, c’est très simple également, de l’ordre de :
# côté urls.py urlpatterns += [url(r'^media/(?P<location>sounds/.*)', views.media_hosting)] # et côté views.py def media_hosting(request, location, *args, **kwargs): local_path = default_storage.path(location)
# content_type vide pour laisser nginx le positionner. response = HttpResponse(content_type='') if os.path.exists(local_path): response['X-Accel-Redirect'] = '/local_media' + location else: response['X-Accel-Redirect'] = '/remote_media' + location return response
La « magie » ici c’est dans l’entête X-Accel-Redirect, c’est un entête spécial qu’nginx va intercepter pour savoir quoi servir, via ses mécaniques internes (qui serviront donc un fichier local dans un cas, et utiliseront son code de proxy dans l’autre). Ça veut aussi dire que ça pourrait se combiner avec sa gestion du cache, pour quelque chose d’un peu plus fin.
Pour accompagner ça j’ai aussi ajouté une nouvelle commande (upload-files) pour assurer le transfert des nouveaux podcasts uniquement (plutôt que tout le répertoire sounds), c’est assez bateau.
Le code se trouve principalement dans ce commit pour la partie web et dans cet autre pour la nouvelle commande.
C’était également l’occasion de documenter à la fois l’ancienne méthode (transfert global) et la nouvelle, c’est dans cette page du site dédié : Synchronisation entre panikdb et panikweb sur des serveurs différents.
Voilà , tout n’est pas fini, 1/ j’ai mis en place la configuration mais je n’ai pas encore activé ça pour de vrai (je verrai courant semaine prochaine), 2/ le serveur à la radio est plein à 89%, il y aura des manipulations à faire là , mais il s’agit juste d’acheter deux nouveaux disques, c’est très facile.