Étape 3. Publication
ClipBucket, un clone YouTube open source qui peut être installé sur votre propre serveur
La première chose que j'ai essayée était ClipBucket , qui s'appelle lui-même un clone YouTube open source que vous pouvez installer sur votre serveur.
Étonnamment, ClipBucket n'a aucune instruction d'installation. Grâce à un tutoriel tiers, j'ai automatisé le processus d'installation à l' aide d' Ansible , un outil de gestion de configuration de serveur.
Une partie de la difficulté était que les scripts d'installation de ClipBucket étaient complètement cassés. À cette époque, je travaillais chez Google et aux termes du contrat, je n'avais pas le droit de contribuer au clone open source de YouTube, mais j'ai publié un rapport de bogue à partir duquel il était facile de faire les corrections nécessaires. Les mois passèrent et ils ne comprenaient toujours pas quel était le problème. Au lieu de cela, ils ont ajouté de plus en plus de bogues à chaque version.
ClipBucket fonctionnait sur un modèle de conseil - ils ont publié leur code gratuitement et ont facturé des frais pour aider au déploiement. Peu à peu, je me suis rendu compte qu'une entreprise qui gagne de l'argent grâce au support payant n'est probablement pas très intéressée à ce que les clients installent le produit eux-mêmes.
MediaGoblin, une alternative plus moderne
Après des mois de frustration avec ClipBucket, j'ai examiné les options disponibles et j'ai trouvé MediaGoblin .
MediaGoblin est une plate-forme de partage de médias autonome
. MediaGoblin a beaucoup de goodies. Contrairement à ClipBucket en PHP disgracieux, MediaGoblin est écrit en Python, qui est le langage dans lequel j'ai beaucoup d'expérience en codage. Il existe une interface de ligne de commande qui facilite l'automatisation des téléchargements de vidéos. Plus important encore, MediaGoblin est fourni dans une image Docker qui élimine tout problème d'installation.
Docker est une technologie qui crée un environnement autonome pour une application qui s'exécute n'importe où. J'utilise Docker dans plusieurs de mes projets .
Difficulté incroyable de réamarrer MediaGoblin
J'ai supposé que le déploiement de l'image docker MediaGoblin serait trivial. Eh bien, cela n'a pas tout à fait fonctionné de cette façon.
L'image finale manquait deux fonctions nécessaires:
- Authentification
- MediaGoblin crée un portail multimédia public par défaut, et j'avais besoin d'un moyen de restreindre l'accès non autorisé.
- Transcodage
- Chaque fois que vous téléchargez une vidéo, MediaGoblin essaie de la recoder pour une diffusion optimale. Si la vidéo est initialement prête pour le streaming, le transcodage dégrade la qualité.
- MediaGoblin permet de désactiver le transcodage via les options de configuration , mais cela ne peut pas être fait dans une image Docker existante.
Pas de problème. L'image Docker est open source , vous pouvez donc la reconstruire vous-même .
Malheureusement, l'image Docker n'est plus construite à partir du référentiel MediaGoblin actuel . J'ai essayé de le synchroniser avec la version de la dernière version réussie, mais cela n'a pas fonctionné non plus. Bien que j'utilise exactement le même code, les dépendances externes de MediaGoblin ont changé, cassant la construction. Après des dizaines d'heures, j'ai exécuté le processus de construction de 10 à 15 minutes de MediaGoblin encore et encore jusqu'à ce qu'il fonctionne enfin.
Quelques mois plus tard, la même chose s'est produite. Au total, au cours des deux dernières années, la chaîne de dépendance MediaGoblin a cassé ma construction à plusieurs reprises, et la dernière fois que cela s'est produit, c'était juste au moment où j'écrivais cet article. J'ai fini par publier mon propre fork de MediaGoblin, avec des dépendances codées en dur et des versions de bibliothèque explicites. En d'autres termes, au lieu de prétendre de manière douteuse que MediaGoblin fonctionne avec n'importe quelle version de céleri > = 3.0, j'ai installé une dépendance spécifique sur céleri 4.2.1 parce que j'ai testé MediaGoblin avec cette version. Il semble que le produit nécessite un mécanisme de construction reproductible , mais je ne l'ai pas encore fait.
Quoi qu'il en soit, après de nombreuses heures de lutte, j'ai enfin pu créer et configurer MediaGoblin dans une image Docker. Là, il était déjà facile de sauter le transcodage inutile et de mettre Nginx pour l'authentification .
Étape 4. Hébergement
Puisque MediaGoblin exécutait Docker sur ma machine locale, l'étape suivante consistait à déployer sur un serveur cloud afin que la famille puisse regarder la vidéo.
MediaGoblin et problème de stockage vidéo
Il existe de nombreuses plates-formes qui prennent une image Docker et l'hébergent sur une URL publique. Le hic, c'est qu'en plus de l'application elle-même, 33 Go de fichiers vidéo ont dû être publiés. Il était possible de les coder en dur dans une image de docker, mais cela s'est avéré encombrant et laid. La modification d'une ligne de configuration nécessiterait le redéploiement de 33 Go de données.
Lorsque j'ai utilisé ClipBucket, j'ai résolu le problème avec gcsfuse , un utilitaire qui permet au système d'exploitation de télécharger des répertoires sur Google Cloud en tant que chemins de système de fichiers normaux. J'ai posté les fichiers vidéo sur Google Cloud et utilisé gcsfuse pour les afficher en tant que fichiers locaux dans ClipBucket.
La différence était que ClipBucket s'exécutait dans une vraie VM, tandis que MediaGoblin s'exécutait dans un conteneur Docker. Ici, le montage de fichiers à partir du stockage cloud s'est avéré beaucoup plus difficile. J'ai passé des dizaines d'heures à résoudre tous les problèmes et j'ai écrit un article de blog à ce sujet .
L'intégration initiale de MediaGoblin avec le stockage Google Cloud, dont j'ai parlé en 2018
Après plusieurs semaines de peaufinage de tous les composants, tout a fonctionné. Sans apporter de modifications au code MediaGoblin, je le force à lire et à écrire des fichiers multimédias sur le stockage cloud de Google.
Le seul problème était que MediaGoblin est devenu extrêmement lent. Il a fallu 20 secondes pour charger les miniatures vidéo sur la page d'accueil. Si vous avançiez en regardant une vidéo, MediaGoblin se mettrait en pause pendant 10 secondes infinies avant de reprendre la lecture.
Le principal problème était que les vidéos et les images étaient transmises à l'utilisateur de manière longue et détournée. Ils ont dû passer du stockage cloud de Google via gcsfuse à MediaGoblin, Nginx - et ce n'est qu'alors qu'ils sont entrés dans le navigateur de l'utilisateur. Le principal goulot d'étranglement était gcsfuse, qui n'est pas optimisé pour des performances rapides. Les développeurs mettent en garde contre les retards importants dans le travail de l'utilitaire directement sur la page d'accueil du projet:
Avertissements de performances dans la documentation gcsfuse
Idéalement, le navigateur doit récupérer les fichiers directement à partir de Google Cloud, en contournant toutes les couches intermédiaires. Comment puis-je faire cela sans plonger dans la base de code MediaGoblin et ajouter une logique d'intégration Google Cloud complexe?
Astuce Nginx sub_filter
Heureusement, j'ai trouvé une solution simple, bien qu'un peu moche. J'ai ajouté le filtre suivant à la configuration default.conf dans Nginx :
sub_filter "/mgoblin_media/media_entries/" "https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/";
sub_filter_once off;
Dans mon installation, Nginx fonctionnait comme un proxy entre MediaGoblin et l'utilisateur final. La directive ci-dessus indique à Nginx de rechercher et de remplacer toutes les réponses HTML de MediaGoblin avant de les transmettre à l'utilisateur final. Nginx remplace tous les chemins relatifs aux fichiers multimédias MediaGoblin par des URL de Google Cloud Storage.
Par exemple, MediaGoblin génère du HTML comme ceci:
<video width="720" height="480" controls autoplay>
<source
src="/mgoblin_media/media_entries/16/Michael-riding-a-bike.mp4"
type="video/mp4">
</video>
Nginx change la réponse:
<video width="720" height="480" controls autoplay>
<source
src="https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/16/Michael-riding-a-bike.mp4"
type="video/mp4">
</video>
Maintenant, tout fonctionne comme prévu:
Nginx réécrit les réponses de MediaGoblin afin que les clients puissent demander des fichiers multimédias directement à partir du stockage cloud de Google
La meilleure partie de ma solution est qu'elle ne nécessite aucune modification du code MediaGoblin. La directive à deux lignes de Nginx intègre de manière transparente MediaGoblin et Google Cloud, même si ces services ne savent absolument rien l'un de l'autre.
Remarque : cette solution nécessite que les fichiers de Google Cloud Storage soient lisibles par tous. Pour atténuer le risque d'accès non autorisé, j'utilise un nom de compartiment long et aléatoire (par exemple mediagoblin-39dpduhfz1wstbprmyk5ak29
) et je vérifie que la politique de contrôle d'accès du compartiment ne permet pas aux utilisateurs non autorisés d'afficher le contenu de l'annuaire.
Produit final
À ce stade, j'avais une solution complète et fonctionnelle. MediaGoblin fonctionnait avec bonheur dans son propre conteneur sur la plate-forme cloud de Google, il n'avait donc pas besoin d'être corrigé ou mis à jour fréquemment. Tout dans mon processus était automatisé et reproductible, permettant des modifications simples ou des restaurations vers les versions précédentes.
Ma famille a adoré la facilité avec laquelle il était de regarder la vidéo. Avec le piratage Nginx ci-dessus, le traitement vidéo est maintenant aussi rapide que YouTube.
L'écran de prévisualisation ressemble à ceci:
Contenu du répertoire vidéo de la famille par la balise sélectionnée
Cliquez sur la vignette pour afficher l'écran suivant:
Visualisation d'un seul clip sur le serveur multimédia
Après de nombreuses années de travail, j'ai été extrêmement heureux de donner à mes proches la possibilité de regarder nos vidéos dans la même interface conviviale que sur YouTube, comme je le souhaitais à l'origine.
Bonus: réduction des coûts à moins de 1 $ par mois
Vous ne regardez pas souvent les vidéos personnelles, seulement tous les quelques mois. Ma famille a collectivement généré environ 20 heures de trafic en un an, mais le serveur fonctionnait 24 heures sur 24. J'ai payé 15 $ par mois pour un serveur qui était en panne 99,7% du temps.
Fin 2018, Google a lancé le produit Cloud Run . La fonctionnalité qui tue était le lancement des conteneurs Docker si rapidement que l'application pouvait répondre aux requêtes HTTP. Autrement dit, le serveur pouvait rester en mode veille - et démarrer uniquement lorsque quelqu'un souhaitait y accéder. Pour les applications rarement lancées comme la mienne, les coûts sont passés de 15 $ par mois à quelques centimes par an.
Pour des raisons dont je ne me souviens pas, Cloud Run ne fonctionnait pas avec mon image MediaGoblin. Mais avec l'avènement de Cloud Run, je me suis souvenu que Herokupropose un service similaire gratuitement, et leurs outils sont bien plus pratiques que ceux de Google.
Avec un serveur d'applications gratuit, votre seule dépense est le stockage des données. Le stockage régional standard de Google coûte 2,3 cents / Go. L'archive vidéo fait 33 Go, donc je ne paie que 77 cents par mois.
Le coût de cette solution n'est que de 0,77 $ par mois
Conseils pour ceux qui cherchent à essayer
Évidemment, le processus a pris beaucoup de temps pour moi. Mais j'espère que cet article vous aidera à économiser 80 à 90% de vos efforts pour numériser et publier des vidéos personnelles. Vous pouvez trouver un guide détaillé étape par étape de l'ensemble du processus dans une section distincte , mais voici quelques conseils généraux:
- Pendant la phase de numérisation et d'édition, conservez autant de métadonnées que possible.
- .
- , .
- , .
- .
- .
- EverPresent ( , ).
- , HDD.
- 100-200 .
- Synology DS412+ (10 ).
- - , .
- , , . .
- (, , ), , .
- . , .
- ?
- ?
- ?
- .
- , .
- “best of” , .
- , .
- , . .
- , . , .
- .
- , , .
- , , .
- .
- .
- — .
- — . , Slow Snow The National, .