Coin web de Frédéric Péters

Un espace disque (pour ainsi dire) infini pour les podcasts

12 novembre 2022, 19:59

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 :

Graphe où on voit l’utilisation du disque inexorablement augmenter

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.