<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andy Costanza</title>
    <description>The latest articles on DEV Community by Andy Costanza (@costalfy).</description>
    <link>https://dev.to/costalfy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F262136%2F4a86d302-1297-4575-99ac-d362f47ab043.jpg</url>
      <title>DEV Community: Andy Costanza</title>
      <link>https://dev.to/costalfy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/costalfy"/>
    <language>en</language>
    <item>
      <title>Utilisez Gitlab.com pour déployer automatiquement votre site web Hugo</title>
      <dc:creator>Andy Costanza</dc:creator>
      <pubDate>Mon, 30 Mar 2020 08:05:21 +0000</pubDate>
      <link>https://dev.to/costalfy/utilisez-gitlab-com-pour-deployer-automatiquement-votre-site-web-hugo-37k5</link>
      <guid>https://dev.to/costalfy/utilisez-gitlab-com-pour-deployer-automatiquement-votre-site-web-hugo-37k5</guid>
      <description>&lt;p&gt;Cela fait maintenant plusieurs mois que j'ai migré mon site de Wordpress à Hugo. Alors, non, je ne vous expliquerai pas qu'est-ce que c'est Hugo car &lt;a href="https://jamstatic.fr/2019/02/06/de-wordpress-a-hugo-un-nouvel-etat-d-esprit/"&gt;on l'a déjà fait&lt;/a&gt;. Non, je ne vous expliquerai pas pourquoi Hugo c'est mieux que Wordpress car &lt;a href="https://anceret-matthieu.fr/2020/01/migration-de-mon-blog-wordpress-vers-hugo-sur-gitlab/"&gt;on l'a déjà fait&lt;/a&gt;. Non, je ne vous expliquerai pas non plus comment récupérer le contenu de votre Wordpress car &lt;a href="https://blog.zwindler.fr/2019/06/10/comment-migrer-de-wordpress-a-hugo/"&gt;on l'a déjà fait&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dans cet article je vais vous expliquer comment, grâce au CI de GitLab, j'ai automatisé la publication de mes articles sur un hébergement Web qui dispose d'un accès FTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prérequis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vous disposez d'un compte sur une instance &lt;a href="https://gitlab.com"&gt;GitLab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Votre instance GitLab dispose d'un GitLab Runner qui se chargera du CI/CD&lt;/li&gt;
&lt;li&gt;Vous avez &lt;a href="https://gohugo.io/getting-started/quick-start/"&gt;installé Hugo, généré votre site et installé votre thème&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Description de processus
&lt;/h2&gt;

&lt;p&gt;Dans notre exemple, nous allons "pusher" sur notre repository GitLab notre site hugo avec le fichier qui décris comment construire et publier notre site web. GitLab va lire ce fichier et démarrer une tâche qui se chargera d'exécuter chaque étape nécessaire à la construction du site pour terminer par publier le site généré sur le serveur FTP de votre hébergement web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.andycostanza.com/post/2020-03-29-utilisez-gitlab-ci-pour-deployer-votre-site-web-hugo/"&gt;Voir le schéma...&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le secret du déploiement automatique
&lt;/h2&gt;

&lt;p&gt;GitLab CI dispose de fonctionnalités équivalentes à &lt;a href="https://about.gitlab.com/devops-tools/travis-ci-vs-gitlab.html"&gt;Travis-CI&lt;/a&gt; ou même notre bon vieux &lt;a href="https://about.gitlab.com/devops-tools/jenkins-vs-gitlab.html"&gt;Jenkins&lt;/a&gt; avec l'avantage d'avoir tout sous la main et directement intégré à son projet.&lt;/p&gt;

&lt;p&gt;Voici notre fichier .gitlab-ci.yml de référence :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jojomi/hugo&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;hugo version&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;git submodule update --init --recursive&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;hugo -d public_html&lt;/span&gt;
  &lt;span class="na"&gt;artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;public_html&lt;/span&gt;
  &lt;span class="na"&gt;only&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;
&lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;apt-get update -qq &amp;amp;&amp;amp; apt-get install -y -qq lftp&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;lftp -u $FTP_LOGIN,$FTP_PASSWORD $FTP_HOST -e "mirror -v --parallel=2 -e -R --ignore-time -p ./public_html/ www/ ; quit"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "deployment complete"&lt;/span&gt;
  &lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Le fichier est découpé en 2 étapes : &lt;strong&gt;build&lt;/strong&gt; et &lt;strong&gt;deploy&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;L'étape &lt;strong&gt;deploy&lt;/strong&gt; dépend de la bonne exécution de l'étape &lt;strong&gt;build&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;L'étape &lt;strong&gt;build&lt;/strong&gt; ne s'exécutera que sur la branche &lt;strong&gt;master&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Dans &lt;strong&gt;build&lt;/strong&gt; on fait référence à l'image docker &lt;a href="https://hub.docker.com/r/jojomi/hugo"&gt;jojomi/hugo&lt;/a&gt; qui sera utilisé pour construire notre site web&lt;/li&gt;
&lt;li&gt;Dans &lt;strong&gt;build&lt;/strong&gt; on exécutera les commandes définies dans &lt;strong&gt;script&lt;/strong&gt; qui se chargeront d'initialisé le thème de notre site et transformera votre site Hugo en site statique HTML dans le dossier &lt;strong&gt;public_html&lt;/strong&gt; du conteneur&lt;/li&gt;
&lt;li&gt;Si tous se passe correctement, on passe à l'étape de &lt;strong&gt;deploy&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;On installe les outils qui nous manque pour uploader des fichiers par FTP&lt;/li&gt;
&lt;li&gt;On termine par le transfert de fichier en tant que tel en publiant le contenu du &lt;strong&gt;public_html&lt;/strong&gt; dans le répertoire &lt;strong&gt;www&lt;/strong&gt; du serveur FTP de votre hébergement web.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ajouter les variables de connexion FTP dans votre GitLab
&lt;/h3&gt;

&lt;p&gt;Dans la dernière commande ci-dessus, nous utilisons des variables &lt;em&gt;$FTP_LOGIN&lt;/em&gt;,&lt;em&gt;$FTP_PASSWORD&lt;/em&gt; et &lt;em&gt;$FTP_HOST&lt;/em&gt; pour protéger ses valeurs d'une simple lecture du contenu du repository. &lt;/p&gt;

&lt;p&gt;Dans les paramètres de votre repository, rendez-vous dans &lt;em&gt;Intégration et livraison continue&lt;/em&gt; et dans la section &lt;em&gt;Variables&lt;/em&gt; ajoutez ces 3 noms de variables ainsi que les valeurs et n'oubliez pas de glisser le curseur sur &lt;em&gt;Protégée&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--38ajSb40--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.andycostanza.com/images/2020-03-29/01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--38ajSb40--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.andycostanza.com/images/2020-03-29/01.png" alt="" width="880" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voilà, vous êtes paré pour publier automatiquement votre site web à chaque push dans votre repository GitLab&lt;/p&gt;

</description>
      <category>hugo</category>
      <category>gitlab</category>
      <category>french</category>
      <category>git</category>
    </item>
    <item>
      <title>Docker sur Arch Linux</title>
      <dc:creator>Andy Costanza</dc:creator>
      <pubDate>Thu, 26 Mar 2020 08:27:49 +0000</pubDate>
      <link>https://dev.to/costalfy/docker-sur-arch-linux-37ok</link>
      <guid>https://dev.to/costalfy/docker-sur-arch-linux-37ok</guid>
      <description>&lt;p&gt;Voici un petit guide de mise en route pour déployer une application Spring Boot dans un conteneur docker sur ArchLinux&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requis
&lt;/h2&gt;

&lt;p&gt;Les commandes ci-dessous sous exécutée sur ArchLinux.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation de docker et de ses autres outils
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-Syu&lt;/span&gt; docker docker-compose docker-machine
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start docker
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modification des droits d'accès de l'utilisateur
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt; : &lt;br&gt;&lt;br&gt;
If you want to be able to run docker as a regular user, &lt;a href="https://wiki.ArchLinux.org/index.php/Docker#Installation"&gt;add your user to the docker user group&lt;/a&gt;. &lt;br&gt;
Anyone added to the docker group is root equivalent. More information &lt;a href="https://github.com/docker/docker/issues/9976"&gt;here&lt;/a&gt; and &lt;a href="https://docs.docker.com/engine/security/security/"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;gpasswd &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; docker
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sous GNOME j'ai dû redémarrer la machine car un simple déconnexion de session n'a pas suffi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testons la configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Est-ce que Docker est bien configuré
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si on vous demande un mot de passe c'est que vous avez merdé lors de l'ajout du groupe docker à votre utilisateur&lt;/p&gt;

&lt;h3&gt;
  
  
  Récupérons un simple projet Spring Boot, compilons le
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;Projets
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Projets
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://gitlab.com/docker-spring-cloud/docker-demo.git
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;docker-demo
&lt;span class="nv"&gt;$ &lt;/span&gt;./mvnw &lt;span class="nb"&gt;install &lt;/span&gt;dockerfile:build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Félicitation, vous venez de compiler et de "&lt;em&gt;conteneuriser&lt;/em&gt;" votre première application Spring Boot&lt;/p&gt;

&lt;h3&gt;
  
  
  Démarrons le conteneur Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker image &lt;span class="nb"&gt;ls
&lt;/span&gt;REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
andycostanzacom/docker-demo    latest              18c5d16986d9        2 hours ago         119MB
openjdk                        8-jdk-alpine        97bc1352afde        7 weeks ago         103MB
&lt;span class="nv"&gt;$ &lt;/span&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-t&lt;/span&gt; andycostanzacom/docker-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans votre navigateur internet, ouvrez la page &lt;a href="http://localhost:8080/hello"&gt;http://localhost:8080/hello&lt;/a&gt; et si la page vous répond "hello" c'est que tout va bien, vous venez d'appeler un endpoint Spring Boot dans un conteneur docker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trucs et astuces
&lt;/h2&gt;

&lt;p&gt;Pour savoir quel conteneur est en cours de fonctionnement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                    NAMES
43721a2aff5d        andycostanzacom/docker-demo   &lt;span class="s2"&gt;"java -cp app:app/li…"&lt;/span&gt;   8 seconds ago       Up 7 seconds        0.0.0.0:8080-&amp;gt;8080/tcp   hungry_greider
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour arrêter un conteneur :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker stop 43721a2aff5d
43721a2aff5d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ouais je sais, il pourrait être plus explicite que de renvoyer juste le &lt;em&gt;Container ID&lt;/em&gt;!&lt;/p&gt;

</description>
      <category>archlinux</category>
      <category>linux</category>
      <category>docker</category>
      <category>french</category>
    </item>
    <item>
      <title>Créer un miroir privé des paquets Arch Linux sur un Synology DS218j</title>
      <dc:creator>Andy Costanza</dc:creator>
      <pubDate>Thu, 26 Mar 2020 08:25:20 +0000</pubDate>
      <link>https://dev.to/costalfy/creer-un-miroir-prive-des-paquets-arch-linux-sur-un-synology-ds218j-4k8e</link>
      <guid>https://dev.to/costalfy/creer-un-miroir-prive-des-paquets-arch-linux-sur-un-synology-ds218j-4k8e</guid>
      <description>&lt;p&gt;Confinement oblige, les réseaux qui font ce qu'internet est aujourd'hui sont extrêmement sollicités ces derniers jours. Selon &lt;a href="https://www.de-cix.net/en/locations/germany/frankfurt/statistics"&gt;DE-CIX&lt;/a&gt;, nous avons des pics journaliers à plus de 9 Terabits/sec&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OXhNpMfH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.de-cix.net/traffic_FRA-1month-1170-400.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OXhNpMfH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.de-cix.net/traffic_FRA-1month-1170-400.png" alt="" width="880" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Je vous laisse deviner, à quelles heures sont ces pics ?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iD_rjJGt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.de-cix.net/traffic_FRA-2days-1170-400.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iD_rjJGt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.de-cix.net/traffic_FRA-2days-1170-400.png" alt="" width="880" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;C'est exactement les heures pendant lesquels je suis sur mes pc Arch Linux et les moments où j'ai tendances à faire les mises à jour ou installer de nouvelles applications.&lt;/p&gt;

&lt;p&gt;J'ai justement un &lt;a href="https://amzn.to/2WBYPMb"&gt;Synology DS218j&lt;/a&gt; que j'utilise pour archiver mes photos dans le cadre de &lt;a href="https://andycostanza.com"&gt;mon activité complémentaire&lt;/a&gt; et il lui reste encore quelques Go de disponible pour héberger un petit miroir privé des paquets Arch Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration du Synology
&lt;/h2&gt;

&lt;p&gt;Je pars du postulat que vous avez déjà un Synology monté, configuré et fonctionnel.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Créez un nouveau dossier partagé sur votre volume&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nXu_mUqy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.andycostanza.com/images/2020-03-22/01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nXu_mUqy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.andycostanza.com/images/2020-03-22/01.png" alt="" width="636" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Créez 2 répertoires : repo et tmp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P6JTU4qj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.andycostanza.com/images/2020-03-22/02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P6JTU4qj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.andycostanza.com/images/2020-03-22/02.png" alt="" width="880" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installez &lt;strong&gt;Web Station&lt;/strong&gt; si ce n'est déjà fait :&lt;/li&gt;
&lt;li&gt;Créez un &lt;strong&gt;Virtual Host&lt;/strong&gt; basé sur le port&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AAYJY2za--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.andycostanza.com/images/2020-03-22/03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AAYJY2za--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.andycostanza.com/images/2020-03-22/03.png" alt="" width="513" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Choisir le miroir Arch Linux le plus rapide
&lt;/h2&gt;

&lt;p&gt;Sur votre machine : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installez &lt;code&gt;pacman-contrib&lt;/code&gt; si ce n'est déjà fait&lt;/li&gt;
&lt;li&gt;Utilisez &lt;strong&gt;rankmirrors&lt;/strong&gt; pour tester le miroir le plus proche de chez vous. La commande ci-dessous permet de tester les miroirs en Belgique, France, Hollande et Allemagne :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://www.archlinux.org/mirrorlist/?country=FR&amp;amp;country=NL&amp;amp;country=BE&amp;amp;country=GE&amp;amp;protocol=https&amp;amp;use_mirror_status=on"&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'s/^#Server/Server/'&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'/^#/d'&lt;/span&gt; | rankmirrors &lt;span class="nt"&gt;-n&lt;/span&gt; 5 -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Parmi les 5 plus rapide, vérifiez lesquels sont compatibles avec &lt;strong&gt;rsync&lt;/strong&gt; sur le site &lt;a href="https://www.archlinux.org/mirrors/"&gt;www.archlinux.org/mirrors&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans mon cas c'est &lt;strong&gt;archlinux.mailtunnel.eu&lt;/strong&gt; que j'utiliserai dans mon script de synchro &lt;/p&gt;

&lt;h2&gt;
  
  
  Script de synchro
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Connectez-vous en SSH sur votre Synology. ex: &lt;code&gt;ssh monUtilisateurSynology@192.168.1.2&lt;/code&gt; si l'ip de votre NAS est 192.168.1.2&lt;/li&gt;
&lt;li&gt;En se basant sur &lt;a href="https://git.archlinux.org/infrastructure.git/tree/roles/syncrepo/files/syncrepo-template.sh"&gt;le script disponible sur wiki.archlinux.org&lt;/a&gt;, j'ai créé le script de synchro avec &lt;code&gt;vim /volume1/archlinux/syncrepo.sh&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;J'ai ajouté les bons répertoires et les bonnes URLs vers le miroir que j'ai testé plus haut et voici à quoi le script ressemble :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;########&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# Copyright © 2014-2019 Florian Pritz &amp;lt;bluewind@xinu.at&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# This program is free software; you can redistribute it and/or modify&lt;/span&gt;
&lt;span class="c"&gt;# it under the terms of the GNU General Public License as published by&lt;/span&gt;
&lt;span class="c"&gt;# the Free Software Foundation; either version 2 of the License, or&lt;/span&gt;
&lt;span class="c"&gt;# (at your option) any later version.&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# This program is distributed in the hope that it will be useful,&lt;/span&gt;
&lt;span class="c"&gt;# but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;/span&gt;
&lt;span class="c"&gt;# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;/span&gt;
&lt;span class="c"&gt;# GNU General Public License for more details.&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# You should have received a copy of the GNU General Public License&lt;/span&gt;
&lt;span class="c"&gt;# along with this program; if not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;########&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# This is a simple mirroring script. To save bandwidth it first checks a&lt;/span&gt;
&lt;span class="c"&gt;# timestamp via HTTP and only runs rsync when the timestamp differs from the&lt;/span&gt;
&lt;span class="c"&gt;# local copy. As of 2016, a single rsync run without changes transfers roughly&lt;/span&gt;
&lt;span class="c"&gt;# 6MiB of data which adds up to roughly 250GiB of traffic per month when rsync&lt;/span&gt;
&lt;span class="c"&gt;# is run every minute. Performing a simple check via HTTP first can thus save a&lt;/span&gt;
&lt;span class="c"&gt;# lot of traffic.&lt;/span&gt;

&lt;span class="c"&gt;# Directory where the repo is stored locally. Example: /srv/repo&lt;/span&gt;
&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/volume1/archlinux/repo"&lt;/span&gt;

&lt;span class="c"&gt;# Directory where files are downloaded to before being moved in place.&lt;/span&gt;
&lt;span class="c"&gt;# This should be on the same filesystem as $target, but not a subdirectory of $target.&lt;/span&gt;
&lt;span class="c"&gt;# Example: /srv/tmp&lt;/span&gt;
&lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/volume1/archlinux/tmp"&lt;/span&gt;

&lt;span class="c"&gt;# Lockfile path&lt;/span&gt;
&lt;span class="nv"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/volume1/archlinux/syncrepo.lck"&lt;/span&gt;

&lt;span class="c"&gt;# If you want to limit the bandwidth used by rsync set this.&lt;/span&gt;
&lt;span class="c"&gt;# Use 0 to disable the limit.&lt;/span&gt;
&lt;span class="c"&gt;# The default unit is KiB (see man rsync /--bwlimit for more)&lt;/span&gt;
&lt;span class="nv"&gt;bwlimit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0

&lt;span class="c"&gt;# The source URL of the mirror you want to sync from.&lt;/span&gt;
&lt;span class="c"&gt;# If you are a tier 1 mirror use rsync.archlinux.org, for example like this:&lt;/span&gt;
&lt;span class="c"&gt;# rsync://rsync.archlinux.org/ftp_tier1&lt;/span&gt;
&lt;span class="c"&gt;# Otherwise chose a tier 1 mirror from this list and use its rsync URL:&lt;/span&gt;
&lt;span class="c"&gt;# https://www.archlinux.org/mirrors/&lt;/span&gt;
&lt;span class="nv"&gt;source_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'rsync://archlinux.mailtunnel.eu/archlinux/'&lt;/span&gt;

&lt;span class="c"&gt;# An HTTP(S) URL pointing to the 'lastupdate' file on your chosen mirror.&lt;/span&gt;
&lt;span class="c"&gt;# If you are a tier 1 mirror use: http://rsync.archlinux.org/lastupdate&lt;/span&gt;
&lt;span class="c"&gt;# Otherwise use the HTTP(S) URL from your chosen mirror.&lt;/span&gt;
&lt;span class="nv"&gt;lastupdate_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'https://archlinux.mailtunnel.eu/lastupdate'&lt;/span&gt;


&lt;span class="c"&gt;#### END CONFIG&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;exec &lt;/span&gt;9&amp;gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;lock&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
flock &lt;span class="nt"&gt;-n&lt;/span&gt; 9 &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit

&lt;/span&gt;rsync_cmd&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;rsync &lt;span class="nt"&gt;-rtlH&lt;/span&gt; &lt;span class="nt"&gt;--safe-links&lt;/span&gt; &lt;span class="nt"&gt;--delete-after&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERBOSE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="s2"&gt;"--timeout=600"&lt;/span&gt; &lt;span class="s2"&gt;"--contimeout=60"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;--delay-updates&lt;/span&gt; &lt;span class="nt"&gt;--no-motd&lt;/span&gt; &lt;span class="s2"&gt;"--temp-dir=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;stty&lt;/span&gt; &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;cmd+&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;--progress&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;cmd+&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nt"&gt;--quiet&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;fi

    if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;bwlimit&amp;gt;0&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;cmd+&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;"--bwlimit=&lt;/span&gt;&lt;span class="nv"&gt;$bwlimit&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;

    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# if we are called without a tty (cronjob) only run when there are changes&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;tty&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$target&lt;/span&gt;&lt;span class="s2"&gt;/lastupdate"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; diff &lt;span class="nt"&gt;-b&lt;/span&gt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;curl &lt;span class="nt"&gt;-Ls&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$lastupdate_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$target&lt;/span&gt;&lt;span class="s2"&gt;/lastupdate"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# keep lastsync file in sync for statistics generated by the Arch Linux website&lt;/span&gt;
    rsync_cmd &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$source_url&lt;/span&gt;&lt;span class="s2"&gt;/lastsync"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$target&lt;/span&gt;&lt;span class="s2"&gt;/lastsync"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi

&lt;/span&gt;rsync_cmd &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.links.tar.gz*'&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'/other'&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'/sources'&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'/iso'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;source_url&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;#echo "Last sync was $(date -d @$(cat ${target}/lastsync))"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ajouter une tâche planifiée dans le Synology
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Toujours connecté en SSH à votre Synology, modifiez votre /etc/crontab : &lt;code&gt;sudo vim /etc/crontab&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ajoutez la tache de synchro pendant les heures creuses du trafic mondial :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;0   5   &lt;span class="k"&gt;*&lt;/span&gt;   &lt;span class="k"&gt;*&lt;/span&gt;   &lt;span class="k"&gt;*&lt;/span&gt;   root    bash /volume1/archlinux/syncrepo.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ajouter votre miroir privé dans votre /etc/pacman.d/mirrorlist
&lt;/h2&gt;

&lt;p&gt;Sur votre machine :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modifiez votre &lt;code&gt;/etc/pacman.d/mirrorlist&lt;/code&gt; et ajouter l'url vers votre NAS comme premier serveur dans la liste
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Server &lt;span class="o"&gt;=&lt;/span&gt; http://nas:9080/&lt;span class="nv"&gt;$repo&lt;/span&gt;/os/&lt;span class="nv"&gt;$arch&lt;/span&gt;
&lt;span class="c"&gt;#Server = http://192.168.1.2:9080/$repo/os/$arch ou utilisez directement l'ip du NAS si l'url ci-dessus ne fonctionne pas&lt;/span&gt;
Server &lt;span class="o"&gt;=&lt;/span&gt; ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Je sais que je ne suis qu'une goute d'eau dans cet océan de données qui transit par seconde mais si cet article peut donner des idées à d'autres, nous pourrons faire des rivières et celles-ci pourront, peut être, lisser le trafic mondial et soulager internet&lt;/p&gt;

</description>
      <category>archlinux</category>
      <category>linux</category>
      <category>mirror</category>
      <category>french</category>
    </item>
  </channel>
</rss>
