<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nginx on Jesuisadmin</title><link>https://jesuisadmin.fr/tags/Nginx/</link><description>Recent content in Nginx on Jesuisadmin</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><lastBuildDate>Sat, 18 May 2019 12:03:24 +0000</lastBuildDate><atom:link href="https://jesuisadmin.fr/tags/Nginx/index.xml" rel="self" type="application/rss+xml"/><item><title>WordOps - Déployer WordPress avec Nginx simplement</title><link>https://jesuisadmin.fr/wordops-deployer-wordpress-nginx-simplement/</link><pubDate>Sat, 18 May 2019 12:03:24 +0000</pubDate><guid>https://jesuisadmin.fr/wordops-deployer-wordpress-nginx-simplement/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2019/05/Sans-titre--1-.png" alt="Featured image of post WordOps - Déployer WordPress avec Nginx simplement" /&gt;&lt;p&gt;Pour automatiser le déploiement de mes serveurs avec Nginx, PHP, MariaDB et pour créer les vhosts Nginx, j&amp;rsquo;utilisais précédemment &lt;a class="link" href="https://easyengine.io/" target="_blank" rel="noopener"&#13;&#10; &gt;EasyEngine v3&lt;/a&gt; - qui avait d&amp;rsquo;ailleurs fait l&amp;rsquo;objet &lt;a class="link" href="https://jesuisadmin.fr/easyengine-nginx-wordpress/" target="_blank" rel="noopener"&#13;&#10; &gt;d&amp;rsquo;un article&lt;/a&gt;. Le problème, c&amp;rsquo;est qu&amp;rsquo;EasyEngine n&amp;rsquo;était plus vraiment à jour. Et pour cause, ses développeurs (rtCamp) travaillaient sur une nouvelle mouture qui a été publiée fin novembre 2018, EasyEngine v4.&lt;/p&gt;&#10;&lt;p&gt;Malheureusement, cette nouvelle version développée en PHP qui utilise WP-CLI et Docker ne réponds pas vraiment à mes besoins, et ne laisse (à l&amp;rsquo;heure actuelle) que très peu de place à la customisation, aussi bien au niveau des configurations Nginx, que des paquets/containers utilisés.&lt;/p&gt;&#10;&lt;p&gt;N&amp;rsquo;y voyez pas un reproche à l&amp;rsquo;encontre de ses créateurs, puisque je comprends tout à fait le choix fait par l&amp;rsquo;équipe de rtCamp, et il me semble tout à fait normal que l&amp;rsquo;outil qu&amp;rsquo;ils développent soit avant tout adapté à leurs besoins. Il me paraît d&amp;rsquo;ailleurs important de souligner qu&amp;rsquo;ils mettent à disposition, gratuitement, avec une simple licence MIT, une application très complète et documentée, et ceux depuis déjà plusieurs années (la première version d&amp;rsquo;EasyEngine a été publiée en 2014).&lt;/p&gt;&#10;&lt;p&gt;Finalement, c&amp;rsquo;est en parcourant les articles du blog d&amp;rsquo;EasyEngine fin Décembre, que j&amp;rsquo;ai découvert qu&amp;rsquo;un fork de la version 3 d&amp;rsquo;EasyEngine baptisé &lt;a class="link" href="https://wordops.net" target="_blank" rel="noopener"&#13;&#10; &gt;WordOps&lt;/a&gt; était actuellement en développement et qu&amp;rsquo;une première pre-release était disponible sur Github.&lt;/p&gt;&#10;&lt;p&gt;Ayant contribué de mon mieux au projet EasyEngine v3 en publiant un certain nombre de scripts ainsi que la majorité de mes configurations Nginx, j&amp;rsquo;ai été contacté par l&amp;rsquo;équipe de WordOps que j&amp;rsquo;ai finalement intégré début Février.&lt;/p&gt;&#10;&lt;p&gt;Nous avons publié la première version &amp;ldquo;stable&amp;rdquo; de l&amp;rsquo;application début Mai et il était donc temps de rédiger un article pour vous présenter WordOps.&lt;/p&gt;&#10;&lt;h3 id="wordops-quest-ce-que-cest-"&gt;WordOps qu&amp;rsquo;est ce que c&amp;rsquo;est ?&#13;&#10;&lt;/h3&gt;&lt;p&gt;C&amp;rsquo;est un outil en ligne de commande qui facilite l&amp;rsquo;administration d&amp;rsquo;un serveur et le déploiement de sites avec Nginx (notamment WordPress) en utilisant des commandes simples - faciles à mémoriser.&lt;/p&gt;&#10;&lt;h3 id="quels-sont-les-pré-requis-pour-installer-wordops-"&gt;Quels sont les pré-requis pour installer WordOps ?&#13;&#10;&lt;/h3&gt;&lt;p&gt;Du côté hardware, il n&amp;rsquo;y a pas vraiment de pré-requis, puisque l&amp;rsquo;application est développée en Python avec le framework Cement et ne nécessite que quelques mégaoctets d&amp;rsquo;espace disque pour le stockage des librairies.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Pour une utilisation en production&lt;/strong&gt;, les services installés et configurés par WordOps tel que Nginx, PHP-FPM ou MariaDB, nécessitent un minimum de ressources pour fonctionner. Ce minimum peut varier en fonction du trafic des sites hébergés. C&amp;rsquo;est pourquoi nous conseillons d&amp;rsquo;installer WordOps sur un serveur disposant d&amp;rsquo;au moins 2Go de RAM et si possible d&amp;rsquo;un processeur multi-core (qu&amp;rsquo;ils soient virtuels ou non) pour garantir le bon fonctionnement des différents services déployés avec WordOps et donc la disponibilité des sites hébergés.&lt;/p&gt;&#10;&lt;p&gt;Par contre, si vous comptez utiliser WordOps pour du développement, il devrait normalement fonctionner sur n&amp;rsquo;importe qu&amp;rsquo;elle machine/VM disposant de 512mo de RAM ou plus.&lt;/p&gt;&#10;&lt;p&gt;Nous avons d&amp;rsquo;ailleurs ajouté depuis peu le support de la distribution Raspbian 9, qui permet donc l&amp;rsquo;installation sur Raspberry Pi (nos tests ont été réalisés sur le modèle 3B+).&lt;/p&gt;&#10;&lt;p&gt;Du côté software, les distributions linux supportées sont :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ubuntu 16.04 LTS (Xenial)&lt;/li&gt;&#10;&lt;li&gt;Ubuntu 18.04 LTS (Bionic)&lt;/li&gt;&#10;&lt;li&gt;Ubuntu 19.04 (Disco)&lt;/li&gt;&#10;&lt;li&gt;Debian 8 (Jessie)&lt;/li&gt;&#10;&lt;li&gt;Debian 9 (Stretch)&lt;/li&gt;&#10;&lt;li&gt;Raspbian 9 (Stretch)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="quelles-sont-ses-fonctionnalités-"&gt;Quelles sont ses fonctionnalités ?&#13;&#10;&lt;/h3&gt;&lt;p&gt;WordOps réalise non seulement l&amp;rsquo;installation et la configuration des paquets nécessaires au déploiement d&amp;rsquo;un site (Nginx, PHP, MariaDB) mais il s&amp;rsquo;occupe également de la création des vhosts Nginx, de la base de données, d&amp;rsquo;installer WordPress et même d&amp;rsquo;obtenir un certificat SSL Let&amp;rsquo;s Encrypt, le tout réalisable en une seule ligne de commande.&lt;/p&gt;&#10;&lt;p&gt;Dans le cas d&amp;rsquo;un site WordPress, vous disposez de plusieurs solutions de cache (optionelles) : Nginx fastcgi_cache, Redis (full page cache + object cache) ou WP-Super-Cache.&lt;/p&gt;&#10;&lt;p&gt;Enfin WordOps dispose d&amp;rsquo;un tableau de bord (que j&amp;rsquo;ai réalisé depuis un template bootstrap de &lt;a class="link" href="https://www.creative-tim.com/" target="_blank" rel="noopener"&#13;&#10; &gt;Creative Tim&lt;/a&gt; et avec la suite de monitoring Netdata) qui permet à la fois de monitorer le serveur mais également d&amp;rsquo;accéder à des outils tel que PhpMyAdmin, Adminer, eXtplorer, phpRedisAdmin etc.. Une démo est disponible à l&amp;rsquo;adresse suivante : &lt;a class="link" href="https://demo.wordops.eu/" target="_blank" rel="noopener"&#13;&#10; &gt;demo.wordops.eu&lt;/a&gt;.&lt;/p&gt;&#10;&lt;figure&gt;&lt;img src="https://jesuisadmin.fr/images/2019/05/demo.wordops.eu.jpg"&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;h3 id="quest-ce-quil-y-a-sous-le-capot-"&gt;Qu&amp;rsquo;est ce qu&amp;rsquo;il y a sous le capot ?&#13;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Nginx&lt;/strong&gt; stable v1.16.1 (custom) avec le support du HTTP/2 HPACK de Cloudflare, de la compression avec Brotli, et des modules tiers tel que ngx_cache_purge ou ngx_vts&lt;/li&gt;&#10;&lt;li&gt;PHP 7.2 &amp;amp; PHP 7.3&lt;/li&gt;&#10;&lt;li&gt;MariaDB server 10.3&lt;/li&gt;&#10;&lt;li&gt;Redis 5.0&lt;/li&gt;&#10;&lt;li&gt;Netdata pour le monitoring&lt;/li&gt;&#10;&lt;li&gt;Acme.sh pour la gestion des certificats SSL Let&amp;rsquo;s Encrypt&lt;/li&gt;&#10;&lt;li&gt;WP-CLI pour le déploiement des sites WordPress&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Et bien sûr, un ensemble de templates de configuration Nginx, qui ont pour objectif de délivrer les meilleures performances possibles ainsi qu&amp;rsquo;un niveau de sécurité optimale. Pour cela, WordOps utilise par exemple Nginx en tant que load-balancer pour répartir la charge sur les pools php-fpm en utilisant plusieurs unix sockets. On retrouve également un certain nombre de directives limitant l&amp;rsquo;accès et/ou l&amp;rsquo;exécution et le téléchargement de certains fichiers afin de bloquer les tentatives d&amp;rsquo;attaques régulièrement utilisées.&lt;/p&gt;&#10;&lt;h2 id="installer-wordops"&gt;Installer WordOps&#13;&#10;&lt;/h2&gt;&lt;p&gt;Un script pour automatiser l&amp;rsquo;installation de WordOps est bien sûr disponible, il s&amp;rsquo;exécute avec la commande suivante :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -qO wo wops.cc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo bash wo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si vous souhaitez installer manuellement WordOps, un guide est disponible dans la &lt;a class="link" href="https://docs.wordops.net/getting-started/installation-guide/" target="_blank" rel="noopener"&#13;&#10; &gt;documentation&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Durant l&amp;rsquo;installation, WordOps vous demandera un nom d&amp;rsquo;utilisateur et une adresse email. Ces informations sont &lt;strong&gt;uniquement utilisées&lt;/strong&gt; pour générer le fichier .gitconfig nécessaire au fonctionnement de git, qui est utilisé pour enregistrer les différentes configurations du serveur.&lt;/p&gt;&#10;&lt;h2 id="commencer-avec-wordops"&gt;Commencer avec WordOps&#13;&#10;&lt;/h2&gt;&lt;p&gt;Après avoir installé WordOps, la première étape est d&amp;rsquo;activer la complétion des commandes, il suffit pour cela d&amp;rsquo;utiliser la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /etc/bash_completion.d/wo_auto.rc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nous pouvons donc commencer à utiliser les commandes WordOps, dont la structure est la suivante :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wo &amp;lt;commande&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;options&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous souhaitez obtenir la liste des commandes disponibles ? Rien de plus simple, utilisez la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pouvez également obtenir des informations sur chacune des sous-commandes en ajoutant les arguments &lt;code&gt;-h&lt;/code&gt; ou &lt;code&gt;--help&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Exemple :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wo site create -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="installer-les-services-optionnel"&gt;Installer les services (optionnel)&#13;&#10;&lt;/h3&gt;&lt;p&gt;WordOps peut installer les services Nginx, PHP ou MySQL via la commande &lt;code&gt;wo stack&lt;/code&gt; ou n&amp;rsquo;installer que les services nécessaires lors de la création d&amp;rsquo;un site avec la commande &lt;code&gt;wo site create&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Si vous comptez utiliser WordOps pour héberger vos sites WordPress, il peut être intéressant de commencer par déployqer les services (Nginx, PHP 7.2, MariaDB) ainsi que les outils additionnels (phpMyAdmin, Adminer, OpcacheGui) qui seront disponibles dans le backend accessible via le port 22222 (exemple : https://IP.DU.SERVEUR:22222 ou &lt;a class="link" href="https://serveur.hostname:22222" target="_blank" rel="noopener"&#13;&#10; &gt;https://serveur.hostname:22222&lt;/a&gt;).&lt;/p&gt;&#10;&lt;p&gt;Pour déployer les services, la commande à utiliser est :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wo stack install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="créer-votre-premier-site"&gt;Créer votre premier site&#13;&#10;&lt;/h3&gt;&lt;p&gt;Que vous ayez suivi ou non l&amp;rsquo;étape précédente, vous pouvez créer votre premier site.&#10;La création de site se fait via la commande &lt;code&gt;wo site create&lt;/code&gt; avec la structure suivante :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wo site create &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;nom_de_domaine&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;type_de_site&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;options&lt;span class="o"&gt;]&lt;/span&gt; &amp;lt;options&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour vous donner un exemple relativement simple, nous allons créer un site WordPress, configuré avec PHP 7.3 et le système de cache nginx fastcgi_cache, sécurisé avec un certificat SSL Let&amp;rsquo;s Encrypt :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wo site create site.tld --wpfc --php73 --letsencrypt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="quelques-points-à-retenir"&gt;Quelques points à retenir&#13;&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;par défaut et en l&amp;rsquo;absence de l&amp;rsquo;argument &lt;code&gt;--php73&lt;/code&gt;, WordOps utilisera PHP 7.2&lt;/li&gt;&#10;&lt;li&gt;l&amp;rsquo;argument &lt;code&gt;--wpfc&lt;/code&gt; définit le type de site, ici un site WordPress avec le système de cache Nginx fastcgi_cache. Vous pouvez découvrir tous les autres types de sites dans &lt;a class="link" href="https://docs.wordops.net/commands/site/#site-create" target="_blank" rel="noopener"&#13;&#10; &gt;la documentation&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;l&amp;rsquo;argument &lt;code&gt;--letsencrypt&lt;/code&gt; est optionel et peut être utilisé avec n&amp;rsquo;importe quel type de site. Si le site que vous souhaitez créer est un sous-domaine, utilisez alors l&amp;rsquo;argument &lt;code&gt;--letsencrypt=subdomain&lt;/code&gt; pour que WordOps n&amp;rsquo;essaye pas de générer un certificat SSL pour l&amp;rsquo;alias &lt;code&gt;www.site.tld&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Voici un exemple qui présente le fonctionnement général de WordOps :&lt;/p&gt;&#10;&lt;p&gt;&lt;video align="center" src="https://wordops.net/wp-content/uploads/2019/08/wordops-net-intro.mp4" width="840" autoplay loop &gt;&lt;/video&gt;&lt;/p&gt;&#10;&lt;h2 id="contribuer"&gt;Contribuer&#13;&#10;&lt;/h2&gt;&lt;p&gt;Comme pour la majorité des projets open-source, toute contribution est la bienvenue. Et il n&amp;rsquo;est pas nécessaire d&amp;rsquo;être un développeur ou un administrateur système pour contribuer.&lt;/p&gt;&#10;&lt;p&gt;Le simple fait de faire un signalement détaillé d&amp;rsquo;un bug dans l&amp;rsquo;application est une contribution au projet. Vous pouvez également participer à l&amp;rsquo;amélioration de la documentation de WordOps, qui peut facilement être éditée car elle est rédigée en markdown et hébergée dans un &lt;a class="link" href="https://github.com/WordOps/docs.wordops.net" target="_blank" rel="noopener"&#13;&#10; &gt;dépôt Github&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Si vous souhaitez contribuer directement au développement de WordOps, sachez que la rédaction d&amp;rsquo;un guide est en cours, avec un présentation détaillée des librairies utilisées et les règles à suivre notamment pour le style à appliquer au code (PEP8). Je mettrais à jour cet article dès que le guide sera publié sur le dépôt Github.&lt;/p&gt;&#10;&lt;h2 id="les-liens-utiles"&gt;Les liens utiles&#13;&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;le site du projet : &lt;a class="link" href="https://wordops.net" target="_blank" rel="noopener"&#13;&#10; &gt;https://wordops.net&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;le dépôt Github : &lt;a class="link" href="https://github.com/WordOps/WordOps" target="_blank" rel="noopener"&#13;&#10; &gt;https://github.com/WordOps/WordOps&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;le forum : &lt;a class="link" href="https://community.wordops.net/" target="_blank" rel="noopener"&#13;&#10; &gt;https://community.wordops.net/&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;la documentation : &lt;a class="link" href="https://docs.wordops.net/" target="_blank" rel="noopener"&#13;&#10; &gt;https://docs.wordops.net/&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;le compte twitter : &lt;a class="link" href="https://twitter.com/WordOps_" target="_blank" rel="noopener"&#13;&#10; &gt;https://twitter.com/WordOps_&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;le compte mastodon : &lt;a class="link" href="https://mastodon.top/@WordOps" target="_blank" rel="noopener"&#13;&#10; &gt;https://mastodon.top/@WordOps&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Installer Rocket.chat sur Ubuntu 18.04 LTS</title><link>https://jesuisadmin.fr/installer-rocket-chat-ubuntu-16-04-lts/</link><pubDate>Wed, 01 May 2019 16:21:00 +0000</pubDate><guid>https://jesuisadmin.fr/installer-rocket-chat-ubuntu-16-04-lts/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2019/05/rocket-chat.jpg" alt="Featured image of post Installer Rocket.chat sur Ubuntu 18.04 LTS" /&gt;&lt;p&gt;Rocket.Chat est une plateforme de chat open-source et particulièrement complète. Vous pouvez aussi bien l’utiliser pour créer une chat-room, avec une gestion des utilisateurs et des permissions, que pour proposer un live chat via un widget sur votre site web.Cette plateforme est d’autant plus intéressante que vous pouvez la déployer en utilisant les “snaps” sur Ubuntu. Ainsi vous n’aurez pas besoin d’installer/configurer NodeJS ou MongoDB.&lt;/p&gt;&#10;&lt;h2 id="installer-rocketchat-avec-un-snap"&gt;Installer Rocket.chat avec un snap&#13;&#10;&lt;/h2&gt;&lt;p&gt;L’installation se fait via une seule ligne de commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap install rocketchat-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Votre instance Rocket.Chat sera alors accessible à l’adresse : &lt;code&gt;http://IP-de-VOTRE-SERVEUR:3000&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="mettre-en-place-un-reverse-proxy-avec-nginx"&gt;Mettre en place un reverse-proxy avec Nginx&#13;&#10;&lt;/h2&gt;&lt;p&gt;Il est préférable de mettre en place un reverse-proxy pour accéder à l&amp;rsquo;interface de Rocket.Chat via un port standard et d&amp;rsquo;utiliser un certificat SSL pour sécuriser les échanges. Nous allons pour cela installer Nginx et générer un certificat SSL via Let’s Encrypt.&lt;/p&gt;&#10;&lt;p&gt;Commençons par installer Nginx :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On créer ensuite notre vhost dans /etc/nginx/sites-available/ :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano /etc/nginx/sites-available/chat.votredomaine.tld&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dont voici le contenu :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# redirection http vers https&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;chat.votredomaine.tld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://chat.votredomaine.tld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Upstream&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# HTTPS Server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;chat.votredomaine.tld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;error_log&lt;/span&gt; &lt;span class="s"&gt;/var/log/nginx/rocketchat.access.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;upgrade&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forward-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forward-Proto&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Nginx-Proxy&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_redirect&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# permet de stocker la configuration ssl dans le répertoire du site&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;/var/www/votredomaine.tld/conf/nginx/*conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour activer ce vhost, on créer un lien symbolique vers le répertoire &lt;code&gt;/etc/nginx/sites-enabled&lt;/code&gt; avec la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -s /etc/nginx/sites-available/chat.votredomaine.tld /etc/nginx/sites-enabled/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis on relance Nginx :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;service nginx reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="obtenir-un-certificat-ssl-lets-encrypt-avec-acmesh"&gt;Obtenir un certificat SSL Let&amp;rsquo;s Encrypt avec acme.sh&#13;&#10;&lt;/h3&gt;&lt;p&gt;Il ne nous reste plus qu’à générer le certificat via Let’s Encrypt, on installe donc acme.sh :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O - https://get.acme.sh &lt;span class="p"&gt;|&lt;/span&gt; sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo &lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis on génère le certificat pour notre sous-domaine.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acme.sh --issue -d chat.votredomaine.tld --pre-hook &lt;span class="s2"&gt;&amp;#34;systemctl stop nginx&amp;#34;&lt;/span&gt; --standalone --post-hook &lt;span class="s2"&gt;&amp;#34;systemctl start nginx&amp;#34;&lt;/span&gt; --ecc -k ec-384&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On créer un répertoire pour stocker notre certificat :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /etc/letsencrypt/live/chat.votredomaine.tld&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis on installe le certificat dans ce répertoire :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acme.sh --install-cert -d chat.votredomaine.tld --ecc &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--cert-file /etc/letsencrypt/live/chat.votredomaine.tld/cert.pem &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--key-file /etc/letsencrypt/live/chat.votredomaine.tld/key.pem &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--fullchain-file /etc/letsencrypt/live/chat.votredomaine.tld/fullchain.pem &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--ca-file /etc/letsencrypt/live/chat.votredomaine.tld/ca.pem &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--reloadcmd &lt;span class="s2"&gt;&amp;#34;systemctl restart nginx.service&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On termine en ajoutant le certificat SSL à notre configuration Nginx, pour cela nous allons créer le fichier &lt;code&gt;/var/www/chat.votredomaine.tld/conf/nginx/ssl.conf&lt;/code&gt; qui sera automatiquement ajouté dans notre vhost grâce à la directive &lt;code&gt;include /var/www/chat.votredomaine.tld/conf/nginx/*conf;&lt;/code&gt;. Voici son contenu:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/chat.votredomaine.tld/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/chat.votredomaine.tld/key.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;ssl_trusted_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/chat.votredomaine.tld/ca.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La dernière étape pour pouvoir accéder à l&amp;rsquo;instance Rocket.Chat est d&amp;rsquo;appliquer la configuration avec la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;service nginx reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pourrez alors accéder à votre instance via l&amp;rsquo;adresse &lt;a class="link" href="https://chat.votredomaine.tld" target="_blank" rel="noopener"&#13;&#10; &gt;https://chat.votredomaine.tld&lt;/a&gt;. Pour accéder au panel d&amp;rsquo;administration de Rocket.chat, il vous faudra créer un premier compte utilisateur qui sera automatiquement définit en tant qu&amp;rsquo;administrateur.&lt;/p&gt;&#10;</description></item><item><title>Release Bell : ne ratez plus aucune publication de release sur Github</title><link>https://jesuisadmin.fr/ne-ratez-release-github-avec-release-bell/</link><pubDate>Wed, 24 Oct 2018 04:42:09 +0000</pubDate><guid>https://jesuisadmin.fr/ne-ratez-release-github-avec-release-bell/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2018/09/release-bell-1.png" alt="Featured image of post Release Bell : ne ratez plus aucune publication de release sur Github" /&gt;&lt;p&gt;Lorsqu&amp;rsquo;on héberge un certain nombre d&amp;rsquo;applications &amp;ldquo;open-source&amp;rdquo;, il &lt;del&gt;est&lt;/del&gt; était parfois difficile de suivre le flux de mises à jour des applications. Il s&amp;rsquo;agit heureusement d&amp;rsquo;une époque révolue, grâce à l&amp;rsquo;application Release Bell developpée par l&amp;rsquo;équipe de &lt;a class="link" href="https://cloudron.io" target="_blank" rel="noopener"&#13;&#10; &gt;cloudron.io&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Release-Bell est une application qui permet de recevoir une notification lorsqu&amp;rsquo;une nouvelle release est publiée sur Github parmi la liste des dépôts que vous avez &amp;ldquo;étoilé&amp;rdquo;. Elle est disponible via la plateforme de self-hosting cloudron que j&amp;rsquo;ai précédement présenté dans un &lt;a class="link" href="https://jesuisadmin.fr/cloudron-solution-self-hosting-facile/" target="_blank" rel="noopener"&#13;&#10; &gt;article&lt;/a&gt;, mais elle peut également être installée manuellement sur n&amp;rsquo;importe quel serveur linux disposant de Nodejs et d&amp;rsquo;un serveur MySQL.&lt;/p&gt;&#10;&lt;figure&gt;&lt;img src="https://jesuisadmin.fr/images/2018/09/Screenshot_2018-09-16-Release-Bell.png"&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;p&gt;Les notifications sont envoyées par email, mais il n&amp;rsquo;est absolument pas obligatoire d&amp;rsquo;activer cette fonctionnalité. Dans mon cas, visualiser la liste des dépôts Github qui m&amp;rsquo;intéresse, sous la forme d&amp;rsquo;un flux chronologique suivant la date de publication des releases est largement suffisant.&lt;/p&gt;&#10;&lt;p&gt;Dans ce tutoriel, nous allons voir comment installer l&amp;rsquo;application Release-Bell sur un serveur Debian(8/9) ou Ubuntu (16.04 LTS/18.04 LTS).&lt;/p&gt;&#10;&lt;h2 id="les-prérequis"&gt;Les prérequis&#13;&#10;&lt;/h2&gt;&lt;p&gt;Comme je l&amp;rsquo;ai dis précédemment, pour installer Release-Bell, vous aurez besoin d&amp;rsquo;un reverse-proxy (Nginx dans ce tutoriel), de NodeJS (dont la version LTS actuelle est 8.x) et d&amp;rsquo;un serveur MySQL (ou MariaDB).&lt;/p&gt;&#10;&lt;h4 id="nginx"&gt;Nginx&#13;&#10;&lt;/h4&gt;&lt;p&gt;Pour l&amp;rsquo;installation d&amp;rsquo;Nginx, rien de plus simple, sur Ubuntu ou Debian suffit d&amp;rsquo;utiliser :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt-get install nginx -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="nodejs"&gt;NodeJS&#13;&#10;&lt;/h4&gt;&lt;p&gt;Pour NodeJS, c&amp;rsquo;est également relativement simple, puisqu&amp;rsquo;il suffit d&amp;rsquo;utiliser les commandes :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://deb.nodesource.com/setup_8.x &lt;span class="p"&gt;|&lt;/span&gt; sudo -E bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install -y nodejs&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="mariadb"&gt;MariaDB&#13;&#10;&lt;/h4&gt;&lt;p&gt;Enfin pour le serveur MySQL (MariaDB server 10.3 dans ce tutoriel) :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ajout du dépôt APT de MariaDB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo bash &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;wget -qO - https://downloads.mariadb.com/MariaDB/mariadb_repo_setup&lt;span class="o"&gt;)&lt;/span&gt; --mariadb-server-version&lt;span class="o"&gt;=&lt;/span&gt;10.3 --skip-maxscale -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# installation de MariaDB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt-get install mariadb-server -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je vous recommande de placer les identifiants root du serveur MariaDB dans un fichier .my.cnf placé dans votre home pour pouvoir vous connecter via la commande &lt;code&gt;mysql&lt;/code&gt;, sans avoir à copier/coller le mot de passe à chaque opération. Vous trouverez plus d&amp;rsquo;informations sur le sujet dans cet &lt;a class="link" href="https://kb.virtubox.net/fr/knowledgebase/connecter-mysql-fichier-my-cnf/" target="_blank" rel="noopener"&#13;&#10; &gt;article de la KnowledgeBase de VirtuBox&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Il vous faudra créer une base de données avant de commencer l&amp;rsquo;installation de Release-Bell. Pour cela connecter vous en tant que root à votre serveur MariaDB :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysql&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;puis créez une nouvelle base de données :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-mysql" data-lang="mysql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DATABASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;releasebell&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ajouter ensuite un utilisateur avec les permissions nécessaires pour utiliser cette base de données :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-mysql" data-lang="mysql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;releasebell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utilisateur_releasebell&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IDENTIFIED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;motdepasse&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Terminez en flushant les privilèges pour appliquer les modifications&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-mysql" data-lang="mysql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FLUSH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis quittez l&amp;rsquo;interface en ligne de commande de MySQL :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-mysql" data-lang="mysql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="installer-release-bell"&gt;Installer Release-Bell&#13;&#10;&lt;/h2&gt;&lt;p&gt;Certaines étapes de l&amp;rsquo;installation de Release-Bell sont peut-être incomplètes ou différentes de la méthode utilisée par Cloudron. La documentation disponible sur le dépôt de l&amp;rsquo;application étant minimaliste, j&amp;rsquo;ai utilisé les mêmes étapes d&amp;rsquo;installation que d&amp;rsquo;autres applications NodeJS.&lt;/p&gt;&#10;&lt;p&gt;Pour installer Release-Bell, créer un nouvel utilisateur, de préférence sans mot de passe ou login afin d&amp;rsquo;éviter un éventuel accès non désiré via cet utilisateur :&lt;/p&gt;&#10;&lt;h4 id="mise-en-place-de-lapplication-nodejs"&gt;Mise en place de l&amp;rsquo;application NodeJS&#13;&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;adduser --disabled-password --disabled-login releasebell&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis connecter vous en tant que cet utilisateur :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo su - releasebell&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Créez un répertoire pour héberger l&amp;rsquo;application :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir releasebell&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis téléchargez l&amp;rsquo;application avant de extraire de son archive :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -L https://git.cloudron.io/cloudron/releasebell/-/archive/v1.1.0/releasebell-v1.1.0.tar.gz &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; tar zxf - --strip-components &lt;span class="m"&gt;1&lt;/span&gt; -C ./releasebell&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Allez dans le répertoire de l&amp;rsquo;application :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; releasebell&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et installer des dépendances NodeJS :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="importation-de-la-structure-de-la-base-de-données"&gt;Importation de la structure de la base de données&#13;&#10;&lt;/h4&gt;&lt;p&gt;Le structure de la base de donnéees de releasebell est stockée dans le dossier &lt;code&gt;migrations&lt;/code&gt; de l&amp;rsquo;application. Pour l&amp;rsquo;importer il suffit donc d&amp;rsquo;utiliser :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysql -u utilisateur_releasebell -p releasebell &amp;lt; migrations/initial-schema.sql&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configurer-release-bell"&gt;Configurer Release-Bell&#13;&#10;&lt;/h3&gt;&lt;p&gt;La configuration de l&amp;rsquo;application repose sur deux fichiers, il s&amp;rsquo;agit de database.json utilisé pour la configuration de la base de données MySQL, et users.json pour les identifiants des utilisateurs de l&amp;rsquo;application.&lt;/p&gt;&#10;&lt;p&gt;Il faut tout d&amp;rsquo;abord définir les paramètres d&amp;rsquo;accès à la base de données dans le fichier database.json, qui doit ressembler à l&amp;rsquo;exemple suivant :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;defaultEnv&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;local&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;local&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utilisateur_releasebell&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;motdepasse&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;database&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;releasebell&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;driver&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mysql&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;multipleStatements&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;S&amp;rsquo;il n&amp;rsquo;existe pas encore, créez le fichier users.json dont le contenu doit ressembler à l&amp;rsquo;exemple suivant :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;votre_nom_dutilisateur&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;motdepasse&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test@example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La configuration de l&amp;rsquo;application est désormais terminée, l&amp;rsquo;application peut-être lancée avec la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;node index.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ajouter-un-service-systemd-pour-release-bell"&gt;Ajouter un service systemd pour Release-Bell&#13;&#10;&lt;/h3&gt;&lt;p&gt;Vous souhaitez peut-être pouvoir utiliser l&amp;rsquo;application sans avoir à laisser un terminal ouvert indéfiniment. Pour cela le plus simple sur Debian/Ubuntu est d&amp;rsquo;ajouter un service systemd pour notre application. On y définira notamment certaines variables nécessaires à la configuration de l&amp;rsquo;application.&lt;/p&gt;&#10;&lt;p&gt;Pour ajouter un service, nous allons créer un ficher .service dans la répertoire &lt;code&gt;/lib/systemd/system/&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /lib/systemd/system/release_bell.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le contenu de ce ficher de configuration doit ressembler à ceci (il vous faudra l&amp;rsquo;adapter avec vos informations) :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Unit&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ReleaseBell&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Service&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;simple&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/utilisateur_releasebell/releasebell&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utilisateur_releasebell&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;NODE_ENV=production&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;MAIL_SMTP_SERVER=smtp.example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;MAIL_SMTP_PORT=25&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;MAIL_SMTP_USERNAME=releasebell@example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;MAIL_SMTP_PASSWORD=MotdepasseSMTP&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;MAIL_FROM=releasebell@example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;MAIL_DOMAIN=example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;APP_ORIGIN=example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/node index.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Install&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;multi-user.target&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Activez le service release_bell avec la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; release_bell.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pouvez enfin démarrer le service avec la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service release_bell start&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configurer-nginx"&gt;Configurer Nginx&#13;&#10;&lt;/h2&gt;&lt;p&gt;Pour terminer ce tutoriel, voici un exemple de configuration pour utiliser Nginx en tant que reverse-proxy pour notre application :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;release.yourdomain.tld&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;access_log&lt;/span&gt; &lt;span class="s"&gt;/var/log/nginx/release.yourdomain.tld.access.log&lt;/span&gt; &lt;span class="s"&gt;rt_cache&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;error_log&lt;/span&gt; &lt;span class="s"&gt;/var/log/nginx/release.yourdomain.tld.error.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_redirect&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je ne vais pas m&amp;rsquo;étendre sur cette partie de la configuration, mais je vous invite à jeter un oeil à mon article &lt;a class="link" href="https://kb.virtubox.net/fr/knowledgebase/installer-un-certificat-ssl-lets-encrypt-avec-acme-sh/" target="_blank" rel="noopener"&#13;&#10; &gt;Installer un certificat SSL Let&amp;rsquo;s Encrypt avec acme.sh&lt;/a&gt; si vous souhaitez générer un certificat SSL pour sécuriser l&amp;rsquo;accès à l&amp;rsquo;application Release-Bell.&lt;/p&gt;&#10;</description></item><item><title>Comment avoir une excellente configuration HTTPS en 2017 ?</title><link>https://jesuisadmin.fr/comment-avoir-une-excellente-configuration-https-en-2017/</link><pubDate>Fri, 13 Oct 2017 00:05:47 +0000</pubDate><guid>https://jesuisadmin.fr/comment-avoir-une-excellente-configuration-https-en-2017/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2017/10/https-2017-wonderfall.png" alt="Featured image of post Comment avoir une excellente configuration HTTPS en 2017 ?" /&gt;&lt;p&gt;Article écrit par &lt;a class="link" href="https://masto.targaryen.house/@wonder" target="_blank" rel="noopener"&#13;&#10; &gt;Wonderfall&lt;/a&gt;. Suite à la fermeture de son blog, j&amp;rsquo;ai souhaité (avec son accord) remettre en ligne ce dernier pour que son contenu reste accessible.&lt;/p&gt;&#10;&lt;p&gt;Cet article est adressé principalement aux administrateurs système, ou devrais-je plutôt dire aux administrateurs &lt;strong&gt;de&lt;/strong&gt; système puisque parmi vous il y a non seulement des personnes qui en ont fait leur métier, et d&amp;rsquo;autres personnes qui en font leur passion (comme moi, peut-être&amp;hellip;). Par manque de temps et surtout parce que je parlerai des outils sur lesquels j&amp;rsquo;ai mis la main, j&amp;rsquo;utiliserai un seul serveur web au cours de cet article, le bien connu &lt;code&gt;nginx&lt;/code&gt;. Cet article reprendra en partie un ancien article de mon précédent blog : &lt;a class="link" href="https://raw.githubusercontent.com/Wonderfall/wonderfall.xyz/master/Des%20certificats%20ECDSA%20avec%20Let%27s%20Encrypt.md" target="_blank" rel="noopener"&#13;&#10; &gt;&lt;em&gt;Des certificats ECDSA avec Let&amp;rsquo;s Encrypt&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="1-mettons-les-choses-en-ordre"&gt;1. Mettons les choses en ordre&amp;hellip;&#13;&#10;&lt;/h2&gt;&lt;p&gt;Jetez un coup d&amp;rsquo;oeil à l&amp;rsquo;image d&amp;rsquo;en-tête de l&amp;rsquo;article. Vous vous y reconnaitrez peut-être. Ou peut-être pas. Certains parmi vous sont complètement perdus, et ces noms ne leurs évoqueront rien. D&amp;rsquo;autres sont déjà à l&amp;rsquo;aise, savent &lt;strong&gt;grossièrement&lt;/strong&gt; à quoi cela correspond. Eh bien, j&amp;rsquo;en fais moi-même partie. Dans un esprit d&amp;rsquo;humilité, je reconnais ne pas avoir les capacités nécessaires pour comprendre à 100% les notions conceptuelles, mathématiques, et toutes les subtilités derrière les technologies que je mentionnerai. Cela dit, ça ne m&amp;rsquo;empêchera pas de tenter, au moins, de vulgariser et de montrer des exemples. Ma vulgarisation sera approximative, elle comportera peut-être des erreurs, je l&amp;rsquo;admets. Mais tant que j&amp;rsquo;estime ne pas mettre en danger la sécurité des personnes (au contraire&amp;hellip;), et tant que vous avez compris ce que je voulais dire dans ce paragraphe, je me sens libre de continuer à écrire cet article.&lt;/p&gt;&#10;&lt;p&gt;Ce qui m&amp;rsquo;a poussé à le faire, c&amp;rsquo;est que le nombre de demandes d&amp;rsquo;aide à propos de la configuration HTTPS est devenu croissant. &lt;a class="link" href="https://psychedeli.cat/mastodon/" target="_blank" rel="noopener"&#13;&#10; &gt;Vous vous souvenez de Mastodon ?&lt;/a&gt; Aujourd&amp;rsquo;hui le nombre d&amp;rsquo;instances est bien plus important, et plus d&amp;rsquo;instances, ça veut dire aussi plus de configurations. Le &lt;a class="link" href="https://instances.mastodon.xyz/list" target="_blank" rel="noopener"&#13;&#10; &gt;principal site&lt;/a&gt; qui recense les différentes instances classe désormais les instances en fonction de leur configuration HTTPS, à travers &lt;a class="link" href="https://tls.imirhil.fr/" target="_blank" rel="noopener"&#13;&#10; &gt;Cryptcheck&lt;/a&gt; et depuis peu l&amp;rsquo;&lt;a class="link" href="https://observatory.mozilla.org/" target="_blank" rel="noopener"&#13;&#10; &gt;Observatoire Mozilla&lt;/a&gt; (qui comprend Cryptcheck également puisqu&amp;rsquo;il fait appel à des tests tiers). Évidemment, c&amp;rsquo;est la folie : tout le monde veut absolument avoir son instance le plus haut possible dans la liste, donc il faut à tout prix mieux sécuriser&amp;hellip; si seulement c&amp;rsquo;était le cas pour les banques aussi, mais passons.&lt;/p&gt;&#10;&lt;p&gt;Et puis, certains iraient bien se masturber un coup sur un A+ de Cryptcheck/Qualys. Mais, pourquoi pas ? Ces questions ne me concernent pas. On atteindra cette finalité si c&amp;rsquo;est ce que vous voulez, vos motivations sont les vôtres. Quand je parle d&amp;rsquo;une excellente configuration, c&amp;rsquo;est effectivement une configuration qui vous donnera une note maximale sur ces outils. Dans le titre, &lt;strong&gt;je n&amp;rsquo;ai pas parlé de &amp;ldquo;comment configurer HTTPS&amp;rdquo;&lt;/strong&gt;, nuance. Mais il ne faut pas non plus suivre mon tutoriel n&amp;rsquo;importe comment, parce que premièrement, la compatibilité des clients en prend forcément un coup, et deuxièmement, certains mécanismes tels que HPKP peuvent vous casser la gueule si vous les utilisez n&amp;rsquo;importe comment. Lisez, puis faites. Pas l&amp;rsquo;inverse&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;D&amp;rsquo;avance, j&amp;rsquo;annonce que je ne me prendrai pas la tête avec la compatibilité. Donc ne venez pas me dire que votre site ne fonctionne pas sur X ou Y, parce que je vous aurais prévenu.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="2-choix-de-la-bibliothèque-ssltls"&gt;2. Choix de la bibliothèque SSL/TLS&#13;&#10;&lt;/h2&gt;&lt;p&gt;Les bibliothèques SSL/TLS fournissent une implémentation d&amp;rsquo;algorithmes cryptographiques et de protocoles de communication sécurisés (les différentes versions de SSL et TLS : SSLv2, SSLv3, TLS 1.0, TLS 1.1, TLS 1.2, TLS 1.3..). Aujourd&amp;rsquo;hui, 3 bibliothèques sont compatibles avec &lt;code&gt;nginx&lt;/code&gt; :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;OpenSSL&lt;/strong&gt; : la plus connue, et la plus présente.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LibreSSL&lt;/strong&gt; : fork d&amp;rsquo;OpenSSL par OpenBSD.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;BoringSSL&lt;/strong&gt; : fork d&amp;rsquo;OpenSSL par Google.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Il faut dire que &lt;a class="link" href="http://heartbleed.com/" target="_blank" rel="noopener"&#13;&#10; &gt;Heartbleed&lt;/a&gt; a porté en 2014 un coup à la popularité d&amp;rsquo;OpenSSL. Non pas que ce fut la première faille découverte, loin de là, mais il y a eu une prise de conscience sur la qualité du code d&amp;rsquo;OpenSSL et des implémentations trop anciennes qui y sont présentes. OpenBSD fidèle à sa réputation, créa son fork LibreSSL dans le but de littéralement nettoyer OpenSSL et de le débarrasser d&amp;rsquo;algorithmes dépassés et dangereux d&amp;rsquo;utilisation. Aujourd&amp;rsquo;hui, il n&amp;rsquo;y a pas seulement OpenBSD qui utilise LibreSSL à la place d&amp;rsquo;OpenSSL en tant que bibliothèque par défaut du système. En effet, d&amp;rsquo;autres distributions ont sauté le pas, y compris macOS.&lt;/p&gt;&#10;&lt;p&gt;Quant à Google, ce n&amp;rsquo;est pas vraiment la même raison qui a conduit à créer BoringSSL. En effet, ils maintenaient déjà une version d&amp;rsquo;OpenSSL interne avec de nombreux patchs, Heartbleed a seulement été l&amp;rsquo;élément déclencheur pour repartir d&amp;rsquo;une page blanche, et c&amp;rsquo;est bien ce travail qui a été mené. Peu importe si les mises à jour cassent la compatibilité API/ABI avec d&amp;rsquo;autres logiciels comme &lt;code&gt;nginx&lt;/code&gt;, Google met de toute façon en garde :&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;EN : Although BoringSSL is an open source project, it is not intended for general use, as OpenSSL is. We don&amp;rsquo;t recommend that third parties depend upon it. Doing so is likely to be frustrating because there are no guarantees of API or ABI stability.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;FR : Bien que BoringSSL soit un projet open-source, il n&amp;rsquo;est pas destiné à un usage général, comme OpenSSL l&amp;rsquo;est. Nous ne recommandons pas que les tierces parties dépendent dessus. Faire ainsi sera probablement source de frustrations puisqu&amp;rsquo;il n&amp;rsquo;y aucune garantie de la stabilité de l&amp;rsquo;API/ABI.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;En pratique, BoringSSL fonctionne avec nginx et les développeurs ont accepté de faire quelques efforts pour satisfaire les quelques curieux qui souhaitent l&amp;rsquo;utiliser de cette façon. En revanche, &lt;strong&gt;pas de support de OCSP stapling&lt;/strong&gt;.&lt;/p&gt;&#10;&#13;&#10; &lt;blockquote&gt;&#13;&#10; &lt;p&gt;En pratique, qu&amp;rsquo;est-ce que je dois choisir ?&lt;/p&gt;&#10;&#13;&#10; &lt;/blockquote&gt;&#13;&#10;&lt;p&gt;Utiliser la bibliothèque de son système est une bonne chose car les mises à jour sont simples, donc il n&amp;rsquo;est pas nécessaire de recompiler nginx à chaque fois. Sur Debian, ça reste pour le moment OpenSSL. La version de Jessie est maintenue, mais elle est figée du point de vue technologique, donc en pratique, on aura pas quelques algorithmes récents (même si on peut s&amp;rsquo;en passer) et quelques features intéressantes compatibles avec nginx, mais nécessitant une version d&amp;rsquo;OpenSSL supérieure. La version d&amp;rsquo;OpenSSL fournie par Stretch (1.1.0) est aujourd&amp;rsquo;hui la version la plus récente d&amp;rsquo;OpenSSL.&lt;/p&gt;&#10;&lt;p&gt;Si vous êtes prêts à ne pas utiliser une bibliothèque système, je vous recommande sans hésiter &lt;strong&gt;LibreSSL&lt;/strong&gt;, pour les raisons que j&amp;rsquo;ai énoncées plus haut. OpenBSD est une équipe de confiance, vraiment (et même un peu trop) perfectionniste. BoringSSL est celui qui vous proposera le plus de nouveautés, dont l&amp;rsquo;utilisation des versions drafts de TLS 1.3, des expérimentations d&amp;rsquo;algorithmes &lt;em&gt;quantum proofs&lt;/em&gt; qui peuvent être retirées du jour au lendemain par Google (comme &lt;a class="link" href="https://www.imperialviolet.org/2016/11/28/cecpq1.html" target="_blank" rel="noopener"&#13;&#10; &gt;CECPQ1&lt;/a&gt;), etc. mais de mon point de vue, ce n&amp;rsquo;est vraiment pas quelque chose à utiliser sur une machine en production, il n&amp;rsquo;y a même pas de versioning, à utiliser plus pour la curiosité donc.&lt;/p&gt;&#10;&lt;p&gt;Si vous avez fait le choix d&amp;rsquo;utiliser une autre bibliothèque que la bibliothèque utilisée par défaut par le système, vous allez devoir recompiler nginx. Inutile que je passe mon temps à faire un tutoriel, il y en a&amp;hellip; plein : &lt;a class="link" href="https://mondedie.fr/d/7621-Tuto-Compiler-la-derniere-version-de-nginx-avec-LibreSSL" target="_blank" rel="noopener"&#13;&#10; &gt;ici (2015)&lt;/a&gt; pour LibreSSL, &lt;a class="link" href="https://raw.githubusercontent.com/Wonderfall/wonderfall.xyz/master/Compiler%20nginx%20avec%20BoringSSL.md" target="_blank" rel="noopener"&#13;&#10; &gt;là (2016)&lt;/a&gt; pour BoringSSL (je me fais un peu de publicité, je sais). Mais si vous ne voulez pas vous prendre la tête, je vous propose des scripts voire des images Docker :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/Angristan/nginx-autoinstall" target="_blank" rel="noopener"&#13;&#10; &gt;Angristan/nginx-autoinstall&lt;/a&gt; : compile nginx sur Debian, avec le choix entre OpenSSL et LibreSSL et d&amp;rsquo;autres modules !&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://hub.docker.com/r/wonderfall/boring-nginx/" target="_blank" rel="noopener"&#13;&#10; &gt;wonderfall/boring-nginx&lt;/a&gt; : une image Docker basée sur Alpine Linux, avec nginx compilé depuis les sources avec BoringSSL.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://hub.docker.com/r/xataz/nginx/" target="_blank" rel="noopener"&#13;&#10; &gt;xataz/nginx&lt;/a&gt; : une image Docker basée sur Alpine Linux qui installe simplement nginx, mais Alpine Linux utilise LibreSSL par défaut.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/ajhaydock/BoringNginx" target="_blank" rel="noopener"&#13;&#10; &gt;ajhaydock/BoringNginx&lt;/a&gt; : des scripts pour Debian/CentOS et une image Docker basée sur CentOS pour utiliser nginx avec BoringSSL.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="3-dabord-les-certificats-"&gt;3. D&amp;rsquo;abord, les certificats !&#13;&#10;&lt;/h2&gt;&lt;h3 id="a-savoir-un-peu-de-quoi-on-parle"&gt;a. Savoir (un peu) de quoi on parle&#13;&#10;&lt;/h3&gt;&lt;p&gt;Inutile de s&amp;rsquo;attaquer à la configuration d&amp;rsquo;HTTPS sans passer par la génération de certificats. Mais d&amp;rsquo;abord, pourquoi parle-t-on de certificats ? Deux mots pour décrire les buts d&amp;rsquo;HTTPS : &lt;strong&gt;chiffrement&lt;/strong&gt; et &lt;strong&gt;authenticité&lt;/strong&gt;. Ce dernier point repose sur la certification de la clé publique avec un certificat (d&amp;rsquo;un certain format nommé X.509) signé par une autorité connue (CA pour Certificate Authority). L&amp;rsquo;ensemble des composantes visant à gérer le cycle de vie des certificats porte le nom de &lt;em&gt;Public Key Infrastructure&lt;/em&gt; (PKI). Les certificats définissent les informations d&amp;rsquo;appartenance de la clé publique, et définissent également les &lt;em&gt;hostnames&lt;/em&gt; pour lesquels le certificat est valide. Par exemple, le certificat que j&amp;rsquo;utilise pour psychedeli.cat est aussi valable pour isso.psychedeli.cat (un sous-domaine). Ces informations, vous pouvez les obtenir très simplement depuis votre navigateur qui lit ces informations depuis le certificat fourni par le serveur web.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="LE" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2017/10/Screenshot_158.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Voyez l&amp;rsquo;illustration comme un arbre, on part de la racine (= root), on passe par les branches ramifiées (certificats intermédiaires) et enfin on atteint les feuilles (= leaf)&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Nous allons ici utiliser Let&amp;rsquo;s Encrypt, qui est comme je vous l&amp;rsquo;ai dit une autorité de certification. Le principe est celui d&amp;rsquo;une chaîne de confiance : le certificat root (fourni ici par ISRG) est le certificat originel, qui peut signer des certificats intermédiaires (ceux de Let&amp;rsquo;s Encrypt). Ces certificats intermédiaires permettront de signer les certificats que nous utilisons tous les jours, qu&amp;rsquo;on appelle aussi &lt;em&gt;leaf certificate&lt;/em&gt;, ils permettront de signer des clés temporaires dérivées de la paire clé publique/privée qui sera utilisée pour sécuriser une session. Ces certificats sont en fin de chaîne et ce sont eux que nous allons obtenir.&lt;/p&gt;&#10;&lt;h3 id="b-générer-des-certificats-ecdsa-p-384"&gt;b. Générer des certificats ECDSA (P-384)&#13;&#10;&lt;/h3&gt;&lt;p&gt;Plus précisément, on va le faire d&amp;rsquo;une façon un peu plus manuelle mais loin d&amp;rsquo;être difficile. Cela nous permettra :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;De gérer nous-même le renouvellement de la paire de clés, ce qui nous permet d&amp;rsquo;utiliser plus sereinement et efficacement HPKP.&lt;/li&gt;&#10;&lt;li&gt;D&amp;rsquo;utiliser une autre approche d&amp;rsquo;algorithme asymétrique que RSA, ECDSA qui repose donc sur la cryptographie sur les courbes elliptiques (ECC).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Les algorithmes de la famille des courbes elliptiques proposent d&amp;rsquo;utiliser des clés bien plus courtes, pour une sécurité comparable à celle offerte par RSA, et ils permettent également d&amp;rsquo;économiser des ressources. Voici des tests de performance que j&amp;rsquo;ai réalisés avec ma machine :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openssl speed rsa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sign verify sign/s verify/s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rsa &lt;span class="m"&gt;2048&lt;/span&gt; bits 0.000549s 0.000025s 1821.4 39636.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rsa &lt;span class="m"&gt;3072&lt;/span&gt; bits 0.002579s 0.000051s 387.7 19471.4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rsa &lt;span class="m"&gt;4096&lt;/span&gt; bits 0.005829s 0.000089s 171.5 11270.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openssl speed ecdsa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sign verify sign/s verify/s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;256&lt;/span&gt; bit ecdsa &lt;span class="o"&gt;(&lt;/span&gt;nistp256&lt;span class="o"&gt;)&lt;/span&gt; 0.0000s 0.0001s 25425.7 10819.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;384&lt;/span&gt; bit ecdsa &lt;span class="o"&gt;(&lt;/span&gt;nistp384&lt;span class="o"&gt;)&lt;/span&gt; 0.0002s 0.0007s 5749.2 1340.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;521&lt;/span&gt; bit ecdsa &lt;span class="o"&gt;(&lt;/span&gt;nistp521&lt;span class="o"&gt;)&lt;/span&gt; 0.0003s 0.0006s 3007.0 1659.5&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ECDSA en soit n&amp;rsquo;est pas directement comparable à RSA, il doit être associé à des courbes elliptiques, et ici, ce sont les courbes NIST P-256, P-384, et P-521, qui sont utilisées. Le nombre de signatures/secondes est tout simplement bien meilleur avec ECDSA. Quid de la sécurité ? Selon la NSA elle-même, une clé ECC de taille 384 bits offrirait une sécurité équivalente à une clé RSA de taille 7680 bits.&lt;/p&gt;&#10;&lt;p&gt;Depuis Février 2016, Let&amp;rsquo;s Encrypt peut émettre des certificats ECDSA (les choix sont P-256 et P-384). Malheureusement, le client officiel certbot ne le permet pas. Alors soit on peut utiliser d&amp;rsquo;autres clients comme lego qui vont mâcher le travail, soit on peut toujours utiliser certbot mais se débrouiller nous-même pour générer notre clé privée et notre demande de signature de certificat (dans un fichier CSR).&lt;/p&gt;&#10;&lt;p&gt;Commençons par générer une clé privée P-384 :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl ecparam -genkey -name secp384r1 &amp;gt; privkey.pem&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut maintenant créer un &lt;strong&gt;fichier CSR&lt;/strong&gt;, qui contient toutes les informations relatives à une demande de certificat. Comme moi, vous aurez peut-être envie de générer un seul certificat pour plusieurs domaines, ceci peut se faire avec l&amp;rsquo;extension SAN de X.509. Vous devez tout d&amp;rsquo;abord copier le fichier &lt;code&gt;/etc/ssl/openssl.cnf&lt;/code&gt; dans votre répertoire de travail. Par exemple :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /etc/ssl/openssl.cnf custom.cnf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On va modifier ce &lt;code&gt;custom.cnf&lt;/code&gt; pour bénéficier de SAN et donc d&amp;rsquo;un certificat valable, en gros, pour plusieurs domaines. Voici comment. Dans la section &lt;code&gt;[ req ]&lt;/code&gt;, décommettez &lt;code&gt;req_extensions = v3_req&lt;/code&gt;. Dans la section &lt;code&gt;[ v3_req ]&lt;/code&gt;, ajoutez une nouvelle ligne : &lt;code&gt;subjectAltName = @alt_names&lt;/code&gt;. Enfin, tout se passe dans &lt;code&gt;[ alt_names ]&lt;/code&gt; pour ajouter vos domaines. Cette section n&amp;rsquo;existe pas, il faut la créer, par exemple tout à la fin du fichier.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# custom.cnf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ req ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;req_extensions = v3_req&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ v3_req ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subjectAltName = @alt_names&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;### OCSP Must-Staple, cf. plus loin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#tlsfeature = status_request # OpenSSL &amp;gt;=1.1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#1.3.6.1.5.5.7.1.24 = DER:30:03:02:01:05 # OpenSSL &amp;lt;=1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ alt_names ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DNS.1 = domain.tld&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DNS.2 = sub1.domain.tld&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DNS.3 = sub2.domain.tld&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DNS.n = subn.domain.tld&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour chaque domaine souhaité, on l&amp;rsquo;associe à la directive &lt;code&gt;DNS.k&lt;/code&gt; où &lt;code&gt;k&lt;/code&gt;, allant de &lt;code&gt;1&lt;/code&gt; à &lt;code&gt;n&lt;/code&gt;, est incrémenté sur chaque nouvelle ligne. Le &lt;a class="link" href="https://en.wikipedia.org/wiki/SubjectAltName" target="_blank" rel="noopener"&#13;&#10; &gt;SAN&lt;/a&gt; que peut signer Let&amp;rsquo;s Encrypt peut atteindre 100 (autrement dit, 100 domaines différents dans un seul certificat X.509), donc &lt;code&gt;n &amp;lt;= 100&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Enregistrez toutes ces modifications. Vous pouvez désormais générer votre CSR avec la commande suivante :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -new -sha256 -key privkey.pem -out csr.der -config custom.cnf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Rentrez des informations, mais laissez &lt;em&gt;Common Name&lt;/em&gt; vide, et ne protégez pas avec un mot de passe. Vous devez, à ce stade, avoir en votre possession un &lt;code&gt;privkey.pem&lt;/code&gt; et un &lt;code&gt;csr.der&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Pour demander à Let&amp;rsquo;s Encrypt de nous émettre un certificat à partir de notre demande, il suffit d&amp;rsquo;utiliser &lt;code&gt;certbot&lt;/code&gt; de cette façon, avec l&amp;rsquo;argument &lt;code&gt;--csr&lt;/code&gt; pour fournir le CSR :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;certbot certonly --standalone --agree-tos -m admin@domain.tld &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --csr /path/to/csr.der &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cert-path /path/to/cert.pem &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --chain-path /path/to/chain.pem &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --fullchain-path /path/to/fullchain.pem&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Congrats!&lt;/em&gt; Vous avez ainsi obtenu :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;cert.pem&lt;/strong&gt; : leaf certificate, contient entre autres la clé publique&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;chain.pem&lt;/strong&gt; : certificat de la chaîne Let&amp;rsquo;s Encrypt&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;fullchain.pem&lt;/strong&gt; : concaténation des deux fichiers ci-dessus&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;privkey.pem&lt;/strong&gt; : clé privée qu&amp;rsquo;on avait générée tout à l&amp;rsquo;heure&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;DNS CAA&lt;/strong&gt; : N&amp;rsquo;oubliez pas d&amp;rsquo;ajouter des &lt;strong&gt;enregistrements CAA&lt;/strong&gt; dans votre zone DNS, ils permettent de définir quel CA est autorisé à émettre un certificat pour le domaine &lt;code&gt;domain.tld&lt;/code&gt;. Exemple pour ce domaine avec Let&amp;rsquo;s Encrypt :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dns" data-lang="dns"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="py"&gt;domain.tld. &lt;/span&gt;&lt;span class="k"&gt;CAA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;issue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nc"&gt;letsencrypt.org&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="py"&gt;domain.tld. &lt;/span&gt;&lt;span class="k"&gt;CAA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;iodef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;mailto:admin@&lt;/span&gt;&lt;span class="nc"&gt;domain.tld&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4-le-protocole-ssltls"&gt;4. Le protocole SSL/TLS&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Je vous recommande la lecture de cet article : &lt;a class="link" href="https://blog.imirhil.fr/2015/09/02/cryptcheck-verifiez-implementations-tls.html" target="_blank" rel="noopener"&#13;&#10; &gt;CryptCheck, vérifiez vos implémentations de TLS&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;TLS et son &lt;strong&gt;ancêtre SSL&lt;/strong&gt; sont des protocoles qui sont utilisés pour sécuriser des échanges sur Internet. Par exemple conjointement avec HTTP pour donner HTTPS, le joli cadenas vert que vous avez dans votre barre d&amp;rsquo;adresse et qui ne veut pas dire grand chose parfois. Ils sont utilisés pour l&amp;rsquo;intégrité, l&amp;rsquo;authentification, la confidentialité (chiffrement), etc.&lt;/p&gt;&#10;&lt;p&gt;Aujourd&amp;rsquo;hui, la compatibilité de TLS 1.2 est répandue et il s&amp;rsquo;agit de la dernière version datant de 2008. TLS 1.0 (quoique&amp;hellip;) et 1.1 peuvent être activés en cas de besoin de compatibilité. Pour cet article je ne vais garder que TLS 1.2. Il est par contre hors de question d&amp;rsquo;utiliser SSL. SSLv3 c&amp;rsquo;est poubelle (POODLE), SSLv2 c&amp;rsquo;est poubelle aussi (DROWN). D&amp;rsquo;ailleurs j&amp;rsquo;en profite : arrêtez de véhiculer cet abus de langage comme quoi SSL/TLS = SSL. J&amp;rsquo;aurais d&amp;rsquo;ailleurs trouvé ça appréciable si LibreSSL s&amp;rsquo;appelait plutôt LibreTLS, bref.&lt;/p&gt;&#10;&lt;p&gt;Donc on configure nginx pour n&amp;rsquo;accepter que TLS 1.2 :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssl_protocols TLSv1.2;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TLS 1.3 arrivera incessamment sous peu, à l&amp;rsquo;heure où j&amp;rsquo;écrit cet article la 19e &lt;em&gt;draft&lt;/em&gt; est encore très récente. OpenSSL 1.1.0 aura droit à TLS 1.3, tout comme LibreSSL qui devrait suivre. BoringSSL propose déjà TLS 1.3, j&amp;rsquo;ai testé et ça fonctionne même s&amp;rsquo;il faut l&amp;rsquo;activer de force. Cela dit je ne peux pas vraiment recommander d&amp;rsquo;utiliser un protocole au stade de brouillon et dont l&amp;rsquo;implémentation est encore trop jeune.&lt;/p&gt;&#10;&lt;p&gt;Histoire de faire une transition avec la partie suivante : avec TLS, tout commence par un &lt;em&gt;handshake&lt;/em&gt; entre le client et le serveur. Le client envoie au serveur un message &lt;em&gt;ClientHello&lt;/em&gt; avec une liste de suites cryptographiques supportées et de protocoles (par exemple pour HTTP/2). Le serveur renvoie à son tour un &lt;em&gt;ServerHello&lt;/em&gt; avec entre autres, le choix de la suite cryptographique pour la session.&lt;/p&gt;&#10;&lt;h2 id="5-la-suite-cryptographique"&gt;5. La suite cryptographique&#13;&#10;&lt;/h2&gt;&lt;p&gt;Vous auriez déjà dû entendre parler du terme &lt;em&gt;cipher&lt;/em&gt;. Cela désigne pour ceux qui ne le savent pas un algorithme qui chiffre et déchiffre, c&amp;rsquo;est une notion simple et cela existe depuis l&amp;rsquo;antiquité en fait, puisque ce sont les débuts même de la cryptographie. Mais avant que les 2 parties (ici, le serveur et le client) ne puissent chiffrer/déchiffrer leurs communications (par exemple du chiffrement par bloc avec un algorithme de cryptographie symétrique comme AES), il faut que les deux s&amp;rsquo;échangent une clé temporaire qui a été dérivée de la paire de clés du certificat, pour une session. Donc la question est de le faire d&amp;rsquo;une façon sécurisée à travers Internet, et éviter à tout prix les attaques &lt;em&gt;MiTM&lt;/em&gt;.&lt;/p&gt;&#10;&lt;h3 id="a-léchange-de-clés"&gt;a. L&amp;rsquo;échange de clés&#13;&#10;&lt;/h3&gt;&lt;p&gt;Pour cela, on préfère l&amp;rsquo;échange de clés Diffie-Hellman (DH) car il y a la propriété de &lt;strong&gt;confidentialité persistante&lt;/strong&gt; (Forward Secrecy FS ou Perfect Forward Secrecy PFS) : si la clé privée à partir de laquelle les clés de session ont été dérivés est compromise dans le futur, les clés de session utilisées précédemment pour des communications passées ne seront pas compromises. On pourrait en parler mathématiquement, mais là n&amp;rsquo;est pas vraiment le sujet, des personnes plus compétentes en parleront mieux que moi.&lt;/p&gt;&#10;&lt;p&gt;Avec TLS, on utilise &lt;strong&gt;DHE&lt;/strong&gt; (Diffie-Hellman Exchange) ou &lt;strong&gt;ECDHE&lt;/strong&gt; (Elliptic Curve Diffie-Hellman Exchange), ECDHE étant une variante de DHE. Sans rentrer dans les détails, la différence est dans la génération des clés : pour ce faire, DHE repose sur de l&amp;rsquo;algorithmique modulaire (simple), tandis que ECDHE repose sur le problème mathématique des courbes elliptiques (algébriques). Ces courbes (NIST, Brainpool, X25519&amp;hellip;) ont les bénéfices que nous avons en partie évoqué plus haut.&lt;/p&gt;&#10;&lt;p&gt;De mon côté, je vous recommande carrément de n&amp;rsquo;utiliser que ECDHE pour l&amp;rsquo;échange de clés. Si vous voulez continuer à utiliser DHE, générez au moins une bonne clé de taille 4096 bits. Souvenez-vous des conséquences d&amp;rsquo;une clé trop petite, je parle bien sûr de &lt;a class="link" href="https://weakdh.org/" target="_blank" rel="noopener"&#13;&#10; &gt;Logjam&lt;/a&gt;. DHE souffre également d&amp;rsquo;un autre problème qui consiste en une &lt;em&gt;MiTM&lt;/em&gt; assez violente : il est possible de downgrade vers une suite &lt;code&gt;EXPORT&lt;/code&gt; dès que le serveur la supporte, et même si le client ne la supporte pas (merci &lt;a class="link" href="https://social.imirhil.fr/@aeris" target="_blank" rel="noopener"&#13;&#10; &gt;@aeris&lt;/a&gt; pour cette remarque). &lt;strong&gt;Je persiste, utilisez donc seulement ECDHE&lt;/strong&gt;, c&amp;rsquo;est très bien et dans la continuité de cet article. Et il n&amp;rsquo;y a rien de plus simple pour nginx puisqu&amp;rsquo;il suffit de jouer avec la directive &lt;code&gt;ssl_ecdh_curve&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;On peut ne pas renseigner cette directive, c&amp;rsquo;est possible, et dans ce cas le client et le serveur se mettront d&amp;rsquo;accord comme des grands sur la courbe à utiliser. Avec des versions de nginx relativement récentes (1.11+) et OpenSSL 1.1.0+ / LibreSSL / BoringSSL, il est possible de définir, côté serveur, un ordre de préférence. De mon côté, je préfère le faire (et si vous ne pouvez pas préciser plusieurs courbes, ne pas renseigner la directive est plus sage, sinon vous pouvez utiliser P-384 seulement) :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_ecdh_curve&lt;/span&gt; &lt;span class="s"&gt;X25519:P-521:P-384&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ssl_ecdh_curve secp521r1:secp384r1; # Autres noms&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ssl_ecdh_curve secp384r1; # Si nginx pas récent&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Petite aparté sur X25519 : cette courbe elliptique est le fruit des recherches du Dr. Bernstein. Comme indiqué sur &lt;a class="link" href="https://safecurves.cr.yp.to/" target="_blank" rel="noopener"&#13;&#10; &gt;ce site&lt;/a&gt;, la sécurité offerte par les courbes NIST n&amp;rsquo;est pas parfaite et mathématiquement douteuse. X25519 est &amp;ldquo;meilleur&amp;rdquo;, et en plus, il ne vient pas d&amp;rsquo;une agence proche de la NSA qui a tout intérêt à rendre la cryptanalyse des courbes NIST plus avantageuse pour elle.&lt;/p&gt;&#10;&lt;p&gt;X25519 n&amp;rsquo;étant disponible que sur des versions récentes de Chromium, il faut accepter d&amp;rsquo;autres courbes pour supporter par exemple Firefox et d&amp;rsquo;autres plateformes : P-521 et P-384, c&amp;rsquo;est très bien aussi. Ajoutez P-256 si la compatibilité est vraiment un problème.&lt;/p&gt;&#10;&lt;h3 id="b-le-chiffrement-des-données"&gt;b. Le chiffrement des données&#13;&#10;&lt;/h3&gt;&lt;p&gt;Maintenant que la clé temporaire de session a été communiquée de façon sécurisée grâce à ECDH au client, ce dernier et le serveur peuvent échanger dans un canal chiffré dans une configuration symétrique, d&amp;rsquo;où l&amp;rsquo;utilisation d&amp;rsquo;algorithmes symétriques comme AES. C&amp;rsquo;est aujourd&amp;rsquo;hui le plus éprouvé. RC4, DES, 3DES&amp;hellip; &lt;strong&gt;sont à bannir&lt;/strong&gt;. Des chatons meurent à chaque fois que ces algorithmes sont utilisées. En 2017, on utilise normalement AES.&lt;/p&gt;&#10;&lt;p&gt;AES faisant du chiffrement par bloc, on introduit deux notions :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Le mode d&amp;rsquo;opération des blocs : CCM, CBC, GCM&amp;hellip;&lt;/li&gt;&#10;&lt;li&gt;La taille des clés utilisées : 128, 256&amp;hellip;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;TLS 1.2 standardise notamment des suites cryptographiques qui reposent sur AES-CBC et AES-GCM, avec des clés 128 et 256 bits. Le mode GCM est nettement préférable à CBC. Pourquoi ? Dans le mode CBC, on utilise la fonction XOR (disjonction exclusive) avec un bloc de données en clair et un vecteur d&amp;rsquo;initialisation (IV), ensuite la sortie de XOR est chiffrée avec notre clé symétrique. Le mode GCM diffère de par son fonctionnement : un compteur pour chaque bloc est chiffré par la clé symétrique (dans le Corps de Galois), puis on utilise la fonction XOR avec la sortie obtenue et le bloc de données en clair : le bloc chiffré est formé ainsi. Pour ne pas aller plus loin dans les détails même si ce sont de grands mots qui peuvent faire peur, le fonctionnement inhérent de GCM est plus sécurisé que celui de CBC. Il est aussi très rapide. CBC est vulnérable aux attaques &lt;em&gt;padding oracle&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;Ne faites pas une erreur tentante : Qualys ne vous mettra pas du 100/100 partout si vous avez le malheur d&amp;rsquo;utiliser AES avec une clé 128 bits, même AES GCM. Donc certains vont forcer AES avec une clé 256 bits, mode GCM et CBC, parce que AES-256-GCM n&amp;rsquo;est pas forcément très bien supporté partout encore. C&amp;rsquo;est une fausse bonne idée ! AES-128-GCM est très bien, et quoiqu&amp;rsquo;il arrive, il faut privilégier GCM à CBC. C&amp;rsquo;est le comportement de la suite &lt;code&gt;EECDH+AES&lt;/code&gt; par défaut, inutile d&amp;rsquo;en préciser plus. Pour utiliser GCM seulement, ce que je fais, vous pouvez utiliser &lt;code&gt;EECDH+AESGCM&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;ChaCha20 est un autre algorithme symétrique, qui a un fonctionnement intrinsèquement différent puisqu&amp;rsquo;il fonctionne par flot et non par blocs (comme RC4). C&amp;rsquo;est une alternative à AES proposée par le Dr. Bernstein encore une fois. Bien que la cryptanalyse faite sur ChaCha20 ne soit pas aussi importante qu&amp;rsquo;avec AES, on le considère comme sûr, et de toute façon, avoir une alternative est toujours une bonne chose (et le monopole cryptographique n&amp;rsquo;étant pas idéal de toute façon&amp;hellip;). Il est moins rapide que AES sur des CPU qui disposent des instructions AES-NI, c&amp;rsquo;est-à-dire presque tous les CPU x86_64 actuels si je ne me trompe pas. Mais ChaCha20 offre des performances remarquables et se défend bien, si bien qu&amp;rsquo;il est préféré à AES quand on est sur des SoC ARM par exemple.&lt;/p&gt;&#10;&lt;p&gt;ChaCha20 est combiné à Poly1305, un type de code d&amp;rsquo;authentification de message (MAC) assurant l&amp;rsquo;intégrité des données, alors qu&amp;rsquo;on combine AES-GCM à HMAC-SHA2 par exemple. La qualité du HMAC dépendant de la fonction de hashage utilisée, je préfère ne pas utiliser SHA1 (et il est hors de question d&amp;rsquo;utiliser MD5), mais s&amp;rsquo;en séparer convient de faire une croix sur la compatibilité avec certains clients encore une fois. Pour continuer l&amp;rsquo;analogie entre ChaCha20 et AES, est-ce que Poly1305 est mieux que HMAC-SHA2 ? C&amp;rsquo;est différent, et c&amp;rsquo;est bien d&amp;rsquo;avoir le choix. Il y a certainement des subtilités qui feront pencher les cryptographes d&amp;rsquo;un côté plus que l&amp;rsquo;autre&amp;hellip; De mon côté, je préfère même mettre ChaCha20+Poly1305 en tête de liste parce que je préfère Docteur Bernstein. Mais il ne faut pas basher AES non plus : bien qu&amp;rsquo;il ait vu le jour lors du concours NIST au début des années 2000, les critères autour de sa création sont rigoureusement transparents. Tout ce dont on peut être sûr c&amp;rsquo;est que la NSA par exemple a eu le temps de faire sa cryptanalyse.&lt;/p&gt;&#10;&lt;p&gt;Donc la configuration que je propose est la suivante :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;EECDH+CHACHA20:EECDH+AESGCM&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restrictive, certes. Mais il ne devrait pas y avoir de soucis avec des clients modernes. Chrome et Firefox supportent déjà ChaCha20+Poly1305. AES-GCM fera l&amp;rsquo;affaire pour Edge, Safari (jusqu&amp;rsquo;à la version incluse dans Yosemite, mais n&amp;rsquo;oubliez pas que Mavericks a le droit à des updates majeures de Safari par exemple), et Android jusqu&amp;rsquo;à KitKat.&lt;/p&gt;&#10;&lt;p&gt;Bonus si vous utilisez BoringSSL : vous pouvez définir des groupes de suites cryptographiques équivalentes. Au sein d&amp;rsquo;un même groupe, vous laissez le client choisir selon son ordre à lui. Cela peut-être utile si vous voulez utiliser AES sur votre PC, mais ChaCha20 sur votre smartphone ARM, par exemple. Le groupe est défini entre crochets &lt;code&gt;[]&lt;/code&gt; et avec une barre verticale &lt;em&gt;pipe&lt;/em&gt; &lt;code&gt;|&lt;/code&gt; entre chaque ciphersuite, ça donnerait ceci :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;[EECDH+CHACHA20|EECDH+AESGCM]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="6-http-strict-transport-security"&gt;6. HTTP Strict Transport Security&#13;&#10;&lt;/h2&gt;&lt;p&gt;HSTS est un mécanisme de sécurité qui consiste à indiquer par un header envoyé au client qu&amp;rsquo;il doit communiquer, pour un domaine donné, avec le serveur web par une connexion sécurisée HTTPS uniquement. L&amp;rsquo;intérêt est évident, car &lt;strong&gt;si&lt;/strong&gt; HSTS est actif, le client est protégé de diverses attaques réseau et d&amp;rsquo;une &lt;em&gt;MiTM&lt;/em&gt;. Mais je n&amp;rsquo;ai pas mis le précédent &amp;ldquo;si&amp;rdquo; en gras pour rien, en effet si HSTS n&amp;rsquo;a jamais été actif ou ne l&amp;rsquo;est plus, HSTS ne peut plus plus offrir cette sécurité. C&amp;rsquo;est pour cela qu&amp;rsquo;a été inventé le mécanisme de &lt;strong&gt;HSTS Preloading&lt;/strong&gt;, qui consiste en des listes préchargées et intégrées aux navigateurs pour indiquer la politique HSTS utilisée pour un domaine ; en quelque sorte, HSTS est déjà actif avant même que vous n&amp;rsquo;ayez visité le site.&lt;/p&gt;&#10;&lt;p&gt;Pour utiliser HSTS, il faut utiliser :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Le header &lt;code&gt;Strict-Transport-Security&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;max-age&lt;/code&gt; : durée d&amp;rsquo;activité une fois actif &lt;em&gt;(recommandé : 6 mois+)&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;includeSubDomains&lt;/code&gt; : protéger tous les sous-domaines.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;preload&lt;/code&gt; : activer HSTS preloading.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;De mon côté, je vais mettre &lt;code&gt;max-age&lt;/code&gt; à 1 an soit 31536000 secondes. J&amp;rsquo;activerai HSTS preloading, et j&amp;rsquo;indiquerai de protéger tous les sous-domaines, soyez sûr que vous souhaitez faire de même :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Strict-Transport-Security&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;max-age=31536000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;includeSubDomains&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;preload&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour s&amp;rsquo;inscrire à la liste préchargée, il faut aller inscrire son domaine &lt;a class="link" href="https://hstspreload.org/" target="_blank" rel="noopener"&#13;&#10; &gt;ici&lt;/a&gt;. La propagation peut prendre plusieurs semaines. Attention, HSTS Preload n&amp;rsquo;est pas là pour remplacer la redirection 301 vers HTTPS depuis HTTP.&lt;/p&gt;&#10;&lt;h2 id="7-ocsp-stapling-et-ocsp-must-staple"&gt;7. OCSP Stapling et OCSP Must-Staple&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;OCSP Stapling&lt;/em&gt; est une alternative au protocole &lt;em&gt;OCSP&lt;/em&gt; qui consiste à vérifier auprès de l&amp;rsquo;autorité de certification la validité du certificat. Avec &lt;em&gt;OCSP&lt;/em&gt;, c&amp;rsquo;est le client lui-même qui fait cette démarche de vérification auprès du CA ; tandis qu&amp;rsquo;avec &lt;em&gt;OCSP Stapling&lt;/em&gt;, c&amp;rsquo;est le serveur qui fait cette tâche et qui envoie la réponse OCSP au début de l&amp;rsquo;échange TLS. Bien que ce soit &lt;a class="link" href="https://www.imperialviolet.org/2014/04/19/revchecking.html" target="_blank" rel="noopener"&#13;&#10; &gt;discuté&lt;/a&gt; d&amp;rsquo;un point de vue sécurité, les gains apportés par &lt;em&gt;OCSP Stapling&lt;/em&gt; pour la vie privée sont non-négligeables, il est donc préférable de l&amp;rsquo;activer. Voyons comment cela se configure avec nginx, d&amp;rsquo;abord les paramètres &lt;em&gt;OCSP Stapling&lt;/em&gt; à proprement parler :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_stapling&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_stapling_verify&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resolver&lt;/span&gt; &lt;span class="n"&gt;213.133.98.98&lt;/span&gt; &lt;span class="n"&gt;213.133.99.99&lt;/span&gt; &lt;span class="s"&gt;valid=300s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resolver_timeout&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les deux premières lignes activeront &lt;em&gt;OCSP Stapling&lt;/em&gt;. Mais il faut fournir un résolveur DNS à &lt;em&gt;stapling&lt;/em&gt; pour qu&amp;rsquo;il puisse fonctionner. On peut fournir plusieurs IPs ou des FQDN pour pointer vers des résolveurs DNS, IPv4 et IPv6. Il faut également fournir à nginx le certificat de la chaîne Let&amp;rsquo;s Encrypt &lt;code&gt;chain.pem&lt;/code&gt; dans chaque configuration :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_trusted_certificate&lt;/span&gt; &lt;span class="s"&gt;/path/to/chain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois que c&amp;rsquo;est fait et nginx redémarré, vous pouvez tester vos paramètres &lt;em&gt;OCSP Stapling&lt;/em&gt; sur Qualys SSL. Si &lt;em&gt;OCSP Stapling&lt;/em&gt; s&amp;rsquo;affiche en vert avec &lt;em&gt;Yes&lt;/em&gt;, c&amp;rsquo;est que logiquement ça fonctionne bien.&lt;/p&gt;&#10;&lt;p&gt;Quant à &lt;em&gt;OCSP Must-Staple&lt;/em&gt;, imaginez tout simplement la même problématique qu&amp;rsquo;avec HSTS : au départ, le client n&amp;rsquo;a aucune idée si le serveur supporte HSTS, ou &lt;em&gt;OCSP Stapling&lt;/em&gt;. &lt;em&gt;OCSP Must-Staple&lt;/em&gt; est la solution pour &lt;em&gt;OCSP Stapling&lt;/em&gt; qui a été proposée pour résoudre ce problème. C&amp;rsquo;est une extension à activer dans le certificat, qui indique au client qu&amp;rsquo;il doit être livré en même temps qu&amp;rsquo;une réponse &lt;em&gt;OCSP&lt;/em&gt; du serveur, sinon c&amp;rsquo;est &lt;em&gt;niet&lt;/em&gt; (donc vérifiez bien, et régulièrement, que vos paramètres fonctionnent&amp;hellip;). Comment faire ? J&amp;rsquo;en ai déjà parlé plus haut, lors de la génération du certificat, quand vous modifiez &lt;code&gt;custom.cnf&lt;/code&gt; dans la section &lt;code&gt;[ v3_req ]&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Si vous êtes sur OpenSSL 1.1.0 ou supérieur :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tlsfeature = status_request&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si vous êtes sur OpenSSL 1.0 et inférieur (&lt;em&gt;moins sexy&lt;/em&gt;) :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1.3.6.1.5.5.7.1.24 = DER:30:03:02:01:05&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Encore une fois vous pouvez vérifier que le &lt;em&gt;flag&lt;/em&gt; est bien présent dans votre certificat après un petit tour sur Qualys SSL, ou en regardant les détails du certificat depuis votre navigateur.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Remarque&lt;/strong&gt; : Firefox est ici le bon élève puisqu&amp;rsquo;apparemment il supporte bien OCSP Must-Staple. Cependant il se peut que dès le démarrage du serveur web et lors de la première tentative de connexion, Firefox vous colle une belle erreur OCSP : c&amp;rsquo;est normal. En fait, il faut que nginx remplisse son cache OCSP, et c&amp;rsquo;est ce que vous avez fait lors de la première connexion. Une idée toute bête pour contourner ce problème est de faire un script qui va faire la connexion. Vous pouvez même l&amp;rsquo;ajouter dans une entrée &lt;em&gt;cron&lt;/em&gt; pour être sûr qu&amp;rsquo;il n&amp;rsquo;y ait aucun problème de ce genre sur le long terme.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Problème&lt;/strong&gt; : le cache OCSP ne se remplit pas automatiquement lors du démarrage d&amp;rsquo;nginx et il a besoin de se remplir de temps en temps. &amp;ldquo;Oui, et ?&amp;rdquo; me diriez-vous. Le problème c&amp;rsquo;est que quand le cache doit se remplir sur demande d&amp;rsquo;un client, le client balancera une erreur. Si on rafraîchit la page, hop, l&amp;rsquo;erreur part. C&amp;rsquo;est donc une limitation de OCSP stapling que l&amp;rsquo;on peut contourner avec un script (merci &lt;a class="link" href="https://soc.ialis.me/@href" target="_blank" rel="noopener"&#13;&#10; &gt;@href&lt;/a&gt; pour la piste) à mettre en cron où &lt;code&gt;$domain&lt;/code&gt; est le domaine concerné, voici un bout de code pour vous montrer :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/bin/echo &lt;span class="s2"&gt;&amp;#34;Q&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; /usr/bin/openssl s_client -connect &lt;span class="nv"&gt;$domain&lt;/span&gt;:443 -status &amp;gt; /dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;pm## 8. HTTP Public Key Pinning (HPKP)&#10;HPKP est un autre mécanisme de sécurité, basé sur un header HTTP, qui vise à faire mémoriser au client une liste sûre de clés. Si le CA est compromis et se met à faire de faux certificats pour votre domaine, HPKP s&amp;rsquo;il est bien configuré vous protégera d&amp;rsquo;une &lt;em&gt;MiTM&lt;/em&gt;. Vu qu&amp;rsquo;on utilise Let&amp;rsquo;s Encrypt, et avec la méthode que je vous ai fournie pour gérer vos certificats, nous pouvons directement &lt;em&gt;pin&lt;/em&gt; la clé publique du &lt;em&gt;leaf certificate&lt;/em&gt;. Pourquoi ? Parce que comme je vous l&amp;rsquo;ai dit, on peut désormais utiliser nos propres clés privées donc on peut se passer de la régénération automatique de Let&amp;rsquo;s Encrypt qui rend l&amp;rsquo;usage de HPKP très délicat.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Prudence.&lt;/strong&gt; Le problème avec HPKP, c&amp;rsquo;est qu&amp;rsquo;une fois actif chez le client, il le reste pendant la durée &lt;code&gt;max-age&lt;/code&gt; fournie dans le header. Si par malheur la clé privée est compromise mais que vous avez pin un seul certificat, pardonnez-moi le terme, mais vous êtes littéralement baisé (et plus concrètement votre site sera inaccessible chez ceux qui auront l&amp;rsquo;ancienne version du header active chez eux). Voilà pourquoi il faut pin plusieurs clés :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Si la clé privée est compromise, on peut changer de clé.&lt;/li&gt;&#10;&lt;li&gt;Par mesure de bon sens, il faut parfois rouler les clés.&lt;/li&gt;&#10;&lt;li&gt;Si l&amp;rsquo;algo est pété, on peut changer sur une autré clé d&amp;rsquo;un autre type d&amp;rsquo;algo.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Concrètement, moi, ce que je vous recommande, c&amp;rsquo;est de générer 2 clés P-384 et une clé RSA 4096, et de faire le tutoriel pour créer le certificat ECDSA à partir d&amp;rsquo;une clé P-384 générée.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Génération des 3 clés : 2x P-384, 1x RSA-4096&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl ecparam -genkey -name secp384r1 &amp;gt; privkey_ec_1.pem&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl ecparam -genkey -name secp384r1 &amp;gt; privkey_ec_2.pem&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl genrsa -out privkey_rsa.pem &lt;span class="m"&gt;4096&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Configurez comme indiqué plus haut le custom.cnf&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /etc/ssl/openssl.cnf custom.cnf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Les 3 CSR à générer&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -new -sha256 -key privkey_ec_1.pem -out csr_ec_1.der -config custom.cnf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -new -sha256 -key privkey_ec_2.pem -out csr_ec_2.der -config custom.cnf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -new -sha256 -key privkey_rsa.pem -out csr_rsa.der -config custom.cnf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Récupérer les empreintes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -pubkey &amp;lt; csr_ec_1.der &lt;span class="p"&gt;|&lt;/span&gt; openssl pkey -pubin -outform der &lt;span class="p"&gt;|&lt;/span&gt; openssl dgst -sha256 -binary &lt;span class="p"&gt;|&lt;/span&gt; base64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -pubkey &amp;lt; csr_ec_2.der &lt;span class="p"&gt;|&lt;/span&gt; openssl pkey -pubin -outform der &lt;span class="p"&gt;|&lt;/span&gt; openssl dgst -sha256 -binary &lt;span class="p"&gt;|&lt;/span&gt; base64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -pubkey &amp;lt; csr_rsa.der &lt;span class="p"&gt;|&lt;/span&gt; openssl pkey -pubin -outform der &lt;span class="p"&gt;|&lt;/span&gt; openssl dgst -sha256 -binary &lt;span class="p"&gt;|&lt;/span&gt; base64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Génération d&amp;#39;un certificat à partir de la première clé&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;letsencrypt certonly --standalone --agree-tos -m admin@domain.tld &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --csr /path/to/csr_ec_1.der &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cert-path /path/to/cert.pem &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --chain-path /path/to/chain.pem &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --fullchain-path /path/to/fullchain.pem&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le header &lt;code&gt;Public-Key-Pins&lt;/code&gt; est à renseigner avec les 3 empreintes obtenues et un &lt;code&gt;max-age&lt;/code&gt;. Pour l&amp;rsquo;instant, et pour commencer, je le mettrais à 2 mois (de toute façon, Chrome limite la validité du header à 60 jours&amp;hellip;) ; libre à vous de monter plus haut ensuite. Il est également possible d&amp;rsquo;appliquer HPKP à tous les sous-domaines une fois actif sur un domaine.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Public-Key-Pins&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;pin-sha256=&amp;#34;empreinte_ec_1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;pin-sha256=&amp;#34;empreinte&lt;/span&gt; &lt;span class="s"&gt;ec_2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;pin-sha256=&amp;#34;empreinte_rsa&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;max-age=5184000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;includeSubdomains&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il va de soit que les clés ne doivent pas être idéalement sur la même machine, car si celle-ci est compromise, ce n&amp;rsquo;est pas une mais les trois clés privées que vous allez perdre. N&amp;rsquo;hésitez pas à rouler les clés, c&amp;rsquo;est-à-dire passer sur la deuxième clé privée puis en générer une nouvelle et l&amp;rsquo;ajouter à HPKP, en virant la première et en laissant la deuxième.&lt;/p&gt;&#10;&lt;h2 id="9-dane-une-alternative-à-hpkp-"&gt;9. DANE, une alternative à HPKP ?&#13;&#10;&lt;/h2&gt;&lt;p&gt;DANE pour &lt;em&gt;DNS-based Authentication of Named Entities&lt;/em&gt; est un autre mécanisme sécurité, qui a la même finalité que HPKP mais qui repose sur des entrées DNS (des enregistrements TLSA). La condition pour son utilisation est l&amp;rsquo;activation de DNSSEC, sans quoi DANE n&amp;rsquo;a aucun intérêt. Je vais éviter la redite parce que mon ami Hardware a rédigé &lt;a class="link" href="https://blog.meshup.net/securiser-lacces-a-son-site-internet-avec-le-protocole-dane/" target="_blank" rel="noopener"&#13;&#10; &gt;un billet&lt;/a&gt; sur le sujet, n&amp;rsquo;hésitez pas à le consulter.&lt;/p&gt;&#10;&lt;p&gt;Les entrées TLSA se présentent sous cette forme :&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="TLSA" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2017/10/Screenshot_157.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;Pour extraire l&amp;rsquo;empreinte SHA-256 du &lt;code&gt;fullchain.pem&lt;/code&gt;, voici comment :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -noout -in fullchain.pem -fingerprint -sha256 &lt;span class="p"&gt;|&lt;/span&gt; cut -c 20- &lt;span class="p"&gt;|&lt;/span&gt; sed s/://g &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print tolower($0)}&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis il &amp;ldquo;suffit&amp;rdquo; d&amp;rsquo;ajouter une entrée TLSA dans votre zone DNS :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dns" data-lang="dns"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="py"&gt;_443._tcp.domain.tld. &lt;/span&gt;&lt;span class="k"&gt;IN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TLSA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;EMPREINTE&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;À&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;faire&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;pour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;chaque&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="py"&gt;sous-domaine.&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Du coup si on met le &lt;code&gt;fullchain.pem&lt;/code&gt;, il convient de mettre à jour l&amp;rsquo;entrée TLSA à chaque fois qu&amp;rsquo;on crée un nouveau certificat. Personnellement j&amp;rsquo;ai automatisé ça à coups de &lt;code&gt;sed&lt;/code&gt; dans mon script de renouvellement, et ça marche bien.&lt;/p&gt;&#10;&lt;p&gt;Malheureusement DANE n&amp;rsquo;est pas présent dans la plupart des clients modernes (même pas Chrome et Firefox), c&amp;rsquo;est pour cela qu&amp;rsquo;il vaut mieux garder HPKP à côté. Pour tester si DANE fonctionne correctement, je vous recommande l&amp;rsquo;utilisation du plugin &lt;a class="link" href="https://www.dnssec-validator.cz/" target="_blank" rel="noopener"&#13;&#10; &gt;DNSSEC/TLSA Validator&lt;/a&gt;. Vous devriez voir cela :&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="plugin TLSA" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2017/10/Screenshot_159.png"&gt;&lt;/p&gt;&#10;&lt;h2 id="10-certificate-transparency"&gt;10. Certificate Transparency&#13;&#10;&lt;/h2&gt;&lt;p&gt;Certificate Transparency (CT) est en passe de devenir un standard. L&amp;rsquo;objectif derrière est de rendre public et transparent par les CAs toutes les informations autour de la génération d&amp;rsquo;un certificat. Ainsi, c&amp;rsquo;est une façon de lutter contre l&amp;rsquo;apparition de certificats frauduleux.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Certificate Transparency" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2017/10/Transparency_1.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;Lors de la création du certificat, le CA envoie des informations au &lt;em&gt;log server&lt;/em&gt; qui répond avec un SCT (signed certificate timestamp). Ce SCT est soit intégré au certificat, soit présenté au travers d&amp;rsquo;autres moyens : une extension TLS, ou OCSP Stapling. Let&amp;rsquo;s Encrypt est déjà &lt;a class="link" href="https://crt.sh/?Identity=%25&amp;amp;iCAID=16418" target="_blank" rel="noopener"&#13;&#10; &gt;compatible avec certificate transparency&lt;/a&gt;, mais il ne présente pas encore de SCT (il est prévu que OCSP Stapling s&amp;rsquo;en occupe d&amp;rsquo;ici la fin d&amp;rsquo;année). Pour le moment on peut donc utiliser une &lt;strong&gt;extension TLS&lt;/strong&gt;, il faudra compiler nginx avec le &lt;a class="link" href="https://github.com/grahamedgecombe/nginx-ct" target="_blank" rel="noopener"&#13;&#10; &gt;module nginx-ct&lt;/a&gt;. Il ne fonctionnera qu&amp;rsquo;avec une version d&amp;rsquo;OpenSSL assez récente.&lt;/p&gt;&#10;&lt;p&gt;Pour obtenir le SCT de &lt;strong&gt;fullchain.pem&lt;/strong&gt; il nous faut utiliser &lt;a class="link" href="https://github.com/grahamedgecombe/ct-submit" target="_blank" rel="noopener"&#13;&#10; &gt;ct-submit&lt;/a&gt;.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/grahamedgecombe/ct-submit --depth&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ct-submit &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; go build&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./ct-submit ct.googleapis.com/pilot &amp;lt;fullchain.pem&amp;gt;fullchain.sct&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxd fullchain.sct &lt;span class="c1"&gt;# Pour tester&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000000: 00a4 b909 90b4 &lt;span class="m"&gt;1858&lt;/span&gt; &lt;span class="m"&gt;1487&lt;/span&gt; bb13 a2cc &lt;span class="m"&gt;6770&lt;/span&gt; .......X......gp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000010: 0a3c &lt;span class="m"&gt;3598&lt;/span&gt; 04f9 1bdf b8e3 77cd 0ec8 0ddc .&amp;lt;5.......w.....&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000020: &lt;span class="m"&gt;1000&lt;/span&gt; &lt;span class="m"&gt;0001&lt;/span&gt; 4bc7 e617 c800 &lt;span class="m"&gt;0004&lt;/span&gt; &lt;span class="m"&gt;0300&lt;/span&gt; &lt;span class="m"&gt;4830&lt;/span&gt; ....K.........H0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000030: &lt;span class="m"&gt;4602&lt;/span&gt; &lt;span class="m"&gt;2100&lt;/span&gt; b9fe e206 f0f5 f600 93d5 e04c F.!............L&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000040: d2fd 75c9 e1fc a5c8 &lt;span class="m"&gt;4812&lt;/span&gt; a8b7 bc2c eb0c ..u.....H....,..&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000050: ee16 1fe9 &lt;span class="m"&gt;0221&lt;/span&gt; 008a &lt;span class="m"&gt;5974&lt;/span&gt; e1b6 a0e0 281a .....!..Yt....&lt;span class="o"&gt;(&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000060: 61e8 &lt;span class="m"&gt;3447&lt;/span&gt; 895f 7ad4 2f70 f528 &lt;span class="m"&gt;6133&lt;/span&gt; a445 a.4G._z./p.&lt;span class="o"&gt;(&lt;/span&gt;a3.E&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000070: 4fd4 ab60 ba36 db O..&lt;span class="sb"&gt;`&lt;/span&gt;.6.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je vous suggère ici de créer un fichier &lt;code&gt;ct_domain.tld.conf&lt;/code&gt; où l&amp;rsquo;on mettra les paramètres nginx pour servir le SCT.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_ct&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_ct_static_scts&lt;/span&gt; &lt;span class="s"&gt;/path/to/sct/dir&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Normalement nginx devrait servir les SCTs qui sont dans ce dossier. Si jamais ça ne marche pas, il est possible que ce soit dû à une limitation pour laquelle le serveur par défaut doit impérativement servir des SCTs (ajoutez &lt;code&gt;default_server&lt;/code&gt; aux directives &lt;code&gt;listen&lt;/code&gt; d&amp;rsquo;un vhost d&amp;rsquo;un domaine qui utilise CT). Pour vérifier si Certificate Transparency est opérationnel, Chrome et Qualys SSL feront l&amp;rsquo;affaire.&lt;/p&gt;&#10;&lt;p&gt;A ce fichier de configuration on peut aussi ajouter un header, &lt;code&gt;Expect-CT&lt;/code&gt;. Il indique au browser que l&amp;rsquo;on attend l&amp;rsquo;utilisation de Certificate Transparency. Au jour d&amp;rsquo;aujourd&amp;rsquo;hui aucun browser ne l&amp;rsquo;utilise mais ce sera bientôt le cas. Surtout vérifiez bien que Certificate Transparency fonctionne et que les SCTs sont bien servis.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Expect-CT&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;enforce&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;max-age=86400&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dans ce cas-ci le browser devrait forcer l&amp;rsquo;utilisation de Certificate Transparency (erreur si pas possible) pendant un jour.&lt;/p&gt;&#10;&lt;h2 id="11-on-récapitule-"&gt;11. On récapitule ?&#13;&#10;&lt;/h2&gt;&lt;p&gt;Et c&amp;rsquo;est après, je l&amp;rsquo;espère, vous avoir expliqué en quoi consistent les mécanismes utilisés, que je vais vous fournir les exemples de configuration. À chaque fois qu&amp;rsquo;il y a un &lt;code&gt;domain.tld&lt;/code&gt;, c&amp;rsquo;est bien sûr à remplacer par votre domaine. Créons peut-être un dossier &lt;code&gt;/etc/nginx/conf&lt;/code&gt; dans lequel on mettra des fichiers de configuration personnalisés, histoire d&amp;rsquo;éviter la redondance plus tard et de pouvoir maintenir plus facilement.&lt;/p&gt;&#10;&lt;p&gt;Créons un fichier &lt;code&gt;tls.conf&lt;/code&gt; où l&amp;rsquo;on mettra les paramètres TLS :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_protocols&lt;/span&gt; &lt;span class="s"&gt;TLSv1.2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_ecdh_curve&lt;/span&gt; &lt;span class="s"&gt;X25519:P-521:P-384&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;EECDH+CHACHA20:EECDH+AESGCM&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_session_cache&lt;/span&gt; &lt;span class="s"&gt;shared:SSL:20m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_session_timeout&lt;/span&gt; &lt;span class="mi"&gt;15m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_session_tickets&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On désactive les tickets TLS car leur mauvaise implémentation nuit au principe de confidentialité persistance (FS). Les autres directives modifient le cache alloué aux sessions et le &lt;em&gt;timeout&lt;/em&gt; d&amp;rsquo;une session, elles sont à adapter selon les capacités de votre serveur et l&amp;rsquo;affluence des connexions.&lt;/p&gt;&#10;&lt;p&gt;Un fichier &lt;code&gt;hsts.conf&lt;/code&gt; pour HSTS :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Strict-Transport-Security&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;max-age=31536000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;includeSubDomains&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;preload&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un fichier &lt;code&gt;hpkp_domain.tld.conf&lt;/code&gt; pour HPKP d&amp;rsquo;un domaine :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Public-Key-Pins&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;pin-sha256=&amp;#34;empreinte_ec_1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;pin-sha256=&amp;#34;empreinte&lt;/span&gt; &lt;span class="s"&gt;ec_2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;pin-sha256=&amp;#34;empreinte_rsa&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;max-age=5184000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;includeSubdomains&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un fichier &lt;code&gt;ocsp.conf&lt;/code&gt; avec les paramètres OCSP :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_stapling&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ssl_stapling_verify&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resolver&lt;/span&gt; &lt;span class="n"&gt;213.133.98.98&lt;/span&gt; &lt;span class="n"&gt;213.133.99.99&lt;/span&gt; &lt;span class="s"&gt;valid=300s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resolver_timeout&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un fichier &lt;code&gt;headers.conf&lt;/code&gt; qui peut être ajouté si l&amp;rsquo;application n&amp;rsquo;ajoute pas déjà ces headers :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;SAMEORIGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-XSS-Protection&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;mode=block&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dans &lt;code&gt;sites-enabled/&lt;/code&gt;, on aura notre fichier &lt;code&gt;lambda.conf&lt;/code&gt; ainsi construit :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;domain.tld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;domain.tld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/path/to/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/path/to/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_trusted_certificate&lt;/span&gt; &lt;span class="s"&gt;/path/to/chain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/conf/tls.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/conf/hsts.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/conf/headers.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/conf/ocsp.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/conf/hpkp_domain.tld.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#include /etc/nginx/conf/ct_domain.tld.conf;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;N&amp;rsquo;oubliez pas de redémarrer nginx une fois les paramètres appliqués, sans oublier un &lt;code&gt;nginx -t&lt;/code&gt; avant pour éviter les mauvaises surprises.&lt;/p&gt;&#10;&lt;p&gt;Les tests pour voir si vous avez tout bon :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Qualys SSL (SSL/TLS) : &lt;a class="link" href="https://www.ssllabs.com/ssltest/" target="_blank" rel="noopener"&#13;&#10; &gt;https://www.ssllabs.com/ssltest/&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Cryptcheck (SSL/TLS): &lt;a class="link" href="https://tls.imirhil.fr/" target="_blank" rel="noopener"&#13;&#10; &gt;https://tls.imirhil.fr/&lt;/a&gt; (v2 bientôt)&lt;/li&gt;&#10;&lt;li&gt;Observatoire Mozilla (SSL/TLS + headers) : &lt;a class="link" href="https://observatory.mozilla.org" target="_blank" rel="noopener"&#13;&#10; &gt;https://observatory.mozilla.org&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;DNSSEC Analyzer (DNS) : &lt;a class="link" href="https://dnssec-debugger.verisignlabs.com/" target="_blank" rel="noopener"&#13;&#10; &gt;https://dnssec-debugger.verisignlabs.com/&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;DANE Checker (DNS) : &lt;a class="link" href="https://www.huque.com/bin/danecheck" target="_blank" rel="noopener"&#13;&#10; &gt;https://www.huque.com/bin/danecheck&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Si vous en avez d&amp;rsquo;autres, proposez !&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img alt="QualysSSL" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2017/10/Screenshot_162.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;Ce n&amp;rsquo;est pas difficile, et je ne pense pas avoir menti sur la marchandise, il s&amp;rsquo;agit d&amp;rsquo;une excellente configuration HTTPS, peut-être même un peu trop extrémiste. Si la compatibilité est un trop gros problème, appliquez les conseils que j&amp;rsquo;ai disséminés le long de l&amp;rsquo;article.&lt;/p&gt;&#10;&lt;p&gt;Article rédigé par Wonderfall, vous pouvez le suivre sur &lt;a class="link" href="https://masto.targaryen.house/@wonder" target="_blank" rel="noopener"&#13;&#10; &gt;Mastodon&lt;/a&gt; ou &lt;a class="link" href="https://twitter.com/thewonderfall" target="_blank" rel="noopener"&#13;&#10; &gt;Twitter&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Ghost 1.0 - Installer Ghost avec ghost-cli et Nginx - Migrer depuis wordpress</title><link>https://jesuisadmin.fr/ghost-deploiement-ghost-cli-migration-wordpress/</link><pubDate>Mon, 28 Aug 2017 14:24:14 +0000</pubDate><guid>https://jesuisadmin.fr/ghost-deploiement-ghost-cli-migration-wordpress/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2018/07/Sans-titre.jpg" alt="Featured image of post Ghost 1.0 - Installer Ghost avec ghost-cli et Nginx - Migrer depuis wordpress" /&gt;&lt;p&gt;Ghost à publié sa nouvelle release 1.0, qui introduit également l&amp;rsquo;outil ghost-cli permettant d&amp;rsquo;installer ghost, de le mettre à jour et d&amp;rsquo;intéragir plus facilement avec la plateforme.&lt;/p&gt;&#10;&lt;p&gt;Le thème de base &amp;ldquo;casper&amp;rdquo; a également été mis à jour, et je trouve le nouveau design absolument génial, bien que j&amp;rsquo;ai effectué certaines modifications dans les styles, notamment concernant la dimensions des images.&lt;/p&gt;&#10;&lt;p&gt;Je n&amp;rsquo;ai donc pas hésité trop longtemps, car je trouvais déjà que Ghost était une solution très intéressante pour écrire des articles, sans avoir pour autant à ajouter des dizaines de plugins comme sur wordpress.&lt;/p&gt;&#10;&lt;p&gt;Je vais donc expliquer dans cet article comment installer Ghost via l&amp;rsquo;outil ghost-cli, et comment réaliser la migration depuis WordPress.&lt;/p&gt;&#10;&lt;p&gt;Pour résumer les fonctionnalités principales de Ghost :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Articles en markdown&lt;/li&gt;&#10;&lt;li&gt;Organisation des articles par tags&lt;/li&gt;&#10;&lt;li&gt;Support natif des meta datas&lt;/li&gt;&#10;&lt;li&gt;Support natif de l&amp;rsquo;AMP&lt;/li&gt;&#10;&lt;li&gt;Application Desktop&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;De quoi avons nous besoin ?&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Un VPS avec Ubuntu 16.04 LTS&lt;/li&gt;&#10;&lt;li&gt;Un serveur MySQL&lt;/li&gt;&#10;&lt;li&gt;NGINX&lt;/li&gt;&#10;&lt;li&gt;Node v6&lt;/li&gt;&#10;&lt;li&gt;Un utilisateur avec sudo&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="installation-des-pré-requis"&gt;Installation des pré-requis&#13;&#10;&lt;/h3&gt;&lt;p&gt;On commence par créer un utilisateur et lui donner les droits sudo, puis on se connecte via cet utilisateur. &lt;strong&gt;Cet utilisateur ne doit pas s&amp;rsquo;appeller ghost, car l&amp;rsquo;utilisateur ghost sera automatiquement ajouté par ghost-cli&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;adduser --disabled-password --disabled-login monghost&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usermod -aG sudo monghost&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;su - monghost&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On met à jour la liste des paquets et le serveur&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get upgrade&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On installe la dernière release de nginx&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O - https://nginx.org/keys/nginx_signing.key | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo echo &amp;#34;deb http://nginx.org/packages/ubuntu/ $(lsb_release -sc) nginx&amp;#34; &amp;gt; /etc/apt/sources.list.d/nginx.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On installe MariaDB 10.3&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sS&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;downloads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mariadb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;MariaDB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mariadb_repo_setup&lt;/span&gt; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;bash&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;mariadb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.3&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;maxscale&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;mariadb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On installe nodejs v8 LTS&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install -y nodejs&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="installation-de-ghost"&gt;Installation de Ghost&#13;&#10;&lt;/h2&gt;&lt;p&gt;On commence par installer ghost-cli&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo npm i -g ghost-cli&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis on créer le répertoire pour notre blog&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chown&lt;/span&gt; &lt;span class="n"&gt;monghost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;monghost&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et on peut enfin lancer l&amp;rsquo;installation de Ghost, qui est totalement interactive et qui va :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Configurer la base de donnée&lt;/li&gt;&#10;&lt;li&gt;Installer la dernière version de Ghost&lt;/li&gt;&#10;&lt;li&gt;Configurer Ghost&lt;/li&gt;&#10;&lt;li&gt;Configurer Nginx et installer un certificat SSL avec Let&amp;rsquo;s Encrypt&lt;/li&gt;&#10;&lt;li&gt;Déclarer Ghost en tant que service via systemd&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Vous avez le choix pour chacune des étapes, de le faire via ghost-cli ou manuellement. Dans le cas de Nginx par exemple, si vous utiliser une configuration particulière, il sera préférable d&amp;rsquo;ajouter votre vhost manuellement.&lt;/p&gt;&#10;&lt;p&gt;On lance donc l&amp;rsquo;installation avec :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ghost install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-de-nginx"&gt;configuration de nginx&#13;&#10;&lt;/h3&gt;&lt;p&gt;Pour la configuration de Nginx, pour des performances optimales, j&amp;rsquo;utilise personnellement la fonctionnalité proxy-cache d&amp;rsquo;Nginx pour mettre en cache les pages du blog, cette technique est également appelée micro-caching puisque le délai d&amp;rsquo;expiration du cache est relative court mais autorise par contre Nginx à utiliser les fichiers en cache dans le cas ou l&amp;rsquo;upstream (le serveur nodejs Ghost dans ce cas) est indisponible.&lt;/p&gt;&#10;&lt;p&gt;Pour cela je commence par créer un répertoire pour stocker le cache nginx :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chown&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je peux ensuite créer mon vhost et définir le stockage du cache dans ce répertoire&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;proxy_cache_path&lt;/span&gt; &lt;span class="s"&gt;/var/cache/nginx/static&lt;/span&gt; &lt;span class="s"&gt;levels=1:2&lt;/span&gt; &lt;span class="s"&gt;keys_zone=GHOST:75m&lt;/span&gt; &lt;span class="s"&gt;inactive=24h&lt;/span&gt; &lt;span class="s"&gt;max_size=512m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# redirection du http vers https&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;votredomain.tld&lt;/span&gt; &lt;span class="s"&gt;www.votredomain.tld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://votredomain.tld&lt;/span&gt;&lt;span class="nv"&gt;$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# redirection du www vers non-www&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;www.votredomain.tld&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/votredomaine.tld/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/votredomaine.tld/key.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_trusted_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/votredomaine.tld/cert.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://votredomain.tld&lt;/span&gt;&lt;span class="nv"&gt;$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;votredomain.tld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="s"&gt;/var/www/votredomain.tld/system/nginx-root&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/votredomaine.tld/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/votredomaine.tld/key.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_trusted_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/votredomaine.tld/cert.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="s"&gt;/var/log/nginx/votredomaine.tld.access.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;error_log&lt;/span&gt; &lt;span class="s"&gt;/var/log/nginx/votredomaine.tld.error.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_cache&lt;/span&gt; &lt;span class="s"&gt;STATIC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_cache_valid&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="mi"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_cache_valid&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="mi"&gt;1m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_cache_key&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$scheme$request_method$host$request_uri&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_cache_use_stale&lt;/span&gt; &lt;span class="s"&gt;http_500&lt;/span&gt; &lt;span class="s"&gt;http_502&lt;/span&gt; &lt;span class="s"&gt;http_503&lt;/span&gt; &lt;span class="s"&gt;http_504&lt;/span&gt; &lt;span class="s"&gt;http_403&lt;/span&gt; &lt;span class="s"&gt;http_404&lt;/span&gt; &lt;span class="s"&gt;updating&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_cache_background_update&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_ignore_headers&lt;/span&gt; &lt;span class="s"&gt;X-Accel-Expires&lt;/span&gt; &lt;span class="s"&gt;Expires&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_ignore_headers&lt;/span&gt; &lt;span class="s"&gt;Set-Cookie&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_hide_header&lt;/span&gt; &lt;span class="s"&gt;Set-Cookie&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_hide_header&lt;/span&gt; &lt;span class="s"&gt;X-powered-by&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:2368&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;^/(?:ghost|signout)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:2368&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;no-cache,&lt;/span&gt; &lt;span class="s"&gt;private,&lt;/span&gt; &lt;span class="s"&gt;no-store,&lt;/span&gt; &lt;span class="s"&gt;must-revalidate,&lt;/span&gt; &lt;span class="s"&gt;max-stale=0,&lt;/span&gt; &lt;span class="s"&gt;post-check=0,&lt;/span&gt; &lt;span class="s"&gt;pre-check=0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/content/images&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;alias&lt;/span&gt; &lt;span class="s"&gt;/var/wwww/votredomaine.tld/content/images&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/assets&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;alias&lt;/span&gt; &lt;span class="s"&gt;/var/wwww/votredomaine.tld/content/themes/casper/assets&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;50m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour installer le certificat SSL, j&amp;rsquo;utilise actuellement acme.sh, un client Acme écrit en bash que je trouve plus facile à utiliser que certbot, notamment pour la mise en place des renouvellement automatique.&lt;/p&gt;&#10;&lt;p&gt;Je vous met le lien de mon article qui explique comment installer acme.sh et comment générer un certificat SSL : &lt;a class="link" href="https://kb.virtubox.net/fr/knowledgebase/installer-un-certificat-ssl-lets-encrypt-avec-acme-sh/" target="_blank" rel="noopener"&#13;&#10; &gt;Installer un certificat SSL Let&amp;rsquo;s Encrypt avec Acme.sh&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="mettre-à-jour-ghost"&gt;Mettre à jour Ghost&#13;&#10;&lt;/h3&gt;&lt;p&gt;Là aussi, la nouvelle CLI de Ghost facilite vraiment le processus de mise à jour, puisqu&amp;rsquo;il suffit de se rendre dans le dossier de votre blog en tant que l&amp;rsquo;utilisateur définit pour utiliser la CLI puis d&amp;rsquo;utiliser &lt;code&gt;ghost update&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;su&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;monghost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ghost&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="migrer-depuis-wordpress"&gt;Migrer depuis WordPress&#13;&#10;&lt;/h2&gt;&lt;p&gt;Pour migrer depuis WordPress, il faut tout d&amp;rsquo;abord extraire votre contenu au format .json en utilisant le plugin officiel publié par Ghost. Il est disponible dans &lt;a class="link" href="https://wordpress.org/plugins/ghost/" target="_blank" rel="noopener"&#13;&#10; &gt;l&amp;rsquo;annuaire de plugins WordPress&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Après avoir extrait votre contenu, vous pourrez l&amp;rsquo;importer dans Ghost, il est restera cependant quelques tâches à réaliser manuellement :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Les images devront être importées manuellement ou hébergées sur un hébergeur externe&lt;/li&gt;&#10;&lt;li&gt;Les commentaires devront être importés sur une plateforme comme Disqus ou sur une solution self-hosted comme Isso&lt;/li&gt;&#10;&lt;li&gt;Les méta-data de vos articles devront être ajoutées manuellement, l&amp;rsquo;importateur Ghost ne traite que le contenu des articles et les tags&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Je vais traiter dans un prochain article comment installer Isso pour héberger l&amp;rsquo;ensemble de vos commentaires et ne pas avoir à utiliser une solution comme disqus.&lt;/p&gt;&#10;</description></item><item><title>Installer un certificat SSL Cloudflare Origin avec Nginx</title><link>https://jesuisadmin.fr/installer-un-certificat-ssl-cloudflare-origin-avec-nginx/</link><pubDate>Thu, 20 Apr 2017 22:15:57 +0000</pubDate><guid>https://jesuisadmin.fr/installer-un-certificat-ssl-cloudflare-origin-avec-nginx/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2018/07/cloudflare-origin.jpg" alt="Featured image of post Installer un certificat SSL Cloudflare Origin avec Nginx" /&gt;&lt;p&gt;Il s’agit peut-être de la fonctionnalité la plus intéressante avec Cloudflare, la possibilité d’installer un certificat SSL fournit par Cloudflare sur votre serveur web. Cela permet de chiffrer les connexions entre votre serveur et les serveurs de Cloudflare, et vous pouvez générer un certificat valide pour 15 ans, soit largement plus que les 90 jours d’un certificat Let’s Encrypt.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Cloudflare SSL Full Strict " loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2017/08/strict-ssl.png"&gt;&lt;/p&gt;&#10;&lt;h3 id="générer-un-certificat-ainsi-quune-clé-privée-avec-cloudflare"&gt;Générer un certificat ainsi qu’une clé privée avec Cloudflare&#13;&#10;&lt;/h3&gt;&lt;p&gt;Pour commencer, vous devez vous rendre dans la partie “Crypto” du domaine pour lequel vous souhaitez générer un certificat. Vous trouverez alors la section &lt;strong&gt;Origin Certificates&lt;/strong&gt; dans laquelle nous allons pouvoir générer notre certificat SSL ainsi que notre clé privée.&lt;/p&gt;&#10;&lt;p&gt;Vous pouvez donc cliquer comme dans l’exemple ci-dessous sur le bouton Create Certificate.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Créer un certificat SSL Cloudflare" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2017/08/ssl-tls-cloudflare4.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;Vous pouvez si vous le souhaitez générer une requête de Certificat nommé CSR (Certificate Signing Request) ainsi qu&amp;rsquo;une clé privée, ou laisser Cloudflare le faire pour vous. Par contre il préférable de choisir un certificat de type ECDSA plutôt que RSA, aussi bien pour les performances, que pour la sécurité.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Cloudflare origin certificat" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2018/06/Screenshot_231.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;Vous allez alors obtenir votre certificat ainsi que votre clé privée.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Cloudflare ECDSA Origin certificate" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2018/06/Screenshot_235.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;Copiez tout d&amp;rsquo;abord la clé dans un fichier votredomaine-key.pem, à conserver précieusement car vous ne pourrez pas la télécharger à nouveau depuis Cloudflare.&lt;/p&gt;&#10;&lt;p&gt;Copiez ensuite le certificat SSL dans un deuxième fichier que nous allons nommer votredomaine-crt.pem. Et placez les deux fichiers dans un dossier votre choix, par exemple un dossier nommé ssl dans /etc/nginx.&lt;/p&gt;&#10;&lt;p&gt;Cependant avant de pouvoir ajouter le certificat dans la configuration Nginx, il faut ajouter la &lt;a class="link" href="https://support.cloudflare.com/hc/en-us/articles/218689638-What-are-the-root-certificate-authorities-CAs-used-with-Cloudflare-Origin-CA-" target="_blank" rel="noopener"&#13;&#10; &gt;signature de l’autorité de certification&lt;/a&gt; dans le même fichier que notre certificat. Pour cela nous allons télécharger le certificat root de Cloudflare et le fusionner avec notre certificat :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget wget https://support.cloudflare.com/hc/en-us/article_attachments/206709098/cloudflare_origin_ecc.pem&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat votredomaine-crt.pem cloudflare_origin_ecc.pem &amp;gt; votredomaine-fullchain.pem&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="installer-le-certificat-avec-nginx"&gt;Installer le certificat avec nginx&#13;&#10;&lt;/h3&gt;&lt;p&gt;Pour utiliser ce certificat dans votre configuration nginx, il vous suffit d’ajouter les lignes suivantes à votre bloc server :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;listen 443 ssl http2;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;listen [::]:443 ssl http2;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssl on;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssl_certificate /etc/nginx/ssl/votredomaine-fullchain.pem;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssl_certificate_key /etc/nginx/ssl/votredomaine-key.pem;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pouvez vérifier que tout est correct avant t d’appliquer la configuration en utilisant &lt;code&gt;nginx -t&lt;/code&gt;. Si il n&amp;rsquo;y a aucune erreur, vous pouvez alors utiliser &lt;code&gt;service nginx reload&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Vous pouvez alors changer le niveau SSL de votre domaine en &lt;strong&gt;Full (strict)&lt;/strong&gt; via l’interface Cloudflare :&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Cloudflare SSL Full (strict)" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2017/08/Screenshot_67.png"&gt;&lt;/p&gt;&#10;&lt;h3 id="allez-plus-loin-avec-les-authenticated-origin-pulls"&gt;Allez plus loin avec les Authenticated Origin Pulls&#13;&#10;&lt;/h3&gt;&lt;p&gt;Nous pouvons même aller plus loin et mettre en place un certificat pour authentifié notre serveur. Ce service est nommé “Authenticated Origin Pulls” dans le panel Cloudflare et permet d’éviter que des requêtes soient faites à votre serveur sans passer par le proxy Cloudflare.&lt;/p&gt;&#10;&lt;p&gt;Pour le mettre en place il nous suffit de télécharger le certificat suivant :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /etc/nginx/ssl/origin-pull-ca.pem https://support.cloudflare.com/hc/en-us/article_attachments/201243967/origin-pull-ca.pem&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et de l’inclure dans notre configuration nginx :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssl_client_certificate /etc/nginx/ssl/origin-pull-ca.pem;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssl_verify_client on;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nous pouvons alors activer depuis l’interface Cloudflare la fonctionnalité Authenticated Origin Pulls.&lt;/p&gt;&#10;</description></item><item><title>Migration d'une instance Mastodon</title><link>https://jesuisadmin.fr/migration-dune-instance-mastodon/</link><pubDate>Thu, 13 Apr 2017 13:40:33 +0000</pubDate><guid>https://jesuisadmin.fr/migration-dune-instance-mastodon/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2017/08/migration-mastodon-1.png" alt="Featured image of post Migration d'une instance Mastodon" /&gt;&lt;h3 id="pourquoi-migrer-mon-instance-mastodon-"&gt;Pourquoi migrer mon instance Mastodon ?&#13;&#10;&lt;/h3&gt;&lt;p&gt;Une semaine après l’installation de ma première instance Mastodon, il est déjà temps de migrer. Mais la raison n’est pas le besoin de plus de ressources pour l’instance.&lt;/p&gt;&#10;&lt;p&gt;Non, c’est plutôt que je n’était pas totalement satisfait de ma première installation, et que je rencontrais certains bugs récurrents dont je ne trouvais pas la source.&#10;Donc je me suis dit, autant refaire une installation propre maintenant que je connais bien l’outil.&#10;Premier point, je suis passé de Ubuntu 16.04 LTS à Debian 8.7, principalement pour bénéficier des packages de dotdeb.org dont notamment redis-server en v3.2.8 contre v3.0.6 sur Ubuntu. Et pour simplifier un petit peu l’installation, j’ai utilisé &lt;a class="link" href="https://jesuisadmin.fr/easyengine-nginx-wordpress/" target="_blank" rel="noopener"&#13;&#10; &gt;EasyEngine&lt;/a&gt; pour mettre en place nginx et redis.&#10;Le principal avantage de EasyEngine est qu’il permet d’organiser très proprement les fichiers de configuration de Nginx avec une nomenclature claire et simple.&#10;Je suis également passer de Cloudflare à Let’s Encrypt notamment pour bénéficier d’un meilleur chiffrement et de plus d’options sur les headers Nginx.&lt;/p&gt;&#10;&lt;h3 id="préparer-le-nouveau-serveur"&gt;Préparer le nouveau serveur&#13;&#10;&lt;/h3&gt;&lt;p&gt;Pour la migration il vous faut exporter la base de donnée postgresql et faire une copie du dossier /home/mastodon. Pour cela il faudra arrêter tous les services de mastodon et avoir préalablement préparé le nouveau serveur. Pour cela commençons par réinstaller ce qui est nécessaire pour Mastodon.&lt;/p&gt;&#10;&lt;p&gt;Installation des dépendances&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#34;deb http://ftp.debian.org/debian jessie-backports main&amp;#34; &amp;gt;&amp;gt; /etc/apt/sources.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs file git curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Installation de NodeJS&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://deb.nodesource.com/setup_4.x | bash -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install nodejs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g yarn&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Installation de PostgreSQL (en v9.6 via les backports) et création de l’utilisateur mastodon, avec un mot de passe et de la base de donnée mastodon_production&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get -t jessie-backports install postgresql postgresql-contrib&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;su - postgre&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;psql&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE USER mastodon CREATEDB;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ALTER USER &amp;#34;mastodon&amp;#34; WITH PASSWORD &amp;#39;new_password&amp;#39;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE DATABASE mastodon_production OWNER mastodon;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;\q&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour l’installation de Nginx et Redis, comme dit précédemment, j’ai utilisé EasyEngine, on installe donc d’abord EE :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;wget -qO ee rt.cx/ee &amp;amp;&amp;amp; bash ee&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Et on installe Nginx et Redis :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;ee stack install --nginx --redis&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Installation des dépendances pour Ruby :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;adduser&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="n"&gt;mastodon&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;clone&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rbenv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rbenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;rbenv&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=&amp;#34;$HOME/.rbenv/bin:$PATH&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;eval &amp;#34;$(rbenv init -)&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il faut alors se déconnecter puis se reconnecter en tant que mastodon pour appliquer les modifications faites au bash&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;su - mastodon&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On installe ruby-build&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Puis on installe Ruby, en version 2.4.1 désormais&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbenv install 2.4.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbenv global 2.4.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut désormais remettre en place la configuration de Nginx avant de commencer la migration.&#10;Mise en place des services :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://git.virtubox.net/virtubox/mastodon/raw/master/services/mastodon-web.service -O /etc/systemd/system/mastodon-web.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://git.virtubox.net/virtubox/mastodon/raw/master/services/mastodon-streaming.service -O /etc/systemd/system/mastodon-streaming.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://git.virtubox.net/virtubox/mastodon/raw/master/services/mastodon-sidekiq.service -O /etc/systemd/system/mastodon-sidekiq.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour créer le virtualhost avec EasyEngine :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;ee site create votredomaine.com&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Vous pouvez ensuite editer /etc/nginx/sites-availables/votredomaine.com, en se basant sur le &lt;a class="link" href="https://angristan.fr/installer-instance-mastodon-debian-8/" target="_blank" rel="noopener"&#13;&#10; &gt;modèle d’Angristan&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;connection_upgrade&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# redirection http vers https&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="p"&gt;[::]:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;access_log&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;error_log&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# block https&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt; &lt;span class="n"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="p"&gt;[::]:&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt; &lt;span class="n"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;access_log&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;error_log&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# configuration ssl avec letsencrypt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_certificate&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;privkey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_protocols&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="n"&gt;EECDH&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;AESGCM&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EECDH&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;CHACHA20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EECDH&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;AES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ajout des headers pour le HSTS, CSP et Referrer-Policy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Strict&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Transport&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Security&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;max-age=15552000; includeSubDomains; preload&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Security&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Policy&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;default-src &amp;#39;self&amp;#39;; style-src &amp;#39;self&amp;#39; &amp;#39;unsafe-inline&amp;#39;; script-src &amp;#39;self&amp;#39; &amp;#39;unsafe-inline&amp;#39;; img-src &amp;#39;self&amp;#39; data:; connect-src &amp;#39;self&amp;#39; wss://votredomaine.com;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Referrer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Policy&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;strict-origin-when-cross-origin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;keepalive_timeout&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sendfile&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gzip&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mastodon&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;try_files&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Proto&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass_header&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_buffering&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_redirect&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Upgrade&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;connection_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tcp_nodelay&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;streaming&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Proto&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_buffering&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_redirect&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Upgrade&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;connection_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tcp_nodelay&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;error_page&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="mi"&gt;501&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt; &lt;span class="mi"&gt;504&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;500.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="transfert-des-données-depuis-lancien-serveur"&gt;Transfert des données depuis l’ancien serveur&#13;&#10;&lt;/h3&gt;&lt;p&gt;A partir de là, cette fois on ne clone pas le dépôt Github puisque l’on veut réutiliser l’installation précédente. Pour réaliser la copie depuis le serveur précédent, il faut tout d’abord arrêter les services de mastodon sur l’ancien serveur:&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;systemctl stop mastodon* redis&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;On dump ensuite l’ancienne base de donnée :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;pg_dump mastodon_production &amp;gt; fichier_de_sortie&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Pour les fichier, j’ai simplement zippé le dossier /home/mastodon avant de le transférer sur le nouveau serveur avec scp.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;zip backupmaston -r /home/mastodon&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Pourquoi ne pas utiliser rsync ? Car lors de l’extraction du zip, il est facile de ne pas écraser les fichiers déjà présent, notamment pour rbenv et rbenv-build en utilisant “N” lorsque le programme unzip nous demande ce que l’on souhaite faire.&#10;Pour importer la base de donnée après le transfert sur le nouveau serveur :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;su - postgre&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;psql mastodon_production &amp;lt; fichier_d_entree&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ne pas oublier après le transfert de vérifier les propriétaires des fichiers dans /home/mastodon, ne pas hésiter à faire :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;chown -R mastodon:mastodon /home/mastodon&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Il faut également penser à copier votre certificat Let’s Encrypt&lt;/p&gt;&#10;&lt;h3 id="relancer-mastodon-après-le-transfert"&gt;Relancer mastodon après le transfert&#13;&#10;&lt;/h3&gt;&lt;p&gt;Ne pas oublier de modifier le fichier .env.production avec le mot de passe postgreSQL notamment.&#10;Pour relancer mastodon, cela se déroule comme une mise à jour si ce n’est que l’on installe bundler&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;su - mastodon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd live&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gem install bundler --no-ri&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout $(git tag | tail -n 1)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bundle install --deployment --without development test&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NODE_ENV=production npm upgrade --global yarn&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn install&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production bundle exec rails assets:clean&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production bundle exec rails assets:precompile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production bundle exec rails db:migrate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis activer et démarrer les services :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl enable /etc/systemd/system/mastodon-*.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mise en place des crons&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;crontab -e -u mastodon&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Et ajouter les lignes&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@daily cd /home/mastodon/live &amp;amp;&amp;amp; /home/mastodon/.rbenv/shims/bundle exec rake mastodon:daily&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voilà ! Vous pouvez désormais changer vos DNS pour pointer votre domaine vers le nouveau serveur.&#10;N’hésitez pas à me signaler d’éventuelles erreurs en commentaire ou à proposer des améliorations.&lt;/p&gt;&#10;&lt;p&gt;Si vous souhaitez mettre en place une architecture basée sur plusieurs serveurs, je vous recommande l’article &lt;a class="link" href="https://blog.matuni.xyz/article5/migration-d-une-instance-mastodon" target="_blank" rel="noopener"&#13;&#10; &gt;matuni.xyz&lt;/a&gt;.&lt;/p&gt;&#10;</description></item><item><title>Installer une instance Mastodon sur Ubuntu 16.04 LTS</title><link>https://jesuisadmin.fr/installer-instance-mastodon-ubuntu/</link><pubDate>Wed, 05 Apr 2017 20:17:58 +0000</pubDate><guid>https://jesuisadmin.fr/installer-instance-mastodon-ubuntu/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2017/08/Mastodon-setup.png" alt="Featured image of post Installer une instance Mastodon sur Ubuntu 16.04 LTS" /&gt;&lt;p&gt;Alors que ce nouveau réseau social fait actuellement beaucoup parler de lui, je me suis décidé à créer ma propre instance Mastodon pour contribuer à ce projet.&lt;/p&gt;&#10;&lt;p&gt;J’en ai donc profiter pour faire un tutorial listant les étapes à suivre pour lancer vous aussi votre instance dès aujourd’hui. Je suis parti sur un VPS tournant avec Ubuntu 16.04 LTS et du côté ressources 8 vCores, 8Go de RAM et 50Go de SSD. Je verrais à l’usage si l’instance nécessite plus de ressources.&lt;/p&gt;&#10;&lt;p&gt;Pour suivre les étapes de ce tutorial, un utilisateur avec les droits sudo est suffisant, vous n’avez pas besoin de vous connecter en tant que root.&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;h3 id="installer-les-pré-requis"&gt;&lt;strong&gt;Installer les pré-requis&lt;/strong&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Installation de nodejs&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo npm install -g yarn&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Installation de redis-server&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sudo apt-get install redis-server redis-tools&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Installation de postgresql&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install postgresql postgresql-contrib&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo su - postgres&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;psql&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE USER mastodon CREATEDB;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;\q&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il nous faut également activer le daemon d’authentification pour que les utilisateurs puissent se connecter dans mot de passe :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sed -i &amp;#39;/^local.*postgres.*peer$/a host all all 127.0.0.1/32 ident&amp;#39; /etc/postgresql/9.?/main/pg_hba.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install pidentd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl enable pidentd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start pidentd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart postgresql&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="installation-de-ruby"&gt;Installation de Ruby&#13;&#10;&lt;/h3&gt;&lt;p&gt;On installe les dépendances pour Ruby.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;On créer un utilisateur mastodon :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;adduser --disabled-password --disabled-login mastodon&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Puis on s’identifie avec cet utilisateur&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;su - mastodon&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;On installe rbenv et rbenv-build :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;adduser&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="n"&gt;mastodon&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;clone&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rbenv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rbenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;rbenv&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=&amp;#34;$HOME/.rbenv/bin:$PATH&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;eval &amp;#34;$(rbenv init -)&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On se déconnecte pour appliquer la modification au bash, puis on installe ruby-build.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;su - mastodon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis on installe Ruby v2.4.1 pour Mastodon :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbenv install 2.4.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbenv global 2.4.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On vérifie la version de ruby installé via la commande :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;ruby -v&lt;/code&gt;&lt;/p&gt;&#10;&lt;h3 id="installation-de-mastodon"&gt;Installation de Mastodon&#13;&#10;&lt;/h3&gt;&lt;p&gt;Nous allons pouvoir passer à l’installation de Mastodon et pour cela on commence par cloner le dépôt Github, puis on utilise git checkout pour sélectionner la dernière release plutôt que de rester sur la branche master :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd ~&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/tootsuite/mastodon.git live&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd live&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout $(git tag | tail -n 1)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On installe bundler pout gérer l’installation des dépendances et on désactive la documentation pour chaque gem.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#34;gem: --no-document&amp;#34; &amp;gt; ~/.gemrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gem install bundler --no-ri&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis on passe à l’installation&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bundle install --deployment --without development test&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut désormais copier le fichier de configuration d’exemple et l’éditer avec nos informations :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp .env.production.sample .env.production&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano .env.production&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les informations à remplir sont  :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Service dependencies&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;REDIS_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;REDIS_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6379&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DB_HOST&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postgresql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mastodon&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DB_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mastodon_production&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DB_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DB_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5432&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Federation&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;LOCAL_DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;LOCAL_HTTPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ainsi que la partie SMTP qui permettra aux utilisateurs de confirmer leur inscription :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# E-mail configuration&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMTP_SERVER=mail.votredomaine.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMTP_PORT=587&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMTP_LOGIN=noreply@votredomaine.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMTP_PASSWORD=VotreMotdePasse&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMTP_FROM_ADDRESS=noreply@votredomaine.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour la partie application secret, utilisez la commande &lt;em&gt;bundle exec rake secret&lt;/em&gt; pour générer 3 clés et vous n’avez plus qu’à les copier dans le fichier de configuration.&lt;/p&gt;&#10;&lt;p&gt;Pour mettre en place l’instance du côté base de donnée et assets :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production bundle exec rails db:setup&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production bundle exec rails assets:precompile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="création-des-services-systemd"&gt;Création des services systemd&#13;&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pour le processus web&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;nano /etc/systemd/system/mastodon-web.service&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Unit]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Description=mastodon-web&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; After=network.target&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Service]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Type=simple&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User=mastodon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WorkingDirectory=/home/mastodon/live&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Environment=&amp;#34;RAILS_ENV=production&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Environment=&amp;#34;PORT=3000&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TimeoutSec=15&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Restart=always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Install]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WantedBy=multi-user.target&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;**Pour le processus en arrière-plan **&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;nano /etc/systemd/system/mastodon-sidekiq.service&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Unit]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Description=mastodon-sidekiq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; After=network.target&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Service]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Type=simple&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User=mastodon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WorkingDirectory=/home/mastodon/live&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Environment=&amp;#34;RAILS_ENV=production&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Environment=&amp;#34;DB_POOL=5&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TimeoutSec=15&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Restart=always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Install]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WantedBy=multi-user.target&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pour le processus de l’API&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;nano /etc/systemd/system/mastodon-streaming.service&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Unit]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Description=mastodon-streaming&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; After=network.target&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Service]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Type=simple&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User=mastodon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WorkingDirectory=/home/mastodon/live&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Environment=&amp;#34;NODE_ENV=production&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Environment=&amp;#34;PORT=4000&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ExecStart=/usr/bin/npm run start&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TimeoutSec=15&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Restart=always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Install]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WantedBy=multi-user.target&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut alors activer les services :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;systemctl enable /etc/systemd/system/mastodon-*.service&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Et enfin démarrer l’instance Mastodon :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sudo systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;On ajoute alors les crons nécessaire pour Mastodon :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;crontab -u mastodon -e&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@daily cd /home/mastodon/live &amp;amp;&amp;amp; /home/mastodon/.rbenv/shims/bundle exec rake mastodon:daily&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="mise-en-place-du-reverse-proxy-nginx-"&gt;Mise en place du reverse-proxy Nginx :&#13;&#10;&lt;/h3&gt;&lt;p&gt;Nous avons désormais une instance mastodon qui fonctionne, mais nous allons devoir mettre en place un reverse-proxy avec Nginx afin de pouvoir utiliser directement notre domaine pour y accéder.&lt;/p&gt;&#10;&lt;p&gt;On commence par installer nginx :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O - https://nginx.org/keys/nginx_signing.key | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo echo &amp;#34;deb http://nginx.org/packages/ubuntu/ $(lsb_release -sc) nginx&amp;#34; &amp;gt; /etc/apt/sources.list.d/nginx.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On créer un fichier de configuration en se basant sur le &lt;a class="link" href="https://angristan.fr/installer-instance-mastodon-debian-8/" target="_blank" rel="noopener"&#13;&#10; &gt;modèle d’Angristan&lt;/a&gt; :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;nano /etc/nginx/sites-enabled/votredomaine.com&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;connection_upgrade&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# redirection http vers https&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="p"&gt;[::]:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;access_log&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;error_log&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# block https&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt; &lt;span class="n"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="p"&gt;[::]:&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt; &lt;span class="n"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;access_log&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;error_log&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# configuration ssl avec letsencrypt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_certificate&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;privkey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_protocols&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="n"&gt;EECDH&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;AESGCM&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EECDH&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;CHACHA20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EECDH&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;AES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ajout des headers pour le HSTS, CSP et Referrer-Policy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Strict&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Transport&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Security&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;max-age=15552000; includeSubDomains; preload&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Security&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Policy&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;default-src &amp;#39;self&amp;#39;; style-src &amp;#39;self&amp;#39; &amp;#39;unsafe-inline&amp;#39;; script-src &amp;#39;self&amp;#39; &amp;#39;unsafe-inline&amp;#39;; img-src &amp;#39;self&amp;#39; data:; connect-src &amp;#39;self&amp;#39; wss://votredomaine.com;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Referrer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Policy&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;strict-origin-when-cross-origin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;keepalive_timeout&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sendfile&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gzip&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mastodon&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;try_files&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Proto&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass_header&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_buffering&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_redirect&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Upgrade&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;connection_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tcp_nodelay&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;streaming&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Proto&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_buffering&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_redirect&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Upgrade&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;connection_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tcp_nodelay&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;error_page&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="mi"&gt;501&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt; &lt;span class="mi"&gt;504&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;500.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis on installe Let’s Encrypt pour générer notre certificat SSL :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd /opt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/letsencrypt/letsencrypt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd letsencrypt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./letsencrypt-auto certonly --webroot -w /home/mastodon/live -d www.votredomaine.com -d votredomaine.com --email vous@votredomaine.com --text --rsa-key-size 4096&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="mettre-à-jour-mastodon"&gt;Mettre à jour Mastodon&#13;&#10;&lt;/h3&gt;&lt;p&gt;Mastodon est très régulièrement mis à jour, cependant pour des raisons de stabilité, il est préférable d’attendre des releases pour mettre à jour son instance. Il ne sera donc pas nécessaire de lancer 10 fois par jour la commande git pull, et il vous suffit après une release d’utiliser les commandes suivantes sans oublier de remplacer tags/vX.X.X par l’identifiant de la release.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;su - mastodon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd live&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout vX.X.X&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bundle install --deployment --without development test&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NODE_ENV=production npm upgrade --global yarn&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn install&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production bundle exec rails assets:clean&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production bundle exec rails assets:precompile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAILS_ENV=production bundle exec rails db:migrate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;Si une mise à jour de Ruby est nécessaire pour l’installation d’une release, il vous faudra faire :&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbenv install 2.4.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gem install bundler --no-ri&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;Note pour la release v1.1.2, pour utiliser la nouvelle fonctionnalitée des avatars GIF, utilisez la commande suivante pour générer une version statiques sur des avatars mis en ligne précédemmment. Sinon vos utilisateurs devront ré-uploader l’avatar pour en bénéficier.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;RAILS_ENV=production bundle exec rake mastodon:maintenance:add_static_avatars&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Il ne reste plus qu’à redémarrer l’instance :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sudo systemctl restart mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service&lt;/code&gt;&lt;/p&gt;&#10;&lt;h3 id="création-du-compte-administrateur"&gt;Création du compte administrateur&#13;&#10;&lt;/h3&gt;&lt;p&gt;Votre instance est désormais fonctionnelle, il vous suffit donc de vous inscrire et de valider votre adresse mail pour créer votre compte.&#10;Ensuite, pour définir ce compte en tant qu’administrateur de l’instance utiliser la commande suivante :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;RAILS_ENV=production bundle exec rails mastodon:make_admin USERNAME=votre-utilisateur&lt;/code&gt;&lt;/p&gt;&#10;&lt;h3 id="mon-instance-mastodontop"&gt;Mon instance Mastodon.top&#13;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img alt="Screenshot_44" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://jesuisadmin.fr/images/2017/08/Screenshot_44.png"&gt;&lt;/p&gt;&#10;&lt;h3 id=""&gt;&#13;&#10;&lt;/h3&gt;&lt;p&gt;Ayant des ressources à disposition, j’ai lancé mon instance Mastodon, que vous pouvez rejoindre à l’adresse &lt;a class="link" href="https://mastodon.top" target="_blank" rel="noopener"&#13;&#10; &gt;mastodon.top&lt;/a&gt;. Nous sommes déjà 90 utilisateurs et vu l’utilisation des ressources, cela ne devrait pas être un problème d’héberger plus de monde.&#10;Vous pouvez visualiser les statistiques de l’instance sur la &lt;a class="link" href="https://mastodon.top/about/more" target="_blank" rel="noopener"&#13;&#10; &gt;page about&lt;/a&gt; ainsi que le monitoring en temps-réel à l’adresse &lt;a class="link" href="https://status.mastodon.top" target="_blank" rel="noopener"&#13;&#10; &gt;status.mastodon.top&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;N’hésitez pas à donner votre avis sur ce tutoriel, à corriger d’éventuelles erreurs ou à demander de l’aide pour mettre en place votre instance !&lt;/p&gt;&#10;&lt;p&gt;Vous pouvez aussi me suivre sur Mastodon : &lt;a class="link" href="https://mastodon.top/@thomas_virtubox" target="_blank" rel="noopener"&#13;&#10; &gt;thomas_virtubox@mastodon.top&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Installer Ghost avec Nginx proxy-cache et Let'sEncrypt</title><link>https://jesuisadmin.fr/installer-ghost-nginx-proxy-cache-letsencrypt/</link><pubDate>Wed, 29 Mar 2017 21:17:02 +0000</pubDate><guid>https://jesuisadmin.fr/installer-ghost-nginx-proxy-cache-letsencrypt/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2018/07/Installer-Ghost-2.jpg" alt="Featured image of post Installer Ghost avec Nginx proxy-cache et Let'sEncrypt" /&gt;&lt;hr&gt;&#10;&#13;&#10; &lt;blockquote&gt;&#13;&#10; &lt;p&gt;Cet article est ancien et il peut contenir des instructions qui ne sont plus d&amp;rsquo;actualité.&lt;/p&gt;&#10;&#13;&#10; &lt;/blockquote&gt;&#13;&#10;&lt;p&gt;Si vous aussi, il vous arrive de vous plaindre à propos de WordPress, pourquoi ne pas essayer une autre solution pour votre blog ? C’est ce que j’ai fait pour mon blog &lt;a class="link" href="https://anystack.xyz" target="_blank" rel="noopener"&#13;&#10; &gt;anystack.xyz&lt;/a&gt; en passant de WordPress à Ghost. Après plusieurs mois d’utilisation, je suis plutôt satisfait de cette plateforme. Il manque effectivement quelques fonctionnalités et l’écosystème de plugins et de thèmes que l’on peut retrouver sur WordPress, mais sa simplicité d’utilisation et son orientation vers ce qui est vraiment important – le contenu – est plutôt agréable.&lt;/p&gt;&#10;&lt;p&gt;Je vais donc dans ce tutorial expliquer comment installer Ghost, puis mettre en place un reverse-proxy avec Nginx et Let’s Encrypt, en utilisant le module proxy-cache de Nginx pour rendre Ghost encore plus rapide.&lt;/p&gt;&#10;&lt;h3 id="1-installer-nodejs-v4-lts"&gt;1) Installer NodeJs v4 LTS&#13;&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://deb.nodesource.com/setup_4.x&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x setup_4.x&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./setup_4.x&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install nodejs -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-installer-ghost"&gt;2) Installer Ghost&#13;&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;unzip&lt;/span&gt; &lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;npm&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;production&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lancer Ghost :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm start --production&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Votre instance Ghost est donc désormais lancée, et vous pouvez y accéder à l’adresse &lt;a class="link" href="http://IP-De-Votre-Serveur:2368" target="_blank" rel="noopener"&#13;&#10; &gt;http://IP-De-Votre-Serveur:2368&lt;/a&gt;. Cependant, si vous fermez votre console SSH, l’instance Ghost s’arrêtera.&#10;Pour lancer Ghost de façon définitive :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install forever -g&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;## démarrer ghost&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NODE_ENV=production forever start index.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;## arrêter ghost&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;forever stop index.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-configurer-nginx-en-tant-que-reverse-proxy"&gt;3) Configurer Nginx en tant que reverse-proxy&#13;&#10;&lt;/h3&gt;&lt;p&gt;Nous allons donc passer à la partie configuration de Nginx. Si vous utilisez EasyEngine, vous pouvez créer votre sous domaine en une seule commande :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;ee site create votredomaine.com --proxy=127.0.0.1:2368&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Ensuite modifiez le fichier de configuration de votre domaine en suivant le modèle ci-dessous.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;upstream&lt;/span&gt; &lt;span class="n"&gt;ghost_upstream&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2368&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;keepalive&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;proxy_cache_path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="n"&gt;levels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;keys_zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;STATIC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;inactive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="n"&gt;max_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;wwww&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Cache&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;upstream_cache_status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_cache&lt;/span&gt; &lt;span class="n"&gt;STATIC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_cache_valid&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_cache_valid&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;ghost_upstream&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_ignore_headers&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Accel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Expires&lt;/span&gt; &lt;span class="n"&gt;Expires&lt;/span&gt; &lt;span class="n"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;Control&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_ignore_headers&lt;/span&gt; &lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Cookie&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_hide_header&lt;/span&gt; &lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Cookie&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_hide_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;powered&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;expires&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;access_log&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;expires&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;assets&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;themes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uno&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;assets&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;access_log&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;expires&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;built&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;access_log&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;expires&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;scripts&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;built&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;scripts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;access_log&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;expires&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="o"&gt;^/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ghost&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;signout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;ghost_upstream&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;Control&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;well&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;known&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;well&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;known&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour appliquer la configuration, on utilise la commande &lt;em&gt;service nginx reload&lt;/em&gt;.&#10;Cependant il faut également penser à éditer le fichier config.js, situé dans le dossier d’installation de Ghost, et y changer la variable url en la remplaçant par votre nom de domaine :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;url: 'http://votredomaine.com'&lt;/code&gt;&lt;/p&gt;&#10;&lt;h3 id="4-installer-lets-encrypt"&gt;4) Installer Let’s Encrypt&#13;&#10;&lt;/h3&gt;&lt;p&gt;On peut désormais passer à l’installation de Let’s Encrypt si ce n’est pas déjà fait.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd /opt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/letsencrypt/letsencrypt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd letsencrypt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il ne nous reste plus qu’à générer le certificat via la commande :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;./letsencrypt-auto certonly --webroot -w /var/www/html -d votredomaine.com --email votreemail@votredomaine.com --text --agree-tos&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Pour utiliser le certificat, ajouter les lignes suivantes après server_name dans votre configuration nginx :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 443 ssl http2;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl on;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate /etc/letsencrypt/live/votredomaine.com/fullchain.pem;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate_key /etc/letsencrypt/live/votredomaine.com/privkey.pem;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ```&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pour terminer, il ne vous reste plus qu’à modifier à nouveau l’url de votre blog dans le fichier config.js et à ajouter un block server pour faire la redirection http vers https :&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;server {&#10;listen 80;&#10;server_name votredomaine.com www.votredomaine.com;&#10;return 301 https://votredomaine.com$request_uri;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;}&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Configurer Nginx en reverse-proxy avec Let's Encrypt pour Proxmox 4</title><link>https://jesuisadmin.fr/configurer-nginx-reverse-proxy-lets-encrypt-proxmox/</link><pubDate>Wed, 22 Mar 2017 18:33:31 +0000</pubDate><guid>https://jesuisadmin.fr/configurer-nginx-reverse-proxy-lets-encrypt-proxmox/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2018/07/Proxmox-nginx-1.jpg" alt="Featured image of post Configurer Nginx en reverse-proxy avec Let's Encrypt pour Proxmox 4" /&gt;&lt;p&gt;Il y a plusieurs solutions pour sécuriser l’accès à l’interface Proxmox, mais si vous avez l’habitude tout comme moi de nginx, elle est la plus intéressante car elle permet non seulement d’utiliser le domaine de votre choix pour accéder à l’interface sur le port standard 443, mais également de ne pas vous retrouver bloqué par le firewall en cas de mauvaise configuration.&lt;/p&gt;&#10;&lt;p&gt;Dans ce tutorial, nous allons donc voir comment installer nginx et comment le configurer pour obtenir un certificat Let’sEncrypt et sécuriser ainsi l’interface de Proxmox.&lt;/p&gt;&#10;&lt;p&gt;==La méthode détaillée dans cet article n&amp;rsquo;est pas compatible avec Proxmox VE 5==&lt;/p&gt;&#10;&lt;p&gt;On commence par installer nginx :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;apt-get install nginx&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Puis on créer un fichier /etc/nginx/conf.d/proxmox.conf :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;upstream&lt;/span&gt; &lt;span class="n"&gt;proxmox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;votre.serveur.hostname&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;proxmox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;votredomaine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rewrite&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;permanent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;well&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;known&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;well&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;known&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour appliquer la configuration, on utilise la commande &lt;em&gt;service nginx reload&lt;/em&gt;.&#10;On peut désormais passer à l’installation de Let’s Encrypt si ce n’est pas déjà fait.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd /opt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/letsencrypt/letsencrypt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd letsencrypt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il ne nous reste plus qu’à générer le certificat via la commande :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;./letsencrypt-auto certonly --webroot -w /var/www/html -d proxmox.votredomaine.com --email votreemail@votredomaine.com --text --agree-tos&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Let’s Encrypt va alors effectuer l’opération de vérification en créer un dossier .well-known dans /var/www/html puis générer votre certificat. Nous pouvons donc désormais ajouter les lignes suivantes à notre fichier /etc/nginx/conf.d/proxmox.conf afin d’utiliser le certificat :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 443;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name proxmox.votredomaine.com;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl on;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate /etc/letsencrypt/live/proxmox.votredomaine.com/fullchain.pem;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate_key /etc/letsencrypt/live/proxmox.votredomaine.com/privkey.pem;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_redirect off;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Upgrade $http_upgrade;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection &amp;#34;upgrade&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass https://localhost:8006;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_buffering off;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; client_max_body_size 0;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_connect_timeout 3600s;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_read_timeout 3600s;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_send_timeout 3600s;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; send_timeout 3600s;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On utilise à nouveau la commande &lt;em&gt;service nginx reload&lt;/em&gt; pour appliquer la configuration et nous pouvons désormais accéder à l’interface proxmox via l’adresse : &lt;a class="link" href="https://proxmox.votredomaine.com" target="_blank" rel="noopener"&#13;&#10; &gt;https://proxmox.votredomaine.com&lt;/a&gt;.&#10;Vous pouvez ajouter un cron pour renouveler automatiquement votre certificat letsencrypt tous les 30 jours :&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;0 0 1 * * /opt/letsencrypt-auto certonly --webroot -w /var/www/html -d proxmox.votredomaine.com --email votreemail@votredomaine.com --text --agree-tos&lt;/code&gt;&lt;/p&gt;&#10;</description></item><item><title>EasyEngine - Nginx et WordPress en quelques minutes</title><link>https://jesuisadmin.fr/easyengine-nginx-wordpress/</link><pubDate>Sun, 05 Feb 2017 00:45:11 +0000</pubDate><guid>https://jesuisadmin.fr/easyengine-nginx-wordpress/</guid><description>&lt;img src="https://jesuisadmin.fr/images/2017/08/Screenshot_4.png" alt="Featured image of post EasyEngine - Nginx et WordPress en quelques minutes" /&gt;&lt;p&gt;J’utilise un certain nombre d’outils au quotidien pour installer des serveurs, et EasyEngine est sans aucun doute dans le top 3. Je vais donc vous présenter se petit outil à utiliser en ligne de commande sur votre serveur debian/ubuntu pour installer Nginx avec/sans WordPress en quelques minutes.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;EasyEngine doit être installé sur un nouveau serveur, n’ayant déjà Apache ou MySQL.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Pour installer EasyEngine, utilisez la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -qO ee rt.cx/ee &amp;amp;&amp;amp; sudo bash ee&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il vous sera uniquement demandé un nom d’utilisateur et votre adresse mail. Une fois l’installation terminée, pour vérifier son fonctionnement, utilisez simplement la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ee&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous aurez alors la liste des arguments disponibles. Pour installer WordPress sur un domaine par example :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ee site create votredomaine.fr --wp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lors du premier lancement de cette commande, EasyEngine va installer Nginx, php et MariaDB puis WordPress. Vous pouvez ajoutez des arguments supplémentaires après “–wp” afin d’ajouter une solution de cache, choisir php7 plutôt que php5 ou utiliser letsencrypt pour générer un certificat SSL.&lt;/p&gt;&#10;&lt;p&gt;Dans le cas du blog, j’ai utilisé la commande :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ee site create jesuisadmin.fr --wpredis --php7 --letsencrypt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;–wpredis&lt;/strong&gt; afin d’installer WordPress avec Redis-server et le plugin Redis-object-cache&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;–php7&lt;/strong&gt; pour installer php7&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;–letsencrypt&lt;/strong&gt; pour générer et installer un certificat letsencrypt.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Vous pouvez retrouvez cette liste des commandes disponibles sur le &lt;a class="link" href="https://easyengine.io/docs/commands/" target="_blank" rel="noopener"&#13;&#10; &gt;site d’EasyEngine&lt;/a&gt;.&lt;/p&gt;&#10;</description></item></channel></rss>