1 line
184 KiB
JSON
Executable File
1 line
184 KiB
JSON
Executable File
{"config":{"lang":["fr"],"separator":"[\\s\\-\\.]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Bienvenue sur Djeex Lab","text":"<p>Djeex Lab est le site regroupant la documentation de mon home lab, pens\u00e9 \u00e0 l'origine pour retrouver facilement mes configurations et commandes.</p> <p>Actuellement, Djeex Lab est compos\u00e9 des \u00e9l\u00e9ments suivants :</p> <ul> <li>Un NAS maison</li> <li>Un mini PC \u00e0 base de N100 maison</li> <li>Un VPS de monitoring</li> <li>Un VPS de production</li> </ul>"},{"location":"#a-propos-de-la-documentation","title":"A propos de la documentation","text":"<p>La documentation fournie ici est distribu\u00e9e \u00e0 titre exp\u00e9rimentale, dans un esprit de partage d'exp\u00e9rience. Elle n'est en aucun cas faite pour construire une architecture de production ou pour de l'industrialisation. Il est possible qu'elle contienne des erreurs et/ou des approximations.</p> <p>Evidemment l'usage de cette documentation doit strictement se limiter au cadre l\u00e9gal.</p>"},{"location":"#documentation-disponible-ou-en-cours","title":"Documentation disponible ou en cours","text":"<ul> <li> Serveex votre home lab \u00e0 d\u00e9ployer pas \u00e0 pas</li> <li> Stockeex votre NAS pour stocker et acc\u00e9der \u00e0 vos donn\u00e9es (en cours...)</li> </ul>"},{"location":"#contribuer","title":"Contribuer","text":"<p>Cette doc n'est pas exempt d'erreurs ou de points obscurs, vous \u00eates libre de la la corriger et/ou d'apporter vos lumi\u00e8res.</p> <ul> <li> <p> Djeex/DjeexLab</p> <p> Contribuer</p> </li> </ul>"},{"location":"dns/","title":"Noms de domaines et zone DNS","text":"<p>Objectifs</p> <ul> <li>Comprendre le fonctionnement d'un serveur DNS</li> <li>Comprendre comment modifier une zone DNS</li> </ul>"},{"location":"dns/#introduction","title":"Introduction","text":"<p>Lorsque vous naviguez sur un site, ou une application, des requ\u00eates sont \u00e9mises vers un ou des domaines afin d'afficher le contenu de votre page. Votre appareil ne connait pas les adresses IP de ces serveurs \u00e0 joindre. Pour les connaitre, il va contacter un serveur de nom (Domain Name Server) qui lui va lui r\u00e9pondre avec l'adresse IP la plus \u00e0 jour pour le domaine de la requ\u00eate. </p> <p>La zone DNS, c'est une sorte de registre avec des panneaux qui redirige vos requ\u00eates vers la bonne destination.</p> <p></p>"},{"location":"dns/#la-zone-dns","title":"La zone DNS","text":"<p>Lorsque vous r\u00e9servez un domaine chez votre registrar (cloudflare, ovh...), ce registrar vous attribue une zone DNS que vous pouvez personnaliser.</p> <p>Vous pouvez rentrer des enregistrements dans cette zone DNS qui permettront d'orienter les requ\u00eates au bon endroit. Vous trouverez plus d'information ici.</p> <p>Exemple d'une zone DNS du domaine mondomaine.fr:</p> <pre><code>$TTL 3600\n@ IN SOA ns1.dns.me. dns.net. (2024051800 86400 3600 3600000 60)\n IN NS ns1.dns.me.\n IN NS ns2.dns.me.\n IN A 203.0.113.0\nwww IN CNAME mondomaine.fr\nsousdomaine IN CNAME mondomaine.fr\n</code></pre> <p>Dans cet exemple :</p> <ul> <li><code>$TTL 3600</code> indique aux diff\u00e9rents serveurs de noms de la plan\u00e8te que les enregistrement sont valides 1h (et qu'au-del\u00e0 il faudra rev\"rifier).</li> <li><code>IN SOA ns1.dns.me. dns.net. (2024051800 86400 3600 3600000 60)</code> indique que <code>ns1.dns.me</code> est le serveur dns principal, et les nombres sont des indications de rafraichissement.</li> <li><code>IN NS ns1.dns.me.</code> et <code>IN NS ns2.dns.me.</code> indique que <code>ns1.dns.me</code> et <code>ns2.dns.me</code> sont des serveurs de noms pour ce domaine.</li> <li><code>IN A 203.0.113.0</code> signifie que <code>mondomaine.fr</code> pointe vers l'IP <code>203.0.113.0</code></li> <li><code>sousdomaine IN CNAME mondomaine.fr</code> signifie que <code>sousdomaine.mondomaine.fr</code> pointe vers <code>mondomaine.fr</code> et donc vers l'IP <code>203.0.113.0</code>.</li> </ul> <p>Ainsi, si vous choisissez de pointer le domaine <code>mondomaine.fr</code> vers votre serveur, vous pouvez le faire en ajoutant un enregistrement <code>A</code> pointant vers l'IP publique de votre serveur.</p> <p>Attention</p> <p>Si votre serveur est chez vous:</p> <ul> <li>l'IP publique est celle de votre box internet. Assurez-vous aupr\u00e8s de votre op\u00e9rateur que cette IP est fixe ou configurez un DDNS</li> <li>assurez-vous d'avoir redirig\u00e9 le port 443 vers le port d'\u00e9coute de votre serveur.</li> </ul> <p>Et si vous ajoutez un sous-domaine qui doit pointer vers votre serveur, vous pouvez utiliser un enregistrement <code>CNAME</code> vers <code>mondomaine.fr</code>.</p> <p>Pourquoi ne pas utiliser un enregistrement A pour le sous-domaine ?</p> <p>Si votre sous domaine pointe sur le meme serveur que mondomaine.fr, il vaut mieux utiliser un enregistrement <code>CNAME</code> car en cas de changement d'IP du serveur, il n'y aura aucune autre manipulation \u00e0 faire.</p> <p>La plupart des registrar proposent des interfaces plus lisbles pour modifier ces informations. Renseignez-vous aupr\u00e8s de la documentation de votre registrar.</p>"},{"location":"nat/","title":"Routeur et NAT","text":"<p>Objectifs</p> <ul> <li>Comprendre le principe de la redirection de port</li> <li>Savoir configurer le NAT de son routeur</li> <li>Savoir \u00e9mettre des baux DHCP (IP fixes)</li> </ul> <p></p>"},{"location":"nat/#quest-ce-quun-port","title":"Qu'est-ce qu'un \"port\" ?","text":"<p>Les ports sont diff\u00e9rents canaux par lesquels votre routeur envoie et re\u00e7oit des donn\u00e9es, ce qui permet d'utiliser plusieurs services en meme temps. Lorsqu'il re\u00e7oit une donn\u00e9e via un port, otre routeur transmet ensuite les donn\u00e9es \u00e0 la machine qui : - soit a \u00e9mis la requ\u00eate de d\u00e9part - soit est configur\u00e9e pour recevoir les donn\u00e9es re\u00e7ues par un port sp\u00e9cifique du routeur</p> <p>Votre routeur dispose de plus de 65 000 ports \u00e0 utiliser.</p> <p>Certains programmes et applications sont con\u00e7us pour utiliser des ports sp\u00e9cifiques. Par exemple, lorsque votre r\u00e9seau envoie des donn\u00e9es \u00e0 partir d'une page HTML, le routeur les recevra via le port num\u00e9ro 80 (non s\u00e9curis\u00e9) ou 443 (s\u00e9curis\u00e9 via SSL). </p> <p>Le routeur sert donc de plateforme d'aiguillage des donn\u00e9es entre internet et votre machine.</p>"},{"location":"nat/#la-redirection-de-port","title":"La redirection de port","text":"<p>Rediriger un <code>port</code>, c'est \u00e9mettre une r\u00e8gle qui sp\u00e9cifie que telle <code>source</code> peut envoyer des donn\u00e9es \u00e0 tel <code>port</code> de votre routeur, qui redirigera les donn\u00e9es sur tel <code>port</code> de telle <code>machine</code>. Les <code>sources</code> et la <code>machine de destination</code> sont identifi\u00e9es par leur <code>adresse IP</code>.</p> Variable Description exemple <code>machine source</code> IP de la machine source (sur internet) <code>All</code><code>123.45.67.89</code> <code>port source</code> Port d'arriv\u00e9e sur le routeur <code>443</code> <code>port de destination</code> Port d'arriv\u00e9e sur la machine de destination <code>3000</code> <code>machine de destination</code> IP de la machine de destination (sur votre r\u00e9seau local) <code>192.168.1.50</code> <p>Selon ce tableau, si on enl\u00e8ve le <code>All</code> et que l'on garde l'ip <code>123.45.67.89</code> en provenance d'internet, tout le traffic envoy\u00e9 depuis cette IP sur le port <code>443</code> du routeur sera redirig\u00e9 vers le port <code>3000</code> de l'IP locale <code>192.168.1.50</code>.</p> <p>Si on enl\u00e8ve l'IP de l'exemple et qu'on laisse le <code>All</code>, tout le traffic d'internet envoy\u00e9 au port <code>443</code> du routeur sera redirig\u00e9 vers le port <code>3000</code> de l'IP locale <code>192.168.1.50</code>.</p> <p>C'est utile si par exemple vous avez un serveur qui a un service qui n\u00e9cessite d'etre accessible par internet. Par exemple, un site web. Le web utilise le port <code>80</code> (non s\u00e9curis\u00e9) et le port 443 (s\u00e9curis\u00e9 par certificat SSL) pour communiquer. Ainsi, si je veux que mon site internet soit accessible, je vais faire en sorte que lorsqu'on tape le nom de domaine de mon site, le routeur redirige bien vers mon serveur local (avec l'exemple de l'IP locale du tableau). Par exemple, imaginons que mon service est sur le port <code>3000</code> de mon routeur (accessible en local via <code>http://192.168.1.50:3000</code>), je vais donc rediriger comme dans l'exemple toutes les sources (All) qui passent par le port <code>443</code> du routeur vers le port <code>3000</code> de mon serveur local.</p> <p>Attention</p> <p>Si vous avez plusieurs services \u00e0 rendre accessible, avec par exemple <code>sousdomaine1.mondomaine.fr</code> et <code>sousdomaine2.mondomaine.fr</code>, votre routeur ne peut pas rediriger vers plusieurs port selon la requ\u00eate. Vous devrez utiliser un Reverse Proxy qui selon la requete redirigera vers le bon service de votre serveur.</p>"},{"location":"nat/#le-dhcp","title":"Le DHCP","text":"<p>A chaque fois que vous connectez un appareil sur votre r\u00e9seau local, votre routeur lui attribue une adresse IP via les r\u00e8gles DHCP. Celle-ci est al\u00e9atoire selon des r\u00e8gles pr\u00e9d\u00e9finies. A chaque red\u00e9marrage de l'appareil, l'IP peut changer. C'est embetant si vous exposez un service et que vous avez une redirection de port dans votre routeur car si l'IP change, la redirection enverra les donn\u00e9es dans le vide. Le serveur DHCP de votre box permet d'attribuer une IP fixe \u00e0 un appareil.</p> <p>Chaque appareil a une adresse physique dite \"adressse MAC\". Pour fixer l'IP, vous devez connaitre l'adresse physique de votre appareil (visible dans votre routeur si votre machine est connect\u00e9e au r\u00e9seau), et lui attribuer une adresse IP fixe, ce qu'on appel un \"bail DHCP fixe\".</p> <p>Ainsi, l'IP de votre machine ne changera jamais et la redirection de port sera toujours effective.</p> Variable Description Exemple <code>IP</code> IP locale fixe \u00e0 attribuer <code>192.168.1.50</code> <code>Adresse Mac</code> Adresse physique de la machine <code>5E:FF:56:A2:AF:15</code> <p>Pour plus d'information sur ces sujets, consultez la documentation de votre routeur.</p>"},{"location":"samba/","title":"Samba","text":"<p>Samba est un protocole permettant d'acc\u00e8der \u00e0 un dossier situ\u00e9 sur un disque r\u00e9seau. Il peut \u00eatre configur\u00e9 sous Mac, Windows ou Linux.</p> <p>De nombreux tutorials existent pour configurer Samba sous windows ou sur un NAS type Synology, ici nous nous concentrons sur Debian.</p> <p>Objectifs</p> <ul> <li>Cr\u00e9er un dossier r\u00e9seau sur une machine distante</li> <li>Acc\u00e9der au dossier r\u00e9seau sur notre serveur</li> </ul> <p></p>"},{"location":"samba/#partager-un-dossier-reseau","title":"Partager un dossier r\u00e9seau","text":"<p>Info</p> <p>Ici, nous allons partager le dossier <code>/video</code> d'une machine distant que nous appelerons <code>machine-distante</code>. Nous acc\u00e9derons \u00e0 ce dossier par la machine nomm\u00e9e <code>machine-locale</code>. L'utilisateur de connexion au disque r\u00e9seau sera <code>sambauser</code>.</p>"},{"location":"samba/#installer-le-serveur-samba","title":"Installer le serveur samba","text":"<pre><code>$ sudo apt update && sudo apt upgrade\n$ sudo apt install samba smbclient cifs-utils\n</code></pre>"},{"location":"samba/#creer-le-dossier-video","title":"Cr\u00e9er le dossier <code>/video</code>","text":"<pre><code>$ sudo mkdir /video\n</code></pre>"},{"location":"samba/#configuration-du-partage","title":"Configuration du partage","text":"<p>Ensuite nous allons \u00e9diter le fichier /etc/samba/smb.conf</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <pre><code>$ sudo vim /etc/samba/smb.conf\n</code></pre> <p>Localisez la variable <code>workgroup</code> puis passez en mode modification en appuyant sur <code>i</code> et nommez votre worgroup, par exemple <code>workgroup = WORKGROUP</code></p> <p>Puis allez \u00e0 la fin du fichier et collez la configuration suivante</p> <p><pre><code>[video]\n comment = Dossier video\n path = /video\n writable = yes\n guest ok = no\n valid users = @smbshare\n force create mode = 770\n force directory mode = 770\n inherit permissions = yes\n</code></pre> Appuyez sur <code>Echap</code> pour quitter le mode notification puis tapez <code>:x</code> et appuyez sur <code>Entr\u00e9e</code> pour sauvegarder et quitter.</p>"},{"location":"samba/#creer-un-utilisateur-et-un-groupe-pour-samba","title":"Cr\u00e9er un utilisateur et un groupe pour Samba","text":"<p>Comme nous avons configfur\u00e9 un partage s\u00e9curis\u00e9, nous allons devoir cr\u00e9er un utilisateur et un groupe pour pouvoir y acc\u00e9der \u00e0 distance.</p> <p>Creez le groupe. <pre><code>$ sudo groupadd smbshare\n</code></pre></p> <p>Nous allons maintenant permettre au groupe d'avoir le controle sur le dossier <code>/video</code>.</p> <pre><code>$ sudo chgrp -R smbshare /video\n</code></pre> <p>Et maintenant nous allons donner les permissions n\u00e9cessaires aux dossiers et fichier h\u00e9rit\u00e9s.</p> <pre><code>$ sudo chmod 2775 /public\n</code></pre> <p>A pr\u00e9sent nous allons ajouter un utilisateur nologin c'est \u00e0 dire que cet utilisateur ne pourra pas se connecter sur le serveur pour faire des op\u00e9rations, mais pourra tout de meme se connecter au service samba.</p> <pre><code>$ sudo useradd -M -s /sbin/nologin sambauser\n</code></pre> <p>Puis nous ajoutons l'utilisateur au groupe <code>sambashare</code> que nous avons cr\u00e9\u00e9 pr\u00e9c\u00e9demment.</p> <p><pre><code>$ sudo usermod -aG smbshare sambauser\n</code></pre> Et nous allons configurer un mot de passe.</p> <p><pre><code>$ sudo smbpasswd -a sambauser\n</code></pre> Et enfin nous allons activer le compte que nous venons de cr\u00e9er.</p> <pre><code>$ sudo smbpasswd -e sambauser\n</code></pre> <p>Attention</p> <p>Si vous utilisez un pare-feu, comme ufw, n'oubliez pas d'autoriser les IP des machines qui acc\u00e9deront \u00e0 votre dossier partag\u00e9 :</p> <pre><code>$ sudo ufw allow from ipdelamachine to any app Samba\n</code></pre>"},{"location":"samba/#acceder-a-un-dossier-partage","title":"Acc\u00e9der \u00e0 un dossier partag\u00e9","text":"<p>Info</p> <p>A pr\u00e9sent, nous sommes sur votre <code>machine-locale</code> qui n\u00e9cessite d'acc\u00e9der au dossier partag\u00e9 <code>/video</code> pr\u00e9sent sur la <code>machine-distante</code>.</p>"},{"location":"samba/#installer-les-package-necessaires","title":"Installer les package n\u00e9cessaires","text":"<pre><code>$ sudo apt update && sudo apt upgrade\n$ sudo apt install cifs-utils\n</code></pre>"},{"location":"samba/#creer-le-dossier-de-destination","title":"Cr\u00e9er le dossier de destination","text":"<p>Nous allons cr\u00e9er un dossier sur notre serveur sur lequel sera mont\u00e9 le dossier partag\u00e9 de notre <code>machine-distante. C'est \u00e0 dire que dans ce dossier nous retrouverons le contenu du dossier partag\u00e9 de notre</code>machine-distante<code>. Ici nous appellerons ce dossier</code>/mnt/video`.</p> <pre><code>$ sudo mkdir /mnt/video\n</code></pre>"},{"location":"samba/#preparer-le-fichier-credentials","title":"Pr\u00e9parer le fichier .credentials","text":"<p>Afin de ne pas avoir syst\u00e9matiquement \u00e0 rentrer notre utilisateur et mot de passe, nous allons cr\u00e9er un fichier .credentials` stockant ces informations.</p> <p>Nous allons le cr\u00e9er dans le dossier <code>/smb</code>.</p> <p><pre><code>$ sudo mkdir /smb\n$ sudo vi /smb/.credentials\n</code></pre> Passez en mode modification en appuyant sur <code>i</code> et configurez comme suit :</p> <pre><code>username=smbuser\npassword=motdepasse\n</code></pre> <ul> <li><code>smbuser</code> : L'utilisateur que nous avons configur\u00e9 sur la <code>machine-distante</code></li> <li><code>motdepasse</code> : Le mot de passe que nous avons configur\u00e9 sur la <code>machine-distante</code></li> </ul> <p>Appuyez sur <code>Echap</code> afin de quitter le mode modification, puis tapez <code>:x</code> et appuyez sur <code>Entr\u00e9e</code> pour sauvegarder et quitter.</p> <p>Nous allons modifier les permissions du dossier afin que seul le propri\u00e9taire puis lire et \u00e9crire dans ce fichier.</p> <pre><code>$ sudo chmod 600 /smb/.credentials\n</code></pre>"},{"location":"samba/#monter-le-dossier-partager","title":"Monter le dossier partager","text":"<p>A pr\u00e9sent nous allons monter le dossier.</p> <pre><code>$ sudo mount -t cifs -a credentials=/smb/.credentials //ip-machine-distante/video /mnt/video\n</code></pre> <p>Remplacez <code>ip-machine-distante</code> par l'adresse IP de votre <code>machine-distante</code></p> <p>V\u00e9rifiez que cela a fonctionn\u00e9 en tapant :</p> <p><pre><code>$ sudo mount -t cifs\n</code></pre> Vous verrez diff\u00e9rentes informations qui confirmerons le succ\u00e8s du montage.</p> <p>Et voil\u00e0, \u00e0 pr\u00e9sent vous acc\u00e9dez au dossier /video de <code>votre machine-distante</code>, depuis votre <code>machine-locale</code> !</p>"},{"location":"samba/#automatiser-le-montage-au-boot","title":"Automatiser le montage au boot","text":"<p>Par d\u00e9faut, les dossiers pattag\u00e9s ne sont pas connect\u00e9s automatiquement au red\u00e9marrage. Pour autoamtiser cet aspect, nous allons modifier le fichier <code>/etc/fstab</code>.</p> <p>D'abord, sauvegardons notre fichier <code>fstab</code>.</p> <pre><code>$ sudo cp /etc/fstab /etc/fstab.bak\n</code></pre> <p>Puis nous allons ajouter une ligne \u00e0 la fin du fichier comportant les informations de montages dans le fichier <code>fstab</code>.</p> <pre><code>$ sudo echo //ip-machine-distante/video /mnt/video cifs _netdev,nofail,credentials=/smb/.credentials,x-systemd.automount,x-systemd.device-timeout=15 0 0 >> /etc/fstab\n</code></pre> <p>Red\u00e9marrez.</p> <pre><code>$ sudo reboot\n</code></pre> <p>Une fois red\u00e9marr\u00e9, v\u00e9rifiez que le montage est correct</p> <pre><code>$ sudo mount -t cifs\n</code></pre> <p>Et voil\u00e0 !</p>"},{"location":"samba/#demonter-le-dossier-partage","title":"D\u00e9monter le dossier partag\u00e9","text":"<pre><code>$ sudo umount -t cifs /mnt/video\n</code></pre>"},{"location":"serveex/adguard/","title":"Adguard Home","text":"<p>Objectif</p> <ul> <li>Installer et d\u00e9ployer Adguard</li> <li>Exposer Adguard</li> <li>S\u00e9curiser les requ\u00eates avec SSL/TLS</li> <li>Configurer les appareils clients</li> </ul> <p>AdGuard Home est un serveur DNS anti-pub et anti-tra\u00e7age qui fonctionne au niveau du syst\u00e8me. Une fois configur\u00e9, il couvrira TOUS vos appareils domestiques et vous n'aurezbesoin d'aucun logiciel c\u00f4t\u00e9 client pour cela.</p> <p>Il fonctionne comme un serveur DNS qui redirige les domaines de suivi vers un \u00abblack hole\u00bb, emp\u00eachant ainsi vos appareils de se connecter \u00e0 ces serveurs. </p> <p>En pratique, une fois en place, il vous faudra juste configurer les serveurs DNS de vos appareils, pour que ces derniers l'utilisent.</p> <p>Rappel sur le fonctionnement d'un DNS :</p> <p>Lorsque vous naviguez sur un site, ou une application, des requ\u00eates sont \u00e9mises vers un ou des domaines afin d'afficher le contenu de votre page. Les publicit\u00e9s notamment. Votre appareil ne connait pas les adresses IP de ces serveurs \u00e0 joindre. Pour les connaitre, il va contacter un serveur de nom (Domain Name Server) qui lui va lui r\u00e9pondre avec l'adresse IP la plus \u00e0 jour pour le domaine de la requ\u00eate. </p> <p>Par d\u00e9faut, votre appareil utilise le serveur votre fournisseur d'acc\u00e8s, param\u00e9tr\u00e9 dans votre box ou directement sur le CGNAT de votre op\u00e9rateur si appareil mobile. Cela peut etre chang\u00e9 directement dans les r\u00e9glages de votre navigateur, mais aussi dans le syst\u00e8me de votre appareil, et parfois directement dans votre box si votre FAI le permet.</p> <p>Adguard lui, va s'intercaler entre le serveur de nom et votre appareil. Si vous param\u00e9trez vos appareil, ils contacteront d'abord adguard qui filtrera les requetes, via des listes r\u00e9guli\u00e8rement mises \u00e0 jour :</p> <ul> <li>Si le domaine n'est pas dans une blocklist, il contactera des serveurs de noms g\u00e9n\u00e9riques (dit upstreams) et r\u00e9pondra vers vos appareils avec l'adresse IP recherch\u00e9e.</li> <li>Si le domaine est dans une blocklist, il ne contactera pas les DNS upstream et ne r\u00e9pondre pas \u00e0 vos appareils. Le contenu affili\u00e9 \u00e0 cette requete ne s'affichera pas.</li> </ul> <p>C'est ainsi que les pubs et domaines malveillants sont bloqu\u00e9s : leurs domaines sont pr\u00e9sents dans la blocklist, le reste de la page lui charge correctement.</p> <p></p>"},{"location":"serveex/adguard/#installation","title":"Installation","text":"<p>Structure des dossiers : </p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 adguard\n \u251c\u2500\u2500 confdir\n \u251c\u2500\u2500 workdir\n \u251c\u2500\u2500 compose.yaml\n \u2514\u2500\u2500 .env\n</code></pre> <p>Note</p> <p>Nous monterons aussi le dossier <code>/docker/swag/config/etc/letsencrypt</code> afin d'avoir acc\u00e8s au certificat SSL de Swag.</p> <p>Ouvrez Dockge, et cliquez sur <code>compose</code></p> <p>Nommez la stack <code>adguard</code> et copiez la configuration ci-dessous</p> <pre><code>version: \"2\"\nservices:\n\n adguardhome:\n container_name: adguard\n image: adguard/adguardhome\n restart: unless-stopped\n ports:\n - 53:53/udp\n - 8080:80/tcp\n - 4443:443/tcp\n - 853:853/tcp\n - 3000:3000/tcp\n volumes:\n - /docker/adguardhome/confdir:/opt/adguardhome/conf\n - /docker/adguardhome/workdir:/opt/adguardhome/work\n - /docker/swag/config/etc/letsencrypt:/swag-ssl:ro\n networks:\n - swag\n\nnetworks:\n swag:\n name: swag_default\n external: true\n</code></pre> <p>Note</p> <p>Nous avons ajout\u00e9 le r\u00e9seau de Swag afin que les deux puissent communiquer ensemble. Assurez-vous que le nom du r\u00e9seau soit correct. Nous partons du principe qu'il se nomme <code>swag_default</code></p> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n adguardhome:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>D\u00e9ployez la stack.</p> <p>Rendez-vous sur <code>http//ipduserveur:3000</code> et suivez les instructions</p> <p>Et voil\u00e0, vous avez d\u00e9ploy\u00e9 Adguard !</p>"},{"location":"serveex/adguard/#exposer-adguard-avec-swag","title":"Exposer Adguard avec Swag","text":"<p>Pour \u00eatre utilisable hors de chez vous, vous devez exposer Adguard</p> <p>Au pr\u00e9alable</p> <p>Nous partons du principe que vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>adguard.mondomaine.fr</code> avec pour <code>CNAME</code> <code>mondomaine.fr</code> et que que vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT. Redirigez \u00e9galement le port <code>53</code> et le port <code>853</code> vers votre serveur. Ces ports serviront \u00e0 router les requ\u00eates DNS.</p> <p>Tunnels cloudflare</p> <p>N'utilisez pas les tunnels cloudflare pour exposer Adguard, et d\u00e9sactivez tout proxy.</p> <p>Cr\u00e9ez et ouvrez le fichier <code>adguard.subdomain.conf</code></p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/adguard.subdomain.conf\n</code></pre> <p>Editez le fichier en appuyant sur <code>i</code> puis copiez la configuration ci-dessous :</p> <pre><code>## Version 2023/05/31\n# make sure that your adguard container is named adguard\n# make sure that your dns has a cname set for adguard\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name adguard.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n #if ($lan-ip = yes) { set $geo-whitelist yes; }\n #if ($geo-whitelist = no) { return 404; }\n if ($geo-blacklist = no) { return 404; }\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app adguard;\n set $upstream_port 3000;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location /control {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app adguard;\n set $upstream_port 3000;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location /dns-query {\n # to properly use this please set `allow_unencrypted_doh: true` and `force_https: false` in adguard\n # see https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#configuration-file\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app adguard;\n set $upstream_port 3000;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik en ouvrant en retirant les <code>#</code> devant <code>include /config/nginx/authentik-server.conf;</code> et <code>include /config/nginx/authentik-location.conf;</code> N'oubliez pas de cr\u00e9er une application et un fournisseur dans Authentik.</p> <p>Il vous faudra exclure l'url https://adguard.mondomaine.fr/dns-query de l'authentification :</p> <ul> <li>Editez le fournisseur d'Adguard</li> <li>Dans param\u00e8tres avanc\u00e9s du protocole > chemins authentifi\u00e9s, saisissez <code>^/dns-query</code></li> </ul> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code></p> <p>Et voil\u00e0, vous exposez Adguard \u00e0 pr\u00e9sent !</p>"},{"location":"serveex/adguard/#configurer-le-chiffrement-ssltls","title":"Configurer le chiffrement SSL/TLS","text":"<p>Le chiffrement est essentiel si vous souhaitez garder priv\u00e9es les requ\u00eates que vous faites vers adguard. Chiffrer ces requ\u00eates c'est vous assurez que personne, meme votre FAI ne connaissent votre historique. C'est aussi vous assurer que personne d'autre que votre serveur vous r\u00e9pond.</p> <p>Afin de configurer le chiffrement :</p> <ul> <li>Allez dans param\u00e8tre puis dans chiffrement.</li> <li>Parametrez comme suit</li> </ul> <p></p> <ul> <li>Puis en dessous, dans la section certificats cochez D\u00e9finir un emplacement de fichier du certificat</li> <li>Dans le champs de saisie, mettez <code>/swag-ssl/live/mondomaine.fr/fullchain.pem</code> en rempla\u00e7ant <code>mondomaine.fr</code> par votre domaine principal.</li> <li>Dans cl\u00e9 priv\u00e9e cochez D\u00e9finir un fichier pour la clef priv\u00e9e</li> <li>Dans le champs de saisie, mettez <code>/swag-ssl/live/mondomaine.fr/privkey.pem</code> en rempla\u00e7ant <code>mondomaine.fr</code> par votre domaine principal.</li> <li>Validez</li> </ul> <p>Et voil\u00e0 ! Vous avez prot\u00e9g\u00e9 vos futures requ\u00eates DNS !</p>"},{"location":"serveex/adguard/#configurer-les-appareils","title":"Configurer les appareils","text":"<p>Pour configurer vos appareils, vous avez plusieurs choix (que vous pouvez cumuler).</p>"},{"location":"serveex/adguard/#securiser-le-reseau-local","title":"S\u00e9curiser le r\u00e9seau local","text":"<p>Vous pouvez s\u00e9curiser votre r\u00e9seau local avec adguard en configurant votre box pour que chaque requ\u00eate DNS soit dirig\u00e9e par d\u00e9faut vers adguard plutot que les services de votre FAI. Attention, votre box doit pouvoir permettre le changement de DNS (Orange ne le permet pas). </p> <p>G\u00e9n\u00e9ralement cette option est dans les param\u00e8tres DHCP de votre box. Pensez bien \u00e0 ajouter un serveur secondaire tel que :</p> <ul> <li>Cloudlare : <code>1.1.1.1</code></li> <li>Google : <code>8.8.8.8</code></li> </ul> <p>En effet, sans cela, si votre serveur tombe, vos appareils n'arriveraient plus \u00e0 se connecter \u00e0 internet.</p> <p>Note</p> <p>Des appareils peuvent avoir un autre DNS param\u00e9tr\u00e9 et ne pas utiliser ceux de la box.</p>"},{"location":"serveex/adguard/#forcer-un-navigateur-a-utiliser-adguard","title":"Forcer un navigateur \u00e0 utiliser Adguard","text":"<p>Dans votre navigateur, vous pouvez configurer un DNS pour le forcer \u00e0 utiliser adguard home. Dans les param\u00e8tres, il vous faudra renseigner l'adresse<code>https://adguard.mondomaine.fr/dns-query</code></p>"},{"location":"serveex/adguard/#windows-parametrer-adguard-au-niveau-systeme","title":"Windows, param\u00e9trer Adguard au niveau syst\u00e8me","text":"<p>Dans windows, vous devez param\u00e9trer Adguard pour chaque carte r\u00e9seau que vous souhaitez utiliser. </p> <ul> <li>Rendez vous dans accueil > R\u00e9seau et internet > et choisissez votre carte r\u00e9seau \u00e0 modifier</li> <li>Cliquez sur modifier les DNS (parfois dans propri\u00e9t\u00e9 du mat\u00e9riel)</li> <li>Choisissez <code>Manuel</code></li> <li>Activez IPv4</li> <li>Renseignez l'IP publique de votre serveur (celle accessible depuis internet)</li> <li>Activez DNS sur HTTPS (mod\u00e8le manuel)</li> <li>D\u00e9sactivez retour au texte en clair</li> <li>Enregistrez</li> </ul> <p>Tous les programmes de votre machine utilisant cette carte r\u00e9seau seront filtr\u00e9s par Adguard.</p>"},{"location":"serveex/adguard/#ajouter-des-filtres","title":"Ajouter des filtres","text":"<ul> <li>Allez dans les param\u00e8tres et changez les filtres.</li> </ul>"},{"location":"serveex/authentik/","title":"Authentik","text":"<p>Objectifs</p> <ul> <li>Installer et exposer Authentik</li> <li>Param\u00e9trer le Multi-Facteur</li> <li>Prot\u00e9ger une app native ou via reverse proxy</li> </ul> <p>Authentik est un outil d'authentification unique permettant de vous logger une seule fois sur les plateformes compatibles OpenID. Il permet \u00e9galement de s\u00e9curiser l'acc\u00e8s aux services que vous exposez, en s'injectant via SWAG aux requetes vers vos services. </p> <p>Ainsi, si vous exposez Dockge sur internet via <code>dockge.mondomaine.fr</code>, au moment de l'acc\u00e8s \u00e0 cette page, vous tomberez sur une page de login d'authentik. Si vous avez d\u00e9j\u00e0 \u00e9t\u00e9 identifi\u00e9 sur un autre service s\u00e9curis\u00e9 par authentik auparavant, alors vous serez d\u00e9j\u00e0 identifi\u00e9. cela permet d'avoir \u00e0 vous identifiez qu'une seule fois par jour sur l'ensemble des services prot\u00e9g\u00e9s par authentik.</p> <p>Authentik permet aussi d'utiliser le multi-facteur, notamment par TOTP (code g\u00e9n\u00e9r\u00e9 par une application d'authentification de votre choix. Enfin, authentik permet aussi de se connecter directement via un compte Microsoft ou Google, si vous avez configur\u00e9 une application d'un de ces services.</p> <p>C'est une bonne mani\u00e8re de se passer de VPN pour exposer vos services, et d'exposer des services qui ne sont pas prot\u00e9g\u00e9s par du MFA voir pas prot\u00e9g\u00e9s par des login (comme le dashboard de swag). </p> <p>Authentik dipose d'une doc tr\u00e8s fournie et des fabuleux tuto de Cooptonian. Ici, nous montrerons juste les bases, avec l'exemple de l'exposition de Dockge.</p> <p>Deux modes principaux sont \u00e0 connaitre: </p> <ul> <li>Le premier permet \u00e0 une application qui dispose nativement d'une int\u00e9gration avec du SSO compatible OpenID de se connecter directement \u00e0 Authentik. C'est la solution \u00e0 privil\u00e9gier car elle permet de laisser l'application d\u00e9cider de ce qui est public et de ce qui est prot\u00e9g\u00e9.</li> </ul> <p></p> <ul> <li>Le second permet d'injecter une authentification via authentik grace \u00e0 SWAG avant d'arriver sur le service d\u00e9sir\u00e9.</li> </ul> <p></p> <p>Les deux modes son configurables application par application.</p>"},{"location":"serveex/authentik/#installation","title":"Installation","text":"<p>Structure des dossiers : <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 authentik\n \u251c\u2500\u2500 .env\n \u251c\u2500\u2500 compose.yml\n \u251c\u2500\u2500 media\n \u251c\u2500\u2500 certs\n \u251c\u2500\u2500 custom-template\n \u2514\u2500\u2500 ssh\n</code></pre></p> <p>Cr\u00e9ez les dossiers : </p> <pre><code>$ sudo mkdir -p /docker/authentik/media /docker/authentik/certs /docker/authentik/custom-template /docker/authentik/ssh\n</code></pre> <p>Positionnez vous dans le dossier <code>authentik</code> et g\u00e9n\u00e9rez un mot de passe et une cl\u00e9 secrete que l'on va int\u00e9grer dans le .env :</p> <pre><code>$ sudo echo \"PG_PASS=$(openssl rand 36 | base64)\" >> .env\n$ sudo echo \"AUTHENTIK_SECRET_KEY=$(openssl rand 60 | base64)\" >> .env\n</code></pre> <p>Info</p> <p>Afin de g\u00e9n\u00e9rer la cl\u00e9, nous avons cr\u00e9\u00e9 les dossiers en amont du d\u00e9ploiement via Dockge. Dockge vous empechera de cr\u00e9er une stack du meme nom dans ces dossiers s'il n'existe pas de <code>compose.yml</code>. Il faut donc cr\u00e9er un <code>compose.yml</code> vide afin que ce dernier la reconnaisse comme existante dans les stacks inactives :</p> <pre><code>$ sudo vi /docker/authentik/compose.yml\n</code></pre> <p>Ouvrez dockge, et cherchez \"authentik\" dans les stack inactives. Nommez la stack authentik et collez la configuration suivante, en changeant les chiffres de <code>{AUTHENTIK_TAG:-2024.2.3}</code> par la derni\u00e8re version de Authentik. </p> <pre><code>version: \"3.4\"\nservices:\n\n postgresql:\n image: docker.io/library/postgres:12-alpine\n container_name: authentik-postgresql\n restart: unless-stopped\n healthcheck:\n test:\n - CMD-SHELL\n - pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}\n start_period: 20s\n interval: 30s\n retries: 5\n timeout: 5s\n volumes:\n - database:/var/lib/postgresql/data\n environment:\n POSTGRES_PASSWORD: ${PG_PASS:?database password required}\n POSTGRES_USER: ${PG_USER:-authentik}\n POSTGRES_DB: ${PG_DB:-authentik}\n env_file:\n - .env\n networks:\n - swag\n\n redis:\n image: docker.io/library/redis:alpine\n container_name: authentik-redis\n command: --save 60 1 --loglevel warning\n restart: unless-stopped\n healthcheck:\n test:\n - CMD-SHELL\n - redis-cli ping | grep PONG\n start_period: 20s\n interval: 30s\n retries: 5\n timeout: 3s\n volumes:\n - redis:/data\n networks:\n - swag\n\n server:\n image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2024.2.3}\n container_name: authentik-server\n restart: unless-stopped\n command: server\n environment:\n AUTHENTIK_REDIS__HOST: redis\n AUTHENTIK_POSTGRESQL__HOST: postgresql\n AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}\n AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}\n AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}\n volumes:\n - ./media:/media\n - ./custom-templates:/templates\n - ./auth.css:/web/dist/custom.css\n - ./ssh:/authentik/.ssh\n env_file:\n - .env\n ports:\n - ${COMPOSE_PORT_HTTP:-9000}:9000\n - ${COMPOSE_PORT_HTTPS:-9443}:9443\n depends_on:\n - postgresql\n - redis\n networks:\n - swag\n\n worker:\n image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2024.2.3}\n container_name: authentik-worker\n restart: unless-stopped\n command: worker\n environment:\n AUTHENTIK_REDIS__HOST: redis\n AUTHENTIK_POSTGRESQL__HOST: postgresql\n AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}\n AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}\n AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}\n # `user: root` and the docker socket volume are optional.\n # See more for the docker socket integration here:\n # https://goauthentik.io/docs/outposts/integrations/docker\n # Removing `user: root` also prevents the worker from fixing the permissions\n # on the mounted folders, so when removing this make sure the folders have the correct UID/GID\n # (1000:1000 by default)\n user: root\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - ./media:/media\n - ./certs:/certs\n - ./custom-templates:/templates\n - ./auth.css:/web/dist/custom.css\n - ./ssh:/authentik/.ssh\n env_file:\n - .env\n depends_on:\n - postgresql\n - redis\n networks:\n - swag\n\nvolumes:\n database:\n driver: local\n redis:\n driver: local\n</code></pre> <p>Note</p> <p>Ici nous partons du principe que le r\u00e9seau de Swag est <code>swag_default</code>.</p> <p>Dans le point <code>.env</code>, les variables <code>PG_PASS</code> et <code>AUTHENTIK_SECRET_KEY</code> sont d\u00e9j\u00e0 remplies. D\u00e9ployez la stack.</p> <p>Vous pouvez alors commencer le set-up d'authentik en tappant <code>http://ipduserveur:9000/if/flow/initial-setup/</code>.</p> <p>Attention</p> <p>Il est conseill\u00e9 de cr\u00e9er un nouveau compte admin, et de d\u00e9sactiver le compte admin de base <code>akadmin</code>.</p>"},{"location":"serveex/authentik/#exposer-authentik","title":"Exposer authentik","text":"<p>Pour \u00eatre utilisable hors de chez vous, vous devez exposer authentik.</p> <p>Au pr\u00e9alable</p> <p>Nous partons du principe quer vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>auth.mondomaine.fr</code> avec pour CNAME <code>mondomaine.fr</code> et, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Ouvrez le fichier <code>authentik-server.conf</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <pre><code>$ sudo vi /docker/swag/config/nginx/authentik-server.conf\n</code></pre> <p>V\u00e9rifiez que dans chaque cas les variables ci-dessous sont correctes :</p> <pre><code>set $upstream_authentik authentik-server;\nproxy_pass http://$upstream_authentik:9000;\n</code></pre> <p>Si ce n'est pas le cas, passez en mode modification en tapant <code>i</code> et \u00e9ditez les. Sauvegardez et quittez en tapant sur <code>Echap</code> puis <code>:x</code>.</p> <p>Cr\u00e9ez le fichier <code>auth.subdomain.conf</code></p> <pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/auth.subdomain.conf\n</code></pre> <p>Appuyez sur <code>i</code> pour rentrer en mode modification puis collez la configuration suivante :</p> <pre><code>## Version 2023/05/31\n# make sure that your authentik container is named authentik-server\n# make sure that your dns has a cname set for authentik\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name auth.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n location / {\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app authentik-server;\n set $upstream_port 9000;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location ~ (/authentik)?/api {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app authentik-server;\n set $upstream_port 9000;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Sauvegardez et quittez en appuyant sue <code>Echap</code> puis en tapant <code>:x</code></p> <p>Et voil\u00e0 ! Vous pouvez acc\u00e9der \u00e0 authentik via <code>https://auth.mondomaine.fr</code></p>"},{"location":"serveex/authentik/#activer-le-multifacteur","title":"Activer le multifacteur","text":"<p>Tout l'int\u00e9r\u00eat de authentik c'est de disposer du multifacteur pour toutes les apps que l'on prot\u00e8gera.</p> <ul> <li>Rendez vous sur <code>https://auth.mondomaine.fr</code></li> <li>Identifiez-vous</li> <li>Rendez-vous dans param\u00e8tres</li> <li>Cliquez sur la section MFA</li> <li>Cliquez sur s'inscrire</li> <li>Choisissez une m\u00e9thode comme TOTP device ( dans ce cas vous devrez utilisez une app d'authentification telle que Google Authenticator par exemple)</li> <li>Suivez les \u00e9tapes</li> </ul> <p>Et voil\u00e0, vous serez invit\u00e9 \u00e0 saisir un code \u00e0 usage unique \u00e0 chaque connexion.</p>"},{"location":"serveex/authentik/#proteger-une-app-native","title":"Prot\u00e9ger une app native","text":"<p>Authentik est compatible nativement avec un certain nombre d'application, vous retrouverez la liste et le support ici</p>"},{"location":"serveex/authentik/#proteger-une-app-par-reverse-proxy","title":"Prot\u00e9ger une app par reverse proxy","text":"<p>Swag permet d'intercaler la page d'authentik entre la requ\u00eate et l'acc\u00e8s \u00e0 votre service. Pour cela il va falloir :</p> <ul> <li>Configurer le service d'authentification dans authentik.</li> <li>Configurer le fichier proxy du domaine pour que swag puisse intercaler la page.</li> </ul> <p>Pourquoi le faire alors que Dockge a d\u00e9j\u00e0 une page d'authentification ? Tout simplement parce que l'authentification HTTP utilis\u00e9e par Dockge est faible. Avec Authentik, vous aurez directement une authentification forte par MFA, et vous serez logg\u00e9 automatiquement \u00e0 toutes vos apps d\u00e9j\u00e0 prot\u00e9g\u00e9es par authentik. Cela permet de s\u00e9curiser l'acc\u00e8s \u00e0 Dockge et aux autres apps que vous prot\u00e9gerez, sans avoir \u00e0 passer par un VPN.</p>"},{"location":"serveex/authentik/#configuration-de-authentik","title":"Configuration de Authentik","text":"<ul> <li>Rendez vous dans Authentik</li> <li>Allez dans le panneau d'administration</li> <li>S\u00e9lectionnez application puis cr\u00e9er avec l'assistant</li> <li>Renseignez les champs comme suit :</li> </ul> <ul> <li>Puis \u00e0 l'\u00e9tape suivante choisissez \"Transf\u00e9rer l'authentification (application unique)\" et \u00e9ditez comme suit (attention aux flow, c'est important) :</li> </ul> <ul> <li>Ensuite, allez dans le menu \u00e0 gauche dans Avant-poste et \u00e9ditez authentik Embedded Outpost</li> </ul> <ul> <li>Ajoutez l'application <code>dockge</code> en la faisant passer \u00e0 droite et validez.</li> </ul>"},{"location":"serveex/authentik/#configuration-de-swag","title":"Configuration de SWAG","text":"<p>Ensuite rendez-vous dans le fichier <code>dockge.mondomaine.fr</code>.</p> <pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf\n</code></pre> <p>Puis entrez en modification en appuyant sur <code>i</code> et enlevez les <code>#</code> des deux lignes <code>#include /config/nginx/authentik-server.conf;</code>.</p> <p>Appuyez sur <code>Echap</code> puis tapez <code>:x</code> et appuyez sur <code>Entr\u00e9e</code> pour sauvegarder et quitter.</p> <p>Et voil\u00e0 ! En tapant <code>https://dockge.mondomaine.fr</code>, vous tomberez \u00e0 pr\u00e9sent sur la mire d'authentification de authentik. </p> <p>Astuce</p> <p>Dans Dockge, dans les param\u00e8tres, vous pouvez d\u00e9sactiver l'authentification de Dockge afin de ne pas avoir \u00e0 vous identifier deux fois. Attention, cela voudra dire que si vous avez expos\u00e9 un port sur votre r\u00e9seau local, il n'y aura plus aucune authentification.</p> <p>Note</p> <p>Vous pouvez r\u00e9p\u00e9tez l'op\u00e9ration pour chaque application que vous souhaitez prot\u00e9ger (si elle ne dipose pas d'int\u00e9gration directe avec Authentik).</p> <p>Voil\u00e0 votre nouvelle architecture :</p> <p></p>"},{"location":"serveex/authentik/#proteger-un-service-sur-un-serveur-distant","title":"Prot\u00e9ger un service sur un serveur distant","text":"<p>Dans le cas d'une application native (via OAuth 2.0 ou autre), rien ne change.</p> <p>Dans le cas d'une application non native \u00e0 prot\u00e9ger derri\u00e8re un reverse proxy, vous devrez d\u00e9ployer un avant-poste. Un avant-poste est un conteneur qui jouera le r\u00f4le de proxy local, c'est \u00e0 dire que c'est vers ce conteneur que les requ\u00eates d'authentification de vos applications seront redirig\u00e9es. C'est le seul qui est autoris\u00e9 \u00e0 dialoguer avec l'API de votre instance authentik.</p> <p>Pr\u00e9requis</p> <p>Pour d\u00e9ployer cet avant-poste, vous aurez besoin :</p> <ul> <li>D'avoir install\u00e9 docker sur votre machine distante h\u00e9bergeant le service \u00e0 prot\u00e9ger.</li> <li>Si l'application n'a pas d'int\u00e9gration native, vous aurez besoin \u00e9galement d'avoir un reverse proxy compatible. Comme partout ici, nous utiliserons SWAG.</li> </ul> <p>Ce conteneur redirigera ensuite les requetes vers votre instance Authentik principale, \u00e0 travers le web (ou votre r\u00e9seau local). Le serveur executera les controle et renverra la r\u00e9ponse \u00e0 l'avant-poste, qui bloquera ou non la connexion \u00e0 l'app prot\u00e9g\u00e9e.</p> <p></p>"},{"location":"serveex/authentik/#configuration-dauthentik","title":"Configuration d'Authentik","text":"<p>Cr\u00e9ez vos fournisseurs et applications comme nous l'avons vu plus haut.</p> <p>Puis, dans votre panneau admin, allez dans la rubrique Applications > Avant-postes, puis cr\u00e9ez un nouvel avant-poste.</p> <p>Remplissez comme suit :</p> Champs Valeur <code>Nom</code> Le nom que vous souhaitez <code>Type</code> <code>Proxy</code> <code>Int\u00e9gration</code> Laissez vide <code>Applications</code> S\u00e9lectionnez le ou les applications que vous avez cr\u00e9\u00e9es pr\u00e9c\u00e9demment <p>Dans la section <code>Param\u00e8tres avanc\u00e9s</code>, supprimez l'existant, et compl\u00e9tez comme suit :</p> <pre><code>log_level: info\ndocker_labels: null\nauthentik_host: https://domaine_de_votre_serveur_authentik/\nobject_naming_template: ak-outpost-%(name)s\nauthentik_host_insecure: false\ncontainer_image:\ndocker_network: null\ndocker_map_ports: true\ndocker_labels: null\n</code></pre> <p>Enrtegistrez et quittez.</p> <p>Sur l'\u00e9cran affichant les avant-postes cr\u00e9\u00e9s, vous verrez le nouvel avant-poste que vous venez de cr\u00e9er. A la fin de la ligne, cliquez sur afficher les informations, et copiez pr\u00e9cieusement le jeton d'acc\u00e8s.</p>"},{"location":"serveex/authentik/#configuration-de-la-machine-distante","title":"Configuration de la machine distante","text":"<p>Nous partons du principe que vous avez d\u00e9j\u00e0 install\u00e9 Docker et SWAG sur cette machine distante.</p> <p>Sur votre machine distante, \u00e0 l'aide de Dockge, cr\u00e9ez une stack <code>authentik-outpost</code>.</p> <p>Si vous n'avez pas install\u00e9 Dockge, cr\u00e9ez un dossier <code>/docker/authentik-outpost</code>, ou directement en ligne de commande :</p> <pre><code>$ sudo mkdir -P /docker/authentik-outpost\n</code></pre> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <p>Cr\u00e9ez le fichier <code>compose.yaml</code> ou copiez la configuration directement dans le champs si vous avez Dockge Dockge)</p> <p>En ligne de commande :</p> <p><pre><code>$ sudo vi /docker/authentik-outpost/compose.yaml\n</code></pre> Entrez en mode modification avec <code>i</code> et collez la configuration suivante, en changeant les chiffres de <code>{AUTHENTIK_TAG:proxy:2024.2.3}</code> par la meme version que celle de votre serveur Authentik. </p> <pre><code>version: \"3.5\"\nservices:\n authentik_proxy:\n container_name: authentik-outpost\n image: ghcr.io/goauthentik/proxy:2024.2.3\n # Optionally specify which networks the container should be\n # might be needed to reach the core authentik server\n restart: unless-stopped\n env_file:\n - .env\n networks:\n - swag_default\n # - foo\n ports:\n - 9000:9000\n - 9443:9443\n environment:\n AUTHENTIK_HOST: ${HOST}\n AUTHENTIK_INSECURE: \"false\"\n AUTHENTIK_TOKEN: ${TOKEN}\n # Starting with 2021.9, you can optionally set this too\n # when authentik_host for internal communication doesn't match the public URL\n # AUTHENTIK_HOST_BROWSER: https://external-domain.tld\nnetworks:\n swag_default:\n name: swag_default\n external: true\n</code></pre> <p>Appuyez sur <code>Echap</code> puis tapez <code>:x</code> et appuyez sur <code>Entr\u00e9e</code> pour sauvegarder et quitter.</p> <p>Note</p> <p>Ici nous partons du principe que le r\u00e9seau de Swag est <code>swag_default</code>.</p> <p>Creez (ou remplissez directement si vous avez Dockge) le fichier <code>.env</code> dans le m\u00eame dossier.</p> <p>En ligne de commande :</p> <pre><code>$ sudo vi /docker/authentik-outpost/.env\n</code></pre> <p>Entrez en mode modification avec <code>i</code> et collez la configuration suivante</p> <p><pre><code>HOST=\nTOKEN=\n</code></pre> Remplissez comme suit</p> Variable Valeur Exemple <code>HOST=</code> L'url de votre serveur authentik <code>https://auth.domaine.fr</code> <code>TOKEN=</code> Le token que vous avez pr\u00e9c\u00e9demment copi\u00e9 pr\u00e9cieusement <code>Q2pVEqsTNRkJSO9SkJzU3KZ2</code> <p>Appuyez sur <code>Echap</code> puis tapez <code>:x</code> et appuyez sur <code>Entr\u00e9e</code> pour sauvegarder et quitter.</p> <p>Si vous avez Dockge, d\u00e9ployez la stack.</p> <p>Sinon, via le terminal :</p> <pre><code>$ cd /docker/authentik-outpost/\n$ sudo docker compose up -d\n</code></pre> <p>Le conteneur est en route, vous pouvez v\u00e9rifier son \u00e9tat dans votre panneau admin de votre instance Authentik, section Applications > Avant-postes. </p> <p>Nous allons a pr\u00e9sent configurer SWAG.</p> <p>Ouvrez le fichier <code>authentik-server.conf</code>.</p> <pre><code>$ sudo vi /docker/swag/config/nginx/authentik-server.conf\n</code></pre> <p>Dans le fichier, passez en mode modification en tapant <code>i</code> et changez <code>authentik-server</code> par <code>authentik-outpost</code> comme suit :</p> <pre><code>set $upstream_authentik authentik-outpost;\nproxy_pass http://$upstream_authentik:9000;\n</code></pre> <p>Sauvegardez et quittez en tapant sur <code>Echap</code> puis <code>:x</code> et sur <code>Entr\u00e9e</code>.</p> <p>Ensuite, configurez les applications \u00e0 prot\u00e9ger selon si elles sont natives ou par proxy comme vous l'avez fait sur votre serveur principal.</p>"},{"location":"serveex/authentik/#migrer-une-base-authentik","title":"Migrer une base authentik","text":"<p>Sur la machine d'origine, dumper la bdd :</p> <pre><code>$ sudo docker exec authentik-postgres pg_dump -U authentik -F t authentik > /path/to/mydb.tar\n</code></pre> <p>Puis l'envoyer sur la machine cible. Sur la machine cible, copier le fichier dans le container docker</p> <pre><code>$ cp /path/to/mydb.tar authentik-postgres:/path/to/wherever\n</code></pre> <p>(Optionnel) Purgez les tables existantes :</p> <pre><code>$ sudo docker exec -i authentik-postgres psql -U authentik -c \"SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'authentik' AND pid <> pg_backend_pid();\" && \\\n$ sudo docker exec -i authentik-postgres psql -U authentik -d postgres -c \"DROP DATABASE IF EXISTS authentik;\" && \\\n$ sudo docker exec -i authentik-postgres psql -U authentik -d postgres -c \"CREATE DATABASE authentik;\" && \\\n</code></pre> <p>Restaurez la bdd</p> <pre><code>$ sudo docker exec authentik-postgresql pg_restore -U authentik -d authentik /path/to/wherever/mydb.tar\n</code></pre>"},{"location":"serveex/cloudflare/","title":"Cloudflare Zero Trust","text":"<p>Objectifs</p> <ul> <li>Comprendre le principe des Tunnels Cloudflare</li> <li>Param\u00e9trer son compte cloudflare</li> <li>Param\u00e9trer SWAG</li> <li>G\u00e9rer plusieurs tunnels</li> </ul> <p></p>"},{"location":"serveex/cloudflare/#introduction","title":"Introduction","text":"<p>L'architecture Zero Trust est la pratique consistant \u00e0 concevoir des syst\u00e8mes fond\u00e9s sur le principe de \u00ab ne jamais faire confiance, toujours v\u00e9rifier \u00bb, par opposition au principe traditionnel de \u00ab confiance, mais v\u00e9rifier \u00bb. Ce concept est devenu tr\u00e8s populaires r\u00e9cemment, \u00e0 la suite des attaques toujours plus nombreuses concernant les donn\u00e9es des utilisateurs. C'est un concept tr\u00e8s large, nous nous concentrerons sur l\u2019application du Zero Trust aux services Web que nous h\u00e9bergeons.</p> <p>Les tunnels Cloudflare offrent un moyen simple d'arriver au Zero Trust, en s'appuyant sur SWAG et Authentik.</p> <p>Pour le dire simplement, les Tunnels Cloudflare permettent notamment de :</p> <ul> <li>Masquer l'IP de votre serveur (et donc de votre box s'il est h\u00e9berg\u00e9 chez vous).</li> <li>D'authentifier le traffic.</li> <li>De b\u00e9n\u00e9ficier des protection de Cloudflare (attaques DDOS, etc, blacklist, requ\u00eates malveillantes, etc...).</li> <li>De b\u00e9n\u00e9ficier du CDN, c'est \u00e0 dire du serveur de cache de Cloudlfare, qui permet d'augmenter les performances de vos sites web.</li> <li>De ne plus avoir besoin de l'ouverture de ports de votre routeur pour les services expos\u00e9s par SWAG.</li> </ul> <p>Ici, nous expliquerons comment associer SWAG aux tunnels Cloudflare.</p> <p>Limitations</p> <ul> <li>N'utilisez pas les tunnels Cloudflare pour exposer un serveur mail</li> <li>N'utilisez pas les tunnels Cloudflare pour exposer un service vid\u00e9o, comme Plex (si vous avez suivi ce guide, Plex n'est pas expos\u00e9, c'est donc valide)</li> <li>N'utilisez pas les tunnels Cloudflare pour utiliser le protocole bittorrent (si vous avez suivi ce guide, tout est bon)</li> </ul>"},{"location":"serveex/cloudflare/#configuration-cloudflare","title":"Configuration Cloudflare","text":""},{"location":"serveex/cloudflare/#zone-dns","title":"Zone DNS","text":"<p>Avant toute chose, vous devez d\u00e9finir Cloudflare comme gestionnaire de votre zone DNS. Si vous avez r\u00e9serv\u00e9 votre nom de domaine chez Cloudflare, c'est d\u00e9j\u00e0 le cas. Sinon, renseignez vous aupr\u00e8s de votre registrar sur comment ajouter des DNS externes. Cloudflare dispose d'une documentation expliquant pas \u00e0 pas comment param\u00e9trer une Zone DNS, que vous ayez un domaine externe ou reserv\u00e9 chez Cloudflare.</p> <p>Si vous avez qu'un seul serveur \u00e0 prot\u00e9ger derri\u00e8re Cloudflare, vous pouvez supprimer l'ensemble des enregistrement DNS existant, par d\u00e9faut le domaine et tout ses sous-domaines seront directement redirig\u00e9s vers le tunnel.</p> <p>Si vous avez des sous-domaines \u00e0 rediriger vers d'autres serveurs, vous pourrez toujours les d\u00e9clarer dans la zone DNS \u00e0 l'aide d'un enregistrement A.</p> <p>Si vous avez plusieurs serveurs et donc plusieurs tunnels pour un meme domaine principal, voyez ici.</p>"},{"location":"serveex/cloudflare/#cle-api","title":"Cl\u00e9 API","text":"<p>Pour commencer, nous devons cr\u00e9er un nouveau jeton API pour Cloudflare et r\u00e9cup\u00e9rer nos identifiants de zone et de compte. </p> <p>Sur le tableau de bord de Cloudflare, dans la page de pr\u00e9sentation de votre domaine, vous pouvez voir les identifiants de <code>zone</code> et de <code>compte</code> en bas \u00e0 droite de l'\u00e9cran. Copiez pr\u00e9cieusement ces deux identifiants.</p> <p></p> <p>Juste en dessous d'eux, il y a un lien intitul\u00e9 Obtenez votre jeton API. Cliquez dessus. Le p\u00e9rim\u00e8tre dont nous avons besoin pour le jeton doit inclure <code>Zone:DNS:Edit</code> et <code>Account:Cloudflare Tunnel:Edit</code>. Assurez-vous que votre page de cr\u00e9ation de token ressemble \u00e0 celle illustr\u00e9e dans la capture d'\u00e9cran ci-dessous. </p> <p></p> <p>Une fois que nous aurons enregistr\u00e9, notre jeton sera affich\u00e9 une fois. copiez le pr\u00e9cieusement, car vous ne pourrez plus le revoir apr\u00e8s la fermeture.</p>"},{"location":"serveex/cloudflare/#cloudflare-zero-trust_1","title":"Cloudflare Zero Trust","text":"<p>Vous devez vous inscrire \u00e0 Cloudflare Teams pour pouvoir acc\u00e9der au tableau de bord Zero Trust qui g\u00e8re les tunnels et les politiques d'acc\u00e8s. Il s'agit d'un service premium, mais ils proposent un forfait gratuit pour un maximum de 50 utilisateurs, ce qui devrait suffire pour votre Home Lab. Gardez \u00e0 l\u2019esprit que puisqu\u2019il s\u2019agit d\u2019une fonctionnalit\u00e9 premium, ils demandent une carte de cr\u00e9dit valide lors de l\u2019inscription, mais avec le forfait gratuit, il n'y aura aucun frais. </p> <p>Inscrivez-vous via ce lien.</p>"},{"location":"serveex/cloudflare/#configuration-de-swag","title":"Configuration de Swag","text":"<p>Info</p> <p>Nous partons du principe que vous avez le domaine <code>mondomaine.fr</code> avec les DNS qui pointent bien vers ceux de Cloudflare, comme vu pr\u00e9c\u00e9demment.</p> <p>SWAG dispose de deux <code>Docker Mods</code> permettant d'y int\u00e9grer :</p> <ul> <li>Cloudflared, le conteneur qui permet de cr\u00e9er et de g\u00e9rer les tunnels</li> <li>Cloudflared Real IP, un conteneur qui permet \u00e0 SWAG d'obtenir la vraie source IP des requ\u00eates depuis internet plutot que celle de Docker (ce qui pourrait entrer en conflit avec le mod de g\u00e9olocalisatioN DBIP).</li> </ul> <p>Ces deux mods, fusionn\u00e9s dans le conteneur de SWAG, n\u00e9cessitent un peu de configuration.</p>"},{"location":"serveex/cloudflare/#configuration-du-tunnel","title":"Configuration du tunnel","text":"<p>Pour configurer les tunnels, nous aurons besoin de cr\u00e9er un fichier <code>tunnelconfig.yml</code> auquel nous ferons appel dans le <code>compose.yaml</code> de SWAG.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <pre><code>$ sudo vi /docker/swag/config/tunnelconfig.yml\n</code></pre> <p>Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous</p> <pre><code>ingress:\n - hostname: mondomaine.fr\n service: https://mondomaine.fr\n - hostname: \"*.mondomaine.fr\"\n service: https://mondomaine..fr\n - service: http_status:404\n</code></pre> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p>"},{"location":"serveex/cloudflare/#configuration-de-cloudflare-real-ip","title":"Configuration de Cloudflare Real IP","text":"<p>A pr\u00e9sent, nous allons configurer le bon fonctionnement du mode Cloudflare Real IP</p> <p>Ouvrez le fichier <code>nginx.conf</code></p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/nginx.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous \u00e0 la fin de la section <code>http</code></p> <p><pre><code>real_ip_header X-Forwarded-For;\nreal_ip_recursive on;\ninclude /config/nginx/cf_real-ip.conf;\nset_real_ip_from 127.0.0.1;\n</code></pre> Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p>"},{"location":"serveex/cloudflare/#docker-compose","title":"Docker compose","text":"<p>Ouvrez Dockge, \u00e9ditez la stack SWAG avec cette configuration</p> <pre><code>version: \"3.8\"\nservices:\n swag:\n image: lscr.io/linuxserver/swag:latest\n container_name: swag\n cap_add:\n - NET_ADMIN\n env_file:\n - .env\n environment:\n - DOCKER_MODS=linuxserver/mods:swag-dbip|linuxserver/mods:swag-dashboard|linuxserver/mods:swag-auto-reload|linuxserver/mods:universal-cloudflared|linuxserver/mods:swag-cloudflare-real-ip\n - PUID=${PUID}\n - PGID=${PGID}\n - TZ=Europe/Paris\n - URL=${DOMAIN}\n - SUBDOMAINS=wildcard\n - VALIDATION=dns\n - DNSPLUGIN=${PLUGIN}\n - EMAIL=${EMAIL}\n - CF_ZONE_ID=${ZONE_ID}\n - CF_ACCOUNT_ID=${ACCOUNT_ID}\n - CF_API_TOKEN=${API_TOKEN}\n - CF_TUNNEL_NAME=${TUNNEL_NAME}\n - CF_TUNNEL_PASSWORD=${TUNNEL_PW}\n - FILE__CF_TUNNEL_CONFIG=/config/tunnelconfig.yml\n extra_hosts:\n - ${DOMAIN}:127.0.0.1\n ports:\n - 81:81\n volumes:\n - /docker/swag/config:/config\n - /docker/swag/config/fail2ban/fail2ban.sqlite3:/dashboard/fail2ban.sqlite3:ro\n restart: unless-stopped\n</code></pre> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n swag:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>Et renseignez le <code>.env</code> les infos que vous avez trouv\u00e9es et not\u00e9es tout au long de ce guide</p> <pre><code>PUID=\nPGID=\nDOMAIN=\nPLUGIN=\nEMAIL=\nZONE_ID=\nACCOUNT_ID=\nAPI_TOKEN=\nTUNNEL_NAME=\nTUNNEL_PW=\n</code></pre> Variable Valeur Exemples <code>PUID=</code> A renseigner avec les infos de votre user (trouvables via la commande <code>$ id nomdutilisateur</code>) <code>1000</code> <code>GUID=</code> A renseigner avec les infos de votre user (trouvables via la commande <code>$ id nomdutilisateur</code>) <code>1000</code> <code>DOMAIN=</code> Le domaine que vous avez r\u00e9serv\u00e9 <code>mondomaine.fr</code> <code>PLUGIN=</code> Le fournisseur de zone DNS, ici Cloudflare. Pensez \u00e0 renseigner <code>cloudflare.ini</code> (voir guide de swag) <code>cloudflare</code> <code>EMAIL=</code> Votre email pour le certificat <code>votre@email.fr</code> <code>ZONE_ID=</code> L'ID de Zone que vous avez not\u00e9 pr\u00e9c\u00e9demment <code>aNhcz1l3JfWbFZo2XMpzQlP2iOqk</code> <code>ACCOUNT_ID=</code> L'ID de Compte que vous avez not\u00e9 pr\u00e9c\u00e9demment <code>buKsjNHLyzKMM1qYnzOy4s7SHfly</code> <code>API_TOKEN=</code> Le jeton d'API que vous avez not\u00e9 pr\u00e9c\u00e9demment <code>53ydYus9TFFk1DOXNdP87iIcJtQjoW</code> <code>TUNNEL_NAME=</code> Le nom de votre tunnel <code>mon_tunnel</code> <code>TUNNEL_PW=</code> Un mot de passe fort g\u00e9n\u00e9r\u00e9 al\u00e9atoirement <code>iSzKRmP4VbnlsMvdSdgBEJiJi</code> <p>Une fois fait, d\u00e9ployez la stack. Cela prendra un peu de temps, v\u00e9rifiez les logs, vous devriez arriver \u00e0 <code>serveur ready</code></p> <p>Une fois le conteneur en ligne, v\u00e9rifiez dans cloudflare que votre tunnel est bien pr\u00e9sent dans la section Networks > Tunnels de Cloudflare Zero Trust. Par d\u00e9faut, l'ensemble des sous domaine sont redirig\u00e9s vers le tunnel, sans avoir besoin de les d\u00e9clarer dans votre zone DNS.</p> <p>Astuce</p> <p>Si vous voulez exposer un service sans tunnel, vous pouvez toujours d\u00e9clarer un enregistrement A dans votre zone DNS. En cas de probl\u00e8me de r\u00e9solution, d\u00e9sactivez la fonction proxy pour cet enregistrement. Par exemple pour <code>sous.mondomaine.fr</code></p> <p></p>"},{"location":"serveex/cloudflare/#gerer-plusieurs-tunnels-pour-plusieurs-serveurs","title":"G\u00e9rer plusieurs tunnels pour plusieurs serveurs","text":"<p>Par d\u00e9faut, l'ensemble des sous domaine de votre nom de domaine pointent vers le tunnel que vous avez cr\u00e9\u00e9. Mais si vous avez un second serveur, vous pouvez avoir un second tunnel en changeant seulement le nom de tunnel dans la configuration de l'instance swag de votre serveur.</p> <p>Vous devrez ensuite dans votre zone DNS rediriger les sous domaine souhait\u00e9 vers le bon tunnel. Pour cela, faites comme suit.</p> <p>Rendez-vous dans dans la section Networks > Tunnels de Cloudflare Zero Trust.</p> <p>Notez les deux ID des tunnels</p> <p></p> <p>Rendez-vous \u00e0 pr\u00e9sent dans la section DNS de cloudflare, apr\u00e8s avoir cliqu\u00e9 sur le nom de domaine concern\u00e9. </p> <p>Cliquez sur <code>ajouter un enregistrement</code> et ajoutez deux enregistrements comme suit en ajoutant bien <code>.cfargotunnel.com</code> apr\u00e8s vos id de tunnels.</p> Type Nom Cible <code>CNAME</code> <code>sousdomaine1</code> <code>votreiddetunnel1.cfargotunnel.com</code> <code>CNAME</code> <code>sousdomaine2</code> <code>votreiddetunnel2.cfargotunnel.com</code> <p>Si vous avez de nombreux sous-domaines, vous pouvez d\u00e9clarer un seul sous domaine par tunnel comme ci-dessus, puis d\u00e9clarer vos autres sous domaine en les faisant pointer vers ces sous domaines de r\u00e9f\u00e9rence.</p> <p>Ainsi, en cas de changement d'id de tunnel, vous n'aurez qu'\u00e0 le changer que pour un seul sous-domaine. Par exemple :</p> <ul> <li> <p>Le serveur de <code>sousdomaine1</code> doit egalement etre la cible de sub1, et sub2 :</p> Type Nom Cible <code>CNAME</code> <code>sub1</code> <code>sousdomaine1</code> <code>CNAME</code> <code>sub2</code> <code>sousdomaine1</code> </li> <li> <p>Le serveur de <code>sousdomaine2</code> doit egalement etre la cible de sub3, et sub4 :</p> Type Nom Cible <code>CNAME</code> <code>sub3</code> <code>sousdomaine2</code> <code>CNAME</code> <code>sub4</code> <code>sousdomaine2</code> </li> </ul>"},{"location":"serveex/code-server/","title":"Code-Server","text":"<p>Objectifs</p> <ul> <li>Installer code-server</li> <li>Monter des dossiers dans vscode</li> <li>Exposer code-server avec Swag</li> </ul> <p>code-server est un conteneur permettant d'acc\u00e9der \u00e0 vscode en web-ui dans un environnement linux. C'est litt\u00e9ralement vscode et vos projets directement dans votre poche, disponibles partout.</p> <p></p>"},{"location":"serveex/code-server/#installation","title":"Installation","text":"<p>Info</p> <p>Pour cette installation nous utiliserons l'image maintenue par LinuxServer.io.</p> <p>Structure des dossiers</p> <pre><code>root\n\u251c\u2500\u2500 docker\n\u2502 \u2514\u2500\u2500 code-server\n\u2502 \u2514\u2500\u2500 config\n\u2514\u2500\u2500 #n'importe quel dossier \u00e0 monter dans vscode\n</code></pre> <p>Ouvrez Dockge, cliquez sur <code>compose</code>, appelez la stack <code>code-server</code> puis copiez collez ceci :</p> <pre><code>services:\n code-server:\n image: lscr.io/linuxserver/code-server:latest\n container_name: code-server\n environment:\n - PUID=${PUID}\n - PGID=${GUID}\n - TZ=Etc/UTC\n - HASHED_PASSWORD=${PW}\n volumes:\n - /docker/code-server/config:/config\n # ajoutez vos dossier \u00e0 monter dans vscode\n # - /chemin/vers/dossier:/dossier\n ports:\n - 8443:8443\n restart: unless-stopped\n</code></pre> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n code-server:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>Choisissez un mot de passe et g\u00e9n\u00e9rez un hash</p> <pre><code>$ echo -n \"votremotdepasse\" | npx argon2-cli -e\n</code></pre> <p>Notez pr\u00e9cieusement le r\u00e9sultat. Trouvez votre PUID et votre GUID en tapant la commande suivante :</p> <pre><code>$ id nomdutilisateur\n</code></pre> <p>Et renseignez le <code>.env</code> avec les infos que vous avez trouv\u00e9es, par exemple :</p> <pre><code>PW='$argon2i$v=19$m=4096,t=3,p=1$wST5QhBgk2lu1ih4DMuxvg$LS1alrVdIWtvZHwnzCM1DUGg+5DTO3Dt1d5v9XtLws4'\nPUID=1000\nGUID=1000\n</code></pre> <p>Attention</p> <p>Pensez \u00e0 mettre un guillemet simple <code>'</code>au debut et \u00e0 la fin du hash</p> <p>D\u00e9ployez le conteneur et rendez-vous sur <code>http://ipduserveur:8443</code>. Et voil\u00e0, votre instance code-server en webui est disponible !</p>"},{"location":"serveex/code-server/#monter-des-dossiers","title":"Monter des dossiers","text":"<p>Vous pouvez monter les dossiers \u00e0 partager dans vscode en ajoutant les volumes concern\u00e9s dans le compose.yaml (ou via dockge), et en red\u00e9ployant le conteneur.</p> <p><pre><code>services:\n code-server:\n #...\n volumes:\n - /chemin/vers/dossier:/dossier\n</code></pre> Une fois dans vscode, vous pourrez acc\u00e9der au dossier.</p>"},{"location":"serveex/code-server/#exposer-code-server-avec-swag","title":"Exposer code-server avec Swag","text":"<p>Tout l'int\u00e9r\u00eat d'une telle solution, c'est de pouvoir y acc\u00e9der \u00e0 distance et sur tout vos appareils. Pour cela, nous allons exposer coder-server via Swag.</p> <p>Au pr\u00e9alable</p> <p>Nous partons du principe que vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>code.mondomaine.fr</code> avec pour <code>CNAME</code> <code>mondomaine.fr</code> et \u00e0 moins que vous utilisiez Cloudflare Zero Trust, que que vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Dans Dockge ouvrez la stack <code>code-server</code> et ajoutez le r\u00e9seau de Swag. Pour rappel</p> <pre><code>services:\n nomduservice:\n container_name: #...\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Dans les dossiers de Swag, cr\u00e9ez le fichier <code>code.subdomain.conf</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/code.subdomain.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous :</p> <pre><code>## Version 2023/12/19\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name code.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n #if ($lan-ip = yes) { set $geo-whitelist yes; }\n #if ($geo-whitelist = no) { return 404; }\n if ($geo-blacklist = no) { return 404; }\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app code-server;\n set $upstream_port 8443;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Et voil\u00e0, vous avez expos\u00e9 code-server !</p> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik en ouvrant <code>code.subodmain.conf</code> et en retirant les <code>#</code> devant <code>include /config/nginx/authentik-server.conf;</code> et <code>include /config/nginx/authentik-location.conf;</code> N'oubliez pas de cr\u00e9er une application et un fournisseur dans Authentik.</p>"},{"location":"serveex/docker/","title":"Docker","text":"<p>Docker, pour installer des services d\u00e9ployables en quelques secondes, et les manager en quelques commandes/clics.</p> <p>Objectif</p> <ul> <li>Installer Docker</li> <li>Installer Dockge pour manager les stacks</li> <li>Installer Watchtower pour mettre \u00e0 jour les conteneurs</li> </ul> <p></p>"},{"location":"serveex/docker/#installer-docker","title":"Installer docker","text":"<p>Installez les repo Docker et la cl\u00e9 GPG</p> <p><pre><code># Add Docker's official GPG key:\nsudo apt-get update\nsudo apt-get install ca-certificates curl\nsudo install -m 0755 -d /etc/apt/keyrings\nsudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc\nsudo chmod a+r /etc/apt/keyrings/docker.asc\n\n# Add the repository to Apt sources:\necho \\\n \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \\\n $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable\" | \\\n sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\nsudo apt-get update\n</code></pre> Installez les package</p> <p><pre><code>$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n</code></pre> Et voil\u00e0 !</p> <p>Plus d'options Installer docker pour Debian 12</p> <p>Info</p> <p>Dans toute la suite, on part du principe que les stacks sont install\u00e9es dans le dossier <code>/docker</code>, cr\u00e9\u00e9 grace \u00e0 la commande :</p> <pre><code>$ sudo mkdir /docker\n</code></pre>"},{"location":"serveex/docker/#installer-dockge-pour-gerer-et-deployer-les-conteneurs","title":"Installer dockge pour g\u00e9rer et d\u00e9ployer les conteneurs","text":"<p>Dockge est un outil web permettant de cr\u00e9er, configurer, lancer et g\u00e9rer des conteneurs pour Docker. C'est une interface simple, intuitive, qui est plus l\u00e9g\u00e8re et plus facile pour les d\u00e9butants que d'utiliser docker en CLI ou Portainer.</p> <p></p>"},{"location":"serveex/docker/#configuration","title":"Configuration","text":"<p>Plan des fichiers que nous allons modifier :</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 dockge \n \u2514\u2500\u2500 compose.yml\n</code></pre> <p>Cr\u00e9ez le dossier de la stack :</p> <pre><code>$ cd /docker\n$ sudo mkdir dockge\n</code></pre> <p>Puis cr\u00e9ez le fichier <code>compose.yml</code> dans ce dossier avec l'outil vim que vous avez install\u00e9 pr\u00e9alablement (dans les outils CLI)</p> <p><pre><code>$ cd /docker/dockge\n$ sudo vi compose.yml\n</code></pre> Appuyer sur <code>i</code> pour rentrer en modif et copiez-collez ceci.</p> <pre><code>version: \"4\"\nservices:\n dockge:\n image: louislam/dockge:1\n restart: unless-stopped\n container_name: dockge\n ports:\n - 3555:5001 # (1)!\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - /docker/dockge/data:/app/data\n - /docker:/docker\n environment:\n - DOCKGE_STACKS_DIR=/docker\n</code></pre> <ol> <li> Le port joignable depuis le LAN sera 3555</li> </ol> <p>Appuyez sur <code>Echap</code> pour quitter le mode modif et tapez <code>:x</code> pour enregistrer et quitter</p> <p>Pour lancer le conteneur, tapez :</p> <p><pre><code>$ cd /docker/dockge\n$ sudo docker compose up -d\n</code></pre> Une fois lanc\u00e9, tapez dans votre navigateur <code>http://ipduserveur:3555</code> et vous tomberez sur la page de login.</p> <p>Plus d'info sur dockge et comment l'utiliser</p> <p>Et voil\u00e0, vous avez install\u00e9 docker et un outil facile pour manager vos conteneurs !</p>"},{"location":"serveex/docker/#watchtower-pour-mettre-a-jour-automatiquement-les-conteneurs","title":"Watchtower, pour mettre \u00e0 jour automatiquement les conteneurs","text":"<p>Watchtower est un conteneur qui permet de v\u00e9rifier les mise \u00e0 jour et d'installer les nouvelles images sans effort, en ajoutant un simple label dans les fichiers <code>compose.yml</code> de vos conteneurs.</p>"},{"location":"serveex/docker/#configuration_1","title":"Configuration","text":"<ul> <li>Ouvrez Dockge dans votre navigateur</li> <li>Cliquez sur <code>compose</code></li> <li>Nommez la stack <code>watchtower</code></li> <li>Copiez collez la configuration ci-dessous \u00e0 la place de la configuration par d\u00e9faut dans Dockge</li> </ul> <pre><code>version: \"2.3\"\nservices:\n watchtower:\n container_name: watchtower\n image: containrrr/watchtower:latest\n restart: unless-stopped\n env_file:\n - .env\n environment:\n - TZ=Europe/Paris\n - WATCHTOWER_SCHEDULE=${SCHEDULE}\n - WATCHTOWER_LABEL_ENABLE=true # (1)!\n - WATCHTOWER_CLEANUP=true\n - WATCHTOWER_REMOVE_VOLUMES=true\n #Notifications Discord - d\u00e9commenter si utilis\u00e9\n #- WATCHTOWER_NOTIFICATIONS=slack\n #- WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=Watchtower\n #- WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=${WH_URL}\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n</code></pre> <ol> <li> watchtower scan tous les conteneurs qui ont le label <code>com.centurylinklabs.watchtower.enable=true</code></li> </ol> <p>Puis remplissez les donn\u00e9es ci-dessous dans l'encart \".env\" de Dockge</p> <pre><code>SCHEDULE=\nWH_URL=\n</code></pre> Propri\u00e9t\u00e9 Valeur Exemples <code>SCHEDULE</code> Format cron <code>0 0 6 * * *</code> (tous les jours \u00e0 6h du matin) <code>WH_URL</code> URL du webhook de votre serveur Discord - ajouter <code>/slack</code> \u00e0 la fin <code>https://serveurdiscord/valeur/slack</code> <p>Pour que Watchtower surveille vos autres conteneurs, ajoutez ceci \u00e0 vos conteneurs dans leur compose.yml :</p> <pre><code>labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre> <p>Puis relancez les stacks modifi\u00e9s. Et voil\u00e0, vous avez une bonne carcasse pour commencer \u00e0 installer les services qui vous plaisent !</p>"},{"location":"serveex/dozzle/","title":"Dozzle","text":"<p>Objectifs</p> <ul> <li>Installer Dozzle</li> <li>Exposer Dozzle avec Swag</li> </ul> <p>Dozzle est un conteneur permettant d'acc\u00e9der au logs de vos conteneurs et de les afficher en temps r\u00e9el de via une interface user-friendly. C'est une mani\u00e8re simple de naviguer entre les logs et de retrouver des informations dans l'historique.</p> <p></p>"},{"location":"serveex/dozzle/#installation","title":"Installation","text":"<p>Structure des dossiers</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 dozzle\n \u2514\u2500\u2500 data\n</code></pre> <p>Ouvrez Dockge, cliquez sur <code>compose</code>, appelez la stack <code>dozzle</code> puis copiez collez ceci :</p> <pre><code>version: \"3\"\nservices:\n dozzle:\n container_name: dozzle\n image: amir20/dozzle:latest\n ports:\n - 9135:8080\n env_file:\n - .env\n environment:\n - DOZZLE_AUTH_PROVIDER=simple\n - DOZZLE_HOSTNAME=${DOMAIN}\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - /docker/dozzle/data:/data\n</code></pre> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n dozzle:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>Renseignez le <code>.env</code> votre nom de domaine, par exemple</p> <pre><code>DOMAIN=dozzle.mondomaine.fr\n</code></pre> <p>D\u00e9ployez le conteneur et rendez-vous sur <code>http://ipduserveur:9135</code>. Et voil\u00e0, votre instance Dozzle en webui est disponible !</p>"},{"location":"serveex/dozzle/#exposer-dozzle-avec-swag","title":"Exposer Dozzle avec Swag","text":"<p>Vous aurez peut-etre envie d'y acc\u00e9der \u00e0 distance et sur tout vos appareils. Pour cela, nous allons exposer Dozzle via Swag.</p> <p>Au pr\u00e9alable</p> <p>Nous partons du principe que vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>dozzle.mondomaine.fr</code> avec pour <code>CNAME</code> <code>mondomaine.fr</code> et, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, que que vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Dans Dockge ouvrez la stack <code>dozzle</code> et ajoutez le r\u00e9seau de Swag. Pour rappel</p> <pre><code>services:\n nomduservice:\n container_name: #...\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Dans les dossiers de Swag, cr\u00e9ez le fichier <code>dozzle.subdomain.conf</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/dozzle.subdomain.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous :</p> <pre><code>## Version 2023/12/19\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name dozzle.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n #if ($lan-ip = yes) { set $geo-whitelist yes; }\n #if ($geo-whitelist = no) { return 404; }\n if ($geo-blacklist = no) { return 404; }\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app dozzle;\n set $upstream_port 8080;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Et voil\u00e0, vous avez expos\u00e9 Dozzle !</p> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik en ouvrant <code>dozzle.subodmain.conf</code> et en retirant les <code>#</code> devant <code>include /config/nginx/authentik-server.conf;</code> et <code>include /config/nginx/authentik-location.conf;</code> N'oubliez pas de cr\u00e9er une application et un fournisseur dans Authentik.</p>"},{"location":"serveex/filebrowser/","title":"File Browser","text":"<p>Objectifs</p> <ul> <li>Installer File Browser</li> <li>Exposer File Browser avec Swag</li> </ul> <p>File Browser est une interface permettant d'acc\u00e9der aux fichiers de votre serveur et de les \u00e9diter.</p> <p></p>"},{"location":"serveex/filebrowser/#installation","title":"Installation","text":"<p>Ouvrez Dockge, cliquez sur <code>compose</code>, appelez la stack <code>filebrowser</code> puis copiez collez ceci :</p> <pre><code>services:\n filebrowser:\n container_name: filebrowser\n volumes:\n - /:/srv\n - /docker/filebrowser/config:/config/\n ports:\n - 8010:80\n image: filebrowser/filebrowser:s6\n</code></pre> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n filebrowser:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>D\u00e9ployez le conteneur et rendez-vous sur <code>http://ipduserveur:8010</code>. Et voil\u00e0, votre instance File Browser en webui est disponible !</p>"},{"location":"serveex/filebrowser/#exposer-file-browser-avec-swag","title":"Exposer File Browser avec Swag","text":"<p>Vous aurez peut-etre envie d'y acc\u00e9der \u00e0 distance et sur tout vos appareils. Pour cela, nous allons exposer IT Tools via Swag.</p> <p>Au pr\u00e9alable</p> <p>Nous partons du principe que vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>files.mondomaine.fr</code> avec pour <code>CNAME</code> <code>mondomaine.fr</code> et, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, que que vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Dans Dockge ouvrez la stack <code>filebrowser</code> et ajoutez le r\u00e9seau de Swag. Pour rappel</p> <pre><code>services:\n nomduservice:\n container_name: #...\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Dans les dossiers de Swag, cr\u00e9ez le fichier <code>files.subdomain.conf</code>.</p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/files.subdomain.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous :</p> <pre><code>## Version 2023/12/19\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name files.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n #if ($lan-ip = yes) { set $geo-whitelist yes; }\n #if ($geo-whitelist = no) { return 404; }\n if ($geo-blacklist = no) { return 404; }\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app filebrowser;\n set $upstream_port 80;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Et voil\u00e0, vous avez expos\u00e9 File Browser !</p> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik en ouvrant <code>files.subodmain.conf</code> et en retirant les <code>#</code> devant <code>include /config/nginx/authentik-server.conf;</code> et <code>include /config/nginx/authentik-location.conf;</code> N'oubliez pas de cr\u00e9er une application et un fournisseur dans Authentik.</p>"},{"location":"serveex/gitea/","title":"Gitea","text":"<p>Objectifs</p> <ul> <li>Installer Gitea</li> <li>Exposer Gitea avec Swag</li> </ul> <p>Gitea est une plateforme DevOps, permettant de g\u00e9rer des d\u00e9pots, \u00e0 la mani\u00e8re de GitHub mais chez vous en selfhost.</p> <p></p>"},{"location":"serveex/gitea/#installation","title":"Installation","text":"<p>Structure des dossiers</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 gitea\n \u2514\u2500\u2500 data\n</code></pre> <p>Ouvrez Dockge, cliquez sur <code>compose</code>, appelez la stack <code>gitea</code> puis copiez collez ceci :</p> <p><pre><code>version: \"3\"\nnetworks:\n gitea:\n external: false\nservices:\n server:\n image: gitea/gitea:1.22.0\n container_name: gitea\n environment:\n - USER_UID=${UID}\n - USER_GID=${GID}\n - TZ=Europe/Paris\n restart: unless-stopped\n networks:\n - gitea\n volumes:\n - ./data:/data\n ports:\n - 3333:3000\n - 222:22\n</code></pre> Et renseignez le <code>.env</code> avec les infos que vous avez trouv\u00e9es, par exemple :</p> <pre><code>UID=1000\nGID=1000\n</code></pre> <p>D\u00e9ployez le conteneur et rendez-vous sur <code>http://ipduserveur:3333</code>. Et voil\u00e0, votre instance Gitea est disponible !</p>"},{"location":"serveex/gitea/#exposer-gitea-avec-swag","title":"Exposer Gitea avec Swag","text":"<p>Tout l'int\u00e9r\u00eat d'une telle solution, c'est de pouvoir y acc\u00e9der \u00e0 distance et sur tout vos appareils. Pour cela, nous allons exposer Gitea via Swag.</p> <p>Au pr\u00e9alable</p> <p>Nous partons du principe que vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>gitea.mondomaine.fr</code> avec pour <code>CNAME</code> <code>mondomaine.fr</code> et, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, que que vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Dans Dockge ouvrez la stack <code>gitea</code> et ajoutez le r\u00e9seau de Swag. Pour rappel</p> <pre><code>services:\n nomduservice:\n container_name: #...\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Dans les dossiers de Swag, cr\u00e9ez le fichier <code>gitea.subdomain.conf</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/gitea.subdomain.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous :</p> <pre><code>## Version 2023/12/19\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name gitea.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app gitea;\n set $upstream_port 3000;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location ~ (/gitea)?/info/lfs {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app gitea;\n set $upstream_port 3000;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Ouvrez le fichier <code>app.ini</code> dans les fichiers du conteneur</p> <p>$ sudo vi /docker/gitea/data/gitea/conf/app.ini</p> <p>Entrez en modification avec la touche <code>i</code> et et modifiez la section serveur avec les infos de votre domaine</p> <p><pre><code>[server]\nDOMAIN = gitea.mondomaine.fr\nSSH_DOMAIN = gitea.mondomaine.fr\nROOT_URL = https://gitea.mondomaine.fr/\n</code></pre> Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Relancez le conteneur.</p> <p>Et voil\u00e0, vous avez expos\u00e9 Gitea !</p> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik de fa\u00e7on native en suivant ces instructions.</p>"},{"location":"serveex/immich/","title":"Immich","text":"<p>Objectifs</p> <p>Installer Immich pour g\u00e9rer vos photos sur tout vos appareils.</p> <p>Immich est une solution de gestion de photos et de vid\u00e9os que vous pouvez installer directement sur votre serveur. Cette solution remplace les clouds type Google Photo ou iCloud. Elle dispose de nombreuse fonctionnalit\u00e9s comme la reconnaissance de visage ou la g\u00e9olocalisation.</p> <p></p>"},{"location":"serveex/immich/#installation","title":"Installation","text":"<p>Structure des dossiers</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 immich\n \u251c\u2500\u2500 library\n \u251c\u2500\u2500 compose.yaml\n \u2514\u2500\u2500 .env\n</code></pre> <p>Ouvrez Dockge, cliquez sur <code>compose</code>, appelez la stack <code>immich</code> puis copiez collez ceci :</p> <pre><code>#\n# WARNING: Make sure to use the docker-compose.yml of the current release:\n#\n# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml\n#\n# The compose file on main may not be compatible with the latest release.\n#\n\nname: immich\n\nservices:\n immich-server:\n container_name: immich_server\n image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}\n # extends:\n # file: hwaccel.transcoding.yml\n # service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding\n volumes:\n - ${UPLOAD_LOCATION}:/usr/src/app/upload\n - /etc/localtime:/etc/localtime:ro\n env_file:\n - .env\n ports:\n - 2283:3001\n depends_on:\n - redis\n - database\n restart: always\n networks:\n - swag\n\n immich-machine-learning:\n container_name: immich_machine_learning\n # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.\n # Example tag: ${IMMICH_VERSION:-release}-cuda\n image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}\n # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration\n # file: hwaccel.ml.yml\n # service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable\n volumes:\n - model-cache:/cache\n env_file:\n - .env\n restart: always\n networks:\n - swag\n\n redis:\n container_name: immich_redis\n image: docker.io/redis:6.2-alpine@sha256:328fe6a5822256d065debb36617a8169dbfbd77b797c525288e465f56c1d392b\n healthcheck:\n test: redis-cli ping || exit 1\n restart: always\n networks:\n - swag\n\n\n database:\n container_name: immich_postgres\n image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0\n environment:\n POSTGRES_PASSWORD: ${DB_PASSWORD}\n POSTGRES_USER: ${DB_USERNAME}\n POSTGRES_DB: ${DB_DATABASE_NAME}\n POSTGRES_INITDB_ARGS: '--data-checksums'\n volumes:\n - ${DB_DATA_LOCATION}:/var/lib/postgresql/data\n healthcheck:\n test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1; Chksum=\"$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')\"; echo \"checksum failure count is $$Chksum\"; [ \"$$Chksum\" = '0' ] || exit 1\n interval: 5m\n start_interval: 30s\n start_period: 5m\n command: [\"postgres\", \"-c\" ,\"shared_preload_libraries=vectors.so\", \"-c\", 'search_path=\"$$user\", public, vectors', \"-c\", \"logging_collector=on\", \"-c\", \"max_wal_size=2GB\", \"-c\", \"shared_buffers=512MB\", \"-c\", \"wal_compression=on\"]\n restart: always\n networks:\n - swag\n\nnetworks:\n swag:\n name: swag_default\n external: true\n\nvolumes:\n model-cache:\n</code></pre> <p>Note</p> <p>Nous avons ajout\u00e9 le r\u00e9seau de Swag afin que les deux puissent communiquer ensemble. Assurez-vous que le nom du r\u00e9seau soit correct. Nous partons du principe qu'il se nomme <code>swag_default</code></p> <p>Attention</p> <p>N'ajoutez pas le label de Watchtower. Immich \u00e9tant une solution en perpetuelle \u00e9volution, des mises \u00e0 jour automatiques risqueraient de casser votre installation.</p> <p>Configurer le <code>.env</code> comme suit et suivez les commentaires indiqu\u00e9s dans le fichier :</p> <pre><code># You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables\n\n# The location where your uploaded files are stored\nUPLOAD_LOCATION=./library\n# The location where your database files are stored\nDB_DATA_LOCATION=./postgres\n\n# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List\n# TZ=Etc/UTC\n\n# The Immich version to use. You can pin this to a specific version like \"v1.71.0\"\nIMMICH_VERSION=release\n\n# Connection secret for postgres. You should change it to a random password\nDB_PASSWORD=postgres\n\n# The values below this line do not need to be changed\n###################################################################################\nDB_USERNAME=postgres\nDB_DATABASE_NAME=immich\n</code></pre> <p>Info</p> <p>Si vous avez un NAS ou un disque r\u00e9seau partag\u00e9 via samba pour stocker vos donn\u00e9es, remplacez la valeur de <code>UPLOAD_LOCATION=</code> par le chemin d'acc\u00e8s de votre dossier partag\u00e9.</p> <p>Acc\u00e9l\u00e9ration mat\u00e9rielle</p> <p>Si votre CPU/iGPU/GPU le supporte, Immich permet d'utiliser l'acc\u00e9l\u00e9ration mat\u00e9rielle pour lire les vid\u00e9os ou pour la reconnaissance d'images. Ces fonctionnalit\u00e9s peuvent tripler les performances d'Immich.</p> <ul> <li>Transcoding</li> <li>Machine learning</li> </ul> <p>D\u00e9ployez le conteneur.</p> <p>Et voil\u00e0, vous pouvez vous connecter et suivre les instructions sur <code>http://ipduserveur:2283</code></p>"},{"location":"serveex/immich/#exposer-immich-avec-swag","title":"Exposer Immich avec Swag","text":"<p>Tout l'int\u00e9r\u00eat d'une telle solution, c'est de pouvoir y acc\u00e9der \u00e0 distance et sur tout vos appareils. Pour cela, nous allons exposer Immich via Swag.</p> <p>Au pr\u00e9alable</p> <p>Nous partons du principe que vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>immich.mondomaine.fr</code> avec pour <code>CNAME</code> <code>mondomaine.fr</code> et, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, que que vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Dans les dossiers de Swag, cr\u00e9ez le fichier <code>immich.subdomain.conf</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/immich.subdomain.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous :</p> <pre><code>## Version 2023/12/19\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name immich.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n #if ($lan-ip = yes) { set $geo-whitelist yes; }\n #if ($geo-whitelist = no) { return 404; }\n if ($geo-blacklist = no) { return 404; }\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app immich_server;\n set $upstream_port 3001;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location ~ (/immich)?/api {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app immich_server;\n set $upstream_port 3001;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Et voil\u00e0, vous avez expos\u00e9 Immich ! N'oubliez pas d'installer les applications iOS/Android afin de synchroniser vos appareils.</p> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik de fa\u00e7on native en suivant ces instructions.</p>"},{"location":"serveex/installation/","title":"Debian 12","text":"<p>Objectif</p> <p>Avoir install\u00e9 Debian 12 et les d\u00e9pendances principales pour avoir un OS pret \u00e0 l'emploi, joignable en SSH.</p> <p></p>"},{"location":"serveex/installation/#installation","title":"Installation","text":"<ol> <li>Param\u00e8trage BIOS</li> <li>T\u00e9l\u00e9chargement de l'image Debian</li> <li>USB bootable (Rufus)</li> <li>Installer Debian et configurer SSH</li> <li> <p>Installer sudo et ajouter un utilisateur au groupe sudo, pour les privil\u00e8ges administrateurs</p> <ul> <li> <p>Installer sudo : </p> <p>Se connecter en root :</p> <p><code>$ su -</code> </p> <p>mettre son mot de passe puis taper :</p> <p><code># apt install sudo</code></p> </li> <li> <p>Ajouter l'utilisateur au groupe sudo : </p> <p><code># adduser <nomdutilisateur> sudo</code></p> </li> </ul> <p>La prochaine fois que l'utilisateur se connectera, il pourra utiliser la commande <code>sudo</code> et ainsi executer des commandes avec les privil\u00e8ges administrateurs.</p> </li> <li> <p>Tout savoir sur la connexion \u00e0 distance \u00e0 la console (SSH)</p> </li> <li>Optionnel - UPS client en cas de coupure / et aussi</li> <li>Optionnel - R\u00e9veil en cas de coupure de courant -> r\u00e9gler le BIOS S0 state</li> <li>Optionnel - R\u00e9veiller le serveur \u00e0 distance (WoW - WoL)</li> </ol>"},{"location":"serveex/installation/#cli-apps-a-avoir-pres-de-soi","title":"CLI apps \u00e0 avoir pr\u00e8s de soi","text":"<p>Quelques app que vous utiliserez forc\u00e9ment \u00e0 un moment donn\u00e9, autant les installer d\u00e8s le d\u00e9part <pre><code>$ sudo apt update\n$ sudo apt upgrade\n$ sudo apt install vim btop ranger git duf neofetch samba cifs-utils tree unzip ufw\n</code></pre></p> <p>En plus :</p> <ul> <li>gping - Outil graphique de ping</li> <li>lazydocker - Gestion de conteneurs docker en CLI</li> </ul>"},{"location":"serveex/installation/#fonctions-utiles","title":"Fonctions utiles","text":""},{"location":"serveex/installation/#pare-feu","title":"Pare-feu","text":"<ul> <li>ufw</li> <li>Firewalld</li> </ul>"},{"location":"serveex/installation/#partage-samba-acces-a-un-disque-reseau-distant","title":"Partage Samba (acc\u00e8s \u00e0 un disque r\u00e9seau distant)","text":"<ul> <li>Cr\u00e9er et acc\u00e9der \u00e0 un partage Samba</li> </ul>"},{"location":"serveex/installation/#transfert-de-fichier-via-rsync","title":"Transfert de fichier via rsync","text":"<pre><code>$ sudo rsync -avhHSP /source /destination\n</code></pre> <p>Note</p> <p>Ajoutez <code>--exclude @eaDir</code> si la source est un NAS Synology</p>"},{"location":"serveex/introduction/","title":"Un home lab par un d\u00e9butant pour les d\u00e9butants","text":"<p>Serveex c'est avant tout un projet personnel visant \u00e0 h\u00e9berger chez soi le plus de services possibles du quotidien sans passer par des plateformes propri\u00e9taires (Google, Apple, Netflix...). L'id\u00e9e \u00e9tait d'exp\u00e9rimenter, d'apprendre, et de documenter chaque \u00e9tape. C'est un projet purement pour la science, et n'a pas vocation \u00e0 \u00eatre utilis\u00e9 en production.</p> <p>Un grand merci \u00e0 Nipah, pour le partage de ses connaissances infinies, et surtout pour sa patience.</p> <p>Pr\u00e9-requis</p> <p>Poss\u00e9der un VPS en ligne ou une machine locale : id\u00e9alement un mini PC (on trouve des N100 pour 100\u20ac), mais fonctionne aussi sur laptop ou une machine virtuelle. Les Freebox Delta/Ultra proposent des machines virtuelles.</p> <p>Pour l'acc\u00e8s ext\u00e9rieur :</p> <ul> <li>Savoir configurer les r\u00e8gles NAT d'un routeur et attribuer des baux DHCP</li> <li>Savoir configurer la zone DNS d'un nom de domaine</li> </ul> <p>L'objectif etant d'etre facilement d\u00e9ployable et facile \u00e0 migrer, voici sa structure :</p>"},{"location":"serveex/introduction/#le-coeur-du-serveur","title":"Le coeur du serveur","text":"<ul> <li> <p> Syst\u00e8me d'exploitation</p> <p>Installer et configurer Debian 12</p> <p> Commencer</p> </li> <li> <p> Moteur de conteneur</p> <p>Installer Docker</p> <p> Commencer</p> </li> <li> <p> Interface docker</p> <p>Installer et d\u00e9ployer Dockge</p> <p> Commencer</p> </li> <li> <p> Reverse Proxy</p> <p>Installer et configurer SWAG</p> <p> Commencer</p> </li> </ul>"},{"location":"serveex/introduction/#la-securite","title":"La s\u00e9curit\u00e9","text":"<ul> <li> <p> VPN</p> <p>Installer et d\u00e9ployer Wireguard</p> <p> Commencer</p> </li> <li> <p> SSO & MFA</p> <p>Installer et d\u00e9ployer Authentik</p> <p> Commencer</p> </li> <li> <p> Tunnels</p> <p>Utiliser Cloudflare Zero Trust</p> <p> Commencer</p> </li> </ul>"},{"location":"serveex/introduction/#monitoring","title":"Monitoring","text":"<ul> <li> <p> Etat des services</p> <p>Installer et d\u00e9ployer Uptime-Kuma</p> <p> Commencer</p> </li> <li> <p> Gestion des logs</p> <p>Installer et d\u00e9ployer Dozzle</p> <p> Commencer</p> </li> </ul>"},{"location":"serveex/introduction/#media-seedbox","title":"Media & seedbox","text":"<ul> <li> <p> Media</p> <p>Installer et d\u00e9ployer Plex</p> <p> Commencer</p> </li> <li> <p> Seedbox</p> <p>Installer et d\u00e9ployer Qbittorent</p> <p> Commencer</p> </li> </ul>"},{"location":"serveex/introduction/#cloud-drive-photos","title":"Cloud Drive & Photos","text":"<ul> <li> <p> Drive</p> <p>Installer et d\u00e9ployer Nextcloud</p> <p> Commencer</p> </li> <li> <p> Photos</p> <p>Installer et d\u00e9ployer Immich</p> <p> Commencer</p> </li> </ul>"},{"location":"serveex/introduction/#developpement","title":"D\u00e9veloppement","text":"<ul> <li> <p> Visual Studio Code</p> <p>Installer et d\u00e9ployer code-server</p> <p> Commencer</p> </li> <li> <p> Git Repository</p> <p>Installer et d\u00e9ployer Gitea</p> <p> Commencer</p> </li> <li> <p> IT Tools</p> <p>Installer et d\u00e9ployer IT Tools</p> <p> Commencer</p> </li> </ul>"},{"location":"serveex/introduction/#applications-utiles","title":"Applications utiles","text":"<ul> <li> <p> DNS anti-pub et filtres</p> <p>Installer et d\u00e9ployer Adguard Home</p> <p> Commencer</p> </li> <li> <p> Explorateur de fichier</p> <p>Installer et d\u00e9ployer File Browser</p> <p> Commencer</p> </li> <li> <p> Vaultwarden</p> <p>Installer et d\u00e9ployer Vaultwarden</p> <p> Commencer</p> </li> </ul>"},{"location":"serveex/introduction/#a-venir","title":"A venir","text":"<ul> <li>Zipline, pour partager des fichiers</li> <li>Homepage, pour avoir tout vos services en un coup d'oeil et y acc\u00e9der facilement</li> <li>Mkdocs pour votre documentation</li> <li>Speedtest-tracker pour v\u00e9rifier la connexion de votre serveur</li> <li>UpSnap pour r\u00e9veiller vos machines \u00e0 distance</li> </ul>"},{"location":"serveex/it-tools/","title":"IT Tools","text":"<p>Objectifs</p> <ul> <li>Installer IT-Tools</li> <li>Exposer IT Tools avec Swag</li> </ul> <p>IT Tools est un conteneur exposant une page web permettant d'acc\u00e9der \u00e0 un grand nombre d'outil de d\u00e9veloppement.</p> <p></p>"},{"location":"serveex/it-tools/#installation","title":"Installation","text":"<p>Ouvrez Dockge, cliquez sur <code>compose</code>, appelez la stack <code>it-tools</code> puis copiez collez ceci :</p> <pre><code>version: \"3.3\"\nservices:\n it-tools:\n container_name: it-tools\n restart: unless-stopped\n image: corentinth/it-tools:latest\n ports:\n - 3222:80\n</code></pre> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n it-tools:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>D\u00e9ployez le conteneur et rendez-vous sur <code>http://ipduserveur:3222</code>. Et voil\u00e0, votre instance IT Tools en webui est disponible !</p>"},{"location":"serveex/it-tools/#exposer-it-tools-avec-swag","title":"Exposer IT Tools avec Swag","text":"<p>Vous aurez peut-etre envie d'y acc\u00e9der \u00e0 distance et sur tout vos appareils. Pour cela, nous allons exposer IT Tools via Swag.</p> <p>Au pr\u00e9alable</p> <p>Nous partons du principe que vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>tools.mondomaine.fr</code> avec pour <code>CNAME</code> <code>mondomaine.fr</code> et, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, que que vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Dans Dockge ouvrez la stack <code>tools</code> et ajoutez le r\u00e9seau de Swag. Pour rappel</p> <pre><code>services:\n nomduservice:\n container_name: #...\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Dans les dossiers de Swag, cr\u00e9ez le fichier <code>tools.subdomain.conf</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/tools.subdomain.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous :</p> <pre><code>## Version 2023/12/19\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name tools.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n #if ($lan-ip = yes) { set $geo-whitelist yes; }\n #if ($geo-whitelist = no) { return 404; }\n if ($geo-blacklist = no) { return 404; }\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app it-tools;\n set $upstream_port 80;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Et voil\u00e0, vous avez expos\u00e9 it-tools !</p> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik en ouvrant <code>tools.subodmain.conf</code> et en retirant les <code>#</code> devant <code>include /config/nginx/authentik-server.conf;</code> et <code>include /config/nginx/authentik-location.conf;</code> N'oubliez pas de cr\u00e9er une application et un fournisseur dans Authentik.</p>"},{"location":"serveex/nextcloud/","title":"Nextcloud","text":"<p>Objectifs</p> <p>Installer Nextcloud pour g\u00e9rer vos photos sur tout vos appareils.</p> <p>Nextcloud est une solution qui vous permet d'acc\u00e9der \u00e0 vos donn\u00e9es sur tout vos appareils, et de les synchroniser. Nexctloud dispose \u00e9galement de fonctionnalit\u00e9s de collaboration, de calendrier et bien d'autres. Cette solution remplace des solutions du type Google Drive, iCloud, ou encore OneDrive.</p> <p></p>"},{"location":"serveex/nextcloud/#installation","title":"Installation","text":"<p>Info</p> <p>Nous utiliserons l'image docker maintenue par LinuxServer.io</p> <p>Structure des fichiers</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 nextcloud\n \u251c\u2500\u2500 config\n \u251c\u2500\u2500 data\n \u251c\u2500\u2500 compose.yaml\n \u2514\u2500\u2500 .env\n</code></pre> <p>Ouvrez Dockge, cliquez sur <code>compose</code>, appelez la stack <code>nextcloud</code> puis copiez collez ceci :</p> <pre><code>---\nservices:\n nextcloud:\n image: lscr.io/linuxserver/nextcloud:latest\n container_name: nextcloud\n environment:\n - PUID=${PUID}\n - PGID=${GUID}\n - TZ=Etc/UTC\n volumes:\n - /docker/nextcloud/config:/config\n - /docker/nextcloud/data:/data\n ports:\n - ${PORT}:443\n restart: unless-stopped\n</code></pre> <p>Info</p> <p>Si vous avez un NAS ou un disque r\u00e9seau partag\u00e9 via samba pour stocker vos donn\u00e9es, remplacez <code>/docker/nextcloud/data</code> par le chemin d'acc\u00e8s de votre dossier partag\u00e9.</p> <p>Trouvez votre PUID et votre GUID en tapant la commande suivante :</p> <p><pre><code>$ id nomdutilisateur\n</code></pre> Et renseignez le <code>.env</code> avec le port souhait\u00e9, et les infos que vous avez trouv\u00e9es, par exemple :</p> <pre><code>PUID=1000\nGUID=1000\nPORT=4545\n</code></pre> <p>D\u00e9ployez la stack et rendez-vous sur <code>http://ipduserveur:4545</code> et suivez les instructions.</p>"},{"location":"serveex/nextcloud/#exposer-nextcloud-avec-swag","title":"Exposer Nextcloud avec Swag","text":"<p>Tout l'int\u00e9r\u00eat d'une telle solution, c'est de pouvoir y acc\u00e9der \u00e0 distance et sur tout vos appareils. Pour cela, nous allons exposer Nextcloud via Swag.</p> <p>Info</p> <p>Nous partons du principe que vous avez le sous-domaine <code>nextcloud.mondomaine.fr</code> avec un <code>CNAME</code> qui pointe vers <code>mondomaine.fr</code> dans votre zone DNS. Et que bien s\u00fbr, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, le port <code>443</code> de votre box pointe bien sur le port <code>443</code> de votre serveur via les r\u00e8gles NAT.</p> <p>Dans Dockge, modifiez la stack <code>netxcloud</code>, et ajoutez le r\u00e9seau de swag. Pour rappel :</p> <pre><code>services:\n nomduservice:\n container_name: #...\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Dans les fichiers de nextcloud, \u00e9ditez le fichier <code>config.php</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <pre><code>$ sudo vi /docker/nextcloud/config/www/nextcloud/config/config.php\n</code></pre> <p>Entrez en modification avec la touche <code>i</code> et copiez les informations suivantes avant <code>);</code>.</p> <pre><code>'trusted_proxies' => [gethostbyname('swag')], 'overwrite.cli.url' => 'https://nextcloud.example.com/',\n'overwritehost' => 'nextcloud.example.com',\n'overwriteprotocol' => 'https',\n</code></pre> <p>Ajoutez \u00e9galement votre nom de domaine dans la section <code>array</code> , cela devrait ressembler \u00e0 ceci <pre><code> array (\n 0 => '192.168.0.1:444', # Cette ligne est surement diff\u00e9rente chez vous, ne la modifiez pas !\n 1 => 'nextcloud.mondomaine.fr', # Renseignez votre domaine\n ),\n</code></pre> Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Dans les dossiers de Swag, cr\u00e9ez le fichier <code>nextcloud.subdomain.conf</code>.</p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/nexctloud.subdomain.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous :</p> <pre><code>## Version 2024/04/25\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name nextcloud.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n location / {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app nextcloud;\n set $upstream_port 443;\n set $upstream_proto https;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n # Hide proxy response headers from Nextcloud that conflict with ssl.conf\n # Uncomment the Optional additional headers in SWAG's ssl.conf to pass Nextcloud's security scan\n proxy_hide_header Referrer-Policy;\n proxy_hide_header X-Content-Type-Options;\n proxy_hide_header X-Frame-Options;\n proxy_hide_header X-XSS-Protection;\n\n # Disable proxy buffering\n proxy_buffering off;\n }\n}\n</code></pre> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Et voil\u00e0, vous avez expos\u00e9 Nextcloud ! Et n'oubliez pas d'installer les applications pour ordinateurs et mobiles.</p> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik de fa\u00e7on native en suivant ces instructions.</p>"},{"location":"serveex/plex/","title":"Plex","text":"<p>Objectif</p> <ul> <li>Installer Plex</li> <li>Installer Tautulli</li> <li>Acc\u00e9der aux media depuis l'exterieur</li> </ul> <p>Plex est une plateforme de streaming vid\u00e9o d\u00e9ployable chez vous, pour manager votre biblioth\u00e8que de films ou de s\u00e9rie, et les lire en locale ou \u00e0 distance. Plex dispose d'applications TV, Android, iOS, Window et Mac OS, permettant la lecture de vos biblioth\u00e8ques, \u00e0 la Netflix. </p> <p>Avec le plexpass, vous pouvez \u00e9galement organsier et lire vos contenus audio, \u00e0 la spotify, la diff\u00e9rence \u00e9tant que c'est bien votre contenu qui est h\u00e9berg\u00e9 et lu depuis chez vous.</p> <p></p> <p>On installera \u00e9galement Tautulli, un outil qui permet d'avoir des stats pouss\u00e9es sur Plex. On utilisera, comme d\u00e8s qu'on le peut, les images de linuxserver.io.</p> <ul> <li>Plus d'info sur le conteneur Plex</li> <li>Plus d'info sur le conteneur Tautulli</li> </ul> <p>Note</p> <p>Vous serez amen\u00e9s \u00e0 creer un compte Plex.tv. Vous n'avez pas besoin d'exposer votre service Plex, il sera accessible directement par la plateforme. Votre serveur Plex sera g\u00e9rable directement depuis votre compte.</p>"},{"location":"serveex/plex/#installer-plex","title":"Installer Plex","text":"<p>Structure des dossiers : <pre><code>root\n\u251c\u2500\u2500 docker\n\u2502 \u251c\u2500\u2500 plex \n\u2502 \u2502 \u251c\u2500\u2500 compose.yml\n\u2502 \u2502 \u251c\u2500\u2500 .env\n\u2502 \u2502 \u251c\u2500\u2500 config\n\u2502 \u2502 \u2514\u2500\u2500 transcode\n\u2502 \u2514\u2500\u2500 tautulli\n\u2502 \u2514\u2500\u2500 config\n\u2514\u2500\u2500 video\n \u251c\u2500\u2500 tvseries\n \u251c\u2500\u2500 movies\n \u2514\u2500\u2500 library\n</code></pre></p> <p>Ouvrez Dockge dans votre navigeateur, et cliquez sur <code>compose</code>. Nommez la stack <code>plex</code> et ajoutez la config suivante :</p> <pre><code>version: \"2.1\"\nservices:\n linuxserver_plex:\n image: ghcr.io/linuxserver/plex:amd64-latest\n container_name: plex\n network_mode: host\n environment:\n - PUID=${PUID}\n - PGID=${GUID}\n - TZ=Europe/Paris\n - VERSION=docker\n volumes:\n - /docker/plex/config:/config\n - /docker/plex/transcode:/transcode\n - /video/tvseries:/data/tvshows:ro\n - /video/movies:/data/movies:ro\n - /video/library:/data/library:ro\n restart: unless-stopped\n mem_limit: 4096m\n mem_reservation: 2048m\n devices:\n - /dev/dri:/dev/dri\n\n tautulli:\n image: lscr.io/linuxserver/tautulli:latest\n container_name: tautulli\n environment:\n - PUID=${PUID}\n - PGID=${GUID}\n - TZ=Europe/Paris\n volumes:\n - /docker/tautulli/config:/config\n ports:\n - 8181:8181\n restart: unless-stopped\n</code></pre> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n plex:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n\n tautulli:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>Trouvez votre PUID et votre GUID en tapant la commande suivante :</p> <p><pre><code>$ id nomdutilisateur\n</code></pre> Et renseignez le <code>.env</code> avec les infos que vous avez trouv\u00e9es, par exemple :</p> <p><pre><code>PUID=1000\nGUID=1000\n</code></pre> D\u00e9ployez la stack.</p> <p>L'interface locale est disponible via <code>http://ipduserveur:32400/web/index.html</code>. L'interface de Tautulli est joignable via <code>http://ipduserveur:8181</code>.</p> <p>Echec</p> <p>Vous devez imp\u00e9rativement \u00eatre sur votre r\u00e9seau local au moment du premier setup de Plex, sans quoi l'url vous renverra sur votre compte Plex sans detecter votre serveur. Un VPN ne vous sauvera pas. Si vous ne pouvez pas faire autrement, vous pouvez g\u00e9rer l'installation \u00e0 distance via un tunnel SSH.</p>"},{"location":"serveex/plex/#parametrer-plex","title":"Param\u00e9trer Plex","text":"<p>Plex propose tout une gamme de film/s\u00e9rie gratuitement. Apr\u00e8s avoir cr\u00e9\u00e9 votre compte, et pour ne pas polluer votre biblioth\u00e8que, je vous conseille de tout d\u00e9sactiver dans la section Services en ligne.</p> <p>Ensuite rendez-vous dans la section Acc\u00e8s \u00e0 distance et choisissez un port manuellement (ici cela sera <code>1234</code>). Il est pr\u00e9f\u00e9rable de ne pas garder le port d'origine.</p> <p></p> <ul> <li>Sur votre routeur, redirigez le port <code>TCP</code> source <code>1234</code> vers le port <code>32400</code>, vers l'IP de votre serveur via les r\u00e8gles NAT.</li> <li>Une fois fait, retournez dans Plex afin de v\u00e9rifier que la connexion est bien op\u00e9rationnelle</li> </ul> <p>Si cela ne fonctionne pas</p> <p>V\u00e9rifiez les r\u00e8gles de votre pare-feu et autorisez le port <code>32400</code> de votre serveur.</p> <ul> <li>Si vous avez un abonnement PlexPass et un GPU ou iGPU, activez l'acc\u00e9l\u00e9ration mat\u00e9rielle dans la section Transcodeur.</li> <li>Dans la section R\u00e9glages/biblioth\u00e8que, cochez Analyser ma biblioth\u00e8que automatiquement.</li> <li>Dans la section G\u00e9rer/biblioth\u00e8que modifiez ou ajouter les biblioth\u00e8que, et choisissez le r\u00e9pertoire <code>/data/movies</code> pour les films et <code>/data/tvshows</code> pour les s\u00e9ries.</li> </ul> <p>Et voil\u00e0, vous avez un Plex fonctionnel ! </p> <p>Vous n'avez plus qu'a remplir les dossiers <code>/video</code> et <code>/tvseries</code> sur votre serveur de vos m\u00e9dia favoris. Vous pourrez alors t\u00e9l\u00e9charger l'application Plex sur vos appareils et lire vos m\u00e9dia favoris, chez vous ou \u00e0 distance !</p> <p>Note</p> <p>Si pour stocker vos m\u00e9dia vous utilisez un disque r\u00e9seau (par exemple un stockage sur un NAS ou un disque dur externe branch\u00e9 ailleurs sur le r\u00e9seau), veuillez consulter la section montage samba afin que Plex puisse y acc\u00e9der.</p>"},{"location":"serveex/plex/#exposer-tautulli-avec-swag","title":"Exposer Tautulli avec Swag","text":"<p>Plex n'a pas besoin d'etre expos\u00e9, \u00e9tant joignable directement depuis votre compte Plex sur plex.tv. </p> <p>En revanche, vous pouvez d\u00e9sirer exposer Tautulli, afin d'acc\u00e9der aux stats m\u00eame si vous n'est pas chez vous, depuis une simple url.</p> <p>Info</p> <p>Nous partons du principe que vous avez le sous-domaine <code>tautulli.mondomaine.fr</code> avec un <code>CNAME</code> qui pointe vers <code>mondomaine.fr</code> dans zone DNS. Et que bien s\u00fbr, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, le port <code>443</code> de votre box pointe bien sur le port <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Ouvrez Dockge et ajoutez le r\u00e9seau de swag au conteneur de Tautulli dans la conf de la stack Plex. Rappel sur comment ajouter un r\u00e9seau pr\u00e9-existant :</p> <pre><code>services:\n nomduservice:\n container_name: #...\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Info</p> <p>Ici nous partons du principe que le nom du r\u00e9seau de Swag est <code>swag_default</code>. </p> <p>Puis d\u00e9ployez \u00e0 nouveau la stack.</p> <p>Copiez en renommant le fichier <code>tautulli.subdomain.conf.sample</code> en <code>tautulli.subdomain.conf</code> et \u00e9ditez le :</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <pre><code>$ sudo cp /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf.sample /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf\n$ sudo vi /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf\n</code></pre> <p>Et v\u00e9rifiez que la configuration correspond bien \u00e0 ceci, sion \u00e9ditez le fichier en appuyant sur <code>i</code>:</p> <pre><code>## Version 2023/05/31\n# make sure that your tautulli container is named tautulli\n# make sure that your dns has a cname set for tautulli\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name tautulli.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app tautulli;\n set $upstream_port 8181;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location ~ (/tautulli)?/api {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app tautulli;\n set $upstream_port 8181;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location ~ (/tautulli)?/newsletter {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app tautulli;\n set $upstream_port 8181;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location ~ (/tautulli)?/image {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app tautulli;\n set $upstream_port 8181;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik en retirant les <code>#</code> devant <code>include /config/nginx/authentik-server.conf;</code> et <code>include /config/nginx/authentik-location.conf;</code> N'oubliez pas de cr\u00e9er une application et un fournisseur dans Authentik</p> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tappant <code>:x</code></p> <p>Patientez quelques minutes puis tapez dans votre navigateur <code>http://tautulli.mondomaine.fr</code>.</p> <p>En cas d'echec</p> <p>V\u00e9rifiez vos r\u00e8gles de pare-feu.</p> <p>Et voil\u00e0 !</p>"},{"location":"serveex/qbittorrent/","title":"Qbittorrent","text":"<p>Objectif</p> <ul> <li>Installer et configurer Qbittorent</li> <li>Etre reli\u00e9 au r\u00e9seau bittorent en toute s\u00e9curit\u00e9 avec Gluetun et Proton VPN</li> </ul> <p></p> <p>Afin de t\u00e9l\u00e9chargez vos media favoris en toute s\u00e9curit\u00e9, nous allons monter un syst\u00e8me \u00e0 base de :</p> <ul> <li>Qbittorent comme logiciel de t\u00e9l\u00e9chargement bittorent</li> <li>Proton VPN Plus, VPN pour s\u00e9curiser vos \u00e9changes, auquel vous devez souscrire (il y a de nombreux codes promo) pour acc\u00e9der au protocole Bittorent, mais vous pouvez \u00e9galement en choisir un autre, \u00e0 condition qu'il propose le protocole bittorent.</li> <li>Gluetun</li> <li>Qbittorent port update pour mettre automatiquement \u00e0 jour le port de votre VPN (qui change r\u00e9guli\u00e8rement).</li> <li>Et le mode vuetorrent pour une interface moderne et intuitive.</li> </ul> <p>Nous monterons ici le syst\u00e8me ci-dessous :</p> <p></p>"},{"location":"serveex/qbittorrent/#configuration","title":"Configuration","text":"<p>Structure des dossiers</p> <p><pre><code>root\n\u251c\u2500\u2500 docker\n\u2502 \u2514\u2500\u2500 seedbox\n\u2502 \u251c\u2500\u2500 qbittorent\n\u2502 \u2502 \u2514\u2500\u2500 config\n\u2502 \u251c\u2500\u2500 gluetun\n\u2502 \u251c\u2500\u2500 downloads #vos t\u00e9l\u00e9chargements g\u00e9n\u00e9riques\n\u2502 \u251c\u2500\u2500 compose.yaml\n\u2502 \u2514\u2500\u2500 .env\n\u2514\u2500\u2500 video #reli\u00e9 \u00e0 plex\n \u251c\u2500\u2500 movies #\u00e0 selectionner dans l'interface pour t\u00e9l\u00e9charger vos films\n \u2514\u2500\u2500 tvseries #\u00e0 selectionner dans l'interface pour t\u00e9l\u00e9charger vos s\u00e9ries\n</code></pre> Ouvrez Dockge, cliquez sur <code>compose</code> et nommez la stack <code>seedbox</code>. Collez la config ci-dessous : </p> <pre><code>version: \"2.1\"\nservices:\n qbit:\n image: ghcr.io/linuxserver/qbittorrent:latest\n container_name: qbittorrent\n restart: unless-stopped\n network_mode: service:gluetun\n mem_limit: 1g\n environment:\n - TZ=Europe/Paris\n - PUID=${PUID}\n - PGID=${GUID}\n - WEBUI_PORT=${UI_PORT}\n - DOCKER_MODS=ghcr.io/gabe565/linuxserver-mod-vuetorrent\n volumes:\n - /docker/seedbox/qbittorrent/config:/config\n - /docker/seedbox/downloads:/downloads\n - /video/movies:/movies\n - /video/tvseries:/tvseries\n depends_on:\n - gluetun\n\n gluetun:\n image: qmcgaw/gluetun:v3.38\n container_name: gluetun\n restart: unless-stopped\n mem_limit: 1g\n volumes:\n - /docker/seedbox/gluetun:/gluetun\n ports:\n - ${UI_PORT}:5695 # (1)!\n - 8000:8000 # (2)!\n cap_add:\n - NET_ADMIN\n environment:\n - TZ=Europe/Paris\n - VPN_SERVICE_PROVIDER=custom\n - VPN_TYPE=wireguard\n - VPN_ENDPOINT_IP=${IP}\n - VPN_ENDPOINT_PORT=${PORT}\n - WIREGUARD_PUBLIC_KEY=${PU_KEY}\n - WIREGUARD_PRIVATE_KEY=${PR_KEY}\n - WIREGUARD_ADDRESSES=${IP_MASK}\n - VPN_PORT_FORWARDING=on\n - VPN_PORT_FORWARDING_PROVIDER=protonvpn\n - UPDATER_PERIOD=6h\n - BLOCK_MALICIOUS=off\n - BLOCK_SURVEILLANCE=off\n - BLOCK_ADS=off\n - DOT=off\n - HEALTH_VPN_DURATION_INITIAL=20s\n - HEALTH_VPN_DURATION_ADDITION=15s\n - HEALTH_SUCCESS_WAIT_DURATION=10s\n\n qbittorrent-port-update:\n image: technosam/qbittorrent-gluetun-port-update:latest\n container_name: qbittorrent_port_update\n network_mode: service:gluetun\n environment:\n - QBITTORRENT_WEBUI_PORT=${UI_PORT}\n - QBITTORRENT_WEBUI_USERNAME=${ID}\n - QBITTORRENT_WEBUI_PASSWORD=${PW}\n restart: unless-stopped\n depends_on:\n - gluetun\n</code></pre> <ol> <li> Port de la web-ui</li> <li> Port de controle de Gluetun</li> </ol> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n qbittorent:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n gluetun:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n qbittorrent-port-update:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>Et renseignez dans <code>.env</code>:</p> <pre><code>PUID=\nGUID=\nIP=\nPORT=\nUI_PORT=\nPU_KEY=\nPR_KEY=\nIP_MASK=\nID=\nPW=\n</code></pre> <p>En d\u00e9tails :</p> Variable Valeur Exemples <code>PUID=</code> A renseigner avec les infos de votre user (trouvables via la commande <code>$ id nomdutilisateur</code>) <code>1000</code> <code>GUID=</code> A renseigner avec les infos de votre user (trouvables via la commande <code>$ id nomdutilisateur</code>) <code>1000</code> <code>IP=</code> l'IP du endpoint de Proton, fournie par Proton. Les serveurs les plus performants \u00e9tant en Suisse, je vous conseille d'en s\u00e9lectionner un l\u00e0 bas. <code>123.45.67.89</code> <code>PORT=</code> Le port de Wireguard, ici <code>51820</code> pour Proton <code>51820</code> <code>UI_PORT=</code> Le port d'acc\u00e8s \u00e0 la web ui, elle sera joignable via <code>http//ipduserveur:port</code> <code>5695</code> <code>PU_KEY=</code> La cl\u00e9e publique fournie par Proton <code>aNhcz1l3JfWbFZo2XMpzQlP2iOqk</code> <code>PR_KEY=</code> La cl\u00e9e priv\u00e9e fournie par Proton <code>buKsjNHLyzKMM1qYnzOy4s7SHfly</code> <code>IP_MASK=</code> L'IP fournie par Proton et son masque <code>10.2.0.2/32</code> <code>ID=</code> Nom d'utilisateur que vous devrez reporter ensuite dans l'interface de Qbittorent. Attention \u00e0 bien renseigner la meme chose dans Qbittorent. <code>monuser</code> <code>PW=</code> Mot de passe que vous devrez reporter ensuite dans l'interface de Qbittorent. Attention \u00e0 bien renseigner la meme chose dans Qbittorent. <code>monmotdepasse</code>"},{"location":"serveex/qbittorrent/#deploiement","title":"D\u00e9ploiement","text":"<p>Une fois fait, d\u00e9ployez le conteneur.</p> <p>Attention</p> <p>Dans les logs de lancement, vous trouverez un mot de passe temporaire pour l'utilisateur <code>admin</code></p> <p>Loggez vous sur <code>http://ipduserveur:5695</code> (ou le port que vous avez configur\u00e9). </p> <p>En cas d'echec</p> <p>V\u00e9rifiez les r\u00e8gles de votre pare-feu.</p> <p>Changez votre nom d'utilisateur et votre mot de passe par ceux que vous avez configur\u00e9 dans le <code>.env</code></p> <p>Relancez la stack afin de vous assurer que le conteneur qui met \u00e0 jour le port s'est bien connect\u00e9 avec vos identifiants</p> <p>Et voil\u00e0 ! Lorsque vous lancez un t\u00e9l\u00e9chargement, n'oubliez pas de pr\u00e9ciser le bon r\u00e9pertoire de t\u00e9l\u00e9chargement afin que Plex puisse synchroniser correctement sa biblioth\u00e8que.</p>"},{"location":"serveex/qbittorrent/#exposer-la-webui","title":"Exposer la webui","text":"<p>Afin de lancer des t\u00e9l\u00e9chargement hors de chez vous, sans VPN, vous pouvez exposer la webui de Qbittorent. </p> <p>Info</p> <p>Nous partons du principe que vous avez renseign\u00e9 un sous-domaine <code>seedbox.mondomaine.fr</code> avec un <code>CNAME</code> pointant sur mondomaine.fr dans les enregistrement DNS de votre registrar. Et que bien s\u00fbr, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, le port <code>443</code> de votre box pointe bien sur le port <code>443</code> de votre serveur via les r\u00e8gles NAT.</p> <p>Pour cela, ajoutez le r\u00e9seau de swag \u00e0 gluetune via Dockge en ajoutant manuellement comme dans cet exemple :</p> <pre><code>services:\n gluetun:\n container_name: gluetun\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Note</p> <p>Ici nous partons du principe que le nom du r\u00e9seau de Swag est swag_default. Puis d\u00e9ployez \u00e0 nouveau la stack.</p> <p>Puis nous allons cr\u00e9er et \u00e9diter le fichier<code>seedbox.subdomain.conf</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/seedbox.subdomain.conf\n</code></pre> <p>Entrez en modification en appuyant sur <code>i</code> et copiez la configuration ci-dessous, en prenant soin de v\u00e9rifier le port : </p> <pre><code>## Version 2023/12/19\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name seedbox.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n #if ($lan-ip = yes) { set $geo-whitelist yes; }\n #if ($geo-whitelist = no) { return 404; }\n if ($geo-blacklist = no) { return 404; }\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app gluetun;\n set $upstream_port 5555;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik en retirant les <code>#</code> devant <code>include /config/nginx/authentik-server.conf;</code> et <code>include /config/nginx/authentik-location.conf;</code> N'oubliez pas de cr\u00e9er une application et un fournisseur dans Authentik</p> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code>. Patientez quelques minutes puis tapez dans votre navigateur <code>https://seedbox.mondomaine.fr</code>, vous arriverez sur l'interface de Qbittorent.</p> <p>Et voil\u00e0, vous avez un mediacenter pret \u00e0 l'emploi !</p> <p></p>"},{"location":"serveex/swag/","title":"SWAG","text":"<p>Swag est le noyau de ce homelab. C'est un reverse proxy puissant qui permet d'exposer des services sur le net via un ou des noms de domaines, en se chargeant de l'\u00e9mission des certificats SSL (pour garder des connexions chiffr\u00e9es), du routage des requ\u00eates et de la s\u00e9curisation des acc\u00e8s (par authent HTTP ou par SSO comme Authelia ou Authentik). Toute la doc n\u00e9cessaire ce situe ici.</p> <p>Ci-dessous, vous trouverez un exemple, exposant Dockge.</p> <p>Objectif</p> <ul> <li>Installer Swag</li> <li>Activer le SSL</li> <li>Acc\u00e9der au tableau de bord</li> <li>Configurer le blocage r\u00e9gional</li> <li>Exposer Dockge</li> </ul> <p>Info</p> <p>Ce tutoriel part du principe que vous avez un nom de domaine qui pointe vers votre serveur, et que votre box a une r\u00e8gle NAT qui redirige le port <code>443</code> vers l'adresse IP et le port <code>443</code> de votre serveur. Le nom de domaine d'exemple sera <code>mondomaine.fr</code>.</p> <p>Nous installerons SWAG, ainsi que le mod dbip servant \u00e0 bloquer les connexions en fonction de la g\u00e9oloc, ainsi que le mod dashboard qui permet de piloter le fonctionnement de swag, fail2ban et la g\u00e9oloc.</p> <p>Principe d'un reverse proxy et application dans notre cas :</p> <p></p>"},{"location":"serveex/swag/#installation","title":"Installation","text":"<p>Plan des fichiers que nous allons modifier :</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 swag\n \u251c\u2500\u2500 config\n \u2502 \u251c\u2500\u2500 dns-conf\n \u2502 \u2502 \u2514\u2500\u2500 ovh.ini\n \u2502 \u2514\u2500\u2500 nginx\n \u2502 \u251c\u2500\u2500 dbip.conf\n \u2502 \u251c\u2500\u2500 nginx.conf\n \u2502 \u2514\u2500\u2500 proxy-confs\n \u2502 \u2514\u2500\u2500 dockge.subdomain.conf \n \u251c\u2500\u2500 compose.yml\n \u2514\u2500\u2500 .env\n</code></pre> <p>Ouvrez Dockge dans votre navigateur, cliquez sur <code>compose</code>, nommez la stack <code>swag</code> et copiez la conf ci-dessous</p> <pre><code>version: \"2\"\nservices:\n swag:\n image: lscr.io/linuxserver/swag:latest\n container_name: swag\n cap_add:\n - NET_ADMIN\n env_file:\n - .env\n environment:\n - TZ=Europe/Paris\n - URL=${DOMAIN}\n - EXTRA_DOMAINS=${DOMAINS}\n - SUBDOMAINS=wildcard # (1)!\n - VALIDATION=dns\n - DNSPLUGIN=${PLUGIN}\n - EMAIL=${EMAIL}\n - DOCKER_MODS=linuxserver/mods:swag-dbip|linuxserver/mods:swag-dashboard|linuxserver/mods:swag-auto-reload\n volumes:\n - /docker/swag/config:/config\n ports:\n - 80:80\n - 443:443\n - 81:81 # (2)!\n restart: unless-stopped\n networks:\n - swag\n\nnetworks:\n swag:\n name: swag_default\n</code></pre> <ol> <li> Couvre les sous-domaines</li> <li> N\u00e9cessaire pour le dashboard</li> </ol> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n swag:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>Puis dans le <code>.env</code> :</p> <pre><code>DOMAIN=\nDOMAINS=\nEMAIL=\nPLUGIN=\n</code></pre> <p>Remplissez comme suit </p> Propri\u00e9t\u00e9 Valeur Exemples <code>DOMAIN</code> Votre domaine (cela couvre aussi tous les sous-domaines) <code>mondomaine.fr</code> <code>DOMAINS</code> Vos \u00e9ventuels autres domaines <code>monsecondomaine.fr</code> <code>EMAIL</code> Votre email, pour g\u00e9n\u00e9rer le certificat <code>votre@email.fr</code> <code>PLUGIN</code> Le plugin pour g\u00e9n\u00e9rer le certificat, li\u00e9 \u00e0 votre fournisseur de zone DNS <code>ovh</code><code>cloudflare</code> <p>Ici nous partons du principe que votre zone DNS est chez OVH. D\u00e9ployez la stack une premiere fois. Dans les logs vous verrez qu'il n'arrivera pas \u00e0 cr\u00e9er de certificat SSL car le fichier ovh.ini renvoi une erreur. Arretez la stack.</p> <p>En CLI, allez dans le dossier dns-conf et \u00e9ditez le fichier <code>ovh.ini</code> :</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <pre><code>$ sudo vi /docker/swag/config/dns-conf/ovh.ini\n</code></pre> <p>Voici ce qui s'affiche :</p> <p><pre><code># Instructions: https://github.com/certbot/certbot/blob/master/certbot-dns-ovh/certbot_dns_ovh/__init__.py#L20\n# Replace with your values\ndns_ovh_endpoint = ovh-eu\ndns_ovh_application_key = \ndns_ovh_application_secret = \ndns_ovh_consumer_key = \n</code></pre> Authentifiez vous et cr\u00e9ez votre token ici. </p> <p>Les permissions \u00e0 configurer sont les suivantes :</p> <ul> <li><code>GET /domain/zone/*</code></li> <li><code>PUT /domain/zone/*</code></li> <li><code>POST /domain/zone/*</code></li> <li><code>DELETE /domain/zone/*</code></li> </ul> <p>Notez les 3 cl\u00e9s temporairement et renseignez le fichier <code>ovh.ini</code>. (avec vim, <code>i</code> pour passer en modif, <code>Echap</code> quand c'est fini, <code>:x</code> pour sauvegarder et quitter)</p> <p>Sauvegardez et quittez le fichier. </p> <p>Configurez aussi swag pour qu'il acc\u00e8de \u00e0 DBIP, le module de gestion des acc\u00e8s par g\u00e9olocalisation /Ouvrez le fichier nginx.conf</p> <pre><code>$ sudo vi /docker/swag/config/nginx/nginx.conf\n</code></pre> <p>Et ajoutez la ligne suivante en dessous de la section <code>http</code> :</p> <pre><code>include /config/nginx/dbip.conf\n</code></pre> <p>Relancez la stack dans Dockge, cette fois le certificat SSL est bien \u00e9mis ! V\u00e9rifiez dans les logs que le serveur est bien ready.</p>"},{"location":"serveex/swag/#dashboard","title":"Dashboard","text":"<p>Accedez au dashboard via votre r\u00e9seau local en tapant <code>http//ipdevotreserveur:81</code> A gauche, vous trouverez la liste des services actuellement \"proxied\" (aucun pour le moment). A droite, les IP bannies. En-dessous, une liste d'indicateurs. pour le d\u00e9tail, c'est par ici.</p> <p></p>"},{"location":"serveex/swag/#dbip","title":"DBIP","text":"<p>DBIP permet de bloquer les connexions en fonction des pays. Il s'appuie sur le fichier de config nomm\u00e9 <code>dbip.conf</code> dans <code>/docker/swag/config/nginx</code>. Plus d'info ici.</p> <p>Dans cet exemple, nous allons le configurer pour bloquer une liste de pays connus pour etre \u00e0 l'origine de la plupart des connexions malveillantes. Nous allons \u00e9galement configurer une variable au cas o\u00f9 nous souhaiterions permettre au r\u00e9seau interne du serveur, au r\u00e9seau local de votre box ainsi qu'\u00e0 un \u00e9ventuel vpn en 10.x.x.x de pouvoir acc\u00e9der \u00e0 vos services, mais pas directement \u00e0 internet.</p> <p>La configuration est activable ou d\u00e9sactivable pour chaque service qui sera proxied (voir exemple de Dockge plus bas).</p> <p>Ouvrez <code>dbip.conf</code> :</p> <pre><code>$ sudo vi /docker/swag/config/nginx/dbip.conf\n</code></pre> <p>Faites vos modifications (voir documentation), ou prenez l'exemple suivant: </p> <pre><code>geoip2 /config/geoip2db/dbip-country-lite.mmdb {\n auto_reload 1w;\n $geoip2_data_continent_code continent code;\n $geoip2_data_country_iso_code country iso_code;\n}\n\n# Country Codes: https://en.wikipedia.org/wiki/ISO_3166-2\n\nmap $geoip2_data_country_iso_code $geo-whitelist {\n # default yes;\n # Example for whitelisting a country, comment out 'default yes;' above and uncomment 'default no;' and the whitelisted country below\n default no;\n FR yes;\n}\n\nmap $geoip2_data_country_iso_code $geo-blacklist {\n default yes;\n # Example for blacklisting a country, uncomment the blacklisted country below\n CN no; #China\n RU no; #Russia\n HK no; #Hong Kong\n IN no; #India\n IR no; #Iran\n VN no; #Vietnam\n TR no; #Turkey\n EG no; #Egypt\n MX no; #Mexico\n JP no; #Japan\n KR no; #South Korea\n KP no; #North Korea\n PE no; #Peru\n BR no; #Brazil\n UA no; #Ukraine\n ID no; #Indonesia\n TH no; #Thailand\n }\n\ngeo $lan-ip {\n default no;\n 10.0.0.0/8 yes;\n 172.16.0.0/12 yes;\n 192.168.0.0/16 yes;\n 127.0.0.1 yes;\n}\n</code></pre> <p>Sauvegardez et quittez. Red\u00e9marrez la stack.</p> <p>Dans les fichiers de conf des domaines (section suivante), vous pourrez activer ou d\u00e9sactiver la whitelist ou la blacklist (voir documentation ici). Dans notre cas, la whitelist laisse uniquement passer les requ\u00eates fran\u00e7aises. La blacklist laisse passer tout le monde sauf la liste de pays mentionn\u00e9e. On utilisera donc la blacklist, sur ce mod\u00e8le :</p> <pre><code> server {\n listen 443 ssl;\n listen [::]:443 ssl;\n\n server_name some-app.*;\n include /config/nginx/ssl.conf;\n client_max_body_size 0;\n\n if ($geo-blacklist = no) { return 404; }\n\n location / {\n</code></pre>"},{"location":"serveex/swag/#exposer-dockge","title":"Exposer Dockge","text":"<p>Au pr\u00e9alable</p> <p>Nous partons du principe que vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>dockge.mondomaine.fr</code> avec pour <code>CNAME</code> <code>mondomaine.fr</code> et \u00e0 moins que vous utilisiez Cloudflare Zero Trust, que que vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Il s'agit maintenant d'exposer Dockge sur internet, afin de pouvoir y acc\u00e9der et g\u00e9rer vos conteneurs sans que vous soyez chez vous. Pour cela, nous partons du principe que vous avez configur\u00e9 un sous domaine <code>dockge.mondomaine.fr</code> dans votre zone DNS dont le <code>CNAME</code> pointe sur <code>mondomaine.fr</code>.</p> <p>Ouvrez le fichier dockge.subdomain.conf :</p> <pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf\n</code></pre> <p>Param\u00e9trez le comme tel :</p> <pre><code>## Version 2023/12/19\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n # indique que le sous-domaine doit \u00eatre dirig\u00e9\n server_name dockge.*; \n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n #if ($lan-ip = yes) { set $geo-whitelist yes; }\n #if ($geo-whitelist = no) { return 404; }\n # indique que les pays dans la blacklist sont intedits\n if ($geo-blacklist = no) { return 404; } \n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n\n set $upstream_app dockge; # (1)!\n set $upstream_port 5001; # (2)!\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <ol> <li> Nom du conteneur</li> <li> Port interne conteneur</li> </ol> <p>Sauvegardez et quittez. La configuration va se mettre \u00e0 jour en quelques secondes. </p> <p>Info</p> <p>Par d\u00e9faut, swag ne connait pas le nom \"dockge\". Pour qu'il puisse y acc\u00e9der, vous devez rajouter le r\u00e9seau de swag dans le <code>compose.yml</code> de dockge. </p> <p>Rendez-vous sur la stack de dockge, puis cliquez sur <code>\u00e9diter</code>, et ajouter le r\u00e9seau de Swag dans le fichier de conf sur ce modele (les champs <code>networks</code>) :</p> <pre><code>services:\n dockge:\n container_name: #...\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Info</p> <p>Ici nous partons du principe que le nom du r\u00e9seau de Swag est <code>swag_default</code>. </p> <p>D\u00e9ployez \u00e0 nouveau la stack.</p> <p>Patientez puis tapez <code>https://dockge.mondomaine.fr</code> dans votre navigateur, vous devriez \u00eatre redirig\u00e9 vers dockge. Vous pouvez v\u00e9rifier le statut du service via le dashboard (depuis votre r\u00e9seau local, http://ipdevotreserveur:81)</p>"},{"location":"serveex/swag/#exposer-un-autre-service-avec-swag","title":"Exposer un autre service avec SWAG","text":"<p>Swag dispose de modeles pour la plupart des services connus, nomm\u00e9s <code>nomduservice.subdomain.conf.sample</code>. Il vous suffit de cr\u00e9er le sous-domaine dans votre zone DNS chez votre registrar (comme OVH par exemple), de le faire pointer sur votre domaine principale (via un enregistrement CNAME) et de copier en renommant <code>nomduservice.subdomain.conf.sample</code> en <code>nomduservice.subdomain.conf</code>. </p> <pre><code>$ cd /docker/swag/config/proxy-confs\n$ sudo cp nomduservice.subdomain.conf.sample nomduservice.subdomain.conf\n</code></pre> <p>Si le sous domaine n'est pas redirig\u00e9 correctement</p> <ul> <li> <p>\u00e9ditez le fichier et v\u00e9rifiez notamment le nom du conteneur dans <code>set $upstream_app nomduconteneur;</code></p> </li> <li> <p>v\u00e9rifiez que vous avez bien ajout\u00e9 le r\u00e9seau de swag dans le <code>compose.yml</code> du conteneur (via Dockge par exemple).</p> </li> </ul> <p>Vous pouvez aussi choisir le sous-domaine en changeant la variable <code>server_name votresousdomaine.*;</code> et en renommant le fichier <code>votresousdomaine.subdomain.conf</code>.</p>"},{"location":"serveex/uptime-kuma/","title":"Uptime-Kuma","text":"<p>Objectif</p> <ul> <li>Installer et d\u00e9ployer Uptime-Kuma</li> <li>Exposer Uptime Kuma</li> <li>(Optionnel) Prot\u00e9ger Uptime-Kuma avec Authentik</li> </ul> <p>Uptime-Kuma est un conteneur d\u00e9di\u00e9 au monitoring de services. Le principe est d'envoyer des requ\u00eates r\u00e9guli\u00e8res \u00e0 vos services afin de d\u00e9terminer s'ils sont en lignes ou non, et de vous alerter le cas \u00e9ch\u00e9ant. Uptime-Kuma est d\u00e9velopp\u00e9 par le meme d\u00e9veloppeur que Dockge. </p> <p></p>"},{"location":"serveex/uptime-kuma/#installation","title":"Installation","text":"<p>Structure des dossiers</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 uptime-kuma\n \u251c\u2500\u2500 date\n \u2514\u2500\u2500 compose.yaml\n</code></pre> <p>Ouvrez Dockge, cliquez sur <code>compose</code>, appelez la stack <code>uptime-kuma</code> puis copiez collez ceci :</p> <pre><code>version: \"3.3\"\nservices:\n uptime-kuma:\n image: louislam/uptime-kuma:1\n container_name: uptime-kuma\n volumes:\n - /docker/uptime-kuma/uptime-kuma-data:/app/data\n ports:\n - 3200:3001 # <Host Port>:<Container Port>\n restart: always\n</code></pre> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n uptime-kuma:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>Vous n'avez plus qu'\u00e0 acc\u00e9der \u00e0 l'outil via <code>http://ipdevotreserveur:3200</code>.</p>"},{"location":"serveex/uptime-kuma/#exposer-avec-swag","title":"Exposer avec Swag","text":"<p>Info</p> <p>Nous partons du principe que vous avez le sous-domaine <code>stats.mondomaine.fr</code> avec un <code>CNAME</code> qui pointe vers <code>mondomaine.fr</code> dans votre zone DNS. Et que bien s\u00fbr, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, le port <code>443</code> de votre box pointe bien sur le port <code>443</code> de votre serveur via les r\u00e8gles NAT.</p> <p>Dans les dossiers de Swag, cr\u00e9ez le fichier <code>stats.subdomain.conf</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/stats.subdomain.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous :</p> <p><pre><code>## Version 2023/12/19\n\nserver {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name stats.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 0;\n\n #if ($lan-ip = yes) { set $geo-whitelist yes; }\n #if ($geo-whitelist = no) { return 404; }\n if ($geo-blacklist = no) { return 404; }\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app uptime-kuma;\n set $upstream_port 3001;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Dans Dockge, modifiez la stack <code>Uptime-Kuma</code>, et ajoutez le r\u00e9seau de swag. Pour rappel :</p> <pre><code>services:\n nomduservice:\n container_name: #...\n # ... \n networks: # (1)!\n - swag # (2)!\n\nnetworks: # (3)!\n swag: # (6)!\n name: swag_default # (4)!\n external: true # (5)!\n</code></pre> <ol> <li> Relie le conteneur au r\u00e9seau custom. A faire pour chaque conteneur \u00e0 exposer de la stack </li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> <li> D\u00e9fini le r\u00e9seau custom</li> <li> Nom v\u00e9ritable du r\u00e9seau externe</li> <li> Pr\u00e9cise que c'est un r\u00e9seau \u00e0 rechercher en externe</li> <li> Nom du r\u00e9seau d\u00e9clar\u00e9 dans la stack</li> </ol> <p>Info</p> <p>Ici nous partons du principe que le nom du r\u00e9seau de Swag est <code>swag_default</code>. </p> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik en ouvrant <code>stats.subodmain.conf</code> et en retirant les <code>#</code> devant <code>include /config/nginx/authentik-server.conf;</code> et <code>include /config/nginx/authentik-location.conf;</code> N'oubliez pas de cr\u00e9er une application et un fournisseur dans Authentik.</p> <p>Si vous souhaitez que la page publique de stats soit joignable par tout le monde sans authentification:</p> <ul> <li>Editez le fournisseur d'Uptime-Kuma</li> <li>Dans param\u00e8tres avanc\u00e9s du protocole > chemins authentifi\u00e9s, saisissez :</li> </ul> <pre><code>^/$\n^/status\n^/assets/\n^/assets\n^/icon.svg\n^/api/.*\n^/upload/.*\n^/metrics\n</code></pre> <p>D\u00e9ployez \u00e0 nouveau la stack.</p> <p>Uptime-Kuma sera ainsi joignable directement depuis internet en tapant <code>https://stats.mondomaine.fr</code>.</p> <p>Astuce</p> <p>Si vous utilisez Authentik et que vous ne craignez pas d'exposer votre panneau admin \u00e0 votre r\u00e9seau local, vous pouvez d\u00e9sactiver l'authentification d'Uptime-Kuma via les param\u00e8tres, afin de ne garder que celle d'Authentik.</p>"},{"location":"serveex/vaultwarden/","title":"Vaultwarden","text":"<p>Objectifs</p> <p>Installer Vaultwarden pour g\u00e9rer vos mot de passe sur tout vos appareils (remplace la gestion de mot de passe Google ou Apple).</p> <p></p> <p>Vaultwarden est une solution de gestion de vos mot de passe (g\u00e9n\u00e9ration, saisie semi-automatique...) que vous pouvez installer directement sur votre serveur. Cette solution remplace les gestionnaires comme Google, Apple ou Keepass. Cette solution permet de synchroniser tout vos mots de passe sur vos diff\u00e9rentes machines, avec un chiffrement de bout en bout.</p> <p>Vaultwarden est un fork de la solution Bitwarden.</p>"},{"location":"serveex/vaultwarden/#installation","title":"Installation","text":"<p>Structure des dossiers</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 vaultwarden\n \u251c\u2500\u2500 data\n \u251c\u2500\u2500 compose.yaml\n \u2514\u2500\u2500 .env\n</code></pre> <p>Ouvrez Dockge, cliquez sur <code>compose</code>, appelez la stack <code>vaultwarden</code> puis copiez collez ceci :</p> <pre><code>version: \"3\"\nservices:\n vaultwarden:\n container_name: vaultwarden\n image: vaultwarden/server:latest\n restart: unless-stopped\n env_file:\n - .env\n volumes:\n - ./data/:/data/\n ports:\n - 3050:80\n environment:\n - DOMAIN=${URL}\n - LOGIN_RATELIMIT_MAX_BURST=10\n - LOGIN_RATELIMIT_SECONDS=60\n - ADMIN_RATELIMIT_MAX_BURST=10\n - ADMIN_RATELIMIT_SECONDS=60\n - ADMIN_TOKEN=${TOKEN}\n - SENDS_ALLOWED=true\n - EMERGENCY_ACCESS_ALLOWED=true\n - WEB_VAULT_ENABLED=true\n - SIGNUPS_ALLOWED=false\n - SIGNUPS_VERIFY=true\n - SIGNUPS_VERIFY_RESEND_TIME=3600\n - SIGNUPS_VERIFY_RESEND_LIMIT=5\n\nnetworks:\n swag:\n name: swag_default\n external: true\n</code></pre> <p>Note</p> <p>Nous avons ajout\u00e9 le r\u00e9seau de Swag afin que les deux puissent communiquer ensemble. Assurez-vous que le nom du r\u00e9seau soit correct. Nous partons du principe qu'il se nomme <code>swag_default</code></p> <p>Astuce</p> <p>Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises \u00e0 jour <pre><code>services:\n vauktwarden:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>Nous allons maintenant g\u00e9n\u00e9rer un hash de mot de passe, qu'il faudra renseigner dans la variable <code>TOKEN=</code> du <code>.env</code></p> <pre><code>$ echo -n \"votremotdepasse\" | argon2 \"$(openssl rand -base64 32)\" -e -id -k 65540 -t 3 -p 4\n</code></pre> <p>Copiez le r\u00e9sultat pr\u00e9cieusement.</p> <p>Dans le <code>.env</code>, renseignez les variables suivantes :</p> <pre><code>URL=\nTOKEN=\n</code></pre> Variable Valeur Exemple <code>URL=</code> L'url de votre serveur vaultwarden <code>https://vault.domaine.fr</code> <code>TOKEN=</code> Le token que vous avez pr\u00e9c\u00e9demment copi\u00e9 pr\u00e9cieusement <code>'$argon2id$v=19$m=65540,t=3,p=4$bXBGMENBZUVzT3VUSFErTzQzK25Jck1BN2Z0amFuWjdSdVlIQVZqYzAzYz0$T9m73OdD2mz9+aJKLuOAdbvoARdaKxtOZ+jZcSL9/N0'</code> <p>Puis d\u00e9ployez le conteneur.</p> <p>Acc\u00e9dez au panneau d'administration via <code>http://ipduserveur:3050</code> et cr\u00e9ez votre compte. Plus d'info sur les fonctionnalit\u00e9s de Bitwarden.</p>"},{"location":"serveex/vaultwarden/#exposer-vaultwarden-avec-swag","title":"Exposer Vaultwarden avec SWAG","text":"<p>Tout l'int\u00e9r\u00eat d'une telle solution, c'est de pouvoir y acc\u00e9der \u00e0 distance et sur tout vos appareils. Pour cela, nous allons exposer Vaultwarden via SWAG.</p> <p>Au pr\u00e9alable</p> <p>Nous partons du principe que vous avez cr\u00e9\u00e9 dans votre zone DNS un sous domaine du type <code>vault.mondomaine.fr</code> avec pour <code>CNAME</code> <code>mondomaine.fr</code> et, \u00e0 moins que vous utilisiez Cloudflare Zero Trust, que que vous avez d\u00e9j\u00e0 redirig\u00e9 le port <code>443</code> de votre box vers le <code>443</code> de votre serveur dans les r\u00e8gles NAT.</p> <p>Dans les dossiers de Swag, cr\u00e9ez le fichier <code>vault.subdomain.conf</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <p><pre><code>$ sudo vi /docker/swag/config/nginx/proxy-confs/vault.subdomain.conf\n</code></pre> Entrez en modification avec la touche <code>i</code> et collez la configuration ci-dessous :</p> <pre><code>server {\n listen 443 ssl http2;\n listen [::]:443 ssl http2;\n\n server_name vault.*;\n\n include /config/nginx/ssl.conf;\n\n client_max_body_size 128M;\n\n # enable for ldap auth (requires ldap-location.conf in the location block)\n #include /config/nginx/ldap-server.conf;\n\n # enable for Authelia (requires authelia-location.conf in the location block)\n #include /config/nginx/authelia-server.conf;\n\n # enable for Authentik (requires authentik-location.conf in the location block)\n #include /config/nginx/authentik-server.conf;\n\n location / {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app vaultwarden;\n set $upstream_port 80;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location ~ ^(/vaultwarden)?/admin {\n # enable the next two lines for http auth\n #auth_basic \"Restricted\";\n #auth_basic_user_file /config/nginx/.htpasswd;\n\n # enable for ldap auth (requires ldap-server.conf in the server block)\n #include /config/nginx/ldap-location.conf;\n\n # enable for Authelia (requires authelia-server.conf in the server block)\n #include /config/nginx/authelia-location.conf;\n\n # enable for Authentik (requires authentik-server.conf in the server block)\n #include /config/nginx/authentik-location.conf;\n\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app vaultwarden;\n set $upstream_port 80;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location ~ (/vaultwarden)?/api {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app vaultwarden;\n set $upstream_port 80;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n\n location ~ (/vaultwarden)?/notifications/hub {\n include /config/nginx/proxy.conf;\n include /config/nginx/resolver.conf;\n set $upstream_app vaultwarden;\n set $upstream_port 80;\n set $upstream_proto http;\n proxy_pass $upstream_proto://$upstream_app:$upstream_port;\n\n }\n}\n</code></pre> <p>Appuyez sur <code>Echap</code> puis sauvegardez et quittez en tapant <code>:x</code> puis en appuyant sur <code>Entr\u00e9e</code>.</p> <p>Et voil\u00e0, vous avez expos\u00e9 Vaultwarden ! N'oubliez pas d'installer les extensions Bitwarden (elles sont compatibles avec Vaultwarden) pour Chrome ou pour Firefox ainsi que les applications iOS et Android afin de synchroniser vos mot de passe.</p> <p>Prot\u00e9ger avec Authentik</p> <p>Vous pouvez prot\u00e9ger cette app avec Authentik en ouvrant <code>tools.subodmain.conf</code> et en retirant les <code>#</code> devant chacune des lignes <code>include /config/nginx/authentik-server.conf;</code> et <code>include /config/nginx/authentik-location.conf;</code> N'oubliez pas de cr\u00e9er une application et un fournisseur dans Authentik.</p>"},{"location":"serveex/wireguard/","title":"Wireguard","text":"<p>Objectif</p> <ul> <li>Installer Wireguard</li> <li>Configurer les clients</li> <li>Acc\u00e9der au r\u00e9seau s\u00e9curis\u00e9</li> </ul>"},{"location":"serveex/wireguard/#introduction","title":"Introduction","text":"<p>L'utilisation d'un VPN permet d'acc\u00e9der \u00e0 distance aux ressources locales du serveur sans les exposer sur internet. C'est notamment une mani\u00e8re propre de s\u00e9curiser l'acc\u00e8s \u00e0 la console SSH, plutot que d'exposer le port sur internet. C'est permettre de pouvoir se connecter \u00e0 son r\u00e9seau o\u00f9 que l'on soit, de maniere s\u00e9curiser, et de faire dialoguer des machines qui sont sur des r\u00e9seaux diff\u00e9rents.</p> <p>Ici nous utiliserons Wireguard, un serveur VPN s\u00e9curis\u00e9 et tr\u00e8s performant, \u00e0 l'aide des conteneurs :</p> <ul> <li>wg-easy pour le serveur, qui propose une interface web tr\u00e8s simple pour controler les connexions et t\u00e9l\u00e9charger les fichiers de conf (notamment par QR code pour les t\u00e9l\u00e9phones)</li> <li>Wireguard pour les clients linux</li> </ul> <p>Il existe aussi des clients Windows, MacOS, iOS et Android.</p> <p>Le principe est le suivant :</p> <ul> <li>Sur internet, n'importe qui peut contacter n'importe quel box internet et donc essayer de contacter n'importe quel serveur expos\u00e9.</li> <li>Votre serveur est sur votre r\u00e9seau local. Il est accessible depuis le r\u00e9seau local mais pas depuis internet, mis \u00e0 part les services expos\u00e9s (comme nous l'avons fait avec Dockge). Pour acc\u00e9der aux ressources non expos\u00e9es, vous devez etre connect\u00e9 sur le meme r\u00e9seau que votre serveur et donc etre chez vous. De plus, vous devez laisser ouvert les ports utilis\u00e9s par vos services \u00e0 travers le pare feu de votre serveur.</li> <li>Nous souhaitons ici au contraire, depuis n'importe o\u00f9, pouvoir acc\u00e9der de maniere securis\u00e9e aux services non expos\u00e9s sur internet du serveur, comme la console SSH qui permet de se connecter \u00e0 la machine par exemple.</li> <li>Nous souhaitons aussi acc\u00e9der aux services d'autres serveurs, et par exemple relier de maniere s\u00e9curis\u00e9e deux instances de Dockge pour tout controler depuis la meme interface.</li> </ul> <p>Pour cela nous allons cr\u00e9er un r\u00e9seau priv\u00e9 virtuel, ou VPN, c'est \u00e0 dire un tunnel s\u00e9curis\u00e9 auquel personne n'a acc\u00e8s \u00e0 part les machines que vous relierez entre elles. Elles feront partie d'un nouveau r\u00e9seau et pourront dialoguer entre elle comme dans un r\u00e9seau local. </p> <p>D'autre part, vous pourrez ajouter votre t\u00e9l\u00e9phone, un ordinateur portable ou n'importe quel appareil au r\u00e9seau pour pouvoir utiliser vos ressources depuis vos appareils quotidiens, o\u00f9 que vous soyiez.</p> <p></p> <p>Dans cette illustration, la machine 1 est sur deux r\u00e9seaux :</p> <ul> <li>son r\u00e9seau local (tous les appareils li\u00e9s \u00e0 la box, avec une adresse IP du type <code>192.168.x.x</code> donc ici la machine 1 et la machine 2)</li> <li>le r\u00e9seau du VPN (tous les appareils reli\u00e9s au VPN, avec une seconde adresse IP du type <code>10.8.x.x</code> donc ici la machine 1 et 4)</li> </ul> <p>On peut aussi faire en sorte que les machines reli\u00e9es au r\u00e9seau virtuel partagent les acces \u00e0 leur r\u00e9seau local. Ici nous ne le ferons pas, pour des raisons de s\u00e9curit\u00e9, et de complexit\u00e9 en terme de sous-r\u00e9seau (si les deux machines distantes ont des machines locales qui utilisent la meme adresse IP locale, par exemple <code>192.168.1.1</code>, cela posera des conflits). </p> <p>Ainsi, sur le r\u00e9seau virtuel, seules les machines directement reli\u00e9es pourront dialoguer entre elle depuis ce r\u00e9seau. Elles ne pourront pas dialoguer avec une machine situ\u00e9es sur un autre r\u00e9seau local et non reli\u00e9e au VPN.</p>"},{"location":"serveex/wireguard/#cote-serveur","title":"C\u00f4t\u00e9 serveur","text":"<p>A v\u00e9rifier au pr\u00e9alable</p> <ul> <li> <p>V\u00e9rifiez si le port <code>51820 UDP</code> est libre sur votre serveur, et bien rout\u00e9 dans le NAT de la box <code>Source 51820 UDP -> Destination 51820 UDP -> Serveur</code>. En effet, votre serveur \u00e9tant derri\u00e8re votre box, le port de votre box doit etre joignable et rediriger vers le port de votre serveur connect\u00e9 \u00e0 votre VPN.</p> </li> <li> <p>V\u00e9rifiez aussi que le port <code>51821 TCP</code> est libre sur le serveur pour acc\u00e9der \u00e0 la web ui.</p> </li> </ul> <p>Dysfonctionnement</p> <p>En cas d'\u00e9chec, v\u00e9rifiez les r\u00e8gles du pare-feu</p> <p>Structure des dossiers</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 wg-easy\n \u251c\u2500\u2500 config\n \u2502 \u2514\u2500\u2500 etc_wireguard\n \u251c\u2500\u2500 compose.yaml\n \u2514\u2500\u2500 .env\n</code></pre> <p>Le conteneur sera en mode <code>HOST</code>, c'est \u00e0 dire qu'il occupera les ports de votre host comme s'il n'etait pas dans un conteneur mais directement install\u00e9 sur la machine, sans passer par un sous-r\u00e9seau.</p> <p>Ouvrez Dockge, cliquez sur <code>compose</code> et nommez la stack <code>wg_easy</code>.</p> <p>Copiez la configuration suivante :</p> <pre><code>version: \"3.8\"\nvolumes:\n etc_wireguard:\nservices:\n wg-easy:\n network_mode: host\n env_file:\n - .env\n environment:\n - LANG=en\n - WG_HOST=${HOST}\n - PASSWORD_HASH=${PW}\n - WG_DEFAULT_ADDRESS=${ADDRESS}\n - WG_HIDE_KEYS=never\n - WG_ALLOWED_IPS=${IPS}\n - WG_DEFAULT_DNS=\n - UI_TRAFFIC_STATS=true\n - UI_CHART_TYPE=1\n image: ghcr.io/wg-easy/wg-easy\n container_name: wg-easy\n volumes:\n - /docker/wg_easy/config/etc_wireguard:/etc/wireguard\n restart: unless-stopped\n cap_add:\n - NET_ADMIN\n - SYS_MODULE\n</code></pre> <p>Astuce</p> <p>Ajoutez le label de watchtower afin d'automatiser les mises \u00e0 jour <pre><code>services\n wg-easy:\n #...\n labels:\n - com.centurylinklabs.watchtower.enable=true\n</code></pre></p> <p>Dans <code>.env</code> :</p> <pre><code>HOST=\nPW=\nADDRESS=\nIPS=\n</code></pre> Variable Valeur Exemples <code>HOST=</code> Domaine de l'host <code>mondomaine.fr</code> <code>PW=</code> Hash du mot de passe, \u00e0 g\u00e9n\u00e9rer ici. ATTENTION: doubler les <code>$</code> <code>$$2a$$12$$FF6T4QqSP9HoiAVlFb.TCehAHPyThBTMU3fYtGdegD0Khx4xKKSqO</code> <code>ADDRESS=</code> Plage d'adresse que le DHCP du VPN peut attribuer, le <code>x</code> doit etre pr\u00e9sent, on peut changer les autres chiffres ou les remplacer par <code>x</code> aussi <code>10.8.0.x</code> <code>IPS=</code> les IPs qui doivent etre rout\u00e9es par les clients vers le VPN. Dans notre cas, on veut que seul le traffic vers le serveur et clients du VPN soit rout\u00e9, on veut pas de leurs r\u00e9seau local et on veut conserver l'acc\u00e8s \u00e0 internet direct sans passer par le VPN.Si vous voulez tout de meme ajouter toutes les machines connect\u00e9es aux appareils en local, ajoutez la plage <code>192.168.0.0/16</code> en s\u00e9parant les deux plages par une virgule. <code>10.8.0.0/24</code> <p>Puis d\u00e9ployez la stack.</p>"},{"location":"serveex/wireguard/#activation-du-forwarding-depuis-lhost","title":"Activation du forwarding depuis l'host","text":"<p>Pour que l'host autorise les clients \u00e0 communiquer entre eux, vous devez activer les param\u00e8ttres suivants :</p> <pre><code>$ sudo sysctl net.ipv4.ip_forward=1\n$ sudo sysctl net.ipv4.conf.all.src_valid_mark=1\n</code></pre>"},{"location":"serveex/wireguard/#recuperation-des-fichiers-de-conf","title":"Recuperation des fichiers de conf","text":"<p>Afin de configurer les clients, vous devez t\u00e9l\u00e9charger les fichiers de conf g\u00e9n\u00e9r\u00e9s par l'host :</p> <ul> <li>Connectez vous via le web en local sur <code>http://ipduserveur:51821</code></li> <li>Cr\u00e9ez un client</li> <li>T\u00e9l\u00e9chargez le fichier de conf</li> <li>Renommez le en <code>wg0.conf</code></li> </ul>"},{"location":"serveex/wireguard/#sur-le-serveur-client","title":"Sur le serveur client","text":"<p>Info</p> <p>Nous partons du principe que le serveur client est un serveur linux avec Docker install\u00e9</p> <p>Structure des dossiers</p> <pre><code>root\n\u2514\u2500\u2500 docker\n \u2514\u2500\u2500 wireguard\n \u2514\u2500\u2500 config\n \u2502 \u2514\u2500\u2500 wg_confs\n \u2514\u2500\u2500 compose.yaml\n</code></pre> <p>Creez le dossier <code>/docker/wireguard/config/wg_confs</code>.</p> <p>Astuce pour les allergiques au terminal</p> <p>Vous pouvez utiliser File Browser pour naviguer dans vos fichier et \u00e9diter vos documents au lieu d'utiliser les commandes du terminal.</p> <pre><code>$ sudo mkdir -p /docker/wireguard/config/wg_confs\n</code></pre> <p>Copiez le fichier<code>wg0.conf</code> t\u00e9l\u00e9charg\u00e9 pr\u00e9c\u00e9demment. </p> <p>Astuce</p> <p>Le moyen le plus simple est de transf\u00e9rer le fichier par sftp dans le dossier <code>/home/nomdutilisateur</code> puis de le copier dans le bon dossier :</p> <pre><code>$ sudo cp ~/wg0.conf /docker/wireguard/config/wg_confs\n</code></pre> <p>Creez le <code>compose.yaml</code> dans <code>/docker/wireguard</code>: <pre><code>$ sudo vi /docker/wireguard/compose.yaml\n</code></pre> Appuyez sur <code>i</code> pour rentrer en modification et copiez la configuration ci-dessous <pre><code>services:\n wireguard:\n image: lscr.io/linuxserver/wireguard:latest\n container_name: wireguard\n network_mode: host\n cap_add:\n - NET_ADMIN\n - SYS_MODULE #optional\n environment:\n - TZ=Europe/Paris\n volumes:\n - /docker/wireguard/config:/config\n - /lib/modules:/lib/modules #optional\n restart: unless-stopped\n</code></pre></p> <p>Appuyez sur <code>Echap</code> puis tapez <code>:x</code> pour quitter et sauvegarder.</p> <p>Lancez le conteneur : <pre><code>$ cd /docker/wireguard\n$ sudo docker compose up -d\n</code></pre></p> <p>Note</p> <p>A r\u00e9p\u00e9ter pour chaque client</p>"},{"location":"serveex/wireguard/#autres-appareils","title":"Autres appareils","text":"<ul> <li>T\u00e9l\u00e9phone : installer wireguard et scanner le QR code via le webui (http://ipduserveur:51821)</li> <li>PC : Installer wireguard client et mettre directement le fichier de conf t\u00e9l\u00e9charg\u00e9 via le webui</li> </ul> <p>Attention</p> <p>Si des machines clientes sont sur le meme r\u00e9seau local que le serveur (derriere la box) :</p> <ul> <li>editer le fichier <code>wg0.conf</code> upload\u00e9 sur cette machine en changeant avec l'adresse locale du serveur : <code>Endpoint = ipduserveur:51820</code></li> </ul> <p>Et voil\u00e0 ce que cela peut donner !</p> <p></p>"}]} |