<?xml version="1.0" encoding="UTF-8" ?>
<!-- RSS generated by PHPBoost on Wed, 15 Apr 2026 02:00:53 +0200 -->

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Derniers articles - La taverne de John-John : Logiciel &amp; scripts]]></title>
		<atom:link href="https://www.jonathandupre.fr/syndication/rss/articles/24" rel="self" type="application/rss+xml"/>
		<link>https://www.jonathandupre.fr</link>
		<description><![CDATA[Derniers articles - La taverne de John-John : Logiciel &amp; scripts]]></description>
		<copyright>(C) 2005-2026 PHPBoost</copyright>
		<language>fr</language>
		<generator>PHPBoost</generator>
		
		
		<item>
			<title><![CDATA[Comment ne pas déverrouiller les HDD HGST (Cross-flash vendor-locked)]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/386-comment-ne-pas-deverrouiller-les-hdd-hgst-cross-flash-vendor-locked/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/386-comment-ne-pas-deverrouiller-les-hdd-hgst-cross-flash-vendor-locked/</guid>
			<description><![CDATA[L'année dernière je suis tombé dans le <em>rabbit hole</em> des disques durs <a href="https://fr.wikipedia.org/wiki/Serial_Attached_SCSI">SAS</a> bloqués logiciellement. Cette page résume mes aventures à tenter techniquement de les déverrouiller mais sans succès à ce jour. Tout part de l'achat de quelques disques durs 2,5 pouces SAS-2 et SAS-3 pas chers sur eBay qui sont issus d'appliances de marque NetApp, EMC ou Cisco décommissionnées.<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/02.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/02.jpg" alt="" class="b-lazy" /></a><br />
Et s'ils ne sont pas chers c'est qu'il y a une raison. 😁<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/00.jpg" alt="" class="b-lazy" /><br />
J'en ai malencontreusement pris quatre sur eBay sans savoir, sans trop me méfier, qui sont étiquetés NetApp. N'ayant jamais eu de tel matos OVER 9000 propriétaire à la maison ou au travail, comme par exemple des baies de disques EMC ou NetApp, je n'avais absolument pas connaissance de tout ce qui m'attendait. Voici les deux modèles de disques avec lesquels je suis concerné :<br />
<ul class="formatter-ul">
    <li class="formatter-li">2x HGST HUC109090CSS600 (famille Cobra-E), dont un est décédé suite à mes essais
    </li><li class="formatter-li">2x HGST HUC101890CS4204 (famille Cobra-F)<br />
</li></ul><br />
<br />
Tout va bien avec les Cobra-E mais ce n'est pas le cas avec les Cobra-F. Le disque ne fonctionne pas totalement de manière générique et correctement partout sur d'autres contrôleurs SAS d'autres marques (LSI, ServeRAID, PERC, ...). Il y donc une distinction à faire entre les firmware "custom" et les firmwares constructeur OEM, appelé "génériques" ou civils. <em>civilian</em> revenant souvent sur les forums spécialisés. On trouve de ces histoires à la pelle sur le net. Le sujet ne concerne pas un fabricant spécialement. La plupart ont pu faire fonctionner ces disques en l'état, tels quels, simplement en les reformatant avec une taille de secteur standard, en les passant de 520 à 512 octets, pour une utilisation en RAID logiciel du genre unRAID/TrueNAS sur une carte en mode HBA/IT.<br />
<ul class="formatter-ul">
    <li class="formatter-li"><a href="https://www.reddit.com/r/homelab/comments/7qeet1/emcnetapp_branded_520b_block_size_sas_drives/">https://www.reddit.com/r/homelab/comments/7qeet1/emcnetapp_branded_520b_block_size_sas_drives/</a>
    </li><li class="formatter-li"><a href="https://www.reddit.com/r/netapp/comments/118lcol/netapp_hdd_in_a_dell_server">https://www.reddit.com/r/netapp/comments/118lcol/netapp_hdd_in_a_dell_server</a>
    </li><li class="formatter-li"><a href="https://forums.truenas.com/t/hgst-sas-drive-formatting-troubles/37160">https://forums.truenas.com/t/hgst-sas-drive-formatting-troubles/37160</a>
    </li><li class="formatter-li"><a href="https://www.youtube.com/watch?v=JFOZ2YM0x04">https://www.youtube.com/watch?v=JFOZ2YM0x04</a>
    </li><li class="formatter-li"><a href="https://www.youtube.com/watch?v=BbtPPH3W7nU">https://www.youtube.com/watch?v=BbtPPH3W7nU</a><br />
</li></ul><br />
<br />
Mais dans certains cas changer la taille de secteur à 512 octets en reformatant ne suffit pas à les rendre absolument compatible partout. Car dans mon cas souvient un autre problème de <em>cold boot</em>. Le blocage du disque se fait, selon moi, sur une séquence de démarrage après mise sous tension qui doit être absolument respectée (timing). Sinon à l'allumage les disques "buguent" et ne sont pas détectés correctement. Sur mon Dell PowerEdge T440, que la PERC soit en mode RAID ou HBA, c'est la même chose, la machine est bloquée au boot sur l'écran bleu, la seule solution étant de retirer les disques de la cage et de les remettre. Après cette manipulation ils fonctionnent correctement. Ce qui réclame d'être devant le serveur lors du boot : pas terrible. C'est comme si les disques attendaient une courte période de temps que le contrôleur (ou l'expander de la backplane) leur envoie quelque chose, juste après la mise en tension, sinon c'est trop tard, faut ré-appliquer une déconnexion électrique. Seulement comme la carte contrôleur et/ou la backplane elle aussi doit prendre le temps de démarrer, elle ne répond pas assez vite, ce temps est dépassé, les disques ne sont pas détectés. C'est assimilable à une <em>race condition</em>. C'est mon hypothèse. Même situation que cette personne : <a href="https://forums.servethehome.com/index.php?threads/hgst-netapp-sas-drives-most-of-the-time-dont-show-up-on-dell-r730xd-backplane.43001/">https://forums.servethehome.com/index.php?threads/hgst-netapp-sas-drives-most-of-the-time-dont-show-up-on-dell-r730xd-backplane.43001/</a>.<br />
<br />
<p style="text-align: center;"><!-- START HTML -->
<iframe style="max-width:100%" width="950" height="535" sandbox="allow-same-origin allow-scripts" src="https://video.latavernedejohnjohn.fr/videos/embed/9TNwMn34W2vkQaMobQ6LGu" frameborder="0" allowfullscreen></iframe>
<!-- END HTML --></p><br />
<br />
Pour ceux qui auraient fait le rapprochement avec le problème de la broche 3.3V : que les disques reçoivent ce 3.3V ou pas c'est la même chose. Même avec des adaptateurs qui n'apportent pas cette 3ème tension c'est pareil. Le fil n'est pas présent, il n'y a que le 12V et 5V d'appliqués, donc ce n'est pas cela le problème.<br />
<br />
<ul class="formatter-ul">
    <li class="formatter-li"><a href="https://dyb.fr/pourquoi-votre-disque-dur-enterprise-ne-demarre-pas-lexplication-du-3-3-v-et-la-solution-kapton/">https://dyb.fr/pourquoi-votre-disque-dur-enterprise-ne-demarre-pas-lexplication-du-3-3-v-et-la-solution-kapton/</a>
    </li><li class="formatter-li"><a href="https://www.instructables.com/How-to-Fix-the-33V-Pin-Issue-in-White-Label-Disks-/">https://www.instructables.com/How-to-Fix-the-33V-Pin-Issue-in-White-Label-Disks-/</a>
    </li><li class="formatter-li"><a href="https://zackreed.me/hgst-7k6000-not-spinning-not-working/">https://zackreed.me/hgst-7k6000-not-spinning-not-working/</a><br />
</li></ul><br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/19.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/19.jpg" alt="" class="b-lazy" /></a><br />
<br />
Donc pour moi cela provient d'une modification du logiciel interne qui a été personnalisé pour un démarrage "spécifique". La solution est simple à première vue : remettre le firmware constructeur à la place, ce qui rendrait le disque conforme à son comportement d'origine. C'est là que les choses se gâtent. Si on essaye, et bien cela ne fonctionne pas. Même mettre le firmware originel du fabricant échoue. On pourrait penser que c'est quelque chose de légitime. Et bien non. C'est de la sécurité. C'est le début des investigations durant des nuits blanches de recherche et de casse tête cet été pour moi.<br />
<br />
<h2 class="formatter-title">Les firmware d'origine</h2><br />
<br />
On peut les trouver sur le net, notamment sur <a href="https://files.hddguru.com/index.php">l'espace de téléchargement du site hddguru</a>.<br />
<br />
<h2 class="formatter-title">La mauvaise idée : jouer avec la puce Flash</h2><br />
<br />
Ouais c'est facile, yaka (faukon) dessouder la SPI Winbond/Macronix du PCB, la mettre dans un programmateur et hop.<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/10.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/10.jpg" alt="" class="b-lazy" /></a><br />
<br />
Hélas c'est une autre époque ou pour des techniques de récupération de données très spéciales. Sur les HDD modernes une partie du firmware est en effet dans la puce Flash mais une autre partie est située sur les plateaux du disque. Cette zone est appelée la SA <em>(System Area)</em>. Elle est située dans de la zone LBA négative (LBA < 0) et pas obligatoirement de manière contiguë.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/14.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/13.jpg" alt="" class="b-lazy" /><br />
<br />
Pour garder un ensemble cohérent de firmware et éviter de <a href="http://www.madore.org/~david/weblog/d.2016-09-22.2396.html">bricker</a> son HDD, il est donc bon de laisser au firmware installé le soin d'écrire les bonnes sections lui-même du nouveau firmware à la fois dans la flash et sur les plateaux si besoin. Des bouts du firmware global étant répartis de part et d'autre. Donc cette méthode barbare, on oublie.<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/11.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/11.jpg" alt="" class="b-lazy" /></a><br />
<br />
<h2 class="formatter-title">La protection / Comprendre la logique</h2><br />
<br />
Il y en a comme moi qui ont essayés, ils ont eu des problèmes. 😂<br />
Nous avons tenté des commandes à base de sg_write_buffer mais toutes échouent avec des Illegal Request comme réponse.<br />
<br />
<ul class="formatter-ul">
    <li class="formatter-li"><a href="https://www.reddit.com/r/DataHoarder/comments/7raoz8/firmware_for_hgst_10k_sas_huc109090css600/">https://www.reddit.com/r/DataHoarder/comments/7raoz8/firmware_for_hgst_10k_sas_huc109090css600/</a>
    </li><li class="formatter-li"><a href="https://www.truenas.com/community/threads/hgst-hus723020als640-firmware-cross-flashing.61499/">https://www.truenas.com/community/threads/hgst-hus723020als640-firmware-cross-flashing.61499/</a><br />
</li></ul><br />
<br />
Déjà pourquoi ça ne fonctionne pas ? C'est simple : le firmware du HDD embarque un mécanisme interne de vérification du nouveau firmware à prendre en compte (lors d'une commande sg_write_buffer). C'est le disque dur (ou SSD) LUI-MÊME qui accepte ou refuse le fichier firmware .lod, .sed ou .bin proposé à l'implantation. Le nouveau firmware est accepté uniquement si sa signature condensée SHA256 correspond à une clé publique RSA-2048 déjà inscrite dans le firmware du HDD en place. Il faut donc être familier des principes de chiffrement asymétrique (clé publique / clé privée) et de condensât (checksums / digest).<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/05.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/05.jpg" alt="" class="b-lazy" /></a><br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/06.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/06.jpg" alt="" class="b-lazy" /></a><br />
<br />
Un disque qui embarque un firmware NetApp ne pourra être flashé qu'avec un autre firmware signé par NetApp.<br />
Un disque qui embarque un firmware Dell ne pourra être flashé qu'avec un autre firmware signé par Dell.<br />
Etc...<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/07.png" alt="" class="b-lazy" /><br />
<br />
D'où le terme de "Vendor-locked" : les disques sont verrouillés et interdisent le cross-flashing, c'est à dire mettre le firmware d'un autre "vendor" (revendeur) à la place. D'où le fait aussi que les revendeurs (NetApp, Dell, EMC, Cisco,...) doivent repackager/recustomiser le firmware du fabricant (WD, HGST, Seagate...) à leurs clients lorsque le fabricant en sort un nouveau : <a href="https://www.dell.com/support/home/fr-fr/drivers/driversdetails?driverid=dgy1g">exemple</a>.<br />
<br />
C'est une fonctionnalité proposée par les fabricants (WD, HGST, Seagate...) directement en usine, le firmware est personnalisé pour le client (Nom du fabricant, numéro de modèle, code PIN, clé publique RSA-2048...). Sur un HGST Ultrastar 10K900, il est facile reconnaître la provenance en lisant le numéro MLC. Il démarre toujours par CE pour Cobra-E (famille 10K900) suivi d'un 0 et enfin de 4 caractères alphanumériques (version du firmware).<br />
<br />
Un disque NetApp aura donc un firmware noté CE0NAxx, CE0NA00, CE0NA01, CE0NA02, etc... Et cette information est apposée sur l'étiquette constructeur (valeur MLC en rouge), on peut donc en déduire que ces disques sont déjà personnalisés en sortie d'usine.<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/01.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/01.jpg" alt="" class="b-lazy" /></a><br />
<br />
Un spécimen "civil", destiné à la revente au détail, aura un firmware générique, son MLC équivaut à CE0A5B0 sur l'étiquette de ce spécimen neuf illustré ci-dessous :<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/04.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/04.jpg" alt="" class="b-lazy" /></a><br />
<br />
Remarque 1 : cette protection N'A RIEN A VOIR avec le chiffrage du disque en lui-même (SED) ou quelconque protection par mot de passe ATA.<br />
<br />
Remarque 2 : Ne pas oublier que firmware contenu dans le binaire .lod n'est pas réellement 100% complet, des données variables sont propres au disque dans la <em>Service Area</em> et doivent le rester (calibration des têtes, listing des secteurs défectueux, numéro de série, etc... Ces données ne sont pas et ne doivent pas être mises à jour lors d'un upgrade firmware. Glossaire : <a href="https://blog.acelab.eu.com/glossary">https://blog.acelab.eu.com/glossary</a>.<br />
<br />
<h2 class="formatter-title">Comment déverrouiller un disque ? RTFM frère</h2><br />
<br />
Il faut passer par la case retro-ingénierie et accessoirement se palucher une tonne de documentation. Va falloir fouiner ! Certaines commandes de la norme SCSI sont publiques (T10). D'autres sont cachées (non documentées, documentation non accessible au public) que l'on appelle des <em>VSC (Vendor Specific Commands)</em> ou encore des <em>VUC (Vendor Unique Commands)</em>. Elles sont ainsi spécifiques à chaque marque de disque dur, et les constructeurs peuvent faire ce qu'ils veulent avec. J'ai passé des heures à jouer avec les commandes sg_utils que ce soit coté Windows ou Linux avec mon petit PC Lenovo de test :<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/03.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/03.jpg" alt="" class="b-lazy" /></a><br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/15.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/15.jpg" alt="" class="b-lazy" /></a><br />
<br />
C'est en envoyant des commandes bien ciblées au disque qu'on arrive à le placer dans un certain état (spacial mode) qui désactivera la vérification de la signature du firmware. Une fois cette fonction désactivée, le HDD pourra ingurgiter n'importe quel firmware: OEM, HP, Dell, EMC, NetApp, etc... Et le cross-flash est donc possible. Hélas seuls des outils professionnels hors de prix peuvent faire ce cross-flash. Du genre le <a href="https://blog.acelab.eu.com/pc-3000-sas-how-to-change-fw-model-and-vendor-using-download-microcode-feature.html">ACELab PC3000</a> ou chez <a href="https://us.mrtlab.com/">MRT Lab</a>.<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/18.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/18.png" alt="" class="b-lazy" /></a><br />
<br />
<h2 class="formatter-title">The "Russian dude"</h2><br />
<br />
Il est surnommé tel quel <a href="https://lug.mtu.edu/wiki/Locked_HGST_drives">par ce site</a> (lug.mtu.edu). Son auteur est je pense assez blasé. J'en comprends la frustration.<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/08.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/08.png" alt="" class="b-lazy" /></a><br />
<br />
E123 est une personne sur des forums qui propose <a href="https://forum.hddguru.com/viewtopic.php?f=22&t=39927">un service de déverrouillage de ces disques à distance</a> (via le bureau à distance de Windows). Un service monnayé contre quelques euros par disque. Ce E123 est très compétent, aucun doute là dessus. Il a dû y passer du temps, et le temps c'est de l'argent. Il ne souhaite pas partager ses secrets. <em>Knowledge is money !</em><br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/09.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/09.png" alt="" class="b-lazy" /></a><br />
<br />
<p style="text-align: center;"><!-- START HTML -->
<iframe style="max-width:100%" width="950" height="535" src="https://www.youtube-nocookie.com/embed/mAhS_sk3wKE" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>
<!-- END HTML --></p><br />
<br />
La vidéo ci-dessus est une démonstration de son service. En résumé : le disque connecté se présente comme un DKR5D, il lance un script .bat DOS "CMD" classique, qui démarre un deuxième Niagara en mode CLI (une deuxième instance de Niagara, pas celle que l'on voit à l'écran en graphique). Le script utilise Niagara pour envoyer des commandes au disque afin de le déverrouiller. C'est ici toute la magie, qui est monnayée, cachée dans ce script temporaire. Une fois ce script déroulé, dans un deuxième temps on peut injecter un autre firmware, ce qu'il va faire avec le Niagara déjà ouvert en GUI. Ce logiciel exploite derrière la commande sg_write_buffer. L'injection du nouveau firmware fonctionne. Il montre dans un troisième temps que le disque fraîchement mis à jour fonctionne bien sous le logiciel Victoria avec le nouveau firmware générique implanté. Le disque n'est plus un DKR5D mais un HITACHI générique tout en conservant le même numéro de série. Remarque : il existe une version Linux de Niagara.<br />
<br />
<h2 class="formatter-title">Pourquoi partir dans cette direction ?</h2><br />
<br />
E123 a laissé <a href="https://forum.hddguru.com/viewtopic.php?p=280356#p280356">quelques indices dans ce post sur le forum hddguru</a>.<br />
<br />
<div class="formatter-container formatter-blockquote"><span class="formatter-title title-perso">E123 :</span><div class="formatter-content">To reflash HGST disks from one vendor to another, it is necessary to deactivate checks inside the hard drive itself, as provided by the manufacturer. Dig the code, look for keys, look for vendor commands. No free utility, let alone OEM flasher, will help in this case.</div></div><br />
<br />
Grosso modo il faut analyser le code du firmware ARM (en dumpant les modules de la SA du disque) à la recherche de la routine qui désactivera cette vérification : ce qui signifie trouver les "clés" et des VSC à jouer. Des investigations à faire en solo quoi (hard way), comme lui a dû les faire de son coté. Mais ce n'est pas à la portée de tout le monde de bien savoir lire et décortiquer du code ARM décompilé. Je n'ai pas de licence pour le logiciel IDA. Peut-être demander à une IA ?<br />
<br />
<h2 class="formatter-title">Le matériel nécessaire</h2><br />
<br />
Comme déjà dit, il faudra envoyer des commandes "sur mesure" au disque dur. Pour cela il est conseillé d'utiliser une carte HBA en mode IT (Initiator-Target). Certaines cartes comme la PERC H730P de mon Dell T440 peuvent basculer dans ce mode en jouant dans les paramètres. Sinon vous pouvez prendre une carte contrôleur SAS type LSI2008 déjà pré-flashée sur AliExpress pour quelques dizaines d'euros. Ce sont des cartes Dell, IBM/Lenovo ou HP recyclées dont le firmware d'origine a été re-flashé pour l'utiliser dans ce mode.<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/12.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/12.jpg" alt="" class="b-lazy" /></a><br />
<br />
En gros, elle fonctionne comme un passe-plat. Les commandes SCSI transitent telles quelles de l'Initiator (hôte Linux/Windows/BSD) à la Target (disque dur) sans restriction/translation sur le chemin. Par opposition au mode RAID, qui comme son nom l'indique, embarque toute la couche de logique de gestion RAID (communications internes indépendantes entre la carte et ses disques, sans intervention de l'hôte/OS) et peut maquiller la communication. Vidéos de the-art-of-server sur Youtube :<br />
<br />
<ul class="formatter-ul">
    <li class="formatter-li"><a href="https://www.youtube.com/watch?v=hTbKzQZk21w">Comparing HBA IT mode SAS controllers | 2020 Edition</a>
    </li><li class="formatter-li"><a href="https://www.youtube.com/watch?v=GGL-ZUjJqyI">6 Things you need to know about the LSI 9211-8i (9201-8i) vs Dell PERC H310</a><br />
</li></ul><br />
<br />
<h2 class="formatter-title">Les logiciels nécessaires</h2><br />
<br />
Pour envoyer des commandes custom SCSI au disque SAS il faut passer par les outils sg_utils (paquet sg3_utils sur Linux). <a href="https://sg.danny.cz/sg/p/sg3_utils.html">Pour les Windowsiens, il existe des versions exécutables pré-compilées qui font le travail même sous Windows 7</a>.<br />
<br />
<h2 class="formatter-title">Pour investiguer sur le plan logiciel</h2><br />
<br />
J'ai eu un temps utilisé un Dell Optiplex 380 mais après j'ai pris un Lenovo Edge 72. Un truc assez vieux qui accepte Windows 7 out of the box.<br />
<br />
<ul class="formatter-ul">
    <li class="formatter-li">Dual boot Fedora 42 / Windows 7 (menu grub2 / os-prober), utilisation à distance (RDP/SSH)
    </li><li class="formatter-li">Un petit script pour dumper la ROM du disque en modules (<a href="https://forum.hddguru.com/viewtopic.php?p=309503#p309503">petit script de fzabkar</a>)
    </li><li class="formatter-li">Un éditeur hexadécimal
    </li><li class="formatter-li">Les commandes linux de fouinage : binwalk, strings, file & vbindiff
    </li><li class="formatter-li">Ghidra (explorer/désassembler/décompiler le code ARM 32bits LE du firmware et les dumps de ROM)<br />
</li></ul><br />
<br />
En aparté, pour gruger la <a href="https://en.wikipedia.org/wiki/Time_bomb_(software)">timebomb</a> du logiciel Niagara sous Linux. Avec Ghidra je suis parti à la recherche de la fonction qui affiche le message dans libtcluil.so. Petite trouvaille, on remarque que le logiciel essaye de détecter si on est sur le réseau d'HGST ou pas (usage en interne à l'entreprise) "onHGSTNetwork".<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/g1.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/g1.png" alt="" class="b-lazy" /></a><br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/g2.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/g2.png" alt="" class="b-lazy" /></a><br />
<br />
Pour gruger, il suffit de supprimer le test de retour de la fonction niagaraExpired. Ainsi la fonction niagaraExpired est toujours exécutée mais son résultat n'est plus pris en compte (return non exploité). Le logiciel démarre intégralement sans jamais expirer. Il me semble que j'avais tenter de gruger l'heure du PC sans succès. Avant :<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/g3.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/g3.png" alt="" class="b-lazy" /></a><br />
<br />
Après :<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/g4.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/g4.png" alt="" class="b-lazy" /></a><br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/g5.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/g5.png" alt="" class="b-lazy" /></a><br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/g6.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/g6.png" alt="" class="b-lazy" /></a><br />
<br />
Un Niagara débloqué sous Linux. Plus besoin de Windows 7.<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/g7.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/g7.png" alt="" class="b-lazy" /></a><br />
<br />
Des documentations téléchargées du web...<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/17.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/17.png" alt="" class="b-lazy" /></a><br />
<br />
<h2 class="formatter-title">Les premières tentatives, comment déverrouiller un disque ?</h2><br />
<br />
Au départ benoîtement, j'ai cru qu'il suffisait de lire la documentation constructeur. HGST implémente le protocole de sécurité "TCG Entreprise SCC". Ces fonctionnalités ne servent qu'aux disques dits "SED", chiffrés en interne. HGST propose deux modèles de disques, l'un chiffré (CSS601) et un autre non-chiffré (CSS600). Mes disques sont non-chiffrés. Mais en fait derrière le soft entre les deux modèles est peut-être identique ? Que ce soit un CSS600 ou 601 ce sont juste des paramètres qui changent dans le firmware. Pourquoi parler de ça ? Ce système de TCG embarque toute la logique de sécurisation globale du disque dur jusqu'au chiffrement des données sur les plateaux par zones (appelées bandes). Les données sur les plateaux sont découpées par bandes/zones et chaque zone à sa clé de chiffrement. C'est indiqué dans la documentation. HGST se sert du mécanisme TCG pour gérer l'aspect sécuritaire de deux autres fonctionnalités dont celle qui nous intéresse. Comme expliqué dans la documentation. Il est possible de désactiver cette vérification de signature de firmware. Ce qui ouvrirait la porte à notre "cross-flashing". Comme indiqué, ces fonctionnalités sont "un plus" qui sortent du cadre de la norme TCG.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/t6.png" alt="" class="b-lazy" /><br />
<br />
En gros, il faut utiliser certaines fonctionnalités fournies par ce module TCG et aller modifier la table "Admin SP". SP pour Security Provider afin de désactiver la fameuse vérification de signature de firmware qui nous embête.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/t1.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/t7.png" alt="" class="b-lazy" /><br />
<br />
Les commandes TCG sont encapsulées via les commandes SCSI suivantes :<br />
- SECURITY PROTOCOL IN (A2h) = IF-RECV<br />
- SECURITY PROTOCOL OUT (B5h) = IF-SEND<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/t2.png" alt="" class="b-lazy" /><br />
<br />
Les fonctions liées à TCG sont lourdes à mettre en &#339;uvre, il y a toute une négociation (aller-retour) à base de jeton (comID) à faire avec le disque dur avec une authentification et ça réclame un vrai programme dédié.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/t5.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/t4.png" alt="" class="b-lazy" /><br />
<br />
Il faudrait :<br />
<ul class="formatter-ul">
    <li class="formatter-li">commencer par faire un "Level 0 discovery"
    </li><li class="formatter-li">débuter une session et obtenir un comID
    </li><li class="formatter-li">s'authentifier avec le MSID ou un code pin de 32 caractères
    </li><li class="formatter-li">pour enfin envoyer la commande pour changer la valeur qui nous intéresse : passer Firmware_Dload_Port.PortLocked à False
    </li><li class="formatter-li">à ce stade, le HDD est déverrouillé et ainsi prêt à accueillir n'importe quel firmware (civil ou non).<br />
</li></ul><br />
<br />
J'ai pu trouver sur GitHub un utilitaire génial fait en Go qui fait 95% du travail : <a href="https://github.com/open-source-firmware/go-tcg-storage/tree/main">https://github.com/open-source-firmware/go-tcg-storage/tree/main</a><br />
<br />
Reste un peu à l'adapter... mais il y a un problème, il faut s'identifier auprès du disque avec le MSID ou un code PIN que l'on ne connaît pas. J'ai ressorti Ghibra à la recherche du mot de passe. Le code PIN TCG réclame que le longueur du mot de passe soit exactement de 32 caractères. Ni plus, ni moins. La longueur n'est pas variable. Sachant que le MSID par défaut est le numéro de série du disque établi sur 8 caractères répété 4 fois, donc 32 caractères. J'ai quand même trouvé du "Hello World!" dans le firmware. Hélas je n'ai pas les symboles pour tout comprendre.<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/g8.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/g8.png" alt="" class="b-lazy" /></a><br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/g9.png" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/g9.png" alt="" class="b-lazy" /></a><br />
<br />
Mais rien n'empêche le vendor d'avoir mis autre chose comme mot de passe. Mais hélas cette piste s'arrête là car les commandes TCG avec cet utilitaire en Go n'ont pas d'effets. La partie TCG semble complètement désactivée. Idem dans Niagara. Donc je pense que ce sont d'obscures commandes non-documentées qui gèrent cet aspect... et alors là pour les trouver... 😤🤯<br />
<br />
<h2 class="formatter-title">La capitulation</h2><br />
<br />
Courant août j'ai abandonné. Trop complexe pour moi tout seul de rendre mes HGST OEM, c'est figé en l'état sur mon NAS.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/20.png" alt="" class="b-lazy" /><br />
<br />
J'en ai même perdu un sur les quatre durant mes essais, comme d'autres sur les forums, en bricolant partiellement les différents modules qui composent la Service Area avec sq_raw / sg_write_buffer. En octobre dernier, <a href="https://www.hddoracle.com/viewtopic.php?p=24888#p24888">mr44er sur hddoracle poste de nouvelles informations issues d'une IA façon GPT</a>, une lueur d'espoir. J'ai essayé certaines commandes qu'il a posté mais elles sont à moitié fausses. <a href="https://www.hddoracle.com/viewtopic.php?p=24894#p24894">Le "special mode" je l'avais déjà tenté</a> bien avant.<br />
<br />
Nous sommes en février 2026 et donc je confirme que j'ai lâché l'affaire, trop de temps perdu même si j'ai appris pas mal. Comme d'autres avant moi, j'ai contacté ce fameux russe par courriel avec une petite vidéo faite en privée en anglais pour lui expliquer tout cela. Il est resté sur l'affaire des 520->512 octets et qu'après cela il n'y a pas de restrictions, que les disques fonctionnent bien en restant en firmware NetApp. Donc l'opération ne servirait à rien. Oui ça fonctionne, mais rien à propos de mon affaire de cold boot. Après une seconde demande quelques semaines plus tard, j'ai eu une réponse négative, grosso-modo ce n'est pas intéressant pour lui car je n'ai que trois disques à flasher, il en faudrait une dizaine pour que l'on parle sérieusement. Je pense qu'il traite plus en business/B2B qu'avec des simples particuliers ponctuels comme moi ça lui prendrait trop de temps. Finalement je sors la carte bleue et je me prends des SSD d'occasion Dell reconditionnés comme ça plus de problème.<br />
<br />
<a href="https://www.jonathandupre.fr/images/articles/2026/386/22.jpg" data-lightbox="formatter" class="formatter-lightbox"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2026/386/22.jpg" alt="" class="b-lazy" /></a><br />
<br />
Un jour peut-être on aura une solution gratuite mise en ligne publiquement. 😒<br />
En attendant, beaucoup de ces disques iront finir leur vie en mode anticipé dans les DEEE. Merci la "sécurité".]]></description>
			<pubDate>Sat, 14 Feb 2026 17:28:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title><![CDATA[Démon apcupsd sur onduleur vintage en SNMP]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/296-demon-apcupsd-sur-onduleur-vintage-en-snmp/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/296-demon-apcupsd-sur-onduleur-vintage-en-snmp/</guid>
			<description><![CDATA[Depuis mon emménagement je n'ai pas pris le temps de bien raccorder mon onduleur informatiquement parlant sur mon "serveur" NAS 24/7. La flemme.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2021/296/1.jpg" alt="" class="b-lazy" /><br />
Cet <a href="https://www.jonathandupre.fr/articles/11-electrique/178-apc-smart-ups-1000-remplacement-des-batteries">onduleur APC Smart-UPS 1000</a> je l'aime bien car il a sa carte Web/SNMP qui permet de lui donner des fonctions intéressantes, autant les exploiter.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2021/296/2.jpg" alt="" class="b-lazy" /><br />
Cet UPS embarque aussi un connecteur RS-232C (attention brochage non standard) mais la carte mère <a href="https://www.asrock.com/mb/Intel/H87M/index.fr.asp">Asrock H87M</a> n'a plus ce type de port en accès direct soudé sans devoir ouvrir le PC et installer <a href="https://www.quietpc.com/serial-port-pci-brackets">une équerre DE9</a>. Il existe toujours un <em>pin header</em> sur la carte mère pour le port série.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2021/296/3.jpg" alt="" class="b-lazy" /><br />
Comme <a href="https://www.jonathandupre.fr/articles/4-presentation-divers/289-atelier-v2/">expliqué récemment</a>, mon PC-NAS cerise est en Wi-Fi, par conséquent le port réseau (<a href="https://video.latavernedejohnjohn.fr/videos/watch/8eb9a864-fa5b-4043-9d3b-03f089ca3567">réparé à l'époque</a>) est libre. Donc j'ai utilisé un RJ-45 direct entre l'onduleur et cerise. Il faut donc bien définir <a href="https://fr.wikipedia.org/wiki/M%C3%A9trique_(routage)">les métriques</a> pour les interfaces réseau. Le WiFi doit être privilégié pour sortir et atteindre Internet.<br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@cerise:~# </span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>network<span style="color: #000000; font-weight: bold;">/</span>interfaces
<span style="color: #666666; font-style: italic;"># This file describes the network interfaces available on your system</span>
<span style="color: #666666; font-style: italic;"># and how to activate them. For more information, see interfaces(5).</span>
<span style="color: #666666; font-style: italic;"># The loopback network interface</span>
auto lo
iface lo inet loopback
<span style="color: #666666; font-style: italic;"># The primary network interface</span>
auto enp4s0
iface enp4s0 inet static
address 192.168.1.1
netmask 255.255.255.0
metric <span style="color: #000000;">2</span>
<span style="color: #666666; font-style: italic;">#Wifi</span>
auto wlxd0374511a96f
iface wlxd0374511a96f inet dhcp
        wpa-ssid X
        wpa-psk X
        <span style="color: #666666; font-style: italic;">#wireless-power off</span>
        post-up iwconfig wlxd0374511a96f power off
metric <span style="color: #000000;">1</span>
<span style="color: #666666; font-style: italic;">#Wifi</span>
auto wlp5s0
iface wlp5s0 inet dhcp
        wpa-ssid X
        wpa-psk X
        <span style="color: #666666; font-style: italic;">#wireless-power off</span>
        post-up iwconfig wlp5s0 power off
metric <span style="color: #000000;">0</span></pre></pre></div></div><br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@cerise:~# </span><span style="color: #c20cb9; font-weight: bold;">ip</span> r
default via 192.168.0.254 dev wlp5s0
192.168.0.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span> dev wlp5s0 proto kernel scope <span style="color: #c20cb9; font-weight: bold;">link</span> src 192.168.0.12
192.168.1.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span> dev enp4s0 proto kernel scope <span style="color: #c20cb9; font-weight: bold;">link</span> src 192.168.1.1 metric <span style="color: #000000;">2</span>
192.168.123.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span> dev virbr0 proto kernel scope <span style="color: #c20cb9; font-weight: bold;">link</span> src 192.168.123.1
&nbsp;</pre></pre></div></div><br />
<br />
192.168.0.0/24 pour le WiFi et internet 0.0.0.0.<br />
192.168.1.0/24 pour l'onduleur APC (192.168.1.2).<br />
192.168.123.0/24 pour les machines virtuelles.<br />
Le mieux étant de passer par un navigateur internet, bon l'interface est old school hein.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2021/296/4.jpg" alt="" class="b-lazy" /><br />
<br />
Sinon en telnet :<br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">root<span style="color: #000000; font-weight: bold;">@</span>cerise:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #666666; font-style: italic;"># telnet 192.168.1.2</span>
Trying 192.168.1.2...
Connected to 192.168.1.2.
Escape character is <span style="color: #ff0000;">'^]'</span>.
User Name : apc
Password  : <span style="color: #000000; font-weight: bold;">***</span>
American Power Conversion               Web<span style="color: #000000; font-weight: bold;">/</span>SNMP Management Card AOS   v3.2.6.b
<span style="color: #7a0874; font-weight: bold;">&#40;</span>c<span style="color: #7a0874; font-weight: bold;">&#41;</span> Copyright <span style="color: #000000;">2000</span> All Rights Reserved  Smart-UPS <span style="color: #000000; font-weight: bold;">&</span> Matrix-UPS APP     v3.2.6.a
<span style="color: #660033;">-------------------------------------------------------------------------------</span>
Name      : DUPRE Jonathan              Date    : 06<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">27</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2021</span>
Contact   : DUPRE Jonathan              Time    : <span style="color: #000000;">16</span>:<span style="color: #000000;">14</span>:02
Location  : FRANCE                      Up Time : <span style="color: #000000;">0</span> Days <span style="color: #000000;">1</span> Hour <span style="color: #000000;">4</span> Minutes
Status    : P+ N+ A+                    User    : Administrator
Smart-UPS <span style="color: #000000;">1000</span> named ATELIER  : On
<span style="color: #660033;">-------</span> Control Console <span style="color: #660033;">-------------------------------------------------------</span>
     <span style="color: #000000;">1</span>- Device Manager
     <span style="color: #000000;">2</span>- Network
     <span style="color: #000000;">3</span>- System
     <span style="color: #000000;">4</span>- Logout
     <span style="color: #000000; font-weight: bold;"><</span>ESC<span style="color: #000000; font-weight: bold;">></span>- Main Menu, <span style="color: #000000; font-weight: bold;"><</span>ENTER<span style="color: #000000; font-weight: bold;">></span>- Refresh, <span style="color: #000000; font-weight: bold;"><</span>CTRL-L<span style="color: #000000; font-weight: bold;">></span>- Event Log
<span style="color: #000000; font-weight: bold;">></span> <span style="color: #000000;">1</span>
<span style="color: #660033;">-------</span> Device Manager <span style="color: #660033;">--------------------------------------------------------</span>
     <span style="color: #000000;">1</span>- Smart-UPS <span style="color: #000000;">1000</span>
     <span style="color: #000000; font-weight: bold;"><</span>ESC<span style="color: #000000; font-weight: bold;">></span>- Back, <span style="color: #000000; font-weight: bold;"><</span>ENTER<span style="color: #000000; font-weight: bold;">></span>- Refresh, <span style="color: #000000; font-weight: bold;"><</span>CTRL-L<span style="color: #000000; font-weight: bold;">></span>- Event Log
<span style="color: #000000; font-weight: bold;">></span> <span style="color: #000000;">1</span>
<span style="color: #660033;">-------</span> Smart-UPS <span style="color: #000000;">1000</span> <span style="color: #660033;">--------------------------------------------------------</span>
        Status of UPS : On
        Last Transfer : Due to software <span style="color: #7a0874; font-weight: bold;">command</span> or UPSs <span style="color: #7a0874; font-weight: bold;">test</span> control.
        <span style="color: #660033;">-----------------------------------------------------------------------</span>
        Input Voltage    : <span style="color: #000000;">231.4</span> VAC         Operating Frequency : <span style="color: #000000;">50.00</span> Hz
        Output Voltage   : <span style="color: #000000;">231.4</span> VAC         Internal Temperature: <span style="color: #000000;">038.7</span> C
        Load Power       : <span style="color: #000000;">004.6</span> <span style="color: #000000; font-weight: bold;">%</span> Watts     Battery Voltage     : <span style="color: #000000;">27.60</span> VDC
        Max Line Voltage : <span style="color: #000000;">235.3</span> VAC         Battery Capacity    : <span style="color: #000000;">100.0</span> <span style="color: #000000; font-weight: bold;">%</span>
        Min Line Voltage : <span style="color: #000000;">230.1</span> VAC         Runtime Remaining   : 0073 min
        <span style="color: #660033;">-----------------------------------------------------------------------</span>
        Self-Test Result : Passed            Calibration Result  : Passed
        Self-Test Date   : 06<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">23</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2021</span>        Calibration Date    : 04<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">18</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span>
     <span style="color: #000000;">1</span>- Control
     <span style="color: #000000;">2</span>- Configuration
     <span style="color: #000000;">3</span>- Detailed Status
     <span style="color: #000000;">4</span>- About UPS
     <span style="color: #000000; font-weight: bold;"><</span>ESC<span style="color: #000000; font-weight: bold;">></span>- Back, <span style="color: #000000; font-weight: bold;"><</span>ENTER<span style="color: #000000; font-weight: bold;">></span>- Refresh, <span style="color: #000000; font-weight: bold;"><</span>CTRL-L<span style="color: #000000; font-weight: bold;">></span>- Event Log
<span style="color: #000000; font-weight: bold;">></span> <span style="color: #000000;">4</span>
<span style="color: #660033;">-------</span> About Smart-UPS <span style="color: #000000;">1000</span> named ATELIER  <span style="color: #660033;">-----------------------------------</span>
        Serial Number     : GS9920005848     Firmware Revision : <span style="color: #000000;">60.11</span>.I
        Manufacture Date  : 05<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">12</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">99</span>
        Press <span style="color: #000000; font-weight: bold;"><</span>ENTER<span style="color: #000000; font-weight: bold;">></span> to continue...
<span style="color: #660033;">-------</span> Smart-UPS <span style="color: #000000;">1000</span> <span style="color: #660033;">--------------------------------------------------------</span>
        Status of UPS : On
        Last Transfer : Due to software <span style="color: #7a0874; font-weight: bold;">command</span> or UPSs <span style="color: #7a0874; font-weight: bold;">test</span> control.
        <span style="color: #660033;">-----------------------------------------------------------------------</span>
        Input Voltage    : <span style="color: #000000;">232.7</span> VAC         Operating Frequency : <span style="color: #000000;">50.00</span> Hz
        Output Voltage   : <span style="color: #000000;">232.7</span> VAC         Internal Temperature: <span style="color: #000000;">038.7</span> C
        Load Power       : <span style="color: #000000;">004.6</span> <span style="color: #000000; font-weight: bold;">%</span> Watts     Battery Voltage     : <span style="color: #000000;">27.60</span> VDC
        Max Line Voltage : <span style="color: #000000;">235.3</span> VAC         Battery Capacity    : <span style="color: #000000;">100.0</span> <span style="color: #000000; font-weight: bold;">%</span>
        Min Line Voltage : <span style="color: #000000;">230.1</span> VAC         Runtime Remaining   : 0073 min
        <span style="color: #660033;">-----------------------------------------------------------------------</span>
        Self-Test Result : Passed            Calibration Result  : Passed
        Self-Test Date   : 06<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">23</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2021</span>        Calibration Date    : 04<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">18</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span>
     <span style="color: #000000;">1</span>- Control
     <span style="color: #000000;">2</span>- Configuration
     <span style="color: #000000;">3</span>- Detailed Status
     <span style="color: #000000;">4</span>- About UPS
     <span style="color: #000000; font-weight: bold;"><</span>ESC<span style="color: #000000; font-weight: bold;">></span>- Back, <span style="color: #000000; font-weight: bold;"><</span>ENTER<span style="color: #000000; font-weight: bold;">></span>- Refresh, <span style="color: #000000; font-weight: bold;"><</span>CTRL-L<span style="color: #000000; font-weight: bold;">></span>- Event Log
<span style="color: #000000; font-weight: bold;">></span> Connection closed by foreign host.
&nbsp;</pre></pre></div></div><br />
<br />
Sinon installer un petit reverse proxy, le but étant de taper un port particulier pour atteindre directement l'onduleur en web :<br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">root<span style="color: #000000; font-weight: bold;">@</span>cerise:<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>sites-available<span style="color: #666666; font-style: italic;"># cat 007-apcups.conf</span>
Listen <span style="color: #000000;">8082</span>
<span style="color: #000000; font-weight: bold;"><</span>VirtualHost <span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">8082</span><span style="color: #000000; font-weight: bold;">></span>
    ProxyPreserveHost On
    ProxyPass <span style="color: #000000; font-weight: bold;">/</span> http:<span style="color: #000000; font-weight: bold;">//</span>192.168.1.2:<span style="color: #000000;">80</span><span style="color: #000000; font-weight: bold;">/</span>
    ProxyPassReverse <span style="color: #000000; font-weight: bold;">/</span> http:<span style="color: #000000; font-weight: bold;">//</span>192.168.1.2:<span style="color: #000000;">80</span><span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #000000; font-weight: bold;"></</span>VirtualHost<span style="color: #000000; font-weight: bold;">></span>
&nbsp;</pre></pre></div></div><br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2021/296/5.jpg" alt="" class="b-lazy" /><br />
<br />
Reste à installer le paquet apcupsd intégré à Debian/Ubuntu.<br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">apt <span style="color: #c20cb9; font-weight: bold;">install</span> apcpusd</pre></pre></div></div><br />
<br />
Il faut ensuite modifier le fichier apcupsd.conf. Par défaut il est configuré pour de l'USB et le démon passe en zombie.<br />
Pour ma part j'ai choisi le mode SNMP, il faut donc mettre les bonnes valeurs et relancer.<br />
<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">UPSCABLE ether
UPSTYPE snmp
DEVICE 192.168.1.2:161:APC:public</pre></pre></div></div><br />
<br />
J'ai activé le log de l'état de l'onduleur toutes les 5 minutes dans le fichier STATFILE /var/log/apcupsd.status.<br />
<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">STATTIME 300</pre></pre></div></div><br />
<br />
Voila maintenant mon PC-NAS sera stoppé correctement à la prochaine coupure de courant. Les seuils sont paramétrables.<br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@cerise:~# </span>apcaccess
APC      : 001,046,<span style="color: #000000;">1040</span>
DATE     : <span style="color: #000000;">2021</span>-06-<span style="color: #000000;">27</span> <span style="color: #000000;">16</span>:<span style="color: #000000;">27</span>:<span style="color: #000000;">41</span> +0200
HOSTNAME : cerise
VERSION  : 3.14.14 <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">31</span> May <span style="color: #000000;">2016</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> debian
UPSNAME  : ATELIER
CABLE    : Ethernet Link
DRIVER   : SNMP UPS Driver
UPSMODE  : Stand Alone
STARTTIME: <span style="color: #000000;">2021</span>-06-<span style="color: #000000;">27</span> <span style="color: #000000;">15</span>:<span style="color: #000000;">47</span>:<span style="color: #000000;">30</span> +0200
MODEL    : SMART-UPS <span style="color: #000000;">1000</span>
STATUS   : ONLINE
LINEV    : <span style="color: #000000;">234.0</span> Volts
LOADPCT  : <span style="color: #000000;">4.0</span> Percent
BCHARGE  : <span style="color: #000000;">100.0</span> Percent
TIMELEFT : <span style="color: #000000;">73.0</span> Minutes
MBATTCHG : <span style="color: #000000;">5</span> Percent
MINTIMEL : <span style="color: #000000;">3</span> Minutes
MAXTIME  : <span style="color: #000000;">0</span> Seconds
MAXLINEV : <span style="color: #000000;">236.0</span> Volts
MINLINEV : <span style="color: #000000;">230.0</span> Volts
OUTPUTV  : <span style="color: #000000;">234.0</span> Volts
SENSE    : Medium
DWAKE    : <span style="color: #000000;">0</span> Seconds
DSHUTD   : <span style="color: #000000;">20</span> Seconds
DLOWBATT : <span style="color: #000000;">5</span> Minutes
LOTRANS  : <span style="color: #000000;">204.0</span> Volts
HITRANS  : <span style="color: #000000;">253.0</span> Volts
RETPCT   : <span style="color: #000000;">15.0</span> Percent
ITEMP    : <span style="color: #000000;">38.0</span> C
ALARMDEL : <span style="color: #000000;">5</span> Seconds
LINEFREQ : <span style="color: #000000;">50.0</span> Hz
LASTXFER : No transfers since turnon
NUMXFERS : <span style="color: #000000;">0</span>
TONBATT  : <span style="color: #000000;">0</span> Seconds
CUMONBATT: <span style="color: #000000;">0</span> Seconds
XOFFBATT : N<span style="color: #000000; font-weight: bold;">/</span>A
SELFTEST : OK
STESTI   : <span style="color: #000000;">168</span>
STATFLAG : 0x05000008
MANDATE  : 05<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">12</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">99</span>
SERIALNO : GS9920005848
BATTDATE : <span style="color: #000000;">10</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">22</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">13</span>
NOMOUTV  : <span style="color: #000000;">230</span> Volts
EXTBATTS : <span style="color: #000000;">0</span>
BADBATTS : <span style="color: #000000;">0</span>
FIRMWARE : <span style="color: #000000;">60.11</span>.I
END APC  : <span style="color: #000000;">2021</span>-06-<span style="color: #000000;">27</span> <span style="color: #000000;">16</span>:<span style="color: #000000;">28</span>:<span style="color: #000000;">21</span> +0200
&nbsp;</pre></pre></div></div><br />
<br />
Explications des valeurs : <a href="https://linux.die.net/man/8/apcaccess">https://linux.die.net/man/8/apcaccess</a><br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@cerise:~# </span>systemctl status apcupsd
● apcupsd.service - UPS power management daemon
     Loaded: loaded <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>systemd<span style="color: #000000; font-weight: bold;">/</span>system<span style="color: #000000; font-weight: bold;">/</span>apcupsd.service; enabled; vendor preset: enabled<span style="color: #7a0874; font-weight: bold;">&#41;</span>
     Active: active <span style="color: #7a0874; font-weight: bold;">&#40;</span>running<span style="color: #7a0874; font-weight: bold;">&#41;</span> since Sun <span style="color: #000000;">2021</span>-06-<span style="color: #000000;">27</span> <span style="color: #000000;">15</span>:<span style="color: #000000;">47</span>:<span style="color: #000000;">30</span> CEST; 43min ago
       Docs: man:apcupsd<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">8</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
    Process: <span style="color: #000000;">5613</span> <span style="color: #007800;">ExecStartPre</span>=<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>apcupsd<span style="color: #000000; font-weight: bold;">/</span>prestart <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">code</span>=exited, <span style="color: #007800;">status</span>=<span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">/</span>SUCCESS<span style="color: #7a0874; font-weight: bold;">&#41;</span>
    Process: <span style="color: #000000;">5631</span> <span style="color: #007800;">ExecStart</span>=<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>apcupsd <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">code</span>=exited, <span style="color: #007800;">status</span>=<span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">/</span>SUCCESS<span style="color: #7a0874; font-weight: bold;">&#41;</span>
   Main PID: <span style="color: #000000;">5632</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>apcupsd<span style="color: #7a0874; font-weight: bold;">&#41;</span>
      Tasks: <span style="color: #000000;">3</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>limit: <span style="color: #000000;">9332</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
     Memory: 1.0M
     CGroup: <span style="color: #000000; font-weight: bold;">/</span>system.slice<span style="color: #000000; font-weight: bold;">/</span>apcupsd.service
             └─<span style="color: #000000;">5632</span> <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>apcupsd
juin <span style="color: #000000;">27</span> <span style="color: #000000;">15</span>:<span style="color: #000000;">47</span>:<span style="color: #000000;">30</span> cerise systemd<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: Starting UPS power management daemon...
juin <span style="color: #000000;">27</span> <span style="color: #000000;">15</span>:<span style="color: #000000;">47</span>:<span style="color: #000000;">30</span> cerise systemd<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: apcupsd.service: Cant open PID <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>apcupsd.pid <span style="color: #7a0874; font-weight: bold;">&#40;</span>yet?<span style="color: #7a0874; font-weight: bold;">&#41;</span> after start: Operation not permitted
juin <span style="color: #000000;">27</span> <span style="color: #000000;">15</span>:<span style="color: #000000;">47</span>:<span style="color: #000000;">30</span> cerise apcupsd<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">5632</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: apcupsd 3.14.14 <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">31</span> May <span style="color: #000000;">2016</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> debian startup succeeded
juin <span style="color: #000000;">27</span> <span style="color: #000000;">15</span>:<span style="color: #000000;">47</span>:<span style="color: #000000;">30</span> cerise apcupsd<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">5632</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: NIS server startup succeeded
juin <span style="color: #000000;">27</span> <span style="color: #000000;">15</span>:<span style="color: #000000;">47</span>:<span style="color: #000000;">30</span> cerise systemd<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: Started UPS power management daemon.
<span style="color: #666666;">root@cerise:~# </span><span style="color: #c20cb9; font-weight: bold;">netstat</span> <span style="color: #660033;">-a</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #000000;">3551</span>
tcp        <span style="color: #000000;">0</span>      <span style="color: #000000;">0</span> cerise:<span style="color: #000000;">3551</span>             0.0.0.0:<span style="color: #000000; font-weight: bold;">*</span>               LISTEN
tcp        <span style="color: #000000;">0</span>      <span style="color: #000000;">0</span> cerise:<span style="color: #000000;">52018</span>            cerise:<span style="color: #000000;">3551</span>             TIME_WAIT
<span style="color: #666666;">root@cerise:~#
</span></pre></pre></div></div>]]></description>
			<pubDate>Sun, 27 Jun 2021 17:43:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title><![CDATA[Peertube - Journal de bord maintenance]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/267-peertube-journal-de-bord-maintenance/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/267-peertube-journal-de-bord-maintenance/</guid>
			<description><![CDATA[<table class="formatter-table">
    <tr class="formatter-table-row"><th class="formatter-table-head">Horodatage</th><th class="formatter-table-head">Résumé</th><th class="formatter-table-head">Versions/Détails</th></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">09/04/2026 22h45</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col">Debian 13.4 partout</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">09/04/2026 22h30</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 8.1.5</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">03/04/2026 17h30</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 8.1.4</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">13/03/2026 17h15</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 8.1.2</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">12/03/2026 22h20</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 8.1.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">27/01/2026 17h55</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 8.0.2</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">16/12/2025 23h45</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 8.0.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">12/12/2025 00h00</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 8.0.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">04/10/2025 14h00-15h10</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col">Debian 12.12 -> 13.1 pour frontend (VPS OVH) & backend (Dell Optiplex 3050)</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">01/10/2025 22h50</td><td class="formatter-table-col">MAJ Peertube + Debian + Node.js</td><td class="formatter-table-col">Peertube 7.3.0 + Debian 12.12 + Node 22.20.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">22/08/2025 19h40</td><td class="formatter-table-col">MAJ Node.js</td><td class="formatter-table-col">22.18.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">02/08/2025 00h00</td><td class="formatter-table-col">MAJ Peertube + Debian + Node.js</td><td class="formatter-table-col">Peertube 7.2.3 + Debian 12.11</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">16/06/2025 19h20</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 7.2.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">07/06/2025 23h30</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 7.2.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">08/04/2025 19h30</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 7.1.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">05/04/2025 00h30</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col">Debian 12.10</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">14/03/2025 21h25</td><td class="formatter-table-col">MAJ NodeJS & kernel</td><td class="formatter-table-col">20.18.3 -> 20.19.0, 6.1.124 -> 6.1.128</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">04/03/2025 17h30</td><td class="formatter-table-col">MAJ NodeJS</td><td class="formatter-table-col">18.20.6 ->20.18.3</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">11/01/2025 16h50</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col">Debian 12.9</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">09/01/2025 19h15</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 7.0.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">18/12/2024 00h45</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 7.0.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">09/10/2024 18h15</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 6.3.2</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">29/09/2024 17h20</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 6.3.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">21/09/2024 21h30</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 6.3.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">02/08/2024 00h00</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 6.2.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">27/07/2024 10h50</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 6.2.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">30/04/2024 15h20</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 6.1.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">04/04/2024 19h00</td><td class="formatter-table-col">MAJ Peertube sécurité</td><td class="formatter-table-col">Peertube 6.0.4</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">23/03/2024</td><td class="formatter-table-col">Migration</td><td class="formatter-table-col"><a href="https://www.jonathandupre.fr/news/1-vie-du-site/371-serveur-dedie-peertube-c-est-la-fin/">Passage du serveur dédié SoYouStart (2018) -> Serveur Dell auto-hébergé</a></td></tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">31/01/2024 23h00</td>
        <td class="formatter-table-col">Génération des storyboards</td>
        <td class="formatter-table-col">Génération de tous les storyboards (pour toutes les vidéos existantes) --> <a href="https://docs.joinpeertube.org/maintain/tools#generate-storyboard">https://docs.joinpeertube.org/maintain/tools#generate-storyboard</a><br />
<p style="text-align: left;"><div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">USER<span style="color: #000000; font-weight: bold;">@</span>peertube:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>peertube<span style="color: #000000; font-weight: bold;">/</span>peertube-latest$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #660033;">-u</span> peertube <span style="color: #007800;">NODE_CONFIG_DIR</span>=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>peertube<span style="color: #000000; font-weight: bold;">/</span>config <span style="color: #007800;">NODE_ENV</span>=production npm run create-generate-storyboard-job <span style="color: #660033;">--</span> <span style="color: #660033;">--all-videos</span>
<span style="color: #000000; font-weight: bold;">></span> peertube<span style="color: #000000; font-weight: bold;">@</span>6.0.3 create-generate-storyboard-job
<span style="color: #000000; font-weight: bold;">></span> node .<span style="color: #000000; font-weight: bold;">/</span>dist<span style="color: #000000; font-weight: bold;">/</span>scripts<span style="color: #000000; font-weight: bold;">/</span>create-generate-storyboard-job.js <span style="color: #660033;">--all-videos</span>
Created generate-storyboard job <span style="color: #000000; font-weight: bold;">for</span> Compaq Prolinea <span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">100</span> - Réparation kinder surprise.
Created generate-storyboard job <span style="color: #000000; font-weight: bold;">for</span> Nettoyer les têtes de son magnétoscope VHS.
Created generate-storyboard job <span style="color: #000000; font-weight: bold;">for</span> Réparation micro-chaîne Grundig MF <span style="color: #000000;">2050</span>.
...</pre></pre></div></div></p><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2020/267/2.png" alt="" class="b-lazy" /></td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">24/01/2024 18h00</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 6.0.3</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">07/01/2024 00h45</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col"><ul class="formatter-ul">
<li class="formatter-li">Debian 12.4 (Kernel 6.1.69)
</li><li class="formatter-li">Node 18.19<br />
</li></ul></td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">13/12/2023 22h10</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 6.0.2</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">03/12/2023 de 16h15 à 16h45</td><td class="formatter-table-col">MAJ Debian & Peertube</td><td class="formatter-table-col"><ul class="formatter-ul">
<li class="formatter-li"><strong><span style="text-decoration: underline;">Toutes</span></strong> les vidéos sont en HLS exclusivement.
</li><li class="formatter-li">Debian 12.2
</li><li class="formatter-li">Peertube 6.0.1
</li><li class="formatter-li">ffmpeg 5.1.4<br />
</li></ul></td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">16/11/2023 17h30</td><td class="formatter-table-col">MAJ PostgreSQL</td><td class="formatter-table-col">Postgres 15.4 -> 15.5 (CVE-2023-5869)</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">12/09/2023 de 20h00 à 22h00</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col"><ul class="formatter-ul">
<li class="formatter-li">Debian 11.7 -> 12.1<br />
<ul class="formatter-ul">
<li class="formatter-li">noyau 6.1.52
</li><li class="formatter-li">ffmpeg 5.1.3
</li><li class="formatter-li">nginx 1.22.1
</li><li class="formatter-li">redis 7.0.11<br />
</li></ul>
</li><li class="formatter-li">Node 16 -> 18.17.1 LTS
</li><li class="formatter-li">Postgres 15.3 -> 15.4<br />
</li></ul></td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">09/09/2023</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 5.2.1</td>
    </tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">08/07/2023</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col">Debian 10 -> 11.7</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">25/06/2023</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 5.2.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">19/06/2023</td><td class="formatter-table-col">MAJ Postgres</td><td class="formatter-table-col">Postgres 11.20 -> 15.3</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">10/06/2022 19h55</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 4.2.0</td></tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">31/05/2022 (nuit)</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col"><ul class="formatter-ul">
<li class="formatter-li">Node.js 16.15
</li><li class="formatter-li">Debian 10.12 + Noyau 4.19.235-1
</li><li class="formatter-li">Postgres 11.16
</li><li class="formatter-li">Reboot serveur<br />
</li></ul></td>
    </tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">08/03/2022 11h25</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 4.1.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">23/02/2022 10h25</td><td class="formatter-table-col">MAJ Globale</td><td class="formatter-table-col"><ul class="formatter-ul">
        <li class="formatter-li">Peertube 4.1.0
        </li><li class="formatter-li">Node.js 16.14
        </li><li class="formatter-li">Postgres 11.15
        </li><li class="formatter-li">Noyau 4.19.208-1
        </li><li class="formatter-li">Reboot serveur<br />
        </li></ul></td>
    </tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">15/12/2021 10h40</td><td class="formatter-table-col">MAJ Globale</td><td class="formatter-table-col"><ul class="formatter-ul">
<li class="formatter-li">Peertube 4.0.0
</li><li class="formatter-li">Node.js 16.13.1
</li><li class="formatter-li">Postgres 11.14
</li><li class="formatter-li">Debian 10.11
</li><li class="formatter-li">Reboot serveur<br />
</li></ul>]</td>
    </tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">13/12/2021 19h50</td><td class="formatter-table-col">MAJ ffpmeg</td><td class="formatter-table-col"><ul class="formatter-ul">
    <li class="formatter-li">ffmpeg 4.2 --> 4.4.1 (compilation manuelle avec options --enable-gpl --enable-libaom --enable-libass <strong><span style="text-decoration: underline;">--enable-libfdk-aac</span></strong> --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree)<br />
</li></ul></td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">16/10/2021 21h28</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 3.4.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">27/09/2021 22h19</td><td class="formatter-table-col">MAJ Node</td><td class="formatter-table-col">Node.js 12.22.6</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">15/09/2021 9h55</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 3.4.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">19/08/2021 12h45</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 3.3.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">19/08/2021 12h24</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col"><ul class="formatter-ul">
    <li class="formatter-li">Node.js 12.22.5
    </li><li class="formatter-li">Postgres 11.13
    </li><li class="formatter-li">Debian 10.10 (Kernel 4.19.194-3)
    </li><li class="formatter-li">Reboot serveur<br />
</li></ul></td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">11/06/2021 23h30</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 3.2.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">03/04/2021 18h05</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 3.1.0</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">02/04/2021 22h30</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col"><ul class="formatter-ul">
    <li class="formatter-li">Node.js 12.22.0
    </li><li class="formatter-li">Postgres 11.11
    </li><li class="formatter-li">Debian 10.9
    </li><li class="formatter-li">Reboot serveur<br />
</li></ul></td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">07/02/2021 19h30</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 3.0.1</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">22/01/2021 00h30</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col"><ul class="formatter-ul">
    <li class="formatter-li">Node.js 12.20.1
    </li><li class="formatter-li">Postgres 11.10
    </li><li class="formatter-li">Debian 10.7
    </li><li class="formatter-li">Reboot serveur<br />
</li></ul></td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">13/09/2020 22h48</td><td class="formatter-table-col">MAJ Debian</td><td class="formatter-table-col"><ul class="formatter-ul">
    <li class="formatter-li">Node.js 10.22.0
    </li><li class="formatter-li">Peertube 2.4.0
    </li><li class="formatter-li">Postgres 11.9
    </li><li class="formatter-li">Debian 10.5
    </li><li class="formatter-li">Reboot serveur<br />
</li></ul></td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">23/06/2020 17h00</td><td class="formatter-table-col">Modification config</td><td class="formatter-table-col">ésactivation de la redondance (remote_redundancy > videos > accept_from : 'nobody'). Serveurs tiers non fiables, <a href="https://video.latavernedejohnjohn.fr/videos/watch/b5cd85b8-2e8d-44f3-93de-694311fc35d5">mauvaise expérience utilisateur</a>. Relance furtive + retrait de toutes les redondances de vidéos.</td></tr>
<tr class="formatter-table-row"><td class="formatter-table-col">13/09/2020 22h48</td><td class="formatter-table-col">MAJ Globale</td><td class="formatter-table-col"><ul class="formatter-ul">
    <li class="formatter-li">Node.js 10.21.0
    </li><li class="formatter-li">Peertube 2.2.0
    </li><li class="formatter-li">Postgres 11.8<br />
</li></ul></td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">27/02/2020</td><td class="formatter-table-col">MAJ Peertube</td><td class="formatter-table-col">Peertube 2.1.0 en 2.1.1 - Relance furtive</td></tr>
    <tr class="formatter-table-row"><td class="formatter-table-col">26/02/2020</td><td class="formatter-table-col">MAJ Globale + HLS</td><td class="formatter-table-col"><ul class="formatter-ul">
    <li class="formatter-li">Peertube 2.0.0 -> 2.1.0
    </li><li class="formatter-li">Postgres 11.6 -> 11.7
    </li><li class="formatter-li">Activation du mode HLS. Script de migration peertube-2.1.js ne parcourt aucune vidéo. Requête SQL ne renvoie aucune ligne. Certainement car le mode HLS n'était pas activé avant.
    </li><li class="formatter-li">Essai manuel OK avec le script <em>create-transcoding-job -- --generate-hls</em> sur vidéo Panasonic SA-PMX70.<br />
</li></ul></td></tr>
</table><br />
<h2 class="formatter-title">15/02/2020 - Passage de Postgres 9.6 en 11.6</h2><br />
La chose ne s'est pas faite sans mal. Pour ma part j'avais deux instances Postgres, une en 9.6 (en production) et l'autre en 11.6 (en attente) créée lors du passage de Debian 9 vers 10. Le but étant de migrer les données de l'une à l'autre. Comme on saute 2 versions majeures on ne peut pas juste copier les fichiers plats (ou sinon avec pg_upgrade). Une autre méthode simple pour réaliser cela est donc de faire un export et puis un import avec les utilitaires pg_dump et pg_restore. La base étant petite cela prend peu de temps. La base cible et les rôles ont été créés de prime-abord.<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">pg_dump <span style="color: #660033;">--host</span> <span style="color: #ff0000;">"localhost"</span> <span style="color: #660033;">--port</span> <span style="color: #ff0000;">"5432"</span> <span style="color: #660033;">--username</span> <span style="color: #ff0000;">"postgres"</span> <span style="color: #660033;">--dbname</span> <span style="color: #ff0000;">"peertube_prod"</span> <span style="color: #660033;">-c</span> <span style="color: #660033;">-Fc</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">"/tmp/sauvegarde_migration.backup"</span>
pg_restore <span style="color: #660033;">--clean</span> <span style="color: #660033;">--host</span> <span style="color: #ff0000;">"localhost"</span> <span style="color: #660033;">--port</span> <span style="color: #ff0000;">"5433"</span> <span style="color: #660033;">--username</span> <span style="color: #ff0000;">"peertube"</span> <span style="color: #660033;">--role</span> <span style="color: #ff0000;">"postgres"</span> <span style="color: #660033;">--dbname</span> <span style="color: #ff0000;">"peertube_prod"</span> <span style="color: #660033;">--verbose</span> <span style="color: #ff0000;">"/tmp/sauvegarde_migration.backup"</span></pre></pre></div></div><br />
Bref la procédure n'a rien de sorcier mais j'ai eu une erreur lors de l'importation.<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">pg_restore: création de INDEX « public.tag_name »
pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 2527 ; 1259 16649 INDEX tag_name peertube
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR:  n'a pas pu créer l'index unique « tag_name »
DÉTAIL : La clé (name)=(santanavevo) est dupliquée.
    La commande était : CREATE UNIQUE INDEX tag_name ON public.tag USING btree (name);
&nbsp;</pre></pre></div></div><br />
Bizarre que des valeurs soient dupliquées pour un index unique. Je ne m'explique pas comment, mais bon.<br />
Peertube détectant l'index manquant il re-tente de le créer au lancement de l'instance et tombe sur la même erreur. Oh étonnant !<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">févr. 15 01:18:59 peertube systemd[1]: Started PeerTube daemon.
févr. 15 01:18:59 peertube peertube[15777]: > peertube@2.0.0 start /var/www/peertube/versions/peertube-v2.0.0
févr. 15 01:18:59 peertube peertube[15777]: > node dist/server
févr. 15 01:19:01 peertube systemd[1]: Stopping PeerTube daemon...
févr. 15 01:19:01 peertube systemd[1]: peertube.service: Main process exited, code=killed, status=15/TERM
févr. 15 01:19:01 peertube systemd[1]: peertube.service: Succeeded.
févr. 15 01:19:01 peertube systemd[1]: Stopped PeerTube daemon.
févr. 15 01:20:45 peertube systemd[1]: Started PeerTube daemon.
févr. 15 01:20:46 peertube peertube[16021]: > peertube@2.0.0 start /var/www/peertube/versions/peertube-v2.0.0
févr. 15 01:20:46 peertube peertube[16021]: > node dist/server
févr. 15 01:20:48 peertube peertube[16021]: [video.latavernedejohnjohn.fr:443] 2020-02-15 01:20:48.289 info: Database peertube_prod is ready.
févr. 15 01:20:48 peertube peertube[16021]: [video.latavernedejohnjohn.fr:443] 2020-02-15 01:20:48.370 error: Cannot install application. {
févr. 15 01:20:48 peertube peertube[16021]:   "err": {
févr. 15 01:20:48 peertube peertube[16021]:     "stack": "SequelizeUniqueConstraintError: n'a pas pu créer l'index unique « tag_name »\n    at Query.formatError (/var/www/peertube/versions/peertube-v
févr. 15 01:20:48 peertube peertube[16021]:     "message": "n'a pas pu créer l'index unique « tag_name »",
févr. 15 01:20:48 peertube peertube[16021]:     "name": "SequelizeUniqueConstraintError",
févr. 15 01:20:48 peertube peertube[16021]:     "errors": {},
févr. 15 01:20:48 peertube peertube[16021]:     "parent": {
févr. 15 01:20:48 peertube peertube[16021]:       "stack": "error: n'a pas pu créer l'index unique « tag_name »\n    at Connection.parseE (/var/www/peertube/versions/peertube-v2.0.0/node_modules/pg/l
févr. 15 01:20:48 peertube peertube[16021]:       "message": "n'a pas pu créer l'index unique « tag_name »",
févr. 15 01:20:48 peertube peertube[16021]:       "name": "error",
févr. 15 01:20:48 peertube peertube[16021]:       "length": 188,
févr. 15 01:20:48 peertube peertube[16021]:       "severity": "ERREUR",
févr. 15 01:20:48 peertube peertube[16021]:       "code": "23505",
févr. 15 01:20:48 peertube peertube[16021]:       "detail": "La clé (name)=(santanavevo) est dupliquée.",
févr. 15 01:20:48 peertube peertube[16021]:       "schema": "public",
févr. 15 01:20:48 peertube peertube[16021]:       "table": "tag",
févr. 15 01:20:48 peertube peertube[16021]:       "constraint": "tag_name",
févr. 15 01:20:48 peertube peertube[16021]:       "file": "tuplesort.c",
févr. 15 01:20:48 peertube peertube[16021]:       "line": "4056",
févr. 15 01:20:48 peertube peertube[16021]:       "routine": "comparetup_index_btree",
févr. 15 01:20:48 peertube peertube[16021]:       "sql": "CREATE UNIQUE INDEX \"tag_name\" ON \"tag\" (\"name\")"
févr. 15 01:20:48 peertube peertube[16021]:     },
févr. 15 01:20:48 peertube peertube[16021]:     "sql": "CREATE UNIQUE INDEX \"tag_name\" ON \"tag\" (\"name\")"
févr. 15 01:20:48 peertube peertube[16021]:   }
févr. 15 01:20:48 peertube peertube[16021]: }
févr. 15 01:20:48 peertube peertube[16021]: npm ERR! code ELIFECYCLE
févr. 15 01:20:48 peertube peertube[16021]: npm ERR! errno 255
févr. 15 01:20:48 peertube peertube[16021]: npm ERR! peertube@2.0.0 start: `node dist/server`
févr. 15 01:20:48 peertube peertube[16021]: npm ERR! Exit status 255
févr. 15 01:20:48 peertube peertube[16021]: npm ERR!
févr. 15 01:20:48 peertube peertube[16021]: npm ERR! Failed at the peertube@2.0.0 start script.
févr. 15 01:20:48 peertube peertube[16021]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
févr. 15 01:20:48 peertube peertube[16021]: npm ERR! A complete log of this run can be found in:
févr. 15 01:20:48 peertube peertube[16021]: npm ERR!     /var/www/peertube/.npm/_logs/2020-02-15T00_20_48_386Z-debug.log</pre></pre></div></div><br />
Allez il faut faire un tour en base, et pourtant rien de bizarre de prime abord :<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">psql (11.6 (Debian 11.6-1.pgdg100+1), serveur 9.6.16)
Connexion SSL (protocole : TLSv1.3, chiffrement : TLS_AES_256_GCM_SHA384, bits : 256, compression : désactivé)
Saisissez « help » pour l'aide.
peertube_prod=> \x
Affichage étendu activé.
peertube_prod=> select * from tag where name='santanavevo';
-[ RECORD 1 ]-----
id   | 10311
name | santanavevo</pre></pre></div></div><br />
<br />
Et pourtant il y a bien anguille sous roche quand on essaye avec like :<br />
<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">peertube_prod=> select * from tag where name like '%santanavevo%';
-[ RECORD 1 ]-----
id   | 2092
name | santanavevo
-[ RECORD 2 ]-----
id   | 10311
name | santanavevo
peertube_prod=> select id,name::bytea from tag where name like '%santanavevo%';
-[ RECORD 1 ]------------------
id   | 2092
name | \x73616e74616e617665766f
-[ RECORD 2 ]------------------
id   | 10311
name | \x73616e74616e617665766f</pre></pre></div></div><br />
<br />
Deux tuples ressortent cette fois. Caractère parasite ? Reste à déterminer lequel est réellement utilisé :<br />
<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">peertube_prod=> select * from video where video.id in (select "videoId" from "videoTag" where "tagId"=2092);
(0 ligne)
peertube_prod=> select * from video where video.id in (select "videoId" from "videoTag" where "tagId"=10311);
-[ RECORD 1 ]---------+-------------------------------------------------------------------------------
id                    | 12916
uuid                  | 6c28dd73-2570-417f-8a8a-03c46dd07ef5
name                  | Santana - Corazon Espinado ft. Mana (Official Video)
category              | 1
licence               | 1
language              | es
privacy               | 1
nsfw                  | f
description           | Source : https://www.youtube.com/watch?v=t6omUxqhG78\r                        +
                      | \r                                                                            +
                      | Check out Santana's official music video for 'Corazon Espinado' ft. Mana.\r   +
                      | \r                                                                            +
                      | Click to listen to Santana on Spotify: http://smarturl.it/SanSpot?IQid=SanCE\r+
                      | \r                                                                            +
                      | As featured on Ultimate Santana. C...
support               |
duration              | 275
views                 | 1
likes                 | 0
dislikes              | 0
remote                | t
url                   | https://video.ploud.fr/videos/watch/6c28dd73-2570-417f-8a8a-03c46dd07ef5
commentsEnabled       | t
waitTranscoding       | t
state                 | 1
publishedAt           | 2019-08-02 02:16:11.913+02
channelId             | 343
createdAt             | 2019-08-02 02:16:11.913+02
updatedAt             | 2020-02-15 01:40:17.043+01
downloadEnabled       | t
originallyPublishedAt | 2013-10-02 00:00:00+02</pre></pre></div></div><br />
<br />
Cette vidéo n'utilise pas le tag 2092, donc on peut le supprimer sans crainte.<br />
<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">peertube_prod=> select * from "videoTag" where "videoId"=12916;
-[ RECORD 1 ]-------------------------
videoId   | 12916
tagId     | 2094
createdAt | 2020-01-28 03:41:28.985+01
updatedAt | 2020-01-28 03:41:28.985+01
-[ RECORD 2 ]-------------------------
videoId   | 12916
tagId     | 10312
createdAt | 2020-01-28 03:41:28.985+01
updatedAt | 2020-01-28 03:41:28.985+01
-[ RECORD 3 ]-------------------------
videoId   | 12916
tagId     | 10311
createdAt | 2020-01-28 03:41:28.985+01
updatedAt | 2020-01-28 03:41:28.985+01
-[ RECORD 4 ]-------------------------
videoId   | 12916
tagId     | 2091
createdAt | 2020-01-28 03:41:28.985+01
updatedAt | 2020-01-28 03:41:28.985+01
-[ RECORD 5 ]-------------------------
videoId   | 12916
tagId     | 2090
createdAt | 2020-01-28 03:41:28.985+01
updatedAt | 2020-01-28 03:41:28.985+01
peertube_prod=> delete from tag where id=2092;
DELETE 1</pre></pre></div></div><br />
<br />
Je croyais qu'il n'y en avait qu'un seul. Donc au bout d'un moment, on compte les doublons, 27 au total.<br />
<br />
<div class="formatter-container formatter-code code-XML"><span class="formatter-title">Code XML :</span><div class="formatter-content"><pre style="display:inline;"><pre class="xml" style="font-family:monospace;">peertube_prod=> SELECT name, COUNT(*) occurrences FROM tag GROUP BY name HAVING COUNT(*) > 1;
      name      | occurrences
----------------+-------------
 Keep           |           2
 open source    |           2
 Musique        |           2
 #Musique       |           2
 open-source    |           2
 thinkerview    |           2
 петр великий   |           2
 ke$ha vevo     |           2
 cotton eye joe |           2
 cottoneyejoe   |           2
 hip hop        |           2
 hip-hop        |           2
 Don't          |           2
 #FreeCAD       |           2
 острова        |           2
 паломничество  |           2
 FreeCAD        |           2
 Dont           |           2
 lofi           |           2
 neg'marron     |           2
 music          |           2
 #music         |           2
 let's play     |           2
 thinker view   |           2
 anime          |           2
 hiphop         |           2
 negmarron      |           2
(27 lignes)
&nbsp;</pre></pre></div></div><br />
<br />
On commence par supprimer tous les tags qui ne sont utilisés par aucune vidéo. Ce qui en élimine 1444.<br />
<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">peertube_prod=> begin;
BEGIN
peertube_prod=> delete from tag where id IN (select id from tag where id not in (select distinct "tagId" from "videoTag"));
DELETE 1444
peertube_prod=> commit;
COMMIT</pre></pre></div></div><br />
<br />
Ce qui fait redescendre le nombre de doublons à 7.<br />
<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">peertube_prod=> SELECT name, COUNT(*) occurrences FROM tag GROUP BY id, name HAVING COUNT(*) > 1;
     name      | occurrences
---------------+-------------
 thinkerview   |           2
 hip-hop       |           2
 паломничество |           2
 FreeCAD       |           2
 music         |           2
 anime         |           2
 hiphop        |           2
(7 lignes)</pre></pre></div></div><br />
Après quelques updates manuels pour résorber ces 7 derniers doublons, l'import se fait sans souci.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2020/267/1.png" alt="" class="b-lazy" /><br />
Reste à passer à la version 2.1.0 de Peertube la semaine prochaine.]]></description>
			<pubDate>Sat, 15 Feb 2020 12:56:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title><![CDATA[Peertube - Uploader de très gros fichiers]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/251-peertube-uploader-de-tres-gros-fichiers/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/251-peertube-uploader-de-tres-gros-fichiers/</guid>
			<description><![CDATA[<span class="message-helper warning"><strong>OBSOLÈTE !!! </strong><strong>OBSOLÈTE !!! </strong><strong>OBSOLÈTE !!! </strong></span><br />
<h3 class="formatter-title">Procédure d'upload de gros fichiers sur Peertube supérieurs à 8Go - 'The hard way'. </h3><br />
<span class="message-helper warning"><strong>OBSOLÈTE !!! </strong><strong>OBSOLÈTE !!! </strong><strong>OBSOLÈTE !!! </strong></span><br />
Perso même après avoir bidouillé nginx dans tous les sens je n'arrive à rien. Une fois bien configuré (client_max_body_size, client_body_temp_path, augmentation des timeout), nginx récupère bien et stocke le fichier envoyé dans son espace d'upload en intégralité. Ayant la fibre j'ai pu tester des fichiers jusqu'à 32Go et cela ne pose pas de problème. nginx n'a rien à voir dans l'histoire pour moi.<br />
<br />
<div class="formatter-container formatter-code code-TEXT"><span class="formatter-title">Code TEXT :</span><div class="formatter-content"><pre style="display:inline;"><pre class="text" style="font-family:monospace;">client_max_body_size 32G;
proxy_connect_timeout       2400;
proxy_send_timeout          2400;
proxy_read_timeout          2400;
send_timeout                2400;
client_body_temp_path /peerstor/uploads/; </pre></pre></div></div><br />
<br />
Il y a de la place !<br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">df</span> <span style="color: #660033;">-h</span> <span style="color: #000000; font-weight: bold;">/</span>peerstor<span style="color: #000000; font-weight: bold;">/</span>uploads<span style="color: #000000; font-weight: bold;">/</span>
Sys. de fichiers Taille Utilisé Dispo Uti<span style="color: #000000; font-weight: bold;">%</span> Monté sur
<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md8           <span style="color: #000000;">1</span>,8T     74G  <span style="color: #000000;">1</span>,8T   <span style="color: #000000;">5</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>peerstor</pre></pre></div></div><br />
<br />
Le problème c'est quand Peertube arrive derrière pour le copier dans son répertoire temporaire et y faire ses affaires, la copie ne se fait pas entièrement et bloque à un stade de manière aléatoire au bout de quelques Go de copie (souvent 2Go pile). J'ai l'impression que la copie est faite en dure par Peertube lui-même plutôt que faite par le système (simple copie système, du genre avec mv). Il s'en suit une erreur 503 ou 502 "backend" sur l'IHM d'upload sur Firefox ou Chrome. Le formulaire d'upload est remis à zéro. J'ai lâché l'affaire.<br />
<br />
Plus d'infos : <a href="http://burogu.makotoworkshop.org/index.php?post/2018/12/08/bigfilepeertube">http://burogu.makotoworkshop.org/index.php?post/2018/12/08/bigfilepeertube</a><br />
<br />
Cette procédure de contournement est un filoutage qui nécessite un accès SSH/admin sur l'instance. C'est lourdingue mais bon, on fait comme on peut hein. Heureusement que Chocobozz a prévu quelques petits scripts bien utiles, dont un qui justement permet de contourner le système d'upload HTTP et à prendre un fichier directement déjà présent sur le serveur.<br />
<br />
<ul class="formatter-ul">
    <li class="formatter-li">Importer un fichier vidéo bidon (1080p) de quelques secondes à peine via l'interface navigateur. Penser à mettre la vidéo en privée. Laissez le transcodage se faire normalement (720p et 480p dans mon cas).
    </li><li class="formatter-li">Récupérer l'ID généré de la vidéo uploadée (dans les URL). Par exemple : e9a72892-f5f1-46af-a126-70e0c9fefb90
    </li><li class="formatter-li">Supprimer (avec pgAdmin3/psql) dans la table "videoFile" les n enregistrements liés aux résolutions inférieures à la vidéo source (clé étrangère videoId). Une ligne par résolution.
    </li><li class="formatter-li">Supprimer (rm) aussi les fichiers vidéos associés à ces résolutions inférieures (e9a72892-f5f1-46af-a126-70e0c9fefb90-720.mp4 et e9a72892-f5f1-46af-a126-70e0c9fefb90-480.mp4).
    </li><li class="formatter-li">Uploader le gros fichier vidéo sur le serveur par un autre moyen que HTTP/HTTPS, par exemple via SSH.
    </li><li class="formatter-li">Remplacer la vidéo existante :<br />
<ul class="formatter-ul">
    <li class="formatter-li">Lancer le script d'import (create-import-video-file-job.js) :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>peertube<span style="color: #000000; font-weight: bold;">/</span>peertube-latest
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #660033;">-u</span> peertube <span style="color: #007800;">NODE_CONFIG_DIR</span>=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>peertube<span style="color: #000000; font-weight: bold;">/</span>config <span style="color: #007800;">NODE_ENV</span>=production npm run create-import-video-file-job <span style="color: #660033;">--</span> <span style="color: #660033;">-v</span> e9a72892-f5f1-46af-a126-70e0c9fefb90 <span style="color: #660033;">-i</span> <span style="color: #000000; font-weight: bold;">/</span>peerstor<span style="color: #000000; font-weight: bold;">/</span>videos<span style="color: #000000; font-weight: bold;">/</span>maVraieVideoQuiRemplaceLaVideoBidon.mp4</pre></pre></div></div>
    </li><li class="formatter-li">Aller dans les jobs en se connectant root sur l'IHM Peertube (Administration > Système > Travaux)
    </li><li class="formatter-li">Attendre que son état devienne "completed". Cela peut être long (copie + calcul du infoHash).
    </li><li class="formatter-li">Le fichier e9a72892-f5f1-46af-a126-70e0c9fefb90-1080.mp4 sera remplacé par une copie de maVraieVideoQuiRemplaceLaVideoBidon.mp4 (ils auront la même taille, on peut éventuellement vérifier par md5sum/sha512sum).<br />
</li></ul>
    </li><li class="formatter-li">Supprimer le fichier vidéo source devenu inutile /peerstor/videos/maVraieVideoQuiRemplaceLaVideoBidon.mp4 (rm).
    </li><li class="formatter-li">A ce stade seul le fichier 1080p a été substitué, il faut ensuite explicitement demander à re-encoder tout et générer les résolutions inférieures :<br />
<ul class="formatter-ul">
    <li class="formatter-li">Lancer le script de transcodage (create-transcoding-job.js) pour :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>peertube<span style="color: #000000; font-weight: bold;">/</span>peertube-latest
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #660033;">-u</span> peertube <span style="color: #007800;">NODE_CONFIG_DIR</span>=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>peertube<span style="color: #000000; font-weight: bold;">/</span>config <span style="color: #007800;">NODE_ENV</span>=production npm run create-transcoding-job <span style="color: #660033;">--</span> <span style="color: #660033;">-v</span> e9a72892-f5f1-46af-a126-70e0c9fefb90</pre></pre></div></div>
    </li><li class="formatter-li">Aller dans les jobs en se connectant root sur l'IHM Peertube (Administration > Système > Travaux)
    </li><li class="formatter-li">Attendre que son état devienne "completed".<br />
</li></ul>
    </li><li class="formatter-li">Si la durée de la vidéo n'est plus la même : modifier manuellement avec pgAdmin/psql la durée de la vidéo (car elle n'est pas mise à jour par les scripts), il s'agit de la colonne "duration" de la table "video". La valeur est un integer qui représente des secondes. Commande pour avoir la valeur à mettre :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">expr</span> <span style="color: #000000; font-weight: bold;">`</span>mediainfo <span style="color: #660033;">--Inform</span>=<span style="color: #ff0000;">"General;%Duration%"</span> e9a72892-f5f1-46af-a126-70e0c9fefb90-<span style="color: #000000;">1080</span>.mp4<span style="color: #000000; font-weight: bold;">`</span> <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000;">1000</span></pre></pre></div></div>
    </li><li class="formatter-li">Tester la vidéo, vérifier que tout est OK dans toutes les résolutions.
    </li><li class="formatter-li">Passer la vidéo en statut public.<br />
</li></ul><br />
<br />
That's it !<br />
<br />
Toutes ces manipulations sont scriptables si on y met un peu de volonté. Perso cela ne concerne qu'a peine quelques vidéos très longues chez moi, donc je le fais manuellement, ça ne vaut pas le coup. Un pgAdmin lancé en SSH avec affichage à distance c'est hyper pratique pour faire des petites modifications rapidement à la souris sans avoir à taper du SQL.]]></description>
			<pubDate>Thu, 15 Aug 2019 20:03:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title><![CDATA[Installation d'une instance Peertube (sur Debian Stretch 9.6)]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/217-installation-d-une-instance-peertube-sur-debian-stretch-9-6/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/217-installation-d-une-instance-peertube-sur-debian-stretch-9-6/</guid>
			<description><![CDATA[<p style="text-align: center;"><img src="https://www.jonathandupre.fr/images/articles/2018/217/img-01-2.jpg" alt="img-01-2" /></p><br />
Exemple d'installation d'une instance Peertube en mode production, publique pour le web (extranet).<br />
Il existe une version <a href="https://install-app.yunohost.org/?app=peertube">YunoHost</a> ainsi qu'en <a href="https://github.com/Chocobozzz/2018/217/blob/develop/support/doc/docker.md">conteneur Docker</a><br />
<h2 class="formatter-title">1 - Le choix du serveur (attention au transcodage)</h2><br />
Concernant le processeur, attention à ne pas prendre de CPU trop faible comme par exemple un Intel Atom, car Peertube transcode chaque vidéo uploadée sur le serveur lui-même via ffmpeg. Et plus le CPU est petit plus cela va mettre du temps. Pour exemple sur un serveur Kimsufi KS-3 CPU Intel Atom N2800 - 2 threads réservés pour une vidéo de 6 minutes uploadée (1080p 6Mbps). Rappel : le fichier original en 1080p (ou plus) est lui-aussi transcodé.<br />
<table class="formatter-table" style="width:100%; margin-right:auto;  margin-left:auto">
    <tr class="formatter-table-row">
        <th class="formatter-table-head">Résolution</th>
        <th class="formatter-table-head">Total</th>
        <th class="formatter-table-head">Ratio</th>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">1080</td>
        <td class="formatter-table-col">60 minutes</td>
        <td class="formatter-table-col">x10</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">480</td>
        <td class="formatter-table-col">15 minutes</td>
        <td class="formatter-table-col">x2.5</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">360</td>
        <td class="formatter-table-col">11 minutes</td>
        <td class="formatter-table-col">x1.83</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">720</td>
        <td class="formatter-table-col">29 minutes</td>
        <td class="formatter-table-col">x4.83</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">240</td>
        <td class="formatter-table-col">6 minutes</td>
        <td class="formatter-table-col">x1</td>
    </tr>
</table><br />
<p style="text-align: center;"><strong>Total = 60 + 15 + 11 + 29 + 6 = 121 minutes = 2 heures de conversion pour 6 minutes de vidéos</strong></p><br />
La même chose sur un Xeon E3-1225 V2 dans les mêmes conditions :<br />
<table class="formatter-table" style="width:100%; margin-right:auto;  margin-left:auto">
    <tr class="formatter-table-row">
        <th class="formatter-table-head">Résolution</th>
        <th class="formatter-table-head">Total</th>
        <th class="formatter-table-head">Ratio</th>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">1080</td>
        <td class="formatter-table-col">7 minutes</td>
        <td class="formatter-table-col">x1</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">480</td>
        <td class="formatter-table-col">2 minutes</td>
        <td class="formatter-table-col">x0.3</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">360</td>
        <td class="formatter-table-col">2 minutes</td>
        <td class="formatter-table-col">x0.3</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">720</td>
        <td class="formatter-table-col">3 minutes</td>
        <td class="formatter-table-col">x0.5</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">240</td>
        <td class="formatter-table-col">2 minutes</td>
        <td class="formatter-table-col">x0.3</td>
    </tr>
</table><br />
<p style="text-align: center;"><strong>Total = 7 + 2 + 2 + 3 + 2 = 16 minutes de conversion pour 6 minutes de vidéos</strong></p><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/217/transcoding.png" alt="" class="b-lazy" /><br />
Chaque résolution transcodée engendre la création de fichiers vidéos supplémentaires (un fichier suffixé pour chaque définition inférieure). Ces fichiers réclament évidemment de l'espace. Si la vidéo originale en 1080p occupe 110Mo à elle seule, avec les définitions inférieures on arrive presque au double (total = 205Mo).<br />
On pourrait donc être tenté de désactiver le transcodage dans les paramètres de Peertube, seulement :<br />
<ul class="formatter-ul">
    <li class="formatter-li">le fichier téléversé sur le serveur peut ne pas être compatible avec tous les navigateurs clients.
    </li><li class="formatter-li">certains clients n'ont pas le débit ADSL pour regarder la vidéo native en 1080, il faut donc proposer le 720p voire même en dessous pour économiser la bande passante pour les mobiles.
    </li><li class="formatter-li">il n'existe pour le moment aucun moyen facile de transcoder sur son PC toutes les résolutions et de téléverser les fichiers directement. Ce qui aurait été pratique pour ceux qui ont la fibre. Si vous tentez un max de bricolage en base de données vous attend et il vaut mieux éviter.<br />
</li></ul><br />
Pour la mémoire évidemment tout dépend de la charge et du nombre de vidéos et d'utilisateurs à desservir, 2-4Go de RAM sont largement suffisants. Si plus, ce sera utilisé en tant que cache de vidéos et autres fichiers statiques par l'OS, cela n'est pas perdu.<br />
<h2 class="formatter-title">Let's GO !</h2><br />
Vous vous apercevrez que la procédure "hardcore" est longue mais pas infaisable pour autant. Bon courage.<br />
<h2 class="formatter-title">2 - Première connexion au serveur livré & préparation/personnalisation du système</h2><br />
Après livraison d'un serveur chez Kimsufi/SoYouStart/PeuImporte, se connecter en root avec le couple login/mot de passe fourni par courriel. Rappel : les courriels sont aussi visibles depuis l'interface client (Mon Compte > Mes emails > "Installation de votre serveur terminée").<br />
<h4 class="formatter-title">Mise à jour du serveur (pas toujours nécessaire)</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">apt-get update</span>
<span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">apt-get upgrade</span>
<span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>debian_version
<span style="color: #000000;">9.6</span></pre></pre></div></div><br />
<h4 class="formatter-title">Remettre le serveur dans le bon fuseau horaire (Europe/Paris)</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>dpkg-reconfigure tzdata</pre></pre></div></div><br />
<h4 class="formatter-title">Création d'un utilisateur lambda* + génération d'une paire de clés</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>useradd lambda <span style="color: #660033;">-d</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>lambda <span style="color: #660033;">-m</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span>
<span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">su</span> - lambda
<span style="color: #666666;">lambda@peertube:~$</span><span style="color: #c20cb9; font-weight: bold;">ssh-keygen</span>
<span style="color: #666666;">lambda@peertube:~$</span><span style="color: #7a0874; font-weight: bold;">exit</span></pre></pre></div></div><br />
* = Le nom lambda est ici volontairement générique car donner le d'utilisateur réel que j'utilise serait une aide pour d'éventuels tipiakeurs. Donc à vous de le remplacer par ce que vous voulez, soyez inventif.<br />
<h4 class="formatter-title">Activer le mécanisme de sudoers + rajouter lambda aux sudoers</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>apt <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span>
<span style="color: #666666;">root@peertube:~#</span>usermod <span style="color: #660033;">-aG</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> lambda</pre></pre></div></div><br />
<h4 class="formatter-title">Positionner un mot de passe à l'utilisateur lambda</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">passwd</span> lambda</pre></pre></div></div><br />
<h4 class="formatter-title">Contrôle</h4><br />
A ce stade vérifier que lambda peut se connecter en SSH au serveur avec son mot de passe (avec une nouvelle session à part). Une fois connecté vérifier que lambda peut passer root via sudo :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">lambda@peertube:~$</span><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">su</span> -
<span style="color: #666666;">root@peertube:~#</span></pre></pre></div></div><br />
<h4 class="formatter-title">Sécurisations SSH (Facultatif mais très conseillé)</h4><br />
Copier votre clé publique dans le fichier authorized_keys de lambda (dans mon cas depuis Mobaxterm). <a href="https://cinhtau.net/2016/02/03/use-ssh-keys-for-authentication-with-mobaxterm/">Suivre ce tutoriel</a> pour plus d'informations. La même chose peut se faire <a href="https://devops.profitbricks.com/tutorials/use-ssh-keys-with-putty-on-windows/">avec PuTTY</a>, et c'est bien évidemment encore plus facile depuis Linux.<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">ssh-copy-id lambda<span style="color: #000000; font-weight: bold;">@</span>IP_SERVEUR</pre></pre></div></div><br />
Reconfigurer le démon SSHD :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">vi</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ssh<span style="color: #000000; font-weight: bold;">/</span>sshd_config</pre></pre></div></div><br />
<ul class="formatter-ul">
    <li class="formatter-li">Port XXXX (changer le port par défaut, mettre autre que 22)
    </li><li class="formatter-li">LoginGraceTime (descendre)
    </li><li class="formatter-li">MaxAuthTries (descendre)
    </li><li class="formatter-li">PermitRootLogin no (ne pas autoriser la connexion au compte root depuis SSH)
    </li><li class="formatter-li">PubkeyAuthentication yes (activer l'authentification par clé publique)
    </li><li class="formatter-li">X11Forwarding yes (activer la redirection X11, vous en aurez besoin, activé par défaut)
    </li><li class="formatter-li">PasswordAuthentication no (désactiver l'authentification par mot de passe)<br />
</li></ul><br />
Relancer le démon SSHD pour prendre en compte les changements :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>systemctl restart sshd</pre></pre></div></div><br />
Dorénavant seul l'utilisateur lambda peut se connecter au serveur sur le nouveau port SSH indiqué et uniquement avec la clé publique du client (Mobaxterm/PuTTY).<br />
<h4 class="formatter-title">Installation de divers paquets intéressants</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">apt-get install</span> htop iperf iperf3 speedtest-cli ufw curl <span style="color: #c20cb9; font-weight: bold;">file</span> fail2ban</pre></pre></div></div><br />
Tester la bande passante du serveur :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~# </span>speedtest-cli
Retrieving speedtest.net configuration...
Testing from OVH SAS <span style="color: #7a0874; font-weight: bold;">&#40;</span>188.165.236.17<span style="color: #7a0874; font-weight: bold;">&#41;</span>...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Naitways <span style="color: #7a0874; font-weight: bold;">&#40;</span>Paris<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1.88</span> km<span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #000000;">5.041</span> ms
Testing download speed................................................................................
Download: <span style="color: #000000;">818.86</span> Mbit<span style="color: #000000; font-weight: bold;">/</span>s
Testing upload speed....................................................................................................
Upload: <span style="color: #000000;">251.53</span> Mbit<span style="color: #000000; font-weight: bold;">/</span>s</pre></pre></div></div><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~# </span>iperf <span style="color: #660033;">-c</span> ping.online.net
<span style="color: #660033;">------------------------------------------------------------</span>
Client connecting to ping.online.net, TCP port <span style="color: #000000;">5001</span>
TCP window size: <span style="color: #000000;">85.0</span> KByte <span style="color: #7a0874; font-weight: bold;">&#40;</span>default<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #660033;">------------------------------------------------------------</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span>  <span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">local</span> 188.165.236.17 port <span style="color: #000000;">39566</span> connected with 62.210.18.40 port <span style="color: #000000;">5001</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span> ID<span style="color: #7a0874; font-weight: bold;">&#93;</span> Interval       Transfer     Bandwidth
<span style="color: #7a0874; font-weight: bold;">&#91;</span>  <span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>  <span style="color: #000000;">0.0</span>-<span style="color: #000000;">10.0</span> sec   <span style="color: #000000;">301</span> MBytes   <span style="color: #000000;">252</span> Mbits<span style="color: #000000; font-weight: bold;">/</span>sec</pre></pre></div></div><br />
<h4 class="formatter-title">Configuration et activation du pare-feu (facultatif mais très conseillé)</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>ufw logging off <span style="color: #666666; font-style: italic;">#(désactiver journalisation)</span>
<span style="color: #666666;">root@peertube:~#</span>ufw allow <span style="color: #000000;">80</span><span style="color: #000000; font-weight: bold;">/</span>tcp <span style="color: #666666; font-style: italic;">#(Peertube NGINX HTTP)</span>
<span style="color: #666666;">root@peertube:~#</span>ufw allow <span style="color: #000000;">443</span><span style="color: #000000; font-weight: bold;">/</span>tcp <span style="color: #666666; font-style: italic;">#(Peertube NGINX HTTPS)</span>
<span style="color: #666666;">root@peertube:~#</span>ufw allow <span style="color: #000000;">9000</span><span style="color: #000000; font-weight: bold;">/</span>tcp <span style="color: #666666; font-style: italic;">#(Peertube Node.js websockets)</span></pre></pre></div></div><br />
Concernant l'accès via SSH :<br />
Option 1 - Soit SSH accessible uniquement depuis la maison, s'assurer d'avoir une IP fixe ! (Plus sécurisé)<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>ufw allow proto tcp from <span style="color: #007800;">$IP_MAISON</span> to any port <span style="color: #007800;">$PORT_SSH</span></pre></pre></div></div><br />
Option 2 - Soit SSH accessible depuis partout (Moins sécurisé, trouvable par nmap)<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>ufw allow <span style="color: #007800;">$PORT_SSH</span><span style="color: #000000; font-weight: bold;">/</span>tcp</pre></pre></div></div><br />
Facultatif - Ajout supervision par SNMP (par exemple avec Centreon) accessible uniquement depuis la maison, s'assurer d'avoir une IP fixe :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>ufw allow proto udp from <span style="color: #007800;">$IP_MAISON</span> to any port <span style="color: #000000;">161</span></pre></pre></div></div><br />
Activer le pare-feu et activer son lancement au démarrage :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>ufw <span style="color: #7a0874; font-weight: bold;">enable</span>
<span style="color: #666666;">root@peertube:~#</span>systemctl <span style="color: #7a0874; font-weight: bold;">enable</span> ufw</pre></pre></div></div><br />
Faire un reboot et confirmer que le serveur est toujours accessible.<br />
<h2 class="formatter-title">3 - Pré-installation de Peertube</h2><br />
<span class="message-helper notice"><span style="font-size: 16px;">La documentation officielle est accessible ici : <a href="https://docs.joinpeertube.org/#/install-any-os?id=installation"><strong>https://docs.joinpeertube.org/#/install-any-os?id=installation</strong></a><br />
Il est très conseillé de la suivre. Ce qui est marqué ici date de 2018. Il peut y avoir des différences depuis.</span></span><br />
<h4 class="formatter-title">Installer les pré-requis (dépendances) - Partie 1</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get install</span> <span style="color: #c20cb9; font-weight: bold;">unzip</span> nginx <span style="color: #c20cb9; font-weight: bold;">ffmpeg</span> pgadmin3 pgtop pg-activity postgresql postgresql-contrib openssl <span style="color: #c20cb9; font-weight: bold;">g++</span> <span style="color: #c20cb9; font-weight: bold;">make</span> redis-tools redis-server <span style="color: #c20cb9; font-weight: bold;">git</span> certbot python-certbot-nginx xauth mediainfo</pre></pre></div></div><br />
<h4 class="formatter-title">Installer les pré-requis (dépendances) - Partie 2 (Node.js - Version 10 au moment de la création de cette page)</h4><br />
Rappel : N'utilisez pas les versions majeures impaires de Node.js.<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>curl <span style="color: #660033;">-sL</span> https:<span style="color: #000000; font-weight: bold;">//</span>deb.nodesource.com<span style="color: #000000; font-weight: bold;">/</span>setup_10.x <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">bash</span> -
<span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">apt-get install</span> <span style="color: #660033;">-y</span> nodejs</pre></pre></div></div><br />
<h4 class="formatter-title">Installer les pré-requis (dépendances) - Partie 3 (Yarn)</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>curl <span style="color: #660033;">-sS</span> https:<span style="color: #000000; font-weight: bold;">//</span>dl.yarnpkg.com<span style="color: #000000; font-weight: bold;">/</span>debian<span style="color: #000000; font-weight: bold;">/</span>pubkey.gpg <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-key add</span> -
<span style="color: #666666;">root@peertube:~#</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">"deb https://dl.yarnpkg.com/debian/ stable main"</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>apt<span style="color: #000000; font-weight: bold;">/</span>sources.list.d<span style="color: #000000; font-weight: bold;">/</span>yarn.list
<span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">apt-get update</span> <span style="color: #000000; font-weight: bold;">&&</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> yarn
<span style="color: #666666;">root@peertube:~# </span>yarn <span style="color: #660033;">--version</span>
1.12.3
&nbsp;</pre></pre></div></div><br />
<span class="message-helper warning">MAJ décembre 2021 : <a href="https://www.opensourceagenda.com/projects/2018/217/versions">Comme indiqué dans les changelogs de Peertube</a> : <strong>Attention à votre version d'ffmpeg !</strong> Il se peut que la version de votre distribution soit trop ancienne (< 4.1). La version 4.4.0 n'est pas compatible avec Peertube. J'ai recompilé manuellement en 4.2 il fût un temps puis en version 4.4.1 récemment pour ne pas avoir de problème. Si vous compilez, pensez à rajouter la bibliothèque libfdk-aac car Peertube s'en sert.</span><br />
<h4 class="formatter-title">Créer l'utilisateur système peertube et renseigner son mot de passe</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>useradd <span style="color: #660033;">-m</span> <span style="color: #660033;">-d</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>peertube <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span> <span style="color: #660033;">-p</span> peertube peertube
<span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">passwd</span> peertube
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd: password updated successfully
&nbsp;</pre></pre></div></div><br />
<h4 class="formatter-title">Créer le rôle peertube + la base de données PostgreSQL nommée peertube_prod</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">su</span> - postgres
<span style="color: #666666;">postgres@peertube:~$</span>createuser <span style="color: #660033;">-P</span> peertube
<span style="color: #7a0874; font-weight: bold;">&#91;</span>CHOISIR UN MOT DE PASSE ET LE RETENIR <span style="color: #000000; font-weight: bold;">!!!</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #666666;">postgres@peertube:~$</span>createdb <span style="color: #660033;">-O</span> peertube <span style="color: #660033;">-E</span> UTF8 <span style="color: #660033;">-T</span> template0 peertube_prod
<span style="color: #666666;">postgres@peertube:~$</span>psql <span style="color: #660033;">-c</span> <span style="color: #ff0000;">"CREATE EXTENSION pg_trgm;"</span> peertube_prod
<span style="color: #666666;">postgres@peertube:~$</span>psql <span style="color: #660033;">-c</span> <span style="color: #ff0000;">"CREATE EXTENSION unaccent;"</span> peertube_prod</pre></pre></div></div><br />
<h2 class="formatter-title">4 - Récupération & installation de Peertube</h2><br />
Créer les dossiers d'installation :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">su</span> - peertube
<span style="color: #666666;">peertube@peertube:~$</span><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>peertube <span style="color: #000000; font-weight: bold;">&&</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #660033;">-u</span> peertube <span style="color: #c20cb9; font-weight: bold;">mkdir</span> config storage versions <span style="color: #000000; font-weight: bold;">&&</span> <span style="color: #7a0874; font-weight: bold;">cd</span> versions</pre></pre></div></div><br />
Récupérer le nom de la dernière version disponible :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">peertube@peertube:~$</span><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">VERSION</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span>curl <span style="color: #660033;">-s</span> https:<span style="color: #000000; font-weight: bold;">//</span>api.github.com<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>chocobozzz<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">217</span><span style="color: #000000; font-weight: bold;">/</span>releases<span style="color: #000000; font-weight: bold;">/</span>latest <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> tag_name <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">'"'</span> <span style="color: #660033;">-f</span> <span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&&</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">"Latest Peertube version is <span style="color: #007800;">$VERSION</span>"</span></pre></pre></div></div><br />
Récupération du .zip de la dernière version :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">peertube@peertube:~$</span><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">217</span><span style="color: #000000; font-weight: bold;">/</span>versions
peertube<span style="color: #000000; font-weight: bold;">@</span>peertube:~<span style="color: #000000; font-weight: bold;">/</span>versions<span style="color: #007800;">$wget</span> <span style="color: #660033;">-q</span> <span style="color: #ff0000;">"https://github.com/Chocobozzz/2018/217/releases/download/<span style="color: #007800;">${VERSION}</span>/peertube-<span style="color: #007800;">${VERSION}</span>.zip"</span></pre></pre></div></div><br />
Dézip et création d'un lien symbolique :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">peertube<span style="color: #000000; font-weight: bold;">@</span>peertube:~<span style="color: #000000; font-weight: bold;">/</span>versions<span style="color: #007800;">$unzip</span> peertube-<span style="color: #800000;">${VERSION}</span>.zip <span style="color: #000000; font-weight: bold;">&&</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> peertube-<span style="color: #800000;">${VERSION}</span>.zip
peertube<span style="color: #000000; font-weight: bold;">@</span>peertube:~<span style="color: #000000; font-weight: bold;">/</span>versions<span style="color: #007800;">$cd</span> ..<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">&&</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> versions<span style="color: #000000; font-weight: bold;">/</span>peertube-<span style="color: #800000;">${VERSION}</span> .<span style="color: #000000; font-weight: bold;">/</span>peertube-latest</pre></pre></div></div><br />
Installation :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">peertube@peertube:~$</span><span style="color: #7a0874; font-weight: bold;">cd</span> .<span style="color: #000000; font-weight: bold;">/</span>peertube-latest <span style="color: #000000; font-weight: bold;">&&</span> yarn <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #660033;">--production</span> <span style="color: #660033;">--pure-lockfile</span>
yarn <span style="color: #c20cb9; font-weight: bold;">install</span> v1.12.3
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">5</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> Validating package.json...
...
...
...
...
Done <span style="color: #000000; font-weight: bold;">in</span> 20.68s.
Done <span style="color: #000000; font-weight: bold;">in</span> 60.29s.</pre></pre></div></div><br />
<h2 class="formatter-title">5 - Configurer Peertube + divers</h2><br />
Copier le modèle de fichier de configuration fourni :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>peertube <span style="color: #000000; font-weight: bold;">&&</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #660033;">-u</span> peertube <span style="color: #c20cb9; font-weight: bold;">cp</span> peertube-latest<span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>production.yaml.example config<span style="color: #000000; font-weight: bold;">/</span>production.yaml</pre></pre></div></div><br />
Editez le fichier de configuration : <div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">vi</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">217</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>production.yaml</pre></pre></div></div><br />
Le remplacement des deux premières valeurs du tableau est indispensable ! Le reste peut être fait plus tard via l'interface d'administration web.<br />
<table class="formatter-table" style="width:100%; margin-right:auto;  margin-left:auto">
    <tr class="formatter-table-row">
        <th class="formatter-table-head">Nom valeur</th>
        <th class="formatter-table-head">Par défaut</th>
        <th class="formatter-table-head">Description</th>
        <th class="formatter-table-head">Exemple</th>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">webserver-hostname</td>
        <td class="formatter-table-col">example.com</td>
        <td class="formatter-table-col">FQDN instance</td>
        <td class="formatter-table-col">video.jonathandupre.fr</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">database-password</td>
        <td class="formatter-table-col">peertube</td>
        <td class="formatter-table-col">Mot de passe du rôle peertube (postgresql)</td>
        <td class="formatter-table-col"></td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">log-level</td>
        <td class="formatter-table-col">info</td>
        <td class="formatter-table-col">Verbosité du log</td>
        <td class="formatter-table-col">warning</td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">admin-email</td>
        <td class="formatter-table-col">admin@example.com</td>
        <td class="formatter-table-col">Adresse courriel compte admin</td>
        <td class="formatter-table-col"></td>
    </tr>
    <tr class="formatter-table-row">
        <td class="formatter-table-col">transcoding-threads</td>
        <td class="formatter-table-col">1</td>
        <td class="formatter-table-col">Nombre de threads occupés pour l'encodage</td>
        <td class="formatter-table-col">Selon le nombre de c&#339;urs de votre serveur (2 pour un quad core)</td>
    </tr>
</table><br />
<h4 class="formatter-title">Configurer NGINX</h4><br />
Copier le fichier de configuration fourni :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">217</span><span style="color: #000000; font-weight: bold;">/</span>peertube-latest<span style="color: #000000; font-weight: bold;">/</span>support<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>peertube <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sites-available<span style="color: #000000; font-weight: bold;">/</span>peertube</pre></pre></div></div><br />
Remplacez le domaine peertube.example.com par le vrai nom de domaine de votre instance :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #ff0000;">'s/peertube.example.com/video.monsite.fr/g'</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sites-available<span style="color: #000000; font-weight: bold;">/</span>peertube</pre></pre></div></div><br />
Activer ce fichier de configuration dans nginx :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sites-available<span style="color: #000000; font-weight: bold;">/</span>peertube <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sites-enabled<span style="color: #000000; font-weight: bold;">/</span>peertube</pre></pre></div></div><br />
<h2 class="formatter-title">6 - Procédure de génération du certificat Let's Encrypt</h2><br />
Maintenant assurez-vous que le nom de domaine pointe bien sur votre serveur dans la zone DNS (video.monsite.fr --> IP_SERVEUR). Cela est nécessaire pour Let's Encrypt.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/217/dns.jpg" alt="" class="b-lazy" /><br />
Arrêter Nginx :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>systemctl stop nginx</pre></pre></div></div><br />
Commenter les directives ssl_certificate and ssl_certificate_key (lignes 22 et 23) :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~# </span><span style="color: #c20cb9; font-weight: bold;">vim</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sites-available<span style="color: #000000; font-weight: bold;">/</span>peertube</pre></pre></div></div><br />
Lancer certbot et répondre aux questions de l'assistant :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>certbot <span style="color: #660033;">--authenticator</span> standalone <span style="color: #660033;">--installer</span> nginx <span style="color: #660033;">--post-hook</span> <span style="color: #ff0000;">"systemctl start nginx"</span></pre></pre></div></div><br />
Décommenter les directives ssl_certificate and ssl_certificate_key (lignes 22 et 23) :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">vim</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sites-available<span style="color: #000000; font-weight: bold;">/</span>peertube</pre></pre></div></div><br />
Nginx est déja relancé par l'option post-hook de certbot, envoyer un signal pour qu'il recharge sa configuration :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>systemctl reload nginx</pre></pre></div></div><br />
<h4 class="formatter-title">TCP/IP Tuning</h4><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">217</span><span style="color: #000000; font-weight: bold;">/</span>peertube-latest<span style="color: #000000; font-weight: bold;">/</span>support<span style="color: #000000; font-weight: bold;">/</span>sysctl.d<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">30</span>-peertube-tcp.conf <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>sysctl.d<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #666666;">root@peertube:~#</span>sysctl <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>sysctl.d<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">30</span>-peertube-tcp.conf
net.core.default_qdisc = fq_codel
net.ipv4.tcp_congestion_control = bbr</pre></pre></div></div><br />
<h4 class="formatter-title">systemd</h4><br />
Copier l'unité fournie, l'ajouter au système et activer le lancement automatique de peertube au boot :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">217</span><span style="color: #000000; font-weight: bold;">/</span>peertube-latest<span style="color: #000000; font-weight: bold;">/</span>support<span style="color: #000000; font-weight: bold;">/</span>systemd<span style="color: #000000; font-weight: bold;">/</span>peertube.service <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>systemd<span style="color: #000000; font-weight: bold;">/</span>system<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #666666;">root@peertube:~#</span>systemctl daemon-reload
<span style="color: #666666;">root@peertube:~#</span>systemctl <span style="color: #7a0874; font-weight: bold;">enable</span> peertube</pre></pre></div></div><br />
<h2 class="formatter-title">7 - Démarrer Peertube</h2><br />
A ce stade, il est acquis que Nginx, Postgres et Redis soient déjà lancés avant de démarrer Peertube.<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">ps</span> <span style="color: #660033;">-ef</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> redis
redis    <span style="color: #000000;">24322</span>     <span style="color: #000000;">1</span>  <span style="color: #000000;">0</span> 01:02 ?        00:00:01 <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>redis-server 127.0.0.1:<span style="color: #000000;">6379</span></pre></pre></div></div><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">ps</span> <span style="color: #660033;">-ef</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> nginx
root     <span style="color: #000000;">27491</span>     <span style="color: #000000;">1</span>  <span style="color: #000000;">0</span> 01:<span style="color: #000000;">50</span> ?        00:00:00 nginx: master process <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>nginx <span style="color: #660033;">-g</span> daemon on; master_process on;
www-data <span style="color: #000000;">27492</span> <span style="color: #000000;">27491</span>  <span style="color: #000000;">0</span> 01:<span style="color: #000000;">50</span> ?        00:00:00 nginx: worker process
www-data <span style="color: #000000;">27493</span> <span style="color: #000000;">27491</span>  <span style="color: #000000;">0</span> 01:<span style="color: #000000;">50</span> ?        00:00:00 nginx: worker process
www-data <span style="color: #000000;">27494</span> <span style="color: #000000;">27491</span>  <span style="color: #000000;">0</span> 01:<span style="color: #000000;">50</span> ?        00:00:00 nginx: worker process
www-data <span style="color: #000000;">27495</span> <span style="color: #000000;">27491</span>  <span style="color: #000000;">0</span> 01:<span style="color: #000000;">50</span> ?        00:00:00 nginx: worker process</pre></pre></div></div><br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span><span style="color: #c20cb9; font-weight: bold;">ps</span> <span style="color: #660033;">-ef</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> postgres
postgres <span style="color: #000000;">23454</span>     <span style="color: #000000;">1</span>  <span style="color: #000000;">0</span> 00:<span style="color: #000000;">49</span> ?        00:00:00 <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">9.6</span><span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>postgres <span style="color: #660033;">-D</span> <span style="color: #000000; font-weight: bold;">/</span>db<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">9.6</span><span style="color: #000000; font-weight: bold;">/</span>main <span style="color: #660033;">-c</span> <span style="color: #007800;">config_file</span>=<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">9.6</span><span style="color: #000000; font-weight: bold;">/</span>main<span style="color: #000000; font-weight: bold;">/</span>postgresql.conf
postgres <span style="color: #000000;">23456</span> <span style="color: #000000;">23454</span>  <span style="color: #000000;">0</span> 00:<span style="color: #000000;">49</span> ?        00:00:00 postgres: <span style="color: #000000;">9.6</span><span style="color: #000000; font-weight: bold;">/</span>main: checkpointer process
postgres <span style="color: #000000;">23457</span> <span style="color: #000000;">23454</span>  <span style="color: #000000;">0</span> 00:<span style="color: #000000;">49</span> ?        00:00:00 postgres: <span style="color: #000000;">9.6</span><span style="color: #000000; font-weight: bold;">/</span>main: writer process
postgres <span style="color: #000000;">23458</span> <span style="color: #000000;">23454</span>  <span style="color: #000000;">0</span> 00:<span style="color: #000000;">49</span> ?        00:00:00 postgres: <span style="color: #000000;">9.6</span><span style="color: #000000; font-weight: bold;">/</span>main: wal writer process
postgres <span style="color: #000000;">23459</span> <span style="color: #000000;">23454</span>  <span style="color: #000000;">0</span> 00:<span style="color: #000000;">49</span> ?        00:00:00 postgres: <span style="color: #000000;">9.6</span><span style="color: #000000; font-weight: bold;">/</span>main: autovacuum launcher process
postgres <span style="color: #000000;">23460</span> <span style="color: #000000;">23454</span>  <span style="color: #000000;">0</span> 00:<span style="color: #000000;">49</span> ?        00:00:00 postgres: <span style="color: #000000;">9.6</span><span style="color: #000000; font-weight: bold;">/</span>main: stats collector process</pre></pre></div></div><br />
Ces 3 services sont UP, n'oubliez pas également la messagerie pour l'envoi des courriels si vous utilisez cette fonction. On peut lancer :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>systemctl start peertube</pre></pre></div></div><br />
Le lancement se fait en background (démon), utiliser cette commande suivante pour voir si tout va bien (suivi du log) :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@peertube:~#</span>journalctl <span style="color: #660033;">-feu</span> peertube</pre></pre></div></div><br />
En cas d'erreur en boucle, faire un stop pour analyser le problème (stacktrace), au besoin le log par défaut sort dans /var/log/syslog. Si vous avez tout bien fait, vous pouvez vous connecter à votre instance en https :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/217/1.png" alt="" class="b-lazy" /><br />
<h2 class="formatter-title">8 - Se connecter à Peertube</h2><br />
L'utilisateur par défaut est "root" sur l'interface web, il est créé d'office dans la base PostgreSQL peertube_prod. Mais son mot de passe est dans les logs. Changeons-le dès maintenant en utilisant le script fourni :<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">root<span style="color: #000000; font-weight: bold;">@</span>peertube:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #666666; font-style: italic;"># su - peertube </span>
<span style="color: #666666;">peertube@peertube:~$ </span><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">217</span><span style="color: #000000; font-weight: bold;">/</span>peertube-latest <span style="color: #000000; font-weight: bold;">&&</span> <span style="color: #007800;">NODE_CONFIG_DIR</span>=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">217</span><span style="color: #000000; font-weight: bold;">/</span>config <span style="color: #007800;">NODE_ENV</span>=production npm run reset-password <span style="color: #660033;">--</span> <span style="color: #660033;">-u</span> root 
&nbsp;
<span style="color: #000000; font-weight: bold;">></span> peertube<span style="color: #000000; font-weight: bold;">@</span>1.0.1 reset-password <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2018</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">217</span><span style="color: #000000; font-weight: bold;">/</span>versions<span style="color: #000000; font-weight: bold;">/</span>peertube-v1.0.1 
<span style="color: #000000; font-weight: bold;">></span> node .<span style="color: #000000; font-weight: bold;">/</span>dist<span style="color: #000000; font-weight: bold;">/</span>scripts<span style="color: #000000; font-weight: bold;">/</span>reset-password.js <span style="color: #ff0000;">"-u"</span> <span style="color: #ff0000;">"root"</span> 
&nbsp;
New password? 
User password updated. 
peertube<span style="color: #000000; font-weight: bold;">@</span>peertube:~<span style="color: #000000; font-weight: bold;">/</span>peertube-latest$</pre></pre></div></div><br />
Il ne vous reste plus qu'à l'utiliser sur l'interface pour rentrer :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/217/2.png" alt="" class="b-lazy" /><br />
Maintenant vous avez accès à tout pour créer les autres utilisateurs, configurer et uploader :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/217/3.png" alt="" class="b-lazy" /><br />
Rappel : n'utilisez pas l'utilisateur root pour publier des vidéos. root est un utilisateur technique qui sert uniquement pour administrer l'instance ponctuellement. Créez des comptes utilisateurs normaux et publiez vos vidéos avec ces autres comptes.]]></description>
			<pubDate>Tue, 27 Nov 2018 03:42:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title><![CDATA[Proof Of Concept - Manipulation du jukebox Pioneer via le web]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/211-proof-of-concept-manipulation-du-jukebox-pioneer-via-le-web/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/211-proof-of-concept-manipulation-du-jukebox-pioneer-via-le-web/</guid>
			<description><![CDATA[Problématique : comment piloter à distance <a href="https://www.jonathandupre.fr/articles/15-compact-disc/207-pioneer-cac-autochangers-v3000-v3200-v5000-v180m/">le changeur Pioneer</a> ? Tout est histoire de protocole&#8230; le problème étant que si on décide de concevoir une application web dynamique pour manipuler le jukebox, seuls des appels via AJAX ou WebSockets sont possibles. Ce qui implique une solution de "passerelle" entre le port Série du Jukebox et le monde réseau Ethernet et même web (HTTP) :<br />
<br />
<p style="text-align: center;"><strong><span style="font-size: 18px;">CAC-V3000 <---> ???? <---> Navigateur web</span></strong></p><br />
<br />
<h3 class="formatter-title">Matériellement parlant</h3><br />
<br />
3 solutions sont possibles :<br />
<ul class="formatter-ul">
    <li class="formatter-li">Il existe des boîtiers spéciaux, appelés des « serial servers » ou « serial over IP » mais ils sont hors de prix et propriétaires.
    </li><li class="formatter-li">Avec un Arduino : il existe des shields "Ethernet". Ce dernier pouvant faire donc office de serveur HTTP, très bon tutoriel pour manipuler les librairies Serial et Ethernet sur OC : <a href="https://openclassrooms.com/fr/courses/3290206-perfectionnez-vous-dans-la-programmation-arduino/3370761-decouvrez-le-shield-ethernet-et-le-lecteur-de-carte-sd.]https://openclassrooms.com/fr/courses/3290206-perfectionnez-vous-dans-la-programmation-arduino/3370761-decouvrez-le-shield-ethernet-et-le-lecteur-de-carte-sd.[/url"> Ce serait la solution la plus efficiente. Malheureusement son prix est élevé :<br />
        ◦ [url=https://boutique.semageek.com/fr/513-arduino-ethernet-shield-2-8058333490328.html]https://boutique.semageek.com/fr/513-arduino-ethernet-shield-2-8058333490328.html</a><br />
        ◦ <a href="https://www.sparkfun.com/products/11166">https://www.sparkfun.com/products/11166</a>
    </li><li class="formatter-li">Avec un Raspberry Pi :<br />
        ◦ Installer une Raspbian<br />
        ◦ Utiliser le GPIO ou un adaptateur USB-Série de type FTDI/PL-2303 pour y connecter le Pioneer.<br />
        ◦ Avantage : utilitaires minicom & picocom à disposition pour debug.<br />
</li></ul><br />
<br />
Solution matérielle retenue :  Raspberry Pi 1 B+ (en stock).<br />
<br />
<h3 class="formatter-title">Logiciellement (avec le Raspberry Pi)</h3><br />
<br />
Plusieurs solutions sont possibles :<br />
<br />
<h4 class="formatter-title">ser2net</h4><br />
<br />
<a href="http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/">http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/</a><br />
<br />
C'est un démon qui sous Linux permet de « rerouter » un port série /dev/ttyUSB0 vers un socket TCP. Testé avec succès, mais hélas ne convient par pour des appels HTTP, ser2net travaille de façon brute. C&#8217;est parfait pour du Telnet (Putty / MobaXterm) mais ça ne fait pas serveur web.<br />
<br />
<h4 class="formatter-title">Script "pivot" en PHP</h4><br />
<br />
Méthode sale du pauvre qui fonctionne, mais pas top. Installation d'une Rasbian, de apache2 et de PHP7.0. Essai avec un script PHP maison (ici scmd.php &#8211; SingleCoMmanD) se charge de prendre une commande (par exemple 1PS?A) en paramètre d&#8217;URL (méthode GET) et de l&#8217;écrire sur le port série. Ensuite on lit le port série, récupère la ligne de réponse 1PSXXXXXXXX et renvoie le résultat. Avantage : hyper facile à mettre en &#339;uvre. Inconvénient : Très lent. Les tests montrent un temps de réponse de 300 à 420ms de latence pour traiter une commande.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/2.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/1.png" alt="" class="b-lazy" /><br />
<br />
La réponse met plus de 400ms à arriver ce qui est trop long même en ayant optimisé le code au maximum. Ce qui posera souci pour l&#8217;affichage du temps (écoulé, restant). Il est à signaler que localement via les outils picocom ou minicom ce temps n&#8217;est pas observé, la réponse est instantanée même à 9600 bauds par seconde.<br />
<br />
Le problème provient à la fois de Apache (qui lance un processus PHP à chaque fois pour chaque appel de page) mais aussi de PHP lui-même : on ne peut pas conserver en mémoire des objets persistants, notamment la connexion au port série. De ce fait à chaque appel de scmd.php on doit rouvrir le port série et le refermer, ce qui explique ce délai. PHP est donc à oublier. Il faut trouver un logiciel de type serveur web qui accepte d&#8217;avoir une connexion persistante vers le port série.<br />
<br />
<h4 class="formatter-title">Script "pivot" en nodeJS</h4><br />
<br />
Installation de Node.JS et des modules ws et serialport. :<br />
<ul class="formatter-ul">
    <li class="formatter-li"><a href="https://www.npmjs.com/package/serialport">https://www.npmjs.com/package/serialport</a>
    </li><li class="formatter-li"><a href="https://github.com/websockets/ws">https://github.com/websockets/ws</a><br />
</li></ul><br />
<br />
Tant qu'on y est autant passer pas les <a href="https://fr.wikipedia.org/wiki/WebSocket">websocket</a> plutôt que de renvoyer une "pseudo-page" de réponse texte. Les essais semblent nettement plus concluants, on tombe à moins de 55ms. Cette voie est donc à suivre sans hésiter.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/3.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/4.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/5.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/6.png" alt="" class="b-lazy" /><br />
<br />
Il n'y a plus qu'à blinder le code (try/catch), ajouter quelques contrôles, ajouter un timeout pour l'attente du port série, tout angliciser et JSONifier le tout. To be continued...<br />
<br />
<h3 class="formatter-title">Mise à jour le 18/10/2018</h3><br />
<br />
J'ai essayé de comprendre pourquoi PHP pouvait être aussi lent. Pour cela j'ai comparé avec un vrai PC (plutôt que le RPi). Ce sont les mêmes scripts installés sur les deux machines. Dans les captures d'écran suivantes, l'IP 192.168.0.6 correspond au Rasbperry Pi. L'IP 192.168.0.4 correspond au <a href="https://www.jonathandupre.fr/articles/34-ordinateurs/184-lenovo-thinkcentre-m91-usff-en-restauration/">Thinkcentre M91p</a> sous un Debian 9.5 que j'ai utilisé pour mes essais. Pour commencer j'ai activé opCache sur le Raspi, mais hélas cela ne fait pas mieux :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/12.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/11.png" alt="" class="b-lazy" /><br />
<br />
On voit le nombre de cache hits grossir mais hélas toujours 320ms. Idem avec <a href="https://www.jonathandupre.fr/images/articles/2018/211/17.png">PHP-FPM (FastCGI)</a>. Au final j'ai trouvé, je me suis fait trollé par le Prolific PL-2303. Car avec le Thinkcentre je retrouve exactement cette même latence en PHP quand le Pioneer est relié via cet adaptateur USB Prolific (/dev/ttyUSB0). J'ai donc essayé avec le port série du PC legacy de la carte mère (/dev/ttyS0), et bizarrement les temps sont nettement plus courts (81ms VS 380ms) :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/20.png" alt="" class="b-lazy" /><br />
<br />
Cette latence "d'ouverture du port" doit certainement provenir du pilote pl2303 lui-même. Au final cela n'a d'importance que pour une version PHP du service offert, cela ne change en rien pour nodeJS puisque le port reste ouvert pour chaque requête. La version nodeJS étant plus puissante et simple à implémenter c'est celle qui sera conservée pour développer l'application.<br />
<br />
Reste à tester :<br />
<ul class="formatter-ul">
    <li class="formatter-li">Si cette latence est présente aussi sur d'autres adaptateurs avec des puces FTDI.
    </li><li class="formatter-li">Dans le cas d'un Raspi : savoir si le port UART interne via le GPIO fait la même chose, mais il faut <a href="https://www.ebay.fr/itm/2PCS-MAX3232-RS232-Serial-Port-To-TTL-Converter-Male-DB9-Connector-COM-Serial/351818491963">un module MAX232</a> pour convertir de TTL vers RS232 (+-12V) et inverseur pour tester.<br />
</li></ul><br />
<br />
Dans tous les cas cela posera problème pour le Raspberry Pi si je dois héberger la base de données Postgres plus l'application web dessus, et pas sûr que les 512Mo tiennent. Même avec un overclock à 900Mhz le script nodeJS met plus de 12 secondes à s'initialiser et à être prêt. Alors que c'est instantané sur le Pentium G630. <a href="https://techfindings.one/archives/2053">Visiblement c'est connu</a>. Un passage à la version 3 voire carrément y mettre un vrai PC sera nécessaire. Sinon il faudra le cantonner à un rôle de pivot.<br />
<br />
Un petit schéma fait avec LibreOffice Draw :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/211/ccc_configurations.jpg" alt="" class="b-lazy" /><br />
<br />
<h3 class="formatter-title">Mise à jour le 29/10/2018</h3><br />
<br />
J'ai reçu mes petits achat d'eBay. Après quelques essais il s'avère que la latence observée "d'ouverture de port" avec l'adaptateur USB Prolific PL2303 ne se retrouve pas avec un adaptateur du même type USB-RS232C équipé d'un FTDI FT232R. Idem avec le port interne du Raspberry Pi B+ (/dev/ttyAMA0) équipé du module MAX232 (TTL <-> RS232). La latence observée est donc imputable aux adaptateurs aux puces Prolific. Fin de l'enquête.]]></description>
			<pubDate>Wed, 10 Oct 2018 00:00:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title><![CDATA[Suivi consommation électrique compteur EDF Linky (Partie 2)]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/210-suivi-consommation-electrique-compteur-edf-linky-partie-2/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/210-suivi-consommation-electrique-compteur-edf-linky-partie-2/</guid>
			<description><![CDATA[<a href="https://www.jonathandupre.fr/articles/24-logiciel-scripts/208-edf-linky-raspi/">Après la mise en place du Raspi</a> les problèmes surviennent rapidement. LE gros souci :  il ne devient plus accessible via SSH sur son adresse IP au bout d'une heure ou le lendemain, un délai aléatoire. Hum bizarre car il répond au ping. Ce qui signifie que le Raspi n'a pas décroché du Wi-Fi. Par contre impossible d'initier une connexion SSH. Il se trouve qu'un jour je suis arrivé à temps pour comprendre :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/210/1nofork.png" alt="" class="b-lazy" /><br />
<br />
Le processus SSH n'a plus de mémoire pour se forker (générer un autre processus à partir de lui-même) et n'arrive donc pas à gérer les arrivants sur le port 22. Ici je suis arrivé presque à temps, dans la capture d'écran c'est cette fois le processus bash qui n'arrive pas à lancer les commandes. La RAM est saturée. Le message est limpide. Impossible de lancer une commande pour savoir ce qu'il se passe. Un reboot violent via alimentation/reset est malheureusement nécessaire dans ces cas là afin de reprendre la main. Au reboot j'ai vite compris :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/210/2processstack.png" alt="" class="b-lazy" /><br />
<br />
Un script PHP se lance toutes les minutes pour relever la consommation instantanée, ce qui est normal, mais le script ne se termine jamais. Les processus PHP finissent ainsi par s'empiler (00h57, 00h58, 00h59...) et saturer la mémoire au bout d'un moment.<br />
<br />
Alors pourquoi le script ne se termine pas ? En fait il y a une petite faille dans le script PHP.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/210/5php.png" alt="" class="b-lazy" /><br />
<br />
En ligne 7 on essaie d'ouvrir le device /dev/ttyS0.<br />
En ligne 8 on vérifie que le device a pu être ouvert (création réussie d'un <a href="https://fr.wikipedia.org/wiki/Descripteur_de_fichier">FileHandle</a>), le cas d'erreur est ici bien géré. En cas de problème, si le périphérique est indisponible ou inexistant on termine l'exécution avec le message "<device> not found".<br />
Le problème se situe à la ligne 9, une boucle lit ce qui arrive sur le port série, caractère par caractère, tant que le fanion de fin de trame (chr 2 - STX) n'arrive pas. Ceci afin de démarrer la vraie lecture uniquement à partir de la trame suivante qui elle sera complète. On ignore la trame "courante". Sauf que si rien n'arrive sur le port série, ce caractère n'est jamais trouvé et le script PHP se retrouve à attendre bêtement à l'infini un STX qui n'arrive jamais.<br />
<br />
La solution de contournement consiste à placer un timeout sur la commande afin de limiter son temps d'exécution. Cela tombe bien puisqu'une commande existe sur linux pour cela : timeout.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/210/4timeout.png" alt="" class="b-lazy" /><br />
<br />
Il n'y a qu'a demander à killer le process (signal n°9 = SIGKILL) au bout de 15 secondes. 15 secondes étant suffisantes pour que le Raspi ait le temps de lire une trame complète et de jouer sa requête INSERT sqlite. On peut éventuellement mettre 20, 30 voire 40 secondes. De ce fait, au pire dans ce cas, les données ne rentrent pas dans la base sqlite mais le système n'est pas pollué/contaminé.<br />
<br />
Mais pourquoi cela arrive ? Et bien en effet à de multiples reprises j'ai pu constater l&#8217;absence de données arrivant sur le port série de manière aléatoire :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/210/3testcat.png" alt="" class="b-lazy" /><br />
<br />
On a rien du tout, j'ai stoppé avec CTRL-C.<br />
<br />
C'est quoi ce binz ? Au début je pensais à une connectique foireuse entre le Linky et le module PiTInfo de Charles. Mais au multimètre (je n'ai pas d'oscilloscope portable) ça fluctue bien sur la broche RXD du GPIO. Le problème n'est donc pas matériel, le signal arrive bien au Raspi. Mais alors qu'est-ce que c'est que ce bordel ? J'ai cherché sur le web. J'ai trouvé qu'il fallait <a href="https://www.raspberrypi.org/forums/viewtopic.php?t=138162">se méfier de la vitesse du VPU et du CPU</a> car <a href="https://github.com/raspberrypi/firmware/issues/800">elle avait une influence</a> sur la bonne tenue de route du port UART intégré. En effet j'avais émis l'hypothèse qu'au bout d'un moment les fréquences devaient varier <a href="https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3">selon la charge du CPU</a> et que donc, le port déraillait à cause de cela.<br />
<br />
Par conséquent j'ai joué un peu avec <a href="http://with-raspberrypi.blogspot.com/2014/03/cpu-frequency.html">le gouverneur selon les modes</a> (powersave, performance, ondemand) via une commande jouée au boot via /etc/rc.local et donner une fréquence fixe au CPU. Bilan : idem. Rien sur port série 9 fois sur 10 au démarrage ou alors ça marche 1 heure et puis plus rien. En fait vous aurez beau <a href="https://frillip.com/raspberry-pi-3-uart-baud-rate-workaround/">descendre le VPU à 250Mhz</a> ou utiliser n'importe quel rituel de sorcellerie, c'est exactement pareil. J'ai trouvé <a href="https://www.raspberrypi.org/documentation/configuration/uart.md">la réponse ici</a>. La faute en est au Raspi lui-même. En résumé : le SOC Broadcom embarque <a href="https://www.raspberrypi.org/app/uploads/2012/02/BCM2835-ARM-Peripherals.pdf">deux ports/modules UART implémentés matériellement de manière différentes (pages 10 & 175)</a>, l'un intitulé "mini-uart" (fonctionne à base d'un logiciel qui émule) et l'autre nommé "PL011" (circuit matériel réel).<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/210/6tty.png" alt="" class="b-lazy" /><br />
<br />
Le premier est une grosse daube  :<br />
<br />
<div class="formatter-container formatter-blockquote"><span class="formatter-title title-perso">Citation :</span><div class="formatter-content">The second serial port you will see referred to as the &#8220;mini uart&#8221; and lives at /dev/ttyS0. It also calculates it&#8217;s bit timing&#8217;s from the CPU cores frequency and if the CPU is under heavy load it can corrupt the serial communications. Not good.<br />
</div></div><br />
<br />
<div class="formatter-container formatter-blockquote"><span class="formatter-title title-perso">Citation :</span><div class="formatter-content"><br />
Relevant differences between PL011 and mini UART<br />
The mini UART has smaller FIFOs. Combined with the lack of flow control, this makes it more prone to losing characters at higher baudrates. It is also generally less capable than the PL011, mainly due to its baud rate link to the VPU clock speed.<br />
The particular deficiencies of the mini UART compared to the PL011 are :<br />
    No break detection<br />
    No framing errors detection<br />
    No parity bit<br />
    No receive timeout interrupt<br />
    No DCD, DSR, DTR or RI signals<br />
</div></div><br />
<br />
Dans le cas du Raspi Zero Wireless, j'avais désactivé la console et activé le module "mini-uart". C'est lui qui par défaut est relié aux broches du GPIO. Il est ainsi disponible sur /dev/ttyS0, c'est celui que j'ai utilisé au début. Le PL011 est lui utilisé par la puce Bluetooth par défaut, "disponible" sur /dev/ttyAMA0. Si on veut utiliser le PL011 plus costaud sur les broches du GPIO il faut les échanger (re-router) avec les directives overlay <em>pi3-disable-bt</em> & <em>pi3-miniuart-bt</em>. Une fois cela fait, il faut utiliser /dev/ttyAMA0 dans les scripts.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/210/7ok.png" alt="" class="b-lazy" /><br />
<br />
Et voilà fini le port série qui freeze quand ça lui chante et ne retourne plus de données. Ne pas hésiter aussi à placer une réinitialisation à chaque boot dans /etc/rc.local :<br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">stty</span> <span style="color: #660033;">-F</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>ttyAMA0 <span style="color: #000000;">1200</span> sane evenp parenb cs7 <span style="color: #660033;">-crtscts</span></pre></pre></div></div>]]></description>
			<pubDate>Tue, 02 Oct 2018 20:04:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title><![CDATA[Suivi consommation électrique compteur EDF Linky avec Raspberry Pi Zero W]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/208-suivi-consommation-electrique-compteur-edf-linky-avec-raspberry-pi-zero-w/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/208-suivi-consommation-electrique-compteur-edf-linky-avec-raspberry-pi-zero-w/</guid>
			<description><![CDATA[C'est un petit projet qui date un peu auquel je ne m'étais jamais attelé. Connecter un Raspberry Pi au compteur EDF. J'avais avant le modèle blanc et bleu avec un afficheur LCD. Depuis quelques mois c'est le sulfureux Linky qui trône au dessus du tableau électrique. Comme l'ancien, ce compteur possède une sortie dite de "téléinformation" coté client. Une sorte de port informatique à relier à un ordinateur pour obtenir des informations avec protocole UART-TTL ("série"). Autant dire de suite que je n'ai rien inventé, j'ai juste appliqué une petite recette que vous pourrez retrouver sur ce site : <a href="http://www.magdiblog.fr/gpio/teleinfo-edf-suivi-conso-de-votre-compteur-electrique/">http://www.magdiblog.fr/gpio/teleinfo-edf-suivi-conso-de-votre-compteur-electrique/</a> ou <a href="https://hallard.me/pitinfov12/">sur le blog de Charles (créateur du shield)</a>. Recette <a href="https://www.journaldulapin.com/2016/02/25/raspberry-pi-teleinfo/">suivie également par Pierre Dandumont</a>.<br />
<br />
Attention il existe deux protocoles de communication, le mode historique (celui que j'ai) et le mode standard. N'hésitez pas à regarder ces liens :<br />
<ul class="formatter-ul">
    <li class="formatter-li"><a href="https://lucidar.me/fr/home-automation/linky-customer-tele-information/">https://lucidar.me/fr/home-automation/linky-customer-tele-information/</a>
    </li><li class="formatter-li"><a href="https://www.yadnet.com/domotique/protocole-teleinfo-du-compteur-linky/">https://www.yadnet.com/domotique/protocole-teleinfo-du-compteur-linky/</a>
    </li><li class="formatter-li"><a href="https://forum.jeedom.com/viewtopic.php?f=149&t=39461">https://forum.jeedom.com/viewtopic.php?f=149&t=39461</a><br />
</li></ul><br />
<br />
<h3 class="formatter-title">Choix du Raspi</h3><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/raspberry-pi-zero-wh.jpg" alt="" class="b-lazy" /><br />
Comme vous le savez sans doute il existe beaucoup de versions différentes du Raspberry Pi. Le plus adapté à cet usage est bien sûr le modèle zéro. Pas la peine d'avoir plein de ports USB, pas besoin de multi-c&#339;urs, pas besoin de sortie son. L'objet devant être le plus discret possible, moins il prend de place et mieux c'est. Le modèle zéro est disponible en plusieurs versions. La plus intéressante étant la version Zero W qui embarque le Bluetooth et le Wi-Fi en intégré. L'appareil est donc accessible à distance sans fil et sans avoir à devoir bricoler une interface réseau ou acheter un dongle USB-Ethernet ou Wi-Fi.<br />
<h3 class="formatter-title">Captation des données & Module </h3><br />
Pour capter les données du compteur, il y juste à lire les données arrivant d'un port série (broche RXD). Il existe deux matériels disponibles pour lire les données du compteur depuis un RPi :<br />
<ul class="formatter-ul">
    <li class="formatter-li">soit depuis le port UART intégré au connecteur GPIO
    </li><li class="formatter-li">soit depuis un dongle USB contrôleur UART indépendant<br />
</li></ul><br />
J'ai opté pour la première solution qui est plus classe que de passer par le port USB dans le cas d'un modèle Zéro. Car cela réclame un fil adaptateur micro-USB qui pendouille. Pour les autres modèles 1/2/3 à vous de voir. Dans ce cas il faut le "header" (les broches GPIO à souder soi-même). J'ai acheté le module (shield) <a href="https://www.tindie.com/products/Hallard/pitinfo/">PiTInfo de Charles disponible sur Tindie</a>. Il consiste uniquement à un petit PCB rouge :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/pitinfo.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/07.jpg" alt="" class="b-lazy" /><br />
Concernant <a href="https://www.tindie.com/products/Hallard/micro-teleinfo-v20/">la solution via USB</a>, c'est la même chose mais avec un FT230XS qui fait pont USB-UART :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/usbinfo.png" alt="" class="b-lazy" /><br />
<h3 class="formatter-title">Choix du stockage des données</h3><br />
Le RPi peut dans ce cas être utilisé de plusieurs façons, en lui confiant plus ou moins de tâches à réaliser. Est-il simplement un lecteur de port série et envoyer ce qu'il lit ailleurs ? Doit-il stocker les données collectées en local ? Doit-il intégrer lui-même un site ou une interface de restitution des données ?<br />
<ul class="formatter-ul">
    <li class="formatter-li">Mode IoT actif : le Rpi capte les données de manière active : lecture les données de téléinformation déclenchée via crontab locale et envoi des informations dans une base distante stockée ailleurs sur un serveur local ou internet via appel webservice.
    </li><li class="formatter-li">Mode IoT passif : le Rpi capte les données de manière passive : lecture des données de téléinformation sur demande et restitue les données via une connexion distante via SSH ou appel webservice depuis un serveur local ou internet.
    </li><li class="formatter-li">Mode serveur : le RPi capte les données de téléinformation déclenchée via crontab locale, stocke les données en local (sur carte SD) et dispose d'un serveur web interne pour l'interroger à distance. Tout se fait sur le RPi. Rien n'est stocké ailleurs.<br />
</li></ul><br />
Pour le moment, c'est la troisième solution que j'ai choisi car c'est la plus simple sinon il faut éparpiller l'application.<br />
<h3 class="formatter-title">Ajout d'une prise au tableau électrique</h3><br />
Un problème se pose, comment alimenter le RPi ? N'ayant pas de prise à proximité, j'ai opté pour la solution la moins chère (4 euros) : ajouter une prise au tableau électrique.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/01.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/02.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/03.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/04.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/05.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/06.jpg" alt="" class="b-lazy" /><br />
Il existe des solutions plus élégantes à base <a href="https://www.amazon.fr/MeanWell-DR-15-5-Source-dalimentation-pour/dp/B00MWQEBAU">de modules d'alimentations sur rail DIN</a> mais c'est un peu plus cher. Maintenant que je sais que ça marche, cette solution me tente pour plus tard. Car cela permettrait d'enfouir le RPi. C'est <a href="https://www.jonathandupre.fr/articles/11-electrique/221-essai-alimentation-meanwell-dr-15-5/">chose faite en novembre 2018</a>.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/raildin.jpg" alt="" class="b-lazy" /><br />
<h3 class="formatter-title">Préparation de la carte microSD</h3><br />
Bon je ne vais pas trop m'étendre sur cette étape, vue, revue, et re-revue maintes fois sur le web. Prendre le fichier image de la <a href="https://www.raspberrypi.org/downloads/raspbian/">distribution raspbian</a> disponible sur le web et l'installer sur une carte microSD.<br />
<ul class="formatter-ul">
    <li class="formatter-li"><a href="http://matechnologie.com/spip.php?article301">http://matechnologie.com/spip.php?article301</a>
    </li><li class="formatter-li"><a href="http://www.mistipi.com/raspberry-pi-creer-une-image-de-votre-carte-sd-avec-win32-disk-imager/">http://www.mistipi.com/raspberry-pi-creer-une-image-de-votre-carte-sd-avec-win32-disk-imager/</a>
    </li><li class="formatter-li"><a href="https://etcher.io/">https://etcher.io/</a><br />
</li></ul><br />
<h3 class="formatter-title">Premier démarrage</h3><br />
On boot dessus. Pour cela il faut relier un écran et un clavier. 3 câbles : alimentation en micro-USB, clavier en micro-USB et vidéo en mini-HDMI :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/08.jpg" alt="" class="b-lazy" /><br />
Il est vivant :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/09.jpg" alt="" class="b-lazy" /><br />
Login OK. Utilisateur = "pi" et mot de passe = "raspberry". Attention le clavier est en qwerty il faut donc taper "rqspberry".<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/10.jpg" alt="" class="b-lazy" /><br />
<h3 class="formatter-title">Configuration locale</h3><br />
Avant de rendre le RPi autonome il faut le configurer. Déjà passer le clavier en français :<br />
<a href="https://raspberrypi.stackexchange.com/questions/10060/raspbian-keyboard-layout">https://raspberrypi.stackexchange.com/questions/10060/raspbian-keyboard-layout</a><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/11.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/12.jpg" alt="" class="b-lazy" /><br />
Ensuite il faut que le RPi se connecte de lui-même au Wi-Fi local :<br />
<a href="https://core-electronics.com.au/tutorials/raspberry-pi-zerow-headless-wifi-setup.html">https://core-electronics.com.au/tutorials/raspberry-pi-zerow-headless-wifi-setup.html</a><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/13.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/14.jpg" alt="" class="b-lazy" /><br />
On s&#8217;aperçoit que le service ssh est désactivé au démarrage. Il faut donc l'activer. Son démarrage est OK.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/15.jpg" alt="" class="b-lazy" /><br />
Ensuite tant qu'on y est un récupère l'adresse MAC de l'interface wi-fi wlan0 :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/16.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/21.png" alt="" class="b-lazy" /><br />
Reboot final pour test, le RPi a bien récupéré son adresse 192.168.0.5 !<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/17.jpg" alt="" class="b-lazy" /><br />
<h3 class="formatter-title">Installation au compteur</h3><br />
Maintenant que le RPi est autonome, il reste à le poser (coller) au disjoncteur général 500mA.<br />
Ok c'est moche, mais ça fonctionne.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/18.jpg" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/19.jpg" alt="" class="b-lazy" /><br />
<h3 class="formatter-title">Configuration à distance</h3><br />
Il reste encore à peaufiner quelques détails... maintenant on fait ça tranquille via SSH.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/23.png" alt="" class="b-lazy" /><br />
On vérifie que le RPi peut accéder au réseau local et à internet.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/24.png" alt="" class="b-lazy" /><br />
On configure les fichiers config.txt et cmdline.txt pour activer le port série du GPIO :<br />
<a href="https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/">https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/</a><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/25.png" alt="" class="b-lazy" /><br />
<h3 class="formatter-title">Tests de lecture du port série</h3><br />
Après reboot, il y a bien 2 ports série, un ttyS0 qu'il faudra utiliser et le ttyAMA0 pour le Bluetooth.<br />
Un petit essai avec picocom avec une vitesse de 1200 bauds, 7 bits de données, parité paire, aucune gestion du flux de données.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/26.png" alt="" class="b-lazy" /><br />
On voit des infos texte débouler du compteur. CTRL-A et CTRL-Q pour quitter picocom.<br />
Si on laisse défiler, on remarque le compteur crache en permanence le même pavé/bloc de 11 lignes séparé par le caractère ASCII n°2 = STX (Start of Text) :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/27.png" alt="" class="b-lazy" /><br />
<h3 class="formatter-title">Installation de l'application (scripts PHP)</h3><br />
Après avoir installé Apache2 et PHP 7.0, il faut ensuite déposer les scripts PHP sur le RPi et placer une exécution automatique en crontab. On relève la consommation toutes les minutes 24h/24 7j/7.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/29.png" alt="" class="b-lazy" /><br />
On vérifie que les données sont bien stockées dans la base sqlite3 :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/28.png" alt="" class="b-lazy" /><br />
En cas de problème, les logs d'erreurs peuvent donner des pistes :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/30.png" alt="" class="b-lazy" /><br />
<h3 class="formatter-title">Encore quelques réglages...</h3><br />
Reste à configurer la timezone via l'outil raspi-config :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/31.png" alt="" class="b-lazy" /><br />
On installe également NTP pour conserver le RPi toujours à l'heure :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/32.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/33.png" alt="" class="b-lazy" /><br />
Ne pas oublier aussi de désactiver la mise en veille du Wi-Fi : <a href="https://www.raspberrypi.org/forums/viewtopic.php?t=194619">https://www.raspberrypi.org/forums/viewtopic.php?t=194619</a><br />
<h3 class="formatter-title">Un outil supplémentaire...</h3><br />
On peut également installer <a href="https://www.phpliteadmin.org/">phpliteadmin</a> pour administrer la base sqlite3 à distance via navigateur à la manière d'un phpMyAdmin :<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/34.png" alt="" class="b-lazy" /><br />
<h3 class="formatter-title">Tadaaaa !</h3><br />
Ça marche. Les graphiques sont construits par la bibliothèque JS Charts de Google. Un accès au net est donc nécessaire pour générer les graphiques.<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/35.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/208/36.png" alt="" class="b-lazy" /><br />
J'ai l'impression que ça marche moyen (que font ici les années 2030, 2040, 2050 ???). Et j'ai toujours le décalage de l'heure dans les données restituées en web alors que bash me donne la bonne heure système. Les scripts sont prévus pour PHP 5.0 et j'ai installé la 7.0. Cela reste à creuser.<br />
<h2 class="formatter-title">MAJ du 2 octobre 2018</h2><br />
<a href="https://www.jonathandupre.fr/articles/24-logiciel-scripts/210-suivi-consommation-electrique-compteur-edf-linky-partie-2/">Résolution de problèmes de stabilité du port série. Bascule de module UART.</a>]]></description>
			<pubDate>Fri, 21 Sep 2018 05:37:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title><![CDATA[Récupération des logs OVH (script Shell)]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/204-recuperation-des-logs-ovh-script-shell/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/204-recuperation-des-logs-ovh-script-shell/</guid>
			<description><![CDATA[Un script qui automatise la récupération des logs sur un site hébergé mutualisé linux chez OVH en offre perso. Il automatise la connexion à l'URL des logs d'OVH : logs.ovh.net.<br />
<br />
En premier : le script <a href="https://www.jonathandupre.fr/files/scripts/backup_log/env.sh"><strong>env.sh</strong></a> positionne l'environnement OVH avec quelques variables Shell. Toutes ses variables ne servent pas ici. C'est un script qui mutualise tout le nécessaire d'authentification pour plusieurs scripts que j'ai. Les valeurs sont à utiliser/remplacer sont :<br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">&nbsp;
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">OVH_COURRIEL</span>=<span style="color: #ff0000;">"mail@fai.fr"</span> <span style="color: #666666; font-style: italic;"># Destinataire courriel rapport</span>
<span style="color: #666666; font-style: italic;"># LOGS</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">OVH_USER</span>=<span style="color: #ff0000;">"xxxxxxx-ovh"</span> <span style="color: #666666; font-style: italic;"># Code client (XXXXXXXX-OVH)</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">OVH_PASSWORD</span>=<span style="color: #ff0000;">"xxxxxxxxxxxxxxxxxxx"</span> <span style="color: #666666; font-style: italic;"># Mot de passe compte OVH</span>
&nbsp;</pre></pre></div></div><br />
<br />
En second : le script <a href="https://www.jonathandupre.fr/files/scripts/backup_log/backup_log.sh"><strong>backup_log.sh</strong></a> télécharge via la commande curl les logs nécessaires au nombre de trois (access, error et out), puis envoie un courriel récapitulatif. Le script peut prendre comme paramètre :<br />
<ul class="formatter-ul">
    <li class="formatter-li">soit "yesterday" pour récupérer les logs de la veille  en flux continu quotidien (comportement par défaut si aucun paramètre donné)
    </li><li class="formatter-li">soit "immediate" pour récupérer les logs courants (situation urgente)
    </li><li class="formatter-li">soit une date au format "DD/MM/YYYY" pour récupérer les logs d'une date précise (rattrapage)<br />
</li></ul><br />
<br />
Crontab de lancement :<br />
<br />
<div class="formatter-container formatter-code code-BASH"><span class="formatter-title">Code BASH :</span><div class="formatter-content"><pre style="display:inline;"><pre class="bash" style="font-family:monospace;">&nbsp;
<span style="color: #666666; font-style: italic;"># Script de sauvegarde des logs de la veille chez OVH</span>
00 06 <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>docs<span style="color: #000000; font-weight: bold;">/</span>taverne<span style="color: #000000; font-weight: bold;">/</span>scripts<span style="color: #000000; font-weight: bold;">/</span>; . .<span style="color: #000000; font-weight: bold;">/</span>env.sh; .<span style="color: #000000; font-weight: bold;">/</span>backup_log.sh <span style="color: #000000; font-weight: bold;">>></span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">>&</span><span style="color: #000000;">1</span>
&nbsp;</pre></pre></div></div><br />
<br />
Exemple du corps de courriel :<br />
<br />
<div class="formatter-container formatter-blockquote"><span class="formatter-title title-perso">Citation :</span><div class="formatter-content"><br />
--------------------------------------------------------------<br />
Récupération débutée le 25-07-2018 @ 06:00:01<br />
--------------------------------------------------------------<br />
Création du répertoire de stockage si besoin...<br />
Type de lancement du script : yesterday<br />
Récupération des logs chez OVH...<br />
Le fichier n'est pas présent. Téléchargement nécessaire.<br />
Téléchargement via CURL vers /docs/taverne/site_logs/access_logs/2018-07-24-jonathandupre.fr.log.gz<br />
Le fichier n'est pas présent. Téléchargement nécessaire.<br />
Téléchargement via CURL vers /docs/taverne/site_logs/error_logs/2018-07-24-jonathandupre.fr.log.gz<br />
Le fichier n'est pas présent. Téléchargement nécessaire.<br />
Téléchargement via CURL vers /docs/taverne/site_logs/out_logs/2018-07-24-jonathandupre.fr.log.gz<br />
Dézippage des logs reçus...<br />
Fichier dézippé OK.<br />
Fichier dézippé OK.<br />
Fichier dézippé OK.<br />
Contrôle des logs reçus...<br />
Présence du fichier -rw-rw-r-- 1 jonathan jonathan 11525232 juil. 25 06:00 /docs/taverne/site_logs/access_logs/2018-07-24-jonathandupre.fr.log.<br />
Présence du fichier -rw-rw-r-- 1 jonathan jonathan 1370 juil. 25 06:00 /docs/taverne/site_logs/error_logs/2018-07-24-jonathandupre.fr.log.<br />
Présence du fichier -rw-rw-r-- 1 jonathan jonathan 98606 juil. 25 06:00 /docs/taverne/site_logs/out_logs/2018-07-24-jonathandupre.fr.log.<br />
--------------------------------------------------------------<br />
Récupération terminée le 25-07-2018 @ 06:00:02<br />
--------------------------------------------------------------</div></div>]]></description>
			<pubDate>Fri, 20 Jul 2018 20:49:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title><![CDATA[Importer les sessions de PortaPutty vers le registre (script Perl)]]></title>
			<link>https://www.jonathandupre.fr/articles/24-logiciel-scripts/195-importer-les-sessions-de-portaputty-vers-le-registre-script-perl/</link>
			<guid>https://www.jonathandupre.fr/articles/24-logiciel-scripts/195-importer-les-sessions-de-portaputty-vers-le-registre-script-perl/</guid>
			<description><![CDATA[Petit cas rencontré au travail. Nous utilisons de temps en temps <a href="https://fr.wikipedia.org/wiki/PuTTY">PuTTY</a> pour administrer des serveurs en SSH depuis des postes Windows. Seulement il y a quelques années (2010) j'ai récupéré un poste sur lequel est installé "PortaPuTTY" et je l'ai utilisé comme tel au début. Mais en fait il existe deux logiciels PuTTY, le normal officiel classique et un modifié qui est dénommé "PortaPuTTY". Le second, comme son nom l'indique, est un PuTTY portable, <a href="https://pendriveapps.com/portaputty-portable-tty/">abandonné depuis</a> par son auteur. La différence entre les deux est simple : le PuTTY classique enregistre les sessions et leurs paramètres dans la base de registre Windows. Base de registre qui n'est pas nomade ou portable elle fait partie de Windows. Même si <a href="http://ryepup.unwashedmeme.com/blog/2007/02/22/migrate-putty-saved-sessions/">cela reste exportable/importable à la main</a>.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/regedit1.png" alt="" class="b-lazy" /><br />
<br />
Le second enregistre les sessions dans des fichiers texte plats à coté du .exe. De ce fait on "emporte" les sessions avec son PortaPuTTY.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/sessionfiles.png" alt="" class="b-lazy" /><br />
<br />
Sauf que les logiciels comme <a href="http://www.softpedia.com/get/Network-Tools/Telnet-SSH-Clients/SuperPutty.shtml">SuperPuTTY</a> ou encore <a href="https://mobaxterm.mobatek.net/">MobaXTerm</a> ne permettent pas d'importer les sessions depuis ces fameux fichiers texte plats générés par PortaPuTTY, ils vont tous rechercher en base de registre.<br />
<br />
Exemple avec MobaXTerm :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/mobaxterm1.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/mobaxterm2.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/mobaxterm3.png" alt="" class="b-lazy" /><br />
<br />
Exemple avec SuperPuTTY :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/superputty1.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/superputty2.png" alt="" class="b-lazy" /><br />
<br />
Je ne voulais pas tout ressaisir à la main et comme le problème peut se poser ailleurs j'ai créé un script Perl qui se nomme <a href="https://www.jonathandupre.fr/files/scripts/portaputty2registry.pl"><strong>portaputty2registry.pl</strong></a>, testé fonctionnel avec Perl en version 5.8 (c'est vieux !). Le but du script est de scanner les fichiers d'un dossier de sessions PortaPuTTY, de récupérer tous les paramètres des sessions des fichiers et de créer un un fichier .reg à importer directement dans la base de registre. Le hic étant que les valeurs sont en décimal coté PortaPuTTY et en hexadécimal (dword) dans un fichier .reg. Sauf que bien évidemment certaines valeurs sont des chaînes de caractère à ne pas convertir (à laisser tel quel). Le script se charge de cela.<br />
<br />
Coller le script Perl dans le dossier des sessions (vous pouvez aussi le mettre ailleurs comme le bureau, le script est interactif si aucun paramètre n'est donné en ligne de commande) :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/01.png" alt="" class="b-lazy" /><br />
<br />
Ouvrir une invite de commande dans ce dossier :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/02.png" alt="" class="b-lazy" /><br />
<br />
Lancer le script :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/03.png" alt="" class="b-lazy" /><br />
<br />
Je réponds 'oui' ici :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/04.png" alt="" class="b-lazy" /><br />
<br />
Le traitement des fichiers trouvés est terminé :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/05.png" alt="" class="b-lazy" /><br />
<br />
Le fichier .reg est bien présent et valide dans sa structure :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/06.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/07.png" alt="" class="b-lazy" /><br />
<br />
Il ne reste plus qu'à l'importer :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/08.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/09.png" alt="" class="b-lazy" /><br />
<br />
Un petit tour avec regedit.exe pour vérifier cela :<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/10.png" alt="" class="b-lazy" /><br />
<br />
All is alright. Maintenant reste à importer les données.<br />
<br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/11.png" alt="" class="b-lazy" /><br />
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/images/articles/2018/195/12.png" alt="" class="b-lazy" /><br />
<br />]]></description>
			<pubDate>Fri, 18 May 2018 17:33:00 +0200</pubDate>
			
		</item>
		
	</channel>
</rss>
