Ideenquelle

Server

Renouvellement Let's Encrypt & certbot

Petite frayeur ce matin : mon certificat SSL est expiré.
Plus de possibilité d’accéder à mon homelab. Il ne reste plus qu’à le renouveller. Sauf que c’est une opération que je ne fais jamais (ou presque). C’est mal parti.

Je me souviens quand même que c’est normalement fait via certbot.
Sauf que ce certificat est généré via mon hébergeur mais sur un serveur inaccessible hors maison.

Je me souviens également qu’il y avait/a un module spécifique pour mon hébergeur pour certbot.
Sauf que … il y a un truc qui plante. Je ne comprends pas. Je dois encore chercher.

Actuellement (et pour mémoire) :

certbot \
  --authenticator dns-infomaniak \
  --dns-infomaniak-credentials <path to file> \
  --server https://acme-v02.api.letsencrypt.org/directory \
  --agree-tos \
  --rsa-key-size 4096 \
  -d 'death.star'

Nouveau filtre pour fail2ban

Beaucoup de scans et souvent sur des .env ou des phpinfo.
Pas encore de chances, je ne suis pas dans ce cas (enfin, j’espère).
Quoi qu’il en soit, j’ai mis un filtre sur cette base :

[Definition]

failregex = ^<HOST> - .* "\s*(?:GET|POST)\s+[^"]*(?:\.env|phpinfo\.php)[^"]*\s+HTTP/[^"]+"\s+(?:403|404)\b

ignoreregex =

Puis une prison dédiée :

[nginx-sensitive-files]

enabled  = true
filter   = nginx-sensitive-files
logpath  = /var/log/nginx/access.log
backend  = auto

maxretry = 5
findtime = 10
bantime  = 3600

action   = %(action_)s

Le findtime est reduit car, a priori, ce n’est pas le genre de page que l’on recherche passivement.

Pfff ...

Je ne sais pas s’il faut en rire ou en pleurer.
Des bots et des bots qui scannent le serveur. Même les bots des plus grands IA s’y mettent.

J’ai bien envie de tous les mettre dehors. Mais j’ai peur de mettre d’autres personnes dehors. En réalité, ce ne sont pas bots d’indexation qui font mal. Cela montre juste les moyens dont ils disposent. C’est tout.

Ce qui est plus embêtant, ce sont les bots qui essayent de trouver des failles. Cela me fait plus peur.
Je comprends leur intérêt, même si je n’approuve pas.

Il faudra bien que je mette plus d’énergie.

Accès bloqué

Je viens de perdre une demi-journée.
Non, en fait, je viens de gagner de l’expérience après avoir perdu du temps et de l’énergie.

Je remets en contexte: j’ai lu les conseils de Karl.

Ni une ni deux ! Je me dis que c’est le moment d’au moins d’essayer, de voir si je peux y arriver.
Je me lance en créant un dossier et un utilisateur spécifique sur mon lieu de sauvegarde.
J’essaie de me connecter et rien ne se passe. Cela dure une plombe puis connection time out.
Depuis chez moi, cela fonctionne. Je règle la question des clés SSH.

Je recommence. Toujours le même soucis depuis le server distant.
Je m’aide d’une IA rapidement mais sans plus. J’ouvre même un ticket (que je ne retrouve plus).

Finalement, j’ai trouvé .

ufw bloque les accès “sortants”. J’avoue que j’ai manqué une étape. Soit.
Il suffit d’autoriser la sortie sur le port nécessaire et c’est résolu !

Sauvegardez, sauvegardez, pauvre fou !

Si vous publiez du contenu en ligne

  1. Ayez une copie locale de tout le contenu.
  2. Autant que possible, publiez de votre machine vers l’extérieur, le service, le serveur. Considérez que l’original est local et que le public n’accède qu’à une copie.
  3. Si 2 ne rentre pas dans votre démarche de publication, que vous publiez sur un serveur distant, créez un système automatisé de sauvegarde locale de tout le contenu (ainsi que les métadonnées) disponible sur le serveur.
  4. Si vous avez la possibilité, créez une 3ème copie de sauvegarde automatique sur un disque externe local.
  5. Si vous avez la possibilité, créez une copie automatique sur un serveur distant (qui n’est pas celle du contenu publié sur le serveur accessible au public).
  6. Avoir son nom de domaine est un atout bien qu’il entraîne un coût supplémentaire de location. Il vous permet une mobilité, une flexibilité pour l’accès public de votre contenu. Pensées amicales à une personne qui a perdu tout son contenu soudainement bloqué par le service distant. (Mise à jour : le service a redonné accès au contenu).

ruissellement chez Karl (et déjà repris chez Navire; il m’a juste devancé).

Je n’ai pas encore fait entièrement le nécessaire. C’est en cours mais c’est lent car les idées fusent dans la tête et parfois, je ne reste pas concentré; je fais face à un manque de clarté; je suis interrompu. J’avance, petit à petit.

Data Shield

Une liste d’adresses IP à bloquer sur un serveur. Je n’ai pas encore (trouvé) de manière d’automatiser l’ajout/mise à jour. Mais cela ne saurait tarder.

Authentification sur un serveur

J’ai trouvé deux possibilités :

  1. A l’entrée du server Web
  1. A l’entrée des applications

Pas encore super clair dans ma tête. Car il me semble qu’il faille est préférable encore en plus avoir un OIDC (OpenID Connect). Cela peut se faire avec Pocket ID OAuth.

Enfin ssh

Et voilà, enfin, l’authentification ssh partout uniquement via clés. En soi, cela n’a pas pris tant de temps que cela. Il faut juste le bon guide et appliquer.

Celui de DigitalOcean est assez bien fait.

Monter un disque via WebDav

  1. Créer un dossier où sera monté le disque : sudo mkdir /mnt/dav
  2. Installer davfs2 sudo apt install davfs2
  3. (re-)Configurer le paquet pour autoriser son utilisation par des utilisateurs moins privilégiés : sudo dpkg-reconfigure davfs2
  4. Editer ~/.davfs2/secrets pour ajouter les identifiants au disque via WebDAV :
  1. Ajouter une ligne dans /etc/fstab selon le modèle suivant : https://<WebDAV URI> /mnt/dav/ davfs user,noauto,file_mode=600,dir_mode=700 0 1
  2. Relancer systemd systemctl daemon-reload
  3. Ajouter son utilisateur au groupe davfs2 sudo usermod -a -G davfs2 username (Je pense même que sudo usermod -a -G davfs2 $USER devrait fonctionner si on veut s’ajouter soi-même).
  4. Déconnecter et (se) relogger (pour que l’ajout au groupe soit effectif).
  5. C’est tout ! Il est possible d’utiliser mount /mnt/dav/ sans soucis.

Pratique si vous souhaitez accéder (temporairement) à votre kDrive d’Infomaniak.

widefrog

widefrog est un programme permettant de télécharger des vidéos sur des plateformes de streaming. Intrinsèquement, il ne s’agit pas de piratage car widefrog n’outrepasse pas les accès demandés par les services. Autrement dit, si vous souhaitez récupérer des vidéos sur auvio.be (lié à la télévision belge francophone), vous devez avoir un compte sur le site et avoir une IP belge. widefrog permet donc juste de récupérer les vidéos facilement. widefrog est diffusé sur le forum de videohelp.

#Outils préalables Pour utiliser widefrog, il faut quelques outils préalables :

  1. Update/upgrade le système sudo apt-get update && sudo apt-get upgrade

  2. Python, ffmpeg, mkvmerge sudo apt-get install python3 python3-pip unrar zip unzip ffmpeg mkvtoolnix mkvtoolnix-gui mediainfo mediainfo-gui aria2 Dans le guide trouvé sur le forum, il recommande également d’installer curl, git, nano, vlc, mpv et asciinema. Autant les premiers sont déjà installés, autant vlc et mpv sont deux programmes au même usage.

  3. N_m3u8DL-RE

curl -kLO https://github.com/nilaoda/N_m3u8DL-RE/releases/download/v0.3.0-beta/N_m3u8DL-RE_v0.3.0-beta_linux-x64_20241203.tar.gz

## (Debian 13/Trixie does not allow to unpack/untar directly into the "/usr/local/bin/" DIRectory);

# Check the package is OK;
gunzip -tv vimeo-dl_0.2.0_linux_amd64.tar.gz
# Check what is inside the TAR.GZ archive;
tar -tvvf N_m3u8DL-RE_v0.3.0-beta_linux-x64_20241203.tar.gz
# Unpack;
tar -xvf N_m3u8DL-RE_v0.3.0-beta_linux-x64_20241203.tar.gz N_m3u8DL-RE
# Move to "/usr/local/bin/";
sudo mv N_m3u8DL-RE /usr/local/bin/
# Make the BInary file "EXEcutable;
sudo chmod a+rx /usr/local/bin/N_m3u8DL-RE
# List the file;
ls -ilha /usr/local/bin/N*
# Check the version
N_m3u8DL-RE --version
  1. mp4decrypt
curl -kL https://www.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-641.x86_64-unknown-linux.zip -o ~/Downloads/Bento4-SDK-1-6-0-641.x86_64-unknown-linux.zip
sudo unzip -j Bento4-SDK-1-6-0-641.x86_64-unknown-linux.zip 'Bento4-SDK-1-6-0-641.x86_64-unknown-linux/bin/*' -d /usr/local/bin/
ls -ilha /usr/local/bin/
mp4decrypt
mp4info
  1. shaka-packager
sudo curl -kL https://github.com/shaka-project/shaka-packager/releases/download/v2.6.1/packager-linux-x64 -o /usr/local/bin/shaka-packager
sudo chmod a+rx /usr/local/bin/shaka-packager
shaka-packager --version

L’idée est de pouvoir utiliser les programmes directement depuis n’importe quel dossier, juste en les appellant par leur nom.

#Installation de widefrog Quand c’est fait, il faut encore récupérer widefrog. La version à l’heure actuelle est la 3.2. Idéalement, extraire le fichier dans un dossier propre à widefrog. Pour la suite et afin d’éviter les soucis de version de packages Python, on active un environnement de travail :

pip install virtualenv
virtualenv venv
venv\Scripts\activate

On installe les dépendances :

#windows
FOR /F %k in (requirements.txt) DO ( if NOT # == %k ( pip install %k ) )
#linux
grep -v '^#' requirements.txt | xargs -n 1 pip install
#macos
grep -v '^#' requirements.txt | xargs -n 1 pip3 install

Et on peut également mettre à jour urllib3 (pas certain que ce soit utile):

pip install urllib3 --upgrade

On octroye des droits d’exécution aux parties de widefrog :

sudo chmod +x "terminal/*"

L’installation est normalement finie.

#Utilisation de widefrog Pour utiliser widefrog, il faut veiller à avoir l’environnement actif. Pour cela, quand nous sommes dans le dossier de widefrog, il faut utiliser la commande source myvenv/bin/activate. Pour sortir de l’environnement, il faut utiliser : deactivate

Première utilisation

Pour la première utilisation, il faut créer la configuration via

python widefrog.py
[INFO] The app_files\config.json file was created. Edit the file and run the program.

Avant d’éditer la configuration, vous pouvez utiliser les commandes suivantes pour en savoir plus :

python widefrog.py --help
python widefrog.py --config

Utilisation

Je reprends ici l’utilisation dont j’ai besoin, càd pour le site auvio. Une IP belge est nécessaire ainsi qu’un compte au service auvio. Je recopie les exemples données sur le forum qui permettent de comprendre comment cela fonctionne. :

#video
python widefrog.py "https://auvio.rtbf.be/media/attraction-attraction-s01-3018437"
python widefrog.py "https://auvio.rtbf.be/emission/titane-27377"
#audio
python widefrog.py "https://auvio.rtbf.be/media/un-jour-dans-le-sport-14-aout-2004-3164197"
#livestream video
python widefrog.py "https://auvio.rtbf.be/live/roland-garros-2024-31-mai-direct-tipik-526661"
#livestream audio
python widefrog.py "https://auvio.rtbf.be/chaine/classic-21-5" --query=:2::2
#list
python widefrog.py "https://auvio.rtbf.be/widget/19164" --query=:5::7
python widefrog.py "https://auvio.rtbf.be/widget/22508?context%5BprogramId%5D=8340" --query=:2::4
python widefrog.py "https://auvio.rtbf.be/emission/la-theorie-du-y-11043/bonus" --query=:6::7
python widefrog.py "https://auvio.rtbf.be/emission/pandore-20618" --query=:5::8
python widefrog.py "https://auvio.rtbf.be/chaine/musiq3-7" --query=:2::3
#series
python widefrog.py "https://auvio.rtbf.be/emission/le-cactus-4043" --query=2017:180:2018:5
python widefrog.py "https://auvio.rtbf.be/emission/l-art-du-crime-27164" --query=3:2:4:2

Il faut savoir que widefrog accepte également les fichiers en entrée. Les fichiers seront composés pour chaque ligne du lien à télécharger.

HTTPS en domaine local

Sécurité un jour, sécurité toujours ! Enfin, c’est ce que j’ai essayé de mettre en place. Mon navigateur est configuré par défaut pour forcer le mode HTTPS, y compris sur mes domaines locaux.

Sauf que je n’ai pas de certificat sur mon serveur personnel.

Go ! pour en installer un. Le résultat qui apparait est d’utiliser Let’s encrypt soit directement soit via certbot. Cela semble bien fonctionner … pour autant que vous nommiez vos domaines locaux avec des extensions existantes (.com, .eu, …).

Dans le cas où vous utilisez une extension fantaisistes (.lan), cela ne fonctionnera pas. Il ne reste plus qu’à créer son certificat avec mkcert et l’installer manuellement sur tous les appareils qui vont se rendre sur vos sites. Vu que la durée de vie des certificats peuvent être prolongés jusqu’à 10 ans, une fois l’opération faite, vous oublierez comment vous avez fait (wink wink).

Je ne l’ai pas encore fait. Vu qu’il faut aller sur chaque device pour configurer cela, j’ai mis cette option en bas de la liste :(

Monter un disque dur externe automatiquement

  1. Installer les paquets nécessaires
sudo apt update
sudo apt install exfatprogs
  1. Identifier le disque dur externe
lsblk

La commande va vous renseigner tous les devices et leur correspondance dans le système. Imaginons pour la suite que ce soit /dev/sdb1

  1. Créer le dossier où le disque dur sera accessible Généralement, cela se fait dans un dossier dans /mnt ou dans /mediaavec la commande mkdir (il faut probablement rajouter un petit sudo car de base, vous n’avez pas accès en écriture).
  2. Trouver le UUID de votre disque : sudo blkid /dev/sdb1 vous renvoie une sortie similaire à : /dev/sdb1/ : LABEL="TOSHIBA EXT" BLOCK_SIZE="512" UUID="62E69DEDE69DC1A9" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="1473b688-909f-4c28-a09f-07146df2ca87" Vous aurez besoin du UUID pour l’étape suivante.
  3. Préparer le montage automatique via /etc/fstab/ sudo nano /etc/ftsab Ajouter la ligne suivante (en adaptant au besoin les paramètres trouvés au point précédent : UUID=62E69DEDE69DC1A9 /mnt/mondisquedur ntfs defaults,rw,uid=1000,gid=1000,umask=0002 0 0
  4. Tester le processus avec sudo mount -a. Il se peut qu’il faille relancer systemctl avec sudo systemctl reload-daemon et puis tester le processus.

Source

Update automatique

Comment automatiser les mises à jour sans (trop) se prendre la tête ?

  1. S’en passer et faire comme si de rien n’était : non, ce n’est pas une possibilité.
  2. Mettre en place un crontab : oui mais on peut faire mieux
  3. Utiliser un paquet prévu pour cela : unattended-upgrades

Allons-y pour la dernière possibilité. Commençons par l’installer : sudo apt-get install unattended-upgrades. Configurons le paquet : sudo dpkg-reconfigure unattended-upgrades. Cochez “Yes” et confirmez.

Il y a des possibilités pour configurer cela manuellement et plus précisement : voir PeriodicUpdates.

nginx ou nginx Proxy Manager

J’ai tenté d’installer nginx. J’y suis bien arrivé. C’est simple et facile. ** A condition que votre port 80/443 ne soit pas déjà utilisé par un autre service**

Sauf que … je souhaitais une interface graphique (parce que, même si je suis Geek, je me connais : je ne le suis que par phase).

Donc j’ai repéré nginx Proxy Manager (NPM de son petit nom à ne pas confondre avec NPM, le gestionnaire de paquets Node.js). Pour cela, il faut Docker. La méthode proposée est la suivante :

  1. Créer un folder /opt/stacks/nginxproxymanager
  2. Rentrer dedans (avec cd)
  3. Créer *compose.yml avec le contenu suivant :
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP

    #environment:
      # Uncomment this if you want to change the location of
      # the SQLite DB file within the container
      # DB_SQLITE_FILE: "/data/database.sqlite"

      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  1. Lancer le compose : docker compose up -d Il se peut que nginx Proxy Manager ne se lance pas car quelqu’un occupe déjà certains ports (80 ou 443). Modifier cela pour que NPM se lance.

  2. Si vous oubliez votre mot de passe (oui, cela arrive aux plus distraits et vu le nombre de mot de passe, c’est possible) 1. Ouvrir le terminal du l’instance nginx : docker exec -it nginx* sh 1. Installer sqlite3 pour modifier la base de données : apt install sqlite3 -y 1. Accéder à la base de données : sqlite3 /data/database.sqlite 1. Supprimer tous les utilisateurs : UPDATE user sets is_deleted=1; 1. Sortir de sqlite : exit; 1. Sortir de l’instance nginx : exit 1. Redémarrer l’instance nginx : docker restart nginx* `

#Update 2025-10-21 Et oui, déjà un update. Nginx Proxy Manager, c’est bien … pour gérer des proxy. Sauf que mon idée, c’est de faire plus que cela, notamment d’héberger des services différents dont du web classique.

Donc retour à nginx :)

  1. Installation rapide avec apt-get install nginx
  2. Lancement systemctl start nginx
  3. Installation de php (sait-on jamais) : apt-get install php8.4-fpm php8.4-mysql php8.4-curl php8.4-gd php8.4-zip php8.4-xml; Il y a plus que simplement PHP. Veillez à vérifier la dernière version encore et adapter dans la commande.
  4. Ajouter PHP dans nginx en éditant /etc/nginx/sites-enabled/default en remplacant :
#location ~ \.php$ {
#       include snippets/fastcgi-php.conf;
#
#With php5-cgi alone:
#fastcgi_pass 127.0.0.1:9000;
#With php5-fpm:
#fastcgi_pass unix:/var/run/php5-fpm.sock;
#}

par :

location ~ \.php$ {
               include snippets/fastcgi-php.conf;
               fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

A nouveau, il faut vérifier la version de PHP (en 2025-10, c’est la 8.4).

  1. Recharger nginx avec systemctl reload nginx

C’est la base. Tous les sites actifs sont dans /etc/nginx/sites-enabled. Les sites disponibles sont dans /etc/nginx/sites-available. Idéalement, on prépare puis on rend disponible. Une manière de faire (ou contourner l’esprit) est de faire des liens symobliques : ln -s /etc/nginx/sites-available/monsite.com /etc/nginx/sites-enabled/.

Avant de relanger nginx (avec un systemctl restart nginx), on peut vérifier la configuration avec nginx -t. Plutôt utile !

Et pour le reverse proxy ?

Il suffit de créer un fichier dans /etc/nginx/sites-enabled contenant :

server {

  listen 80;
  listen [::]:80;


  server_name pdf.home.lan pdf.lan;
  http2 off;

  location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://192.168.1.2:3000;
  }

}

Cela permet dont de rediriger discrètement pdf.home.lan vers http://192.168.1.2:3000.

Si je dois rediriger vers un port et un sous-dossier explicitement ?

Pour une raison que j’ignore (et j’ignore beaucoup de choses), la fonction proxy_pass ne fonctionne pas. J’utilise return 301 http://MON_IP:MON_PORT/MON_DOSSIER :

server {

  listen 80;
  listen [::]:80;


  server_name serviio.home.lan serviio.lan;
  http2 off;

  location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        return 301 http://serviio.home.lan:23423/console;
  }
}

Source

Bolet.io - How I Supercharged My Pi-hole Setup with Nginx Proxy Manager

Docker

Pourquoi Docker ?

Pourquoi pas Docker ?

  1. Installation de Docker curl -sSL https://get.docker.com | sh sudo usermod -aG docker $USER Pour avoir les privilèges, il faut se reconnecter/redémarrer la session SSH.

Installation Raspberry Pi

Et voilà, c’est reparti. Après une petite erreur de manipulation sur des droits de fichiers (genre su et sudo), me revoici derrière le clavier.

À mon programme:

La liste évoluera avec le temps.