Mirror the French docs onto the English structure

This commit is contained in:
Djeex
2026-09-05 16:55:39 +02:00
parent 86f04ed794
commit 1894ac7ead
74 changed files with 6322 additions and 1588 deletions
@@ -5,15 +5,6 @@ description: Install code-server to run VS Code in your browser from your homela
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Code-Server
::note
🎯 __Goals:__
- Install code-server
- Mount folders into VS Code
- Expose code-server with Swag
::
[code-server](https://github.com/linuxserver/docker-code-server) is a container that lets you access [VS Code](https://code.visualstudio.com/) via a web UI in a Linux environment. It's literally VS Code and your projects in your pocket, available anywhere. [code-server](https://github.com/linuxserver/docker-code-server) is a container that lets you access [VS Code](https://code.visualstudio.com/) via a web UI in a Linux environment. It's literally VS Code and your projects in your pocket, available anywhere.
+3 -3
View File
@@ -25,7 +25,7 @@ seo:
--- ---
color: primary color: primary
size: xl size: xl
to: /en/about/welcome to: /about/welcome/
--- ---
Access the Docs Access the Docs
:::::: ::::::
@@ -35,9 +35,9 @@ Access the Docs
color: neutral color: neutral
variant: outline variant: outline
size: xl size: xl
to: https://docu.djeex.fr/fr/ to: /serveex/introduction/
--- ---
🇫🇷 Set up my homelab
:::::: ::::::
::::: :::::
:::: ::::
+5 -5
View File
@@ -1,6 +1,6 @@
--- ---
title: Bienvenue title: Bienvenue
description: Introduction à Docudjeex un site de documentation personnelle sur les services auto-hébergés, Debian et l'infrastructure Docker. description: Introduction à Docudjeex, un site de documentation personnelle sur les services auto-hébergés, Debian et l'infrastructure Docker.
navigation: navigation:
icon: i-lucide-home icon: i-lucide-home
hideHeader: true hideHeader: true
@@ -29,11 +29,11 @@ La documentation fournie ici est expérimentale et partagée dans un esprit de p
::: :::
::card-group ::card-group
::card{icon="i-noto-open-book" title="Généralités" to="/fr/general/networking/nat"} ::card{icon="i-noto-open-book" title="Généralités" to="/general/networking/nat"}
Bases réseau, stockage et matériel Bases réseau, stockage et matériel
:: ::
::card{icon="i-noto-microscope" title="Serveex" to="/fr/serveex/introduction"} ::card{icon="i-noto-microscope" title="Serveex" to="/serveex/introduction"}
Guide de déploiement de votre Homelab, pas à pas Guide de déploiement de votre Homelab, pas à pas
:: ::
@@ -41,11 +41,11 @@ Guide de déploiement de votre Homelab, pas à pas
*(à venir)* Créez votre propre NAS maison pour stocker vos données et médias *(à venir)* Créez votre propre NAS maison pour stocker vos données et médias
:: ::
::card{icon="i-noto-test-tube" title="Mes bêtises" to="/fr/nonsense/python/nvidia-stock-bot"} ::card{icon="i-noto-test-tube" title="Mes bêtises" to="/nonsense/python/nvidia-stock-bot"}
Scripts personnels et projets annexes Scripts personnels et projets annexes
:: ::
::card{icon="i-noto-recycling-symbol" title="Poubelle" to="/fr/recycled/deprecated/wireguard-14"} ::card{icon="i-noto-recycling-symbol" title="Poubelle" to="/recycled/deprecated/wireguard-14"}
Pages dépréciées, conservées pour archive Pages dépréciées, conservées pour archive
:: ::
:: ::
@@ -1,63 +0,0 @@
---
title: NAT & DHCP
description: Comprendre le NAT, la redirection de ports et le DHCP sur un routeur domestique. Configurer des baux IP fixes et exposer des services locaux.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Routeur et NAT
::note
🎯 __Objectifs :__
- Comprendre le principe de la redirection de port
- Savoir configurer le NAT de son routeur
- Savoir émettre des baux DHCP (IP fixes)
::
![picture](/img/global/nat.svg)
## Qu'est-ce qu'un "port" ?
Les ports sont différents canaux par lesquels votre routeur envoie et reçoit des données, ce qui permet d'utiliser plusieurs services en meme temps. Lorsqu'il reçoit une donnée via un port, otre routeur transmet ensuite les données à la machine qui :
- soit a émis la requête de départ
- soit est configurée pour recevoir les données reçues par un port spécifique du routeur
Votre routeur dispose de plus de 65 000 ports à utiliser.
Certains programmes et applications sont conçus pour utiliser des ports spécifiques. Par exemple, lorsque votre réseau envoie des données à partir d'une page HTML, le routeur les recevra via le port numéro 80 (non sécurisé) ou `443` (sécurisé via SSL).
Le routeur sert donc de plateforme d'aiguillage des données entre internet et votre machine.
## La redirection de port
Rediriger un `port`, c'est émettre une règle qui spécifie que telle `source` peut envoyer des données à tel `port` de votre routeur, qui redirigera les données sur tel `port` de telle `machine`. Les `sources` et la `machine de destination` sont identifiées par leur `adresse IP`.
| Variable | Description | exemple |
|--------------------------|----------------------------------------------------------|-------------------------|
| `machine source` | IP de la machine source (sur internet) | `All`<br>`123.45.67.89` |
| `port source` | Port d'arrivée sur le routeur | `443` |
| `port de destination` | Port d'arrivée sur la machine de destination | `3000` |
| `machine de destination` | IP de la machine de destination (sur votre réseau local) | `192.168.1.50` |
Selon ce tableau, si on enlève le `All` et que l'on garde l'ip `123.45.67.89` en provenance d'internet, tout le traffic envoyé depuis cette IP sur le port `443` du routeur sera redirigé vers le port `3000` de l'IP locale `192.168.1.50`.
Si on enlève l'IP de l'exemple et qu'on laisse le `All`, tout le traffic d'internet envoyé au port `443` du routeur sera redirigé vers le port `3000` de l'IP locale `192.168.1.50`.
C'est utile si par exemple vous avez un serveur qui a un service qui nécessite d'etre accessible par internet. Par exemple, un site web. Le web utilise le port `80` (non sécurisé) et le port 443 (sécurisé 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 `3000` de mon routeur (accessible en local via `http://192.168.1.50:3000`), je vais donc rediriger comme dans l'exemple toutes les sources (All) qui passent par le port `443` du routeur vers le port `3000` de mon serveur local.
::warning
__Attention :__ Si vous avez plusieurs services à rendre accessible, avec par exemple `sousdomaine1.mondomaine.fr` et `sousdomaine2.mondomaine.fr`, votre routeur ne peut pas rediriger vers plusieurs port selon la requête. Vous devrez utiliser un [Reverse Proxy](../../serveex/coeur/swag) qui selon la requete redirigera vers le bon service de votre serveur.
::
## Le DHCP
A chaque fois que vous connectez un appareil sur votre réseau local, votre routeur lui attribue une adresse IP via les règles DHCP. Celle-ci est aléatoire selon des règles prédéfinies. A chaque redémarrage 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ées dans le vide. Le serveur DHCP de votre box permet d'attribuer une IP fixe à un appareil.
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ée au réseau), et lui attribuer une adresse IP fixe, ce qu'on appel un "bail DHCP fixe".
Ainsi, l'IP de votre machine ne changera jamais et la redirection de port sera toujours effective.
| Variable | Description | Exemple |
|---------------|--------------------------------|---------------------|
| `IP` | IP locale fixe à attribuer | `192.168.1.50` |
| `Adresse Mac` | Adresse physique de la machine | `5E:FF:56:A2:AF:15` |
Pour plus d'information sur ces sujets, consultez la documentation de votre routeur.
+88
View File
@@ -0,0 +1,88 @@
---
title: Généralités
description: Les bases d'un homelab, réseau, stockage et matériel, valables au-delà de n'importe quelle application auto-hébergée.
navigation:
icon: i-lucide-bookmark
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
## Les bases d'un homelab
Cette section rassemble les connaissances générales sur lesquelles [Serveex](/serveex/introduction) s'appuie sans les réexpliquer à chaque fois : comment le réseau fonctionne réellement à la maison, comment choisir et mettre en place son stockage, et sur quel matériel faire tourner tout ça. À lire une fois, puis à recroiser depuis n'importe quel tutoriel d'application.
### Réseau
:::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px}
:::
::card-group
::card{icon="i-lucide-router" title="NAT & DHCP" to="/general/networking/nat"}
Redirection de ports et baux DHCP fixes sur votre box
::
::card{icon="i-lucide-globe" title="Zone DNS" to="/general/networking/dns"}
Lire et modifier la zone DNS d'un nom de domaine
::
::card{icon="i-lucide-folder-sync" title="Samba" to="/general/networking/samba"}
Partager des dossiers sur le réseau local
::
::
### Stockage
:::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px}
:::
::card-group
::card{icon="i-lucide-database" title="RAID" to="/general/storage/raid"}
Grappes de disques redondantes, matériel ou logiciel
::
::card{icon="i-lucide-layers" title="ZFS" to="/general/storage/zfs"}
Snapshots, sommes de contrôle et redondance intégrée
::
::
### Matériel
:::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px}
:::
::card-group
::card{icon="i-lucide-cpu" title="Les bases" to="/general/hardware/basics"}
Processeurs, RAM, stockage et formats de machine
::
::card{icon="i-lucide-network" title="Réseau" to="/general/hardware/network"}
Switchs, cartes réseau et câblage
::
::card{icon="i-lucide-hard-drive" title="Le ProloNAS" to="/general/hardware/prolonas"}
Un serveur maison N100 à petit budget
::
::
### Linux pour les nuls
:::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px}
:::
::card-group
::card{icon="i-lucide-terminal" title="Bases de la ligne de commande" to="/general/linux/cli-basics"}
Comment une commande est construite, et celles qui servent vraiment
::
::card{icon="i-lucide-folder-tree" title="Dossiers et partitions" to="/general/linux/filesystem"}
Ce qui vit où sur Debian, et les habitudes qui gardent tout propre
::
::card{icon="i-lucide-wrench" title="Outils CLI pratiques" to="/general/linux/handy-tools"}
Les outils en ligne de commande à installer, et comment les configurer
::
::
@@ -0,0 +1,71 @@
---
title: NAT & DHCP
description: Comprendre le NAT, la redirection de ports et le DHCP sur un routeur domestique. Configurer des baux IP fixes et exposer des services locaux.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
![picture](/img/global/nat.svg)
## Qu'est-ce qu'un « port » ?
Les ports sont différents canaux par lesquels votre routeur envoie et reçoit des données. Cela permet d'utiliser plusieurs services en même temps.
Lorsqu'il reçoit des données via un port, votre routeur les transmet à la machine qui :
- soit a émis la requête de départ,
- soit est configurée pour recevoir les données arrivant sur un port spécifique.
Votre routeur dispose de plus de 65 000 ports.
Certains programmes et applications sont conçus pour utiliser des ports spécifiques. Par exemple, lorsque votre réseau envoie des données depuis une page HTML, le routeur les reçoit via le port 80 (non sécurisé) ou le port `443` (sécurisé via SSL).
Le routeur sert donc de plateforme d'aiguillage des données entre internet et vos machines locales.
## La redirection de port
Rediriger un `port`, c'est émettre une règle qui spécifie quelle `source` peut envoyer des données à quel `port` de votre routeur, qui les transmettra ensuite à un `port` précis d'une `machine` précise. Les `sources` et la `machine de destination` sont identifiées par leur adresse IP.
| Variable | Description | Exemple |
|--------------------------|----------------------------------------------------------|-------------------------|
| `machine source` | IP de la machine source (depuis internet) | `All`<br>`123.45.67.89` |
| `port source` | Port d'arrivée sur le routeur | `443` |
| `port de destination` | Port sur la machine de destination | `3000` |
| `machine de destination` | IP de la machine visée (sur votre réseau local) | `192.168.1.50` |
Selon ce tableau :
Si on enlève le `All` et qu'on garde l'IP `123.45.67.89`, tout le trafic venant de cette IP envoyé sur le port `443` de votre routeur sera redirigé vers le port `3000` de l'IP locale `192.168.1.50`.
Si on enlève l'IP et qu'on garde `All`, alors tout le trafic venant d'internet sur le port `443` sera redirigé vers le port `3000` de `192.168.1.50`.
C'est utile quand vous avez un serveur qui doit être accessible depuis internet. Par exemple, un site web utilise le port `80` (non sécurisé) ou `443` (sécurisé par SSL).
Pour rendre le site accessible, vous configurerez votre routeur pour rediriger la requête du nom de domaine vers votre serveur local.
Imaginons que votre service tourne sur le port `3000` en local (`http://192.168.1.50:3000`), vous redirigerez tout le trafic du port `443` du routeur vers le port `3000` du serveur local.
::warning{to="/serveex/core/swag"}
__Attention :__ si vous avez plusieurs services à exposer, du type `sousdomaine1.mondomaine.fr` et `sousdomaine2.mondomaine.fr`, votre routeur ne peut pas différencier les requêtes et rediriger vers des ports différents.
Vous devez utiliser un **Reverse Proxy** pour aiguiller le trafic selon la requête.
::
## Le DHCP
À chaque fois qu'un appareil se connecte à votre réseau local, votre routeur lui attribue une adresse IP via les règles DHCP.
Cette IP est choisie au hasard dans une plage prédéfinie.
À chaque redémarrage de l'appareil, l'IP peut changer, ce qui pose problème si vous redirigez des ports, car l'IP visée peut ne plus être la bonne.
Pour éviter ça, utilisez le serveur DHCP de votre routeur pour attribuer une adresse IP fixe.
Chaque appareil a une adresse physique dite « adresse MAC ».
Pour fixer une IP, vous devez connaître l'adresse MAC de votre appareil (visible dans votre routeur quand il est connecté), et lui attribuer une IP fixe.
C'est ce qu'on appelle un « bail DHCP fixe ».
Ainsi, l'IP de votre machine ne change jamais et vos règles de redirection de port restent valables.
| Variable | Description | Exemple |
|---------------|----------------------------------|---------------------|
| `IP` | IP locale fixe à attribuer | `192.168.1.50` |
| `Adresse MAC` | Adresse physique de l'appareil | `5E:FF:56:A2:AF:15` |
Pour plus d'informations, consultez la documentation de votre routeur.
@@ -3,17 +3,11 @@ title: Zone DNS
description: Comprendre le fonctionnement du DNS, lire et éditer une zone DNS, et configurer des noms de domaine pour vos services auto-hébergés. description: Comprendre le fonctionnement du DNS, lire et éditer une zone DNS, et configurer des noms de domaine pour vos services auto-hébergés.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Noms de domaines et zone DNS
::note
🎯 __Objectifs :__
- Comprendre le fonctionnement d'un serveur DNS
- Comprendre comment modifier une zone DNS
::
## Introduction ## Introduction
Lorsque vous naviguez sur un site, ou une application, des requêtes sont émises vers un ou des domaines afin d'afficher le contenu de votre page. Votre appareil ne connait pas les adresses IP de ces serveurs à joindre. Pour les connaitre, il va contacter un _serveur de nom_ (Domain Name Server) qui lui va lui répondre avec l'adresse IP la plus à jour pour le domaine de la requête. Lorsque vous naviguez sur un site, ou une application, des requêtes sont émises vers un ou des domaines afin d'afficher le contenu de votre page. Votre appareil ne connait pas les adresses IP de ces serveurs à joindre. Pour les connaitre, il va contacter un _serveur de nom_ (Domain Name Server) qui lui va lui répondre avec l'adresse IP la plus à jour pour le domaine de la requête.
La zone DNS, c'est une sorte de registre avec des panneaux qui redirige vos requêtes vers la bonne destination. La zone DNS, c'est une sorte de registre avec des panneaux qui redirige vos requêtes vers la bonne destination.
@@ -21,6 +15,7 @@ La zone DNS, c'est une sorte de registre avec des panneaux qui redirige vos requ
![Picture](/img/global/dns.svg) ![Picture](/img/global/dns.svg)
## La zone DNS ## La zone DNS
Lorsque vous réservez un domaine chez votre registrar (cloudflare, ovh...), ce registrar vous attribue une zone DNS que vous pouvez personnaliser. Lorsque vous réservez un domaine chez votre registrar (cloudflare, ovh...), ce registrar vous attribue une zone DNS que vous pouvez personnaliser.
Vous pouvez rentrer des _enregistrements_ dans cette zone DNS qui permettront d'orienter les requêtes au bon endroit. Vous trouverez [plus d'information ici](https://help.ovhcloud.com/csm/fr-dns-servers-general-information?id=kb_article_view&sysparm_article=KB0051661). Vous pouvez rentrer des _enregistrements_ dans cette zone DNS qui permettront d'orienter les requêtes au bon endroit. Vous trouverez [plus d'information ici](https://help.ovhcloud.com/csm/fr-dns-servers-general-information?id=kb_article_view&sysparm_article=KB0051661).
@@ -48,9 +43,9 @@ Ainsi, si vous choisissez de pointer le domaine `mondomaine.fr` vers votre serve
::warning ::warning
- __Attention,__ Si votre serveur est chez vous : __Attention :__ si votre serveur est hébergé chez vous :
- l'IP publique est celle de votre box internet. Assurez-vous auprès de votre opérateur que cette IP est fixe ou configurez un [DDNS](https://aws.amazon.com/fr/what-is/dynamic-dns/). - l'IP publique est celle de votre box internet. Assurez-vous auprès de votre opérateur que cette IP est fixe ou configurez un [DDNS](https://aws.amazon.com/fr/what-is/dynamic-dns/).
- assurez-vous d'avoir [redirigé le port 443 vers le port d'écoute de votre serveur](/fr/general/networking/nat). - assurez-vous d'avoir [redirigé le port 443 vers le port d'écoute de votre serveur](/general/networking/nat).
:: ::
Et si vous ajoutez un sous-domaine qui doit pointer vers votre serveur, vous pouvez utiliser un enregistrement `CNAME` vers `mondomaine.fr`. Et si vous ajoutez un sous-domaine qui doit pointer vers votre serveur, vous pouvez utiliser un enregistrement `CNAME` vers `mondomaine.fr`.
@@ -3,6 +3,7 @@ title: Samba
description: Configurer Samba sur Debian pour partager des dossiers sur votre réseau local et y accéder depuis Windows, macOS ou Linux. description: Configurer Samba sur Debian pour partager des dossiers sur votre réseau local et y accéder depuis Windows, macOS ou Linux.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
Samba est un protocole permettant d'accèder à un dossier situé sur un disque réseau. Il peut être configuré sous Mac, Windows ou Linux. Samba est un protocole permettant d'accèder à un dossier situé sur un disque réseau. Il peut être configuré sous Mac, Windows ou Linux.
@@ -39,8 +40,8 @@ Ensuite nous allons éditer le fichier `/etc/samba/smb.conf`
sudo nano /etc/samba/smb.conf sudo nano /etc/samba/smb.conf
``` ```
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
__Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
Localisez la variable `workgroup` et nommez votre workgroup, par exemple `workgroup = WORKGROUP` Localisez la variable `workgroup` et nommez votre workgroup, par exemple `workgroup = WORKGROUP`
@@ -161,7 +162,6 @@ sudo chmod 600 /smb/.credentials
``` ```
### Monter le dossier partagé ### Monter le dossier partagé
::warning ::warning
__Attention :__ Si vous utilisez un pare-feu comme ufw, vous devez ajouter une règle pour autoriser votre machine distante à accéder à votre partage. __Attention :__ Si vous utilisez un pare-feu comme ufw, vous devez ajouter une règle pour autoriser votre machine distante à accéder à votre partage.
```bash [Terminal] ```bash [Terminal]
@@ -3,6 +3,7 @@ title: RAID
description: Comprendre le RAID, matériel vs logiciel, niveaux RAID, et comment mettre en place des grappes de disques redondants pour votre homelab. description: Comprendre le RAID, matériel vs logiciel, niveaux RAID, et comment mettre en place des grappes de disques redondants pour votre homelab.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
_Redundant Array of Independent Disks_ _Redundant Array of Independent Disks_
@@ -102,3 +103,6 @@ Utilisez RAID 5 pour un stockage fiable avec 3 à 5 disques et une perte minimal
- Minimum de 4 disques (6 recommandés pour minimiser la perte despace). - Minimum de 4 disques (6 recommandés pour minimiser la perte despace).
Utilisez RAID 6 dans les mêmes cas que RAID 5, surtout avec 6 disques ou plus. Plus de disques = plus de risque de panne. RAID 6 vous apportera plus de fiabilité en cas de panne simultanée de deux disques. Il n'y a rien de plus frustrant que de perdre un second disque en pleine reconstruction du remplacement du premier. Utilisez RAID 6 dans les mêmes cas que RAID 5, surtout avec 6 disques ou plus. Plus de disques = plus de risque de panne. RAID 6 vous apportera plus de fiabilité en cas de panne simultanée de deux disques. Il n'y a rien de plus frustrant que de perdre un second disque en pleine reconstruction du remplacement du premier.
## RAID logiciel
(bientôt)
@@ -3,21 +3,27 @@ title: ZFS
description: Introduction à ZFS, système de fichiers et gestionnaire de volumes combinés avec snapshots, checksums et redondance intégrée pour un stockage fiable. description: Introduction à ZFS, système de fichiers et gestionnaire de volumes combinés avec snapshots, checksums et redondance intégrée pour un stockage fiable.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
ZFS est populaire dans le monde des serveurs, des NAS (comme FreeNAS / TrueNAS), de la virtualisation, et même chez les particuliers qui veulent un stockage résilient. C'est est un _système de fichier_ (à l'instar de NTFS pour windows, EXT4, FAT32 etc...) mais également un __gestionnaire de volume__ (comme LVM par exemple). Pour le dire (très) rapidement, un gestionnaire de volume arrange l'espace sur des espaces physiques comme un ou plusieurs disques durs, et un gestionnaire de fichier arrange la maniere dont sont organisés les blocs de données dans ces volumes pour écrire, lire et supprimer les données.
ZFS dépasse largement les limites des autres systèmes de fichiers, que cela soit en terme de performance ou de fonctionnalité. ZFS est populaire dans le monde des serveurs, des NAS (comme FreeNAS / TrueNAS), de la virtualisation, et même chez les particuliers qui veulent un stockage résilient. C'est est un _système de fichier_ (à l'instar de NTFS pour windows, EXT4, FAT32 etc...) mais également un _gestionnaire de volume_ (comme LVM par exemple).
Pour le dire simplement :
- un **gestionnaire de volume** organise le stockage physique (un ou plusieurs disques durs).
- un **système de fichiers** organise la manière dont les blocs de données sont écrits, lus et supprimés dans ces volumes.
ZFS dépasse largement les limites des autres systèmes de fichiers, que ce soit en termes de performance ou de fonctionnalités.
Ce qui nous intéresse le plus : Ce qui nous intéresse le plus :
- ses fonctionnalités de __gestion des instantanés__ (snaphsot), permettant de rapidement revenir en arrière en cas de problème - ses fonctionnalités de __gestion des instantanés__ (snaphsot), permettant de rapidement revenir en arrière en cas de problème
- sa gestion des grappes de disques et [__ses équivalent au RAID__](/fr/general/storage/raid) (Z-Mirror, RAIDZ1, RAIDZ2, RAIDZ3) - sa gestion des grappes de disques et [__ses équivalent au RAID__](/general/storage/raid) (Z-Mirror, RAIDZ1, RAIDZ2, RAIDZ3)
- sa __reconstruction automatique des données corrumpues__ (via le scrubbing) - sa __reconstruction automatique des données corrumpues__ (via le scrubbing)
- ses performance avec son cache RAM (ZFS ARC) - ses performance avec son cache RAM (ZFS ARC)
- ses notifications en cas d'erreur - ses notifications en cas d'erreur
## Structure ## Structure
![](/img/global/zfs.svg) ![](/img/global/zfs.svg)
ZFS dispose d'une structure particulière : ZFS dispose d'une structure particulière :
@@ -33,14 +39,13 @@ Il existe plusieurs types de dataset :
- __snapshot__ : un état figé dun autre dataset à un instant donné. Ils peuvent etre créés manuellement ou via des outils de sauvegarde. Ils peuvent etre montés pour parcourir les données dans leur état au moment du snapshot. - __snapshot__ : un état figé dun autre dataset à un instant donné. Ils peuvent etre créés manuellement ou via des outils de sauvegarde. Ils peuvent etre montés pour parcourir les données dans leur état au moment du snapshot.
## Pourquoi ZFS vs les autres ? ## Pourquoi ZFS vs les autres ?
### Intégrité des données ### Intégrité des données
ZFS vérifie automatiquement que les données stockées ne sont pas corrompues. Chaque bloc de données est accompagné dune empreinte (checksum) qui permet à ZFS de détecter toute altération, même minime. Et sil y a un problème, il peut souvent le réparer automatiquement, si une copie saine existe ailleurs dans le système. ZFS vérifie automatiquement que les données stockées ne sont pas corrompues. Chaque bloc de données est accompagné dune empreinte (checksum) qui permet à ZFS de détecter toute altération, même minime. Et sil y a un problème, il peut souvent le réparer automatiquement, si une copie saine existe ailleurs dans le système.
### RAID intégré ### RAID intégré
ZFS propose son propre système de gestion de volumes (vdev). Vous pouvez créer un pool de stockage (zpool) en combinant plusieurs disques, un peu comme avec le [RAID](/fr/general/storage/raid) classique, mais de façon plus souple. Par exemple : ZFS propose son propre système de gestion de volumes (vdev). Vous pouvez créer un pool de stockage (zpool) en combinant plusieurs disques, un peu comme avec le [RAID](/general/storage/raid) classique, mais de façon plus souple. Par exemple :
- __Z-mirror__ => equivalent du RAID 1 - __Z-mirror__ => equivalent du RAID 1
- __RAIDZ1__ => équivalent du RAID 5 (tolérance à 1 panne disque) - __RAIDZ1__ => équivalent du RAID 5 (tolérance à 1 panne disque)
@@ -51,7 +56,7 @@ ZFS gère cela directement, pas besoin de logiciel RAID externe.
::note ::note
Consultez [l'article sur le RAID](/fr/general/storage/raid) pour en savoir plus sur la solution qui vous convient. Consultez [l'article sur le RAID](/general/storage/raid) pour en savoir plus sur la solution qui vous convient.
:: ::
### Snapshots et clones ### Snapshots et clones
@@ -62,4 +67,6 @@ ZFS permet de créer des snapshots, cest-à-dire des captures instantanées d
ZFS peut compresser les données à la volée (transparente pour lutilisateur), ce qui permet d’économiser de lespace disque. Il propose aussi la déduplication (éliminer les doublons), mais cette fonctionnalité consomme beaucoup de mémoire et nest pas recommandée pour tous les usages. ZFS peut compresser les données à la volée (transparente pour lutilisateur), ce qui permet d’économiser de lespace disque. Il propose aussi la déduplication (éliminer les doublons), mais cette fonctionnalité consomme beaucoup de mémoire et nest pas recommandée pour tous les usages.
Voilà, à présent vous savez pourquoi ZFS est Ze systeme de fichier à déployer sur votre NAS. ---
Voilà, à présent vous savez pourquoi ZFS est *Ze* système de fichiers à déployer sur votre NAS.
@@ -3,8 +3,8 @@ title: Les bases
description: Les fondamentaux du matériel serveur. CPU, RAM, stockage et facteurs de forme pour bien démarrer votre homelab. description: Les fondamentaux du matériel serveur. CPU, RAM, stockage et facteurs de forme pour bien démarrer votre homelab.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Les bases d'un serveur
![hardware](/img/global/hardware.svg) ![hardware](/img/global/hardware.svg)
@@ -30,11 +30,9 @@ Il existe plusieurs formats de carte mère grand public :
Bien sûr, selon la taille, le nombre de ports et de fonctionnalité diffère. D'autre part, les constructeurs de machines déjà assemblées peuvent aussi profiter de formats plus personnalisés. Bien sûr, selon la taille, le nombre de ports et de fonctionnalité diffère. D'autre part, les constructeurs de machines déjà assemblées peuvent aussi profiter de formats plus personnalisés.
## Le CPU ## Le CPU
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<img src="/img/global/cpu.svg" alt="Image" style="max-width: 25%; max-height:230px; margin-right: 20px;"> <img src="/img/global/cpu.svg" alt="Image" style="max-width: 25%; max-height:230px; margin-right: 20px;">
<p> <p>Le <strong>CPU</strong> (Central processor Unit) est la supercalculette de lordinateur. Il traite la plupart des tâches logicielles. Aujourdhui les processeurs comportent plusieurs cœurs, parfois eux même divisé en deux de façon logicielle, afin de mieux répartir la charge de travail et optimiser son fonctionnement. Il nécessite d'etre refroidit avec un dissipateur actif (avec ventilateur) ou passif (sans ventilateur) selon la chaleur qu'iil dégage, et donc selon la puissance en Watt qu'il requiert. Dans le cadre d'un serveur, on veillera donc à le choisir selon les usages que l'on aura. </p>
Le <strong>CPU</strong> (Central processor Unit) est la supercalculette de lordinateur. Il traite la plupart des tâches logicielles. Aujourdhui les processeurs comportent plusieurs cœurs, parfois eux même divisé en deux de façon logicielle, afin de mieux répartir la charge de travail et optimiser son fonctionnement. Il nécessite d'etre refroidit avec un dissipateur actif (avec ventilateur) ou passif (sans ventilateur) selon la chaleur qu'iil dégage, et donc selon la puissance en Watt qu'il requiert. Dans le cadre d'un serveur, on veillera donc à le choisir selon les usages que l'on aura. </p>
</div> </div>
::warning ::warning
@@ -62,7 +60,7 @@ Elle prend généralement la forme de barettes, à brancher sur la carte mère.
## Le GPU ## Le GPU
Le __GPU__ (Graphical Processor Unit) est un processeur dédié aux calculs graphiques, vidéo, et parfois d'intelligence artificielle. Dans le cadre d'un serveur, il aura son utilité pour tout ce qui touche au media center (Streaming de video comme [Plex](/fr/serveex/media/plex) par exemple), mais aussi en terme d'accélération matérielle pour les calculs d'IA comme la reconnaissance faciale ou la recherche sur des photos (comme via [Immich](/fr/serveex/cloud/immich) par exemple). Le __GPU__ (Graphical Processor Unit) est un processeur dédié aux calculs graphiques, vidéo, et parfois d'intelligence artificielle. Dans le cadre d'un serveur, il aura son utilité pour tout ce qui touche au media center (par exemple [Jellyfin](/serveex/media/jellyfin)), mais aussi en terme d'accélération matérielle pour les calculs d'IA comme la reconnaissance faciale ou la recherche sur des photos (comme via [Immich](/serveex/cloud/immich) par exemple).
Selon la puissance requise, on choisira un GPU dédié avec sa propre VRAM (une carte graphique à brancher sur un port PCIe de la carte mère), ou un iGPU, c'est à dire un GPU compris dans le CPU (comme les N100/N150 et N305/N355), qui utilisera la RAM globale de la machine Selon la puissance requise, on choisira un GPU dédié avec sa propre VRAM (une carte graphique à brancher sur un port PCIe de la carte mère), ou un iGPU, c'est à dire un GPU compris dans le CPU (comme les N100/N150 et N305/N355), qui utilisera la RAM globale de la machine
@@ -72,12 +70,14 @@ Selon la puissance requise, on choisira un GPU dédié avec sa propre VRAM (une
<img src="/img/global/hdd.svg" alt="Image" style="max-width: 50%; margin-right: 20px;"> <img src="/img/global/hdd.svg" alt="Image" style="max-width: 50%; margin-right: 20px;">
</p> </p>
Un __HDD__ (Hard Disk Drive) ou disque dur, est un composant servant à stocker des données. Autrefois, c'etait le stockage standard des machines informatiques. Ils sont constitués d'un ou plusieurs disques superposés en plateau, et de têtes de lecture, presque comme une platine vinyle. Si aujourd'hui on arrive à stocker des quantités extraordinaire de données dans un HDD (jusqu'à 30To soit 30 000 Giga-octet de nos jours pour le grand public), ils sont limités dans leur vitesse de lecture et d'écriture par leur caractère mécaniques. Ils sont également volumineux et très lourds. Un __HDD__ (Hard Disk Drive) ou disque dur, est un composant servant à stocker des données. Autrefois, c'etait le stockage standard des machines informatiques. Ils sont constitués d'un ou plusieurs disques superposés en plateau, et de têtes de lecture, presque comme une platine vinyle.
Aujourd'hui, les HDD peuvent stocker des quantités extraordinaires de données (jusqu'à 30 To, soit 30 000 gigaoctets, pour les modèles grand public), mais ils restent limités en vitesse de lecture et d'écriture par leur nature mécanique. Ils sont également volumineux et très lourds.
De manière générale, on les privilégiera pour stocker des données qui ne servent pas à des calculs et ne nécessitent pas d'ecriture rapide, comme les media (videos, photos...) ou les cloud drive, stockage d'archives, etc. Ils sont performants dans ces scenario et surtout coutent beaucoup moins cher que des SSD à espace de stockage égal. De manière générale, on les privilégiera pour stocker des données qui ne servent pas à des calculs et ne nécessitent pas d'ecriture rapide, comme les media (videos, photos...) ou les cloud drive, stockage d'archives, etc. Ils sont performants dans ces scenario et surtout coutent beaucoup moins cher que des SSD à espace de stockage égal.
::tip{icon=""} ::tip{icon="" to="/general/storage/raid"}
__Astuce :__ Vous pouvez combiner plusieurs HDD ensemble en [RAID](/fr/general/storage/raid) afin d'accroitre les performances de votre machine. __Astuce :__ combinez plusieurs HDD en **RAID** pour améliorer les performances et la redondance.
:: ::
Il existe plusieurs formats de HDD : 3.5" et 2.5". De manière générale dans un serveur on privilégiera les 3.5, plus fiables. Il existe plusieurs formats de HDD : 3.5" et 2.5". De manière générale dans un serveur on privilégiera les 3.5, plus fiables.
@@ -88,11 +88,13 @@ Il existe plusieurs formats de HDD : 3.5" et 2.5". De manière générale dans u
<img src="/img/global/nvme.svg" alt="Image" style="max-width: 50%; margin-right: 20px;"> <img src="/img/global/nvme.svg" alt="Image" style="max-width: 50%; margin-right: 20px;">
</p> </p>
Un __SSD__ (Solid State Drive) est une petite carte sur laquelle sont soudées des puces de mémoires servant à stocker de l'information. Contrairement à la RAM, ces puces conservent les informations même lorsqu'elles ne sont pas alimentées et donc les conservent après un redémarrage. C'est ce qui sert globalement de stockage pour votre serveur. Contrairement aux HDD, ils ne disposent pas de parties mécaniques, sont très miniaturisés et surtout sont extrêmement rapides, de l'ordre de plusieurs Giga-octets par seconde pour les plus performants. Un __SSD__ (Solid State Drive) est une petite carte sur laquelle sont soudées des puces de mémoires servant à stocker de l'information. Contrairement à la RAM, ces puces conservent les informations même lorsqu'elles ne sont pas alimentées et donc les conservent après un redémarrage. C'est ce qui sert globalement de stockage principal pour votre serveur.
Contrairement aux HDD, ils ne disposent pas de parties mécaniques, sont très miniaturisés et surtout extrêmement rapides, de l'ordre de plusieurs gigaoctets par seconde pour les plus performants.
On les trouve dans plusieurs formats, aujourd'hui on priviligiera les versions M.2 NVMe, car ce sont les plus petits et plus rapides, et sont devenu un standard sur les cartes mères. On les trouve dans plusieurs formats, aujourd'hui on priviligiera les versions M.2 NVMe, car ce sont les plus petits et plus rapides, et sont devenu un standard sur les cartes mères.
Ils sont en revanche beaucoup plus chers que les disque durs à capacité de stockage égale. Généralement, on y stockera au moins le système d'exploitation de la machine (Operating System ou OS) pour garantir une certaine rapidité d'execution. Dans le cadre d'un serveur, on y stockera aussi si possible les conteneurs type [docker](/fr/serveex/core/docker) et les bases de données. De manière générale, toute données dont un a besoin régulièrement et rapidement pour des calculs (site web, applications, etc...). Ils sont en revanche beaucoup plus chers que les disque durs à capacité de stockage égale. Généralement, on y stockera au moins le système d'exploitation de la machine (Operating System ou OS) pour garantir une certaine rapidité d'execution. Dans le cadre d'un serveur, on y stockera aussi si possible les conteneurs type [docker](/serveex/core/docker) et les bases de données. De manière générale, toute données dont un a besoin régulièrement et rapidement pour des calculs (site web, applications, etc...).
### La carte réseau ### La carte réseau
@@ -110,19 +112,32 @@ Une __carte réseau__ sert à faire communiquer votre machine avec votre réseau
__Attention :__ Pensez bien à dimensionner vos appareils réseaux (routeurs, switch, cables...) en fonction du débit que vous souhaitez entre vos appareils. D'autre part, il existe plusieurs normes de cables RJ45 selon la vitesse permise. On privilegiera dans la plupart des cas des cables RJ45 CAT5E, et au delà de 10Gbps, on privilégiera du CAT6A, bien que le CAT5E soit utilisable à ces vitesses à courte distance. Quant à la fibre, c'est tout un sujet (simplex, duplex, transceiver...). __Attention :__ Pensez bien à dimensionner vos appareils réseaux (routeurs, switch, cables...) en fonction du débit que vous souhaitez entre vos appareils. D'autre part, il existe plusieurs normes de cables RJ45 selon la vitesse permise. On privilegiera dans la plupart des cas des cables RJ45 CAT5E, et au delà de 10Gbps, on privilégiera du CAT6A, bien que le CAT5E soit utilisable à ces vitesses à courte distance. Quant à la fibre, c'est tout un sujet (simplex, duplex, transceiver...).
:: ::
La carte réseau est généralement directement intégrée à la carte mère, mais vous pouvez utiliser des cartes réseau dédiées comme par USB par exemple ou via un port d'extension PCIe. De manière générale, sur un serveur, on appréciera d'avoir au moins deux ports ethernet afin d'avoir de la redondance en cas de panne. La carte réseau est généralement directement intégrée à la carte mère, mais vous pouvez aussi utiliser des cartes réseau dédiées, par exemple en USB ou via un port d'extension PCIe.
De manière générale, sur un serveur, on appréciera d'avoir au moins deux ports ethernet afin d'avoir de la redondance en cas de panne.
### Entrées et sorties ### Entrées et sorties
Les __ports d'entrées et sorties__ (Input/Outpout) sont l'ensemble des ports de la machine permettant d'échanger de l'information avec des appareils externes (écrans, clavier, souris, réseau...). Généralement, sur une carte mère on retrouve le ou les ports réseaux, des ports USB de plusieurs formats et vitesse différentes, un ou plusieurs port vidéo, et des ports audio. Les __ports d'entrées et sorties__ (I/O) permettent de communiquer avec des appareils externes (écrans, clavier, souris, réseau...). Sur une carte mère, on trouve généralement :
Selon vos usages, vous devrez choisir votre carte mere et ses éventuelles cartes d'extension en fonction de vos besoin à ce niveau. - des ports Ethernet
- des ports USB (formats et vitesses variés)
- des ports vidéo
- des prises audio
Choisissez votre carte mère et ses cartes d'extension en fonction de vos besoins en I/O.
### L'alimentation ### L'alimentation
__L'alimentation__ est le composant qui permet d'alimenter électriquement les composants de votre machine. Elle se compose d'un cable secteur en entrée, et de plusieurs types de cables en sorties. Ces cables se branchent sur la carte mère et différents périphériques le nécessitant, comme les disques dur, ou certaines cartes graphiques dédiées. L'alimentation se caractérise par sa puissance, en Watt, sa modularité (cables attachés ou détachables), et son rendement, en pourcentage. Comprendre qu'une alimentation de 500W avec un rendement de 80% consommera en fait 625W pour fournir ces 500W. __L'alimentation__ est le composant qui fournit l'énergie électrique aux composants de votre machine. Elle se branche au secteur par un cordon et dispose de plusieurs bles de sortie qui vont sur la carte mère et sur divers périphériques, comme les disques durs ou les cartes graphiques dédiées.
Une autre caractéristiques des alimentations sont leur format. Il en existe plusieurs standard, comme ATX L pour les plus grandes jusqu'à SFX pour les plus petites. Il en existe aussi des spécifiques aux serveurs rackables, par définition assez plats. Une alimentation se caractérise par plusieurs éléments clés :
- sa puissance (sa capacité totale, en watts),
- sa modularité (câbles fixes ou détachables),
- son rendement (en pourcentage). Par exemple, une alimentation de 500W avec 80% de rendement tirera en réalité 625W au mur pour fournir 500W à la machine.
Un autre facteur important est le format. Il en existe plusieurs standard, comme ATX L pour les plus grandes jusqu'à SFX pour les plus petites. Il en existe aussi des spécifiques aux serveurs rackables, par définition assez plats.
Pour choisir votre alimentation, la convention est d'estimer la puissance electrique demandée par votre machine à usage et de multiplier par deux cette puissance. En effet, le rendement des alimentations se situe environ à 50% de sa charge totale. Pour choisir votre alimentation, la convention est d'estimer la puissance electrique demandée par votre machine à usage et de multiplier par deux cette puissance. En effet, le rendement des alimentations se situe environ à 50% de sa charge totale.
@@ -130,5 +145,10 @@ Pour choisir votre alimentation, la convention est d'estimer la puissance electr
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<img src="/img/global/case.svg" alt="Image" style="max-width: 25%; max-height:230px; margin-right: 20px;"> <img src="/img/global/case.svg" alt="Image" style="max-width: 25%; max-height:230px; margin-right: 20px;">
<p>Le <strong>boitier</strong> est également un composant essentiel pour votre machine. Il conditionne le refroidissement de cette dernière, avec ses ventilateurs et sa conception gérant les flux d'air, mais aussi le format de votre carte mere, de votre alimentation et de votre éventuel GPU dédié. D'autre part, il conditionne également le nombre de HDD et leur format. Certains boitiers sont dit rackables, c'est à dire qu'ils peuvent etre fixés dans des racks pour des armoires informatiques (baies serveurs). Choisissez consciencieusement votre boitier en fonction de vos besoins.</p> <p>Le <strong>boitier</strong> est également un composant essentiel pour votre machine. Il joue un rôle clé dans le refroidissement, avec ses ventilateurs et sa conception des flux d'air, et il détermine la compatibilité de format de votre carte mère, de votre alimentation et de l'éventuel GPU dédié que vous installerez.
</p>
</div> </div>
Par ailleurs, le boitier détermine combien de HDD vous pouvez installer et quels formats ils acceptent. Certains boitiers sont rackables, c'est-à-dire qu'ils peuvent être installés dans des racks (baies serveurs).
Choisissez votre boitier avec soin en fonction de vos besoins précis et du matériel que vous comptez utiliser.
@@ -3,8 +3,8 @@ title: Réseau
description: Aperçu du matériel réseau pour homelab. Switches, cartes réseau, câbles et comment connecter efficacement vos serveurs. description: Aperçu du matériel réseau pour homelab. Switches, cartes réseau, câbles et comment connecter efficacement vos serveurs.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Réseau
![hardware](/img/global/hardware-networking.svg) ![hardware](/img/global/hardware-networking.svg)
@@ -21,7 +21,7 @@ Plus généralement, un routeur est composé :
- d'un switch, c'est à dire d'un hub composé de plusieurs ports __LAN__ (Local Area Network) permettant de connecter plusieurs lignes et appareils à votre routeur. Ils peuvent etre RJ45 ou SFP/SFP+. - d'un switch, c'est à dire d'un hub composé de plusieurs ports __LAN__ (Local Area Network) permettant de connecter plusieurs lignes et appareils à votre routeur. Ils peuvent etre RJ45 ou SFP/SFP+.
- parfois d'un emetteur/recepteur WiFi - parfois d'un emetteur/recepteur WiFi
Le routeur peut posséder des capacité de _firewall_, c'est à dire de limiter le traffic d'appareils en particulier, et de _[NAT (Network Adress Translation)](/fr/general/networking/nat)_, c'est à dire de redirection de port. Il possède aussi généralement un _[DHCP (Dynamic Host Configuration Protocol)](/fr/general/networking/nat#le-dhcp)_, servant à attribuer dynamiquement des _adresses IP_ à votre matériel branché au réseau. Le routeur peut posséder des capacité de _firewall_, c'est à dire de limiter le traffic d'appareils en particulier, et de _[NAT (Network Adress Translation)](/general/networking/nat)_, c'est à dire de redirection de port. Il possède aussi généralement un _[DHCP (Dynamic Host Configuration Protocol)](/general/networking/nat#le-dhcp)_, servant à attribuer dynamiquement des _adresses IP_ à votre matériel branché au réseau.
Le routeur conditionne directement la vitesse de communication entre vos appareils. En effet, le port WAN conditionne le débit qu'il peut recevoir de la part de votre FAI. Si vous avez un abonnement de 5 Gb/s, il vous faudra un port WAN d'au moins 5 Gb/s. Mais il conditionne également la vitesse de communication entre vos équipements. Si vous avez des appareils qui communiquent à 5 Gb/s, il faudra que la partie _switch_ du routeur disposent de ports 5 Gb/s. Enfin, si vous avez du matériel WiFi 7 et que vous souhaitez profiter de ces débits, il faudra également que votre routeur le supporte. Et dans le cas d'une borne Wifi tierce, n'oubliez pas que son port réseau doit disposer d'un débit au moins égale au WiFi qu'il diffuse, et le routeur également. Le routeur conditionne directement la vitesse de communication entre vos appareils. En effet, le port WAN conditionne le débit qu'il peut recevoir de la part de votre FAI. Si vous avez un abonnement de 5 Gb/s, il vous faudra un port WAN d'au moins 5 Gb/s. Mais il conditionne également la vitesse de communication entre vos équipements. Si vous avez des appareils qui communiquent à 5 Gb/s, il faudra que la partie _switch_ du routeur disposent de ports 5 Gb/s. Enfin, si vous avez du matériel WiFi 7 et que vous souhaitez profiter de ces débits, il faudra également que votre routeur le supporte. Et dans le cas d'une borne Wifi tierce, n'oubliez pas que son port réseau doit disposer d'un débit au moins égale au WiFi qu'il diffuse, et le routeur également.
@@ -48,14 +48,16 @@ __Attention :__ Veillez à bien utiliser un switch avec des ports disposant des
## Les cables ## Les cables
Les cables sont des composants essentiels de votre réseau. Selon leur type et catégorie, ils limiteront le débit entre vos appareils et nécessitent donc d'etre dimensionnés de manière cohérente avec votre réseau. Ils doivent être compatibles avec les ports de vos apapreils. Pour rappel, voici les normes de ports les plus utilisées: Les cables sont des composants essentiels de votre réseau. Selon leur type et catégorie, ils limiteront le débit entre vos appareils et nécessitent donc d'etre dimensionnés de manière cohérente avec votre réseau. Ils doivent aussi être compatibles avec les ports de vos appareils.
- RJ45 Gigabit ethernet 10/100/1000 : le format standard de prise RJ45 permettant de dialoguer à des débit allant de 10Mbps (soit 0,125Mo/s) à 1000Mbps (soit 125Mo/s) Voici un rappel des normes de cables et de ports les plus courantes :
- RJ45 2.5G : Même prise, pouvant dialoguer jusqu'à 2,5Gpbs soit 2 500Mbps (donc 312,5Mo/s)
- RJ45 5G : Même prise, pouvant dialoguer jusqu'à 5Gpbs (donc 625Mo/s) - **RJ45 Gigabit Ethernet 10/100/1000** : le format standard de prise RJ45 permettant de dialoguer à des débit allant de 10Mbps (soit 0,125Mo/s) à 1000Mbps (soit 125Mo/s)
- RJ45 10G Base T : Même prise pouvant dialoguer jusqu'à 10Gb/s (soit 1,25Go/s) - **RJ45 2.5G** : Même prise, pouvant dialoguer jusqu'à 2,5Gpbs soit 2 500Mbps (donc 312,5Mo/s)
- SFP 1G : Prise SFP, généralement utilisée pour la fibre optique, pouvant dialoguer jusqu'à 1Gpbs - **RJ45 5G** : Même prise, pouvant dialoguer jusqu'à 5Gpbs (donc 625Mo/s)
- SFP+ 10G : Prise SFP amélioriée, aussi utilisée pour la fibre optique, pouvant dialoguer jusqu'à 10Gb/s. - **RJ45 10GBase-T** : Même prise pouvant dialoguer jusqu'à 10Gb/s (soit 1,25Go/s)
- **SFP 1G** : Prise SFP, généralement utilisée pour la fibre optique, pouvant dialoguer jusqu'à 1Gpbs
- **SFP+ 10G** : Prise SFP amélioriée, aussi utilisée pour la fibre optique, pouvant dialoguer jusqu'à 10Gb/s.
### Les cables Ethernet ### Les cables Ethernet
@@ -75,12 +77,20 @@ Ils sont définis en plusieurs catégorie, définissant le débit maximal selon
| 100 Mbs | CAT 5 | 100 m | | 100 Mbs | CAT 5 | 100 m |
Certains de ces cables sont plats, ronds, blindés (à relier à la terre), etc. Choisissez en fonction de votre installation. ce qu'il faut comprendre, c'est que pour relier un appareil qui dispose d'une prise RJ45 ethernet 2.5 Gb/s sur un routeur 2.5G b/s, il faut au moins un cable `CAT 5e`. Certains de ces cables sont plats, ronds, blindés (à relier à la terre), etc. Choisissez en fonction de votre installation. ce qu'il faut comprendre, c'est que pour relier un appareil qui dispose d'une prise RJ45 ethernet 2.5 Gb/s sur un routeur 2.5G b/s, il faut au moins un cable `CAT 5e`.
En revanche, si votre appareil est limité à 100 Mb/s, vous n'avez besoin que d'un cable `CAT 5`. En revanche, si votre appareil est limité à 100 Mb/s, vous n'avez besoin que d'un cable `CAT 5`.
Aujourd'hui, dans les nouvelles construction, la norme est d'installer des cables `CAT 6A` dans les murs. Ainsi, les prises murales sont prêtes à accepter du 10 Gb/s sur 100 m Aujourd'hui, dans les nouvelles construction, la norme est d'installer des cables `CAT 6A` dans les murs. Ainsi, les prises murales sont prêtes à accepter du 10 Gb/s sur 100 m
### Les cables optiques ### Les cables optiques
Très fins mais très fragile, on commence à les voir de plus en plus dans les installations chez soi. A commencer par le cable opérateur qui est relié entre votre prise fibre et votre box/routeur. Ils ont l'avantage de prendre peu de place, de ne rien consommer comparé à un cable en cuivre qui subit des déperdition d'energie liée à la chauffe, de n'emettre aucun rayonnement (pas besoin de blindage, pas de perturbation du signal) et d'accepter des débits très élevés sur de longue distance.
Très fins mais très fragile, on commence à les voir de plus en plus dans les installations chez soi. A commencer par le cable opérateur qui relie votre prise fibre à votre box/routeur. Ils ont plusieurs avantages :
- Extrêmement compacts
- Consommation électrique nulle (contrairement au cuivre, qui perd de l'énergie en chaleur)
- Aucun rayonnement électromagnétique (pas besoin de blindage, pas de perturbation du signal)
- Débits très élevés sur de longues distances
Pour du réseau local, il faut comprendre qu'il existe plusieurs types de cables fibres, conditionnant le débit selon la distance, et conditionnant le type de `transceiver` à utiliser. En effet, les cables fibres se branchent sur les ports SFP+ de vos appareils, via un petit objet qui traduit le signal lumineux en information électrique, et qui, dans le sens inverse, traduit les informations électrique en signal lumineux. Pour du réseau local, il faut comprendre qu'il existe plusieurs types de cables fibres, conditionnant le débit selon la distance, et conditionnant le type de `transceiver` à utiliser. En effet, les cables fibres se branchent sur les ports SFP+ de vos appareils, via un petit objet qui traduit le signal lumineux en information électrique, et qui, dans le sens inverse, traduit les informations électrique en signal lumineux.
@@ -91,11 +101,19 @@ Globalement, pour du réseau local, on évitera de choisir autre chose qu'un cab
__Attention :__ Veillez à bien utiliser des `transceiver` compatibles avec vos materiels (routeur, switch ou appareil). Il n'existe pas encore de standard absolu, les constructeurs précisent généralement les marques compatibles. __Attention :__ Veillez à bien utiliser des `transceiver` compatibles avec vos materiels (routeur, switch ou appareil). Il n'existe pas encore de standard absolu, les constructeurs précisent généralement les marques compatibles.
:: ::
### Les cables DAC ### Les cables DAC
Ce sont des cables en cuivre fichés dans des `transceiver`. Ils permettent à deux ports SFP/SFP+ de dialoguer, à courte distance, sans utiliser une fibre plus fragile ou d'adapteteur RJ45. Cependant, ils demandent plus d'énergie, la deperdition dans le cuivre etant non négligeable. Ce sont des cables en cuivre fichés dans des `transceiver`. Ils permettent à deux ports SFP/SFP+ de dialoguer, à courte distance, sans utiliser une fibre plus fragile ou d'adapteteur RJ45. Cependant, ils demandent plus d'énergie, la deperdition dans le cuivre etant non négligeable.
### Les transceiver SFP+ ### Les transceiver SFP+
Il permettent de connecter différents typle de cable à vos ports SFP/SFP+. Il en existe pour fibre optique, pour DAC et pour RJ45.
Ils permettent de connecter différents types de cables à vos ports SFP/SFP+. Il en existe pour :
- la fibre optique
- le DAC
- le RJ45
::warning ::warning
@@ -3,6 +3,7 @@ title: Le ProloNAS
description: Construire un serveur domestique performant avec un mini PC Intel N100. Guide pratique pour démarrer l'auto-hébergement pour moins de 130 €. description: Construire un serveur domestique performant avec un mini PC Intel N100. Guide pratique pour démarrer l'auto-hébergement pour moins de 130 €.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
::note ::note
@@ -19,24 +20,25 @@ Un Mini PC à 100 balles + un dock USB à 50 balles accueillant des disques durs
C'est tout simplement ça le **ProloNAS, un NAS accessible pour les prolo**. Charge à vous ensuite de calibrer votre besoin en Disques Durs. C'est tout simplement ça le **ProloNAS, un NAS accessible pour les prolo**. Charge à vous ensuite de calibrer votre besoin en Disques Durs.
En exemple :
- Mini PC - **Attention : prendre 16GB - 512GB** : [Aliexpress](https://fr.aliexpress.com/item/1005008477986765.html)
- DAS (Direct Attached Storage) - **Attention : prendre "EU plug"** : [Aliexpress](https://fr.aliexpress.com/item/1005007933987260.html)
- Alternatives avec ventilateur et plus soigné : [Amazon](https://www.amazon.fr/Boîtier-Disque-Ventilateur-Supportant-Capacité/dp/B0DD3GSSCX)
Je précise que cela ne sont pas des liens affiliés, prenez ce que vous voulez.
![](/img/global/prolonas.svg) ![](/img/global/prolonas.svg)
## Exemple de matériel
- Mini PC (**Attention : prendre 16 Go / 512 Go**) : [Aliexpress](https://fr.aliexpress.com/item/1005008477986765.html)
- DAS (Direct Attached Storage) (**Attention : prendre « EU plug »**) : [Aliexpress](https://fr.aliexpress.com/item/1005007933987260.html)
- Alternative plus soignée avec ventilateur : [Amazon](https://www.amazon.fr/Boîtier-Disque-Ventilateur-Supportant-Capacité/dp/B0DD3GSSCX)
> *Ce ne sont pas des liens affiliés, achetez où vous voulez.*
## Pourquoi un NAS ? ## Pourquoi un NAS ?
Un NAS (Network Attached Storage), c'est une machine conçue autour d'un espace de stockage ayant vocation a être partagé sur un réseau. L'idée du NAS, c'est d'avoir un stockage fiable et sécurisé sur lequel s'appuie nos usages et nos applicatifs comme des données cloud par exemple (un drive comme [Nextcloud](/fr/serveex/cloud/nextcloud), une synchro photo comme [Immich](/fr/serveex/cloud/immich). Mais aussi vos media comme vos films (par exemple avec [Plex](/fr/serveex/media/plex)) ou les videos de vos caméra de surveillance. Un NAS (Network Attached Storage), c'est une machine conçue autour d'un espace de stockage ayant vocation a être partagé sur un réseau. L'idée du NAS, c'est d'avoir un stockage fiable et sécurisé sur lequel s'appuie nos usages et nos applicatifs comme des données cloud par exemple (un drive comme [Nextcloud](/serveex/cloud/nextcloud), une synchro photo comme [Immich](/serveex/cloud/immich). Mais aussi vos media comme vos films (par exemple avec [Jellyfin](/serveex/media/jellyfin)) ou les videos de vos caméra de surveillance.
**Mais pourquoi un Mini PC sans DAS ne suffirait il pas ?** Bien sûr, un simple mini PC avec ses 1 à 2To de stockage devraient suffire pour la plupart des gens. Et les films pourraient tenir dans un disque dur externe de quelques TB supplémentaire. En revanche ce n'est pas une solution fiable ni extensible de faire tourner ses applications et usages sur du stockage qui au moindre choc, au moindre probleme, fait perdre vos données définitivement. ### Mais pourquoi un Mini PC avec un disque dur externe ne suffirait-il pas ?
Le vrai NAS est construit autour de la fiabilité du support qui contient vos données. Il nécessite de mettre en place des stratégies de stockages type [RAID](/fr/general/storage/raid) afin de préserver vos données en cas de panne et de la sauvegarde en cas de corruption (comme les snapshot [ZFS](/fr/general/storage/zfs)). Bien sûr, un simple mini PC avec ses 1 à 2To de stockage devraient suffire pour la plupart des gens. Et les films pourraient tenir dans un disque dur externe de quelques TB supplémentaire. En revanche ce n'est pas une solution fiable ni extensible de faire tourner ses applications et usages sur du stockage qui au moindre choc, au moindre probleme, fait perdre vos données définitivement.
Le vrai NAS est construit autour de la fiabilité du support qui contient vos données. Il nécessite de mettre en place des stratégies de stockages type [RAID](/general/storage/raid) afin de préserver vos données en cas de panne et de la sauvegarde en cas de corruption (comme les snapshot [ZFS](/general/storage/zfs)).
Vous l'aurez compris, l'idée du NAS c'est de déporter chez vous tout ce que vous confiez actuellement à des tiers, tout en assurant la fiabilité du support et la sauvegarde des données stockées. Vous l'aurez compris, l'idée du NAS c'est de déporter chez vous tout ce que vous confiez actuellement à des tiers, tout en assurant la fiabilité du support et la sauvegarde des données stockées.
@@ -54,24 +56,24 @@ Rappelez vous le **ProloNAS** : un N100 4 coeurs, 16Go de RAM, un SSD de 512Go,
« Oui mais ok l'argument du prix, mais au moins tu lances le truc et c'est bon, t'as de jolies applications qui tournent toute seule sans maintenance ». « Oui mais ok l'argument du prix, mais au moins tu lances le truc et c'est bon, t'as de jolies applications qui tournent toute seule sans maintenance ».
Une année. Une année c'est le temps qu'il m'a fallu pour jeter à la poubelle mon Syno en me disant que j'aurais du dès le départ partir sur mon **ProloNAS** (devenu un vrai serveur, depuis). Une année.
Une année c'est le temps qu'il m'a fallu pour jeter à la poubelle mon Syno en me disant que j'aurais du dès le départ partir sur mon **ProloNAS** (devenu un vrai serveur, depuis).
Les constructeurs vous mettent à disposition des OS linux customisés à leur sauce, ne partageant pas les catalogues d'applications linux des distributions majeures, avec des noyaux linux datant souvent de l'antiquité, et surtout des OS tres fermés ne vous permettant pas de développer votre NAS exactement selon vos besoins. Les constructeurs vous mettent à disposition des OS linux customisés à leur sauce, ne partageant pas les catalogues d'applications linux des distributions majeures, avec des noyaux linux datant souvent de l'antiquité, et surtout des OS tres fermés ne vous permettant pas de développer votre NAS exactement selon vos besoins. En gros, soit vous utilisez leurs applications, soit vous rentrer dans un monde de souffrance. Pour donner un exemple, de nombreux conteneurs docker ne fonctionnent pas sur ces NAS constructeurs car le kernel est tellement vieux qu'il ne peut supporter les versions pourtant pas toujours récentes de docker.
En gros, soit vous utilisez leurs applications, soit vous rentrer dans un monde de souffrance. Pour donner un exemple, de nombreux conteneurs docker ne fonctionnent pas sur ces NAS constructeurs car le kernel est tellement vieux qu'il ne peut supporter les versions pourtant pas toujours récentes de docker.
### Dépendance des mises à jours propriétaires ### Dépendance des mises à jours propriétaires
« Oui mais moi j'ai pas d'autre usages que ce que leurs applicatifs natifs proposent ». Oui oui, moi aussi j'ai cru ça. Mais 1 an après mon Syno, mes usages ont explosés. Media center, gestion de mot de passe, plateforme git, plateforme de développement, Authentification forte et SSO hébergement web... Pourquoi etre bloqués par les solutions constructeurs jamais excellentes, souvent baclées et compatibles avec rien ? « Oui mais moi j'ai pas d'autre usages que ce que leurs applicatifs natifs proposent ».
Oui oui, moi aussi j'ai cru ça. Mais 1 an après mon Syno, mes usages ont explosés. Media center, gestion de mot de passe, plateforme git, plateforme de développement, Authentification forte et SSO hébergement web... Pourquoi etre bloqués par les solutions constructeurs jamais excellentes, souvent baclées et compatibles avec rien ?
D'autre part, ces applicatifs, vous devenez dépendant de la bonne volonté du constructeur, en terme de sécurité, de mises à jour, et de disponibilités. Je préfère confier cette dépendance à des projets open-source, mis à jour plus régulièrement et ne dépendant pas de la bonne volonté d'un board commercial. D'autre part, ces applicatifs, vous devenez dépendant de la bonne volonté du constructeur, en terme de sécurité, de mises à jour, et de disponibilités. Je préfère confier cette dépendance à des projets open-source, mis à jour plus régulièrement et ne dépendant pas de la bonne volonté d'un board commercial.
Et cela ne s'arrête pas là, qui vous dit que les disques dur que vous avez inséré dans ces NAS proproietaires vont etre supportés ? Synology a rendu incompatible son matériel avec les marques n'ayant pas un partenariat avec eux, afin de booster la vente de leurs propres disques. Et cela ne s'arrête pas là, qui vous dit que les disques dur que vous avez inséré dans ces NAS proproietaires vont etre supportés ? Synology a rendu incompatible son matériel avec les marques n'ayant pas un partenariat avec eux, afin de booster la vente de leurs propres disques. Qui vous dit que votre media center pourra profiter des performances de l'iGPU de votre processeur pour streamer vos media vers vos appareils ? [Synology a désactivé le transcodage matériel de ses NAS](https://www.cachem.fr/synology-desactive-transcodage-materiel-nas/).
Qui vous dit que votre media center pourra profiter des performances de l'iGPU de votre processeur pour streamer vos media vers vos appareils ? [Synology a désactivé le transcodage matériel de ses NAS](https://www.cachem.fr/synology-desactive-transcodage-materiel-nas/).
Bref, vous n'avez aucun pouvoir sur un produit qui n'est pas réellement ni ouvert ni à vous. Bref, vous n'avez aucun pouvoir sur un produit qui n'est pas réellement ni ouvert ni à vous.
## OK mais omment je passe de mon Mini PC Serveex à un ProloNAS ? ## OK, mais comment je passe de mon Mini PC Serveex à un ProloNAS ?
Comme dit plus haut, avec un DAS (hub disque) + de quoi faire du [RAID](/fr/general/storage/raid) avec [ZFS](/fr/general/storage/zfs) par exemple. Comme dit plus haut, avec un DAS (hub disque) + de quoi faire du [RAID](/general/storage/raid) avec [ZFS](/general/storage/zfs) par exemple.
Enjoy !
@@ -0,0 +1,2 @@
title: Linux pour les nuls
icon: i-lucide-terminal
@@ -0,0 +1,255 @@
---
title: Bases de la ligne de commande
description: Comprendre comment une commande Linux est construite, apprendre les commandes essentielles du terminal, ce que veulent dire leurs noms, et repartir avec un aide-mémoire.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
Un serveur n'a pas de bureau, pas d'icônes et pas de souris. Tout se passe dans un terminal, et cette fenêtre noire avec un curseur clignotant est la seule chose qui décourage les gens de s'auto-héberger. À tort : le terminal n'est qu'une conversation. Vous tapez une ligne, la machine fait exactement ça et répond. Rien de plus magique qu'une barre de recherche, sauf qu'il en fait bien plus et ne cache jamais une option derrière trois menus.
La bonne nouvelle, c'est que vous n'avez pas besoin de connaître cent commandes. Dix d'entre elles couvrent presque tout ce que vous ferez sur un serveur maison, et elles suivent toutes le même schéma. Apprenez le schéma d'abord, et chaque commande croisée ensuite devient lisible, même celles que vous n'avez jamais vues.
## Comment une commande est construite
Chaque ligne de commande, sans exception, est la même phrase : **quoi lancer**, **comment le lancer**, **sur quoi le lancer**.
```text [Anatomie d'une commande]
sudo apt install -y nano
│ │ │ │ └─ argument : ce sur quoi la commande travaille
│ │ │ └──── option : change son comportement
│ │ └──────────── sous-commande : ce que le programme doit faire
│ └──────────────── le programme que vous lancez
└───────────────────── le lancer avec les droits administrateur
```
Lue à voix haute, cette ligne dit « en tant qu'administrateur, demande au gestionnaire de paquets d'installer le paquet nano, et ne me demande pas de confirmer ». Ce sont les espaces qui séparent les morceaux, et c'est pour ça qu'un dossier nommé `Mes Sauvegardes` doit être mis entre guillemets (`cd "Mes Sauvegardes"`), sinon le shell y lit deux choses différentes.
### Les options, courtes et longues
Les options changent le comportement d'une commande. Elles existent en deux saveurs, et la plupart des commandes acceptent les deux :
- **Courtes**, un tiret et une seule lettre : `ls -a`. Elles peuvent s'empiler, donc `ls -l -a -h` s'écrit généralement `ls -lah`.
- **Longues**, deux tirets et un mot entier : `ls --all`. Plus longues à taper, mais vous saurez encore ce qu'elles font six mois plus tard, ce qui en fait le meilleur choix dans un script.
Certaines options attendent une valeur juste après elles : `ssh-keygen -t ed25519` (`-t` pour type), `rsync --exclude @eaDir`. Et la casse compte, toujours. Dans `ls`, `-r` inverse l'ordre de tri alors que `-R` descend dans les sous-dossiers. Deux choses différentes, à une lettre près.
### Les arguments et les chemins
L'argument est la cible : un fichier, un dossier, un nom de paquet, une adresse. Beaucoup de commandes en acceptent plusieurs à la fois, séparés par des espaces, et c'est ce qui rend le terminal rapide : `rm fichier1.txt fichier2.txt fichier3.txt` supprime trois fichiers d'un coup.
Quand la cible est un endroit sur le disque, vous l'écrivez sous forme de chemin, et quelques raccourcis valent la peine d'être connus :
| Chemin | Signification |
| --- | --- |
| `/` | la racine de tout le système, tout vit en dessous |
| `~` | votre propre dossier personnel, `/home/utilisateur` |
| `.` | le dossier dans lequel vous vous trouvez |
| `..` | le dossier juste au-dessus |
| `/var/log` | un chemin **absolu**, même résultat depuis n'importe où |
| `logs/aujourdhui` | un chemin **relatif**, compris depuis là où vous êtes |
Quel dossier contient quoi est un sujet à part entière, traité dans [dossiers et partitions](/general/linux/filesystem).
L'invite de commande vous dit elle-même où vous êtes : dans `utilisateur@serveex:~/docker$`, vous êtes connecté en tant qu'`utilisateur` sur la machine nommée `serveex`, dans le dossier `docker` de votre home. Ce `$` final signifie un utilisateur normal. S'il affiche un jour `#`, vous êtes root et chaque faute de frappe compte double.
### Trouver de l'aide
Deux habitudes vous rendent indépendant des tutoriels. `commande --help` affiche un résumé rapide de chaque option, et `man commande` ouvre le manuel complet (`man` pour *manual*), que vous quittez en appuyant sur :kbd{value="Q"}.
::tip{icon=""}
✨ __Astuce :__ trois réflexes clavier qui changent tout : :kbd{value="Tab"} complète le nom de fichier ou de dossier que vous avez commencé à taper, si bien que vous ne tapez presque jamais un chemin complet ; la flèche :kbd{value="Up"} rappelle vos commandes précédentes, ce qui évite de retaper une longue ligne pour un caractère ; et :kbd{value="Ctrl"} + :kbd{value="C"} arrête ce qui est en train de tourner.
::
### Enchaîner les commandes
Une fois le schéma compris, les commandes se branchent les unes aux autres :
- `&&` lance la suivante seulement si la précédente a réussi : `sudo apt update && sudo apt full-upgrade`
- `|`, le pipe, envoie la sortie d'une commande dans une autre : `ls -l | grep sauvegarde` liste le dossier, puis ne garde que les lignes contenant « sauvegarde »
- `>` écrit la sortie dans un fichier au lieu de l'écran, et `>>` l'ajoute à la fin de ce fichier : `df -h > rapport-disques.txt`
## Les commandes que vous utiliserez vraiment
La plupart des noms de commandes sont des abréviations d'une expression anglaise. Une fois que vous savez ce qu'elles signifient, elles cessent de ressembler à du bruit de clavier.
### `pwd`, print working directory
Vous dit où vous êtes. Elle ne change rien, elle répond juste à la question.
```bash [Terminal]
pwd
```
```console [Sortie]
/home/utilisateur/docker
```
### `ls`, list
Liste ce qu'il y a dans le dossier courant. Seule, elle n'affiche que les noms, elle est donc presque toujours utilisée avec des options : `-l` pour le format long avec tailles, dates et permissions, `-a` pour afficher aussi les fichiers cachés (ceux qui commencent par un point), `-h` pour des tailles en K/M/G plutôt qu'en octets bruts.
```bash [Terminal]
ls -lah
```
```console [Sortie]
total 20K
drwxr-xr-x 4 utilisateur utilisateur 4.0K Sep 5 10:12 .
drwxr-xr-x 18 utilisateur utilisateur 4.0K Sep 4 21:03 ..
-rw-r--r-- 1 utilisateur utilisateur 512 Sep 5 10:12 .env
-rw-r--r-- 1 utilisateur utilisateur 1.2K Sep 5 09:58 compose.yaml
drwxr-xr-x 3 utilisateur utilisateur 4.0K Sep 2 18:44 immich
```
La première colonne, ce sont les permissions, le `d` tout au début signifiant qu'il s'agit d'un dossier. Puis le propriétaire, la taille, la date de dernière modification, et le nom.
### `cd`, change directory
Vous déplace. Avec un chemin elle y va, avec `..` elle remonte d'un niveau, et sans rien du tout elle vous ramène chez vous.
```console [Terminal]
utilisateur@serveex:~/docker$ cd /var/log
utilisateur@serveex:/var/log$ cd ..
utilisateur@serveex:/$ cd
utilisateur@serveex:~$
```
Remarquez l'invite qui vous suit : elle montre toujours où vous vous trouvez, si bien qu'en pratique vous avez rarement besoin de `pwd`.
### `mkdir`, make directory
Crée un dossier. Plusieurs à la fois si vous les listez, et `-p` crée toute la chaîne de parents d'un coup, c'est la version que vous utiliserez vraiment.
```bash [Terminal]
mkdir sauvegardes
mkdir -p docker/immich/config
```
```console [Sortie]
```
Rien. Ce n'est pas un bug, c'est la règle : la plupart des commandes ne disent rien quand elles réussissent et ne se manifestent que si quelque chose se passe mal. Le silence est une bonne nouvelle, et `ls` confirme que le dossier est bien là.
### `cp` et `mv`, copy et move
`cp` copie, `mv` déplace. Même forme dans les deux cas : d'abord la source, puis la destination. Copier un dossier demande `-r`, pour *recursive*, puisqu'un dossier veut dire tout ce qu'il contient aussi. `mv` sert également de commande pour renommer, parce que renommer un fichier revient simplement à le déplacer vers un nouveau nom.
```bash [Terminal]
cp compose.yaml compose.yaml.bak
cp -r config/ config-backup/
mv ancien-nom.txt nouveau-nom.txt
ls
```
```console [Sortie]
compose.yaml compose.yaml.bak config config-backup nouveau-nom.txt
```
Trois commandes silencieuses, et `ls` qui montre le résultat : la copie est à côté de l'original, le dossier a été dupliqué, et `ancien-nom.txt` a disparu parce que le déplacer vers un autre nom, c'est exactement ce que veut dire renommer.
### `rm`, remove
Supprime. Il n'y a pas de corbeille, pas d'annulation, pas de fenêtre de confirmation. `-r` supprime un dossier et son contenu, `-f` force sans demander.
::warning{to="/nonsense/bash/rm-confirmation"}
`rm -rf` est la commande qui efface les homelabs. Elle ne vérifie pas, ne prévient pas, et ne s'arrête pas. Relisez le chemin deux fois avant d'appuyer sur :kbd{value="Enter"}, surtout quand la ligne commence par `sudo` et contient un `/` ou un `*`. Vous pouvez aussi vous en prémunir en enveloppant `sudo` dans une petite fonction Bash qui demande **« êtes-vous sûr ? »** avant de laisser passer un `rm`, c'est le sujet de **rm confirmation guard**.
::
### `cat` et `nano`, lire et modifier
`cat` (abréviation de *concatenate*) déverse un fichier entier à l'écran, parfait pour une config courte. Pour tout ce qui est plus long, `less` le fait défiler (nommé en clin d'œil à `more`, le pager plus ancien qu'il a remplacé), et vous en sortez avec :kbd{value="Q"}.
Pour modifier réellement un fichier, `nano` ouvre un éditeur simple : les flèches pour se déplacer, :kbd{value="Ctrl"} + :kbd{value="O"} pour enregistrer, :kbd{value="Ctrl"} + :kbd{value="X"} pour quitter.
```bash [Terminal]
cat .env
```
```properties [Sortie]
PUID=1000
PGID=1000
TZ=Europe/Paris
```
### `grep`, chercher dans les fichiers
`grep` veut dire *global regular expression print*, une façon compliquée de dire « trouve-moi ce texte ». Vous lui donnez quoi chercher et où, et il affiche chaque ligne correspondante. `-r` cherche dans tout un dossier, `-i` ignore les majuscules et minuscules, `-n` affiche les numéros de ligne.
```bash [Terminal]
grep -rin "password" /home/utilisateur/docker
```
```console [Sortie]
/home/utilisateur/docker/immich/.env:6:DB_PASSWORD=changeme
/home/utilisateur/docker/vaultwarden/compose.yaml:14: ADMIN_PASSWORD=hunter2
```
Chaque ligne indique le fichier, puis le numéro de ligne à l'intérieur, puis la ligne correspondante elle-même. Très pratique le jour où vous ne vous souvenez plus dans quelle stack se trouve un réglage.
### `sudo`, lancer en administrateur
*Substitute user do*. Un utilisateur normal ne peut pas toucher aux fichiers du système, et c'est précisément ce qui vous protège de casser la machine par accident. Préfixer une commande par `sudo` lance cette seule commande avec les droits administrateur, et demande votre mot de passe la première fois.
```bash [Terminal]
nano /etc/ssh/sshd_config
```
```console [Sortie]
Error writing /etc/ssh/sshd_config: Permission denied
```
```bash [Terminal]
sudo nano /etc/ssh/sshd_config
```
```console [Sortie]
[sudo] password for utilisateur:
```
::note
Si une commande répond `Permission denied`, c'est en général tout le problème : il lui fallait `sudo`. Résistez quand même au réflexe de mettre `sudo` partout, un fichier créé en root continuera de vous embêter ensuite parce que votre utilisateur normal n'en est plus propriétaire.
::
## Aide-mémoire
Celles qui valent la peine d'être gardées sous la main, et d'où viennent leurs noms.
| Commande | Abréviation de | Ce qu'elle fait |
| --- | --- | --- |
| `pwd` | print working directory | Affiche où vous êtes |
| `ls` | list | Liste les fichiers et les dossiers |
| `cd` | change directory | Vous déplace ailleurs |
| `mkdir` | make directory | Crée un dossier |
| `touch` | mot anglais courant | Crée un fichier vide, ou rafraîchit sa date |
| `cp` | copy | Copie un fichier ou un dossier |
| `mv` | move | Déplace ou renomme |
| `rm` | remove | Supprime, définitivement |
| `cat` | concatenate | Affiche un fichier à l'écran |
| `less` | jeu de mots sur `more` | Fait défiler un fichier long |
| `nano` | l'éditeur qui remplace Pico | Modifie un fichier |
| `grep` | global regular expression print | Cherche du texte |
| `find` | mot anglais courant | Cherche des fichiers par nom, taille ou date |
| `man` | manual | Ouvre la documentation complète d'une commande |
| `df` | disk free | Affiche l'espace libre par partition |
| `lsblk` | list block devices | Dessine l'arbre des disques et des partitions |
| `du` | disk usage | Affiche ce que pèse un dossier |
| `ps` | process status | Liste les processus en cours |
| `htop` | le `top` de Hisham | Vue en direct du CPU, de la RAM et des processus |
| `kill` | mot anglais courant | Arrête un processus par son numéro |
| `chmod` | change mode | Change les permissions d'un fichier |
| `chown` | change owner | Change le propriétaire d'un fichier |
| `sudo` | substitute user do | Lance une commande en administrateur |
| `apt` | advanced package tool | Installe, met à jour et supprime des paquets |
| `systemctl` | control systemd | Démarre, arrête et active des services |
| `ssh` | secure shell | Ouvre une session sur une machine distante |
| `scp` | secure copy | Copie des fichiers via SSH |
| `tar` | tape archive | Empaquette et dépaquette des archives |
| `wget` | web get | Télécharge un fichier depuis une URL |
| `curl` | client URL | Envoie une requête à une URL |
| `history` | mot anglais courant | Liste les commandes tapées précédemment |
::tip{icon=""}
✨ __Astuce :__ personne ne retient tout ça. Vous rechercherez les trois mêmes options pendant des semaines, puis un jour vous réaliserez que vous les tapez sans réfléchir. En attendant, `--help` et ce tableau sont parfaitement légitimes.
::
@@ -0,0 +1,59 @@
---
title: Dossiers et partitions
description: Comment le système de fichiers de Debian est organisé, ce que contient chaque dossier racine, la différence entre partitions et dossiers, et les habitudes qui gardent un serveur propre.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
Windows donne à chaque disque sa propre lettre. Linux non : il y a exactement un arbre, il commence à `/`, et tout le reste s'y accroche, y compris vos autres disques. Un deuxième disque n'est pas `D:`, il est *monté* sur un dossier de l'arbre, `/mnt/data` par exemple, et à partir de là il ressemble à n'importe quel autre dossier. Déroutant au début, très pratique ensuite, puisqu'un programme n'a jamais à savoir sur quel disque physique il écrit.
## L'arbre
Cet arbre n'a rien d'arbitraire non plus. Toutes les installations de Debian ont les mêmes dossiers aux mêmes endroits, et c'est pour ça qu'un tutoriel écrit pour le serveur de quelqu'un d'autre s'applique au vôtre.
| Dossier | Ce qu'il contient |
| --- | --- |
| `/home` | Les fichiers des utilisateurs. Le vôtre est `/home/utilisateur`, aussi écrit `~` |
| `/root` | Le dossier personnel du compte root, à ne pas confondre avec `/` |
| `/etc` | La configuration du système, uniquement des fichiers texte |
| `/var` | Les données qui grossissent : les logs dans `/var/log`, Docker dans `/var/lib/docker` |
| `/tmp` | Les fichiers temporaires, vidés à chaque redémarrage |
| `/usr` | Les programmes installés eux-mêmes, gérés par `apt` |
| `/opt` | Les logiciels installés en dehors du gestionnaire de paquets |
| `/mnt` et `/media` | Là où sont montés les disques supplémentaires, `/media` pour les amovibles |
| `/boot` | Le noyau et le chargeur de démarrage, sur une petite partition à part |
| `/dev` | Votre matériel, exposé sous forme de fichiers (`/dev/sda` est un disque) |
| `/proc` et `/sys` | L'état vivant du noyau, inventé à la volée, pas de vrais fichiers |
## Un dossier n'est pas une partition
Les partitions sont une question distincte des dossiers. Une installation minimale de Debian en crée typiquement deux, une pour `/` et une pour le swap, si bien que tous les dossiers ci-dessus sauf `/boot` vivent sur la même partition et se partagent le même espace libre. Deux commandes pour en voir la réalité : `lsblk` dessine l'arbre des disques et des partitions, `df -h` montre le taux de remplissage de chacune.
```bash [Terminal]
lsblk
```
```console [Output]
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 461.3G 0 part /
└─sda3 8:3 0 4G 0 part [SWAP]
sdb 8:16 0 3.6T 0 disk
└─sdb1 8:17 0 3.6T 0 part /mnt/data
```
## Quelques habitudes à prendre
- **Donnez un seul foyer à vos stacks Docker, et gardez-les là.** `/srv` est le dossier que la norme réserve aux données servies par la machine, ce qui en fait l'endroit le plus propre pour les fichiers compose et leurs bind mounts. [Serveex](/serveex/introduction) met tout dans `/srv/docker`, un dossier par stack. Ce qui compte, c'est de choisir un endroit et de s'y tenir, plutôt que d'en éparpiller la moitié dans votre dossier personnel.
- **Vos fichiers à vous vont dans votre home.** Les scripts dans `~/bin`, les notes, les téléchargements, tout ce qui est personnel. `/root` est le dossier du compte root, pas un endroit commode où déposer des choses.
- **Ne modifiez jamais quoi que ce soit sous `/usr` ou `/bin` à la main.** `apt` en est propriétaire, et vos changements disparaîtront à la prochaine mise à jour. Ce que vous avez le droit de configurer vit dans `/etc`.
- **Dans `/etc`, préférez un fichier additionnel plutôt que de modifier le principal.** Beaucoup de services lisent tous les `.conf` d'un dossier `quelquechose.d/` posé à côté de leur config principale, `/etc/ssh/sshd_config.d/` par exemple. Votre fichier survit alors à une mise à jour de paquet qui réécrirait l'original.
- **Montez les disques de données par UUID, pas par `/dev/sdb`.** Les lettres de périphérique sont attribuées dans l'ordre où le noyau trouve les disques, elles peuvent donc s'échanger après un redémarrage ou l'ajout d'un disque. `lsblk -f` vous donne l'UUID à mettre dans `/etc/fstab`.
- **Gardez un œil sur `/var`.** Les images Docker, les logs des conteneurs et ceux du système s'y accumulent tous, sur la même partition que le reste. `du -sh /var/lib/docker` vous dit ce que pèsent les conteneurs, `df -h` s'il faut s'inquiéter.
- **Ne créez pas vos fichiers avec `sudo` quand ce n'est pas nécessaire.** Un fichier créé en root dans votre home reste la propriété de root, et vous vous battrez avec des erreurs de permissions dessus pendant des semaines.
::note{to="/general/linux/cli-basics"}
Tout ce qui précède suppose que vous savez déjà vous déplacer dans un terminal. Si `cd`, `ls` et `sudo` ne vous parlent pas encore, commencez par les **bases de la ligne de commande**.
::
@@ -0,0 +1,261 @@
---
title: Outils CLI pratiques
description: Une poignée d'outils en ligne de commande à installer sur un serveur maison, ce que chacun remplace, et les étapes pour les installer et s'en servir.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
Une installation minimale de Debian embarque le strict minimum, ce qui veut dire que les outils fournis sont ceux de 1995. Ils fonctionnent, mais lire la sortie de `df` ou chercher ce qui a rempli un disque avec `du` est inutilement pénible quand de meilleures versions existent et ne coûtent rien à installer.
Tout ce qui suit sauf le dernier vient directement des dépôts Debian, il n'y a donc aucune source tierce à qui faire confiance et `apt` les maintient à jour en même temps que le reste du système.
::note{to="/general/linux/cli-basics"}
Toutes les commandes ici se tapent dans un terminal via SSH. Si `sudo`, `apt` et `cd` ne vous parlent pas encore, commencez par les **bases de la ligne de commande**.
::
## La version courte
| Outil | Remplace | À quoi ça sert |
| --- | --- | --- |
| `btop` | `top`, `htop` | Surveiller le CPU, la RAM et les processus |
| `duf` | `df -h` | L'espace libre, en lisible |
| `ncdu` | `du -sh` | Trouver ce qui a rempli le disque |
| `tldr` | `man` | Les cinq commandes dont vous avez vraiment besoin |
| `lazydocker` | `docker ps` et compagnie | Gérer les conteneurs en SSH |
| `ufw` | `iptables` brut | Un pare-feu réellement lisible |
## La version pressée
Une seule ligne installe tous ceux qui sont empaquetés, et chaque section ci-dessous explique ce que vous venez d'obtenir.
```bash [Terminal]
sudo apt update
sudo apt install btop duf ncdu tealdeer ufw
```
## `btop`, surveiller ce que fait la machine
Le remplaçant moderne de `top` et `htop` : CPU, RAM, disques, réseau et processus sur un seul écran, avec des graphiques, des couleurs et une souris qui marche. C'est ce que vous ouvrez quand quelque chose semble lent.
::steps{level="4"}
#### L'installer
```bash [Terminal]
sudo apt install btop
```
#### Le lancer
```bash [Terminal]
sudo btop
```
![btop affichant le CPU, la mémoire, les disques, le réseau et les processus](/img/global/linux/btop.png)
Cliquez sur un processus pour le sélectionner, :kbd{value="Esc"} ouvre le menu, :kbd{value="Q"} quitte. Les touches `+` et `-` replient et déplient les panneaux si l'écran paraît chargé.
#### Terminé !
::
## `duf`, l'espace disque qui se lit comme un tableau
`df -h` affiche tous les loop devices que Docker a créés un jour et vous laisse plisser les yeux sur les colonnes. `duf` montre les mêmes informations groupées, alignées et colorées, avec une barre d'utilisation par système de fichiers.
::steps{level="4"}
#### L'installer
```bash [Terminal]
sudo apt install duf
```
#### Le lancer
```bash [Terminal]
sudo duf
```
![duf listant les systèmes de fichiers locaux, réseau et spéciaux](/img/global/linux/duf.png)
Les disques locaux, les partages réseau et les montages système sont groupés séparément. Ajoutez `--only local` pour masquer les pseudo-systèmes de fichiers que Docker laisse derrière lui.
#### Terminé !
::
## `ncdu`, trouver ce qui a mangé le disque
Quand `duf` vous dit que le disque est plein, `ncdu` vous dit pourquoi. Il parcourt un dossier, trie tout par taille réelle, et vous laisse descendre avec les flèches au lieu de lancer `du -sh *` vingt fois.
::steps{level="4"}
#### L'installer
```bash [Terminal]
sudo apt install ncdu
```
#### Le pointer sur un dossier
```bash [Terminal]
sudo ncdu /srv/docker
```
Les flèches pour se déplacer, :kbd{value="Enter"} pour ouvrir un dossier, :kbd{value="D"} pour supprimer l'élément sélectionné, :kbd{value="Q"} pour quitter. Sur un gros disque le premier scan prend un moment, il lit tout.
::warning
:kbd{value="D"} supprime immédiatement, avec une seule confirmation et sans corbeille. Lancez `ncdu` sans `sudo` quand vous ne faites que regarder, comme ça une touche tapée de travers ne peut rien toucher de ce qui appartient au système.
::
#### Terminé !
::
## `tldr`, le manuel sans les 400 lignes
`man tar` est exhaustif et illisible. `tldr tar` vous donne les cinq commandes que les gens tapent vraiment, avec une ligne d'explication chacune. Ce sont des exemples maintenus par la communauté plutôt qu'un substitut au vrai manuel, et sur Debian le client est empaqueté sous le nom `tealdeer`.
::steps{level="4"}
#### L'installer
```bash [Terminal]
sudo apt install tealdeer
```
#### Télécharger le cache des pages
```bash [Terminal]
tldr --update
```
Les exemples sont récupérés une fois et stockés en local, la commande fonctionne donc hors ligne ensuite. À relancer tous les quelques mois.
#### Lui demander quelque chose
```bash [Terminal]
tldr rsync
```
#### Terminé !
::
## `lazydocker`, gérer ses conteneurs depuis le terminal
La seule exception : il n'est pas empaqueté par Debian. C'est une interface texte complète pour Docker, conteneurs, images, volumes et logs sur un seul écran, avec des touches pour redémarrer, arrêter ou suivre les logs de n'importe quoi. Pratique quand vous êtes déjà en SSH et que vous n'avez pas envie d'ouvrir Dockge.
::steps{level="4"}
#### Télécharger la dernière version
```bash [Terminal]
curl -Lo /tmp/lazydocker.tar.gz "https://github.com/jesseduffield/lazydocker/releases/latest/download/lazydocker_0.25.2_Linux_x86_64.tar.gz"
```
Vérifiez le numéro de version actuel sur la [page des releases](https://github.com/jesseduffield/lazydocker/releases), et prenez `arm64` au lieu de `x86_64` si le serveur est un Raspberry Pi ou équivalent.
#### Installer le binaire
```bash [Terminal]
sudo tar -xzf /tmp/lazydocker.tar.gz -C /usr/local/bin lazydocker
rm /tmp/lazydocker.tar.gz
```
`/usr/local/bin` est le dossier prévu pour les logiciels que vous installez vous-même, et c'est pour ça qu'`apt` n'y touche jamais.
#### Vérifier qu'il est bien là
```bash [Terminal]
lazydocker --version
```
#### Le lancer
```bash [Terminal]
sudo lazydocker
```
![lazydocker affichant les services, conteneurs, images, volumes et la config d'un conteneur](/img/global/linux/lazydocker.png)
Il a besoin d'accéder au socket Docker, d'où le `sudo` à moins que votre utilisateur soit dans le groupe `docker`. Les touches à connaître :
| Touche | Ce qu'elle fait |
| --- | --- |
| `1` à `6` | Aller à un panneau : projets, services, conteneurs, images, volumes, réseaux |
| Flèches | Se déplacer dans le panneau, la partie droite suit la sélection |
| :kbd{value="Enter"} | Passer sur le panneau principal à droite, :kbd{value="Esc"} revient |
| `x` | Ouvrir le menu de tout ce que vous pouvez faire avec la sélection |
| `m` | Suivre les logs |
| `s` / `r` / `p` | Arrêter, redémarrer, mettre en pause le conteneur sélectionné |
| `E` | Ouvrir un shell dans le conteneur |
| `d` | Le supprimer |
| `b` | Commandes groupées, dont le nettoyage des images et des volumes |
| `/` | Filtrer la liste |
| `+` et `_` | Agrandir ou réduire les panneaux |
| `q` | Quitter |
La casse compte : `E` ouvre un shell dans le conteneur, `e` masque ceux qui sont arrêtés.
La [liste complète](https://github.com/jesseduffield/lazydocker/blob/master/docs/keybindings/Keybindings_en.md) se trouve dans la documentation du projet.
::note
Être en dehors d'`apt` veut aussi dire qu'il ne sera pas mis à jour par `apt full-upgrade`. Refaites ces étapes quand vous voudrez une version plus récente.
::
#### Terminé !
::
## `ufw`, un pare-feu réellement lisible
Le pare-feu de Debian (`iptables`/`nftables` sous le capot) est puissant et illisible tel quel. `ufw`, *uncomplicated firewall*, est une fine couche par-dessus qui le transforme en règles courtes et compréhensibles : tout bloquer par défaut et n'ouvrir que ce que vous exposez réellement.
::steps{level="4"}
#### L'installer
```bash [Terminal]
sudo apt install ufw
```
#### Définir la politique par défaut
```bash [Terminal]
sudo ufw default deny incoming
sudo ufw default allow outgoing
```
Rien n'entre à moins qu'une règle ne l'autorise, tout ce que le serveur initie lui-même sort toujours normalement.
#### Autoriser ce dont vous avez réellement besoin
```bash [Terminal]
sudo ufw allow OpenSSH
sudo ufw allow 443/tcp
```
`OpenSSH` est un profil intégré qui correspond au port SSH, pas besoin de se souvenir duquel il s'agit. Ajoutez un `allow` par port que vous exposez, [SWAG](/serveex/core/swag) sur le `443` par exemple.
::warning
Autorisez SSH **avant** d'activer le pare-feu, à l'étape suivante. Activez-le d'abord et la connexion depuis laquelle vous tapez est coupée, sans plus aucun écran branché pour réparer.
::
#### L'activer
```bash [Terminal]
sudo ufw enable
```
#### Vérifier les règles
```bash [Terminal]
sudo ufw status verbose
```
```console [Sortie]
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
```
#### Terminé !
::
+195 -66
View File
@@ -1,74 +1,94 @@
--- ---
title: Introduction title: Introduction
description: Introduction à Serveex un projet homelab pour auto-héberger ses services du quotidien avec Debian et Docker, sans dépendre de Google, Apple ou Netflix. description: Introduction à Serveex, un projet homelab pour auto-héberger ses services du quotidien avec Debian et Docker, sans dépendre de Google, Apple ou Netflix.
navigation: navigation:
icon: i-lucide-bookmark icon: i-lucide-bookmark
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
## Un home lab par un débutant pour les débutants ## Un homelab de débutant, pour les débutants
![](/img/serveex/serveex-server.svg) ![](/img/serveex/serveex-server.svg)
**Serveex** c'est avant tout un projet personnel visant à héberger chez soi le plus de services possibles du quotidien sans passer par des plateformes propriétaires (Google, Apple, Netflix...). L'idée était d'expérimenter, d'apprendre, et de documenter chaque étape. C'est un projet purement pour la science, et n'a pas vocation à être utilisé en production. **Serveex** est avant tout un projet personnel visant à héberger chez soi le plus de services du quotidien possible, sans dépendre de plateformes propriétaires (Google, Apple, Netflix, etc.). L'objectif était d'expérimenter, d'apprendre, et de documenter chaque étape du chemin. C'est un projet purement scientifique, pas destiné à un usage en production.
Un grand merci à **Nipah**, pour le partage de ses connaissances infinies, et surtout pour sa patience. Un grand merci à **Nipah** pour avoir partagé son savoir infini et, surtout, pour sa patience.
::note ::note{icon=""}
**Pré-requis :** 📋 **Prérequis :**
- Disposer d'[un VPS en ligne](https://www.it-connect.fr/les-serveurs-prives-virtuels-vps-pour-les-debutants/) ou d'une machine locale : idéalement un mini PC (on trouve des modèles N100 autour de 100 €), mais ça marche aussi sur un portable ou [une machine virtuelle](https://openclassrooms.com/fr/courses/2035806-virtualisez-votre-architecture-et-vos-environnements-de-travail/6313946-installez-virtualbox). Les [Freebox Delta/Ultra proposent des machines virtuelles](https://next.ink/3493/machines-virtuelles-et-freebox-delta-comment-heberger-votre-premiere-page-web/).
- Posséder [un VPS en ligne](https://www.it-connect.fr/les-serveurs-prives-virtuels-vps-pour-les-debutants/) ou une machine locale : idéalement un mini PC (on trouve des N100 pour 100€), mais fonctionne aussi sur laptop ou [une machine virtuelle](https://openclassrooms.com/fr/courses/2035806-virtualisez-votre-architecture-et-vos-environnements-de-travail/6313946-installez-virtualbox). Les [Freebox Delta/Ultra proposent des machines virtuelles](https://next.ink/3493/machines-virtuelles-et-freebox-delta-comment-heberger-votre-premiere-page-web/). - Savoir configurer [les règles NAT d'une box et attribuer des baux DHCP](/general/networking/nat)
- Savoir configurer les [règles NAT d'un routeur et attribuer des baux DHCP](/fr/general/networking/nat) - Savoir configurer la [zone DNS d'un nom de domaine](/general/networking/dns)
- Savoir configurer la [zone DNS d'un nom de domaine](/fr/general/networking/dns)
:: ::
<div align="center"> <div align="center">
<img src="/img/serveex/serveex.svg" align="center" width="700"> <img src="/img/serveex/serveex.svg" align="center" width="700">
</div> </div>
L'objectif étant d'être facilement déployable et facile à migrer, voici sa structure : L'objectif est d'être facilement déployable et facile à migrer, voici donc sa structure :
### Le coeur du serveur ### Le cœur du serveur
:::div{class="relative"} :::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px} :ellipsis{left=0px width=40rem top=10rem blur=140px}
::: :::
::card-group ::card-group
::card{icon="i-logos-debian" title="Système d'exploitation"} ::card{icon="i-logos-debian" title="Système d'exploitation" to="/serveex/core/installation"}
[Installer et configurer Debian 13](/fr/serveex/core/installation) Installer et configurer Debian 13
:: ::
::card{icon="i-logos-docker-icon" title="Moteur de conteneur"} ::card{icon="i-logos-docker-icon" title="Conteneuriser ses applications" to="/serveex/core/docker"}
[Installer Docker](/fr/serveex/core/docker) Installer Docker
:: ::
::card{icon="i-carbon-container-registry" title="Docker GUI"} ::card
[Installer et déployer Dockge](/fr/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs) ---
icon: i-carbon-container-registry
title: Gestionnaire de conteneurs
to: "/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs"
ui:
icon: text-[#74C2FF]
---
Installer et déployer Dockge
:: ::
::card{icon="i-noto-globe-showing-americas" title="Reverse Proxy"} ::card
[Exposez vos services avec SWAG](/fr/serveex/core/swag) ---
icon: i-simple-icons-wireguard
title: VPN
to: /serveex/core/wireguard
ui:
icon: text-[#88171A]
---
Installer et déployer Wireguard
::
::card{icon="i-noto-globe-showing-americas" title="Reverse Proxy" to="/serveex/core/swag"}
Exposer vos services avec SWAG
:: ::
:: ::
### La sécurité ### Sécurité
:::div{class="relative"} :::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px} :ellipsis{left=0px width=40rem top=10rem blur=140px}
::: :::
::card-group ::card-group
::card{icon="i-simple-icons-wireguard" title="VPN"}
[Installer et déployer Wireguard](/fr/serveex/security/wireguard)
::card{icon="i-noto-locked-with-key" title="Forward Auth" to="/serveex/security/tinyauth"}
Installer et déployer TinyAuth
:: ::
::card{icon="i-noto-key" title="SSO & MFA"} ::card{icon="i-noto-identification-card" title="SSO sans mot de passe" to="/serveex/security/pocket-id"}
[Installer et déployer Authentik](/fr/serveex/security/authentik) Installer et déployer Pocket ID
:: ::
::card{icon="i-logos-cloudflare-icon" title="Zero Trust"} ::card{icon="i-logos-cloudflare-icon" title="Zero Trust" to="/serveex/security/cloudflare"}
[Installer et déployer Cloudflared](/fr/serveex/security/cloudflare) Installer et déployer Cloudflared
:: ::
:: ::
@@ -79,56 +99,123 @@ L'objectif étant d'être facilement déployable et facile à migrer, voici sa s
::: :::
::card-group ::card-group
::card{icon="i-solar-pulse-linear" title="Etat des services"} ::card
[Installer et déployer Uptime-Kuma](/fr/serveex/monitoring/uptime-kuma) ---
icon: i-solar-pulse-linear
title: État des services
to: /serveex/monitoring/uptime-kuma
ui:
icon: text-[#5CDD8B]
---
Installer et déployer Uptime-Kuma
:: ::
::card{icon="i-lucide-logs" title="Gestion des logs"} ::card
[Installer et déployer Dozzle](/fr/serveex/monitoring/dozzle) ---
icon: i-lucide-logs
title: Gestion des logs
to: /serveex/monitoring/dozzle
ui:
icon: text-[#FFA600]
---
Installer et déployer Dozzle
:: ::
::card{icon="i-noto-rabbit" title="Gestion de la connexion"} ::card{icon="i-noto-rabbit" title="Suivi de la connexion" to="/serveex/monitoring/speedtest-tracker"}
[Installer et déployer Speedtest Tracker](/fr/serveex/monitoring/speedtest-tracker) Installer et déployer Speedtest Tracker
:: ::
::card{icon="i-lucide-chart-column-decreasing" title="Etat des ressources"} ::card
[Installer et déployer Beszel](/fr/serveex/monitoring/beszel) ---
icon: i-lucide-chart-column-decreasing
title: État des ressources
to: /serveex/monitoring/beszel
ui:
icon: text-[#747bff]
---
Installer et déployer Beszel
:: ::
::card{icon="i-lucide-circle-power" title="Wake on Lan"} ::card
[Installer et déployer UpSnap](/fr/serveex/monitoring/upsnap) ---
icon: i-lucide-circle-power
title: Wake on Lan
to: /serveex/monitoring/upsnap
ui:
icon: text-[#5BDAFD]
---
Installer et déployer UpSnap
:: ::
:: ::
### Media ### Média
:::div{class="relative"} :::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px} :ellipsis{left=0px width=40rem top=10rem blur=140px}
::: :::
::card-group ::card-group
::card{icon="i-cbi-plex-alt" title="Media"} ::card
[Installer et déployer Plex](/fr/serveex/media/plex) ---
icon: i-simple-icons-jellyfin
title: Média
to: /serveex/media/jellyfin
ui:
icon: text-[#00A4DC]
---
Installer et déployer Jellyfin
:: ::
::card{icon="i-cbi-qbittorrent" title="Seedbox"} ::card
[Installer et déployer Qbittorrent](/fr/serveex/media/qbittorrent) ---
icon: i-cbi-qbittorrent
title: Seedbox
to: /serveex/media/qbittorrent
ui:
icon: text-[#2F67BA]
---
Installer et déployer Qbittorrent
::
::card
---
icon: i-cbi-radarr
title: Automatisation
to: /serveex/media/servarr
ui:
icon: text-[#FFCB3D]
---
Installer et déployer la stack Servarr
:: ::
:: ::
### Cloud Drive & Photos ### Cloud & Photos
:::div{class="relative"} :::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px} :ellipsis{left=0px width=40rem top=10rem blur=140px}
::: :::
::card-group ::card-group
::card{icon="i-cib-nextcloud" title="Drive"} ::card
[Installer et déployer Nextcloud](/fr/serveex/cloud/nextcloud) ---
icon: i-cib-nextcloud
title: Drive
to: /serveex/cloud/nextcloud
ui:
icon: text-[#0082C9]
---
Installer et déployer Nextcloud
:: ::
::card{icon="i-simple-icons-immich" title="Photos"} ::card
[Installer et déployer Immich](/fr/serveex/cloud/immich) ---
icon: i-simple-icons-immich
title: Photos
to: /serveex/cloud/immich
ui:
icon: text-[#4250AF]
---
Installer et déployer Immich
:: ::
:: ::
@@ -139,12 +226,19 @@ L'objectif étant d'être facilement déployable et facile à migrer, voici sa s
::: :::
::card-group ::card-group
::card{icon="i-noto-open-file-folder" title="Explorateur de fichier"} ::card{icon="i-noto-open-file-folder" title="Explorateur de fichiers" to="/serveex/files/file-browser-quantum"}
[Installer et déployer file-browser](/fr/serveex/files/file-browser) Installer et déployer File Browser Quantum
:: ::
::card{icon="i-carbon-share" title="Partage"} ::card
[Installer et déployer Pingvin](/fr/serveex/files/pingvin) ---
icon: i-carbon-share
title: Partage
to: /serveex/files/pingvin
ui:
icon: text-[#46509E]
---
Installer et déployer Pingvin
:: ::
:: ::
@@ -155,16 +249,23 @@ L'objectif étant d'être facilement déployable et facile à migrer, voici sa s
::: :::
::card-group ::card-group
::card{icon="i-logos-visual-studio-code" title="Visual Studio Code"} ::card{icon="i-logos-visual-studio-code" title="Visual Studio Code" to="/serveex/development/code-server"}
[Installer et déployer code-server](/fr/serveex/development/code-server) Installer et déployer code-server
:: ::
::card{icon="i-simple-icons-gitea" title="Git Repository"} ::card
[Installer et déployer Gitea](/fr/serveex/development/gitea) ---
icon: i-simple-icons-forgejo
title: Dépôt Git
to: /serveex/development/forgejo
ui:
icon: text-[#FB923C]
---
Installer et déployer Forgejo
:: ::
::card{icon="i-noto-hammer-and-wrench" title="Outils"} ::card{icon="i-noto-hammer-and-wrench" title="Outils" to="/serveex/development/it-tools"}
[Installer et déployer IT Tools](/fr/serveex/development/it-tools) Installer et déployer IT Tools
:: ::
:: ::
@@ -175,18 +276,46 @@ L'objectif étant d'être facilement déployable et facile à migrer, voici sa s
::: :::
::card-group ::card-group
::card{icon="i-cbi-adguard" title="DNS anti-pub et filtres"} ::card
[Installer et déployer Adguard Home](/fr/serveex/apps/adguard) ---
icon: i-cbi-adguard
title: DNS et filtres anti-pub
to: /serveex/apps/adguard
ui:
icon: text-[#68BC71]
---
Installer et déployer Adguard Home
:: ::
::card{icon="i-cbi-bitwarden" title="Gestionnaire de mots de passe"} ::card
[Installer et déployer Vaultwarden](/fr/serveex/apps/vaultwarden) ---
icon: i-cbi-bitwarden
title: Gestionnaire de mots de passe
to: /serveex/apps/vaultwarden
ui:
icon: text-[#175DDC]
---
Installer et déployer Vaultwarden
:: ::
:: ::
## A venir ### Avancé
- Homepage, pour avoir tout vos services en un coup d'oeil et y accéder facilement :::div{class="relative"}
- Mkdocs pour votre documentation :ellipsis{left=0px width=40rem top=10rem blur=140px}
- Docus, alternative à Mkdocs :::
- UpSnap pour réveiller vos machines à distance
::card-group
::card{icon="i-noto-key" title="SSO & MFA" to="/serveex/advanced/authentik"}
Installer et déployer Authentik
::
::card{icon="i-noto-crystal-ball" title="Gestionnaire Docker multi-hôtes" to="/serveex/advanced/arcane"}
Installer et déployer Arcane
::
::
## Bientôt
- Homepage, pour avoir tous vos services d'un coup d'œil et y accéder facilement
- Zensical, comment écrire et organiser votre propre documentation
+321 -47
View File
@@ -1,72 +1,346 @@
--- ---
title: Debian 13 title: Debian 13
description: Guide pas à pas pour installer Debian 13 sur un serveur et configurer l'accès SSH, les paquets essentiels et un système de base prêt à l'emploi. description: Guide pas à pas pour installer Debian 13 sur un serveur maison et configurer l'accès SSH, les paquets essentiels et un système de base prêt à l'emploi.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Debian 13
::note [Debian 13 « Trixie »](https://www.debian.org/) est la base sur laquelle repose tout ce guide. C'est un Linux simple, ennuyeux et stable, et pour un homelab c'est précisément l'intérêt : les versions des paquets restent figées pendant toute la durée de vie de la version, les correctifs de sécurité continuent d'arriver pendant environ cinq ans en comptant la LTS, si bien que la machine tourne des années au lieu de demander une reconstruction tous les quelques mois.
🎯 __Objectif :__ Installer Debian 13 et les dépendances principales pour avoir un OS pret à l'emploi, joignable en SSH.
:: L'autre raison, c'est qu'il ne vous gêne pas. Les systèmes clés en main comme Unraid, TrueNAS ou le DSM de Synology posent leur propre couche par-dessus Docker, et le jour où vous avez besoin de quelque chose que leur interface n'expose pas, vous êtes coincé à bricoler autour. Debian n'est qu'un serveur : vous installez ce que vous voulez, où vous voulez, et rien n'est caché derrière l'interface de quelqu'un d'autre. Ça se trouve être aussi ce que la plupart des projets auto-hébergés visent en premier, leurs docs vous donnent donc des commandes `apt` qui fonctionnent telles quelles, Docker publie un dépôt Debian officiel, et n'importe quel message d'erreur collé dans un moteur de recherche a déjà des années de réponses derrière lui. Une installation minimale est assez légère pour laisser presque toute la RAM et le CPU d'un petit N100 à vos conteneurs.
![picture](/img/serveex/server.svg) ![picture](/img/serveex/server.svg)
## Installation ## Installation
1. [Paramètrage BIOS](https://www.debian.org/releases/stable/amd64/ch03s06.fr.html#bios-setup) ::note{icon="" to="/general/linux/cli-basics"}
2. [Téléchargement de l'image Debian 13](https://www.debian.org/download.fr.html) 📋 __Prérequis :__ tout ce qui suit se passe dans un terminal, vous devriez donc être à l'aise avec les bases : se déplacer avec `cd`, lister avec `ls`, modifier un fichier avec `nano`, et lire ce qu'une commande vous dit quand elle échoue. Si tout ça est nouveau pour vous, commencez par les **bases de la ligne de commande** et revenez ensuite.
3. [USB bootable (Rufus)](https://dev.to/devops2808/how-to-create-bootable-usb-installer-for-debian-12-4f66) ::
4. [Installer Debian et configurer SSH](https://www.howtoforge.com/tutorial/debian-minimal-server/)
5. Installer sudo et ajouter un utilisateur au groupe sudo, pour les privilèges administrateurs ### Réglages du BIOS
Se connecter en root :
Appuyez sur :kbd{value="Del"} ou :kbd{value="F2"} juste après l'allumage pour ouvrir le setup du firmware (l'écran de démarrage indique généralement quelle touche c'est). La plupart des machines ont aussi un menu de démarrage ponctuel, souvent :kbd{value="F12"}, :kbd{value="F11"} ou :kbd{value="F8"}, qui permet de démarrer sur la clé USB une seule fois sans toucher à l'ordre de démarrage permanent. Debian documente la procédure générale dans son [manuel d'installation](https://www.debian.org/releases/forky/amd64/ch03s06.fr.html), et voici ce qui compte avant d'installer :
- **Mode de démarrage.** Préférez l'UEFI natif. L'important est que l'installateur démarre dans le *même* mode que celui dans lequel vous comptez faire tourner le serveur, parce que l'UEFI utilise un partitionnement GPT alors que le BIOS legacy (et l'UEFI en mode CSM) utilise une table de partitions DOS, et une incohérence installe le chargeur de démarrage au mauvais endroit. Attention sur les machines multiboot : le mode de démarrage par défaut des périphériques amovibles n'est souvent pas celui utilisé pour les disques internes.
- **Le Secure Boot** peut rester activé. Debian fournit un chargeur shim signé par Microsoft, il démarre donc très bien tel quel.
- **Le mode SATA** doit être `AHCI`, pas `RAID` / Intel RST, sinon Linux risque de ne pas voir vos disques du tout. Changer ce réglage après avoir installé un autre OS sur le même disque empêchera cet OS de démarrer, réglez-le donc avant de commencer.
- **La restauration après coupure de courant**, pour que le serveur revienne tout seul après une coupure au lieu d'attendre que quelqu'un appuie sur le bouton. Le réglage se trouve dans *Power Management*, *APM Configuration* ou *Advanced* selon la carte, sous un nom du genre *Restore on AC Power Loss*, *AC Power Recovery*, *After Power Failure*, *AC Back Function* ou *S0 state*. Mettez-le sur **Power On**, pas sur *Last State*, qui laisserait la machine éteinte si la coupure l'a surprise pendant un arrêt.
- **Le Wake on LAN**, si vous voulez pouvoir allumer la machine à distance plutôt que d'aller la voir. Même menu *Power Management* : mettez *Wake on LAN*, *Power On By PCI-E/PCI* ou *Resume by PCI-E Device* sur **Enabled**, puis désactivez *ErP* / *EuP Ready* et *Deep Sleep* / *Deep Sx*, qui coupent l'alimentation de la carte réseau une fois la machine éteinte et la rendraient sourde au magic packet. Debian doit aussi dire à la carte d'écouter, voir [Pour aller plus loin](#pour-aller-plus-loin).
- **La virtualisation** (`VT-x` / `AMD-V`, plus `VT-d` pour le passthrough) ne coûte rien à activer maintenant et évite un aller-retour dans le BIOS le jour où vous voudrez faire tourner une VM. Docker lui-même n'en a pas besoin sous Linux.
::note
Si vous êtes en dual boot avec Windows, désactivez son *démarrage rapide* : il laisse le système de fichiers dans un état que Linux peut corrompre, et Windows Update aime bien le réactiver en douce.
::
### Télécharger l'ISO et l'écrire sur une clé USB
::steps{level="4"}
#### Télécharger l'image netinst
Récupérez l'image **netinst** `amd64` sur [debian.org](https://www.debian.org/download.fr.html). Elle fait environ 700 Mo et récupère le reste des paquets sur le réseau pendant l'installation, ce qui est exactement ce qu'on veut sur un serveur branché en ethernet : vous obtenez des paquets à jour au lieu d'installer depuis un instantané vieux de plusieurs mois puis de tout mettre à jour derrière. Les images DVD complètes n'ont de sens que si la machine n'a pas de réseau pendant l'installation.
#### L'écrire avec Rufus
Sous Windows, écrivez-la avec [Rufus](https://rufus.ie/) (portable, aucune installation nécessaire). Branchez une clé USB de 2 Go ou plus, en gardant en tête qu'**elle sera entièrement effacée**, puis :
- **Périphérique** : votre clé USB. Vérifiez la capacité deux fois, Rufus écrit volontiers sur le mauvais disque si vous le laissez faire.
- **Type de démarrage** : `SÉLECTION`, puis choisissez l'ISO Debian que vous venez de télécharger.
- **Schéma de partition** : il doit correspondre au mode de démarrage réglé dans le BIOS plus haut. `GPT` pour l'UEFI, `MBR` uniquement si vous restez en legacy/CSM. Le champ système de destination suit automatiquement.
- Laissez les options de formatage par défaut, puis cliquez sur `DÉMARRER`. Si Rufus demande comment écrire l'image, gardez le *mode image ISO* recommandé.
![Rufus configuré pour écrire l'ISO Debian](/img/serveex/install/rufus.png)
_Capture issue de [ce guide de clé USB bootable sur DEV Community](https://dev.to/devops2808/how-to-create-bootable-usb-installer-for-debian-12-4f66)._
L'écriture prend quelques minutes.
#### Terminé !
::
### Installer Debian
Démarrez sur la clé USB (menu de démarrage ponctuel vu dans la section BIOS) et choisissez **Install**, l'installateur en mode texte. L'objectif ici est un serveur minimal et headless : pas de bureau, pas de session graphique, rien d'autre qu'un shell joignable en SSH. L'écran et le clavier que vous utilisez en ce moment ne servent que pour cette installation, après quoi la machine tourne à l'aveugle dans un coin. Le [guide d'installation officiel](https://www.debian.org/releases/trixie/amd64/ch06s03.fr.html) documente chaque écran.
![Menu de démarrage de l'installateur Debian, Install sélectionné](/img/serveex/install/debian-install-boot.png)
::steps{level="4"}
#### Langue, pays, clavier
Rien de particulier. La disposition du clavier est celle sur laquelle vous tapez physiquement, ce qui est facile à rater si vous avez choisi l'anglais mais tapez en AZERTY.
#### Réseau et nom de machine
Une connexion filaire se configure toute seule en DHCP. Quand il demande un **nom de machine**, donnez-lui un vrai nom (`serveex`, `nas`...), vous le verrez dans chaque invite SSH ensuite. Le **domaine** peut rester vide, ou être réglé sur quelque chose comme `lan` si vous en utilisez déjà un à la maison.
![Écran du nom de machine de l'installateur Debian](/img/serveex/install/debian-install-hostname.png)
#### Mot de passe root et compte utilisateur
Laissez le **mot de passe root vide**. Debian désactive alors le compte root, installe `sudo` et y place votre utilisateur, ce qui est le comportement le plus sûr et vous épargne une étape de configuration plus tard.
Créez ensuite votre utilisateur : nom complet, identifiant, mot de passe. C'est le compte avec lequel vous vous connecterez en SSH. Évitez `admin` comme identifiant, il est réservé sur Debian et l'installateur le refusera.
#### Horloge
Confirmez le fuseau horaire deviné à partir de votre pays.
#### Partitionnement
*Assisté, utiliser un disque entier* sur le disque système, puis *Tout dans une seule partition*, ce qui vous donne un gros `/` plus une partition de swap. Des partitions `/home` ou `/var` séparées n'apportent pas grand-chose ici et garantissent surtout que l'une se remplit pendant que les autres restent à moitié vides. Ne prenez LVM que si vous savez déjà que vous voulez des snapshots ou agrandir des volumes plus tard. Vos disques de données ne sont pas touchés à ce stade, vous les monterez ensuite.
Terminez avec *Terminer le partitionnement et appliquer les changements*, puis confirmez avec *Oui* : c'est le point de non-retour pour ce disque.
![Schéma de partitionnement de l'installateur Debian, tout dans une seule partition](/img/serveex/install/debian-install-partition.png)
::tip{icon="" to="/general/linux/filesystem"}
__Astuce :__ ce qui vit réellement sur cette unique partition, et pourquoi `/srv/docker` est l'endroit où ce guide place chaque stack, est traité dans **dossiers et partitions**.
::
#### Miroir et sondages
Répondez *Non* à *Faut-il analyser un autre média d'installation ?*, tout le reste vient du réseau. Pour le miroir, prenez-en un dans votre pays, ou `deb.debian.org` qui route automatiquement vers un miroir proche, et laissez le champ du proxy HTTP vide sauf si vous en avez réellement un. Le concours de popularité (statistiques anonymes sur les paquets) est oui ou non, sans conséquence.
#### Sélection des logiciels (tasksel)
L'écran qui décide vraiment si votre serveur reste minimal. Décochez **tout**, en particulier `Environnement de bureau Debian` et `GNOME`, cochés par défaut, qui embarqueraient des gigaoctets de paquets plus une session graphique que vous n'afficherez jamais. Gardez exactement deux cases : **`serveur SSH`**, votre seule porte d'entrée à partir de maintenant, et **`utilitaires usuels du système`**, que la suite de ce guide suppose installés.
::warning
Les cases se cochent et se décochent avec :kbd{value="Space"}, jamais :kbd{value="Enter"}. :kbd{value="Enter"} valide tout l'écran et passe à la suite, appuyer dessus sur la ligne du bureau installe donc GNOME au lieu de le retirer, et vous vous retrouvez avec un serveur graphique à dépouiller à la main. Utilisez :kbd{value="Tab"} pour atteindre `Continuer` une fois que les deux cases ci-dessus sont les seules cochées.
::
![Sélection des logiciels de l'installateur Debian avec seulement serveur SSH et utilitaires usuels cochés](/img/serveex/install/debian-install-tasksel.png)
#### GRUB
Installez-le sur le disque que vous venez de partitionner (`/dev/sda`, `/dev/nvme0n1`...), pas sur une partition.
![L'installateur Debian demandant sur quel périphérique installer le chargeur GRUB](/img/serveex/install/debian-install-grub.png)
#### Terminé !
::
::note
Avant de redémarrer, prenez une minute pour donner au serveur une **adresse fixe** dans votre box. Tout ce qui suit pointe dessus : vos raccourcis SSH, le reverse proxy, les favoris vers chaque service. Sur un simple bail DHCP cette adresse finit par changer toute seule et tout casse d'un coup.
La bonne méthode est une réservation DHCP, qui lie l'adresse à l'adresse MAC du serveur tout en laissant la box gérer l'adressage. Voir [NAT & DHCP](/general/networking/nat) pour savoir où la trouver dans l'interface de votre box.
::
_Captures de l'installateur issues du [guide de serveur Debian minimal de howtoforge.com](https://www.howtoforge.com/tutorial/debian-minimal-server/)._
### Se connecter en SSH
Le serveur n'a plus d'écran à partir de maintenant, tout passe par SSH. Ces étapes vous font entrer, puis s'assurent que personne d'autre ne le peut.
::steps{level="4"}
#### Se connecter depuis une autre machine
Retirez la clé USB et redémarrez. L'adresse à utiliser est celle que vous avez réservée dans la box juste avant, `192.168.1.42` dans les exemples ci-dessous.
Tout ce qui suit se passe depuis une autre machine de votre réseau local, pas sur le serveur. Windows et macOS embarquent tous les deux un client SSH, il n'y a donc rien à installer : ouvrez **PowerShell** sous Windows, ou **Terminal** sous macOS, et tapez la même commande.
```bash [Terminal] ```bash [Terminal]
su - ssh [email protected]
```
mettre son mot de passe puis taper :
```bash [Terminal]
apt install sudo
```
Ajouter l'utilisateur au groupe sudo :
```bash [Terminal]
adduser <nomdutilisateur> sudo
``` ```
La prochaine fois que l'utilisateur se connectera, il pourra utiliser la commande `sudo` et ainsi executer des commandes avec les privilèges administrateurs. La première connexion vous demande de confirmer l'empreinte du serveur, c'est normal, répondez `yes`. Elle est stockée dans `~/.ssh/known_hosts` et la question ne reviendra pas.
6. [Tout savoir sur la connexion à distance à la console (SSH)](https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys) ::note
7. Optionnel - [UPS client en cas de coupure](https://www.sindastra.de/p/2078/how-to-connect-linux-server-to-synology-ups-server) / [et aussi](https://www.reddit.com/r/synology/comments/gtkjam/use_synology_nas_as_ups_server_to_safely_power/) Si la connexion est refusée, la case `serveur SSH` a probablement été laissée décochée à l'écran tasksel. Rebranchez un écran, connectez-vous en local et lancez `sudo apt install openssh-server`.
8. Optionnel - Réveil en cas de coupure de courant -> régler le BIOS S0 state ::
9. Optionnel - [Réveiller le serveur à distance (WoW - WoL)](https://dev.to/zakery1369/enable-wake-on-lan-on-debian-4ljd)
L'écran et le clavier ne servent plus à rien. Débranchez-les, la machine peut aller vivre dans son coin.
#### Se connecter par clé plutôt que par mot de passe
Les mots de passe en SSH se font attaquer par force brute dès que le port est joignable depuis l'extérieur, et en taper un à chaque connexion devient vite pénible. Toujours sur l'autre machine, générez une clé si vous n'en avez pas déjà une :
```bash [Terminal]
ssh-keygen -t ed25519
```
Appuyez sur :kbd{value="Enter"} pour accepter le chemin par défaut, et mettez une passphrase (elle protège le fichier de clé lui-même, votre système la retiendra après le premier déverrouillage). Copiez ensuite la moitié publique sur le serveur. Windows n'a pas de `ssh-copy-id`, il pousse donc la clé à travers la connexion :
::code-group
```bash [macOS]
ssh-copy-id [email protected]
```
```bash [Windows]
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
```
```bash [Linux]
ssh-copy-id [email protected]
```
::
Il demande votre mot de passe une dernière fois. Reconnectez-vous pour vérifier qu'il ne le demande plus :
```bash [Terminal]
ssh [email protected]
```
#### Refermer la porte derrière vous
Une fois la clé fonctionnelle, coupez les connexions par mot de passe et l'accès root direct. Sur le serveur :
```bash [Terminal]
sudo nano /etc/ssh/sshd_config.d/hardening.conf
```
```properties [hardening.conf]
PasswordAuthentication no
PermitRootLogin no
KbdInteractiveAuthentication no
```
Un fichier dans `sshd_config.d/` est lu par-dessus la configuration principale, vos changements survivent donc à une mise à jour de paquet qui réécrirait `/etc/ssh/sshd_config`. Appliquez :
```bash [Terminal]
sudo systemctl restart ssh
```
::warning
Gardez votre session SSH actuelle ouverte pendant le test. Ouvrez un **second** terminal et reconnectez-vous : si la clé ne fonctionne plus, la session restée ouverte est votre porte de secours pour corriger la configuration. Fermez-la avant d'avoir vérifié et une faute de frappe vous enferme dehors de votre propre serveur, avec l'écran et le clavier comme seul recours.
::
::note
La porte est maintenant fermée pour toutes les autres machines aussi, y compris la prochaine depuis laquelle vous voudrez vous connecter. Pour en laisser entrer une nouvelle, remettez `PasswordAuthentication yes` dans `hardening.conf`, redémarrez SSH, refaites les deux étapes de clé ci-dessus depuis cette machine, puis remettez `no` et redémarrez SSH une dernière fois.
::
#### Terminé !
::
### Réveiller le serveur à distance
Une machine qui tourne 24h/24 pour deux heures d'utilisation réelle consomme, fait tourner des ventilateurs et use des disques pour rien. Le Wake on LAN permet de l'éteindre proprement quand vous avez fini et de la rallumer en quelques secondes sans vous déplacer : la carte réseau reste alimentée en veille, à l'écoute d'un broadcast bien précis (le *magic packet*) contenant l'adresse MAC du serveur, et allume la machine dès qu'elle le voit. Pratique pour une cible de sauvegarde dont vous n'avez besoin que la nuit, ou un serveur multimédia que personne ne regarde dans la journée.
Deux conditions avant de commencer : la machine doit être en ethernet filaire, les cartes WiFi ne gèrent presque jamais ça, et le paquet doit être envoyé depuis le même réseau local, puisqu'un broadcast ne traverse pas un routeur. La partie BIOS a été traitée dans [Réglages du BIOS](#réglages-du-bios), voici la partie Debian.
::steps{level="4"}
#### Trouver l'interface et son adresse MAC
```bash [Terminal]
ip -br link
```
Vous obtenez quelque chose comme `enp1s0 UP aa:bb:cc:dd:ee:ff`. Gardez les deux : le nom de l'interface pour les commandes ci-dessous, l'adresse MAC pour la machine qui enverra le paquet.
#### Vérifier que la carte le gère
```bash [Terminal]
sudo apt install ethtool
sudo ethtool enp1s0 | grep -i wake
```
La réponse ressemble à `Supports Wake-on: pumbg` puis `Wake-on: d`. La lettre qui compte est **g**, pour magic packet. Si la ligne *Supports* ne la contient pas, la carte ne sait pas le faire et il n'y a rien à configurer. `Wake-on: d` signifie simplement désactivé, ce que l'étape suivante corrige.
#### L'activer
```bash [Terminal]
sudo ethtool -s enp1s0 wol g
```
Relancez la vérification, `Wake-on` devrait maintenant être à `g`. Ce réglage est réinitialisé à chaque démarrage, il faut donc le réappliquer automatiquement.
#### Le faire survivre aux redémarrages
```bash [Terminal]
sudo nano /etc/systemd/system/wol.service
```
```ini [wol.service]
[Unit]
Description=Enable Wake on LAN
[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -s enp1s0 wol g
[Install]
WantedBy=basic.target
```
```bash [Terminal]
sudo systemctl daemon-reload
sudo systemctl enable --now wol.service
```
#### Le réveiller
Éteignez le serveur avec `sudo poweroff`, puis envoyez le magic packet depuis une autre machine du réseau. Sur macOS et Linux, le paquet `wakeonlan` le fait en une commande :
```bash [Terminal]
wakeonlan aa:bb:cc:dd:ee:ff
```
Windows n'a pas d'émetteur intégré, la solution la plus simple là-bas est une application mobile : n'importe laquelle des applications *Wake on LAN* gratuites prend l'adresse MAC et fonctionne de la même façon. Le serveur devrait démarrer en quelques secondes.
#### Terminé !
::
::note
Le réveiller depuis l'extérieur est une autre histoire, et passer par un VPN n'aide pas si ce VPN tourne sur le serveur lui-même : le tunnel est coupé tant que la machine est éteinte. La solution est de rediriger un port UDP sur la box (7 ou 9, les ports Wake on LAN habituels) vers le serveur, puis d'envoyer le paquet sur votre adresse publique depuis une application qui sait le faire, [WolOn](https://wolon.app/) par exemple. La [règle NAT](/general/networking/nat) est toute simple, `UDP 9` depuis l'extérieur vers `192.168.1.42:9` à l'intérieur. La box doit encore savoir associer cette IP à la bonne adresse MAC pendant que la machine est éteinte, et c'est pour ça que certaines exposent une entrée ARP statique, ou un bouton Wake on LAN à elles qui vous épargne complètement la redirection de port. Vérifiez d'abord votre box.
::
### Garder le système à jour
Debian ne se met pas à jour tout seul. Tous les mois environ, ou quand vous y pensez, quatre commandes en SSH :
::steps{level="4"}
#### Rafraîchir la liste des paquets
## CLI apps à avoir près de soi
Quelques app que vous utiliserez forcément à un moment donné, autant les installer dès le départ
```bash [Terminal] ```bash [Terminal]
sudo apt update sudo apt update
sudo apt upgrade
sudo apt install nano btop ranger git duf neofetch samba cifs-utils tree unzip
``` ```
En plus : Rien n'est installé à ce stade, `apt` demande seulement aux miroirs ce qui est disponible et vous dit combien de paquets sont en retard.
- [gping](https://www.linode.com/docs/guides/how-to-use-gping-on-linux/) - Outil graphique de ping #### Appliquer les mises à jour
- [lazydocker](https://github.com/jesseduffield/lazydocker) - Gestion de conteneurs docker en CLI
## Fonctions utiles
### Pare-feu
- [ufw](https://www.zenarmor.com/docs/network-security-tutorials/how-to-set-up-a-firewall-with-ufw-on-debian)
- [Firewalld](https://linuxcapable.com/how-to-install-firewalld-on-debian-linux/)
### Partage Samba (accès à un disque réseau distant)
- [Créer et accéder à un partage Samba](/fr/general/networking/samba)
### Transfert de fichier via rsync
```bash [Terminal] ```bash [Terminal]
sudo rsync -avhHSP /source /destination sudo apt full-upgrade
``` ```
::note
Ajoutez ` --exclude @eaDir`{lang=shell} si la source est un NAS Synology `full-upgrade` est préféré au simple `upgrade` parce qu'il accepte de retirer un paquet quand c'est le prix à payer pour en faire avancer un autre, ce qui arrive sur un serveur qui vit des années. Lisez le résumé avant de répondre oui, il liste exactement ce qui est supprimé.
#### Nettoyer derrière elles
```bash [Terminal]
sudo apt autoremove --purge
```
Chaque mise à jour de noyau laisse le précédent installé, et `/boot` est une petite partition qui finit par se remplir et casser la mise à jour suivante. Faites-le à chaque fois, pas de temps en temps. `--purge` supprime aussi les fichiers de configuration des paquets retirés.
#### Redémarrer si le noyau a bougé
```bash [Terminal]
sudo reboot
```
Une mise à jour du noyau ou de la libc ne prend effet qu'après un redémarrage. Tout le reste s'applique immédiatement, ce n'est donc nécessaire que quand la mise à jour a touché l'un des deux, et ça vaut la peine de le planifier à un moment où rien ne dépend de la machine.
#### Terminé !
::
::tip
Si vous n'avez pas besoin de surveiller ce qui se passe, les trois premières étapes tiennent sur une ligne, `&&` interrompant la chaîne dès que l'une d'elles échoue :
```bash [Terminal]
sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove --purge -y
```
`-y` répond oui à toutes les questions, y compris le jour où une mise à jour propose de retirer quelque chose que vous auriez préféré garder, réservez-le donc aux tournées de routine. Ajoutez `&& sudo reboot` pour évacuer aussi le redémarrage.
::
Pour les correctifs de sécurité sans avoir à y penser, `sudo apt install unattended-upgrades` puis `sudo dpkg-reconfigure -plow unattended-upgrades` les applique tout seul chaque nuit. À noter que tout ceci ne couvre que le système : vos conteneurs se mettent à jour séparément, depuis Dockge.
### Pour aller plus loin
- [Tout savoir sur l'accès à distance à la console (SSH)](https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys)
- Optionnel - [Client UPS en cas de coupure de courant](https://www.sindastra.de/p/2078/how-to-connect-linux-server-to-synology-ups-server) / [et aussi ici](https://www.reddit.com/r/synology/comments/gtkjam/use_synology_nas_as_ups_server_to_safely_power/)
::tip{icon="" to="/general/linux/handy-tools"}
✨ __Astuce :__ une poignée d'outils en ligne de commande à ajouter par-dessus une installation minimale, `btop`, `duf`, `ufw` et quelques autres, sont traités dans **outils CLI pratiques**.
:: ::
+74 -57
View File
@@ -3,86 +3,87 @@ title: Docker
description: Installer Docker et Dockge sur Debian pour déployer et gérer des services auto-hébergés avec de simples stacks de conteneurs. description: Installer Docker et Dockge sur Debian pour déployer et gérer des services auto-hébergés avec de simples stacks de conteneurs.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Docker
Docker, pour installer des services déployables en quelques secondes, et les manager en quelques commandes/clics. Chaque application de ce guide, [Jellyfin](/serveex/media/jellyfin), [Vaultwarden](/serveex/apps/vaultwarden), [Immich](/serveex/cloud/immich), pour n'en citer que quelques-unes, arrive avec sa propre liste de dépendances, sa propre version de Python ou de Node, ses propres bizarreries. Installer tout ça directement sur Debian fonctionne un moment, jusqu'à ce que deux applications réclament une version différente de la même bibliothèque, ou qu'en désinstaller une laisse des fichiers éparpillés dans le système sans moyen propre de revenir en arrière.
::note Un **conteneur** contourne le problème : il empaquette une application avec tout ce dont elle a besoin pour tourner, isolée du reste du système et de tous les autres conteneurs. En démarrer un ne touche pas aux paquets de Debian, et le supprimer tient en une commande qui ne laisse rien derrière. Ce n'est pas non plus une machine virtuelle, il n'y a pas de second système d'exploitation à démarrer ni de ressources à réserver à l'avance : un conteneur partage le noyau de l'hôte et démarre en une seconde environ, en n'utilisant que la RAM et le CPU dont l'application à l'intérieur a réellement besoin.
🎯 __Objectifs :__
- Installer [Docker](https://www.docker.com/) **Docker** est l'outil qui construit, démarre et gère ces conteneurs. Pointez-le sur une *image*, un instantané prêt à l'emploi d'une application maintenu par ses développeurs, et il la télécharge et la lance en une commande. Tout le reste de Serveex est bâti dessus : chaque application à partir d'ici est un conteneur Docker, ou une poignée de conteneurs qui travaillent ensemble.
- Installer [Dockge](https://github.com/louislam/dockge) pour manager les stacks
- Installer [Watchtower](https://github.com/containrrr/watchtower) pour mettre à jour les conteneurs
::
![picture](/img/serveex/docker.svg) ![picture](/img/serveex/docker.svg)
## Installer docker ## Installer Docker
Installez les repo Docker et la clé GPG ::steps{level="3"}
### Ajouter le dépôt Docker et la clé GPG
```bash [Terminal] ```bash [Terminal]
# Add Docker's official GPG key: # Ajoute la clé GPG officielle de Docker :
sudo apt-get update sudo apt-get update
sudo apt-get install ca-certificates curl sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources: # Ajoute le dépôt aux sources Apt :
echo \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update sudo apt-get update
``` ```
Installez les package
### Installer les paquets
```bash [Terminal] ```bash [Terminal]
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
``` ```
Et voilà !
**Plus d'options** [Installer docker pour Debian 12](https://docs.docker.com/engine/install/debian/) ### Terminé !
::
**Plus d'options :** [Installer Docker pour Debian 13](https://docs.docker.com/engine/install/debian/)
::note ::note
Dans toute la suite, on part du principe que les stacks sont installées dans le dossier `/docker`, créé grace à la commande : À partir d'ici, nous partons du principe que les stacks sont installées dans le dossier `/srv/docker`, créé avec la commande :
```bash [Terminal] ```bash [Terminal]
sudo mkdir /docker sudo mkdir /srv/docker
``` ```
:: ::
## Installer [dockge](https://github.com/louislam/dockge) pour gérer et déployer les conteneurs ## Installer [Dockge](https://github.com/louislam/dockge) pour gérer et déployer les conteneurs
[Dockge](https://github.com/louislam/dockge) est un outil web permettant de créer, configurer, lancer et gérer des conteneurs pour Docker. C'est une interface simple, intuitive, qui est plus légère et plus facile pour les débutants que d'utiliser docker en CLI ou Portainer. [Dockge](https://github.com/louislam/dockge) est un outil web pour créer, configurer, lancer et gérer des conteneurs Docker. C'est une interface simple et intuitive, plus légère et plus abordable pour un débutant que la ligne de commande ou Portainer.
![picture](/img/serveex/dockge.png) ![picture](/img/serveex/dockge.png)
### Configuration ### Configuration
Plan des fichiers que nous allons modifier : ::file-tree
---
label: Structure de fichiers que nous allons créer
tree:
/:
- srv:
- docker:
- dockge:
- compose.yml
---
::
```text [Arborescence] ::steps{level="4"}
root #### Créer le dossier de la stack
└── docker
└── dockge
└── compose.yml
```
Créez le dossier de la stack :
```bash [Terminal] ```bash [Terminal]
cd /docker cd /srv/docker
sudo mkdir dockge sudo mkdir dockge
``` ```
Puis créez le fichier `compose.yml` dans ce dossier avec l'outil nano que vous avez installé préalablement (dans les outils CLI) #### Créer le fichier compose
```bash [Terminal] ```bash [Terminal]
cd /docker/dockge cd /srv/docker/dockge
sudo nano compose.yml sudo nano compose.yml
``` ```
Appuyer sur `i` pour rentrer en modif et copiez-collez ceci. Collez ce qui suit :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -92,39 +93,46 @@ services:
restart: unless-stopped restart: unless-stopped
container_name: dockge container_name: dockge
ports: ports:
- 3555:5001 # Le port joignable depuis le LAN sera 3555 - 3555:5001 # le port accessible sur le réseau local sera 3555
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- /docker/dockge/data:/app/data - /srv/docker/dockge/data:/app/data
- /docker:/docker - /srv/docker:/srv/docker
environment: environment:
- DOCKGE_STACKS_DIR=/docker - DOCKGE_STACKS_DIR=/srv/docker
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Ente"}, puis quittez avec :kbd{value="Ctrl+X"}. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
Pour lancer le conteneur, tapez : #### Lancer le conteneur
```bash [Terminal] ```bash [Terminal]
cd /docker/dockge cd /srv/docker/dockge
sudo docker compose up -d sudo docker compose up -d
``` ```
Une fois lancé, tapez dans votre navigateur `http://ipduserveur:3555` et vous tomberez sur la page de login.
Plus d'info sur [dockge et comment l'utiliser](https://github.com/louislam/dockge) Allez ensuite sur `http://ipdevotreserveur:3555` dans votre navigateur pour accéder à la page de connexion.
Et voilà, vous avez installé docker et un outil facile pour manager vos conteneurs ! Plus d'infos sur [Dockge et son utilisation](https://github.com/louislam/dockge)
## [Watchtower](https://watchtower.nickfedor.com/), pour mettre à jour automatiquement les conteneurs #### Terminé !
Watchtower est un conteneur qui permet de vérifier les mise à jour et d'installer les nouvelles images sans effort, en ajoutant un simple label dans les fichiers `compose.yml` de vos conteneurs. ::
Et voilà ! Docker et un outil pour gérer facilement vos conteneurs sont prêts !
## [Watchtower](https://watchtower.nickfedor.com/), pour mettre à jour les conteneurs automatiquement
Watchtower est un conteneur qui vérifie les mises à jour et récupère les nouvelles images automatiquement, simplement en ajoutant un label dans les fichiers `compose.yml` de vos conteneurs.
### Configuration ### Configuration
::steps{level="4"}
#### Créer la stack
- Ouvrez Dockge dans votre navigateur - Ouvrez Dockge dans votre navigateur
- Cliquez sur `compose` - Cliquez sur `compose`
- Nommez la stack `watchtower` - Nommez la stack `watchtower`
- Copiez collez la configuration ci-dessous à la place de la configuration par défaut dans Dockge - Collez la configuration ci-dessous dans la zone de configuration par défaut de Dockge
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -138,10 +146,10 @@ services:
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
- WATCHTOWER_SCHEDULE=${SCHEDULE} - WATCHTOWER_SCHEDULE=${SCHEDULE}
- WATCHTOWER_LABEL_ENABLE=true # watchtower scan tous les conteneurs qui ont le label com.centurylinklabs.watchtower.enable=true - WATCHTOWER_LABEL_ENABLE=true
- WATCHTOWER_CLEANUP=true - WATCHTOWER_CLEANUP=true
- WATCHTOWER_REMOVE_VOLUMES=true - WATCHTOWER_REMOVE_VOLUMES=true
#Notifications Discord - décommenter si utilisé # Notifications Discord - décommentez si utilisées
#- WATCHTOWER_NOTIFICATIONS=slack #- WATCHTOWER_NOTIFICATIONS=slack
#- WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=Watchtower #- WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=Watchtower
#- WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=${WH_URL} #- WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=${WH_URL}
@@ -149,7 +157,9 @@ services:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
``` ```
Puis remplissez les données ci-dessous dans l'encart ".env" de Dockge #### Renseigner vos variables d'environnement
Remplissez la section `.env` dans Dockge avec ce qui suit :
```properties [.env] ```properties [.env]
SCHEDULE= SCHEDULE=
@@ -157,11 +167,13 @@ WH_URL=
``` ```
| Propriété | Valeur | Exemples | | Propriété | Valeur | Exemples |
|-------------------------|---------------------------------------------------------------------|----------------------------------------------| |----------------|--------------------------------------------------------------------|----------------------------------------------|
| `SCHEDULE`{lang=properties} | Format cron | `0 0 6 * * *` (tous les jours à 6h du matin) | | `SCHEDULE` | Format cron | `0 0 6 * * *` (tous les jours à 6h) |
| `WH_URL`{lang=properties} | URL du webhook de votre serveur Discord - ajouter `/slack` à la fin | `https://serveurdiscord/valeur/slack` | | `WH_URL` | L'URL de votre webhook Discord, ajoutez `/slack` à la fin | `https://votreserveurdiscord/webhook/slack` |
Pour que Watchtower surveille vos autres conteneurs, ajoutez ceci à vos conteneurs dans leur compose.yml : #### Activer Watchtower sur les autres conteneurs
Pour que Watchtower surveille vos autres conteneurs, ajoutez ceci à leur `compose.yml` :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -169,4 +181,9 @@ labels:
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true
``` ```
Puis relancez les stacks modifiés. Et voilà, vous avez une bonne carcasse pour commencer à installer les services qui vous plaisent ! Redémarrez ensuite les stacks modifiées.
#### Terminé !
::
Et c'est tout ! Vous avez maintenant une base solide pour commencer à déployer les services que vous voulez !
@@ -3,16 +3,8 @@ title: Wireguard
description: Installer et configurer WireGuard VPN pour accéder à votre homelab de n'importe où et connecter tous vos appareils à votre réseau privé. description: Installer et configurer WireGuard VPN pour accéder à votre homelab de n'importe où et connecter tous vos appareils à votre réseau privé.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Wireguard
::note
🎯 __Objectifs :__
- Installer Wireguard
- Configurer les clients
- Accéder au réseau sécurisé
::
## Introduction ## Introduction
L'utilisation d'un VPN permet d'accéder à distance aux ressources locales du serveur sans les exposer sur internet. C'est notamment une manière propre de sécuriser l'accès à la console SSH, plutot que d'exposer le port sur internet. C'est pouvoir se connecter à son réseau où que l'on soit, de maniere sécurisée, et de faire dialoguer des machines qui sont sur des réseaux différents. L'utilisation d'un VPN permet d'accéder à distance aux ressources locales du serveur sans les exposer sur internet. C'est notamment une manière propre de sécuriser l'accès à la console SSH, plutot que d'exposer le port sur internet. C'est pouvoir se connecter à son réseau où que l'on soit, de maniere sécurisée, et de faire dialoguer des machines qui sont sur des réseaux différents.
@@ -180,21 +172,21 @@ root
└── compose.yaml └── compose.yaml
``` ```
Creez le dossier `/docker/wireguard/config/wg_confs`. Creez le dossier `/srv/docker/wireguard/config/wg_confs`.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce pour les allergiques au terminal :__ ✨ __Astuce pour les allergiques au terminal :__
vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo mkdir -p /docker/wireguard/config/wg_confs sudo mkdir -p /srv/docker/wireguard/config/wg_confs
``` ```
Créez le fichier `wg0.conf` Créez le fichier `wg0.conf`
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/wireguard/config/wg_confs/wg0.conf sudo nano /srv/docker/wireguard/config/wg_confs/wg0.conf
``` ```
Copiez-collez le contenu du `wg0.conf` que vous avez téléchargé, puis enregistrez avec :kbd{value="Ctrl+O"} et :kbd{value="Entrée"}, et quittez avec :kbd{value="Ctrl+X"}. Copiez-collez le contenu du `wg0.conf` que vous avez téléchargé, puis enregistrez avec :kbd{value="Ctrl+O"} et :kbd{value="Entrée"}, et quittez avec :kbd{value="Ctrl+X"}.
@@ -203,13 +195,13 @@ Copiez-collez le contenu du `wg0.conf` que vous avez téléchargé, puis enregis
__Astuce :__ Un autre moyen est de transférer le fichier par sftp dans le dossier `/home/nomdutilisateur` puis de le copier dans le bon dossier : __Astuce :__ Un autre moyen est de transférer le fichier par sftp dans le dossier `/home/nomdutilisateur` puis de le copier dans le bon dossier :
```bash [Terminal] ```bash [Terminal]
sudo cp ~/wg0.conf /docker/wireguard/config/wg_confs sudo cp ~/wg0.conf /srv/docker/wireguard/config/wg_confs
``` ```
:: ::
Creez le `compose.yaml` dans `/docker/wireguard `: Creez le `compose.yaml` dans `/srv/docker/wireguard `:
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/wireguard/compose.yaml sudo nano /srv/docker/wireguard/compose.yaml
``` ```
Copiez la configuration ci-dessous Copiez la configuration ci-dessous
```yaml [compose.yaml] ```yaml [compose.yaml]
@@ -225,7 +217,7 @@ services:
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/wireguard/config:/config - /srv/docker/wireguard/config:/config
- /lib/modules:/lib/modules #optional - /lib/modules:/lib/modules #optional
restart: unless-stopped restart: unless-stopped
``` ```
@@ -234,7 +226,7 @@ Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez a
Lancez le conteneur : Lancez le conteneur :
```bash [Terminal] ```bash [Terminal]
cd /docker/wireguard cd /srv/docker/wireguard
sudo docker compose up -d sudo docker compose up -d
``` ```
::note ::note
@@ -3,24 +3,14 @@ title: SWAG
description: Configurer SWAG comme reverse proxy avec SSL automatique, exposer vos services en toute sécurité et activer le blocage géographique sur votre homelab. description: Configurer SWAG comme reverse proxy avec SSL automatique, exposer vos services en toute sécurité et activer le blocage géographique sur votre homelab.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# SWAG
::note
🎯 __Objectifs :__
- Installer Swag
- Activer le SSL
- Accéder au tableau de bord
- Configurer le blocage régional
- Exposer Dockge
::
[Swag](https://docs.linuxserver.io/general/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'émission des certificats SSL (pour garder des connexions chiffrées), du routage des requêtes et de la sécurisation des accès (par authent HTTP ou par SSO comme Authelia ou Authentik). Toute la doc nécessaire se [situe ici](https://docs.linuxserver.io/general/swag). [Swag](https://docs.linuxserver.io/general/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'émission des certificats SSL (pour garder des connexions chiffrées), du routage des requêtes et de la sécurisation des accès (par authent HTTP ou par SSO comme Authelia ou Authentik). Toute la doc nécessaire se [situe ici](https://docs.linuxserver.io/general/swag).
::warning ::warning
SWAG n'a pour utilité que l'exposition de vos services sur internet. C'est à dire, y accéder via une url publique du type `https://service.mondomaine.fr`. Si vous ne souhaitez pas exposer vos services et plutôt utiliser systématiquement un VPN pour vous connecter à vos services à distance, vous pouvez directement aller [par ici](/fr/serveex/security/wireguard). SWAG n'a pour utilité que l'exposition de vos services sur internet. C'est à dire, y accéder via une url publique du type `https://service.mondomaine.fr`. Si vous ne souhaitez pas exposer vos services et plutôt utiliser systématiquement un VPN pour vous connecter à vos services à distance, vous pouvez directement aller [par ici](/serveex/core/wireguard).
:: ::
Ci-dessous, vous trouverez un exemple, exposant Dockge. Nous installerons SWAG, ainsi que le mod dbip servant à bloquer les connexions en fonction de la géoloc, ainsi que le mod dashboard qui permet de piloter le fonctionnement de swag, fail2ban et la géoloc. Ci-dessous, vous trouverez un exemple, exposant Dockge. Nous installerons SWAG, ainsi que le mod dbip servant à bloquer les connexions en fonction de la géoloc, ainsi que le mod dashboard qui permet de piloter le fonctionnement de swag, fail2ban et la géoloc.
@@ -80,7 +70,7 @@ services:
- DOCKER_MODS=linuxserver/mods:swag-dbip|linuxserver/mods:swag-dashboard|linuxserver/mods:swag-auto-reload - DOCKER_MODS=linuxserver/mods:swag-dbip|linuxserver/mods:swag-dashboard|linuxserver/mods:swag-auto-reload
volumes: volumes:
- /docker/swag/config:/config - /srv/docker/swag/config:/config
ports: ports:
- 80:80 - 80:80
@@ -133,13 +123,13 @@ Ici nous partons du principe que votre zone DNS est chez OVH. Déployez la stack
En CLI, allez dans le dossier dns-conf et éditez le fichier `ovh.ini` : En CLI, allez dans le dossier dns-conf et éditez le fichier `ovh.ini` :
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce pour les allergiques au terminal :__ ✨ __Astuce pour les allergiques au terminal :__
vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/dns-conf/ovh.ini sudo nano /srv/docker/swag/config/dns-conf/ovh.ini
``` ```
Voici ce qui s'affiche : Voici ce qui s'affiche :
@@ -168,7 +158,7 @@ Sauvegardez et quittez le fichier.
Configurez aussi swag pour qu'il accède à DBIP, le module de gestion des accès par géolocalisation /Ouvrez le fichier nginx.conf Configurez aussi swag pour qu'il accède à DBIP, le module de gestion des accès par géolocalisation /Ouvrez le fichier nginx.conf
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/nginx.conf sudo nano /srv/docker/swag/config/nginx/nginx.conf
``` ```
Et ajoutez la ligne suivante en dessous de la section `http` : Et ajoutez la ligne suivante en dessous de la section `http` :
@@ -186,7 +176,7 @@ A gauche, vous trouverez la liste des services actuellement "proxied" (aucun pou
![picture](https://www.linuxserver.io/user/pages/03.blog/introducing-swag-dashboard/example.png) ![picture](https://www.linuxserver.io/user/pages/03.blog/introducing-swag-dashboard/example.png)
## DBIP ## DBIP
DBIP permet de bloquer les connexions en fonction des pays. Il s'appuie sur le fichier de config nommé `dbip.conf` dans `/docker/swag/config/nginx`. [Plus d'info ici](https://virtualize.link/secure/). DBIP permet de bloquer les connexions en fonction des pays. Il s'appuie sur le fichier de config nommé `dbip.conf` dans `/srv/docker/swag/config/nginx`. [Plus d'info ici](https://virtualize.link/secure/).
Dans cet exemple, nous allons le configurer pour bloquer une liste de pays connus pour etre à l'origine de la plupart des connexions malveillantes. Nous allons également configurer une variable au cas où nous souhaiterions permettre au réseau interne du serveur, au réseau local de votre box ainsi qu'à un éventuel vpn en 10.x.x.x de pouvoir accéder à vos services, mais pas directement à internet. Dans cet exemple, nous allons le configurer pour bloquer une liste de pays connus pour etre à l'origine de la plupart des connexions malveillantes. Nous allons également configurer une variable au cas où nous souhaiterions permettre au réseau interne du serveur, au réseau local de votre box ainsi qu'à un éventuel vpn en 10.x.x.x de pouvoir accéder à vos services, mais pas directement à internet.
@@ -195,7 +185,7 @@ La configuration est activable ou désactivable pour chaque service qui sera pro
Ouvrez `dbip.conf` : Ouvrez `dbip.conf` :
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/dbip.conf sudo nano /srv/docker/swag/config/nginx/dbip.conf
``` ```
Faites vos modifications ([voir documentation](https://github.com/linuxserver/docker-mods/tree/swag-dbip)), ou prenez l'exemple suivant: Faites vos modifications ([voir documentation](https://github.com/linuxserver/docker-mods/tree/swag-dbip)), ou prenez l'exemple suivant:
@@ -279,20 +269,20 @@ server {
## Exposer Dockge ## Exposer Dockge
::note ::note
📋 __Prérequis :__ <br/></br> 📋 __Prérequis :__ <br/></br>
Nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `dockge.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez créé dans votre [zone DNS](/general/networking/dns) un sous domaine du type `dockge.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et [à moins que vous utilisiez Cloudflare Zero Trust](/serveex/security/cloudflare), que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/general/networking/nat).
:: ::
Il s'agit maintenant d'exposer Dockge sur internet, afin de pouvoir y accéder et gérer vos conteneurs sans que vous soyez chez vous. Pour cela, nous partons du principe que vous avez configuré un sous domaine `dockge.mondomaine.fr` dans votre zone DNS dont le `CNAME` pointe sur `mondomaine.fr`. Il s'agit maintenant d'exposer Dockge sur internet, afin de pouvoir y accéder et gérer vos conteneurs sans que vous soyez chez vous. Pour cela, nous partons du principe que vous avez configuré un sous domaine `dockge.mondomaine.fr` dans votre zone DNS dont le `CNAME` pointe sur `mondomaine.fr`.
::warning ::warning
Dockge n'utilise pas d'authentification multifacteur. Exposer Dockge sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/fr/serveex/security/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/fr/serveex/security/wireguard). Dockge n'utilise pas d'authentification multifacteur. Exposer Dockge sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/serveex/advanced/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard).
:: ::
Ouvrez le fichier dockge.subdomain.conf : Ouvrez le fichier dockge.subdomain.conf :
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf
``` ```
Paramétrez le comme tel : Paramétrez le comme tel :
@@ -389,7 +379,7 @@ Patientez puis tapez `https://dockge.mondomaine.fr` dans votre navigateur, vous
Swag dispose de modeles pour la plupart des services connus, nommés `nomduservice.subdomain.conf.sample`. Il vous suffit de créer 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 `nomduservice.subdomain.conf.sample` en `nomduservice.subdomain.conf`. Swag dispose de modeles pour la plupart des services connus, nommés `nomduservice.subdomain.conf.sample`. Il vous suffit de créer 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 `nomduservice.subdomain.conf.sample` en `nomduservice.subdomain.conf`.
```bash [Terminal] ```bash [Terminal]
cd /docker/swag/config/proxy-confs cd /srv/docker/swag/config/proxy-confs
sudo cp nomduservice.subdomain.conf.sample nomduservice.subdomain.conf sudo cp nomduservice.subdomain.conf.sample nomduservice.subdomain.conf
``` ```
::caution ::caution
@@ -1,26 +1,16 @@
--- ---
title: Cloudflare Zero Trust title: Cloudflare Zero Trust
description: Utiliser les tunnels Cloudflare et Zero Trust pour exposer des services sans ouvrir de ports configurer SWAG et gérer plusieurs tunnels. description: Utiliser les tunnels Cloudflare et Zero Trust pour exposer des services sans ouvrir de ports, configurer SWAG et gérer plusieurs tunnels.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Cloudflare Zero Trust
::note
🎯 __Objectifs :__
- Comprendre le principe des Tunnels Cloudflare
- Paramétrer son compte cloudflare
- Paramétrer SWAG
- Gérer plusieurs tunnels
::
![cloudfare_tunnels](/img/serveex/cloudflared.svg) ![cloudfare_tunnels](/img/serveex/cloudflared.svg)
## Introduction ## Introduction
L'architecture _Zero Trust_ est la pratique consistant à concevoir des systèmes fondés sur le principe de __« ne jamais faire confiance__, __toujours vérifier »__, par opposition au principe traditionnel de __« confiance, mais vérifier »__. Ce concept est devenu très populaires récemment, à la suite des attaques toujours plus nombreuses concernant les données des utilisateurs. C'est un concept très large, nous nous concentrerons sur lapplication du _Zero Trust_ aux services Web que nous hébergeons. L'architecture _Zero Trust_ est la pratique consistant à concevoir des systèmes fondés sur le principe de __« ne jamais faire confiance__, __toujours vérifier »__, par opposition au principe traditionnel de __« confiance, mais vérifier »__. Ce concept est devenu très populaires récemment, à la suite des attaques toujours plus nombreuses concernant les données des utilisateurs. C'est un concept très large, nous nous concentrerons sur lapplication du _Zero Trust_ aux services Web que nous hébergeons.
Les _tunnels Cloudflare_ offrent un moyen simple d'arriver au _Zero Trust_, en s'appuyant sur [SWAG](/fr/serveex/core/swag) et [Authentik](/fr/serveex/security/authentik). Les _tunnels Cloudflare_ offrent un moyen simple d'arriver au _Zero Trust_, en s'appuyant sur [SWAG](/serveex/core/swag) et [Authentik](/serveex/advanced/authentik).
Pour le dire simplement, les Tunnels Cloudflare permettent notamment de : Pour le dire simplement, les Tunnels Cloudflare permettent notamment de :
@@ -33,23 +23,22 @@ Pour le dire simplement, les Tunnels Cloudflare permettent notamment de :
Ici, nous expliquerons comment associer SWAG aux tunnels Cloudflare. Ici, nous expliquerons comment associer SWAG aux tunnels Cloudflare.
::warning ::warning
__Attention :__
- __Attention :__
- N'utilisez pas les tunnels Cloudflare pour exposer un serveur mail - N'utilisez pas les tunnels Cloudflare pour exposer un serveur mail
- N'utilisez pas les tunnels Cloudflare pour exposer un service vidéo, comme Plex (si vous avez [suivi ce guide](/fr/serveex/media/plex), Plex n'est pas exposé, c'est donc valide) - N'utilisez pas les tunnels Cloudflare pour exposer un service vidéo comme Jellyfin. Contrairement à Plex, [Jellyfin n'a pas de relais cloud](/serveex/media/jellyfin) et est exposé directement par SWAG dans ce guide, veillez donc à le laisser derrière une simple redirection de port plutôt que derrière un tunnel Cloudflare
- N'utilisez pas les tunnels Cloudflare pour utiliser le protocole bittorrent (si vous avez [suivi ce guide](/fr/serveex/media/qbittorrent), tout est bon) - N'utilisez pas les tunnels Cloudflare pour le protocole BitTorrent (si vous avez [suivi ce guide](/serveex/media/qbittorrent), tout est bon)
:: ::
## Configuration Cloudflare ## Configuration Cloudflare
### Zone DNS ### Zone DNS
Avant toute chose, vous devez définir Cloudflare comme gestionnaire de votre [zone DNS](/fr/general/networking/dns). Si vous avez réservé votre nom de domaine chez Cloudflare, c'est déjà le cas. Sinon, renseignez vous auprès de votre registrar sur comment ajouter des DNS externes. Cloudflare dispose d'[une documentation expliquant pas à pas comment paramétrer une Zone DNS](https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/), que vous ayez un domaine externe ou reservé chez Cloudflare. Avant toute chose, vous devez définir Cloudflare comme gestionnaire de votre [zone DNS](/general/networking/dns). Si vous avez réservé votre nom de domaine chez Cloudflare, c'est déjà le cas. Sinon, renseignez vous auprès de votre registrar sur comment ajouter des DNS externes. Cloudflare dispose d'[une documentation expliquant pas à pas comment paramétrer une Zone DNS](https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/), que vous ayez un domaine externe ou reservé chez Cloudflare.
Si vous avez qu'un seul serveur à protéger derrière Cloudflare, vous pouvez supprimer l'ensemble des enregistrement DNS existant, par défaut le domaine et tout ses sous-domaines seront directement redirigés vers le tunnel. Si vous avez qu'un seul serveur à protéger derrière Cloudflare, vous pouvez supprimer l'ensemble des enregistrement DNS existant, par défaut le domaine et tout ses sous-domaines seront directement redirigés vers le tunnel.
Si vous avez des sous-domaines à rediriger vers d'autres serveurs, vous pourrez toujours les déclarer dans la zone DNS à l'aide d'un enregistrement A. Si vous avez des sous-domaines à rediriger vers d'autres serveurs, vous pourrez toujours les déclarer dans la zone DNS à l'aide d'un enregistrement A.
Si vous avez plusieurs serveurs et donc plusieurs tunnels pour un meme domaine principal, [voyez ici](http://192.168.7.80:8005/serveex/cloudflare/#gerer-plusieurs-tunnels-pour-plusieurs-serveurs). Si vous avez plusieurs serveurs et donc plusieurs tunnels pour un meme domaine principal, [voyez ici](#gérer-plusieurs-tunnels-pour-plusieurs-serveurs).
### Clé API ### Clé API
@@ -84,16 +73,17 @@ SWAG dispose de deux `Docker Mods` permettant d'y intégrer :
Ces deux mods, fusionnés dans le conteneur de SWAG, nécessitent un peu de configuration. Ces deux mods, fusionnés dans le conteneur de SWAG, nécessitent un peu de configuration.
::steps{level="3"}
### Configuration du tunnel ### Configuration du tunnel
Pour configurer les tunnels, nous aurons besoin de créer un fichier `tunnelconfig.yml` auquel nous ferons appel dans le `compose.yaml` de SWAG. Pour configurer les tunnels, nous aurons besoin de créer un fichier `tunnelconfig.yml` auquel nous ferons appel dans le `compose.yaml` de SWAG.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
__Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/tunnelconfig.yml sudo nano /srv/docker/swag/config/tunnelconfig.yml
``` ```
Collez la configuration ci-dessous Collez la configuration ci-dessous
@@ -118,9 +108,10 @@ A présent, nous allons configurer le bon fonctionnement du mode _Cloudflare Rea
Ouvrez le fichier `nginx.conf` Ouvrez le fichier `nginx.conf`
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/nginx.conf sudo nano /srv/docker/swag/config/nginx/nginx.conf
``` ```
Collez la configuration ci-dessous à la fin de la section `http`
Collez la configuration ci-dessous à la fin de la section `http` :
```nginx [nginx.conf] ```nginx [nginx.conf]
real_ip_header X-Forwarded-For; real_ip_header X-Forwarded-For;
@@ -128,9 +119,10 @@ real_ip_recursive on;
include /config/nginx/cf_real-ip.conf; include /config/nginx/cf_real-ip.conf;
set_real_ip_from 127.0.0.1; set_real_ip_from 127.0.0.1;
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}. Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
### Docker compose ### Déployer la stack SWAG
Ouvrez Dockge, éditez la stack SWAG avec cette configuration Ouvrez Dockge, éditez la stack SWAG avec cette configuration
@@ -165,25 +157,22 @@ services:
ports: ports:
- 81:81 - 81:81
volumes: volumes:
- /docker/swag/config:/config - /srv/docker/swag/config:/config
- /docker/swag/config/fail2ban/fail2ban.sqlite3:/dashboard/fail2ban.sqlite3:ro - /srv/docker/swag/config/fail2ban/fail2ban.sqlite3:/dashboard/fail2ban.sqlite3:ro
restart: unless-stopped restart: unless-stopped
``` ```
::tip{icon=""} ::tip{icon=""}
__Astuce :__ ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour __Astuce :__ ajoutez un label Watchtower pour automatiser les mises à jour :
```yaml [compose.yaml] ```yaml [compose.yaml]
services: ---
swag:
#...
labels: labels:
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true
``` ```
:: ::
Et renseignez le `.env` les infos que vous avez trouvées et notées tout au long de ce guide Renseignez votre fichier `.env` :
```properties [.env] ```properties [.env]
PUID= PUID=
@@ -213,48 +202,58 @@ TUNNEL_PW=
Une fois fait, déployez la stack. Cela prendra un peu de temps, vérifiez les logs, vous devriez arriver à `serveur ready` Une fois fait, déployez la stack. Cela prendra un peu de temps, vérifiez les logs, vous devriez arriver à `serveur ready`
Une fois le conteneur en ligne, vérifiez dans cloudflare que votre tunnel est bien présent dans la section _Networks > Tunnels_ de [Cloudflare Zero Trust](https://one.dash.cloudflare.com/). Par défaut, l'ensemble des sous domaine sont redirigés vers le tunnel, sans avoir besoin de les déclarer [dans votre zone DNS](/fr/general/networking/dns). Une fois le conteneur en ligne, vérifiez dans cloudflare que votre tunnel est bien présent dans la section _Networks > Tunnels_ de [Cloudflare Zero Trust](https://one.dash.cloudflare.com/). Par défaut, l'ensemble des sous domaine sont redirigés vers le tunnel, sans avoir besoin de les déclarer [dans votre zone DNS](/general/networking/dns).
::tip{icon=""} ::tip{icon="" to="/general/networking/dns"}
__Astuce:__ si vous voulez exposer un service sans tunnel, vous pouvez toujours déclarer un enregistrement A [dans votre zone DNS](/fr/general/networking/dns). En cas de problème de résolution, désactivez la fonction _proxy_ pour cet enregistrement. Par exemple pour `sous.mondomaine.fr` __Astuce :__ si vous voulez exposer un service sans tunnel, déclarez simplement un enregistrement A **dans votre zone DNS**. En cas de problème de résolution, désactivez la fonction _proxy_ pour cet enregistrement, par exemple pour `sous.mondomaine.fr`.
![dns](/img/serveex/cf-dns.png) ![dns](/img/serveex/cf-dns.png)
:: ::
### Terminé !
::
## Gérer plusieurs tunnels pour plusieurs serveurs ## Gérer plusieurs tunnels pour plusieurs serveurs
Par défaut, l'ensemble des sous domaine de votre nom de domaine pointent vers le tunnel que vous avez créé. 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. Par défaut, l'ensemble des sous-domaines de votre domaine passent par l'unique tunnel. Mais si vous avez un second serveur, il suffit de changer le nom du tunnel dans cette instance de SWAG, puis de rediriger les sous-domaines vers le bon tunnel dans votre zone DNS.
Vous devrez ensuite dans votre zone DNS rediriger les sous domaine souhaité vers le bon tunnel. Pour cela, faites comme suit. ::steps{level="3"}
### Changer le nom du tunnel
Rendez-vous dans dans la section _Networks > Tunnels_ de [Cloudflare Zero Trust](https://one.dash.cloudflare.com/). Dans la stack SWAG du second serveur, mettez un `TUNNEL_NAME` différent dans le fichier `.env`, puis redéployez.
Notez les deux ID des tunnels ### Trouver les ID des tunnels
Rendez-vous dans la section _Networks > Tunnels_ de [Cloudflare Zero Trust](https://one.dash.cloudflare.com/) et notez les ID des tunnels :
![tunnels_id](/img/serveex/cf-tunnels-id.png) ![tunnels_id](/img/serveex/cf-tunnels-id.png)
Rendez-vous à présent dans la section DNS de [cloudflare](https://dash.cloudflare.com/), après avoir cliqué sur le nom de domaine concerné. ### Ajouter les enregistrements CNAME
Cliquez sur `ajouter un enregistrement` et ajoutez deux enregistrements comme suit en ajoutant bien `.cfargotunnel.com` après vos id de tunnels. Dans le [tableau de bord DNS de Cloudflare](https://dash.cloudflare.com/), cliquez sur votre nom de domaine, puis sur `Ajouter un enregistrement` et ajoutez ces deux enregistrements CNAME (en incluant bien `.cfargotunnel.com`) :
| Type | Nom | Cible | | Type | Nom | Cible |
|---------|----------------|-------------------------------------| |---------|----------------|-------------------------------------|
| `CNAME` | `sousdomaine1` | `votreiddetunnel1.cfargotunnel.com` | | `CNAME` | `sousdomaine1` | `votreiddetunnel1.cfargotunnel.com` |
| `CNAME` | `sousdomaine2` | `votreiddetunnel2.cfargotunnel.com` | | `CNAME` | `sousdomaine2` | `votreiddetunnel2.cfargotunnel.com` |
### Terminé !
::
Si vous avez de nombreux sous-domaines, vous pouvez déclarer un seul sous domaine par tunnel comme ci-dessus, puis déclarer vos autres sous domaine en les faisant pointer vers ces sous domaines de référence. Si vous avez de nombreux sous-domaines, vous pouvez déclarer un seul sous domaine par tunnel comme ci-dessus, puis déclarer vos autres sous domaine en les faisant pointer vers ces sous domaines de référence.
Ainsi, en cas de changement d'id de tunnel, vous n'aurez qu'à le changer que pour un seul sous-domaine. Ainsi, en cas de changement d'ID de tunnel, vous n'aurez qu'un seul enregistrement DNS à modifier.
Par exemple : Par exemple :
- Le serveur de `sousdomaine1` doit egalement etre la cible de sub1, et sub2 : - `sub1` et `sub2` pointent eux aussi vers le serveur derrière `sousdomaine1` :
| Type | Nom | Cible | | Type | Nom | Cible |
|---------|----------------|-------------------------------------| |---------|--------|----------------|
| `CNAME` | `sub1` | `sousdomaine1` | | `CNAME` | `sub1` | `sousdomaine1` |
| `CNAME` | `sub2` | `sousdomaine1` | | `CNAME` | `sub2` | `sousdomaine1` |
- Le serveur de `sousdomaine2` doit egalement etre la cible de sub3, et sub4 : - `sub3` et `sub4` pointent vers le serveur derrière `sousdomaine2` :
| Type | Nom | Cible | | Type | Nom | Cible |
|---------|----------------|-------------------------------------| |---------|--------|----------------|
| `CNAME` | `sub3` | `sousdomaine2` | | `CNAME` | `sub3` | `sousdomaine2` |
| `CNAME` | `sub4` | `sousdomaine2` | | `CNAME` | `sub4` | `sousdomaine2` |
@@ -0,0 +1,353 @@
---
title: TinyAuth
description: Installer TinyAuth, un proxy de forward-auth léger, et l'associer à Pocket ID pour ajouter une connexion SSO devant vos applications auto-hébergées. Protéger votre application derrière Swag avec le forward-auth.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
[TinyAuth](https://tinyauth.app) est un petit proxy de forward-auth : une unique page de connexion que Swag peut insérer devant n'importe quelle application avant de laisser passer une requête, en vérifiant si le visiteur est authentifié avant de le rediriger.
![tinyauth](/img/serveex/tinyauth.png)
Il gère nativement une simple connexion locale identifiant/mot de passe, c'est ce que nous mettrons en place ici. Il peut aussi déléguer la connexion à un fournisseur OIDC externe comme [Pocket ID](/serveex/security/pocket-id), de sorte que quiconque visite une application protégée s'authentifie avec une passkey via Pocket ID puis est redirigé : installez Pocket ID ensuite et suivez [son tutoriel](/serveex/security/pocket-id#connecting-pocket-id-to-tinyauth) pour relier les deux.
- [Documentation de TinyAuth](https://tinyauth.app/docs)
- [TinyAuth sur GitHub](https://github.com/tinyauthapp/tinyauth)
## Installation
::file-tree
---
tree:
/:
- srv:
- docker:
- tinyauth:
- compose.yaml
- .env
- data/
---
::
::steps{level="3"}
### Créer le dossier de données
```bash [Terminal]
sudo mkdir -p /srv/docker/tinyauth/data
```
### Générer un hash de mot de passe
```bash [Terminal]
sudo docker run -i -t --rm ghcr.io/tinyauthapp/tinyauth:v5 user create --interactive
```
::note
Activez « Format for Docker » quand la question est posée, ainsi le hash généré est déjà échappé pour être utilisé dans un fichier `.env`.
::
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `tinyauth`, et ajoutez la configuration suivante :
```yaml [compose.yaml]
---
services:
tinyauth:
image: ghcr.io/tinyauthapp/tinyauth:v5
container_name: tinyauth
restart: unless-stopped
env_file:
- .env
volumes:
- /srv/docker/tinyauth/data:/data
ports:
- 3000:3000
```
::tip{icon=""}
✨ Ajoutez le label Watchtower pour automatiser les mises à jour :
```yaml [compose.yaml]
---
services:
tinyauth:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
### Renseigner vos variables d'environnement
Remplissez le fichier `.env` :
```properties [.env]
TINYAUTH_APPURL=https://tinyauth.mondomaine.fr
TINYAUTH_AUTH_USERS=
```
| Variable | Valeur | Exemple |
|----------|-------|---------|
| `TINYAUTH_APPURL`{lang=properties} | L'URL publique par laquelle vous joindrez TinyAuth (voir l'exposition plus bas) | `https://tinyauth.mondomaine.fr` |
| `TINYAUTH_AUTH_USERS`{lang=properties} | Le hash généré ci-dessus | `user:$$2a$$10$$UdLYoJ5lgPsC0RKq...` |
Déployez la stack. L'interface locale est disponible sur `http://ipdevotreserveur:3000`.
### Terminé !
::
## Activer l'authentification à deux facteurs
TinyAuth peut exiger un code TOTP issu d'une application d'authentification (Google Authenticator, Aegis...) en plus du mot de passe local, utilisateur par utilisateur. C'est une propriété de l'entrée utilisateur elle-même, pas une option de l'interface web.
::steps{level="3"}
### Générer un secret TOTP
```bash [Terminal]
sudo docker run -i -t --rm ghcr.io/tinyauthapp/tinyauth:v5 totp generate --interactive
```
Saisissez la paire `username:hash` générée lors de l'installation. TinyAuth affiche un QR code à scanner avec votre application d'authentification, puis produit la chaîne de connexion mise à jour sous la forme `username:hash:secret`.
::note
`docker run` comme `docker exec` ont besoin des options `-it` ici : la commande est interactive et affiche le QR code dans le terminal, ce qui nécessite un TTY (et une fenêtre assez large) pour s'afficher correctement.
::
### Mettre à jour votre variable d'environnement
Remplacez l'entrée de cet utilisateur dans `TINYAUTH_AUTH_USERS` par la nouvelle chaîne `username:hash:secret`, puis redéployez la stack.
::tip{icon=""}
✨ __Astuce :__ vérifiez que tout fonctionne avant de compter dessus :
```bash [Terminal]
sudo docker run -i -t --rm ghcr.io/tinyauthapp/tinyauth:v5 user verify --interactive
```
Elle redemande l'identifiant, le mot de passe et le code à 6 chiffres du moment.
::
### Terminé !
::
À partir de maintenant, cet utilisateur a besoin à la fois de son mot de passe et d'un code valide de son application d'authentification pour se connecter.
## Exposer TinyAuth avec Swag
TinyAuth a besoin de son propre sous-domaine : c'est la page sur laquelle les utilisateurs arrivent avant d'être redirigés vers l'application qu'ils veulent réellement.
::note
Nous partons du principe que vous avez le sous-domaine `tinyauth.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Et bien sûr, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box doit être redirigé vers le port `443` de votre serveur dans les [règles NAT](/general/networking/nat).
::
::steps{level="3"}
### Ajouter le réseau de TinyAuth à SWAG
Allez dans Dockge et modifiez le fichier compose de SWAG en y ajoutant le réseau de TinyAuth :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Rattache le conteneur au réseau personnalisé
# ...
- tinyauth # Nom du réseau déclaré
networks: # Définit le réseau personnalisé
# ...
tinyauth: # Nom du réseau déclaré
name: tinyauth_default # Nom réel du réseau externe
external: true # Le marque comme défini à l'extérieur
```
Redéployez la stack et attendez que SWAG soit pleinement opérationnel.
::note
Nous partons ici du principe que le nom du réseau de TinyAuth est `tinyauth_default`. Vous pouvez vérifier la connexion en visitant le tableau de bord de SWAG sur `http://ipdevotreserveur:81`.
::
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `tinyauth.subdomain.conf` :
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ utilisez **File Browser Quantum** pour naviguer et modifier les fichiers plutôt que des commandes dans le terminal.
::
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/tinyauth.subdomain.conf
```
Collez la configuration suivante :
```nginx [tinyauth.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name tinyauth.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app tinyauth;
set $upstream_port 3000;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Visiter votre nouveau sous-domaine
Attendez quelques minutes, puis ouvrez `https://tinyauth.mondomaine.fr` dans votre navigateur et connectez-vous avec l'identifiant et le mot de passe créés plus haut.
::caution
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
### Terminé !
::
## Protéger une application via le reverse proxy
Swag ne fournit pas de fichier d'inclusion tout prêt pour TinyAuth, nous ajouterons donc la vérification forward-auth directement dans le `*.subdomain.conf` de l'application. Nous prendrons Dockge en exemple.
::steps{level="3"}
### Ouvrir le fichier subdomain.conf de l'application
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf
```
### Ajouter la vérification forward-auth
Ajoutez un bloc `location /tinyauth` interne, et référencez-le depuis le bloc `location /` de l'application avec `auth_request` :
```nginx [dockge.subdomain.conf]{9-11,25}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name dockge.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app dockge;
set $upstream_port 5001;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note{to="/serveex/security/tinyauth#exposing-tinyauth-with-swag"}
Le bloc `location /tinyauth` s'exécute dans le conteneur de SWAG lui-même, SWAG doit donc être sur le réseau Docker de TinyAuth pour le joindre par son nom (`tinyauth` ici). Cela devrait déjà être en place depuis **l'exposition de TinyAuth**. Si vous rencontrez une erreur, revérifiez que le fichier compose de SWAG a toujours ce réseau rattaché.
::
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Terminé !
::
Et voilà ! Visiter `https://dockge.mondomaine.fr` redirige désormais d'abord vers TinyAuth. Répétez ce motif `location /tinyauth` / `auth_request` dans le `*.subdomain.conf` de n'importe quelle autre application pour la protéger de la même façon.
::note
Répétez cette procédure pour chaque application que vous voulez protéger (sauf si elle gère nativement OIDC, auquel cas vous pouvez la pointer directement sur Pocket ID).
::
## Laisser certains chemins publics
Il arrive qu'on veuille verrouiller l'essentiel d'une application derrière TinyAuth, mais laisser une poignée de chemins ouverts, par exemple une page de statut publique, ou les endpoints d'API sur lesquels une application mobile s'appuie. Contrairement à Authentik, TinyAuth n'a pas de réglage intégré de « chemins authentifiés » pour ça : c'est un simple problème nginx, et il se résout avec le système de correspondance de `location` de nginx.
Un bloc `location` en expression régulière est toujours prioritaire sur le bloc `location /` simple, quel que soit celui qui apparaît en premier dans le fichier. Tout chemin correspondant à une location en regex que vous définissez exécute donc son propre `proxy_pass`, sans jamais atteindre la ligne `auth_request /tinyauth;` du `location /`.
Par exemple, pour laisser ouverte la page de statut publique d'Uptime-Kuma et ses ressources tout en protégeant le reste :
```nginx [dockge.subdomain.conf]{9-16}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name stats.*;
include /config/nginx/ssl.conf;
location ~ ^/(status|assets|icon\.svg|api|upload|metrics) {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app uptime-kuma;
set $upstream_port 3001;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app uptime-kuma;
set $upstream_port 3001;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note
Adaptez la liste des chemins exclus à ce dont l'application que vous protégez a réellement besoin en public. Ne laissez jamais un chemin d'administration ou de réglages dans cette liste, uniquement ce que l'application elle-même documente comme sûr à exposer sans authentification.
::
@@ -0,0 +1,282 @@
---
title: Pocket ID
description: Installer Pocket ID, un fournisseur OIDC auto-hébergé et léger qui permet de se connecter à vos autres applications avec une passkey plutôt qu'un mot de passe.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
[Pocket ID](https://pocket-id.org) est un fournisseur OIDC (OpenID Connect) minimaliste et auto-hébergé, entièrement construit autour des passkeys : au lieu de gérer des mots de passe, vous et vos utilisateurs vous connectez aux applications compatibles avec une **passkey** (empreinte digitale, reconnaissance faciale, ou clé de sécurité matérielle). Il tourne dans un unique conteneur léger, sans base de données externe à gérer, et fait une seule chose, bien : délivrer des connexions OIDC.
![pocketid](/img/serveex/pocketid.png)
C'est donc un bon choix si vous voulez simplement un backend SSO simple et rapide, par exemple pour l'associer à [TinyAuth](/serveex/security/tinyauth) en tant que forward-auth léger, ou pour vous connecter directement aux applications qui gèrent nativement OIDC.
- [Documentation de Pocket ID](https://pocket-id.org/docs)
- [Pocket ID sur GitHub](https://github.com/pocket-id/pocket-id)
## Installation
::file-tree
---
tree:
/:
- srv:
- docker:
- pocket-id:
- compose.yaml
- .env
- data/
---
::
::steps{level="3"}
### Créer le dossier de données
```bash [Terminal]
sudo mkdir -p /srv/docker/pocket-id/data
```
### Générer une clé de chiffrement
```bash [Terminal]
openssl rand -base64 32
```
Gardez le résultat, vous en aurez besoin pour le fichier `.env` ci-dessous.
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `pocket-id`, et ajoutez la configuration suivante :
```yaml [compose.yaml]
---
services:
pocket-id:
image: pocketid/pocket-id:v2
container_name: pocket-id
restart: unless-stopped
env_file:
- .env
volumes:
- /srv/docker/pocket-id/data:/app/data
ports:
- 1411:1411
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:1411/healthz"]
interval: 90s
timeout: 5s
retries: 3
```
::tip{icon=""}
✨ Ajoutez le label Watchtower pour automatiser les mises à jour :
```yaml [compose.yaml]
---
services:
pocket-id:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
### Renseigner vos variables d'environnement
Remplissez le fichier `.env` :
```properties [.env]
APP_URL=https://id.mondomaine.fr
ENCRYPTION_KEY=
TRUST_PROXY=true
```
| Variable | Valeur | Exemple |
|----------|-------|---------|
| `APP_URL`{lang=properties} | L'URL publique par laquelle vous joindrez Pocket ID (voir l'exposition plus bas) | `https://id.mondomaine.fr` |
| `ENCRYPTION_KEY`{lang=properties} | La clé générée ci-dessus | `Q2pVEqsTNRkJSO9SkJzU3KZ2...` |
| `TRUST_PROXY`{lang=properties} | Nécessaire puisque Pocket ID se trouve derrière Swag | `true` |
Déployez la stack. L'interface locale est disponible sur `http://ipdevotreserveur:1411`.
### Terminé !
::
## Première connexion
Pocket ID n'utilise pas de mots de passe : votre premier compte est créé avec une **passkey**, que votre navigateur ou votre système génère pour vous (Windows Hello, Touch ID, un téléphone, ou une clé matérielle comme une YubiKey).
- Allez sur `http://ipdevotreserveur:1411/setup`
- Suivez les instructions pour créer votre compte administrateur et enregistrer votre première passkey
::note
Comme `APP_URL` pointe déjà vers votre futur domaine public, l'enregistrement de la passkey peut vous demander d'ouvrir Pocket ID depuis ce domaine. Exposez-le d'abord (voir plus bas) si la configuration ne se termine pas en local.
::
## Exposer Pocket ID avec Swag
Les autres applications doivent joindre Pocket ID en HTTPS pour finaliser le processus de connexion OIDC, il doit donc être exposé même si vous ne l'utilisez que depuis chez vous.
::note
Nous partons du principe que vous avez le sous-domaine `id.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Et bien sûr, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box doit être redirigé vers le port `443` de votre serveur dans les [règles NAT](/general/networking/nat).
::
::steps{level="3"}
### Ajouter le réseau de Pocket ID à SWAG
Allez dans Dockge et modifiez le fichier compose de SWAG en y ajoutant le réseau de Pocket ID :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Rattache le conteneur au réseau personnalisé
# ...
- pocket-id # Nom du réseau déclaré
networks: # Définit le réseau personnalisé
# ...
pocket-id: # Nom du réseau déclaré
name: pocket-id_default # Nom réel du réseau externe
external: true # Le marque comme défini à l'extérieur
```
Redéployez la stack et attendez que SWAG soit pleinement opérationnel.
::note
Nous partons ici du principe que le nom du réseau de Pocket ID est `pocket-id_default`. Vous pouvez vérifier la connexion en visitant le tableau de bord de SWAG sur `http://ipdevotreserveur:81`.
::
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `id.subdomain.conf` :
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ utilisez **File Browser Quantum** pour naviguer et modifier les fichiers plutôt que des commandes dans le terminal.
::
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/id.subdomain.conf
```
Collez la configuration suivante :
```nginx [id.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name id.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app pocket-id;
set $upstream_port 1411;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::caution
Ne mettez pas Pocket ID derrière une autre couche d'authentification (TinyAuth, auth HTTP...). C'est le fournisseur d'identité lui-même, le verrouiller empêcherait quiconque, vous compris, de se connecter.
::
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Visiter votre nouveau sous-domaine
Attendez quelques minutes, puis ouvrez `https://id.mondomaine.fr` dans votre navigateur.
::caution
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
### Terminé !
::
## Enregistrer un client OIDC
Pour qu'une autre application (par exemple [TinyAuth](/serveex/security/tinyauth)) se connecte via Pocket ID, vous devez l'enregistrer comme client OIDC :
::steps{level="3"}
### Se connecter à Pocket ID
Allez sur `https://id.mondomaine.fr` et connectez-vous avec votre passkey.
### Créer le client OIDC
Allez dans _Administration > OIDC Clients_, puis cliquez sur _Add OIDC Client_. Renseignez un nom (par exemple `TinyAuth`) et l'URL de callback de l'application (fournie par l'application que vous protégez).
### Conserver les identifiants du client
Enregistrez, puis copiez le __Client ID__ et le __Client Secret__ générés. Vous en aurez besoin dans la configuration de l'autre application.
### Terminé !
::
## Connecter Pocket ID à TinyAuth
[TinyAuth](/serveex/security/tinyauth) peut déléguer sa connexion à Pocket ID plutôt que (ou en plus de) son identifiant/mot de passe local, de sorte que quiconque visite une application protégée s'authentifie avec une passkey et se retrouve redirigé.
::steps{level="3"}
### Enregistrer TinyAuth comme client OIDC
[Enregistrez un client OIDC](#enregistrer-un-client-oidc) nommé `TinyAuth`, avec cette URL de callback :
```text
https://tinyauth.mondomaine.fr/api/oauth/callback/pocketid
```
### Ajouter le fournisseur Pocket ID dans TinyAuth
Copiez le __Client ID__ et le __Client Secret__ que Pocket ID vous donne, puis modifiez le fichier `.env` de TinyAuth :
```bash [Terminal]
sudo nano /srv/docker/tinyauth/.env
```
Ajoutez ceci :
```properties [.env]
TINYAUTH_OAUTH_PROVIDERS_POCKETID_NAME=Pocket ID
TINYAUTH_OAUTH_PROVIDERS_POCKETID_CLIENTID=
TINYAUTH_OAUTH_PROVIDERS_POCKETID_CLIENTSECRET=
TINYAUTH_OAUTH_PROVIDERS_POCKETID_AUTHURL=https://id.mondomaine.fr/authorize
TINYAUTH_OAUTH_PROVIDERS_POCKETID_TOKENURL=https://id.mondomaine.fr/api/oidc/token
TINYAUTH_OAUTH_PROVIDERS_POCKETID_USERINFOURL=https://id.mondomaine.fr/api/oidc/userinfo
TINYAUTH_OAUTH_PROVIDERS_POCKETID_REDIRECTURL=https://tinyauth.mondomaine.fr/api/oauth/callback/pocketid
TINYAUTH_OAUTH_PROVIDERS_POCKETID_SCOPES=openid email profile
```
| Variable | Valeur |
|----------|-------|
| `CLIENTID`{lang=properties} | Le client ID copié depuis Pocket ID |
| `CLIENTSECRET`{lang=properties} | Le client secret copié depuis Pocket ID |
| `AUTHURL` / `TOKENURL` / `USERINFOURL`{lang=properties} | L'URL publique de Pocket ID, avec les chemins indiqués ci-dessus |
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Redéployer la stack
Redéployez la stack TinyAuth. À votre prochaine visite sur `https://tinyauth.mondomaine.fr`, vous verrez une option « Login with Pocket ID » à côté du formulaire de connexion local.
::tip{icon=""}
✨ Pour aller directement sur Pocket ID et masquer le formulaire de connexion local, ajoutez `TINYAUTH_OAUTH_AUTOREDIRECT=pocketid` au même fichier `.env`.
::
### Terminé !
::
Et voilà ! TinyAuth propose désormais une connexion sans mot de passe via Pocket ID pour chaque application qu'il protège.
@@ -1,35 +1,31 @@
--- ---
title: Uptime-Kuma title: Uptime-Kuma
description: Installer Uptime-Kuma pour surveiller la disponibilité de vos services auto-hébergés, configurer des alertes et protéger le tableau de bord avec Authentik. description: Installer Uptime-Kuma pour surveiller la disponibilité de vos services auto-hébergés, configurer des alertes et protéger éventuellement le tableau de bord avec Tinyauth ou Authentik
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Uptime-Kuma
::note
🎯 __Objectifs :__
- Installer et déployer Uptime-Kuma
- Exposer Uptime Kuma
- (Optionnel) Protéger Uptime-Kuma avec Authentik
::
[Uptime-Kuma ](https://github.com/louislam/uptime-kuma)est un conteneur dédié au monitoring de services. Le principe est d'envoyer des requêtes régulières à vos services afin de déterminer s'ils sont en lignes ou non, et de vous alerter le cas échéant. Uptime-Kuma est développé par le meme développeur que Dockge.
![picture](https://user-images.githubusercontent.com/1336778/212262296-e6205815-ad62-488c-83ec-a5b0d0689f7c.jpg) ![picture](https://user-images.githubusercontent.com/1336778/212262296-e6205815-ad62-488c-83ec-a5b0d0689f7c.jpg)
## Installation ## Installation
Structure des dossiers
```text [Arborescence] ::file-tree
root ---
└── docker tree:
└── uptime-kuma /:
├── date - srv:
└── compose.yaml - docker:
``` - uptime-kuma:
- data/
- compose.yaml
---
::
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `uptime-kuma` puis copiez collez ceci : ::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `uptime-kuma`, puis copiez-collez ce qui suit :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -38,13 +34,14 @@ services:
image: louislam/uptime-kuma:2-slim image: louislam/uptime-kuma:2-slim
container_name: uptime-kuma container_name: uptime-kuma
volumes: volumes:
- /docker/uptime-kuma/uptime-kuma-data:/app/data - /srv/docker/uptime-kuma/uptime-kuma-data:/app/data
ports: ports:
- 3200:3001 # <Host Port>:<Container Port> - 3200:3001 # <Port hôte>:<Port conteneur>
restart: always restart: always
``` ```
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour ✨ __Astuce :__ ajoutez le label Watchtower à chaque conteneur pour automatiser les mises à jour
```yaml [compose.yaml] ```yaml [compose.yaml]
services: services:
@@ -53,39 +50,47 @@ services:
labels: labels:
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true
```
:: ::
Vous n'avez plus qu'à accéder à l'outil via `http://ipdevotreserveur:3200`. ### Accéder à l'interface web
Vous pouvez maintenant accéder à l'outil via `http://ipdevotreserveur:3200`.
::caution ::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu. __Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
### Terminé !
:: ::
## Exposer avec Swag ## Exposer avec Swag
--- ::note{icon=""}
::note
📋 __Au préalable :__ 📋 __Au préalable :__
<br/><br/> <br/><br/>
Nous partons du principe que vous avez le sous-domaine `stats.mondomaine.fr` avec un `CNAME` qui pointe vers `mondomaine.fr` dans votre [zone DNS](/fr/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur via [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez le sous-domaine `stats.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Et bien sûr, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box doit pointer vers le port `443` de votre serveur via les [règles NAT](/general/networking/nat).
:: ::
::warning ::warning
Uptime-Kuma n'utilise pas d'authentification multifacteur. Exposer Uptime-Kuma sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/fr/serveex/security/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/fr/serveex/security/wireguard). Uptime-Kuma n'utilise pas d'authentification multifacteur. L'exposer sur internet pourrait compromettre les machines qu'il surveille. Ne le faites que si vous utilisez un système MFA comme [TinyAuth](/serveex/security/tinyauth) ou [Authentik](/serveex/advanced/authentik/). Sinon, ne l'exposez pas avec SWAG, utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard).
:: ::
::steps{level="3"}
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `stats.subdomain.conf`. Dans les dossiers de Swag, créez le fichier `stats.subdomain.conf`.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce pour les allergiques au terminal :__ ✨ __Astuce pour les allergiques au terminal :__
vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. vous pouvez utiliser **File Browser Quantum** pour naviguer et modifier vos fichiers plutôt que des commandes dans le terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/stats.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/stats.subdomain.conf
``` ```
Collez la configuration ci-dessous : Collez la configuration suivante :
```nginx [stats.subdomain.conf] ```nginx [stats.subdomain.conf]
## Version 2023/12/19 ## Version 2023/12/19
@@ -137,9 +142,12 @@ server {
} }
} }
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau d'Uptime-Kuma : Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Ajouter le réseau d'Uptime-Kuma à SWAG
Dans Dockge, modifiez le compose de SWAG et ajoutez le réseau d'Uptime-Kuma :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -147,33 +155,103 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks: # Relie le conteneur au réseau personnalisé
# ... # ...
- uptime-kuma # Nom du réseau déclaré dans la stack - uptime-kuma # Nom du réseau déclaré
networks: # Définit le réseau custom networks: # Définit le réseau personnalisé
# ... # ...
uptime-kuma: # Nom du réseau déclaré dans la stack uptime-kuma: # Nom du réseau déclaré
name: uptime-kuma_default # Nom véritable du réseau externe name: uptime-kuma_default # Nom réel du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe external: true # Précise qu'il s'agit d'un réseau externe
``` ```
Relancez la stack et patientez le temps que SWAG soit complètement opérationnel. Redémarrez la stack et attendez que SWAG soit pleinement opérationnel.
::note ::note
Ici nous partons du principe que le nom du réseau de Uptime-Kuma est `uptime-kuma_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant `http://ipduserveur:81`. Nous partons ici du principe que le nom du réseau d'Uptime-Kuma est `uptime-kuma_default`. Vous pouvez vérifier la connexion en visitant le tableau de bord de SWAG sur `http://ipdevotreserveur:81`.
:: ::
Et voilà, vous avez exposé Uptime-Kuma, vous pouvez y accéder en tapant `https://stats.mondomaine.fr` ### Terminé !
::
Et voilà ! Uptime-Kuma est maintenant exposé, et vous pouvez y accéder via `https://stats.mondomaine.fr`.
## Protéger Uptime-Kuma avec TinyAuth
[TinyAuth](/serveex/security/tinyauth) peut se placer devant Uptime-Kuma comme devant n'importe quelle autre application, mais ici nous voulons aussi que la page de statut publique (et les ressources dont elle a besoin pour s'afficher) reste joignable sans se connecter. Cela utilise la même technique de `location` en expression régulière que [Laisser certains chemins publics](/serveex/security/tinyauth#leaving-specific-paths-public), appliquée directement à `stats.subdomain.conf`.
::steps{level="3"}
### Ouvrir le fichier subdomain.conf
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/stats.subdomain.conf
```
### Ajouter la vérification forward-auth et les chemins publics
Remplacez le contenu du fichier par ce qui suit. Le bloc `location ~ ^/(...)` correspond à la page de statut publique d'Uptime-Kuma et à ses ressources, et est servi directement, sans jamais atteindre la vérification `auth_request` du `location /` :
```nginx [stats.subdomain.conf]{9-16,32-33}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name stats.*;
include /config/nginx/ssl.conf;
location ~ ^/(status|assets|icon\.svg|api|upload|metrics) {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app uptime-kuma;
set $upstream_port 3001;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app uptime-kuma;
set $upstream_port 3001;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note{to="/serveex/security/tinyauth#exposing-tinyauth-with-swag"}
Le bloc `location /tinyauth` s'exécute dans le conteneur de SWAG lui-même, SWAG doit donc être sur le réseau Docker de TinyAuth pour le joindre par son nom (`tinyauth` ici). Cela devrait déjà être en place depuis **l'exposition de TinyAuth**. Si vous rencontrez une erreur, revérifiez que le fichier compose de SWAG a toujours ce réseau rattaché.
::
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Terminé !
::
Redéployez la stack. Uptime-Kuma sera alors joignable publiquement via `https://stats.mondomaine.fr`, avec la page de statut ouverte et tout le reste derrière TinyAuth.
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ ✨ __Astuce :__ vous pouvez aussi protéger cette application avec [Authentik](/serveex/advanced/authentik) à la place : ouvrez `stats.subdomain.conf` et décommentez les lignes `include /config/nginx/authentik-server.conf;` et `include /config/nginx/authentik-location.conf;`. N'oubliez pas de [créer une application et un provider dans Authentik](/serveex/advanced/authentik#protecting-an-app-via-reverse-proxy). Modifiez ensuite le provider Uptime-Kuma, et dans *Advanced Protocol Settings > Authenticated Paths*, saisissez :
<br/><br>
Vous pouvez protéger cette app avec Authentik en ouvrant `stats.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). Si vous souhaitez que la page publique de stats soit joignable par tout le monde sans authentification:
- Editez le fournisseur d'Uptime-Kuma
- Dans *paramètres avancés du protocole > chemins authentifiés*, saisissez :
```properties ```properties
^/$ ^/$
@@ -184,12 +262,9 @@ Vous pouvez protéger cette app avec Authentik en ouvrant `stats.subodmain.conf`
^/api/.* ^/api/.*
^/upload/.* ^/upload/.*
^/metrics ^/metrics
```
:: ::
Déployez à nouveau la stack.
Uptime-Kuma sera ainsi joignable directement depuis internet en tapant `https://stats.mondomaine.fr`.
::tip{icon=""} ::tip{icon=""}
__Astuce :__ Si vous utilisez Authentik et que vous ne craignez pas d'exposer votre panneau admin à votre réseau local, vous pouvez désactiver l'authentification d'Uptime-Kuma via les paramètres, afin de ne garder que celle d'Authentik. __Astuce :__ si vous utilisez [TinyAuth](/serveex/security/tinyauth) ou [Authentik](/serveex/advanced/authentik) et que l'exposition du panneau d'administration à votre réseau local ne vous dérange pas, vous pouvez désactiver l'authentification native d'Uptime-Kuma dans ses réglages et vous reposer uniquement sur celui qui le protège.
:: ::
+129 -38
View File
@@ -1,33 +1,35 @@
--- ---
title: Dozzle title: Dozzle
description: Installer Dozzle pour surveiller les logs des conteneurs Docker en temps réel depuis une interface web épurée, exposée via SWAG. description: Installer Dozzle pour surveiller les logs de vos conteneurs Docker en temps réel depuis une interface web claire, exposée via SWAG.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Dozzle
::note
🎯 __Objectifs :__
- Installer Dozzle [Dozzle](https://dozzle.dev/) est un conteneur qui permet d'accéder aux logs de vos autres conteneurs et de les afficher en temps réel dans une interface agréable. C'est un moyen simple de parcourir les logs et de retrouver des informations dans l'historique.
- Exposer Dozzle avec Swag
::
[Dozzle](https://dozzle.dev/) est un conteneur permettant d'accéder au logs de vos conteneurs et de les afficher en temps réel de via une interface user-friendly. C'est une manière simple de naviguer entre les logs et de retrouver des informations dans l'historique.
![Dozzle](https://blog.unixhost.pro/wp-content/uploads/2023/03/image-5.png) ![Dozzle](https://blog.unixhost.pro/wp-content/uploads/2023/03/image-5.png)
## Installation ## Installation
Structure des dossiers
```text [Arborescence] ::file-tree
root ---
└── docker tree:
└── dozzle /:
└── data - srv:
``` - docker:
- dozzle:
- compose.yaml
- .env
- data/
---
::
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `dozzle` puis copiez collez ceci : ::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `dozzle`, puis copiez-collez ce qui suit :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -46,7 +48,7 @@ services:
``` ```
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour ✨ __Astuce :__ ajoutez le label watchtower à chaque conteneur pour automatiser les mises à jour
```yaml [compose.yaml] ```yaml [compose.yaml]
services: services:
@@ -58,30 +60,38 @@ services:
``` ```
:: ::
Renseignez le `.env` votre nom de domaine, par exemple ### Renseigner vos variables d'environnement
Renseignez votre nom de domaine dans le fichier `.env`, par exemple :
```properties [.env] ```properties [.env]
DOMAIN=dozzle.mondomaine.fr DOMAIN=dozzle.mondomaine.fr
``` ```
Déployez le conteneur et rendez-vous sur `http://ipduserveur:9135`. Et voilà, votre instance Dozzle en webui est disponible ! Déployez le conteneur. Allez sur `http://ipdevotreserveur:9135`. Et voilà, votre interface web Dozzle est en route !
### Terminé !
::
## Exposer Dozzle avec Swag ## Exposer Dozzle avec Swag
::warning ::warning
Dozzle n'utilise pas d'authentification multifacteur. Exposer Dozzle sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/fr/serveex/security/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/fr/serveex/security/wireguard). Dozzle n'utilise pas d'authentification multifacteur. L'exposer sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faites que si vous utilisez un système d'authentification multifacteur comme [TinyAuth](/serveex/security/tinyauth) ou [Authentik](/serveex/advanced/authentik/). Sinon, ne l'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard).
:: ::
Vous aurez peut-etre envie d'y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer Dozzle via Swag. Vous voudrez peut-être accéder à Dozzle à distance et sur tous vos appareils. Pour cela, nous allons exposer Dozzle via Swag.
::note ::note{icon=""}
📋 __Au préalable :__ 📋 __Au préalable :__
<br/><br/> <br/><br/>
Nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `dozzle.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez créé un sous-domaine du type `dozzle.mondomaine.fr` dans votre [zone DNS](/general/networking/dns) avec un `CNAME` pointant vers `mondomaine.fr` et que, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), vous avez redirigé le port `443` de votre box vers le port `443` de votre serveur dans vos [règles NAT](/general/networking/nat).
:: ::
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau de Dozzle : ::steps{level="3"}
### Ajouter le réseau de Dozzle à SWAG
Allez dans Dockge et modifiez le fichier compose de SWAG pour y ajouter le réseau de Dozzle :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -89,32 +99,34 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks: # Rattache le conteneur à un réseau personnalisé
# ... # ...
- dozzle # Nom du réseau déclaré dans la stack - dozzle # Nom du réseau déclaré dans la stack
networks: # Définit le réseau custom networks: # Définit le réseau personnalisé
# ... # ...
dozzle: # Nom du réseau déclaré dans la stack dozzle: # Nom du réseau déclaré dans la stack
name: dozzle_default # Nom véritable du réseau externe name: dozzle_default # Nom réel du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe external: true # Indique qu'il s'agit d'un réseau défini à l'extérieur
``` ```
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel. Redéployez la stack en cliquant sur « Deploy » et attendez que SWAG soit pleinement opérationnel.
::note ::note
Ici nous partons du principe que le nom du réseau de Dozzle est `dozzle_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant `http://ipduserveur:81`. Nous partons du principe que le nom du réseau de Dozzle est `dozzle_default`. Vous pouvez vérifier que la connexion fonctionne en visitant le tableau de bord de SWAG sur `http://ipdevotreserveur:81`.
:: ::
Dans les dossiers de Swag, créez le fichier `dozzle.subdomain.conf`. ### Créer le fichier subdomain.conf
::tip{icon=""} Dans le dossier de Swag, créez le fichier `dozzle.subdomain.conf`.
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer et modifier vos fichiers plutôt que des commandes dans le terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/dozzle.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/dozzle.subdomain.conf
``` ```
Collez la configuration ci-dessous : Collez la configuration ci-dessous :
@@ -169,10 +181,89 @@ server {
} }
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Ente"}, puis quittez avec :kbd{value="Ctrl+X"}. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
Et voilà, vous avez exposé Dozzle ! ### Terminé !
::
Et voilà, Dozzle est maintenant exposé !
## Protéger Dozzle avec TinyAuth
Ajoutez la vérification forward-auth de [TinyAuth](/serveex/security/tinyauth) directement dans `dozzle.subdomain.conf`, de la même façon que dans [le tutoriel TinyAuth](/serveex/security/tinyauth#protecting-an-app-via-reverse-proxy) :
```nginx [dozzle.subdomain.conf]{26-38,41-42}
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name dozzle.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
#if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; }
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app dozzle;
set $upstream_port 8080;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note{to="/serveex/security/tinyauth#exposing-tinyauth-with-swag"}
Le bloc `location /tinyauth` s'exécute dans le conteneur de SWAG lui-même, SWAG doit donc être sur le réseau Docker de TinyAuth pour le joindre par son nom (`tinyauth` ici). Cela devrait déjà être en place depuis **l'exposition de TinyAuth**. Si vous rencontrez une erreur, revérifiez que le fichier compose de SWAG a toujours ce réseau rattaché.
::
::tip{icon=""} ::tip{icon=""}
Vous pouvez protéger cette app avec Authentik en ouvrant `dozzle.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). __Astuce :__ vous pouvez protéger cette application avec [Authentik](/serveex/advanced/authentik) plutôt que TinyAuth, en ouvrant `dozzle.subdomain.conf` et en retirant le `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un provider dans Authentik](/serveex/advanced/authentik#protecting-an-app-via-reverse-proxy).
:: ::
@@ -1,37 +1,37 @@
--- ---
title: Speedtest Tracker title: Speedtest Tracker
description: Installer Speedtest Tracker pour mesurer et enregistrer automatiquement la vitesse de votre connexion internet dans le temps, exposé avec SWAG. description: Installer Speedtest Tracker pour mesurer et historiser automatiquement le débit de votre connexion internet, exposé avec SWAG.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Speedtest Tracker
::note [Speedtest Tracker](https://docs.speedtest-tracker.dev/) est un conteneur qui permet de planifier des tests de débit réguliers afin d'historiser l'état de la connexion internet de votre serveur.
🎯 __Objectifs :__
- Installer Speedtest Tracker
- Exposer Speedtest Tracker avec Swag
::
[Speedtest Tracker](https://docs.speedtest-tracker.dev/) est un conteneur permettant de programmer des speedtest régulier afin d'historiser l'état de la connexion internet de votre serveur.
![speedtest-tracker](/img/serveex/speedtest-tracker.avif) ![speedtest-tracker](/img/serveex/speedtest-tracker.avif)
## Installation ## Installation
::note ::note{to="https://docs.linuxserver.io/images/docker-speedtest-tracker/"}
Nous utiliserons l'image docker maintenue par [LinuxServer.io](https://docs.linuxserver.io/images/docker-speedtest-tracker/) Nous utiliserons l'image Docker maintenue par **LinuxServer.io**
:: ::
Structure des fichiers ::file-tree
---
tree:
/:
- srv:
- docker:
- speedtest-tracker:
- compose.yaml
- .env
- data:
- config/
---
::
```text [Arborescence] ::steps{level="3"}
root ### Générer une clé d'application
└── docker
└── speedtest-tracker
└── data
└── config
```
Dans un terminal, générez une clé avec la commande suivante : Dans un terminal, générez une clé avec la commande suivante :
@@ -41,7 +41,9 @@ echo -n 'base64:'; openssl rand -base64 32;
Notez la clé. Notez la clé.
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `speedtest-tracker` puis copiez collez ceci : ### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `speedtest-tracker`, puis collez ce qui suit :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -60,51 +62,59 @@ services:
- DB_CONNECTION=sqlite - DB_CONNECTION=sqlite
- SPEEDTEST_SCHEDULE=${SCHEDULE} - SPEEDTEST_SCHEDULE=${SCHEDULE}
volumes: volumes:
- /docker/speedtest-tracker/data/config:/config - /srv/docker/speedtest-tracker/data/config:/config
``` ```
Trouvez votre `PUID` et votre `GUID` en tapant la commande suivante : ### Renseigner vos variables d'environnement
Trouvez vos `PUID` et `GUID` avec la commande suivante :
```bash [Terminal] ```bash [Terminal]
id nomdutilisateur id votreutilisateur
``` ```
Dans `.env` renseignez la variable `API_KEY` avec la clé que vous avez générée et un planning de test au format cron, ainsi que vos `PUID` et `GUID`, par exemple : Dans le fichier `.env`, renseignez la variable `API_KEY` avec la clé générée et ajoutez une planification des tests au format cron, ainsi que vos `PUID` et `GUID`, par exemple :
```properties [.env] ```properties [.env]
SCHEDULE=15 */6 * * * # toutes les 6h SCHEDULE=15 */6 * * * # toutes les 6 heures
API_KEY=base64:zihejehkj8_nzhY/OjeieR= # votre clé API_KEY=base64:zihejehkj8_nzhY/OjeieR= # votre clé
PUID=1000 PUID=1000
GUID=1000 GUID=1000
PORT=3225 # port d'accès à la webui PORT=3225 # port d'accès à l'interface web
``` ```
::tip{icon=""} ::tip{icon="" to="https://docs.speedtest-tracker.dev/getting-started/environment-variables"}
__Astuce :__ vous pouvez configurer d'autres variables d'environnements en consultant la [documentation officielle](https://docs.speedtest-tracker.dev/getting-started/environment-variables). **Astuce :** vous pouvez configurer d'autres variables d'environnement en vous référant à la **documentation officielle**.
:: ::
Déployez le conteneur et rendez-vous sur http://ipduserveur:3225. Connectez vous avec le compte `admin@exemple.com` et le mot de passe `password`. N'oubliez pas de changer votre id et votre mot de apsse une fois connecté ! Déployez le conteneur et allez sur `http://ipdevotreserveur:3225`. Connectez-vous avec le compte `admin@exemple.com` et le mot de passe `password`. N'oubliez pas de changer votre identifiant et votre mot de passe une fois connecté !
## Exposer Speedtest Tracker ### Terminé !
::
## Exposer Speedtest Tracker avec SWAG
::note ::note
📋 __Prérequis :__ <br/></br> 📋 **Prérequis :**
Nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `speedtest.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez déjà créé un sous-domaine du type `speedtest.mondomaine.fr` dans votre [zone DNS](/general/networking/dns) avec un `CNAME` pointant vers `mondomaine.fr`, et que, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), vous avez aussi redirigé le port `443` de votre box vers le port `443` de votre serveur dans vos [règles NAT](/general/networking/nat).
:: ::
Il s'agit maintenant d'exposer Speedtest Tracker sur internet, afin de pouvoir y accéder sans que vous soyez chez vous. Pour cela, nous partons du principe que vous avez configuré un sous domaine `speedtest.mondomaine.fr` dans votre zone DNS dont le `CNAME` pointe sur `mondomaine.fr`. Nous voulons maintenant exposer Speedtest Tracker sur internet pour y accéder à distance. Nous partons du principe que vous avez configuré le `CNAME` DNS de `speedtest.mondomaine.fr` pointant vers `mondomaine.fr`.
::warning ::warning
Speedtest Tracker n'utilise pas d'authentification multifacteur. Exposer Speedtest Tracker sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/fr/serveex/security/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/fr/serveex/security/wireguard). Speedtest Tracker n'utilise pas d'authentification multifacteur. L'exposer sur internet pourrait compromettre les appareils connectés. Ne le faites que si vous utilisez un système multifacteur comme [TinyAuth](/serveex/security/tinyauth) ou [Authentik](/serveex/advanced/authentik/). Sinon, évitez SWAG et préférez un VPN comme [Wireguard](/serveex/core/wireguard).
:: ::
Ouvrez le fichier speedtest.subdomain.conf : ::steps{level="3"}
### Créer le fichier subdomain.conf
Ouvrez le fichier `speedtest.subdomain.conf` :
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/speedtest.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/speedtest.subdomain.conf
``` ```
Paramétrez le comme tel : Configurez-le comme ceci :
```nginx [speedtest.subdomain.conf] ```nginx [speedtest.subdomain.conf]
## Version 2023/12/19 ## Version 2023/12/19
@@ -113,7 +123,6 @@ server {
listen 443 ssl; listen 443 ssl;
listen [::]:443 ssl; listen [::]:443 ssl;
# indique que le sous-domaine doit être dirigé
server_name speedtest.*; server_name speedtest.*;
include /config/nginx/ssl.conf; include /config/nginx/ssl.conf;
@@ -122,52 +131,44 @@ server {
#if ($lan-ip = yes) { set $geo-whitelist yes; } #if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; } #if ($geo-whitelist = no) { return 404; }
# indique que les pays dans la blacklist sont intedits
if ($geo-blacklist = no) { return 404; } if ($geo-blacklist = no) { return 404; }
# enable for ldap auth (requires ldap-location.conf in the location block) # Authentication options (uncomment as needed)
#include /config/nginx/ldap-server.conf; #include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf; #include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf; #include /config/nginx/authentik-server.conf;
location / { location / {
# enable the next two lines for http auth # Basic auth
#auth_basic "Restricted"; #auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd; #auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block) # Per-location authentication
#include /config/nginx/ldap-location.conf; #include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf; #include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf; #include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf; include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf; include /config/nginx/resolver.conf;
set $upstream_app speedtest-tracker; # Nom du conteneur set $upstream_app speedtest-tracker;
set $upstream_port 3225; # Port interne conteneur set $upstream_port 3225;
set $upstream_proto http; set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port; proxy_pass $upstream_proto://$upstream_app:$upstream_port;
} }
} }
``` ```
Sauvegardez et quittez. La configuration va se mettre à jour en quelques secondes. Enregistrez et quittez. La configuration se met à jour en quelques secondes.
### Ajouter le réseau de Speedtest Tracker à SWAG
::note ::note
Par défaut, swag ne connait pas le nom "speedtest-tracker". Pour qu'il puisse y accéder, vous devez rajouter le réseau de Speedtest Tracker dans le `compose.yml` de SWAG. Par défaut, SWAG ne connaît pas le nom « speedtest-tracker ». Pour autoriser l'accès, vous devez ajouter le réseau de Speedtest Tracker au `compose.yml` de SWAG.
:: ::
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau de Speedtest Tracker : Allez dans Dockge et modifiez le compose de SWAG pour y inclure le réseau de Speedtest Tracker :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -175,26 +176,99 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks:
# ... # ...
- speedtest-tracker # Nom du réseau déclaré dans la stack - speedtest-tracker
networks: # Définit le réseau custom networks:
# ... # ...
speedtest-tracker: # Nom du réseau déclaré dans la stack speedtest-tracker:
name: speedtest-tracker_default # Nom véritable du réseau externe name: speedtest-tracker_default
external: true # Précise que c'est un réseau à rechercher en externe external: true
``` ```
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel. Redémarrez la stack en cliquant sur « Deploy » et attendez que SWAG soit complètement démarré.
::note ::note
Ici nous partons du principe que le nom du réseau de Speedtest Tracker est `speedtest-tracker_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant `http://ipduserveur:81`. Ceci suppose que le réseau de Speedtest Tracker s'appelle `speedtest-tracker_default`. Vous pouvez vérifier la connexion en visitant le tableau de bord de SWAG sur `http://ipdevotreserveur:81`.
:: ::
Patientez puis tapez `https://speedtest.mondomaine.fr` dans votre navigateur, vous devriez être redirigé vers speedtest-tracker. Vous pouvez vérifier le statut du service via le dashboard (depuis votre réseau local, http://ipdevotreserveur:81). ### Terminé !
::
Patientez un instant, puis visitez `https://speedtest.mondomaine.fr` dans votre navigateur. Vous devriez être redirigé vers Speedtest Tracker. Vous pouvez vérifier l'état du service via le tableau de bord (`http://ipdevotreserveur:81` depuis le réseau local).
## Protéger Speedtest Tracker avec TinyAuth
Ajoutez la vérification forward-auth de [TinyAuth](/serveex/security/tinyauth) directement dans `speedtest.subdomain.conf`, de la même façon que dans [le tutoriel TinyAuth](/serveex/security/tinyauth#protecting-an-app-via-reverse-proxy) :
```nginx [speedtest.subdomain.conf]{22-34,37-38}
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name speedtest.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
#if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; }
# Authentication options (uncomment as needed)
#include /config/nginx/ldap-server.conf;
#include /config/nginx/authelia-server.conf;
#include /config/nginx/authentik-server.conf;
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
# Basic auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# Per-location authentication
#include /config/nginx/ldap-location.conf;
#include /config/nginx/authelia-location.conf;
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app speedtest-tracker;
set $upstream_port 3225;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note{to="/serveex/security/tinyauth#exposing-tinyauth-with-swag"}
Le bloc `location /tinyauth` s'exécute dans le conteneur de SWAG lui-même, SWAG doit donc être sur le réseau Docker de TinyAuth pour le joindre par son nom (`tinyauth` ici). Cela devrait déjà être en place depuis **l'exposition de TinyAuth**. Si vous rencontrez une erreur, revérifiez que le fichier compose de SWAG a toujours ce réseau rattaché.
::
::tip{icon=""} ::tip{icon=""}
✨ Vous pouvez protéger cette app avec Authentik en ouvrant `speedtest.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). ✨ Vous pouvez protéger cette application avec [Authentik](/serveex/advanced/authentik) plutôt que TinyAuth, en ouvrant `speedtest.subdomain.conf` et en décommentant
`include /config/nginx/authentik-server.conf;` et `include /config/nginx/authentik-location.conf;`.
N'oubliez pas de [créer une application et un provider dans Authentik](/serveex/advanced/authentik#protecting-an-app-via-reverse-proxy).
:: ::
+151 -76
View File
@@ -1,40 +1,37 @@
--- ---
title: Beszel title: Beszel
description: Installer Beszel pour surveiller CPU, RAM, disques et réseau de vos serveurs y compris à distance via un tableau de bord web léger. description: Installer Beszel pour surveiller CPU, RAM, disques et réseau de vos serveurs, y compris à distance, via un tableau de bord web léger.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Beszel
::note [Beszel](https://beszel.dev/) est un conteneur qui donne accès en temps réel aux informations matérielles de vos serveurs et permet leur suivi historique. Activité du processeur, occupation des disques, températures, RAM : rien n'échappe à votre surveillance. Beszel permet aussi de configurer des notifications et des alertes au dépassement des seuils que vous définissez.
🎯 __Objectifs :__
- Installer Beszel Beszel comprend un hub avec une interface web et un agent qui collecte les données de votre serveur ou d'un serveur distant.
- Monitorer le serveur local
- Monitorer un serveur distant
- Exposer Beszel avec Swag
::
[Beszel](https://beszel.dev/) est un conteneur permettant d'accéder aux informations du hardware de vos serveurs en temps réel et de les historiser. Activité CPU, usages des disques, températures, RAM, vous ne raterez rien de l'état de votre serveur. Beszel permet également de paramétrer des notifications et alertes en cas de dépassement de limites que vous avez choisies.
Beszel dispose d'un hub avec une webui et d'un agent qui permet de collecter les données depuis votre serveur ou sur un serveur distant.
![Beszel](/img/serveex/beszel.png) ![Beszel](/img/serveex/beszel.png)
## Installation ## Installation
Structure des dossiers ::file-tree
---
tree:
/:
- srv:
- docker:
- beszel:
- compose.yaml
- .env
- data/
- socket/
---
::
```text [Arborescence] ::steps{level="3"}
root ### Déployer la stack
└── docker
└── beszel
├── data
└── socket
``` Ouvrez Dockge, cliquez sur `compose`, nommez la stack `beszel`, et collez ce qui suit :
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `beszel` puis copiez collez ceci :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -59,57 +56,63 @@ services:
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
environment: environment:
LISTEN: /beszel_socket/beszel.sock LISTEN: /beszel_socket/beszel.sock
# Do not remove quotes around the key # Ne retirez pas les guillemets autour de la clé
KEY: ${KEY} KEY: ${KEY}
``` ```
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour ✨ __Astuce :__ ajoutez le label Watchtower à chaque conteneur pour automatiser les mises à jour.
```yaml [compose.yaml] ```yaml [compose.yaml]
---
services: services:
beszel: beszel:
#... #...
labels: labels:
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true
``` ```
:: ::
Renseignez le `.env`, par exemple : ### Renseigner vos variables d'environnement
Remplissez le fichier `.env`, par exemple :
```properties [.env] ```properties [.env]
PORT=8090 # port de la webui PORT=8090 # port de l'interface web
KEY= # clé privée à récupérer dans Beszel lors que vous ajoutez un système KEY= # clé privée à récupérer dans Beszel lors de l'ajout d'un système
``` ```
Pour la valeur `KEY`, il faudra lancer Beszel une première fois pour la saisir.
Déployez le conteneur et rendez-vous sur `http://ipduserveur:8090`. Et voilà, votre instance Beszel en webui est disponible ! Pour la valeur de `KEY`, il faudra lancer Beszel une première fois pour l'obtenir.
Déployez le conteneur et allez sur `http://ipdevotreserveur:8090`. Votre interface web Beszel est maintenant accessible !
### Terminé !
::
::caution ::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu. __Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
:: ::
### Ajouter les informations du serveur local ### Ajouter les informations du serveur local
Maintenant que la webui est accessible, vous devez faire remonter les informations du serveur dedans. Pour cela, il vous suffit d'ajouter une machine dans la webui et de paraméter comme ceci : Maintenant que l'interface web est accessible, il faut y pousser les informations du serveur local. Ajoutez simplement une machine via l'interface web et configurez-la ainsi :
![Beszel add system](/img/serveex/beszel-add.png) ![Beszel add system](/img/serveex/beszel-add.png)
Note la clé privée et validez. Renseignez la clé dans votre `.env` dans dockge, et redéployez la stack. Lorsque vous retournerez sur la webui, votre serveur apparaitra : Notez la clé privée et validez. Renseignez la clé dans votre fichier `.env` dans Dockge et redéployez la stack. Une fois fait, votre serveur apparaîtra dans l'interface web :
![Beszel add system](/img/serveex/beszel-system.png) ![Beszel system](/img/serveex/beszel-system.png)
### Ajouter les informations d'un serveur distant ### Ajouter un serveur distant
Vous pouvez également monitorer un serveur distant. Pour cela vous avez juste à faire tourner l'agent sur le serveur distant. Pour cela, ajoutez une nouvelle machine dans Beszel et renseignez : Vous pouvez aussi surveiller un serveur distant. Pour cela, faites tourner l'agent sur le serveur distant. Ajoutez une nouvelle machine dans Beszel et renseignez :
- Le nom qui s'affichera dans Beszel pour votre serveur distant - Le nom affiché pour votre serveur distant
- L'adresse IP ou le nom de domaine de votre serveur distant - L'adresse IP ou le nom de domaine du serveur distant
- Le port d'écoute de votre serveur distant (dans notre exemple cela sera `45876`) - Le port d'écoute (par exemple `45876`)
Beszel vous proposera de copier directement le `compose.yaml` à déployer sur votre serveur distant, ou vous pouvez le configurer comme suit : Beszel vous proposera un `compose.yaml` à déployer sur le serveur distant, ou vous pouvez utiliser :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -129,32 +132,36 @@ services:
Et dans le `.env` : Et dans le `.env` :
```properties [.env] ```properties [.env]
PORT=45876 # port de communication entre votre hub et l'agent à distance PORT=45876 # port de communication entre le hub et l'agent distant
KEY= # clé privée à récupérer dans Beszel lors que vous ajoutez un système KEY= # clé privée fournie par Beszel lors de l'ajout du système
``` ```
Déployez la stack sur votre serveur distant. Les informations du serveur distant remontront au bout de quelques secondes dans votre webui.
Déployez la stack sur le serveur distant. Les données commenceront à remonter dans l'interface web après quelques secondes.
::caution ::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu. __Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
:: ::
## Exposer Beszel avec Swag ## Exposer Beszel avec Swag
::warning ::warning
Beszel n'utilise pas d'authentification multifacteur. Exposer Beszel sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/fr/serveex/security/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/fr/serveex/security/wireguard). Beszel ne gère pas l'authentification multifacteur. L'exposer sur internet pourrait compromettre les machines connectées. Ne le faites que si vous utilisez un système comme [TinyAuth](/serveex/security/tinyauth) ou [Authentik](/serveex/advanced/authentik/). Sinon, ne l'exposez pas avec SWAG. Utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard).
:: ::
Vous aurez peut-etre envie d'y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer Beszel via Swag. Si vous voulez accéder à Beszel à distance depuis tous vos appareils, exposez-le avec Swag.
::note ::note{icon="" to="/general/networking/nat"}
📋 __Au préalable :__ 📋 __Au préalable :__
<br/><br/> <br/><br/>
Nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `beszel.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Vous devez avoir créé un sous-domaine DNS du type `beszel.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr`. À moins d'utiliser Cloudflare Zero Trust, vous devez aussi avoir redirigé le port `443` de votre box vers le port `443` de votre serveur via les **règles NAT**.
:: ::
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau de Beszel : ::steps{level="3"}
### Ajouter le réseau de Beszel à SWAG
Dans Dockge, modifiez le fichier compose de Swag et ajoutez le réseau de Beszel :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -162,34 +169,37 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks:
# ... # ...
- beszel # Nom du réseau déclaré dans la stack - beszel # réseau déclaré dans la stack
networks: # Définit le réseau custom networks:
# ... # ...
beszel: # Nom du réseau déclaré dans la stack beszel:
name: beszel_default # Nom véritable du réseau externe name: beszel_default # nom réel du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe external: true
``` ```
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel. Redéployez la stack et attendez que Swag soit pleinement opérationnel.
::note ::note
Ici nous partons du principe que le nom du réseau de beszel est `beszel_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant `http://ipduserveur:81`. Nous partons du principe que le nom du réseau est `beszel_default`. Vous pouvez vérifier la connectivité en visitant le tableau de bord de Swag sur `http://ipdevotreserveur:81`.
:: ::
Dans les dossiers de Swag, créez le fichier `beszel.subdomain.conf`. ### Créer le fichier subdomain.conf
::tip{icon=""} Dans les dossiers de configuration de Swag, créez `beszel.subdomain.conf`.
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ utilisez **File Browser Quantum** pour naviguer et modifier vos fichiers plutôt que des commandes dans le terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/beszel.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/beszel.subdomain.conf
``` ```
Collez la configuration ci-dessous :
Collez :
```nginx [beszel.subdomain.conf] ```nginx [beszel.subdomain.conf]
## Version 2023/12/19 ## Version 2023/12/19
@@ -208,27 +218,21 @@ server {
#if ($geo-whitelist = no) { return 404; } #if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; } if ($geo-blacklist = no) { return 404; }
# enable for ldap auth (requires ldap-location.conf in the location block) # enable for ldap auth
#include /config/nginx/ldap-server.conf; #include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block) # enable for Authelia
#include /config/nginx/authelia-server.conf; #include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block) # enable for Authentik
#include /config/nginx/authentik-server.conf; #include /config/nginx/authentik-server.conf;
location / { location / {
# enable the next two lines for http auth
#auth_basic "Restricted"; #auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd; #auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf; #include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf; #include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf; #include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf; include /config/nginx/proxy.conf;
@@ -237,15 +241,86 @@ server {
set $upstream_port 8090; set $upstream_port 8090;
set $upstream_proto http; set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port; proxy_pass $upstream_proto://$upstream_app:$upstream_port;
} }
} }
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Ente"}, puis quittez avec :kbd{value="Ctrl+X"}. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
Et voilà, vous avez exposé Beszel ! ### Terminé !
::
Et voilà ! Beszel est maintenant exposé !
## Protéger Beszel avec TinyAuth
Ajoutez la vérification forward-auth de [TinyAuth](/serveex/security/tinyauth) directement dans `beszel.subdomain.conf`, de la même façon que dans [le tutoriel TinyAuth](/serveex/security/tinyauth#protecting-an-app-via-reverse-proxy) :
```nginx [beszel.subdomain.conf]{26-38,41-42}
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name beszel.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
#if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; }
# enable for ldap auth
#include /config/nginx/ldap-server.conf;
# enable for Authelia
#include /config/nginx/authelia-server.conf;
# enable for Authentik
#include /config/nginx/authentik-server.conf;
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
#include /config/nginx/ldap-location.conf;
#include /config/nginx/authelia-location.conf;
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app beszel;
set $upstream_port 8090;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note{to="/serveex/security/tinyauth#exposing-tinyauth-with-swag"}
Le bloc `location /tinyauth` s'exécute dans le conteneur de SWAG lui-même, SWAG doit donc être sur le réseau Docker de TinyAuth pour le joindre par son nom (`tinyauth` ici). Cela devrait déjà être en place depuis **l'exposition de TinyAuth**. Si vous rencontrez une erreur, revérifiez que le fichier compose de SWAG a toujours ce réseau rattaché.
::
::tip{icon=""} ::tip{icon=""}
✨ Vous pouvez protéger cette app avec Authentik en ouvrant `beszel.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). ✨ Vous pouvez protéger cette application avec [Authentik](/serveex/advanced/authentik) plutôt que TinyAuth, en ouvrant `beszel.subdomain.conf` et en retirant le `#` devant `include /config/nginx/authentik-server.conf;` et `include /config/nginx/authentik-location.conf;`. N'oubliez pas de [créer une application et un provider dans Authentik](/serveex/advanced/authentik#protecting-an-app-via-reverse-proxy).
:: ::
+132 -43
View File
@@ -1,34 +1,34 @@
--- ---
title: UpSnap title: UpSnap
description: Installer UpSnap pour allumer à distance des machines de votre réseau local via Wake-on-LAN, exposé avec SWAG. description: Installer UpSnap pour réveiller à distance les machines de votre réseau local via Wake-on-LAN, exposé avec SWAG.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# UpSnap
::note [UpSnap](https://github.com/seriousm4x/UpSnap) est un conteneur qui permet d'allumer, d'éteindre ou de mettre en veille vos machines à distance. Il utilise principalement le Wake-On-Lan (WoL) sur le réseau et propose des fonctions avancées.
🎯 __Objectifs :__
- Installer UpSnap
- Exposer UpSnap avec Swag
::
[UpSnap](https://github.com/seriousm4x/UpSnap) est un conteneur permettant d'allumer, éteindre, ou mettre en veille vos machines à distance. Il utilise essentiellement le systeme de Wake-On-Lan (WoL) par le réseau et dispose d'autres fonctions avancées.
![Beszel](/img/serveex/upsnap.webp) ![Beszel](/img/serveex/upsnap.webp)
## Installation ## Installation
Structure des dossiers ::file-tree
---
tree:
/:
- srv:
- docker:
- upsnap:
- compose.yaml
- .env
- data/
---
::
```text [Arborescence] ::steps{level="3"}
root ### Déployer la stack
└── docker
└── upsnap
└── data
```
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `upsnap` puis copiez collez ceci : Ouvrez Dockge, cliquez sur `compose`, nommez la stack `upsnap`, puis copiez-collez ce qui suit :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -39,7 +39,7 @@ services:
network_mode: host network_mode: host
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- /docker/upsnap/data:/app/pb_data - /srv/docker/upsnap/data:/app/pb_data
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
- UPSNAP_SCAN_RANGE=${SCAN_RANGE} - UPSNAP_SCAN_RANGE=${SCAN_RANGE}
@@ -54,7 +54,7 @@ services:
``` ```
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour ✨ __Astuce :__ ajoutez le label watchtower à chaque conteneur pour automatiser les mises à jour
```yaml [compose.yaml] ```yaml [compose.yaml]
services: services:
@@ -66,36 +66,44 @@ services:
``` ```
:: ::
Renseignez le `.env`, par exemple : ### Renseigner vos variables d'environnement
Remplissez le `.env`, par exemple :
```properties [.env] ```properties [.env]
RANGE=192.168.1.0/24 # scan toutes les machines sur le réseau local ayant une adresse IP comprise entre 192.168.0.1 et 192.168.1.255 RANGE=192.168.1.0/24 # scanne tous les appareils du réseau local ayant une IP entre 192.168.0.1 et 192.168.1.255
DNS=192.168.1.1 # IP du dns à utiliser pour résoudre les noms de domaines, ici dans l'exemple c'est généralement l'IP du routeur DNS=192.168.1.1 # IP du DNS pour résoudre les noms de domaine, typiquement l'IP de votre box
``` ```
Déployez le conteneur et rendez-vous sur `http://ipduserveur:8095`. Vous n'avez plus qu'à suivre les instructions pour créer votre compte ! Déployez le conteneur et allez sur `http://ipdevotreserveur:8095`. Suivez simplement les étapes pour créer votre compte !
### Terminé !
::
::caution ::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu. __Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
:: ::
## Exposer UpSnap avec Swag ## Exposer UpSnap avec Swag
::warning ::warning
UpSnap n'utilise pas d'authentification multifacteur. Exposer UpSnap sur internet pourrait compromettre les machines auxquel il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/fr/serveex/security/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/fr/serveex/security/wireguard). UpSnap ne gère pas l'authentification multifacteur. L'exposer sur internet pourrait compromettre les machines connectées. Ne le faites que si vous utilisez un système d'authentification multifacteur comme [TinyAuth](/serveex/security/tinyauth) ou [Authentik](/serveex/advanced/authentik/). Sinon, évitez de l'exposer avec SWAG et utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard).
:: ::
Vous aurez peut-etre envie d'y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer UpSnap via Swag. Vous voudrez peut-être y accéder à distance depuis tous vos appareils. Pour cela, nous allons exposer UpSnap via Swag.
::note ::note{icon=""}
📋 __Au préalable :__ 📋 __Au préalable :__
<br/><br/> <br/><br/>
Nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `upsnap.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez créé un sous-domaine dans votre [zone DNS](/general/networking/dns), du type `upsnap.mondomaine.fr` avec un `CNAME` vers `mondomaine.fr`. Par ailleurs, à moins d'utiliser Cloudflare Zero Trust, vous devriez déjà avoir redirigé le port `443` de votre box vers le port `443` de votre serveur dans vos [règles NAT](/general/networking/nat).
:: ::
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau de UpSnap : ::steps{level="3"}
### Ajouter le réseau d'UpSnap à SWAG
Allez dans Dockge et modifiez le compose de SWAG en y ajoutant le réseau d'UpSnap :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -103,34 +111,36 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks: # Rattache le conteneur au réseau personnalisé
# ... # ...
- upsnap # Nom du réseau déclaré dans la stack - upsnap # Nom du réseau déclaré dans la stack
networks: # Définit le réseau custom networks: # Définit le réseau personnalisé
# ... # ...
upsnap: # Nom du réseau déclaré dans la stack upsnap: # Nom du réseau déclaré dans la stack
name: upsnap_default # Nom véritable du réseau externe name: upsnap_default # Nom réel du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe external: true # Indique qu'il s'agit d'un réseau externe
``` ```
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel. Redémarrez la stack en cliquant sur « deploy » et attendez que SWAG soit pleinement opérationnel.
::note ::note
Ici nous partons du principe que le nom du réseau de upsnap est `upsnap_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant `http://ipduserveur:81`. Nous partons ici du principe que le nom du réseau d'upsnap est `upsnap_default`. Vous pouvez vérifier la connexion dans le tableau de bord de SWAG sur `http://ipdevotreserveur:81`.
:: ::
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `upsnap.subdomain.conf`. Dans les dossiers de Swag, créez le fichier `upsnap.subdomain.conf`.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. ✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichiers et éditer vos documents plutôt que des commandes dans le terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/upsnap.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/upsnap.subdomain.conf
``` ```
Collez la configuration ci-dessous : Et collez la configuration suivante :
```nginx [upsnap.subdomain.conf] ```nginx [upsnap.subdomain.conf]
## Version 2023/12/19 ## Version 2023/12/19
@@ -183,10 +193,89 @@ server {
} }
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Ente"}, puis quittez avec :kbd{value="Ctrl+X"}. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
Et voilà, vous avez exposé UpSnap ! ### Terminé !
::
Et voilà ! Vous avez exposé UpSnap !
## Protéger UpSnap avec TinyAuth
Ajoutez la vérification forward-auth de [TinyAuth](/serveex/security/tinyauth) directement dans `upsnap.subdomain.conf`, de la même façon que dans [le tutoriel TinyAuth](/serveex/security/tinyauth#protecting-an-app-via-reverse-proxy) :
```nginx [upsnap.subdomain.conf]{26-38,41-42}
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name upsnap.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
#if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; }
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app upsnap;
set $upstream_port 8095;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note{to="/serveex/security/tinyauth#exposing-tinyauth-with-swag"}
Le bloc `location /tinyauth` s'exécute dans le conteneur de SWAG lui-même, SWAG doit donc être sur le réseau Docker de TinyAuth pour le joindre par son nom (`tinyauth` ici). Cela devrait déjà être en place depuis **l'exposition de TinyAuth**. Si vous rencontrez une erreur, revérifiez que le fichier compose de SWAG a toujours ce réseau rattaché.
::
::tip{icon=""} ::tip{icon=""}
✨ Vous pouvez protéger cette app avec Authentik en ouvrant `upsnap.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). ✨ Vous pouvez protéger cette application avec [Authentik](/serveex/advanced/authentik) plutôt que TinyAuth, en ouvrant `upsnap.subdomain.conf` et en retirant le `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un provider dans Authentik](/serveex/advanced/authentik#protecting-an-app-via-reverse-proxy).
:: ::
+264
View File
@@ -0,0 +1,264 @@
---
title: Jellyfin
description: Installer Jellyfin, un serveur multimédia libre et open source, pour diffuser vos films et séries depuis n'importe où sans abonnement payant.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
![Jellyfin](/img/serveex/jellyfin.png)
[Jellyfin](https://jellyfin.org) est une alternative libre et open source à Plex et Emby. Contrairement à Plex, il n'a pas d'offre payante, pas de télémétrie, et n'exige pas de compte en ligne pour utiliser ou administrer votre serveur : tout tourne en local et reste chez vous.
Il couvre les mêmes bases : une médiathèque avec métadonnées et jaquettes, le transcodage (accélération matérielle comprise), et des applications pour TV, Android, iOS, Windows et macOS.
Comme toujours, nous utiliserons l'[image linuxserver.io](https://docs.linuxserver.io/images/docker-jellyfin).
::note{to="/serveex/core/wireguard"}
Contrairement à Plex, Jellyfin n'a pas de relais cloud : pour accéder à votre serveur en dehors de votre réseau local, vous devez l'exposer vous-même (voir plus bas), ou utiliser un VPN comme **Wireguard**.
::
## Installer Jellyfin
::file-tree
---
tree:
/:
- srv:
- docker:
- jellyfin:
- compose.yaml
- .env
- config/
- media:
- tvseries/
- movies/
- library/
---
::
::steps{level="3"}
### Créer les dossiers média
Créez les dossiers `movies`, `tvseries` et `library` dans `/media` :
```bash [Terminal]
mkdir -p /media/movies /media/library /media/tvseries
```
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `jellyfin`, et ajoutez la configuration suivante :
```yaml [compose.yaml]
---
services:
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
- PUID=${PUID}
- PGID=${GUID}
- TZ=Europe/Paris
volumes:
- /srv/docker/jellyfin/config:/config
- /media:/media
restart: unless-stopped
devices:
- /dev/dri:/dev/dri
ports:
- 8096:8096
```
::tip{icon=""}
✨ Ajoutez le label Watchtower pour automatiser les mises à jour :
```yaml [compose.yaml]
---
services:
jellyfin:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
### Renseigner vos variables d'environnement
Trouvez vos PUID et GUID en lançant :
```bash [Terminal]
id utilisateur
```
Remplissez votre fichier `.env` avec les valeurs récupérées, par exemple :
```properties [.env]
PUID=1000
GUID=1000
```
Déployez la stack. L'interface locale est disponible sur `http://ipdevotreserveur:8096`.
::note{to="https://docs.linuxserver.io/images/docker-jellyfin/#hardware-acceleration"}
Le périphérique `/dev/dri` n'est nécessaire que pour le transcodage accéléré matériellement sur GPU Intel/AMD. Retirez-le si votre serveur n'en a pas, ou adaptez-le pour un GPU NVIDIA en suivant la **documentation de linuxserver.io**.
::
### Terminé !
::
## Configurer Jellyfin
À la première visite, Jellyfin vous guide dans un assistant de configuration :
- Choisissez une langue d'affichage et créez votre compte administrateur.
- Ajoutez une médiathèque, en pointant `/media/movies` pour les films et `/media/tvseries` pour les séries.
Et voilà ! Ajoutez vos médias dans `/media/movies` et `/media/tvseries` sur votre serveur. Voir plus bas pour commencer à regarder, à la maison ou à distance.
::note{to="/general/networking/samba"}
Si vos médias sont stockés sur un disque réseau (un NAS ou un disque dur externe accessible par le réseau), reportez-vous au **guide de montage Samba** pour que Jellyfin puisse y accéder.
::
## Transcodage matériel
Jellyfin réencode la vidéo à la volée dès qu'un client ne peut pas lire un fichier tel quel : la résolution de l'écran de l'appareil est inférieure à celle de la source, sa connexion réseau est trop lente pour le débit du fichier, ou il ne prend pas en charge le codec, le format HDR ou le type de sous-titres du fichier. C'est ce qu'on appelle le **transcodage**. Fait uniquement en logiciel, sur le processeur, c'est lent et cela peut saturer un serveur modeste avec seulement un ou deux flux simultanés. Le **transcodage matériel** délègue ce travail au GPU intégré à votre processeur (Intel QuickSync, sur la plupart du matériel de homelab), qui s'en occupe bien plus vite et laisse le CPU libre pour tout le reste.
Le **tone mapping** est une fonction liée mais distincte : convertir une vidéo HDR (qui a besoin d'un écran HDR compatible pour rendre correctement) en SDR pour qu'elle s'affiche correctement sur un écran, une TV ou un client qui ne gère pas le HDR, au lieu de paraître délavée ou trop sombre.
::note{to="https://docs.linuxserver.io/images/docker-jellyfin/#hardware-acceleration"}
Cela ne concerne que les GPU intégrés Intel (et certains AMD) passés au conteneur avec `/dev/dri`, déjà présent dans le `compose.yaml` de ce tutoriel. Les GPU NVIDIA demandent une configuration entièrement différente, traitée dans la **documentation de linuxserver.io**. Si votre serveur n'a pas de GPU compatible, le transcodage fonctionne quand même, entièrement sur le CPU.
::
::steps{level="3"}
### Ajouter le mod OpenCL
Le tone mapping a spécifiquement besoin d'un runtime OpenCL Intel, que cette image n'embarque pas par défaut. Ajoutez le mod dédié à votre `compose.yaml` :
```yaml [compose.yaml]
services:
jellyfin:
environment:
- DOCKER_MODS=linuxserver/mods:jellyfin-opencl-intel
```
::note
N'utilisez pas le mod générique `universal-package-install` avec `intel-opencl-icd` pour ça : il installe un runtime plus ancien issu des dépôts d'Ubuntu, connu pour causer des bugs de tone mapping. Le mod dédié en fournit un plus récent et prévu pour.
::
Redéployez la stack pour que le mod prenne effet.
### Activer l'accélération matérielle
Dans Jellyfin, allez dans _Tableau de bord > Lecture_ et réglez **Accélération matérielle** sur **Intel QuickSync (QSV)** (ou **VA-API**, si QSV n'est pas disponible pour votre génération de processeur).
Décochez ensuite tout codec que votre GPU ne sait pas décoder matériellement. La [page d'accélération matérielle Intel](https://jellyfin.org/docs/general/administration/hardware-acceleration/intel/) liste précisément les codecs pris en charge par chaque génération de processeur.
### Activer le tone mapping
Plus bas sur la même page, activez le **Tone mapping**. Il ne prend effet qu'une fois le mod OpenCL ci-dessus installé et la stack redéployée ; l'activer sans cette étape préalable fera échouer les transcodages HDR au lieu de simplement ignorer le tone mapping.
### Terminé !
::
## Regarder à la maison
Tant que vous êtes connecté à votre réseau domestique (Wi-Fi ou Ethernet, sur le même réseau local que votre serveur), aucune exposition ni VPN n'est nécessaire. Utilisez [Moonfin](https://github.com/Moonfin-Client/Moonfin-Core) partout où il est disponible (téléphones, tablettes, Android TV/Google TV, ordinateur, web) plutôt que l'application Jellyfin officielle : il a la même apparence et le même fonctionnement partout, et peut synchroniser vos réglages entre appareils via son propre plugin serveur. Connectez-vous sur `http://iplandevotreserveur:8096`.
Samsung Tizen et LG webOS ont droit à une [application Moonfin](https://github.com/Moonfin-Client/Smart-TV) séparée et dédiée (même nom, base de code différente), et l'Apple TV est mieux servie par [Neptune](https://apps.apple.com/us/app/neptune-media-player/id6756797773), un client tvOS dédié avec décodage natif HEVC/AV1/VP9 et passthrough Atmos complet. Là où aucun de ces clients n'existe (Fire TV, Roku, Kodi), voir le tableau ci-dessous :
| Plateforme | Application recommandée |
|----------|-----------------|
| Téléphone / Tablette (Android, iOS) | [Moonfin](https://github.com/Moonfin-Client/Moonfin-Core) (Play Store / App Store) |
| Android TV / Google TV | [Moonfin](https://github.com/Moonfin-Client/Moonfin-Core) (Play Store ou APK) |
| Apple TV | [Neptune](https://apps.apple.com/us/app/neptune-media-player/id6756797773) (App Store) |
| Samsung Tizen / LG webOS | [Moonfin](https://github.com/Moonfin-Client/Smart-TV) (sideloadé) ; les applications officielles existent mais sont en retard |
| Fire TV | Application Jellyfin officielle (Amazon Appstore) |
| Roku | Application Jellyfin officielle |
| Kodi | [Jellyfin pour Kodi](https://jellyfin.org/docs/general/clients/kodi/) (synchronise votre médiathèque dans Kodi), ou [JellyCon](https://github.com/jellyfin/jellycon) pour les boîtiers plus légers en streaming seul |
::caution
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
## Regarder en dehors de chez soi
::warning
Jellyfin ne sera pas exposé sur internet dans ce site, contrairement à la plupart des autres applications. Ses applications natives (téléphone, TV, Chromecast...) dialoguent directement avec son API plutôt qu'avec un navigateur, si bien qu'une couche de forward-auth comme [TinyAuth](/serveex/security/tinyauth) ou [Authentik](/serveex/advanced/authentik) ne peut pas se placer devant sans casser la connexion et la lecture sur ces clients, et Jellyfin lui-même n'a ni 2FA ni OIDC intégré pour compenser. Plutôt que de l'exposer, nous l'atteindrons donc via le [VPN WireGuard](/serveex/core/wireguard) déjà mis en place plus tôt dans ce guide.
::
Plutôt que de faire passer tout le trafic d'un appareil par le VPN, ou même tout le sous-réseau VPN `10.8.0.0/24`, nous utiliserons un **split tunnel** plus serré : chaque appareil distant ne route par le tunnel que le trafic destiné à l'adresse VPN de votre serveur. Tout le reste (navigation, autres applications) reste sur la connexion normale de l'appareil, et le VPN ne sert jamais qu'à joindre cette seule machine.
::note{to="/serveex/core/wireguard#client-server-setup"}
Ceci suppose que votre serveur Jellyfin fait déjà tourner son propre client WireGuard, le reliant à votre VPN comme décrit dans **Client Server Setup**. Notez l'adresse VPN que wg-easy lui a attribuée (par exemple `10.8.0.2`) ; c'est l'adresse que viseront tous les appareils ci-dessous.
::
::caution{to="#restreindre-un-pair-tiers-à-jellyfin-uniquement"}
Ce split tunnel est une convention côté client, pas une frontière de sécurité imposée par le serveur : `AllowedIPs` est un réglage de routage, et wg-easy n'ajoute aucune règle de pare-feu pour l'appuyer par défaut. Quiconque a accès à un appareil (ou à son fichier `.conf`) pourrait remettre `AllowedIPs` sur quelque chose de plus large et atteindre tout ce que votre serveur WireGuard sait router, y compris les autres pairs connectés. Si un pair est l'un de vos propres appareils, c'est en général un risque acceptable. Si vous confiez un pair à un tiers (un ami, un membre de la famille) qui ne doit jamais atteindre que Jellyfin, voir **Restreindre un pair tiers à Jellyfin uniquement** plus bas pour une façon de l'imposer réellement côté serveur.
::
::steps{level="3"}
### Créer un client dans wg-easy pour chaque appareil
En suivant [Récupérer les fichiers de configuration](/serveex/core/wireguard#retrieve-configuration-files), créez un client par appareil (téléphone, ordinateur, TV/boîtier multimédia) et téléchargez son fichier de configuration.
### Restreindre le tunnel au seul serveur
Ouvrez chaque fichier `.conf` téléchargé et remplacez sa ligne `AllowedIPs` pour qu'elle ne couvre que l'adresse VPN de votre serveur Jellyfin, en `/32` (une seule IP, pas une plage) :
```properties [wg0.conf]
AllowedIPs = 10.8.0.2/32
```
::note
Remplacez `10.8.0.2` par l'adresse que votre serveur a réellement obtenue. Laisser le `10.8.0.0/24` par défaut ici ferait passer par le tunnel le trafic de tous les pairs VPN, pas seulement de votre serveur.
::
### Importer la configuration sur chaque appareil
- **Téléphone :** installez l'application WireGuard, puis importez le fichier `.conf` modifié (ou scannez un QR code généré à partir de celui-ci).
- **Ordinateur :** installez le [client WireGuard](https://www.wireguard.com/install/) et importez le fichier.
- **TV :** si elle tourne sous Android TV ou Google TV, installez WireGuard depuis le Play Store. Copiez le fichier `.conf` sur une clé USB, branchez-la sur la TV ou le boîtier, puis utilisez l'option **Ajouter depuis un fichier** de l'application pour parcourir la clé et l'importer. La plupart des autres systèmes de TV (Tizen, webOS...) ne peuvent pas installer de client VPN directement, passez donc plutôt par un appareil qui a déjà le tunnel actif (un boîtier Android TV, ou du cast depuis un téléphone ou un ordinateur connecté).
::warning
Un fichier `.conf` est un identifiant, pas un simple fichier de réglages : quiconque le possède peut se connecter à votre VPN en tant que cet appareil. Une fois importé, supprimez-le de la clé USB (et de partout où vous l'avez copié, comme les dossiers Téléchargements), et ne le partagez jamais avec qui que ce soit.
::
### Terminé !
::
### Restreindre un pair tiers à Jellyfin uniquement
[wg-easy](/serveex/core/wireguard) (v15.3+) sait l'imposer lui-même, avec une vraie règle de pare-feu à l'intérieur de son propre conteneur plutôt qu'un réglage côté client. C'est la bonne approche quand le pair appartient à quelqu'un d'autre, et non à l'un de vos appareils.
::steps{level="4"}
#### Activer le pare-feu par client
Dans le panneau d'administration de [wg-easy](/serveex/core/wireguard), allez dans les réglages de l'interface et activez **Per-Client Firewall**. Il est marqué expérimental, mais fonctionne en générant une chaîne `iptables` dédiée dans le conteneur wg-easy.
#### Restreindre la destination autorisée du pair
Modifiez le client du tiers et réglez ses **Firewall Allowed IPs** sur l'adresse VPN de votre serveur Jellyfin, par exemple `10.8.0.2`, ou plus restrictif encore, `10.8.0.2:8096/tcp` pour restreindre aussi le port et le protocole.
::note
Laisser ce champ vide retombe sur les `AllowedIPs` du client, ce qui n'est pas restrictif : il doit être renseigné explicitement pour ce pair. Cela coupe aussi l'accès internet classique de ce pair à travers le tunnel, puisque seul le trafic vers Jellyfin est désormais autorisé, ce qui est bien l'effet recherché pour un pair invité.
::
#### Vérifier que la règle est appliquée
```bash [Terminal]
docker exec wg-easy iptables -L WG_CLIENTS -n -v
```
Vous devriez voir une ligne `ACCEPT` pour l'IP de ce pair pointant uniquement vers votre serveur Jellyfin, suivie d'un `DROP` fourre-tout.
#### Terminé !
::
Une fois connecté, ouvrez l'application Jellyfin ou `http://10.8.0.2:8096` (l'adresse VPN de votre serveur) depuis cet appareil. Seul le trafic vers cette adresse passe par le VPN, le reste de la connexion de l'appareil n'est pas touché.
+12 -19
View File
@@ -3,15 +3,8 @@ title: Qbittorrent
description: Installer qBittorrent avec Gluetun et ProtonVPN pour télécharger des torrents de manière sécurisée derrière un VPN sur votre serveur auto-hébergé. description: Installer qBittorrent avec Gluetun et ProtonVPN pour télécharger des torrents de manière sécurisée derrière un VPN sur votre serveur auto-hébergé.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Qbittorrent
::note
🎯 __Objectifs :__
- Installer et configurer Qbittorrent
- Etre relié au réseau bittorent en toute sécurité avec Gluetun et Proton VPN
::
![Picture](/img/serveex/qbit-vue.jpeg) ![Picture](/img/serveex/qbit-vue.jpeg)
@@ -73,7 +66,7 @@ services:
- GSP_QBT_USERNAME=${ID} - GSP_QBT_USERNAME=${ID}
- GSP_QBT_PASSWORD=${PW} - GSP_QBT_PASSWORD=${PW}
volumes: volumes:
- /docker/seedbox/qbittorrent/config:/config - /srv/docker/seedbox/qbittorrent/config:/config
- /media:/media - /media:/media
depends_on: depends_on:
- gluetun - gluetun
@@ -84,7 +77,7 @@ services:
restart: unless-stopped restart: unless-stopped
mem_limit: 4g mem_limit: 4g
volumes: volumes:
- /docker/gluetun/config.toml:/gluetun/auth/config.toml:ro - /srv/docker/gluetun/config.toml:/gluetun/auth/config.toml:ro
devices: devices:
- /dev/net/tun:/dev/net/tun - /dev/net/tun:/dev/net/tun
ports: ports:
@@ -134,16 +127,16 @@ A cet effet, ouvrez un terminal. Nous allons à présent générer une clé d'au
sudo docker run --rm qmcgaw/gluetun genkey sudo docker run --rm qmcgaw/gluetun genkey
``` ```
Notez la clé. Puis créez le dossier `/docker/gluetun` Notez la clé. Puis créez le dossier `/srv/docker/gluetun`
```bash [Terminal] ```bash [Terminal]
sudo mkdir /docker/gluetun sudo mkdir /srv/docker/gluetun
``` ```
Et créez le fichier `config.toml` Et créez le fichier `config.toml`
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/gluetun/config.toml sudo nano /srv/docker/gluetun/config.toml
``` ```
Éditez le comme suit en ajoutant la clée que vous avez générée : Éditez le comme suit en ajoutant la clée que vous avez générée :
@@ -205,14 +198,14 @@ Lorsque vous lancez un téléchargement, n'oubliez pas de préciser le bon répe
::warning ::warning
Qbitorrent n'utilise pas d'authentification multifacteur. Exposer Qbitorrent sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/fr/serveex/security/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/fr/serveex/security/wireguard). Qbitorrent n'utilise pas d'authentification multifacteur. Exposer Qbitorrent sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/serveex/advanced/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard).
:: ::
Afin de lancer des téléchargement hors de chez vous, sans VPN, vous pouvez exposer la webui de Qbittorrent. Afin de lancer des téléchargement hors de chez vous, sans VPN, vous pouvez exposer la webui de Qbittorrent.
::note ::note
Nous partons du principe que vous avez le sous-domaine `seedbox.mondomaine.fr` avec un `CNAME` qui pointe vers `mondomaine.fr` dans [zone DNS](/fr/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez le sous-domaine `seedbox.mondomaine.fr` avec un `CNAME` qui pointe vers `mondomaine.fr` dans [zone DNS](/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur dans [les règles NAT](/general/networking/nat).
:: ::
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau de Gluetun : Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau de Gluetun :
@@ -243,12 +236,12 @@ Ici nous partons du principe que le nom du réseau de la seedbox est `seedbox_de
Puis nous allons créer et éditer le fichier `seedbox.subdomain.conf`. Puis nous allons créer et éditer le fichier `seedbox.subdomain.conf`.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce pour les allergiques au terminal :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. ✨ __Astuce pour les allergiques au terminal :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/seedbox.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/seedbox.subdomain.conf
``` ```
Copiez la configuration ci-dessous, en prenant soin de vérifier le port : Copiez la configuration ci-dessous, en prenant soin de vérifier le port :
@@ -304,7 +297,7 @@ server {
} }
``` ```
::tip{icon=""} ::tip{icon=""}
✨ Vous pouvez protéger cette app avec Authentik en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). ✨ Vous pouvez protéger cette app avec Authentik en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/serveex/advanced/authentik#protéger-une-app-par-reverse-proxy).
:: ::
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}. Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
+14 -20
View File
@@ -1,16 +1,10 @@
--- ---
title: Automatisation title: Automatisation
description: Automatiser les téléchargements de médias avec la suite Servarr Radarr, Sonarr, Bazarr, Prowlarr et Overseerr pour films et séries. description: Automatiser les téléchargements de médias avec la suite Servarr, Radarr, Sonarr, Bazarr, Prowlarr et Overseerr pour films et séries.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Servarr
::note
🎯 __Objectifs :__
Automatiser les téléchargements de films et de séries avec Radarr, Sonarr, Bazarr, Prowlarr et Overseerr.
::
[Servarr](https://wiki.servarr.com/) est une collection d'applications développées dans le but d'automatiser le téléchargement, la mise à jour et la gestions des media. Ici nous allons porter notre attention sur les films et séries avec comme objectif : [Servarr](https://wiki.servarr.com/) est une collection d'applications développées dans le but d'automatiser le téléchargement, la mise à jour et la gestions des media. Ici nous allons porter notre attention sur les films et séries avec comme objectif :
@@ -76,8 +70,8 @@ services:
- VERSION=docker - VERSION=docker
- PLEX_CLAIM= #optional - PLEX_CLAIM= #optional
volumes: volumes:
- /docker/plex/config:/config - /srv/docker/plex/config:/config
- /docker/plex/transcode:/transcode #optional - /srv/docker/plex/transcode:/transcode #optional
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
labels: labels:
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true
@@ -93,7 +87,7 @@ services:
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/tautulli/config:/config - /srv/docker/tautulli/config:/config
ports: ports:
- 8181:8181 - 8181:8181
restart: unless-stopped restart: unless-stopped
@@ -106,7 +100,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/sonarr/config:/config - /srv/docker/sonarr/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
ports: ports:
- 8989:8989 - 8989:8989
@@ -120,7 +114,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/radarr/config:/config - /srv/docker/radarr/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
ports: ports:
- 7878:7878 - 7878:7878
@@ -134,7 +128,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/prowlarr/data:/config - /srv/docker/prowlarr/data:/config
ports: ports:
- 9696:9696 - 9696:9696
restart: unless-stopped restart: unless-stopped
@@ -150,7 +144,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/overseerr/config:/config - /srv/docker/overseerr/config:/config
ports: ports:
- 5055:5055 - 5055:5055
restart: unless-stopped restart: unless-stopped
@@ -164,7 +158,7 @@ services:
- PGID=1000 - PGID=1000
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/bazarr/config:/config - /srv/docker/bazarr/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
ports: ports:
- 6767:6767 - 6767:6767
@@ -389,7 +383,7 @@ Il peut etre intéressant d'exposer Overseerr, si vous souhaitez pouvoir faire d
::note ::note
Nous partons du principe que vous avez le sous-domaine `films.mondomaine.fr` avec un `CNAME` qui pointe vers `films.fr` dans [zone DNS](/fr/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez le sous-domaine `films.mondomaine.fr` avec un `CNAME` qui pointe vers `films.fr` dans [zone DNS](/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur dans [les règles NAT](/general/networking/nat).
:: ::
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau d'overseer, qui est celui de Plex car dans la stack Plex : Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau d'overseer, qui est celui de Plex car dans la stack Plex :
@@ -420,12 +414,12 @@ Ici nous partons du principe que le nom du réseau de Tautulli est `plex_default
Créez le fichier `films.subdomain.conf` et éditez le : Créez le fichier `films.subdomain.conf` et éditez le :
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. ✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/films.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/films.subdomain.conf
``` ```
Collez la configuration suivante : Collez la configuration suivante :
+91 -47
View File
@@ -3,61 +3,69 @@ title: Immich
description: Installer Immich, une alternative auto-hébergée à Google Photos et iCloud avec reconnaissance faciale, géolocalisation et synchronisation multi-appareils. description: Installer Immich, une alternative auto-hébergée à Google Photos et iCloud avec reconnaissance faciale, géolocalisation et synchronisation multi-appareils.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Immich
::note [Immich](https://immich.app/docs/overview/introduction) est une solution auto-hébergée de gestion de photos et de vidéos qui remplace les services cloud comme Google Photos ou iCloud. Elle propose des fonctions puissantes comme la reconnaissance faciale et la géolocalisation.
🎯 __Objectifs :__ installer [Immich](https://immich.app/docs/overview/introduction) pour gérer vos photos sur tout vos appareils.
::
[Immich](https://immich.app/docs/overview/introduction) est une solution de gestion de photos et de vidéos que vous pouvez installer directement sur votre serveur. Cette solution remplace les clouds type Google Photo ou iCloud. Elle dispose de nombreuse fonctionnalités comme la reconnaissance de visage ou la géolocalisation.
![Picture](/img/serveex/immich.png) ![Picture](/img/serveex/immich.png)
## Installation ## Installation
Structure des dossiers
```text [Arborescence] ::file-tree
root ---
└── docker tree:
└── immich /:
├── library - srv:
├── compose.yaml - docker:
└── .env - immich:
``` - library/
- compose.yaml
- .env
---
::
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `immich` puis copiez collez le contenu du dernier `docker-compose.yml` [publié ici](https://github.com/immich-app/immich/blob/main/docker/docker-compose.yml). ::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `immich`, puis copiez-collez le dernier `docker-compose.yml` [publié ici](https://github.com/immich-app/immich/blob/main/docker/docker-compose.yml).
::warning ::warning
__Attention__ : n'ajoutez pas le label de Watchtower à la stack d'Immich. Immich étant une solution en perpetuelle évolution, des mises à jour automatiques risqueraient de casser votre installation. __Attention__ : n'ajoutez pas le label Watchtower à la stack Immich. Immich évolue rapidement, et les mises à jour automatiques peuvent casser votre installation.
:: ::
Configurer le `.env` en copiant collant le contenu de la dernière version [publiée ici](https://github.com/immich-app/immich/blob/main/docker/example.env) et suivez les commentaires indiqués dans le fichier. ### Renseigner vos variables d'environnement
::note Configurez le fichier `.env` en copiant la dernière version [depuis ici](https://github.com/immich-app/immich/blob/main/docker/example.env) et suivez les commentaires du fichier.
Si vous avez un NAS ou un disque réseau partagé via [samba](/fr/general/networking/samba) pour stocker vos données, remplacez la valeur de `UPLOAD_LOCATION`{lang=properties} par le chemin d'accès de votre dossier partagé. ::note{to="/general/networking/samba/"}
Si vous utilisez un NAS ou un disque partagé sur le réseau via **Samba** pour stocker vos données, remplacez la valeur de `UPLOAD_LOCATION`{lang=properties} par le chemin de votre dossier partagé.
:: ::
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ si votre CPU/iGPU/GPU le supporte, Immich permet d'utiliser l'accélération matérielle pour lire les vidéos ou pour la reconnaissance d'images. Ces fonctionnalités peuvent tripler les performances d'Immich. Plus d'infos sur le [Transcoding](https://immich.app/docs/features/hardware-transcoding/) et sur le [Machine learning](https://immich.app/docs/features/ml-hardware-acceleration). __Astuce :__ si votre CPU/iGPU/GPU le permet, Immich peut utiliser l'accélération matérielle pour la lecture vidéo et la reconnaissance d'images. Cela peut tripler les performances. En savoir plus sur le [transcodage](https://immich.app/docs/features/hardware-transcoding/) et le [machine learning](https://immich.app/docs/features/ml-hardware-acceleration).
:: ::
Déployez le conteneur. Déployez le conteneur. Vous pouvez vous connecter et suivre les instructions de configuration sur `http://ipdevotreserveur:2283`.
Et voilà, vous pouvez vous connecter et suivre les instructions sur `http://ipduserveur:2283` ### Terminé !
::
## Exposer Immich avec Swag ## Exposer Immich avec SWAG
Tout l'intérêt d'une telle solution, c'est de pouvoir y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer Immich via Swag. Le principal intérêt de cette installation est de pouvoir accéder à Immich à distance sur tous vos appareils. Nous allons exposer Immich avec SWAG.
::note ::note{icon=""}
📋 __Au préalable :__ 📋 __Au préalable :__
<br/><br/> <br/><br/>
Nous partons du principe que vous avez le sous-domaine `immich.mondomaine.fr` avec un `CNAME` qui pointe vers `mondomaine.fr` dans votre [zone DNS](/fr/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur via [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez un sous-domaine `immich.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Par ailleurs, à moins d'utiliser [Cloudflare Zero Trust](/serveex/security/cloudflare), assurez-vous que le port `443` de votre box est redirigé vers le port `443` de votre serveur via les [règles NAT](/general/networking/nat).
:: ::
Dans Dockge, rendez-vous dans la stack de SWAG et éditez le compose en ajoutant le réseau de immich : ::steps{level="3"}
### Ajouter le réseau d'Immich à SWAG
Dans Dockge, ouvrez la stack SWAG et modifiez le fichier compose pour y ajouter le réseau d'Immich :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -65,35 +73,37 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks: # Rattache le conteneur au réseau personnalisé
# ... # ...
- immich # Nom du réseau déclaré dans la stack - immich # Nom du réseau défini dans la stack
networks: # Définit le réseau custom networks: # Définit le réseau personnalisé
# ... # ...
immich: # Nom du réseau déclaré dans la stack immich: # Nom du réseau défini dans la stack
name: immich_default # Nom véritable du réseau externe name: immich_default # Nom réel du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe external: true # Indique qu'il s'agit d'un réseau externe
``` ```
::note ::note
Ici nous partons du principe que le nom du réseau de immich est `immich_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant http://ipduserveur:81. Nous partons du principe que le réseau d'Immich s'appelle `immich_default`. Vous pouvez vérifier la connectivité en visitant le tableau de bord de SWAG sur http://ipdevotreserveur:81.
:: ::
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel. Redémarrez la stack en cliquant sur « deploy » et attendez que SWAG soit complètement initialisé.
Dans les dossiers de Swag, créez le fichier `immich.subdomain.conf`. ### Créer le fichier subdomain.conf
::tip{icon=""} Dans les dossiers de SWAG, créez un fichier nommé `immich.subdomain.conf`.
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer et modifier vos fichiers plutôt que des commandes dans le terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/immich.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/immich.subdomain.conf
``` ```
Collez la configuration ci-dessous : Puis collez la configuration suivante :
```nginx [immich.subdomain.conf] ```nginx [immich.subdomain.conf]
## Version 2023/12/19 ## Version 2023/12/19
@@ -141,7 +151,6 @@ server {
set $upstream_port 3001; set $upstream_port 3001;
set $upstream_proto http; set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port; proxy_pass $upstream_proto://$upstream_app:$upstream_port;
} }
location ~ (/immich)?/api { location ~ (/immich)?/api {
@@ -151,15 +160,50 @@ server {
set $upstream_port 3001; set $upstream_port 3001;
set $upstream_proto http; set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port; proxy_pass $upstream_proto://$upstream_app:$upstream_port;
} }
} }
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Ente"}, puis quittez avec :kbd{value="Ctrl+X"}. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
Et voilà, vous avez exposé Immich ! N'oubliez pas d'installer les applications [iOS](https://apps.apple.com/us/app/immich/id1613945652)/[Android](https://play.google.com/store/apps/details?id=app.alextran.immich) afin de synchroniser vos appareils. ### Terminé !
::
::tip{icon=""} Et voilà ! Immich est maintenant accessible depuis internet. N'oubliez pas d'installer les applications [iOS](https://apps.apple.com/us/app/immich/id1613945652) / [Android](https://play.google.com/store/apps/details?id=app.alextran.immich) pour synchroniser vos appareils.
__Astuce :__ Vous pouvez protéger cette app avec Authentik de façon native en [suivant ces instructions](https://docs.goauthentik.io/integrations/services/immich/).
## Protéger Immich avec Pocket ID
Immich gère OIDC nativement, vous pouvez donc exiger une connexion Pocket ID avant de laisser qui que ce soit accéder à vos photos, plutôt qu'avec (ou en plus de) les comptes propres à l'application.
::steps{level="3"}
### Enregistrer Immich comme client OIDC
[Enregistrez un client OIDC dans Pocket ID](/serveex/security/pocket-id#registering-an-oidc-client) nommé `immich`, avec ces trois URL de callback :
```text
https://immich.mondomaine.fr/auth/login
https://immich.mondomaine.fr/user-settings
app.immich:///oauth-callback
```
La troisième URL est celle qui permet à l'application mobile de se connecter aussi.
### Activer OAuth dans Immich
Dans Immich, allez dans _Administration > Settings > Authentication Settings > OAuth_, activez-le, et renseignez :
| Champ | Valeur |
|-------|-------|
| Issuer URL | L'URL de découverte OIDC de Pocket ID |
| Client ID | Le client ID copié depuis Pocket ID |
| Client Secret | Le client secret copié depuis Pocket ID |
### Terminé !
::
::tip{icon="" to="/serveex/advanced/authentik"}
✨ Vous pouvez utiliser **Authentik** plutôt que Pocket ID :
1. Dans Authentik, créez une application et un provider OAuth2/OpenID Connect nommé `immich`, avec les trois mêmes redirect URI que ci-dessus (de type `Strict`).
2. Notez les __Client ID__, __Client Secret__ et __Slug__ du provider.
3. Dans les réglages OAuth d'Immich, mettez `https://authentik.mondomaine.fr/application/o/<slug>/` comme Issuer URL, puis renseignez le Client ID et le Client Secret.
:: ::
+115 -60
View File
@@ -1,38 +1,39 @@
--- ---
title: Nextcloud title: Nextcloud
description: Installer Nextcloud pour auto-héberger vos fichiers, photos et agenda une alternative respectueuse de la vie privée à Google Drive, OneDrive et iCloud. description: Installer Nextcloud pour auto-héberger vos fichiers, photos et agenda, une alternative respectueuse de la vie privée à Google Drive, OneDrive et iCloud.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Nextcloud
::note [Nextcloud](https://nextcloud.com/) est une solution auto-hébergée qui permet d'accéder à vos données et de les synchroniser sur tous vos appareils. Elle inclut aussi des fonctions de collaboration, un agenda, et bien plus. C'est une excellente alternative à des services comme Google Drive, iCloud ou OneDrive.
🎯 __Objectifs :__ installer [Nextcloud](https://nextcloud.com/) pour gérer vos photos sur tout vos appareils.
::
[Nextcloud](https://nextcloud.com/) est une solution qui vous permet d'accéder à vos données sur tout vos appareils, et de les synchroniser. Nexctloud dispose également de fonctionnalités de collaboration, de calendrier et bien d'autres. Cette solution remplace des solutions du type Google Drive, iCloud, ou encore OneDrive.
![Picture](/img/serveex/nextcloud.png) ![Picture](/img/serveex/nextcloud.png)
## Installation ## Installation
::note ::note{to="https://docs.linuxserver.io/images/docker-nextcloud/"}
Nous utiliserons l'image docker maintenue par [LinuxServer.io](https://docs.linuxserver.io/images/docker-nextcloud/) Nous utiliserons l'image Docker maintenue par **LinuxServer.io**
:: ::
Structure des fichiers ::file-tree
---
tree:
/:
- srv:
- docker:
- nextcloud:
- config/
- data/
- compose.yaml
- .env
---
::
```text [Arborescence] ::steps{level="3"}
root ### Déployer la stack
└── docker
└── nextcloud
├── config
├── data
├── compose.yaml
└── .env
```
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `nextcloud` puis copiez collez ceci : Ouvrez Dockge, cliquez sur `compose`, nommez la stack `nextcloud` et collez ce qui suit :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -45,24 +46,27 @@ services:
- PGID=${GUID} - PGID=${GUID}
- TZ=Etc/UTC - TZ=Etc/UTC
volumes: volumes:
- /docker/nextcloud/config:/config - /srv/docker/nextcloud/config:/config
- /docker/nextcloud/data:/data - /srv/docker/nextcloud/data:/data
ports: ports:
- ${PORT}:443 - ${PORT}:443
restart: unless-stopped restart: unless-stopped
``` ```
::note ::note{to="/general/networking/samba"}
Si vous avez un NAS ou un disque réseau partagé via [samba](/fr/general/networking/samba) pour stocker vos données, remplacez `/docker/nextcloud/data` par le chemin d'accès de votre dossier partagé. Si vous utilisez un NAS ou un disque partagé sur le réseau via **Samba**, remplacez `/srv/docker/nextcloud/data` par le chemin de votre dossier partagé.
:: ::
Trouvez votre `PUID` et votre `GUID` en tapant la commande suivante : ### Renseigner vos variables d'environnement
Trouvez vos `PUID` et `GUID` avec la commande suivante :
```bash [Terminal] ```bash [Terminal]
id nomdutilisateur id utilisateur
``` ```
Et renseignez le `.env` avec le port souhaité, et les infos que vous avez trouvées, par exemple :
Remplissez ensuite le fichier `.env` avec le port de votre choix et les valeurs trouvées ci-dessus, par exemple :
```properties [.env] ```properties [.env]
PUID=1000 PUID=1000
@@ -70,22 +74,28 @@ GUID=1000
PORT=4545 PORT=4545
``` ```
Déployez la stack et rendez-vous sur `http://ipduserveur:4545` et suivez les instructions. Déployez la stack et visitez `http://ipdevotreserveur:4545` pour terminer la configuration.
### Terminé !
::
::caution ::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu. __Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
:: ::
## Exposer Nextcloud avec Swag ## Exposer Nextcloud avec Swag
Tout l'intérêt d'une telle solution, c'est de pouvoir y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer Nextcloud via Swag. L'objectif de cette installation est d'accéder à Nextcloud à distance depuis tous vos appareils. Nous allons utiliser Swag pour exposer l'application.
::note ::note
Nous partons du principe que vous avez le sous-domaine `nextcloud.mondomaine.fr` avec un `CNAME` qui pointe vers `mondomaine.fr` dans votre [zone DNS](/fr/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur via [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez un sous-domaine `nextcloud.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Et à moins d'utiliser [Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box doit être redirigé vers le port `443` de votre serveur via les [règles NAT](/general/networking/nat).
:: ::
Dans Dockge, rendez-vous dans la stack de SWAG et éditez le compose en ajoutant le réseau de nextcloud : ::steps{level="3"}
### Ajouter le réseau de Nextcloud à SWAG
Dans Dockge, allez sur votre stack SWAG et modifiez le compose pour y ajouter le réseau de Nextcloud :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -93,57 +103,65 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks:
# ... # ...
- nextcloud # Nom du réseau déclaré dans la stack - nextcloud
networks: # Définit le réseau custom networks:
# ... # ...
nextcloud: # Nom du réseau déclaré dans la stack nextcloud:
name: nextcloud_default # Nom véritable du réseau externe name: nextcloud_default
external: true # Précise que c'est un réseau à rechercher en externe external: true
``` ```
::note ::note
Ici nous partons du principe que le nom du réseau de nextcloud est `nextcloud_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant http://ipduserveur:81. Nous partons du principe que le réseau de Nextcloud s'appelle `nextcloud_default`. Vous pouvez confirmer la connectivité en visitant le tableau de bord de SWAG sur http://ipdevotreserveur:81.
:: ::
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel. Redéployez la stack et attendez que SWAG soit pleinement opérationnel.
Dans les fichiers de nextcloud, éditez le fichier `config.php`. ### Configurer les proxys de confiance
::tip{icon=""} Dans les fichiers de Nextcloud, modifiez le fichier `config.php` :
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer et modifier les fichiers plutôt que des commandes dans le terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/nextcloud/config/www/nextcloud/config/config.php sudo nano /srv/docker/nextcloud/config/www/nextcloud/config/config.php
``` ```
Copiez les informations suivantes __avant__ `);`. Collez ce qui suit avant le `);` final :
```php [config.php] ```php [config.php]
'trusted_proxies' => [gethostbyname('swag')], 'overwrite.cli.url' => 'https://nextcloud.example.com/', 'trusted_proxies' => [gethostbyname('swag')],
'overwrite.cli.url' => 'https://nextcloud.example.com/',
'overwritehost' => 'nextcloud.example.com', 'overwritehost' => 'nextcloud.example.com',
'overwriteprotocol' => 'https', 'overwriteprotocol' => 'https',
``` ```
Ajoutez également votre nom de domaine dans la section `array` , cela devrait ressembler à ceci Ajoutez également votre domaine dans la section `array`. Cela devrait ressembler à ceci :
```php [config.php] ```php [config.php]
array ( array (
0 => '192.168.0.1:444', # Cette ligne est surement différente chez vous, ne la modifiez pas ! 0 => '192.168.0.1:444', # Cette ligne peut différer, n'y touchez pas !
1 => 'nextcloud.mondomaine.fr', # Renseignez votre domaine 1 => 'nextcloud.mondomaine.fr', # Ajoutez votre domaine ici
), ),
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
Dans les dossiers de Swag, créez le fichier `nextcloud.subdomain.conf`. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `nextcloud.subdomain.conf` :
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/nextcloud.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/nextcloud.subdomain.conf
``` ```
Collez la configuration ci-dessous :
Collez ce qui suit :
```nginx [nextcloud.subdomain.conf] ```nginx [nextcloud.subdomain.conf]
## Version 2024/04/25 ## Version 2024/04/25
@@ -165,23 +183,60 @@ server {
set $upstream_proto https; set $upstream_proto https;
proxy_pass $upstream_proto://$upstream_app:$upstream_port; proxy_pass $upstream_proto://$upstream_app:$upstream_port;
# Hide proxy response headers from Nextcloud that conflict with ssl.conf # Masque les en-têtes de réponse de Nextcloud qui entrent en conflit avec ssl.conf
# Uncomment the Optional additional headers in SWAG's ssl.conf to pass Nextcloud's security scan
proxy_hide_header Referrer-Policy; proxy_hide_header Referrer-Policy;
proxy_hide_header X-Content-Type-Options; proxy_hide_header X-Content-Type-Options;
proxy_hide_header X-Frame-Options; proxy_hide_header X-Frame-Options;
proxy_hide_header X-XSS-Protection; proxy_hide_header X-XSS-Protection;
# Disable proxy buffering # Désactive la mise en tampon du proxy
proxy_buffering off; proxy_buffering off;
} }
} }
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Ente"}, puis quittez avec :kbd{value="Ctrl+X"}. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
Et voilà, vous avez exposé Nextcloud ! Et n'oubliez pas d'installer [les applications pour ordinateurs et mobiles](https://nextcloud.com/fr/install/). ### Terminé !
::
::tip{icon=""} Et voilà ! Vous avez exposé Nextcloud ! N'oubliez pas d'installer [les applications bureau et mobiles](https://nextcloud.com/install/).
__Astuce :__ Vous pouvez protéger cette app avec Authentik de façon native en [suivant ces instructions](https://docs.goauthentik.io/integrations/services/nextcloud/).
## Protéger Nextcloud avec Pocket ID
Nextcloud peut aussi déléguer la connexion à un fournisseur OIDC plutôt qu'à (ou en plus de) ses propres comptes.
::steps{level="3"}
### Installer l'application OpenID Connect
Dans Nextcloud, allez dans _Apps > Integration_ et installez __OpenID Connect user backend__ (`user_oidc`).
### Enregistrer Nextcloud comme client OIDC
[Enregistrez un client OIDC dans Pocket ID](/serveex/security/pocket-id#registering-an-oidc-client) nommé `Nextcloud`, avec cette URL de callback :
```text
https://nextcloud.mondomaine.fr/apps/user_oidc/code
```
### Ajouter le fournisseur dans Nextcloud
Dans Nextcloud, allez dans _Administration > OpenID Connect_, cliquez sur le bouton `+`, et renseignez :
| Champ | Valeur |
|-------|-------|
| Identifier | `PocketID` |
| Client ID | Le client ID copié depuis Pocket ID |
| Client secret | Le client secret copié depuis Pocket ID |
| Discovery endpoint | L'URL de découverte OIDC de Pocket ID |
| Scope | `openid email profile groups` |
### Terminé !
::
::tip{icon="" to="/serveex/advanced/authentik"}
✨ Vous pouvez utiliser **Authentik** plutôt que Pocket ID :
1. Dans Authentik, créez une application et un provider OAuth2/OpenID Connect nommé `Nextcloud`, avec une redirect URI (de type `Strict`) valant `https://nextcloud.mondomaine.fr/apps/user_oidc/code`.
2. Notez les __Client ID__, __Client Secret__ et __Slug__ du provider.
3. Dans les réglages OpenID Connect de Nextcloud, mettez `https://authentik.mondomaine.fr/application/o/<slug>/.well-known/openid-configuration` comme Discovery endpoint, puis renseignez le Client ID et le Client Secret.
:: ::
@@ -0,0 +1,286 @@
---
title: File Browser Quantum
description: Installer File Browser Quantum, un fork modernisé de File Browser, pour parcourir et gérer les fichiers de votre serveur depuis une interface web rapide.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
[File Browser Quantum](https://github.com/gtsteffaniak/filebrowser) est un fork communautaire de [File Browser](/recycled/deprecated/file-browser), réécrit pour de meilleures performances (recherche indexée, moins de mémoire consommée) et configuré via un unique fichier `config.yaml` plutôt qu'uniquement par une base de données.
![file-browser-quantum](/img/serveex/filebrowser-quantum.png)
## Installation
::file-tree
---
tree:
/:
- srv:
- docker:
- filebrowser-quantum:
- compose.yaml
- data:
- config.yaml
- filebrowser.sqlite
---
::
::steps{level="3"}
### Créer le fichier de configuration
Créez le dossier de données :
```bash [Terminal]
sudo mkdir -p /srv/docker/filebrowser-quantum/data
```
Créez le fichier `config.yaml` :
```bash [Terminal]
sudo nano /srv/docker/filebrowser-quantum/data/config.yaml
```
Collez ce qui suit, en ajoutant une entrée `sources` par dossier que vous voulez parcourir :
```yaml [config.yaml]
server:
cacheDir: /home/filebrowser/data/tmp
sources:
- path: /srv/docker
config:
defaultEnabled: true
- path: /media
config:
defaultEnabled: true
```
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `filebrowser-quantum`, puis copiez-collez ce qui suit :
```yaml [compose.yaml]
---
services:
filebrowser-quantum:
container_name: filebrowser-quantum
image: gtstef/filebrowser:beta
restart: unless-stopped
volumes:
- /srv/docker:/srv/docker
- /media:/media
- /srv/docker/filebrowser-quantum/data:/home/filebrowser/data
ports:
- 8020:80
```
::note
Montez chaque dossier listé sous `sources` dans `config.yaml` au même chemin à l'intérieur du conteneur (ici `/srv/docker` et `/media`), sans quoi File Browser Quantum ne les trouvera pas.
::
::tip{icon=""}
✨ __Astuce :__ ajoutez le label watchtower pour automatiser les mises à jour.
```yaml [compose.yaml]
services:
filebrowser-quantum:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
Déployez le conteneur et allez sur `http://ipdevotreserveur:8020`. Connectez-vous avec les identifiants par défaut `admin` / `admin`, puis changez immédiatement le mot de passe dans les réglages de votre profil.
### Terminé !
::
::caution
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
## Exposer File Browser Quantum avec Swag
::warning
File Browser Quantum ne gère pas l'authentification multifacteur. L'exposer publiquement pourrait mettre vos systèmes en danger. Ne le faites que si vous utilisez une solution d'authentification robuste comme [TinyAuth](/serveex/security/tinyauth) ou [Authentik](/serveex/advanced/authentik/). Sinon, ne l'exposez pas avec SWAG. Utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard).
::
Vous voudrez peut-être accéder à File Browser Quantum à distance depuis tous vos appareils. Pour cela, nous allons l'exposer à travers Swag.
::note{icon=""}
📋 __Au préalable :__ nous partons du principe que vous avez déjà créé un sous-domaine du type `fbq.mondomaine.fr` dans votre [zone DNS](/general/networking/dns), pointant vers `mondomaine.fr` avec un `CNAME`. À moins d'utiliser Cloudflare Zero Trust, nous partons aussi du principe que vous avez déjà redirigé le port `443` de votre box vers le port `443` de votre serveur avec les [règles NAT](/general/networking/nat).
::
::steps{level="3"}
### Ajouter le réseau de File Browser Quantum à SWAG
Dans Dockge, allez sur la stack SWAG et modifiez le fichier compose pour y ajouter le réseau de File Browser Quantum :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Rattache le conteneur au réseau personnalisé
# ...
- filebrowser-quantum # Nom du réseau déclaré dans la stack
networks: # Définit le réseau personnalisé
# ...
filebrowser-quantum: # Nom du réseau déclaré dans la stack
name: filebrowser-quantum_default # Nom réel du réseau externe
external: true # Précise qu'il s'agit d'un réseau externe
```
::note
Nous partons ici du principe que le nom du réseau de File Browser Quantum est `filebrowser-quantum_default`. Vous pouvez confirmer que la connexion fonctionne en accédant au tableau de bord de SWAG sur http://ipdevotreserveur:81.
::
Redémarrez la stack en cliquant sur « deploy » et attendez que SWAG soit complètement initialisé.
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `fbq.subdomain.conf`.
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/fbq.subdomain.conf
```
Et collez la configuration suivante :
```nginx [fbq.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name fbq.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app filebrowser-quantum;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Terminé !
::
Et voilà ! File Browser Quantum est maintenant exposé.
## Protéger File Browser Quantum avec TinyAuth
Ajoutez la vérification forward-auth de [TinyAuth](/serveex/security/tinyauth) directement dans `fbq.subdomain.conf`, de la même façon que dans [le tutoriel TinyAuth](/serveex/security/tinyauth#protecting-an-app-via-reverse-proxy) :
```nginx [fbq.subdomain.conf]{22-34,37-38}
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name fbq.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app filebrowser-quantum;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note{to="/serveex/security/tinyauth#exposing-tinyauth-with-swag"}
Le bloc `location /tinyauth` s'exécute dans le conteneur de SWAG lui-même, SWAG doit donc être sur le réseau Docker de TinyAuth pour le joindre par son nom (`tinyauth` ici). Cela devrait déjà être en place depuis **l'exposition de TinyAuth**. Si vous rencontrez une erreur, revérifiez que le fichier compose de SWAG a toujours ce réseau rattaché.
::
::tip{icon=""}
✨ __Astuce :__ vous pouvez protéger cette application avec [Authentik](/serveex/advanced/authentik) plutôt que TinyAuth, en ouvrant `fbq.subdomain.conf` et en décommentant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un provider dans Authentik](/serveex/advanced/authentik#protecting-an-app-via-reverse-proxy).
::
@@ -1,159 +0,0 @@
---
title: File Browser
description: Installer File Browser pour parcourir et gérer les fichiers de votre serveur depuis une interface web, exposée de manière sécurisée avec SWAG.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# File Browser
::note
🎯 __Objectifs :__
- Installer File Browser
- Exposer File Browser avec Swag
::
[File Browser](https://github.com/filebrowser/filebrowser) est une interface permettant d'accéder aux fichiers de votre serveur et de les éditer.
![File Browser](/img/serveex/filebrowser.png)
## Installation
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `filebrowser` puis copiez collez ceci :
```yaml [compose.yaml]
---
services:
filebrowser:
container_name: filebrowser
volumes:
- /docker/filebrowser/config:/config/
- /chemin/vers/vos/dossiers:/vosdossiers #ajoutez ici les dossiers que vous voulez voir apparaitre dans filebrowser
ports:
- 8010:80
image: filebrowser/filebrowser:s6
```
::tip{icon=""}
✨ __Astuce :__ ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour
```yaml [compose.yaml]
services:
filebrowser:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
Déployez le conteneur et rendez-vous sur `http://ipduserveur:8010`. Et voilà, votre instance File Browser en webui est disponible !
::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu.
::
## Exposer File Browser avec Swag
::warning
File Browser n'utilise pas d'authentification multifacteur. Exposer File Browser sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/fr/serveex/security/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/fr/serveex/security/wireguard).
::
Vous aurez peut-etre envie d'y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer IT Tools via Swag.
::note
__Au préalable :__ nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `files.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat).
::
Dans Dockge, rendez-vous dans la stack de SWAG et éditez le compose en ajoutant le réseau de filebrowser :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Relie le conteneur au réseau custom
# ...
- filebrowser # Nom du réseau déclaré dans la stack
networks: # Définit le réseau custom
# ...
filebrowser: # Nom du réseau déclaré dans la stack
name: filebrowser_default # Nom véritable du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe
```
::note
Ici nous partons du principe que le nom du réseau de filebrowser est `filebrowser_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant http://ipduserveur:81.
::
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel.
Dans les dossiers de Swag, créez le fichier `files.subdomain.conf`.
```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/files.subdomain.conf
```
Collez la configuration ci-dessous :
```nginx [files.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name files.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
#if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; }
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app filebrowser;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
Et voilà, vous avez exposé File Browser !
::tip{icon=""}
✨ __Astuce :__ vous pouvez protéger cette app avec Authentik en ouvrant `files.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy).
::
+102 -53
View File
@@ -1,24 +1,21 @@
--- ---
title: Pingvin title: Pingvin
description: Installer Pingvin Share, une plateforme d'envoi de fichiers auto-hébergée pour partager des fichiers de façon sécurisée sans WeTransfer ni Google Drive. description: Installer Pingvin Share, une plateforme de partage de fichiers auto-hébergée pour envoyer des fichiers en toute sécuri sans passer par WeTransfer ou Google Drive.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Pingvin
::note [Pingvin](https://github.com/stonith404/pingvin-share) est un outil pour partager rapidement des fichiers, à la manière de WeTransfer. Ses nombreuses options de partage (mot de passe, durée d'expiration, lien personnalisé, etc.) en font l'outil idéal pour partager des fichiers rapidement. Pingvin peut aussi créer des _demandes d'envoi_, c'est-à-dire un lien partageable à envoyer à quelqu'un pour qu'il dépose ses fichiers et que vous les récupériez.
🎯 __Objectifs :__
- Installer Pingvin ![picture](/img/serveex/pingvin.png)
- Exposer Pingvin
::
[Pingvin](https://github.com/stonith404/pingvin-share) est un outil permettant de partager rapidement des fichiers, à la manière de WeTransfer. Ses nombreuses options de partage (mot de passe, durée d'expiration, personnalisation du lien...) en font l'outil idéal pour partager rapidement des fichiers. Pingvin permet également de créer des _demandes de dépot_, c'est à dire un lien partageable à envoyer à quelqu'un de votre choix pour qu'il puisse téléverser ses fichiers afin que vous puissiez les récupérer.
![File Browser](/img/serveex/pingvin.png)
## Installation ## Installation
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `pingvin` puis copiez collez ceci :
::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `pingvin`, puis copiez-collez ceci :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -30,9 +27,9 @@ services:
ports: ports:
- 3600:3000 - 3600:3000
volumes: volumes:
- /docker/pingvin/data:/opt/app/backend/data - /srv/docker/pingvin/data:/opt/app/backend/data
- /docker/pingvin/data/img:/opt/app/frontend/public/img - /srv/docker/pingvin/data/img:/opt/app/frontend/public/img
- /docker/pingvin/uploads:/opt/app/backend/uploads # chemin du dossier dans lequel vous souhaitez stocker les fichiers uploadés dans pingvin. A changer selon vos préférences. - /srv/docker/pingvin/uploads:/opt/app/backend/uploads # chemin du dossier où stocker les fichiers envoyés à pingvin. À adapter à votre convenance.
depends_on: depends_on:
clamav: clamav:
condition: service_healthy condition: service_healthy
@@ -45,11 +42,11 @@ services:
``` ```
::note ::note
Ici nous partons du principe que le nom du réseau de Swag est `swag_default`. À partir d'ici, nous partons du principe que le nom du réseau de Swag est `swag_default`.
:: ::
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour ✨ __Astuce :__ ajoutez le label watchtower à chaque conteneur pour automatiser les mises à jour.
```yaml [compose.yaml] ```yaml [compose.yaml]
services: services:
@@ -67,23 +64,28 @@ Ici nous partons du principe que le nom du réseau de Swag est `swag_default`.
``` ```
:: ::
Déployez le conteneur et rendez-vous sur `http://ipduserveur:3600`. Et voilà, votre instance File Browser en webui est disponible ! Déployez le conteneur et allez sur `http://ipdevotreserveur:3600`. Et voilà ! Votre instance web Pingvin est en route !
### Terminé !
::
::caution ::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu. __Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
:: ::
## Exposer Immich avec Swag ## Exposer Pingvin avec Swag
Tout l'intérêt d'une telle solution, c'est de pouvoir y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer Pingvin via Swag. Tout l'intérêt d'une solution comme celle-ci est de pouvoir y accéder à distance, depuis tous vos appareils. Pour cela, nous allons exposer Pingvin à travers Swag.
::note ::note{icon=""}
📋 __Au préalable :__ 📋 __Au préalable :__ <br/><br/>
<br/><br/> Nous partons du principe que vous avez le sous-domaine `pingvin.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Et bien sûr, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), que le port `443` de votre box est redirigé vers le port `443` de votre serveur via les [règles NAT](/general/networking/nat).
Nous partons du principe que vous avez le sous-domaine `pingvin.mondomaine.fr` avec un `CNAME` qui pointe vers `mondomaine.fr` dans votre [zone DNS](/fr/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur via [les règles NAT](/fr/general/networking/nat).
:: ::
Dans Dockge, rendez-vous dans la stack de SWAG et éditez le compose en ajoutant le réseau de pingvin : ::steps{level="3"}
### Ajouter le réseau de Pingvin à SWAG
Dans Dockge, allez sur la stack SWAG et modifiez le fichier compose pour y ajouter le réseau de pingvin :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -91,33 +93,35 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks: # Rattache le conteneur au réseau personnalisé
# ... # ...
- pingvin # Nom du réseau déclaré dans la stack - pingvin # Nom du réseau déclaré dans la stack
networks: # Définit le réseau custom networks: # Définit le réseau personnalisé
# ... # ...
pingvin: # Nom du réseau déclaré dans la stack pingvin: # Nom du réseau déclaré dans la stack
name: pingvin_default # Nom véritable du réseau externe name: pingvin_default # Nom réel du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe external: true # Précise qu'il s'agit d'un réseau à chercher à l'extérieur
``` ```
::note ::note
Ici nous partons du principe que le nom du réseau de pingvin est `pingvin_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant http://ipduserveur:81. À partir d'ici, nous partons du principe que le nom du réseau de pingvin est `pingvin_default`. Vous pouvez vérifier que la connexion fonctionne en visitant le tableau de bord de SWAG sur http://ipdevotreserveur:81.
:: ::
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel. Redéployez la stack en cliquant sur « deploy » et attendez que SWAG soit complètement démarré.
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `pingvin.subdomain.conf`. Dans les dossiers de Swag, créez le fichier `pingvin.subdomain.conf`.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. ✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichiers et éditer vos documents plutôt que des commandes dans le terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/pingvin.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/pingvin.subdomain.conf
``` ```
Collez la configuration ci-dessous : Collez la configuration ci-dessous :
@@ -173,34 +177,79 @@ server {
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Ente"}, puis quittez avec :kbd{value="Ctrl+X"}. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Terminé !
::
Et voilà, vous avez exposé Pingvin ! Et voilà, vous avez exposé Pingvin !
## Sécuriser Pingvin avec Authentik ## Protéger Pingvin avec Pocket ID
Pingvin gère OIDC nativement, vous pouvez donc exiger une connexion Pocket ID avant de laisser qui que ce soit partager ou recevoir des fichiers, plutôt qu'avec (ou en plus de) les comptes propres à l'application.
Vous pouvez protéger cette app avec Authentik de façon native en suivant les instructions ci-dessous. ::steps{level="3"}
### Enregistrer Pingvin comme client OIDC
1. Dans votre espace admin authentik, créez un fournisseur OAuth2/OpenID. [Enregistrez un client OIDC dans Pocket ID](/serveex/security/pocket-id#registering-an-oidc-client) nommé `pingvin`, avec cette URL de callback :
2. Remplissez chaque section comme suit en remplaçant `mondomaine.fr` par votre domaine. Copiez quelque part le contenu des champs `ID du client` et `Secret du client`. ```text
https://pingvin.mondomaine.fr/api/oauth/callback/oidc
```
![Picture](/img/serveex/pingvin-auth1.png) ### Activer le Social Login dans Pingvin
![Picture](/img/serveex/pingvin-auth2.png)
![Picture](/img/serveex/pingvin-auth3.png)
3. Enregistrez et créez une application `pingvin` comme suit. Dans Pingvin, allez dans _Administration > Configuration > Social Login_ et renseignez :
![Picture](/img/serveex/pingvin-auth4.png) | Champ | Valeur |
|-------|-------|
| OpenID Connect | Activé |
| Discovery URI | L'URL de découverte OIDC de Pocket ID |
| Scope | `openid email profile groups` |
4. Enregistrez et aller dans la liste de vos avant-postes. Ajoutez le fournisseur pingvin` à votre avant-poste. ### Terminé !
::
5. Quittez authentik, et allez dans l'interface d'administration de Pingvin. Et voilà ! Désormais, quand vous vous connectez à Pingvin, un bouton « Open ID » est disponible sous le formulaire de connexion.
6. Dans la section _« Identifiant social »_ renseignez les champs suivant : ::::tip{icon=""}
- `URI de découverte OpenID` avec `https://pingvin.mondomaine.fr/application/o/pingvin/.well-known/openid-configuration` (n'oubliez pas de remplacer `mondomaine.fr` par votre domaine) ✨ Vous pouvez utiliser [Authentik](/serveex/advanced/authentik) plutôt que Pocket ID :
- `Revendication du nom dutilisateur OpenID` avec `preferred_username`
- `ID du client OpenID` avec l'ID que vous avez copié en étape 2.
- `Secret du client OpenID` avec le token que vous avez copié en étape 2.
Et voilà, désormais lorsque vous vous connectez à Pingvin, un bouton "Open ID" sera disponible en dessous de la mire de connexion. :::collapsible{name="les étapes de configuration Authentik"}
::steps{level="4"}
#### Créer un provider OAuth2/OpenID
Dans l'espace d'administration d'Authentik, créez un provider OAuth2/OpenID.
#### Configurer le provider
Remplissez chaque section comme suit, en remplaçant `mondomaine.fr` par votre propre domaine. Copiez les champs `Client ID` et `Client Secret` en lieu sûr.
![picture](/img/serveex/pingvin-auth1.png)
![picture](/img/serveex/pingvin-auth2.png)
![picture](/img/serveex/pingvin-auth3.png)
#### Créer l'application
Enregistrez et créez une application `pingvin` comme suit.
![picture](/img/serveex/pingvin-auth4.png)
#### Ajouter le provider à votre outpost
Enregistrez et allez sur votre liste d'outposts. Ajoutez le provider pingvin à votre outpost.
#### Configurer les réglages OAuth de Pingvin
Quittez Authentik et allez dans l'interface d'administration de Pingvin. Dans la section _« OAuth »_, renseignez les champs suivants :
- `OpenID discovery URI` avec `https://pingvin.mondomaine.fr/application/o/pingvin/.well-known/openid-configuration` (n'oubliez pas de remplacer `mondomaine.fr` par votre propre domaine)
- `OpenID username claim` avec `preferred_username`
- `OpenID client ID` avec l'ID copié à l'étape 2.
- `OpenID client secret` avec le token copié à l'étape 2.
#### Terminé !
::
:::
::::
@@ -1,18 +1,10 @@
--- ---
title: Code-Serveur title: Code-Serveur
description: Installer code-server pour utiliser VS Code dans votre navigateur depuis votre homelab montez des dossiers et exposez-le de manière sécurisée avec SWAG. description: Installer code-server pour utiliser VS Code dans votre navigateur depuis votre homelab, montez des dossiers et exposez-le de manière sécurisée avec SWAG.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Code-Server
::note
🎯 __Objectifs :__
- Installer code-server
- Monter des dossiers dans vscode
- Exposer code-server avec Swag
::
[code-server](https://github.com/linuxserver/docker-code-server) est un conteneur permettant d'accéder à [vscode](https://code.visualstudio.com/) en web-ui dans un environnement linux. C'est littéralement vscode et vos projets directement dans votre poche, disponibles partout. [code-server](https://github.com/linuxserver/docker-code-server) est un conteneur permettant d'accéder à [vscode](https://code.visualstudio.com/) en web-ui dans un environnement linux. C'est littéralement vscode et vos projets directement dans votre poche, disponibles partout.
@@ -48,7 +40,7 @@ services:
- TZ=Etc/UTC - TZ=Etc/UTC
- HASHED_PASSWORD=${PW} - HASHED_PASSWORD=${PW}
volumes: volumes:
- /docker/code-server/config:/config - /srv/docker/code-server/config:/config
# ajoutez vos dossier à monter dans vscode # ajoutez vos dossier à monter dans vscode
# - /chemin/vers/dossier:/dossier # - /chemin/vers/dossier:/dossier
ports: ports:
@@ -119,7 +111,7 @@ Tout l'intérêt d'une telle solution, c'est de pouvoir y accéder à distance e
::note ::note
__Au préalable :__ Nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `code.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). __Au préalable :__ Nous partons du principe que vous avez créé dans votre [zone DNS](/general/networking/dns) un sous domaine du type `code.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et [à moins que vous utilisiez Cloudflare Zero Trust](/serveex/security/cloudflare), que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/general/networking/nat).
:: ::
Dans Dockge, rendez-vous dans la stack de SWAG et éditez le compose en ajoutant le réseau de code-server : Dans Dockge, rendez-vous dans la stack de SWAG et éditez le compose en ajoutant le réseau de code-server :
@@ -150,12 +142,12 @@ Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soi
Dans les dossiers de Swag, créez le fichier `code.subdomain.conf`. Dans les dossiers de Swag, créez le fichier `code.subdomain.conf`.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. ✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/code.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/code.subdomain.conf
``` ```
Collez la configuration ci-dessous : Collez la configuration ci-dessous :
@@ -215,5 +207,5 @@ Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez a
Et voilà, vous avez exposé code-server ! Et voilà, vous avez exposé code-server !
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ Vous pouvez protéger cette app avec Authentik en ouvrant `code.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}.N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). ✨ __Astuce :__ Vous pouvez protéger cette app avec Authentik en ouvrant `code.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}.N'oubliez pas de [créer une application et un fournisseur dans Authentik](/serveex/advanced/authentik#protéger-une-app-par-reverse-proxy).
:: ::
@@ -0,0 +1,250 @@
---
title: Forgejo
description: Installer Forgejo, un service Git auto-hébergé et léger pour gérer vos dépôts de code en privé sur votre propre serveur.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
[Forgejo](https://forgejo.org/) est une plateforme DevOps auto-hébergée qui permet de gérer des dépôts à la manière de GitHub, mais sur votre propre infrastructure. C'est un fork communautaire de Gitea.
![forgejo](/img/serveex/forgejo.png)
## Installation
::file-tree
---
tree:
/:
- srv:
- docker:
- forgejo:
- compose.yaml
- .env
- data/
---
::
::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `forgejo`, et collez le contenu suivant :
```yaml [compose.yaml]
---
networks:
forgejo:
external: false
services:
server:
image: codeberg.org/forgejo/forgejo:11
container_name: forgejo
environment:
- USER_UID=${UID}
- USER_GID=${GID}
- TZ=Europe/Paris
restart: unless-stopped
networks:
- forgejo
volumes:
- ./data:/data
ports:
- 3333:3000
- 222:22
```
### Renseigner vos variables d'environnement
Remplissez le fichier `.env` avec les informations nécessaires, par exemple :
```properties [.env]
UID=1000
GID=1000
```
Déployez le conteneur et allez sur `http://ipdevotreserveur:3333`. Votre instance Forgejo est en route !
### Terminé !
::
::caution
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
## Exposer Forgejo avec Swag
L'intérêt de cette installation est de pouvoir y accéder à distance depuis n'importe lequel de vos appareils. Pour cela, nous allons exposer Forgejo à travers Swag.
::note
__Au préalable :__ nous partons du principe que vous avez créé un sous-domaine du type `forgejo.mondomaine.fr` dans votre [zone DNS](/general/networking/dns) avec un `CNAME` pointant vers `mondomaine.fr`, et que, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), vous avez déjà redirigé le port `443` de votre box vers le port `443` de votre serveur dans les [règles NAT](/general/networking/nat).
::
::steps{level="3"}
### Ajouter le réseau de Forgejo à SWAG
Dans Dockge, allez sur la stack SWAG et modifiez le fichier compose en y ajoutant le réseau de Forgejo :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Rattache le conteneur au réseau personnalisé
# ...
- forgejo # Nom du réseau déclaré
networks: # Définit le réseau personnalisé
# ...
forgejo: # Nom du réseau déclaré
name: forgejo_default # Nom réel du réseau externe
external: true # Indique qu'il s'agit d'un réseau externe
```
::note
Nous partons du principe que le nom du réseau de Forgejo est `forgejo_default`. Vous pouvez vérifier la connectivité en visitant le tableau de bord de SWAG sur http://ipdevotreserveur:81.
::
Redéployez la stack en cliquant sur « Deploy » et attendez que SWAG soit pleinement opérationnel.
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `forgejo.subdomain.conf`.
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer et modifier vos fichiers plutôt que des commandes dans le terminal.
::
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/forgejo.subdomain.conf
```
Collez la configuration ci-dessous :
```nginx [forgejo.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name forgejo.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app forgejo;
set $upstream_port 3000;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ~ (/forgejo)?/info/lfs {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app forgejo;
set $upstream_port 3000;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Configurer le domaine de Forgejo
Ouvrez maintenant le fichier `app.ini` depuis le système de fichiers du conteneur :
```bash [Terminal]
sudo nano /srv/docker/forgejo/data/gitea/conf/app.ini
```
Puis modifiez la section server avec les informations de votre domaine :
```properties [app.ini]
[server]
DOMAIN = forgejo.mondomaine.fr
SSH_DOMAIN = forgejo.mondomaine.fr
ROOT_URL = https://forgejo.mondomaine.fr/
```
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter, puis redémarrez le conteneur.
### Terminé !
::
Et voilà ! Forgejo est maintenant exposé sur le web.
## Protéger Forgejo avec Pocket ID
Forgejo peut aussi déléguer la connexion à un fournisseur OIDC plutôt qu'à (ou en plus de) ses propres comptes.
::steps{level="3"}
### Enregistrer Forgejo comme client OIDC
[Enregistrez un client OIDC dans Pocket ID](/serveex/security/pocket-id#registering-an-oidc-client) nommé `Forgejo`, avec cette URL de callback :
```text
https://forgejo.mondomaine.fr/user/oauth2/PocketID/callback
```
::note
Le `PocketID` de l'URL de callback doit correspondre exactement au champ __Authentication Name__ que vous renseignerez à l'étape suivante.
::
### Ajouter la source d'authentification dans Forgejo
En tant qu'administrateur, allez dans _Site Administration > Identity & Access > Authentication Sources_, cliquez sur _Add Authentication Source_, et renseignez :
| Champ | Valeur |
|-------|-------|
| Authentication Type | `OAuth2` |
| Authentication Name | `PocketID` |
| OAuth2 Provider | `OpenID Connect` |
| Client ID (Key) | Le client ID copié depuis Pocket ID |
| Client Secret | Le client secret copié depuis Pocket ID |
| OIDC Discovery URL | L'URL de découverte OIDC de Pocket ID |
| Additional Scopes | `openid email profile` |
Activez également __Skip local 2FA__.
### Terminé !
::
::tip{icon="" to="/serveex/advanced/authentik"}
✨ Vous pouvez utiliser **Authentik** plutôt que Pocket ID :
1. Dans Authentik, créez une application et un provider OAuth2/OpenID Connect nommé `Forgejo`, avec une redirect URI (de type `Strict`) valant `https://forgejo.mondomaine.fr/user/oauth2/authentik/callback`.
2. Notez les __Client ID__, __Client Secret__ et __Slug__ du provider.
3. Dans la source d'authentification de Forgejo, mettez `authentik` dans __Authentication Name__, `https://authentik.mondomaine.fr/application/o/<slug>/.well-known/openid-configuration` dans __OIDC Discovery URL__, puis renseignez le Client ID, le Client Secret et les Additional Scopes `email profile`.
::
@@ -1,194 +0,0 @@
---
title: Gitea
description: Installer Gitea, un service Git auto-hébergé léger pour gérer vos dépôts de code de façon privée sur votre propre serveur.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Gitea
::note
🎯 __Objectifs :__
- Installer Gitea
- Exposer Gitea avec Swag
::
[Gitea](https://https://about.gitea.com/) est une plateforme DevOps, permettant de gérer des dépots, à la manière de GitHub mais chez vous en selfhost.
![gitea](https://about.gitea.com/img/home-screenshot.png)
## Installation
Structure des dossiers
```text [Arborescence]
root
└── docker
└── gitea
└── data
```
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `gitea` puis copiez collez ceci :
```yaml [compose.yaml]
---
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.22.0
container_name: gitea
environment:
- USER_UID=${UID}
- USER_GID=${GID}
- TZ=Europe/Paris
restart: unless-stopped
networks:
- gitea
volumes:
- ./data:/data
ports:
- 3333:3000
- 222:22
```
Et renseignez le `.env` avec les infos que vous avez trouvées, par exemple :
```properties [.env]
UID=1000
GID=1000
```
Déployez le conteneur et rendez-vous sur `http://ipduserveur:3333`. Et voilà, votre instance Gitea est disponible !
::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu.
::
## Exposer Gitea avec Swag
Tout l'intérêt d'une telle solution, c'est de pouvoir y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer Gitea via Swag.
::note
__Au préalable :__ nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `gitea.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat).
::
Dans Dockge, rendez-vous dans la stack de SWAG et éditez le compose en ajoutant le réseau de gitea :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Relie le conteneur au réseau custom
# ...
- gitea # Nom du réseau déclaré dans la stack
networks: # Définit le réseau custom
# ...
gitea: # Nom du réseau déclaré dans la stack
name: gitea_default # Nom véritable du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe
```
::note
Ici nous partons du principe que le nom du réseau de gitea est `gitea_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant http://ipduserveur:81.
::
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel.
Dans les dossiers de Swag, créez le fichier `gitea.subdomain.conf`.
::tip{icon=""}
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
::
```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/gitea.subdomain.conf
```
Collez la configuration ci-dessous :
```nginx [gitea.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name gitea.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app gitea;
set $upstream_port 3000;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ~ (/gitea)?/info/lfs {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app gitea;
set $upstream_port 3000;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
Ouvrez le fichier `app.ini` dans les fichiers du conteneur
```bash [Terminal]
sudo nano /docker/gitea/data/gitea/conf/app.ini
```
Et modifiez la section serveur avec les infos de votre domaine
```properties [app.ini]
[server]
DOMAIN = gitea.mondomaine.fr
SSH_DOMAIN = gitea.mondomaine.fr
ROOT_URL = https://gitea.mondomaine.fr/
```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
Relancez le conteneur.
Et voilà, vous avez exposé Gitea !
::tip{icon=""}
__Astuce :__ Vous pouvez protéger cette app avec Authentik de façon native en [suivant ces instructions](https://docs.goauthentik.io/integrations/services/gitea/).
::
+117 -33
View File
@@ -1,25 +1,21 @@
--- ---
title: IT-Tools title: IT Tools
description: Installer IT Tools, une collection auto-hébergée d'utilitaires pratiques pour développeurs convertisseurs, encodeurs, formateurs et plus encore. description: Installer IT Tools, une collection auto-hébergée d'utilitaires pratiques pour développeurs, convertisseurs, encodeurs, formateurs et plus encore.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# IT Tools
::note [IT Tools](https://github.com/CorentinTh/it-tools) est un conteneur qui expose une page web donnant accès à une large panoplie d'outils de développement.
🎯 __Objectifs :__
- Installer IT-Tools
- Exposer IT Tools avec Swag
::
[IT Tools](https://github.com/CorentinTh/it-tools) est un conteneur exposant une page web permettant d'accéder à un grand nombre d'outil de développement.
![IT Tools](/img/serveex/it-tools.png) ![IT Tools](/img/serveex/it-tools.png)
## Installation ## Installation
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `it-tools` puis copiez collez ceci : ::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `it-tools`, et collez ce qui suit :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -33,7 +29,7 @@ services:
``` ```
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour ✨ __Astuce :__ ajoutez le label Watchtower à chaque conteneur pour activer les mises à jour automatiques.
```yaml [compose.yaml] ```yaml [compose.yaml]
services: services:
@@ -45,22 +41,28 @@ services:
``` ```
:: ::
Déployez le conteneur et rendez-vous sur `http://ipduserveur:3222`. Et voilà, votre instance IT Tools en webui est disponible ! Déployez le conteneur et visitez `http://ipdevotreserveur:3222`. Voilà, votre instance web IT Tools est en route !
### Terminé !
::
::caution ::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu. __Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
:: ::
## Exposer IT Tools avec Swag ## Exposer IT Tools avec Swag
Vous aurez peut-etre envie d'y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer IT Tools via Swag. Vous voudrez peut-être y accéder à distance sur tous vos appareils. Pour cela, nous allons exposer IT Tools avec Swag.
::note ::note
__Au préalable :__ nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `tools.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). __Au préalable :__ nous partons du principe que vous avez créé un sous-domaine du type `tools.mondomaine.fr` dans votre [zone DNS](/general/networking/dns) avec un `CNAME` réglé sur `mondomaine.fr`. Par ailleurs, à moins d'utiliser [Cloudflare Zero Trust](/serveex/security/cloudflare), assurez-vous d'avoir déjà redirigé le port `443` de votre box vers le port `443` de votre serveur dans les [règles NAT](/general/networking/nat).
:: ::
Dans Dockge, rendez-vous dans la stack de SWAG et éditez le compose en ajoutant le réseau de it-tools : ::steps{level="3"}
### Ajouter le réseau d'IT Tools à SWAG
Dans Dockge, allez sur la stack SWAG et modifiez le fichier compose pour y ajouter le réseau d'IT Tools :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -68,38 +70,41 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks: # Rattache le conteneur au réseau personnalisé
# ... # ...
- it-tools # Nom du réseau déclaré dans la stack - it-tools # Nom du réseau tel que défini dans la stack IT Tools
networks: # Définit le réseau custom networks: # Définit le réseau personnalisé
# ... # ...
it-tools: # Nom du réseau déclaré dans la stack it-tools: # Nom du réseau tel que défini dans la stack IT Tools
name: it-tools_default # Nom véritable du réseau externe name: it-tools_default # Nom réel du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe external: true # Indique qu'il s'agit d'un réseau externe
``` ```
::note ::note
Ici nous partons du principe que le nom du réseau de it-tools est `it-tools_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant http://ipduserveur:81. Nous partons du principe que le réseau d'IT Tools s'appelle `it-tools_default`. Vous pouvez vérifier la connectivité en visitant le tableau de bord de SWAG sur http://ipdevotreserveur:81.
:: ::
::note ::note
Ici nous partons du principe que le nom du réseau de Swag est `swag_default`. Nous partons aussi du principe que le réseau de SWAG s'appelle `swag_default`.
:: ::
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel. Redémarrez la stack en cliquant sur « deploy » et attendez que SWAG soit pleinement opérationnel.
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `tools.subdomain.conf`. Dans les dossiers de Swag, créez le fichier `tools.subdomain.conf`.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. ✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer et modifier vos fichiers plutôt que des commandes dans le terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/tools.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/tools.subdomain.conf
``` ```
Collez la configuration ci-dessous : Collez la configuration ci-dessous :
```nginx [tools.subdomain.conf] ```nginx [tools.subdomain.conf]
@@ -153,10 +158,89 @@ server {
} }
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Ente"}, puis quittez avec :kbd{value="Ctrl+X"}. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
Et voilà, vous avez exposé it-tools ! ### Terminé !
::
Et voilà ! IT Tools est maintenant exposé !
## Protéger IT Tools avec TinyAuth
Ajoutez la vérification forward-auth de [TinyAuth](/serveex/security/tinyauth) directement dans `tools.subdomain.conf`, de la même façon que dans [le tutoriel TinyAuth](/serveex/security/tinyauth#protecting-an-app-via-reverse-proxy) :
```nginx [tools.subdomain.conf]{26-38,41-42}
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name tools.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
#if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; }
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app it-tools;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note{to="/serveex/security/tinyauth#exposing-tinyauth-with-swag"}
Le bloc `location /tinyauth` s'exécute dans le conteneur de SWAG lui-même, SWAG doit donc être sur le réseau Docker de TinyAuth pour le joindre par son nom (`tinyauth` ici). Cela devrait déjà être en place depuis **l'exposition de TinyAuth**. Si vous rencontrez une erreur, revérifiez que le fichier compose de SWAG a toujours ce réseau rattaché.
::
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ Vous pouvez protéger cette app avec Authentik en ouvrant `tools.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). ✨ __Astuce :__ vous pouvez sécuriser cette application avec [Authentik](/serveex/advanced/authentik) plutôt que TinyAuth, en ouvrant `tools.subdomain.conf` et en décommentant les lignes `include /config/nginx/authentik-server.conf;` et `include /config/nginx/authentik-location.conf;`. N'oubliez pas de [créer une application et un provider dans Authentik](/serveex/advanced/authentik#protecting-an-app-via-reverse-proxy).
:: ::
+10 -19
View File
@@ -3,17 +3,8 @@ title: Adguard Home
description: Installer AdGuard Home pour bloquer publicités et trackers à l'échelle du réseau avec DNS-over-HTTPS, gestion des clients et règles de filtrage personnalisées. description: Installer AdGuard Home pour bloquer publicités et trackers à l'échelle du réseau avec DNS-over-HTTPS, gestion des clients et règles de filtrage personnalisées.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Adguard Home
::note
🎯 __Objectifs :__
- Installer et déployer Adguard
- Exposer Adguard
- Sécuriser les requêtes avec SSL/TLS
- Configurer les appareils clients
::
[AdGuard Home](https://github.com/AdguardTeam/AdGuardHome) est un serveur DNS anti-pub et anti-traçage qui fonctionne au niveau du système. Une fois configuré, il couvrira TOUS vos appareils domestiques et vous n'aurezbesoin d'aucun logiciel côté client pour cela. [AdGuard Home](https://github.com/AdguardTeam/AdGuardHome) est un serveur DNS anti-pub et anti-traçage qui fonctionne au niveau du système. Une fois configuré, il couvrira TOUS vos appareils domestiques et vous n'aurezbesoin d'aucun logiciel côté client pour cela.
@@ -50,7 +41,7 @@ root
::note ::note
Nous monterons aussi le dossier `/docker/swag/config/etc/letsencrypt` afin d'avoir accès au certificat SSL de Swag. Nous monterons aussi le dossier `/srv/docker/swag/config/etc/letsencrypt` afin d'avoir accès au certificat SSL de Swag.
:: ::
Ouvrez Dockge, et cliquez sur `compose` Ouvrez Dockge, et cliquez sur `compose`
@@ -72,9 +63,9 @@ services:
- 853:853/tcp - 853:853/tcp
- 3000:3000/tcp - 3000:3000/tcp
volumes: volumes:
- /docker/adguardhome/confdir:/opt/adguardhome/conf - /srv/docker/adguardhome/confdir:/opt/adguardhome/conf
- /docker/adguardhome/workdir:/opt/adguardhome/work - /srv/docker/adguardhome/workdir:/opt/adguardhome/work
- /docker/swag/config/etc/letsencrypt:/swag-ssl:ro - /srv/docker/swag/config/etc/letsencrypt:/swag-ssl:ro
``` ```
@@ -102,7 +93,7 @@ Pour être utilisable hors de chez vous, vous devez exposer Adguard
::note ::note
__Au préalable :__ nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `adguard.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Redirigez également le port `53` et le port `853` vers votre serveur. Ces ports serviront à router les requêtes DNS. __Au préalable :__ nous partons du principe que vous avez créé dans votre [zone DNS](/general/networking/dns) un sous domaine du type `adguard.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/general/networking/nat). Redirigez également le port `53` et le port `853` vers votre serveur. Ces ports serviront à router les requêtes DNS.
:: ::
::warning ::warning
@@ -138,13 +129,13 @@ Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soi
Créez et ouvrez le fichier `adguard.subdomain.conf` Créez et ouvrez le fichier `adguard.subdomain.conf`
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce pour les allergiques au terminal :__ ✨ __Astuce pour les allergiques au terminal :__
vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/adguard.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/adguard.subdomain.conf
``` ```
Copiez la configuration ci-dessous : Copiez la configuration ci-dessous :
@@ -228,7 +219,7 @@ server {
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ ✨ __Astuce :__
<br/><br/> <br/><br/>
Vous pouvez protéger cette app avec Authentik en ouvrant `adguard.subdomain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. n'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). Il vous faudra exclure l'url `https://adguard.mondomaine.fr/dns-query` de l'authentification : Vous pouvez protéger cette app avec Authentik en ouvrant `adguard.subdomain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. n'oubliez pas de [créer une application et un fournisseur dans Authentik](/serveex/advanced/authentik#protéger-une-app-par-reverse-proxy). Il vous faudra exclure l'url `https://adguard.mondomaine.fr/dns-query` de l'authentification :
- Editez le fournisseur d'Adguard - Editez le fournisseur d'Adguard
- Dans *paramètres avancés du protocole > chemins authentifiés*, saisissez `^/dns-query` - Dans *paramètres avancés du protocole > chemins authentifiés*, saisissez `^/dns-query`
+156 -64
View File
@@ -1,34 +1,36 @@
--- ---
title: Vaultwarden title: Vaultwarden
description: Installer Vaultwarden, un gestionnaire de mots de passe auto-hébergé compatible Bitwarden pour remplacer les gestionnaires Google ou Apple sur tous vos appareils. description: Installer Vaultwarden, un gestionnaire de mots de passe auto-hébergé compatible Bitwarden, pour remplacer ceux de Google ou d'Apple sur tous vos appareils.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Vaultwarden
::note :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
🎯 __Objectifs :__ Installer [Vaultwarden](https://github.com/dani-garcia/vaultwarden) pour gérer vos mot de passe sur tout vos appareils (remplace la gestion de mot de passe Google ou Apple).
::
![Vaultwarden](/img/serveex/vaultwarden.png) ![Vaultwarden](/img/serveex/vaultwarden.png)
[Vaultwarden](https://github.com/dani-garcia/vaultwarden) est une solution de gestion de vos mot de passe (génération, 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érentes machines, avec un chiffrement de bout en bout. [Vaultwarden](https://github.com/dani-garcia/vaultwarden) est une solution de gestion de mots de passe (génération, remplissage automatique...) que vous pouvez héberger directement sur votre serveur. Elle remplace les gestionnaires du type Google, Apple ou Keepass. Vaultwarden synchronise vos mots de passe sur tous vos appareils avec un chiffrement de bout en bout.
Vaultwarden est un fork de la solution [Bitwarden](https://bitwarden.com/fr-fr/help/). Vaultwarden est un fork de [Bitwarden](https://bitwarden.com/fr-fr/help/).
## Installation ## Installation
Structure des dossiers
```text [Arborescence] ::file-tree
root ---
└── docker tree:
└── vaultwarden /:
├── data - srv:
├── compose.yaml - docker:
└── .env - vaultwarden:
``` - data/
- compose.yaml
- .env
---
::
Ouvrez Dockge, cliquez sur `compose`, appelez la stack `vaultwarden` puis copiez collez ceci : ::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `vaultwarden`, et collez ce qui suit :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -57,31 +59,32 @@ services:
- SIGNUPS_VERIFY=true - SIGNUPS_VERIFY=true
- SIGNUPS_VERIFY_RESEND_TIME=3600 - SIGNUPS_VERIFY_RESEND_TIME=3600
- SIGNUPS_VERIFY_RESEND_LIMIT=5 - SIGNUPS_VERIFY_RESEND_LIMIT=5
``` ```
::tip{icon=""} ::tip{icon=""}
✨ __Astuce :__ Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour ✨ __Astuce :__ ajoutez le label Watchtower dans chaque conteneur pour automatiser les mises à jour
```yaml [compose.yaml] ```yaml [compose.yaml]
---
services: services:
vaultwarden: vaultwarden:
#... #...
labels: labels:
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true
``` ```
:: ::
Nous allons maintenant générer un hash de mot de passe, qu'il faudra renseigner dans la variable `TOKEN` du `.env` ### Renseigner vos variables d'environnement
Générez ensuite un hash de mot de passe à mettre dans la variable `TOKEN` du `.env` :
```bash [Terminal] ```bash [Terminal]
echo -n 'votremotdepasse' | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 echo -n 'votremotdepasse' | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4
``` ```
Copiez le résultat précieusement et gardez en tête le mot de passe que vous avez choisi. Copiez le résultat en lieu sûr.
Dans le `.env`, renseignez les variables suivantes : Dans le fichier `.env`, renseignez les variables suivantes :
```properties [.env] ```properties [.env]
URL= URL=
@@ -89,27 +92,33 @@ TOKEN=
``` ```
| Variable | Valeur | Exemple | | Variable | Valeur | Exemple |
|-------------------------|---------------------------------------------------------|----------------------------| |----------|-------|---------|
| `URL`{lang=properties} | L'url de votre serveur vaultwarden | `https://vault.domaine.fr` | | `URL` | L'URL de votre serveur Vaultwarden | `https://vault.mondomaine.fr` |
| `TOKEN`{lang=properties} | Le token que vous avez précédemment copié précieusement | `'$argon2id$v=19$m=65540,t=3,p=4$bXBGME` | | `TOKEN` | Le token copié précédemment | `'$argon2id$v=19$m=65540,t=3,p=4$bXBGME...` |
Puis déployez le conteneur. Déployez ensuite le conteneur.
Depuis quelques temps, Vaultwarden ne permet pas d'etre accéder sans certificat SSL, ce qui empeche d'y accéder via son IP local. Nous y accèderons donc après l'avoir exposé avec SWAG, qui ajoute lui même un certificat SSL. Depuis peu, Vaultwarden exige du SSL pour être accessible, ce qui empêche l'accès via une IP locale. Nous allons l'exposer avec SWAG, qui fournit un certificat SSL.
### Terminé !
::
::caution ::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu. __Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
:: ::
## Exposer Vaultwarden avec SWAG ## Exposer Vaultwarden avec SWAG
Tout l'intérêt d'une telle solution, c'est de pouvoir y accéder à distance et sur tout vos appareils. Pour cela, nous allons exposer Vaultwarden via [SWAG](/fr/serveex/core/swag). Le principal intérêt de Vaultwarden est de pouvoir y accéder à distance depuis n'importe quel appareil. Nous allons l'exposer à travers [SWAG](/serveex/core/swag).
::note ::note{icon="" to="/general/networking/nat"}
__Au préalable :__ nous partons du principe que vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `vault.mondomaine.fr` avec pour `CNAME` `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), que que vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). 📋 __Au préalable :__ assurez-vous d'avoir créé un sous-domaine DNS du type `vault.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` et (à moins d'utiliser Cloudflare Zero Trust) d'avoir redirigé le port `443` de votre box vers le `443` de votre serveur via les **règles NAT**.
:: ::
Dans Dockge, rendez-vous dans la stack de SWAG et éditez le compose en ajoutant le réseau de vaultwarden : ::steps{level="3"}
### Ajouter le réseau de Vaultwarden à SWAG
Dans Dockge, allez sur la stack SWAG et modifiez le fichier compose pour y ajouter le réseau de Vaultwarden :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -117,34 +126,37 @@ services:
swag: swag:
container_name: # ... container_name: # ...
# ... # ...
networks: # Relie le conteneur au réseau custom networks: # Rattache le conteneur au réseau personnalisé
# ... # ...
- vaultwarden # Nom du réseau déclaré dans la stack - vaultwarden # Nom du réseau déclaré
networks: # Définit le réseau custom networks: # Définit le réseau personnalisé
# ... # ...
vaultwarden: # Nom du réseau déclaré dans la stack vaultwarden: # Nom du réseau déclaré
name: vaultwarden_default # Nom véritable du réseau externe name: vaultwarden_default # Nom réel du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe external: true
``` ```
::note ::note
Ici nous partons du principe que le nom du réseau de vaultwarden est `vaultwarden_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant http://ipduserveur:81. Nous partons du principe que le nom du réseau est `vaultwarden_default`. Vous pouvez vérifier la connectivité en visitant le tableau de bord de SWAG sur http://ipdevotreserveur:81.
:: ::
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel. Redémarrez la stack en cliquant sur « Deploy » et attendez que SWAG soit pleinement opérationnel.
Dans les dossiers de Swag, créez le fichier `vault.subdomain.conf`. ### Créer le fichier subdomain.conf
::tip{icon=""} Dans le dossier de configuration de SWAG, créez le fichier `vault.subdomain.conf` :
✨ __Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ utilisez **File Browser Quantum** pour naviguer et modifier les fichiers plutôt que des commandes dans le terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/vault.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/vault.subdomain.conf
``` ```
Collez la configuration ci-dessous :
Et collez la configuration suivante :
```nginx [vault.subdomain.conf] ```nginx [vault.subdomain.conf]
server { server {
@@ -171,13 +183,13 @@ server {
#auth_basic "Restricted"; #auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd; #auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block) # enable for ldap auth
#include /config/nginx/ldap-location.conf; #include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block) # enable for Authelia
#include /config/nginx/authelia-location.conf; #include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block) # enable for Authentik
#include /config/nginx/authentik-location.conf; #include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf; include /config/nginx/proxy.conf;
@@ -186,7 +198,6 @@ server {
set $upstream_port 80; set $upstream_port 80;
set $upstream_proto http; set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port; proxy_pass $upstream_proto://$upstream_app:$upstream_port;
} }
location ~ ^(/vaultwarden)?/admin { location ~ ^(/vaultwarden)?/admin {
@@ -194,13 +205,13 @@ server {
#auth_basic "Restricted"; #auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd; #auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block) # enable for ldap auth
#include /config/nginx/ldap-location.conf; #include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block) # enable for Authelia
#include /config/nginx/authelia-location.conf; #include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block) # enable for Authentik
#include /config/nginx/authentik-location.conf; #include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf; include /config/nginx/proxy.conf;
@@ -209,7 +220,6 @@ server {
set $upstream_port 80; set $upstream_port 80;
set $upstream_proto http; set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port; proxy_pass $upstream_proto://$upstream_app:$upstream_port;
} }
location ~ (/vaultwarden)?/api { location ~ (/vaultwarden)?/api {
@@ -219,7 +229,6 @@ server {
set $upstream_port 80; set $upstream_port 80;
set $upstream_proto http; set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port; proxy_pass $upstream_proto://$upstream_app:$upstream_port;
} }
location ~ (/vaultwarden)?/notifications/hub { location ~ (/vaultwarden)?/notifications/hub {
@@ -229,17 +238,100 @@ server {
set $upstream_port 80; set $upstream_port 80;
set $upstream_proto http; set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port; proxy_pass $upstream_proto://$upstream_app:$upstream_port;
} }
} }
``` ```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Ente"}, puis quittez avec :kbd{value="Ctrl+X"}. Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
Et voilà, vous avez exposé Vaultwarden ! Accédez au panneau d'administration via `https://vault.mondomaine.fr/admin` et collez le mot de passe que vous avez choisi pour générer l'`ADMIN_TOKEN`. Plus d'info sur les fonctionnalités de [Bitwarden](https://bitwarden.com/help/). ### Terminé !
N'oubliez pas d'installer les extensions Bitwarden (elles sont compatibles avec Vaultwarden) pour [Chrome](https://chromewebstore.google.com/detail/gestionnaire-de-mots-de-p/nngceckbapebfimnlniiiahkandclblb) ou pour [Firefox](https://addons.mozilla.org/fr/firefox/addon/bitwarden-password-manager/) ainsi que les applications [iOS](https://apps.apple.com/fr/app/bitwarden/id1137397744) et [Android](https://play.google.com/store/apps/details?id=com.x8bit.bitwarden&hl=fr) afin de synchroniser vos mot de passe.
::tip{icon=""}
✨ __Astuce :__ vous pouvez protéger cette app avec Authentik en ouvrant `tools.subodmain.conf` et en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy).
:: ::
Et voilà ! Vaultwarden est maintenant exposé ! Rendez-vous sur `https://vault.mondomaine.fr/admin` pour accéder au panneau d'administration et collez le mot de passe que vous avez indiqué lors de la génération de l'`ADMIN_TOKEN`. Pour plus d'informations, voir la [documentation Bitwarden](https://bitwarden.com/help/).
N'oubliez pas d'installer les extensions navigateur Bitwarden (elles fonctionnent avec Vaultwarden) pour [Chrome](https://chromewebstore.google.com/detail/gestionnaire-de-mots-de-p/nngceckbapebfimnlniiiahkandclblb) et [Firefox](https://addons.mozilla.org/fr/firefox/addon/bitwarden-password-manager/), ainsi que les applications [iOS](https://apps.apple.com/fr/app/bitwarden/id1137397744) et [Android](https://play.google.com/store/apps/details?id=com.x8bit.bitwarden&hl=fr) pour synchroniser vos mots de passe.
## Protéger Vaultwarden avec Pocket ID
Contrairement à la plupart des applications de ce site, Vaultwarden gère OIDC nativement, il n'y a donc pas besoin ici du proxy forward-auth de TinyAuth ni de l'astuce reverse-proxy d'Authentik : Vaultwarden lui-même peut exiger une connexion OIDC avant de laisser qui que ce soit entrer dans le coffre.
::steps{level="3"}
### Enregistrer Vaultwarden comme client OIDC
[Enregistrez un client OIDC dans Pocket ID](/serveex/security/pocket-id#registering-an-oidc-client) (ou dans Authentik, ou tout autre fournisseur OIDC) avec cette URL de callback :
```text
https://vault.mondomaine.fr/identity/connect/oidc-signin
```
### Ajouter les variables SSO
Modifiez le fichier `.env` de Vaultwarden :
```bash [Terminal]
sudo nano /srv/docker/vaultwarden/.env
```
Ajoutez ceci :
```properties [.env]
SSO_ENABLED=true
SSO_ONLY=true
SSO_AUTHORITY=https://id.mondomaine.fr
SSO_CLIENT_ID=
SSO_CLIENT_SECRET=
```
| Variable | Valeur |
|----------|-------|
| `SSO_AUTHORITY`{lang=properties} | L'URL publique de votre fournisseur OIDC (Pocket ID ici) |
| `SSO_CLIENT_ID`{lang=properties} | Le client ID copié depuis votre fournisseur |
| `SSO_CLIENT_SECRET`{lang=properties} | Le client secret copié depuis votre fournisseur |
::note
Mettez plutôt `SSO_ONLY=false` si vous préférez garder aussi la possibilité de vous connecter avec un mot de passe maître local.
::
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Redéployer la stack
Redéployez Vaultwarden. Votre prochaine visite sur `https://vault.mondomaine.fr` demandera une connexion SSO plutôt que (ou en plus de) le mot de passe maître local.
### Terminé !
::
::note{to="https://github.com/dani-garcia/vaultwarden/wiki/Enabling-SSO-support-using-OpenId-Connect"}
Voir le **wiki SSO de Vaultwarden** pour la liste complète des options, y compris l'application par organisation et les politiques de mot de passe maître.
::
::::tip{icon=""}
✨ Vous pouvez utiliser [Authentik](/serveex/advanced/authentik) plutôt que Pocket ID :
:::collapsible{name="les étapes de configuration Authentik"}
::steps{level="4"}
#### Créer un scope mapping pour le claim email
Dans Authentik, créez un scope mapping nommé `email` avec l'expression `return {"email": request.user.email, "email_verified": True}` (Vaultwarden exige ce claim).
#### Créer l'application et le provider
Créez une application et un provider OAuth2/OpenID Connect nommé `Vaultwarden`, avec une redirect URI (de type `Strict`) valant `https://vault.mondomaine.fr/identity/connect/oidc-signin`. Dans les Advanced protocol settings, réglez la validité du token d'accès à plus de 5 minutes, remplacez le scope email par défaut par votre mapping personnalisé, et ajoutez le scope mapping `offline_access`.
#### Renseigner les variables d'environnement de Vaultwarden
Notez les __Client ID__, __Client Secret__ et __Slug__ du provider, puis utilisez-les dans le `.env` de Vaultwarden :
```properties [.env]
SSO_AUTHORITY=https://authentik.mondomaine.fr/application/o/<slug>/
SSO_CLIENT_ID=
SSO_CLIENT_SECRET=
SSO_SCOPES=email profile offline_access
```
#### Terminé !
::
:::
::::
@@ -0,0 +1,2 @@
title: Avancé
icon: i-lucide-flask-conical
@@ -1,18 +1,10 @@
--- ---
title: Authentik title: Authentik
description: Installer Authentik comme fournisseur d'identité auto-hébergé configurer le MFA et protéger vos services avec du SSO et l'authentification via reverse proxy. description: Installer Authentik comme fournisseur d'identité auto-hébergé, configurer le MFA et protéger vos services avec du SSO et l'authentification via reverse proxy.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Authentik
::note
🎯 __Objectifs :__
- Installer et exposer Authentik
- Paramétrer le Multi-Facteur
- Protéger une app native ou via reverse proxy
::
[Authentik](https://goauthentik.io) est un outil d'authentification unique permettant de vous logger une seule fois sur les plateformes compatibles OpenID. Il permet également de sécuriser l'accès aux services que vous exposez, en s'injectant via SWAG aux requetes vers vos services. [Authentik](https://goauthentik.io) est un outil d'authentification unique permettant de vous logger une seule fois sur les plateformes compatibles OpenID. Il permet également de sécuriser l'accès aux services que vous exposez, en s'injectant via SWAG aux requetes vers vos services.
@@ -53,10 +45,10 @@ root
Créez les dossiers : Créez les dossiers :
```bash [Terminal] ```bash [Terminal]
sudo mkdir -p /docker/authentik/media /docker/authentik/certs /docker/authentik/custom-template /docker/authentik/ssh sudo mkdir -p /srv/docker/authentik/media /srv/docker/authentik/certs /srv/docker/authentik/custom-template /srv/docker/authentik/ssh
``` ```
Positionnez vous dans le dossier `authentik` via `cd /docker/authentik` et générez un mot de passe et une clé secrete que l'on va intégrer dans le .env : Positionnez vous dans le dossier `authentik` via `cd /srv/docker/authentik` et générez un mot de passe et une clé secrete que l'on va intégrer dans le .env :
```bash [Terminal] ```bash [Terminal]
sudo echo "PG_PASS=$(openssl rand 36 | base64)" >> .env sudo echo "PG_PASS=$(openssl rand 36 | base64)" >> .env
@@ -66,7 +58,7 @@ sudo echo "AUTHENTIK_SECRET_KEY=$(openssl rand 60 | base64)" >> .env
Afin de générer la clé, nous avons créé les dossiers en amont du déploiement via Dockge. Dockge vous empechera de créer une stack du meme nom dans ces dossiers s'il n'existe pas de `compose.yml`. Il faut donc créer un `compose.yml` vide afin que ce dernier la reconnaisse comme existante dans les stacks inactives : Afin de générer la clé, nous avons créé les dossiers en amont du déploiement via Dockge. Dockge vous empechera de créer une stack du meme nom dans ces dossiers s'il n'existe pas de `compose.yml`. Il faut donc créer un `compose.yml` vide afin que ce dernier la reconnaisse comme existante dans les stacks inactives :
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/authentik/compose.yml sudo nano /srv/docker/authentik/compose.yml
``` ```
:: ::
@@ -190,18 +182,18 @@ Pour être utilisable hors de chez vous, vous devez exposer authentik.
::note ::note
📋 __Au préalable :__ <br/><br/> 📋 __Au préalable :__ <br/><br/>
Nous partons du principe quer vous avez créé dans votre [zone DNS](/fr/general/networking/dns) un sous domaine du type `auth.mondomaine.fr` avec pour CNAME `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Nous partons du principe quer vous avez créé dans votre [zone DNS](/general/networking/dns) un sous domaine du type `auth.mondomaine.fr` avec pour CNAME `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/serveex/security/cloudflare), vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/general/networking/nat).
:: ::
Ouvrez le fichier `authentik-server.conf`. Ouvrez le fichier `authentik-server.conf`.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce pour les allergiques au terminal :__ ✨ __Astuce pour les allergiques au terminal :__
vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/authentik-server.conf sudo nano /srv/docker/swag/config/nginx/authentik-server.conf
``` ```
Vérifiez que dans chaque cas les variables ci-dessous sont correctes : Vérifiez que dans chaque cas les variables ci-dessous sont correctes :
@@ -216,7 +208,7 @@ Si ce n'est pas le cas, éditez-les, puis enregistrez avec :kbd{value="Ctrl+O"}
Créez le fichier `auth.subdomain.conf` Créez le fichier `auth.subdomain.conf`
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/auth.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/auth.subdomain.conf
``` ```
@@ -333,7 +325,7 @@ Pourquoi le faire alors que Dockge a déjà une page d'authentification ? Tout s
Ensuite rendez-vous dans le fichier `dockge.mondomaine.fr`. Ensuite rendez-vous dans le fichier `dockge.mondomaine.fr`.
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf
``` ```
Puis enlevez les `#` des deux lignes `#include /config/nginx/authentik-server.conf;`{lang=nginx}. Puis enlevez les `#` des deux lignes `#include /config/nginx/authentik-server.conf;`{lang=nginx}.
@@ -356,24 +348,24 @@ Voilà votre nouvelle architecture :
![Picture](/img/serveex/authentik.svg) ![Picture](/img/serveex/authentik.svg)
## Protéger un service sur un serveur distant ## Protéger un service sur un serveur distant
Dans le cas d'une application [native](/fr/serveex/security/authentik#protéger-une-app-native) (via OAuth 2.0 ou autre), rien ne change. Dans le cas d'une application [native](/serveex/advanced/authentik#protéger-une-app-native) (via OAuth 2.0 ou autre), rien ne change.
Dans le cas d'une application non native à protéger derrière un reverse proxy, vous devrez déployer un __avant-poste__. Un avant-poste est un conteneur qui jouera le rôle de proxy local, c'est à dire que c'est vers ce conteneur que les requêtes d'authentification de vos applications seront redirigées. C'est le seul qui est autorisé à dialoguer avec l'API de votre instance authentik. Dans le cas d'une application non native à protéger derrière un reverse proxy, vous devrez déployer un __avant-poste__. Un avant-poste est un conteneur qui jouera le rôle de proxy local, c'est à dire que c'est vers ce conteneur que les requêtes d'authentification de vos applications seront redirigées. C'est le seul qui est autorisé à dialoguer avec l'API de votre instance authentik.
::note ::note
Pré-requis : Pré-requis :
- Avoir installé [docker](/fr/serveex/core/docker) sur votre machine distante hébergeant le service à protéger. - Avoir installé [docker](/serveex/core/docker) sur votre machine distante hébergeant le service à protéger.
- Si l'application n'a pas d'intégration native, avoir un reverse proxy compatible. Comme partout ici, nous utiliserons [SWAG](/fr/serveex/core/swag). - Si l'application n'a pas d'intégration native, avoir un reverse proxy compatible. Comme partout ici, nous utiliserons [SWAG](/serveex/core/swag).
:: ::
Ce conteneur redirigera ensuite les requetes vers votre instance [Authentik](/fr/serveex/security/authentik#authentik) principale, à travers le web (ou votre réseau local). Le serveur executera les controle et renverra la réponse à l'_avant-poste_, qui bloquera ou non la connexion à l'app protégée. Ce conteneur redirigera ensuite les requetes vers votre instance [Authentik](/serveex/advanced/authentik#authentik) principale, à travers le web (ou votre réseau local). Le serveur executera les controle et renverra la réponse à l'_avant-poste_, qui bloquera ou non la connexion à l'app protégée.
![auth-outpost](/img/serveex/auth-outpost.svg) ![auth-outpost](/img/serveex/auth-outpost.svg)
### Configuration d'Authentik ### Configuration d'Authentik
Créez vos [fournisseurs et applications](/fr/serveex/security/authentik#protéger-une-app-native) comme nous l'avons vu plus haut. Créez vos [fournisseurs et applications](/serveex/advanced/authentik#protéger-une-app-native) comme nous l'avons vu plus haut.
Puis, dans votre panneau admin, allez dans la rubrique _Applications > Avant-postes_, puis créez un nouvel avant-poste. Puis, dans votre panneau admin, allez dans la rubrique _Applications > Avant-postes_, puis créez un nouvel avant-poste.
@@ -406,27 +398,27 @@ Sur l'écran affichant les avant-postes créés, vous verrez le nouvel avant-pos
### Configuration de la machine distante ### Configuration de la machine distante
Nous partons du principe que vous avez déjà installé [Docker](/fr/serveex/core/docker) et [SWAG](/fr/serveex/core/swag) sur cette machine distante. Nous partons du principe que vous avez déjà installé [Docker](/serveex/core/docker) et [SWAG](/serveex/core/swag) sur cette machine distante.
Sur votre machine distante, à l'aide de [Dockge](/fr/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs), créez une stack `authentik-outpost`. Sur votre machine distante, à l'aide de [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs), créez une stack `authentik-outpost`.
Si vous n'avez pas installé [Dockge](/fr/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs), créez un dossier `/docker/authentik-outpost`, ou directement en ligne de commande : Si vous n'avez pas installé [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs), créez un dossier `/srv/docker/authentik-outpost`, ou directement en ligne de commande :
```bash [Terminal] ```bash [Terminal]
sudo mkdir -P /docker/authentik-outpost sudo mkdir -P /srv/docker/authentik-outpost
``` ```
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce pour les allergiques au terminal :__ ✨ __Astuce pour les allergiques au terminal :__
vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
Créez le fichier `compose.yaml` ou copiez la configuration directement dans le champs si vous avez [Dockge](/fr/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs) Créez le fichier `compose.yaml` ou copiez la configuration directement dans le champs si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs)
En ligne de commande : En ligne de commande :
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/authentik-outpost/compose.yaml sudo nano /srv/docker/authentik-outpost/compose.yaml
``` ```
Collez la configuration suivante, en changeant les chiffres de `{AUTHENTIK_TAG:proxy:2024.2.3}`{lang=properties} par la meme version que celle de votre serveur Authentik. Collez la configuration suivante, en changeant les chiffres de `{AUTHENTIK_TAG:proxy:2024.2.3}`{lang=properties} par la meme version que celle de votre serveur Authentik.
@@ -455,10 +447,10 @@ services:
# AUTHENTIK_HOST_BROWSER: https://external-domain.tld # AUTHENTIK_HOST_BROWSER: https://external-domain.tld
``` ```
Rendez-vous sur la stack de SWAG de la machine distante (ou remplissez directement si vous avez [Dockge](/fr/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs)) et ajoutez le réseau de authentik-outpost dans le fichier de conf sur ce modele (les champs `networks`) : Rendez-vous sur la stack de SWAG de la machine distante (ou remplissez directement si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs)) et ajoutez le réseau de authentik-outpost dans le fichier de conf sur ce modele (les champs `networks`) :
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/compose.yaml sudo nano /srv/docker/swag/compose.yaml
``` ```
```yaml [compose.yaml] ```yaml [compose.yaml]
@@ -485,21 +477,21 @@ Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez a
Ici nous partons du principe que le nom du réseau de dockge est `authentik-outpost_default`. Ici nous partons du principe que le nom du réseau de dockge est `authentik-outpost_default`.
:: ::
Si vous avez [Dockge](/fr/serveex/core/docker#installer-dockge-pour-g"rer-et-d"ployer-les-conteneurs), relancez SWAG. Si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-g"rer-et-d"ployer-les-conteneurs), relancez SWAG.
Sinon, via le terminal : Sinon, via le terminal :
```bash [Terminal] ```bash [Terminal]
cd /docker/swag/ cd /srv/docker/swag/
sudo docker compose up -d sudo docker compose up -d
``` ```
Creez (ou remplissez directement si vous avez [Dockge](/fr/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs)) le fichier `.env` dans le dossier de l'avant poste authentik : Creez (ou remplissez directement si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs)) le fichier `.env` dans le dossier de l'avant poste authentik :
En ligne de commande : En ligne de commande :
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/authentik-outpost/.env sudo nano /srv/docker/authentik-outpost/.env
``` ```
Collez la configuration suivante Collez la configuration suivante
@@ -517,12 +509,12 @@ Remplissez comme suit
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}. Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
Si vous avez [Dockge](/fr/serveex/core/docker#installer-dockge-pour-g"rer-et-d"ployer-les-conteneurs), déployez la stack. Si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-g"rer-et-d"ployer-les-conteneurs), déployez la stack.
Sinon, via le terminal : Sinon, via le terminal :
```bash [Terminal] ```bash [Terminal]
cd /docker/authentik-outpost/ cd /srv/docker/authentik-outpost/
sudo docker compose up -d sudo docker compose up -d
``` ```
@@ -533,7 +525,7 @@ Nous allons a présent configurer SWAG.
Ouvrez le fichier `authentik-server.conf`. Ouvrez le fichier `authentik-server.conf`.
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/authentik-server.conf sudo nano /srv/docker/swag/config/nginx/authentik-server.conf
``` ```
Dans le fichier, changez `authentik-server` par `authentik-outpost` comme suit : Dans le fichier, changez `authentik-server` par `authentik-outpost` comme suit :
@@ -545,7 +537,7 @@ proxy_pass http://$upstream_authentik:9000;
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}. Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
Ensuite, configurez les applications à protéger selon si elles sont [natives](/fr/serveex/security/authentik#protéger-une-app-native) ou par [proxy](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy) comme vous l'avez fait sur votre serveur principal. Ensuite, configurez les applications à protéger selon si elles sont [natives](/serveex/advanced/authentik#protéger-une-app-native) ou par [proxy](/serveex/advanced/authentik#protéger-une-app-par-reverse-proxy) comme vous l'avez fait sur votre serveur principal.
## Migrer une base authentik ## Migrer une base authentik
Sur la machine d'origine, dumper la bdd : Sur la machine d'origine, dumper la bdd :
@@ -0,0 +1,344 @@
---
title: Arcane
description: Installer Arcane, une interface web moderne de gestion Docker et Compose, comme alternative plus avancée à Dockge avec gestion multi-hôtes et connexion OIDC.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
::note{to="/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs"}
C'est une alternative avancée à **Dockge** : il peut gérer plusieurs hôtes Docker distants depuis une seule instance, et prend en charge la connexion OIDC nativement plutôt que de dépendre d'un proxy de forward-auth séparé.
::
[Arcane](https://github.com/getarcaneapp/arcane) est une interface web auto-hébergée pour gérer les conteneurs, images, volumes et stacks Compose de Docker.
![Arcane](/img/serveex/arcane.png)
- [Documentation d'Arcane](https://getarcane.app/docs/)
- [Arcane sur GitHub](https://github.com/getarcaneapp/arcane)
::note{to="https://docs.linuxserver.io/images/docker-socket-proxy/"}
Arcane a besoin d'accéder au socket Docker pour gérer les conteneurs, ce qui équivaut à un accès root sur votre hôte. Plutôt que de monter le socket directement, ce tutoriel place **Docker Socket Proxy** devant, en n'autorisant que les permissions d'API dont Arcane a réellement besoin. Quoi que vous utilisiez, assurez-vous qu'Arcane lui-même ne soit jamais joignable sans authentification.
::
## Installation
::file-tree
---
tree:
/:
- srv:
- docker:
- arcane:
- compose.yaml
- .env
- data/
---
::
::steps{level="3"}
### Générer une clé de chiffrement
```bash [Terminal]
openssl rand -base64 32
```
Gardez le résultat, vous en aurez besoin pour le fichier `.env` ci-dessous.
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `arcane`, et ajoutez la configuration suivante. Elle inclut le socket proxy : `arcane` ne touche jamais directement à `/var/run/docker.sock`, seul `docker-socket-proxy` le fait, et il n'autorise que les permissions dont Arcane a besoin (conteneurs, images, réseaux, volumes, exec, build/commit), sur leur propre réseau interne :
```yaml [compose.yaml]
---
services:
arcane:
image: ghcr.io/getarcaneapp/manager:latest
container_name: arcane
restart: unless-stopped
cgroup: host
env_file:
- .env
volumes:
- /srv/docker/arcane/data:/app/data
networks:
- arcane-internal
ports:
- 3552:3552
depends_on:
- docker-socket-proxy
docker-socket-proxy:
image: lscr.io/linuxserver/socket-proxy:latest
container_name: arcane-docker-proxy
security_opt:
- no-new-privileges:true
networks:
- arcane-internal
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- CONTAINERS=1
- IMAGES=1
- NETWORKS=1
- VOLUMES=1
- EXEC=1
- BUILD=1
- COMMIT=1
- INFO=1
- SYSTEM=1
- POST=1
- ALLOW_START=1
- ALLOW_STOP=1
- ALLOW_RESTARTS=1
restart: unless-stopped
read_only: true
tmpfs:
- /run
networks:
arcane-internal:
name: arcane-internal
```
::note
`POST=1` est l'autorisation d'écriture globale nécessaire pour créer et supprimer conteneurs, images, réseaux et volumes ; `ALLOW_START`/`ALLOW_STOP`/`ALLOW_RESTARTS` couvrent séparément les actions sur le cycle de vie des conteneurs. Tout le reste (Swarm, secrets, configs, auth) est laissé à sa valeur par défaut `0`, puisque ce site ne les utilise pas.
::
::tip{icon=""}
✨ Ajoutez le label Watchtower pour automatiser les mises à jour :
```yaml [compose.yaml]
---
services:
arcane:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
### Renseigner vos variables d'environnement
Remplissez le fichier `.env` :
```properties [.env]
APP_URL=https://arcane.mondomaine.fr
ENCRYPTION_KEY=
DOCKER_HOST=tcp://docker-socket-proxy:2375
PUID=1000
PGID=1000
```
| Variable | Valeur | Exemple |
|----------|-------|---------|
| `APP_URL`{lang=properties} | L'URL publique par laquelle vous joindrez Arcane (voir l'exposition plus bas), sans port | `https://arcane.mondomaine.fr` |
| `ENCRYPTION_KEY`{lang=properties} | La clé générée ci-dessus | `Q2pVEqsTNRkJSO9SkJzU3KZ2...` |
| `DOCKER_HOST`{lang=properties} | Pointe Arcane vers le socket proxy plutôt qu'un socket monté | `tcp://docker-socket-proxy:2375` |
| `PUID` / `PGID`{lang=properties} | Vos identifiants d'utilisateur et de groupe, via `id votreutilisateur` | `1000` |
Déployez la stack. L'interface locale est disponible sur `http://ipdevotreserveur:3552`.
### Terminé !
::
::caution
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
## Exposer Arcane avec SWAG
Le principal intérêt de cette installation est de pouvoir accéder à Arcane à distance depuis tous vos appareils. Nous allons l'exposer avec SWAG.
::warning
La connexion locale d'Arcane n'a pas d'authentification multifacteur. Ne l'exposez que si vous utilisez [Pocket ID](/serveex/security/pocket-id) (voir plus bas) ou [Authentik](/serveex/advanced/authentik) pour la connexion. Sinon, ne l'exposez pas avec SWAG. Utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard), surtout vu le niveau d'accès qu'Arcane a sur votre hôte.
::
::note
Nous partons du principe que vous avez le sous-domaine `arcane.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Et bien sûr, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box doit être redirigé vers le port `443` de votre serveur dans les [règles NAT](/general/networking/nat).
::
::steps{level="3"}
### Ajouter le réseau d'Arcane à SWAG
Allez dans Dockge et modifiez le fichier compose de SWAG en y ajoutant le réseau d'Arcane :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Rattache le conteneur au réseau personnalisé
# ...
- arcane # Nom du réseau déclaré
networks: # Définit le réseau personnalisé
# ...
arcane: # Nom du réseau déclaré
name: arcane_default # Nom réel du réseau externe
external: true # Le marque comme défini à l'extérieur
```
Redéployez la stack et attendez que SWAG soit pleinement opérationnel.
::note
Nous partons ici du principe que le nom du réseau d'Arcane est `arcane_default`. Vous pouvez vérifier la connexion en visitant le tableau de bord de SWAG sur `http://ipdevotreserveur:81`.
::
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `arcane.subdomain.conf` :
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ utilisez **File Browser Quantum** pour naviguer et modifier les fichiers plutôt que des commandes dans le terminal.
::
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/arcane.subdomain.conf
```
Collez la configuration suivante :
```nginx [arcane.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name arcane.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app arcane;
set $upstream_port 3552;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
```
::note
Les mises à jour en direct d'Arcane passent par un websocket, d'où les en-têtes `Upgrade`/`Connection` ci-dessus, en plus de l'inclusion habituelle de `proxy.conf`.
::
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Terminé !
::
Et voilà ! Arcane est maintenant accessible depuis internet.
## Connecter un hôte distant
Arcane peut gérer plusieurs hôtes Docker depuis une seule instance. Chaque hôte distant fait tourner un conteneur **agent** léger qui se reconnecte à Arcane. Plutôt que d'exposer cette connexion sur internet, nous la ferons passer par le [VPN WireGuard](/serveex/core/wireguard) déjà mis en place plus tôt, ainsi le trafic de l'agent ne quitte jamais votre réseau privé.
::note{to="/serveex/core/wireguard#client-server-setup"}
Ceci suppose que l'hôte Arcane et l'hôte distant font déjà tourner leur propre client WireGuard, connectés à votre VPN comme décrit dans **Client Server Setup**. Notez l'adresse VPN que wg-easy a attribuée à l'__hôte Arcane__ (par exemple `10.8.0.3`) ; c'est l'adresse que visera l'agent distant ci-dessous.
::
::steps{level="3"}
### Ajouter l'environnement distant dans Arcane
Dans Arcane, allez dans _Environments > Add Environment_. Arcane génère un __Agent Token__ à usage unique et le bout de configuration compose à déployer sur l'hôte distant.
### Déployer l'agent sur l'hôte distant
Sur l'hôte distant, ouvrez Dockge, cliquez sur `compose`, nommez la stack `arcane-agent`, et ajoutez la configuration suivante, en remplaçant le token par celui qu'Arcane vous a donné et l'URL par l'adresse VPN de votre hôte Arcane :
```yaml [compose.yaml]
---
services:
arcane-agent:
image: ghcr.io/getarcaneapp/agent:latest
container_name: arcane-agent
restart: unless-stopped
environment:
- EDGE_AGENT=true
- EDGE_TRANSPORT=poll
- AGENT_TOKEN=arc_votretoken
- MANAGER_API_URL=http://10.8.0.3:3552
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /srv/docker/arcane-agent/data:/app/data
```
::note
C'est le « mode edge » : l'agent se connecte vers Arcane plutôt que l'inverse, il fonctionne donc derrière un NAT sans rien rediriger sur la box de l'hôte distant. Utiliser l'adresse VPN plutôt qu'un domaine public fait que cette connexion reste sur le tunnel WireGuard même si l'agent est techniquement en mode « edge ». Contrairement au manager ci-dessus, l'agent a besoin du vrai socket Docker monté directement, puisque c'est lui qui exécute réellement les commandes sur cet hôte ; il n'existe pas d'option socket-proxy documentée pour lui.
::
Déployez la stack.
### Vérifier la connexion
De retour dans Arcane, le nouvel environnement devrait apparaître comme connecté en quelques secondes. Basculez dessus depuis le sélecteur d'environnement pour gérer les conteneurs et les stacks de cet hôte.
### Terminé !
::
## Connecter Pocket ID
Arcane gère OIDC nativement, vous pouvez donc exiger une connexion Pocket ID avant de laisser qui que ce soit gérer vos conteneurs, plutôt qu'avec (ou en plus de) les comptes propres à l'application.
::steps{level="3"}
### Enregistrer Arcane comme client OIDC
[Enregistrez un client OIDC dans Pocket ID](/serveex/security/pocket-id#registering-an-oidc-client) nommé `arcane`, avec cette URL de callback :
```text
https://arcane.mondomaine.fr/auth/oidc/callback
```
### Activer OIDC dans Arcane
Modifiez le fichier `.env` d'Arcane et ajoutez :
```properties [.env]
OIDC_ENABLED=true
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_ISSUER_URL=https://id.mondomaine.fr
OIDC_SCOPES=openid email profile
OIDC_PROVIDER_NAME=Pocket ID
```
| Variable | Valeur |
|----------|-------|
| `OIDC_CLIENT_ID`{lang=properties} | Le client ID copié depuis Pocket ID |
| `OIDC_CLIENT_SECRET`{lang=properties} | Le client secret copié depuis Pocket ID |
| `OIDC_ISSUER_URL`{lang=properties} | L'URL publique de Pocket ID, sans slash final ; Arcane découvre le reste via `.well-known/openid-configuration` |
Redéployez la stack.
::tip{icon=""}
✨ Pour aller directement sur Pocket ID et masquer le formulaire de connexion local, mettez `OIDC_AUTO_REDIRECT_TO_PROVIDER=true`, ou désactivez complètement la connexion locale dans _Settings > Authentication_ pour un accès uniquement OIDC.
::
### Terminé !
::
Et voilà ! Arcane propose désormais une option « Login with Pocket ID » à côté du formulaire de connexion local.
::tip{icon="" to="/serveex/advanced/authentik"}
✨ Vous pouvez utiliser **Authentik** plutôt que Pocket ID :
1. Dans Authentik, créez une application et un provider OAuth2/OpenID Connect nommé `Arcane`, avec une redirect URI (de type `Strict`) valant `https://arcane.mondomaine.fr/auth/oidc/callback`.
2. Notez les __Client ID__ et __Client Secret__ du provider.
3. Dans le `.env` d'Arcane, mettez `OIDC_ISSUER_URL=https://authentik.mondomaine.fr/application/o/arcane/`, puis renseignez le Client ID et le Client Secret.
::
+2 -1
View File
@@ -1,10 +1,11 @@
--- ---
title: Introduction title: Introduction
description: Introduction à Stockeex un projet personnel de gestion de stock et d'inventaire. Documentation en cours de rédaction. description: Introduction à Stockeex, un projet personnel de gestion de stock et d'inventaire. Documentation en cours de rédaction.
navigation: navigation:
icon: i-lucide-bookmark icon: i-lucide-bookmark
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Stockeex # Stockeex
+82
View File
@@ -0,0 +1,82 @@
---
title: Mes bêtises
description: Petits projets Python et Bash, scripts et outils écrits pour résoudre des problèmes précis de homelab, en marge des guides Serveex.
navigation:
icon: i-lucide-bookmark
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
## Petits scripts et projets annexes
Tout ne rentre pas dans un guide « installez cette application ». Cette section rassemble les petits projets Python et Bash écrits en chemin : des scripts qui automatisent une corvée précise, collent deux applications ensemble, ou grattent là où ça démange. Moins peaufinés que [Serveex](/serveex/introduction), mais souvent plus amusants.
### Python
:::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px}
:::
::card-group
::card
---
icon: i-simple-icons-nvidia
title: Nvidia Stock Bot
to: /nonsense/python/nvidia-stock-bot
ui:
icon: text-[#76B900]
---
Des alertes Discord sur la disponibilité des GPU
::
::card
---
icon: i-cbi-adguard
title: Adguard CIDRE
to: /nonsense/python/adguard-cidre
ui:
icon: text-[#68BC71]
---
Synchroniser automatiquement les listes CIDR d'AdGuard Home
::
::card{icon="i-brand-lumeex" title="Lumeex" to="/nonsense/python/lumeex"}
Un générateur de galerie photo statique minimaliste
::
::card{icon="i-brand-instameex" title="Instameex" to="/nonsense/python/instameex"}
Fusionner des exports SDR/HDR pour Instagram HDR
::
::
### Bash
:::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px}
:::
::card-group
::card{icon="i-lucide-copy-check" title="Servarr corrector" to="/nonsense/bash/servarr-duplicates"}
Dédoublonner les bibliothèques Sonarr/Radarr avec des hardlinks
::
::card{icon="i-lucide-lock-keyhole" title="LUKS Backup" to="/nonsense/bash/luks-backup"}
Sauvegarder les en-têtes LUKS des disques chiffrés
::
::card{icon="i-lucide-shield" title="Socat Proxy" to="/nonsense/bash/socat-proxy"}
Monter le proxy du socket Docker pour les conteneurs en mode host
::
::card{icon="i-lucide-thermometer" title="HotDisk" to="/nonsense/bash/hotdisk"}
Éteindre le serveur si les disques surchauffent
::
::card{icon="i-lucide-database-backup" title="Backrest Docker Stop" to="/nonsense/bash/backrest-docker-stop"}
Arrêter proprement les conteneurs autour d'une sauvegarde Backrest
::
::card{icon="i-lucide-shield-alert" title="rm Confirmation Guard" to="/nonsense/bash/rm-confirmation"}
Un wrapper sudo qui demande confirmation avant de laisser passer rm
::
::
@@ -1,14 +1,10 @@
--- ---
title: Nvidia Stock Bot title: Nvidia Stock Bot
description: Un bot Python qui surveille la disponibilité des GPU en temps réel et envoie des alertes Discord créé lors de la pénurie de la série RTX 5000. description: Un bot Python qui surveille la disponibilité des GPU en temps réel et envoie des alertes Discord, créé lors de la pénurie de la série RTX 5000.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Scripts python
Mes cochonneries en python
## 🤖 Nvidia Stock Bot
Depuis déjà 4 ans, la pénurie de materiel electronique fait rage. Et les cartes graphiques ne sont pas épargnées. En 2020, j'ai du attendre 2 mois pour obtenir mon exemplaire de RTX 3080, et pour cela j'ai du m'inscrire sur [JV Hardware](https://discord.gg/gxffg3GA96) où une poignée de geek avait mis en place un bot qui envoyait un ping lorsqu'elles étaient disponibles. Depuis déjà 4 ans, la pénurie de materiel electronique fait rage. Et les cartes graphiques ne sont pas épargnées. En 2020, j'ai du attendre 2 mois pour obtenir mon exemplaire de RTX 3080, et pour cela j'ai du m'inscrire sur [JV Hardware](https://discord.gg/gxffg3GA96) où une poignée de geek avait mis en place un bot qui envoyait un ping lorsqu'elles étaient disponibles.
@@ -32,7 +28,6 @@ J'ai également eu la chance d'être référencé dans la fameuse [newsletter se
Plus d'infos directement sur le repo : Plus d'infos directement sur le repo :
::card{title="🐋 __Nvidia Stock Bot__" to="https://git.djeex.fr/Djeex/nvidia-stock-bot" target="_blank"}
::card{title="🐋 __Nvidia Stock Bot__"} Robot d'alerte de stock de GPU Nvidia
[Robot d'alerte de stock de GPU Nvidia](https://git.djeex.fr/Djeex/nvidia-stock-bot)
:: ::
@@ -3,8 +3,8 @@ title: Adguard CIDRE
description: Un script Python pour synchroniser automatiquement les listes CIDR d'AdGuard Home et sécuriser votre serveur DNS auto-hébergé exposé sur internet. description: Un script Python pour synchroniser automatiquement les listes CIDR d'AdGuard Home et sécuriser votre serveur DNS auto-hébergé exposé sur internet.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# 🤖 Adguard CIDRE Sync
Adguard Home est une solution merveilleuse pour filter ses requêtes DNS et ainsi se débarasser de la publicité ou des DNS des fournisseurs d'accès, ou encore réécrire des requetes. Adguard Home est une solution merveilleuse pour filter ses requêtes DNS et ainsi se débarasser de la publicité ou des DNS des fournisseurs d'accès, ou encore réécrire des requetes.
@@ -28,7 +28,6 @@ Tout ceci de manière complètement autonome, avec une fréquence choisie en var
Plus d'infos directement sur le repo : Plus d'infos directement sur le repo :
::card{title="🐋 __Adguard CIDRE Sync__"} ::card{title="🐋 __Adguard CIDRE Sync__"}
[Robot de synchronisation de la blocklist d'Adguard](https://git.djeex.fr/Djeex/adguard-cidre) [Robot de synchronisation de la blocklist d'Adguard](https://git.djeex.fr/Djeex/adguard-cidre)
:: ::
@@ -1,6 +1,6 @@
--- ---
title: Lumeex title: Lumeex
description: Lumeex est un générateur de galerie photo statique en Python minimaliste, léger et entièrement personnalisable sans CMS. description: Lumeex est un générateur de galerie photo statique en Python, minimaliste, léger et entièrement personnalisable sans CMS.
--- ---
@@ -14,7 +14,6 @@ description: Instameex est un outil Docker pour fusionner des exports SDR et HDR
<div align="center"> <div align="center">
<img src="https://git.djeex.fr/Djeex/instameex/raw/branch/main/illustration/instameex-illustration.png" width="640" alt="Instameex Screenshot" /> <img src="https://git.djeex.fr/Djeex/instameex/raw/branch/main/illustration/instameex-illustration.png" width="640" alt="Instameex Screenshot" />
</div> </div>
--- ---
Il n'y a rien de plus frustrant que la gestion du HDR d'Instagram. Ce dernier compresse et démolit les gainmaps, et au moindre changement de ratio ou de taille, supprime purement et simplement le HDR. Quant à Lightroom, son système de "SDR preview" est tout bonnement inacceptable, ne permettant pas d'obtenir des résultats corrects. Jusqu'ici, lorsque l'on veut poster sur Instagram, il faut choisir entre un SDR potable et un HDR déficient, ou l'inverse. Il n'y a rien de plus frustrant que la gestion du HDR d'Instagram. Ce dernier compresse et démolit les gainmaps, et au moindre changement de ratio ou de taille, supprime purement et simplement le HDR. Quant à Lightroom, son système de "SDR preview" est tout bonnement inacceptable, ne permettant pas d'obtenir des résultats corrects. Jusqu'ici, lorsque l'on veut poster sur Instagram, il faut choisir entre un SDR potable et un HDR déficient, ou l'inverse.
@@ -3,24 +3,26 @@ title: Doublons servarr
description: Un script bash pour détecter et corriger les fichiers médias en double dans les bibliothèques Sonarr et Radarr en remplaçant les copies par des hardlinks. description: Un script bash pour détecter et corriger les fichiers médias en double dans les bibliothèques Sonarr et Radarr en remplaçant les copies par des hardlinks.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Detection de doublons et remplacement par des hardlinks
Six mois après avoir téléchargé des térabytes de media, je me suis rendu compte que Sonarr et Radarr les copaient dans ma biblio Plex au lieu de créer des hardlinks. C'est dû à un mécanisme contre intuitif qui est que si vous montez plusieurs dossiers dans Sonarr/Radarr, il les voit comme deux systemes de fichiers différents. Et ne peut donc pas créer de hardlinks. C'est pour cela qu'il ne faut monter qu'un seul dossier parent, qui contient tous les enfants (`downloads`, `movies`, `tvseries` dans le dossier parent `media` par exemple). Six mois après avoir téléchargé des térabytes de media, je me suis rendu compte que Sonarr et Radarr les copaient dans ma biblio Plex au lieu de créer des hardlinks. C'est dû à un mécanisme contre intuitif qui est que si vous montez plusieurs dossiers dans Sonarr/Radarr, il les voit comme deux systemes de fichiers différents. Et ne peut donc pas créer de hardlinks. C'est pour cela qu'il ne faut monter qu'un seul dossier parent, qui contient tous les enfants (`downloads`, `movies`, `tvseries` dans le dossier parent `media` par exemple).
J'ai donc restructuré mes dossiers, remis à la main chaque chemin dans Qbittorrent, Plex, et autres. Il restait à trouver un moyen de détecter les doublons existants et d'automatiquement les supprimer et de créer des hardlinks à la place, pour économiser de l'espace. J'ai donc restructuré mes dossiers, remis à la main chaque chemin dans Qbittorrent, Plex, et autres. Il restait à trouver un moyen de détecter les doublons existants et d'automatiquement les supprimer et de créer des hardlinks à la place, pour économiser de l'espace.
Mes dossiers : ::file-tree
---
```text [Arborescence] label: Mes dossiers
. tree:
└── media .:
├── seedbox - media:
├── radarr - seedbox/
└── tv-radarr - radarr:
├── movies - tv-radarr/
└── tvseries - movies/
``` - tvseries/
---
::
Mes dossiers originaux sont dans `seedbox`, et il ne faut surtout pas les modifier pour qu'ils continuent d'etre "seed". Les copies, et donc doublons, sont dans `movies` et `tvseries`. Mais pour complexifier la chose, j'ai aussi des media uniques originaux déposés par ailleurs dans `movies` et `tvseries`, sinon cela serait trop facile. Et dans ces deux dossiers, il peut y avoir des sous dossiers, des sous-sous dossiers, etc. Mes dossiers originaux sont dans `seedbox`, et il ne faut surtout pas les modifier pour qu'ils continuent d'etre "seed". Les copies, et donc doublons, sont dans `movies` et `tvseries`. Mais pour complexifier la chose, j'ai aussi des media uniques originaux déposés par ailleurs dans `movies` et `tvseries`, sinon cela serait trop facile. Et dans ces deux dossiers, il peut y avoir des sous dossiers, des sous-sous dossiers, etc.
@@ -64,7 +66,6 @@ while IFS= read -r -d '' file; do
echo echo
fi fi
else else
# Si c'est la première fois qu'on rencontre ce nom de fichier
seen[$filename]="$inode" seen[$filename]="$inode"
seen["$filename:full_path"]="$file" seen["$filename:full_path"]="$file"
fi fi
@@ -82,7 +83,9 @@ Doublons pour "episode1.mkv" :
Avec "awk", il se serait arrêté à `/media/seedbox/sonarr/Serie`. Je ne suis absolument pas un pro, mais Qwen3 a été plus performant et m'a expliqué de A à Z pourquoi et comment faire. Avec "awk", il se serait arrêté à `/media/seedbox/sonarr/Serie`. Je ne suis absolument pas un pro, mais Qwen3 a été plus performant et m'a expliqué de A à Z pourquoi et comment faire.
Une fois que j'ai vu que cela fonctionnait bien, j'ai demandé un script qui fait l'intégralité de la cinématique, de la comparaison aux hardlinks en passant par la suppression des doublons. Une fois que j'ai vu que cela fonctionnait bien, j'ai demandé un script qui fait l'intégralité de la cinématique, de la comparaison aux hardlinks en passant par la suppression des doublons.
Encore une fois ChatGPT a été décevant. Malgré mes demandes, il créait d'abord les hardlinks et ensuite il supprimait les doublons. Ce qui.. suprimme aussi le lien (meme si cela conserve l'originale). Idiot. Encore une fois ChatGPT a été décevant. Malgré mes demandes, il créait d'abord les hardlinks et ensuite il supprimait les doublons. Ce qui.. suprimme aussi le lien (meme si cela conserve l'originale). Idiot.
Petit détour par Qwen3, et ma RTX 5090 en PLS, et paf un résultat bien plus propre. Bon il a gardé les emoji de ChatGPT qui peut pas s'empecher d'en mettre partout, mais voilà : Petit détour par Qwen3, et ma RTX 5090 en PLS, et paf un résultat bien plus propre. Bon il a gardé les emoji de ChatGPT qui peut pas s'empecher d'en mettre partout, mais voilà :
```bash [Terminal] ```bash [Terminal]
@@ -3,8 +3,8 @@ title: Luks backup
description: Un script bash pour extraire automatiquement les headers LUKS de tous les disques chiffrés, les identifier par numéro de série et les archiver de façon chiffrée. description: Un script bash pour extraire automatiquement les headers LUKS de tous les disques chiffrés, les identifier par numéro de série et les archiver de façon chiffrée.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Backup des headers luks pour disques/volumes chiffrés
Je me suis rendu compte il y a peu qu'il ne suffisait pas d'avoir le mot de passe pour deverouiller un volume luks apres une panne ou une corruption. J'ai ainsi appris à dump les headers luks des disques/volumes et à utiliser les numéros de série + noms de partitions pour pouvoir bien identifier quel header correspond à quel disque/partition (j'en ai 10 !). Je me suis rendu compte il y a peu qu'il ne suffisait pas d'avoir le mot de passe pour deverouiller un volume luks apres une panne ou une corruption. J'ai ainsi appris à dump les headers luks des disques/volumes et à utiliser les numéros de série + noms de partitions pour pouvoir bien identifier quel header correspond à quel disque/partition (j'en ai 10 !).
@@ -3,9 +3,8 @@ title: Socat Proxy
description: Utiliser socat pour proxifier le socket Docker via Docker Socket Proxy, permettant à Beszel de collecter les stats des conteneurs sans exposer le socket complet. description: Utiliser socat pour proxifier le socket Docker via Docker Socket Proxy, permettant à Beszel de collecter les stats des conteneurs sans exposer le socket complet.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Socat Proxy
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
Ce projet répond à un cas d'usage problématique : Ce projet répond à un cas d'usage problématique :
- J'ai [Beszel](https://beszel.dev/), un conteneur de monitoring en mode host, nécessitant d'exposer le socket de Docker afin qu'il récupère les stats des conteneurs - J'ai [Beszel](https://beszel.dev/), un conteneur de monitoring en mode host, nécessitant d'exposer le socket de Docker afin qu'il récupère les stats des conteneurs
@@ -78,7 +77,6 @@ services:
Plus d'infos directement sur le repo : Plus d'infos directement sur le repo :
::card{title="🐋 __Socat Proxy__"} ::card{title="🐋 __Socat Proxy__"}
[A lighteweight bind mount socket proxy](https://git.djeex.fr/Djeex/socat-proxy) [A lighteweight bind mount socket proxy](https://git.djeex.fr/Djeex/socat-proxy)
:: ::
@@ -3,10 +3,12 @@ title: HotDisk
description: Un script bash qui surveille la température des disques durs et éteint automatiquement le serveur lorsqu'ils dépassent un seuil de sécurité trop longtemps. description: Un script bash qui surveille la température des disques durs et éteint automatiquement le serveur lorsqu'ils dépassent un seuil de sécurité trop longtemps.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# HotDisk
Quand on a un NAS avec plusieurs disques dans une buanderie, les températures peuvent vite grimper. Or, un disque dur est très sensible aux températures et peut subir de gros dommages s'il dépasse une température seuil pendant un certain temps. Après un été très chaud qui a fournit son lot de sueur froide en regardant la température de mes disques, j'ai cherché un moyen de pouvoir automatiser l'extinction du serveur en cas de dépassement prolonger de la température maximale supportée par mes disques. :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
Quand on a un NAS avec plusieurs disques dans une buanderie, les températures peuvent vite grimper.
Un disque dur est très sensible à la chaleur et peut subir de gros dommages s'il dépasse une température seuil trop longtemps.
Après un été très chaud qui a fournit son lot de sueur froide en regardant la température de mes disques, j'ai cherché un moyen de pouvoir automatiser l'extinction du serveur en cas de dépassement prolonger de la température maximale supportée par mes disques.
N'ayant rien trouvé de convaincant, je l'ai donc fait moi-même. N'ayant rien trouvé de convaincant, je l'ai donc fait moi-même.
@@ -16,7 +18,8 @@ N'ayant rien trouvé de convaincant, je l'ai donc fait moi-même.
- Il déclenche larrêt du système si la température dépasse la limite pendant la durée configurée. - Il déclenche larrêt du système si la température dépasse la limite pendant la durée configurée.
- Il enregistre toutes les températures et l’état des compteurs, et effectue automatiquement la rotation des journaux. - Il enregistre toutes les températures et l’état des compteurs, et effectue automatiquement la rotation des journaux.
Puis tant qu'on y est, j'ai ajouté un script d'installation qui installe le script, le rend éxecutable, crée un service systemd et un timer systemd et l'active. Le script d'installation permet aussi de régler les différentes variables: Puis tant qu'on y est, j'ai ajouté un script d'installation qui installe le script principal, le rend exécutable, crée un service systemd et un timer, et les active automatiquement.
Le script d'installation permet aussi de régler différents paramètres :
| Variable | Description | Valeur par défaut | | Variable | Description | Valeur par défaut |
|-----------------------|------------------------------------------------------------------------------|-----------------------------------------------| |-----------------------|------------------------------------------------------------------------------|-----------------------------------------------|
@@ -28,7 +31,8 @@ Puis tant qu'on y est, j'ai ajouté un script d'installation qui installe le scr
| `LOG_ROTATE_PERIOD` | Période de rotation des journaux (`daily` ou `weekly`) | `daily` | | `LOG_ROTATE_PERIOD` | Période de rotation des journaux (`daily` ou `weekly`) | `daily` |
| `DISCORD_WEBHOOK` | URL du webhook Discord pour les notifications | _Obligatoire_ | | `DISCORD_WEBHOOK` | URL du webhook Discord pour les notifications | _Obligatoire_ |
Il execute aussi un autre script qui paramètre le logrotate avec les éléments configurés prédédemment. Et enfin, le script d'installation peut etre executé via un simple curl + execution d'un dernier script pour les plus flemmard. Il exécute aussi un autre script qui paramètre **logrotate** avec les éléments configurés précédemment.
Et enfin, le script d'installation peut être exécuté directement via un simple `curl` suivi d'un dernier script de configuration, parfait pour les plus flemmards.
Il a fallu également gérer le sujet du root sans sudo, du sudo seul, de l'utilisateur sans sudo, les divers cas d'erreur (dépendances manquantes, erreur dans les permissions, créations de fichier, de lecture des données des disques, etc...) Il a fallu également gérer le sujet du root sans sudo, du sudo seul, de l'utilisateur sans sudo, les divers cas d'erreur (dépendances manquantes, erreur dans les permissions, créations de fichier, de lecture des données des disques, etc...)
@@ -36,7 +40,6 @@ Et l'acces concurrent au fichier de statuts.
Plus d'infos directement sur le repo : Plus d'infos directement sur le repo :
::card{title="📜 __HotDisk__" to="https://git.djeex.fr/Djeex/hotdisk" target="_blank"}
::card{title="📜 __HotDisk__"} Gardez vos disques au frais !
[Gardez vos disques au frais !](https://git.djeex.fr/Djeex/hotdisk)
:: ::
@@ -1,16 +1,16 @@
--- ---
title: Backrest Docker Stop title: Backrest Docker Stop
description: Un script bash qui arrête les conteneurs Docker avant une sauvegarde Backrest et les redémarre après pour des sauvegardes de bases de données sans dump complexe. description: Un script bash qui arrête les conteneurs Docker avant une sauvegarde Backrest et les redémarre après, pour des sauvegardes de bases de données sans dump complexe.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Backrest Docker Stop
[Backrest](https://github.com/garethgeorge/backrest) est un formidable outil de backup. Dans le cas de [Serveex](https://docu.djeex.fr/fr/serveex/introduction), la majeure partie des données à sauvegarder sont des conteneurs, et souvent ces conteneurs possèdent des bases de données. Le problème ? On ne peut pas sauvegarder proprement une BDD qui est en route. Alors, il existe plein de solutions complexe à base de dump des bases de données, mais souvent le plus simple cela reste de stopper les conteneurs, de sauvegarder, et de redémarrer les conteneurs. [Backrest](https://github.com/garethgeorge/backrest) est un formidable outil de backup. Dans le cas de [Serveex](https://docu.djeex.fr/fr/serveex/introduction), la majeure partie des données à sauvegarder sont des conteneurs, et souvent ces conteneurs possèdent des bases de données.
**Backrest** ne propose pas de solutions native, mais il propose d'executer des scripts customisés à déclencher sur des évenements, comme le démarrage et la fin de la sauvegarde par exemple. Notre besoin est donc de stopper les conteneurs dont on veut sauvegarder la BDD, à chaque démarrage du plan de sauvegarde, et de les redémarrer à la fin de l'execution du plan de sauvegarde. Le problème ? On ne peut pas sauvegarder proprement une BDD qui est en route. Alors, il existe plein de solutions complexe à base de dump des bases de données, mais souvent le plus simple cela reste de stopper les conteneurs, de sauvegarder, et de redémarrer les conteneurs.
Pour cela nous allons avoir besoin d'un script bash et de connecter Backrest au socker de Docker, afin d'avoir la cinématique suivante : **Backrest** ne propose pas de solutions native, mais il propose d'executer des scripts customisés à déclencher sur des évenements, comme le démarrage et la fin de la sauvegarde par exemple. Notre besoin est donc de stopper les conteneurs dont on veut sauvegarder la BDD, à chaque démarrage du plan de sauvegarde, et de les redémarrer à la fin de l'execution du plan de sauvegarde. Pour cela nous allons avoir besoin d'un script bash et d'une connexion sécurisée entre Backrest et le socket de Docker, afin d'avoir la cinématique suivante :
- Le plan de sauvegarde se met en route - Le plan de sauvegarde se met en route
- L'evenement déclenche l'execution d'un script custom - L'evenement déclenche l'execution d'un script custom
@@ -18,12 +18,13 @@ Pour cela nous allons avoir besoin d'un script bash et de connecter Backrest au
- Il récupère cette liste et leur envoie une commande d'extinction - Il récupère cette liste et leur envoie une commande d'extinction
- Le plan de sauvegarde s'arrête - Le plan de sauvegarde s'arrête
- L'evenement déclenche l'execution d'un script custom - L'evenement déclenche l'execution d'un script custom
- Le script contacte docker et demande la liste des conteneurs qui comportent le label `backrest.backup.stop=true` - Le script recontacte docker, récupère la même liste, et redémarre ces conteneurs
- Il récupère cette liste et leur envoie une commande de démarrage
## Faire communiquer Backrest et Docker en toute sécurité ## Faire communiquer Backrest et Docker en toute sécurité
Pour faire communiquer **Backrest** et Docker en toute sécurité, nous utiliserons [Docker Socket Proxy](https://github.com/linuxserver/docker-socket-proxy), afin de n'accorder que les droits nécessaires plutot que d'exposer l'intégralité du socket à Docker. Voici donc la stack : Pour faire communiquer **Backrest** et Docker en toute sécurité, nous utiliserons [Docker Socket Proxy](https://github.com/linuxserver/docker-socket-proxy).
Cela évite d'exposer l'intégralité du socket Docker et n'accorde que les droits nécessaires.
Voici un exemple de stack Docker :
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -80,6 +81,7 @@ do
done done
sleep 10 sleep 10
``` ```
```sh [Start] ```sh [Start]
#!/usr/bin/env bash #!/usr/bin/env bash
@@ -94,6 +96,7 @@ sleep 10
:: ::
## Le label ## Le label
Une fois les scripts renseignés et paramétrés pour les bons hooks dans **Backrest**, vous n'avez plus qu'à ajouter le libellé `backrest.backup.stop=true` dans les fichiers `compose.yaml` des conteneurs à éteindre et rallumer durant les sauvegardes : Une fois les scripts renseignés et paramétrés pour les bons hooks dans **Backrest**, vous n'avez plus qu'à ajouter le libellé `backrest.backup.stop=true` dans les fichiers `compose.yaml` des conteneurs à éteindre et rallumer durant les sauvegardes :
```yaml [compose.yaml] ```yaml [compose.yaml]
@@ -102,7 +105,8 @@ services:
votre_service: votre_service:
... ...
labels: labels:
- com.centurylinklabs.watchtower.enable=true - backrest.backup.stop=true
``` ```
Et voilà, à la prochaine sauvegarde, les conteneurs correctement labelisés s'arreteront pendant la sauvegarde et redémarreront tout seuls à la fin. Et voilà !
À la prochaine sauvegarde, les conteneurs correctement labelisés s'arrêteront pendant la sauvegarde et redémarreront tout seuls une fois terminée.
@@ -0,0 +1,83 @@
---
title: rm Confirmation Guard
description: Une petite fonction Bash qui enveloppe sudo et demande confirmation avant de lancer rm, pour qu'une faute de frappe n'efface pas des fichiers appartenant à root.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
`rm` ne demande pas deux fois. Pas de corbeille, pas de « êtes-vous sûr », surtout pas avec `sudo` devant, où un espace de trop ou la mauvaise variable peut effacer quelque chose que vous n'avez pas la permission de revérifier. C'est la seule habitude vraiment destructrice qu'un terminal vous inculque, et le correctif ne demande aucun outil supplémentaire, juste quelques lignes dans `.bashrc`.
L'idée est de masquer la commande `sudo` par une fonction Bash du même nom. Tous les autres usages de `sudo` passent toujours directement, mais dès que le premier argument est `rm`, elle s'arrête et pose la question.
```bash [.bashrc]
# rm confirmation
sudo() {
if [ "$1" = "rm" ]; then
echo -n "Are you sure you want to delete files/folders with sudo? (y/n) "
read ans
if [[ $ans == [Yy]* ]]; then
command sudo rm "${@:2}"
else
echo "Deletion cancelled."
fi
else
command sudo "$@"
fi
}
```
## Comment ça marche
- `sudo() { ... }` définit une fonction nommée `sudo`. Bash cherche les fonctions avant de chercher les commandes du `PATH`, donc taper `sudo` dans un terminal lance désormais celle-ci au lieu de `/usr/bin/sudo`, sans aucune bidouille d'alias.
- `if [ "$1" = "rm" ]` ne regarde que le tout premier mot après `sudo`. `sudo rm -rf /srv/docker/vieille-stack` correspond, `sudo apt update` non.
- En cas de correspondance, elle affiche la question, lit la réponse dans `$ans`, et `[[ $ans == [Yy]* ]]` accepte `y`, `Y`, `yes`, tout ce qui commence par un Y dans l'une ou l'autre casse.
- `command sudo rm "${@:2}"` est la partie qui supprime réellement. `command` contourne la fonction pour qu'elle ne s'appelle pas elle-même, et `${@:2}` représente tous les arguments après `rm`, donc `-rf /srv/docker/vieille-stack` est transmis tel quel.
- Tout ce qui n'est pas `rm` tombe dans le `else` et s'exécute exactement comme si la fonction n'existait pas : `command sudo "$@"`.
## L'installer
::steps{level="3"}
### Ouvrir la config de votre shell
```bash [Terminal]
nano ~/.bashrc
```
### Coller la fonction
Ajoutez le bloc ci-dessus à la fin du fichier, puis enregistrez et quittez.
### Recharger
```bash [Terminal]
source ~/.bashrc
```
### Essayer
```console [Terminal]
$ sudo rm -rf /tmp/test
Are you sure you want to delete files/folders with sudo? (y/n) n
Deletion cancelled.
```
Répondez `y` et elle s'exécute pour de vrai. Tout ce qui n'est pas `rm`, `sudo apt update`, `sudo systemctl restart docker`, passe sans question.
### Terminé !
::
::note
Tout ceci vit dans `~/.bashrc`, donc ne s'applique qu'à votre shell interactif, pas aux scripts, aux tâches cron ni à la session d'un autre utilisateur. C'est bien le but : attraper vous, en train de taper, pas un programme qui appelle `sudo rm` volontairement.
::
## Ce que ça n'attrapera pas
C'est un garde-fou, pas un bac à sable. Il ne se déclenche que lorsque `rm` est littéralement le premier mot après `sudo`, donc tout ce qui atteint `rm` d'une autre façon passe à côté :
- `sudo -i rm -rf /` ou `sudo su -c "rm -rf /"`, le premier argument est `-i` ou `su`, pas `rm`
- `sudo bash -c "rm -rf /srv/docker"`, même raison, `rm` est enfoui dans la chaîne que bash exécute
- `sudo find /srv/docker -delete`, qui supprime tout aussi définitivement, et n'appelle jamais `rm`
- `rm` sans `sudo` sur des fichiers qui vous appartiennent déjà
La vraie protection contre cette dernière catégorie, c'est une sauvegarde en bonne et due forme, [Backrest](https://github.com/garethgeorge/backrest) et le [script d'arrêt Docker](/nonsense/bash/backrest-docker-stop) traité ailleurs dans cette section, ou autre chose. Cette fonction vaut quand même le coup : les accidents qu'elle attrape sont ceux qui arrivent réellement, un `sudo rm -rf` tapé trop vite avec une faute dans le chemin, pas une tentative délibérée de la contourner.
+87
View File
@@ -0,0 +1,87 @@
---
title: Poubelle
description: Des tutoriels obsolètes gardés pour référence, et des applications alternatives remplacées ailleurs sur le site mais qui fonctionnent toujours très bien.
navigation:
icon: i-lucide-bookmark
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
## Le grenier
Tous les articles ne restent pas d'actualité éternellement. Cette section garde deux sortes de restes : des tutoriels pour une installation entièrement remplacée ailleurs sur le site (**Obsolète**), et des tutoriels pour des applications qui restent des choix parfaitement valables, simplement pas ceux que [Serveex](/serveex/introduction) recommande aujourd'hui (**Alternatives**). Rien ici n'est activement maintenu, mais rien ici n'est faux non plus.
### Obsolète
:::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px}
:::
::card-group
::card
---
icon: i-simple-icons-wireguard
title: Wireguard 14
to: /recycled/deprecated/wireguard-14
ui:
icon: text-[#88171A]
---
L'ancienne installation de wg-easy v14, remplacée par le tutoriel actuel
::
::card{icon="i-noto-open-file-folder" title="File Browser" to="/recycled/deprecated/file-browser"}
Remplacé par File Browser Quantum
::
::
### Alternatives
:::div{class="relative"}
:ellipsis{left=0px width=40rem top=10rem blur=140px}
:::
::card-group
::card
---
icon: i-simple-icons-plex
title: Plex
to: /recycled/alternatives/plex
ui:
icon: text-[#E5A00D]
---
L'alternative payante à Jellyfin
::
::card
---
icon: i-cbi-qbittorrent
title: Qbittorrent pour Plex
to: /recycled/alternatives/qbittorrent-for-plex
ui:
icon: text-[#2F67BA]
---
La seedbox basée sur Gluetun, associée à Plex
::
::card
---
icon: i-cbi-radarr
title: Servarr pour Plex
to: /recycled/alternatives/servarr-for-plex
ui:
icon: text-[#FFCB3D]
---
La stack Servarr, câblée pour Plex plutôt que Jellyfin
::
::card
---
icon: i-simple-icons-gitea
title: Gitea
to: /recycled/alternatives/gitea
ui:
icon: text-[#609926]
---
Le projet d'origine dont Forgejo est un fork
::
::
@@ -1,18 +1,10 @@
--- ---
title: Wireguard 14 title: Wireguard 14
description: Ancien guide WireGuard 14 conservé à titre archivé voir le guide WireGuard à jour pour une installation actuelle. description: Ancien guide WireGuard 14 conservé à titre archivé, voir le guide WireGuard à jour pour une installation actuelle.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Wireguard
::note
🎯 __Objectifs :__
- Installer Wireguard
- Configurer les clients
- Accéder au réseau sécurisé
::
## Introduction ## Introduction
L'utilisation d'un VPN permet d'accéder à distance aux ressources locales du serveur sans les exposer sur internet. C'est notamment une manière propre de sécuriser l'accès à la console SSH, plutot que d'exposer le port sur internet. C'est pouvoir se connecter à son réseau où que l'on soit, de maniere sécurisée, et de faire dialoguer des machines qui sont sur des réseaux différents. L'utilisation d'un VPN permet d'accéder à distance aux ressources locales du serveur sans les exposer sur internet. C'est notamment une manière propre de sécuriser l'accès à la console SSH, plutot que d'exposer le port sur internet. C'est pouvoir se connecter à son réseau où que l'on soit, de maniere sécurisée, et de faire dialoguer des machines qui sont sur des réseaux différents.
@@ -97,7 +89,7 @@ services:
image: ghcr.io/wg-easy/wg-easy:14 image: ghcr.io/wg-easy/wg-easy:14
container_name: wg-easy container_name: wg-easy
volumes: volumes:
- /docker/wg_easy/config/etc_wireguard:/etc/wireguard - /srv/docker/wg_easy/config/etc_wireguard:/etc/wireguard
restart: unless-stopped restart: unless-stopped
cap_add: cap_add:
- NET_ADMIN - NET_ADMIN
@@ -177,15 +169,15 @@ root
└── compose.yaml └── compose.yaml
``` ```
Creez le dossier `/docker/wireguard/config/wg_confs`. Creez le dossier `/srv/docker/wireguard/config/wg_confs`.
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce pour les allergiques au terminal :__ ✨ __Astuce pour les allergiques au terminal :__
vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo mkdir -p /docker/wireguard/config/wg_confs sudo mkdir -p /srv/docker/wireguard/config/wg_confs
``` ```
Copiez le fichier` wg0.conf` téléchargé précédemment. Copiez le fichier` wg0.conf` téléchargé précédemment.
@@ -194,12 +186,12 @@ Copiez le fichier` wg0.conf` téléchargé précédemment.
__Astuce :__ Le moyen le plus simple est de transférer le fichier par sftp dans le dossier `/home/nomdutilisateur` puis de le copier dans le bon dossier : __Astuce :__ Le moyen le plus simple est de transférer le fichier par sftp dans le dossier `/home/nomdutilisateur` puis de le copier dans le bon dossier :
```bash [Terminal] ```bash [Terminal]
sudo cp ~/wg0.conf /docker/wireguard/config/wg_confs sudo cp ~/wg0.conf /srv/docker/wireguard/config/wg_confs
:: ::
Creez le `compose.yaml` dans `/docker/wireguard `: Creez le `compose.yaml` dans `/srv/docker/wireguard `:
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/wireguard/compose.yaml sudo nano /srv/docker/wireguard/compose.yaml
``` ```
Appuyez sur `i` pour rentrer en modification et copiez la configuration ci-dessous Appuyez sur `i` pour rentrer en modification et copiez la configuration ci-dessous
```yaml [compose.yaml] ```yaml [compose.yaml]
@@ -215,7 +207,7 @@ services:
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/wireguard/config:/config - /srv/docker/wireguard/config:/config
- /lib/modules:/lib/modules #optional - /lib/modules:/lib/modules #optional
restart: unless-stopped restart: unless-stopped
``` ```
@@ -224,7 +216,7 @@ Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez a
Lancez le conteneur : Lancez le conteneur :
```bash [Terminal] ```bash [Terminal]
cd /docker/wireguard cd /srv/docker/wireguard
sudo docker compose up -d sudo docker compose up -d
``` ```
::note ::note
@@ -0,0 +1,248 @@
---
title: File Browser
description: Installer File Browser pour parcourir et gérer les fichiers de votre serveur depuis une interface web, exposée en toute sécurité avec SWAG.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
::warning{to="/serveex/files/file-browser-quantum"}
Remplacé par **File Browser Quantum**. Le projet d'origine a un historique de CVE sérieuses (une RCE par CSRF menant à un compte admin dérobé, du XSS stocké, du path traversal, du contournement d'authentification...) et a été officiellement archivé en septembre 2026, les mainteneurs laissant définitivement non corrigés des problèmes connus de gestion de session et d'exécution de commandes. Ne déployez pas cette version, surtout pas exposée sur internet.
::
[File Browser](https://github.com/filebrowser/filebrowser) est une interface web qui permet d'accéder aux fichiers de votre serveur et de les modifier.
![File Browser](/img/serveex/filebrowser.png)
## Installation
::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `filebrowser`, puis copiez-collez ce qui suit :
```yaml [compose.yaml]
---
services:
filebrowser:
container_name: filebrowser
volumes:
- /srv/docker/filebrowser/config:/config/
- /chemin/vers/vos/dossiers:/vosdossiers #ajoutez les dossiers à parcourir, comme /srv/docker:/srv/docker par exemple
ports:
- 8010:80
image: filebrowser/filebrowser:s6
```
::tip{icon=""}
✨ __Astuce :__ ajoutez le label watchtower à chaque conteneur pour automatiser les mises à jour.
```yaml [compose.yaml]
services:
filebrowser:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
Déployez le conteneur et allez sur `http://ipdevotreserveur:8010`. Et voilà ! Votre interface web File Browser est en route !
### Terminé !
::
::caution
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
## Exposer File Browser avec Swag
::warning
File Browser ne gère pas l'authentification multifacteur. L'exposer publiquement pourrait mettre vos systèmes en danger. Ne le faites que si vous utilisez une solution d'authentification robuste comme [TinyAuth](/serveex/security/tinyauth) ou [Authentik](/serveex/advanced/authentik/). Sinon, ne l'exposez pas avec SWAG. Utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard).
::
Vous voudrez peut-être accéder à File Browser à distance depuis tous vos appareils. Pour cela, nous allons l'exposer à travers Swag.
::note
__Au préalable :__ nous partons du principe que vous avez déjà créé un sous-domaine du type `files.mondomaine.fr` dans votre [zone DNS](/general/networking/dns), pointant vers `mondomaine.fr` avec un `CNAME`. À moins d'utiliser Cloudflare Zero Trust, nous partons aussi du principe que vous avez déjà redirigé le port `443` de votre box vers le port `443` de votre serveur avec les [règles NAT](/general/networking/nat).
::
::steps{level="3"}
### Ajouter le réseau de File Browser à SWAG
Dans Dockge, allez sur la stack SWAG et modifiez le fichier compose pour y ajouter le réseau de File Browser :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Rattache le conteneur au réseau personnalisé
# ...
- filebrowser # Nom du réseau déclaré dans la stack
networks: # Définit le réseau personnalisé
# ...
filebrowser: # Nom du réseau déclaré dans la stack
name: filebrowser_default # Nom réel du réseau externe
external: true # Précise qu'il s'agit d'un réseau externe
```
::note
Nous partons ici du principe que le nom du réseau de File Browser est `filebrowser_default`. Vous pouvez confirmer que la connexion fonctionne en accédant au tableau de bord de SWAG sur http://ipdevotreserveur:81.
::
Redémarrez la stack en cliquant sur « deploy » et attendez que SWAG soit complètement initialisé.
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `files.subdomain.conf`.
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/files.subdomain.conf
```
Et collez la configuration suivante :
```nginx [files.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name files.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
#if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; }
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app filebrowser;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Terminé !
::
Et voilà ! File Browser est maintenant exposé !
## Protéger File Browser avec TinyAuth
Ajoutez la vérification forward-auth de [TinyAuth](/serveex/security/tinyauth) directement dans `files.subdomain.conf`, de la même façon que dans [le tutoriel TinyAuth](/serveex/security/tinyauth#protecting-an-app-via-reverse-proxy) :
```nginx [files.subdomain.conf]{26-38,41-42}
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name files.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
#if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; }
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location /tinyauth {
internal;
proxy_pass http://tinyauth:3000/api/auth/nginx;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location @tinyauth_login {
return 302 https://tinyauth.mondomaine.fr/login?redirect_uri=$scheme://$http_host$request_uri;
}
location / {
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app filebrowser;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::note{to="/serveex/security/tinyauth#exposing-tinyauth-with-swag"}
Le bloc `location /tinyauth` s'exécute dans le conteneur de SWAG lui-même, SWAG doit donc être sur le réseau Docker de TinyAuth pour le joindre par son nom (`tinyauth` ici). Cela devrait déjà être en place depuis **l'exposition de TinyAuth**. Si vous rencontrez une erreur, revérifiez que le fichier compose de SWAG a toujours ce réseau rattaché.
::
::tip{icon=""}
✨ __Astuce :__ vous pouvez protéger cette application avec [Authentik](/serveex/advanced/authentik) plutôt que TinyAuth, en ouvrant `files.subdomain.conf` et en décommentant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un provider dans Authentik](/serveex/advanced/authentik#protecting-an-app-via-reverse-proxy).
::
@@ -0,0 +1,2 @@
title: Alternatives
icon: i-lucide-arrow-left-right
@@ -3,16 +3,8 @@ title: Plex
description: Installer Plex Media Server avec Tautulli sur votre homelab pour streamer films et séries depuis n'importe où sur tous vos appareils. description: Installer Plex Media Server avec Tautulli sur votre homelab pour streamer films et séries depuis n'importe où sur tous vos appareils.
--- ---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Plex
::note
🎯 __Objectifs :__
- Installer Plex
- Installer Tautulli
- Accéder aux media depuis l'exterieur
::
[Plex](https://www.plex.tv/fr/) est une plateforme de streaming vidéo déployable chez vous, pour manager votre bibliothèque de films ou de série, et les lire en locale ou à distance. Plex dispose d'applications TV, Android, iOS, Window et Mac OS, permettant la lecture de vos bibliothèques, à la Netflix. [Plex](https://www.plex.tv/fr/) est une plateforme de streaming vidéo déployable chez vous, pour manager votre bibliothèque de films ou de série, et les lire en locale ou à distance. Plex dispose d'applications TV, Android, iOS, Window et Mac OS, permettant la lecture de vos bibliothèques, à la Netflix.
@@ -70,8 +62,8 @@ services:
- TZ=Europe/Paris - TZ=Europe/Paris
- VERSION=docker - VERSION=docker
volumes: volumes:
- /docker/plex/config:/config - /srv/docker/plex/config:/config
- /docker/plex/transcode:/transcode - /srv/docker/plex/transcode:/transcode
- /media:/media - /media:/media
restart: unless-stopped restart: unless-stopped
mem_limit: 4096m mem_limit: 4096m
@@ -87,7 +79,7 @@ services:
- PGID=${GUID} - PGID=${GUID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/tautulli/config:/config - /srv/docker/tautulli/config:/config
ports: ports:
- 8181:8181 - 8181:8181
restart: unless-stopped restart: unless-stopped
@@ -139,7 +131,7 @@ Ensuite rendez-vous dans la section _Accès à distance_ et choisissez un port m
![picture](/img/serveex/plex-port.png) ![picture](/img/serveex/plex-port.png)
- Sur votre routeur, redirigez le port `TCP` source `1234` vers le port `32400`, vers l'IP de votre serveur via [les règles NAT](/fr/general/networking/nat). - Sur votre routeur, redirigez le port `TCP` source `1234` vers le port `32400`, vers l'IP de votre serveur via [les règles NAT](/general/networking/nat).
- Une fois fait, retournez dans Plex afin de vérifier que la connexion est bien opérationnelle - Une fois fait, retournez dans Plex afin de vérifier que la connexion est bien opérationnelle
::caution ::caution
@@ -157,7 +149,7 @@ Vous n'avez plus qu'a remplir les dossiers `/media/movies` et `/media/tvseries`
::note ::note
Si pour stocker vos média vous utilisez un disque réseau (par exemple un stockage sur un NAS ou un disque dur externe branché ailleurs sur le réseau), veuillez consulter la section [montage samba](/fr/general/networking/samba) afin que Plex puisse y accéder. Si pour stocker vos média vous utilisez un disque réseau (par exemple un stockage sur un NAS ou un disque dur externe branché ailleurs sur le réseau), veuillez consulter la section [montage samba](/general/networking/samba) afin que Plex puisse y accéder.
:: ::
## Exposer Tautulli avec Swag ## Exposer Tautulli avec Swag
@@ -166,7 +158,7 @@ Plex n'a pas besoin d'etre exposé, étant joignable directement depuis votre co
En revanche, vous pouvez désirer exposer Tautulli, afin d'accéder aux stats même si vous n'est pas chez vous, depuis une simple url. En revanche, vous pouvez désirer exposer Tautulli, afin d'accéder aux stats même si vous n'est pas chez vous, depuis une simple url.
::note ::note
Nous partons du principe que vous avez le sous-domaine `tautulli.mondomaine.fr` avec un `CNAME` qui pointe vers `mondomaine.fr` dans [zone DNS](/fr/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/fr/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur dans [les règles NAT](/fr/general/networking/nat). Nous partons du principe que vous avez le sous-domaine `tautulli.mondomaine.fr` avec un `CNAME` qui pointe vers `mondomaine.fr` dans [zone DNS](/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur dans [les règles NAT](/general/networking/nat).
:: ::
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau de Tautulli : Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau de Tautulli :
@@ -197,13 +189,13 @@ Ici nous partons du principe que le nom du réseau de Tautulli est `tautulli_def
Copiez en renommant le fichier `tautulli.subdomain.conf.sample` en `tautulli.subdomain.conf` et éditez le : Copiez en renommant le fichier `tautulli.subdomain.conf.sample` en `tautulli.subdomain.conf` et éditez le :
::tip{icon=""} ::tip{icon="" to="/serveex/files/file-browser-quantum"}
__Astuce :__ vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal. __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo cp /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf.sample /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf sudo cp /srv/docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf.sample /srv/docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf
sudo nano /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf sudo nano /srv/docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf
``` ```
Et vérifiez que la configuration correspond bien à ceci, sinon éditez le fichier : Et vérifiez que la configuration correspond bien à ceci, sinon éditez le fichier :
@@ -288,7 +280,7 @@ server {
``` ```
::tip{icon=""} ::tip{icon=""}
✨ Vous pouvez protéger cette app avec Authentik en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/fr/serveex/security/authentik#protéger-une-app-par-reverse-proxy). ✨ Vous pouvez protéger cette app avec Authentik en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/serveex/advanced/authentik#protéger-une-app-par-reverse-proxy).
:: ::
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}. Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
@@ -0,0 +1,309 @@
---
title: Qbittorrent
description: Installer qBittorrent avec Gluetun et ProtonVPN pour télécharger des torrents de manière sécurisée derrière un VPN sur votre serveur auto-hébergé.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
![Picture](/img/serveex/qbit-vue.jpeg)
Afin de télécharger vos media favoris en toute sécurité, nous allons monter un système à base de :
- [Qbittorent](https://github.com/linuxserver/docker-qbittorrent) comme logiciel de téléchargement bittorent
- [Proton VPN Plus](https://protonvpn.com/torrenting), VPN pour sécuriser vos échanges, auquel vous devez souscrire (il y a de nombreux codes promo) pour accéder au protocole Bittorent, mais vous pouvez également en choisir un autre, à condition qu'il propose le protocole bittorent.
- [Gluetun](https://github.com/qdm12/gluetun)
- [Qbittorrent port update](https://codeberg.org/TechnoSam/qbittorrent-gluetun-port-update) pour mettre automatiquement à jour le port de votre VPN (qui change régulièrement).
- Et le mode [vuetorrent](https://github.com/gabe565/linuxserver-mod-vuetorrent) pour une interface moderne et intuitive.
Nous monterons ici le système ci-dessous :
![Picture](/img/serveex/qbit.svg)
## Configuration
Structure des dossiers
```text [Arborescence]
root
├── docker
│ └── seedbox
│ ├── qbittorrent
│ │ └── config
│ ├── gluetun
│ ├── compose.yaml
│ └── .env
└── media #relié à plex et Qbittorrent
├── downloads #vos téléchargements génériques, à selectionner dans les parametres
├── movies #à selectionner dans l'interface pour télécharger vos films
└── tvseries #à selectionner dans l'interface pour télécharger vos séries
```
Si ce n'est pas déjà fait, créez le dossier `downloads` dans `/media` :
```bash [Terminal]
mkdir -P /media/downloads
```
Ouvrez Dockge, cliquez sur `compose` et nommez la stack `seedbox`. Collez la config ci-dessous :
```yaml [compose.yaml]
---
services:
qbit:
image: ghcr.io/linuxserver/qbittorrent:libtorrentv1
container_name: qbittorrent
restart: unless-stopped
network_mode: service:gluetun
mem_limit: 4g
environment:
- DOCKER_MODS=ghcr.io/gabe565/linuxserver-mod-vuetorrent|ghcr.io/t-anc/gsp-qbittorent-gluetun-sync-port-mod:main
- TZ=Europe/Paris
- PUID=${PUID}
- PGID=${GUID}
- WEBUI_PORT=${UI_PORT}
- GSP_GTN_API_KEY=${GSP_KEY}
- GSP_QBT_USERNAME=${ID}
- GSP_QBT_PASSWORD=${PW}
volumes:
- /srv/docker/seedbox/qbittorrent/config:/config
- /media:/media
depends_on:
- gluetun
gluetun:
image: qmcgaw/gluetun:v3.41.3
container_name: gluetun
restart: unless-stopped
mem_limit: 4g
volumes:
- /srv/docker/gluetun/config.toml:/gluetun/auth/config.toml:ro
devices:
- /dev/net/tun:/dev/net/tun
ports:
- ${UI_PORT}:5695 # Port de la web-ui
- 8000:8000 # Port de controle de Gluetun
cap_add:
- NET_ADMIN
environment:
- TZ=Europe/Paris
- VPN_SERVICE_PROVIDER=protonvpn
- VPN_PORT_FORWARDING=on
- VPN_PORT_FORWARDING_PROVIDER=protonvpn
- VPN_TYPE=wireguard
- WIREGUARD_PRIVATE_KEY=${PR_KEY}
- SERVER_COUNTRIES=France
- PORT_FORWARD_ONLY=on
```
::tip{icon=""}
✨ __Astuce :__ ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour
```yaml [compose.yaml]
services:
qbittorrent:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
gluetun:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
Avant de renseigner le `.env` dans Dockge, nous allons configurer la mise à jour du port de téléchargement. En effet, Proton, et la plupart des VPN, changent régulièrement le port de téléchargement, et celui-ci doit etre communiqué à Qbitorrent.
Pour ce faire, nous avons ajouté le mod `ghcr.io/t-anc/gsp-qbittorent-gluetun-sync-port-mod` dans le conteneur.
Il faut à présent permettre au mod de récupérer l'information via Gluetun, qui n'accepte que les communications chiffrées via son API.
A cet effet, ouvrez un terminal. Nous allons à présent générer une clé d'authentification :
```bash [Terminal]
sudo docker run --rm qmcgaw/gluetun genkey
```
Notez la clé. Puis créez le dossier `/srv/docker/gluetun`
```bash [Terminal]
sudo mkdir /srv/docker/gluetun
```
Et créez le fichier `config.toml`
```bash [Terminal]
sudo nano /srv/docker/gluetun/config.toml
```
Éditez le comme suit en ajoutant la clée que vous avez générée :
```toml [config.toml]
[[roles]]
name = "t-anc/GSP-Qbittorent-Gluetun-sync-port-mod"
routes = ["GET /v1/portforward"]
auth = "apikey"
apikey = "votre_clée" # clée que vous avez générée précédemment
```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}. Rendez-vous dans Dockge, et renseignez les variables dans `.env`:
```properties [.env]
PUID=
GUID=
UI_PORT=
PR_KEY=
GSP_KEY= # la clé que vous avez générée et renseignée dans config.toml
ID=
PW=
```
En détails :
| Variable | Valeur | Exemples |
|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------|
| `PUID`{lang=properties} | A renseigner avec les infos de votre user (trouvables via la commande `id nomdutilisateur`{lang=shell}) | `1000` |
| `GUID`{lang=properties} | A renseigner avec les infos de votre user (trouvables via la commande `id nomdutilisateur`{lang=shell}) | `1000` |
| `UI_PORT`{lang=properties} | Le port d'accès à la web ui, elle sera joignable via `http//ipduserveur:port` | `5695` |
| `PR_KEY`{lang=properties} | La clée privée fournie par Proton | `buKsjNHLyzKMM1qYnzOy4s7SHfly` |
| `GSP_KEY`{lang=properties} | Clé que vous avez générée pour la mise à jour du port | `MnBa47MeVmk7xiv` |
| `ID`{lang=properties} | username que vous utilisez pour vous logger dans l'interface de Qbittorrent | `user` |
| `PW`{lang=properties} | mot de passe que vous utilisez pour vous logger dans l'interface de Qbittorrent | `password` |
## Déploiement
Une fois fait, déployez le conteneur.
::warning
**Dans les logs de lancement, vous trouverez un mot de passe temporaire pour l'utilisateur `admin`**
::
Loggez vous sur `http://ipduserveur:5695` (ou le port que vous avez configuré).
::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu.
::
Changez votre nom d'utilisateur et votre mot de passe dans les paramètres "webui".
Et voilà ! Dans les paramètres de Qbittorrent, dans "téléchargements" selectionnez `/media/downloads` comme chemin par défaut pour télécharger vos media.
Lorsque vous lancez un téléchargement, n'oubliez pas de préciser le bon répertoire de téléchargement afin que Plex puisse synchroniser correctement sa bibliothèque (`/media/movies` et `/media/tvseries`). Vous pouvez aussi l'automatiser en créant une catégorie et un répertoire associé.
## Exposer la webui
::warning
Qbitorrent n'utilise pas d'authentification multifacteur. Exposer Qbitorrent sur internet pourrait compromettre les machines auxquelles il est relié. Ne le faite que si vous utilisez un systeme d'authentification multifacteur comme [Authentik](/serveex/advanced/authentik). Sinon, n'exposez pas avec SWAG et utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard).
::
Afin de lancer des téléchargement hors de chez vous, sans VPN, vous pouvez exposer la webui de Qbittorrent.
::note
Nous partons du principe que vous avez le sous-domaine `seedbox.mondomaine.fr` avec un `CNAME` qui pointe vers `mondomaine.fr` dans [zone DNS](/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur dans [les règles NAT](/general/networking/nat).
::
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau de Gluetun :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Relie le conteneur au réseau custom
# ...
- seedbox # Nom du réseau déclaré dans la stack
networks: # Définit le réseau custom
# ...
seedbox: # Nom du réseau déclaré dans la stack
name: seedbox_default # Nom véritable du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe
```
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel.
::note
Ici nous partons du principe que le nom du réseau de la seedbox est `seedbox_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant http://ipduserveur:81.
::
Puis nous allons créer et éditer le fichier `seedbox.subdomain.conf`.
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce pour les allergiques au terminal :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
::
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/seedbox.subdomain.conf
```
Copiez la configuration ci-dessous, en prenant soin de vérifier le port :
```nginx [seedbox.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name seedbox.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
#if ($lan-ip = yes) { set $geo-whitelist yes; }
#if ($geo-whitelist = no) { return 404; }
if ($geo-blacklist = no) { return 404; }
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app gluetun;
set $upstream_port 5555;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
::tip{icon=""}
✨ Vous pouvez protéger cette app avec Authentik en retirant les `#` devant `include /config/nginx/authentik-server.conf;`{lang=nginx} et `include /config/nginx/authentik-location.conf;`{lang=nginx}. N'oubliez pas de [créer une application et un fournisseur dans Authentik](/serveex/advanced/authentik#protéger-une-app-par-reverse-proxy).
::
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
Patientez quelques minutes puis tapez dans votre navigateur `https://seedbox.mondomaine.fr`, vous arriverez sur l'interface de Qbittorrent.
Et voilà, vous avez un mediacenter pret à l'emploi !
![Picture](/img/serveex/seed.svg)
@@ -0,0 +1,495 @@
---
title: Automatisation
description: Automatiser les téléchargements de médias avec la suite Servarr, Radarr, Sonarr, Bazarr, Prowlarr et Overseerr pour films et séries.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
[Servarr](https://wiki.servarr.com/) est une collection d'applications développées dans le but d'automatiser le téléchargement, la mise à jour et la gestions des media. Ici nous allons porter notre attention sur les films et séries avec comme objectif :
- Pouvoir choisir un film dans un catalogue via une interface web
- N'avoir plus rien à faire à part en profiter quelques minutes plus tard sur Plex
Simple.
![arr](/img/serveex/arr.svg)
Je vous propose de déployer la stack puis nous verrons par la suite la configuration de chacune des apps et leur fonctionnement.
## Installer les apps
### Docker compose
Structure des dossiers :
```text [Arborescence]
root
├── docker
│ ├── plex
│ │ ├── compose.yml
│ │ ├── config
│ │ └── transcode
│ ├── tautulli
│ │ └── config
│ ├── sonarr
│ │ └── config
│ ├── radarr
│ │ └── config
│ ├── bazarr
│ │ └── config
│ ├── prowlarr
│ │ └── config
│ └── overseerr
│ └── config
└── media
├── downloads
├── tvseries
├── movies
└── library
```
::warning
__Attention :__ Respectez bien ce type de structure de fichier, notamment le dossier `media`. Ce dossier doit etre monté de la même manière dans les compose de _Qbittorrent_ (`/votre/chemin/media:/media`) et des _arr_. Sans cela, les _arr_ risquent de ne pas trouver le chemin fourni par Qbittorrent et de ne pas créer de _hardlinks_. Sans hardlink, les _arr_ copieront les films et cela doublera l'espace utilisé sur votre stockage.
::
Ouvrez dockge et votre stack `plex`. Modifiez le compose comme ceci :
```yaml [compose.yaml]
---
services:
linuxserver_plex:
image: ghcr.io/linuxserver/plex:latest
container_name: plex
network_mode: host
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
- VERSION=docker
- PLEX_CLAIM= #optional
volumes:
- /srv/docker/plex/config:/config
- /srv/docker/plex/transcode:/transcode #optional
- ${MEDIA_PATH}:/media
labels:
- com.centurylinklabs.watchtower.enable=true
restart: unless-stopped
mem_limit: 4096m
mem_reservation: 2048m
devices:
- /dev/dri:/dev/dri
tautulli:
image: lscr.io/linuxserver/tautulli:latest
container_name: tautulli
environment:
- TZ=Europe/Paris
volumes:
- /srv/docker/tautulli/config:/config
ports:
- 8181:8181
restart: unless-stopped
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
volumes:
- /srv/docker/sonarr/config:/config
- ${MEDIA_PATH}:/media
ports:
- 8989:8989
restart: unless-stopped
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
volumes:
- /srv/docker/radarr/config:/config
- ${MEDIA_PATH}:/media
ports:
- 7878:7878
restart: unless-stopped
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
volumes:
- /srv/docker/prowlarr/data:/config
ports:
- 9696:9696
restart: unless-stopped
overseerr:
image: lscr.io/linuxserver/overseerr:latest
container_name: overseerr
dns:
- 1.1.1.1
- 8.8.8.8
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
volumes:
- /srv/docker/overseerr/config:/config
ports:
- 5055:5055
restart: unless-stopped
bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: bazarr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- /srv/docker/bazarr/config:/config
- ${MEDIA_PATH}:/media
ports:
- 6767:6767
```
::tip{icon=""}
✨ Ajoutez le label de watchtower dans chaque conteneur afin d'automatiser les mises à jour
```yaml [compose.yaml]
services:
plex:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
tautulli:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
Renseignez le `.env` avec les variables ci-dessous
```properties [.env]
PUID=
GUID=
MEDIA_PATH=
```
| Variable | Valeur | Exemples |
|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------|
| `PUID`{lang=properties} | A renseigner avec les infos de votre user (trouvables via la commande `id nomdutilisateur`{lang=shell}) | `1000` |
| `GUID`{lang=properties} | A renseigner avec les infos de votre user (trouvables via la commande `id nomdutilisateur`{lang=shell}) | `1000` |
| `MEDIA_PATH`{lang=properties} | le chemin vers votre dossier media, ici : `/media`. Attention, il doit correspondre aussi à celui qu'utilise Qbittorrent. | `/media` |
Déployez la stack.
### Paramétrer Radarr
Radarr est une app qui permet de requêter à votre place vos sources de torrent et de définir quel type de release vous souhaitez télécharger en priorité. Radarr permet aussi de mettre à jour vos films si une meilleure version est disponible.
Maintenant que vous avez déployé la stack, vous pouvez vous rendre sur `http://ipduserveur:7878`.
::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu.
::
Créez vous un compte, choisissez bien *forms login*.
##### Ajouter un *root folder*
- Dans le menu à gauche, cliquez sur *Settings > Media Management*.
- Ajoutez un *root folder*, choisisez `/media/movies`
::warning
__Attention :__ Si vous avez déjà des films dans `movies` issus de Qbittorrent, ne les ajoutez pas dans Sonarr si ce dernier vous le propose. Radarr risque de les modifier ce qui entrainerait l'arrêt du seed par Qbittorrent.
::
##### Configurer les profils
Dans le menu *Settings > Profiles*, vous trouverez les profils par défaut de Radarr. Comprendre que lorsque vous faites une requete, vous demandez un de ces profils. Ainsi, radarr va chercher en priorité le parametre le plus élevé, puis s'il ne trouve pas, il va passer à celui d'en dessous etc. Vous pouvez par exemple régler comme ceci pour le profile "any", en décochant tout sauf ce qui est sur l'image, et en les mettant dans le même ordre. Avec ce profil "any", Radarr va chercher en priorité du 4K REMUX (meilleure qualité), puis s'il ne trouve pas, il va passer au critère du dessous.
![profiles_radarr](/img/serveex/radarr1.png)
##### Ajouter Qbittorrent
Dans *Settings > Downloads Clients* vous allez ajouter Qbittorrent.
- Renseignez le *Host* avec l'IP de votre serveur et précisez le port de la webui, si vous avez suivi mon tuto c'est le `5695`.
- Renseignez le *Username* et le *Password* de votre interface Qbittorrent.
- Cliquez sur *test*.
- Si tout est ok, cliquez sur *save*.
##### Connecter à Plex
Dans *Settings > Connect*, ajoutez une nouvelle connexion, choisissez *Plex Media Server*.
- Dans *Host* mettez `plex` ou l'adresse IP de votre serveur.
- Dans port mettez `32400`.
- Cliquez sur le bouton bleu "authenticate with Plex.tv" et authentifiez vous avec votre compte Plex.
- Appuyez sur le bouton *test*.
- Si tout est ok, appuyez sur le bouton *save*.
##### Récupérer la clé API pour Prowlarr et Overserr
- Dans *Settings > General*, copiez la *API Key* et notez la précieusement.
### Paramétrer Sonarr
Sonarr est une app qui permet de requêter à votre place vos sources de torrent et de définir quel type de release vous souhaitez télécharger en priorité. Radarr permet aussi de mettre à jour vos séries si une meilleure version est disponible.
- Rendez-vous sur `http://ipduserveur:8989`.
- Suivez exactement les mêmes étapes que pour Radarr, et en *root folder* mettez `/media/tvseries`.
::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu.
::
### Paramétrer Prowlarr
Prowlarr est un proxy qui permet de gérer vos sources de torrents et de les passer à Radarr et Sonarr.
Rendez-vous sur `http://ipduserveur:9696` et créez vous un compte en choisissant bien *forms login*.
::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu.
::
##### Ajouter une source
- Dans la section *Indexers*, ajoutez l'indexer de votre source de torrent.
##### Ajouter Radarr et Sonarr
Dans la section *Settings > Apps*, ajoutez Radarr et Sonarr avec les informations ci-dessous :
- Prowlarr Server : `http://prowlarr:9696` (ou remplacez prowlarr par l'IP de votre serveur)
- Sonarr / Radarr Server : `http://sonarr:8989` ou `http://radarr:7878`(ou remplacez sonarr/radarr par l'IP de votre serveur)
- API Key, la clé que vous avez notée pour Radarr et celle de Sonarr.
- Appuyez sur *Test*.
- Si tout va bien, appuyez sur *Save*.
### Paramétrer Bazarr
Bazarr est une app qui permet de chercher automatiquement les bons sous-titre dans les langues souhaitez pour tout les films et séries que Radarr et Sonarr ajoutent pour vous.
Rendez-vous sur `http://ipduserveur:6767`.
::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu.
::
Rendez-vous dans *Settings > General* et créez un identifiant et un mot de passe en utilisant le *forms login*.
#### Ajouter un profil de langage
- Dans *Settings > Languages* cliquez sur le bouton rose *Add new profile* et nommez le.
- Cliquez sur le bouton rose *Add Languages* et ajoutez les langues que vous souhaitez, par exemple *French* et *English*.
- Sauvegardez et quittez.
- En bas de l'ecran dans *Default Language For Newly Added Show*, cochez les deux cases et renseignez le profil que vous venez de créer.
![Bazarr](/img/serveex/bazarr2.png)
- Enregistrez avec le bouton tout en haut de l'écran.
#### Ajouter des fournisseurs de sous-titre
- Dans *Settings > Providers*, ajoutez vos fournisseurs favoris, comme par exemple :
![Bazarr](/img/serveex/bazarr.png)
- Enregistrez avec le bouton tout en haut de l'écran.
#### Ajouter Radarr et Sonarr
- Rendez-vous dans *Settings > Sonarr*
- Dans *Adress*, mettez `sonarr` ou l'adresse IP du serveur.
- Dans *Port* mettez `8989`.
- Dans *API Key* mettez la clé API de Sonarr.
- Cliquez sur *Test*.
- Enregistrez avec le bouton tout en haut de l'écran.
Faites de même avec Radarr.
### Paramétrer Overseerr
[Overseerr](https://overseerr.dev/) est une application qui permet de naviguer dans un catalogue de film et de faire des requetes à Sonarr et à Radarr. Il suffit de naviguer dans les films ou séries, puis de cliquer sur *Demander*, et le film ou la série sera automatiquement téléchargée selon les paramètres de Radarr ou de Sonarr. Si le film ou la série n'est pas sortie, cela sera automatiquement téléchargé lorsque cela sera disponible. Ainsi, les épisodes d'une séerie arrivent automatiquement au fur et à mesure dans Plex sans aucune intervention manuelle.
![Overseerr](/img/serveex/overseerr.webp)
Rendez-vous sur `http://ipduserveur:5055` et authentifiez vous avec votre compte Plex.
::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu.
::
#### Ajouter Radarr et Sonarr
Lorsque cela vous est demandé, ajoutez un serveur radarr :
- Cochez *serveur par défaut*.
- __Nom du serveur :__ Radarr
- __Nom d'hôte ou adresse IP :__ `radarr` ou l'adresse IP de votre serveur
- __Port :__ `7878`.
- __Clé d'API :__ la clé API de Radarr.
- Cliquez sur *Tester* en bas.
Si tout va bien, continuez à renseigner les champs.
- __Profil de qualité :__ celui que vous avez configuré (par exemple, `any`).
- __Dossier racine :__ le dossier de plex. Dans nos exemples : `/media/movies`.
- __Disponibilité minimale :__ `Annoncé`. Ainsi, si un film n'est pas sorti, vous pouvez le demander et il sera automatiquement récupéré à sa sortie.
- Cochez les 3 cases du bas.
- Sauvegardez et continuez.
Puis faites de même avec Sonarr :
- Cochez *serveur par défaut*.
- __Nom du serveur :__ Radarr
- __Nom d'hôte ou adresse IP :__ `sonarr` ou l'adresse IP de votre serveur
- __Port :__ `8989`.
- __Clé d'API :__ la clé API de Sonarr.
- Cliquez sur *Tester* en bas.
Si tout va bien, continuez à renseigner les champs.
- __Profil de qualité :__ celui que vous avez configuré (par exemple, `any`).
- __Dossier racine :__ le dossier de plex. Dans nos exemples : `/media/tvseries`.
- __Profil de langue :__ `Deprecated`.
- Cochez les 4 cases du bas.
- Sauvegardez et continuez.
Et voilà ! Vous n'avez plus qu'à faire une demande d'un film et d'une serie, puis de vérifier dans qbittorrent ou dans radarr/sonarr que tout va bien. Dans quelques minutes, votre media sera sur Plex !
## Exposer Overseerr avec Swag
Il peut etre intéressant d'exposer Overseerr, si vous souhaitez pouvoir faire des requêtes depuis l'exterieur sans VPN, ou si vous avez partagé votre Bibliothèque Plex à des utilisateurs et que vous souhaitez qu'ils aient accès à Overseerr.
::note
Nous partons du principe que vous avez le sous-domaine `films.mondomaine.fr` avec un `CNAME` qui pointe vers `films.fr` dans [zone DNS](/general/networking/dns). Et que bien sûr, [à moins que vous utilisiez Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box pointe bien sur le port `443` de votre serveur dans [les règles NAT](/general/networking/nat).
::
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau d'overseer, qui est celui de Plex car dans la stack Plex :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Relie le conteneur au réseau custom
# ...
- plex # Nom du réseau déclaré dans la stack
networks: # Définit le réseau custom
# ...
plex: # Nom du réseau déclaré dans la stack
name: plex_default # Nom véritable du réseau externe
external: true # Précise que c'est un réseau à rechercher en externe
```
Relancez la stack en cliquant sur "déployer" et patientez le temps que SWAG soit complètement opérationnel.
::note
Ici nous partons du principe que le nom du réseau de Tautulli est `plex_default`. Vous pouvez vérifier que la connexion est opérationnelle en visitant le dashboard de SWAG en tapant `http://ipduserveur:81`.
::
Créez le fichier `films.subdomain.conf` et éditez le :
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
::
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/films.subdomain.conf
```
Collez la configuration suivante :
```nginx [films.subdomain.conf]
## Version 2024/07/16
# make sure that your overseerr container is named overseerr
# make sure that your dns has a cname set for overseerr
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name films.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app overseerr;
set $upstream_port 5055;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ~ (/overseerr)?/api {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app overseerr;
set $upstream_port 5055;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
Patientez quelques minutes puis tapez dans votre navigateur `http://films.mondomaine.fr`.
::caution
__En cas d'échec :__ vérifiez les règles de votre pare-feu.
::
Et voilà, vous avez exposé Overseerr !
@@ -0,0 +1,213 @@
---
title: Gitea
description: Installer Gitea, un service Git auto-hébergé et léger pour gérer vos dépôts de code en privé sur votre propre serveur.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
::note{to="/serveex/development/forgejo"}
C'est une alternative à **Forgejo**, le fork communautaire créé après le passage de la gouvernance de Gitea à une société à but lucratif, un sujet sensible pour un projet dont on attend qu'il reste FOSS.
::
[Gitea](https://about.gitea.com/) est une plateforme DevOps auto-hébergée qui permet de gérer des dépôts à la manière de GitHub, mais sur votre propre infrastructure.
![gitea](https://about.gitea.com/img/home-screenshot.png)
## Installation
::file-tree
---
tree:
/:
- srv:
- docker:
- gitea:
- data/
---
::
::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `gitea`, et collez le contenu suivant :
```yaml [compose.yaml]
---
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.22.0
container_name: gitea
environment:
- USER_UID=${UID}
- USER_GID=${GID}
- TZ=Europe/Paris
restart: unless-stopped
networks:
- gitea
volumes:
- ./data:/data
ports:
- 3333:3000
- 222:22
```
### Renseigner vos variables d'environnement
Remplissez le fichier `.env` avec les informations nécessaires, par exemple :
```properties [.env]
UID=1000
GID=1000
```
Déployez le conteneur et allez sur `http://ipdevotreserveur:3333`. Votre instance Gitea est en route !
### Terminé !
::
::caution
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
## Exposer Gitea avec Swag
L'intérêt de cette installation est de pouvoir y accéder à distance depuis n'importe lequel de vos appareils. Pour cela, nous allons exposer Gitea à travers Swag.
::note
__Au préalable :__ nous partons du principe que vous avez créé un sous-domaine du type `gitea.mondomaine.fr` dans votre [zone DNS](/general/networking/dns) avec un `CNAME` pointant vers `mondomaine.fr`, et que, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), vous avez déjà redirigé le port `443` de votre box vers le port `443` de votre serveur dans les [règles NAT](/general/networking/nat).
::
::steps{level="3"}
### Ajouter le réseau de Gitea à SWAG
Dans Dockge, allez sur la stack SWAG et modifiez le fichier compose en y ajoutant le réseau de Gitea :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Rattache le conteneur au réseau personnalisé
# ...
- gitea # Nom du réseau déclaré
networks: # Définit le réseau personnalisé
# ...
gitea: # Nom du réseau déclaré
name: gitea_default # Nom réel du réseau externe
external: true # Indique qu'il s'agit d'un réseau externe
```
::note
Nous partons du principe que le nom du réseau de Gitea est `gitea_default`. Vous pouvez vérifier la connectivité en visitant le tableau de bord de SWAG sur http://ipdevotreserveur:81.
::
Redéployez la stack en cliquant sur « Deploy » et attendez que SWAG soit pleinement opérationnel.
### Créer le fichier subdomain.conf
Dans les dossiers de Swag, créez le fichier `gitea.subdomain.conf`.
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ vous pouvez utiliser **File Browser** pour naviguer et modifier vos fichiers plutôt que des commandes dans le terminal.
::
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/gitea.subdomain.conf
```
Collez la configuration ci-dessous :
```nginx [gitea.subdomain.conf]
## Version 2023/12/19
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name gitea.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app gitea;
set $upstream_port 3000;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ~ (/gitea)?/info/lfs {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app gitea;
set $upstream_port 3000;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Configurer le domaine de Gitea
Ouvrez maintenant le fichier `app.ini` depuis le système de fichiers du conteneur :
```bash [Terminal]
sudo nano /srv/docker/gitea/data/gitea/conf/app.ini
```
Puis modifiez la section server avec les informations de votre domaine :
```properties [app.ini]
[server]
DOMAIN = gitea.mondomaine.fr
SSH_DOMAIN = gitea.mondomaine.fr
ROOT_URL = https://gitea.mondomaine.fr/
```
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter, puis redémarrez le conteneur.
### Terminé !
::
Et voilà ! Gitea est maintenant exposé sur le web.
::tip{icon=""}
__Astuce :__ vous pouvez protéger cette application nativement en OIDC avec [Pocket ID](/serveex/security/pocket-id) (en l'enregistrant comme client OIDC), ou avec Authentik en [suivant ces instructions](https://docs.goauthentik.io/integrations/services/gitea/).
::
+3 -3
View File
@@ -1,6 +1,6 @@
--- ---
title: Accueil title: Accueil
description: Documentation homelab par Djeex guides d'auto-hébergement pour Debian, Docker, réseau, stockage et bien plus. description: Documentation homelab par Djeex, guides d'auto-hébergement pour Debian, Docker, réseau, stockage et bien plus.
seo: seo:
ogImage: /img/social.png ogImage: /img/social.png
--- ---
@@ -35,9 +35,9 @@ Accéder à la doc
color: neutral color: neutral
variant: outline variant: outline
size: xl size: xl
to: https://docu.djeex.fr/en/ to: /serveex/introduction/
--- ---
🇬🇧 Démarrer mon homelab
:::::: ::::::
::::: :::::
:::: ::::