Post

CWWK - Serveur Debian 13

CWWK - Serveur Debian 13

CWWK carte mère x86-P5 sous processeur Alder Lake-N + module de 4 ports NVMe PCIe x1 + 2 ports Ethernet 2.5 Gigabit avec des fonctions Wake On Lan et de démarrage automatique après reprise du courant, ou programmable. Un port M.2 pour ajouter un module Wi-Fi

Description matériel CWWK X86-P5

CWWK X86-P5 Intel N100 Alder Lake-N + 5 ports NVMe + 2 ports Ethernet 2.5Ghz

Serveur Debian 13

Mise à niveau Debian 12 Bookworm vers Debian 13 Trixie le 13/10/2025

Interface Réseau enp3s0

FreeBox
Se connecter sur la freebox, paramètres avancés -> Configuration IPV6
Relever Adresse IPv6 lien local: fe80::8e97:eaff:fe39:66d6
Le préfixe principal ipv6: 2a01:e0a:9c8:2080::/64

Ip V6 statique

Route de lien local. Avec le protocole IPv6, la notion de trafic de diffusion (broadcast) disparaît. C’est le trafic anycast associé au Neighbor Discovery Protocol qui permet de contacter les hôtes du voisinage réseau. Pour que les messages ICMPv6 du protocole NDP puissent être échangés, il est nécessaire de disposer d’une route vers le réseau auquel une interface active est raccordé. Cette route utilise toujours le préfixe fe80::/64.

Relever la route de lien local IPV6: ip address show enp3s0 |grep "inet6 fe80"
inet6 fe80::aab8:e0ff:fe04:ec45/64 scope link

On en déduit l’adresse IPV6 statique:
Le préfixe principal ipv6 + la route de lien local IPV6 2a01:e0a:9c8:2080: + aab8:e0ff:fe04:ec45

Ip V4 statiques

Désactiver NetworkManager

1
2
systemctl stop NetworkManager
systemctl disable NetworkManager

configurer une adresse IPv4 en statique

1
nano /etc/network/interfaces
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp3s0
iface enp3s0 inet static
  address 192.168.0.205
  netmask 255.255.255.0
  gateway 192.168.0.254
# This is an autoconfigured IPv6 interface
iface enp3s0 inet6 static
    address 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45
    netmask 64
    gateway fe80::8e97:eaff:fe39:66d6

Fichier résolution DNS /etc/resolv.conf

1
nameserver 192.168.0.205

Redémarrer l’ordinateur: sudo reboot

Vérifier (ip address show enp3s0)

1
2
3
4
5
6
7
8
9
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether a8:b8:e0:04:ec:45 brd ff:ff:ff:ff:ff:ff
    altname enxa8b8e004ec45
    inet 192.168.0.205/24 brd 192.168.0.255 scope global enp3s0
       valid_lft forever preferred_lft forever
    inet6 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::aab8:e0ff:fe04:ec45/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

Se connecter sur la nouvelle adresse ip

1
ssh yick@192.168.0.205

Modifier les mots de passe “root” et utilisateur “yick”

Hostname + Date et heure + Groupe

Hostname Commande : hostnamectl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 Static hostname: cwwk
       Icon name: computer-desktop
         Chassis: desktop 🖥️
      Machine ID: 2ecf8ec9715a47ec90b45f1e796a7cf2
         Boot ID: e57848c74b364e96a1496241c0f381de
    Product UUID: 03000200-0400-0500-0006-000700080009
Operating System: Debian GNU/Linux 13 (trixie)        
          Kernel: Linux 6.12.48+deb13-amd64
    Architecture: x86-64
 Hardware Vendor: Default string
  Hardware Model: Default string
 Hardware Serial: Default string
Firmware Version: 5.27
   Firmware Date: Wed 2024-06-26
    Firmware Age: 1y 3month 2w 3d

Date et heure Commande timedatectl

1
2
3
4
5
6
7
               Local time: lun. 2025-10-13 15:21:40 CEST
           Universal time: lun. 2025-10-13 13:21:40 UTC
                 RTC time: lun. 2025-10-13 13:21:40
                Time zone: Europe/Paris (CEST, +0200)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Groupe “users”
Vérifier si utilisateur appartient au groupe “users” : id yick

1
uid=1000(yick) gid=1000(yick) groupes=1000(yick),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev)

Si non appartenance, exécuter : sudo usermod -a -G users $USER

Pour visualiser tous les messages de journal, ajouter l’utilisateur au groupe existant adm

1
sudo usermod -a -G adm $USER

OpenSSH, clé et script

OpenSSH
OpenSSH

Générer une paire de clé sur l'ordinateur de bureau PC1
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) pour une liaison SSH avec le serveur.

1
2
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/yick-ed25519
chmod 600 /home/yann/.ssh/yick-ed25519

Envoyer les clés publiques sur le serveur yick

1
ssh-copy-id -i ~/.ssh/yick-ed25519.pub yick@192.168.0.205

On se connecte sur le serveur debian 12

1
ssh yick@192.168.0.205

Modifier la configuration serveur SSH

1
sudo nano /etc/ssh/sshd_config

Modifier

1
2
Port = 55205
PasswordAuthentication no

Relancer le serveur

1
sudo systemctl restart sshd

Test connexion

1
ssh -p 55205 -i ~/.ssh/yick-ed25519 yick@192.168.0.205

Utilitaires + Historique ligne de commande + Motd

Installer utilitaires

1
sudo apt install rsync curl tmux jq figlet git tree borgbackup nmap ldap-utils ncdu tmux gdisk

Ajoutez la recherche d’historique de la ligne de commande au terminal
Se connecter en utilisateur debian
Tapez un début de commande précédent, puis utilisez shift + up (flèche haut) pour rechercher l’historique filtré avec le début de la commande.

1
2
3
# Global, tout utilisateur
echo '"\e[1;2A": history-search-backward' | sudo tee -a /etc/inputrc
echo '"\e[1;2B": history-search-forward' | sudo tee -a /etc/inputrc

Motd
Effacer et créer motd

1
sudo rm /etc/motd && sudo nano /etc/motd
1
2
3
4
5
6
7
8
9
10
11
12
13
                      _                                
  __ __ __ ____ __ __| |__                             
 / _|\ V  V /\ V  V /| / /                             
 \__| \_/\_/  \_/\_/ |_\_\                             
  ___        _     _               _  ____             
 |   \  ___ | |__ (_) __ _  _ _   / ||__ /             
 | |) |/ -_)| '_ \| |/ _` || ' \  | | |_ \             
 |___/ \___||_.__/|_|\__,_||_||_| |_||___/             
  _  ___  ___     _   __  ___     __     ___  __   ___ 
 / |/ _ \|_  )   / | / / ( _ )   /  \   |_  )/  \ | __|
 | |\_, / / /  _ | |/ _ \/ _ \ _| () |_  / /| () ||__ \
 |_| /_/ /___|(_)|_|\___/\___/(_)\__/(_)/___|\__/ |___/
                                                       

LVM - SSD NVMe 2To

Ajout d’un SSD NVMe 2To sur la machine cwwk

les commandes gdisk et sgdisk sont installées via le paquet gdisk

1
sudo apt install gdisk

Partitionner SSD NVMe 2To

Identifier le périphérique: lsblk

Périphérique /dev/nvme1n1

On efface tout

1
sudo sgdisk --zap-all /dev/nvme1n1

GPT data structures destroyed! You may now partition the disk using fdisk or other utilities.

Création partition

1
sudo sgdisk --clear --new=1:0:0 --typecode=1:8e00 /dev/nvme1n1

Creating new GPT entries in memory.
The operation has completed successfully.

PV - Volume physique

Un volume physique ou « PV » pour « physical volume » est tout simplement un disque ou une partition.

1
sudo pvcreate /dev/nvme1n1p1  # Physical volume "/dev/nvme1n1p1" successfully created.

VG - Groupe de volumes

Un groupe de volumes ou « VG » pour « volume group » est un ensemble de volumes physiques. On a donc un ou plusieurs volumes physiques dans un groupe de volumes, et pour utiliser LVM, il faut obligatoirement au moins un groupe de volumes.

1
2
# volume sur le SSD NVMe a
sudo vgcreate nvmea-vg /dev/nvme1n1p1  # Volume group "nvmea-vg" successfully created

LV - Volume logique

Un volume logique ou « LV » pour « logical volume » est un espace dans un groupe de volume où l’on peut mettre un système de fichiers.

Création des volumes logiques

1
2
3
4
5
6
7
8
# ncdata : pour les données de nextcloud
sudo lvcreate -L 150G -n ncdata nvmea-vg
# private
sudo lvcreate -L 150G -n private nvmea-vg
# sharenfs : pour le partage NFS
sudo lvcreate -L 250G -n sharenfs nvmea-vg
# kvm : pour le virtuel 
sudo lvcreate -L 200G -n kvm nvmea-vg

Format des partitions

1
2
3
4
sudo mkfs.ext4 /dev/mapper/nvmea--vg-ncdata
sudo mkfs.ext4 /dev/mapper/nvmea--vg-private
sudo mkfs.ext4 /dev/mapper/nvmea--vg-sharenfs
sudo mkfs.ext4 /dev/mapper/nvmea--vg-kvm

Montages fstab

UUID des partitions logiques LVM :

1
2
3
4
sudo blkid |grep "/dev/mapper/nvmea--vg-ncdata"    # UUID="c8cbc005-259d-4642-863c-b753088cefc3"
sudo blkid |grep "/dev/mapper/nvmea--vg-sharenfs"  # UUID="eb2cfabe-8e1d-463d-a62d-9da921a747f3"
sudo blkid |grep "/dev/mapper/nvmea--vg-kvm"       # UUID="e2c983fd-588b-423c-b687-6346f1f81b0f"
sudo blkid |grep "/dev/mapper/nvmea--vg-private"   # UUID="0d081c20-6b1d-461c-bc0e-a469e24e546d"

Création des points de montage et modifier les propriétés pur le dossier partagé NFS

1
2
3
4
5
sudo mkdir -p /srv/{nextcloud-data,kvm}
sudo mkdir -p /sharenfs
# # Modifications possibles par les utilisateurs avec ID=1000
sudo chown -R $USER:$USER /sharenfs       
sudo chown -R $USER:$USER /srv/kvm       

Ajout au fichier /etc/fstab

1
2
3
4
5
6
7
8
# /dev/mapper/nvmea--vg-ncdata
UUID=c8cbc005-259d-4642-863c-b753088cefc3 /srv/nextcloud-data   ext4    defaults        0       2
# /dev/mapper/nvmea--vg-kvm 
UUID=e2c983fd-588b-423c-b687-6346f1f81b0f /srv/kvm 	ext4	defaults	0	2
#  /dev/mapper/nvmea--vg-sharenfs
UUID=eb2cfabe-8e1d-463d-a62d-9da921a747f3 /mnt/sharenfs ext4    defaults     0	2
# /dev/mapper/nvmea--vg-private
UUID=0d081c20-6b1d-461c-bc0e-a469e24e546d /srv/private   ext4    defaults        0       2

Modifier le fichier /etc/fstab pour les UUID root,home et swap de l’installation debian

1
2
3
/dev/mapper/alder--vg-swap_1: UUID="9f71df16-af9d-49af-a204-0eb8fdcd0371" TYPE="swap"
/dev/mapper/alder--vg-home: UUID="996ee697-528b-4af6-9c4e-6d2a6c759303" BLOCK_SIZE="4096" TYPE="ext4"
/dev/mapper/alder--vg-root: UUID="3e842a93-ffd5-4257-b928-e9b6288064a7" BLOCK_SIZE="4096" TYPE="ext4"

Créer volume logique “var”

Le dossier /var contient , à terme, tous les chemins “root” du web. Il peut dépasser les 5Go

Le dossier /var est actuellement dans le volume logique root /dev//mapper/alder--vg-root

Création volume logique “var” de 10Go

1
sudo lvcreate -L 10G -n var cwwk-vg

Format partition

1
sudo mkfs.ext4 /dev/mapper/alder--vg-var

Relever son UUID

1
sudo blkid |grep "/dev/mapper/alder--vg-var"    # UUID="9d942292-a4d4-4fb3-b8e9-b945b8233d72"

Ajout au fichier /etc/fstab

1
2
#/dev/mapper/alder--vg-var
UUID=9d942292-a4d4-4fb3-b8e9-b945b8233d72 /var           ext4    defaults        0       2

Recharger et monter

1
2
sudo systemctl daemon-reload
sudo mount -a

Vérification lsblk

1
2
3
4
5
6
7
8
9
10
11
12
13
NAME                   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
nvme0n1                259:0    0   1,9T  0 disk 
└─nvme0n1p1            259:1    0   1,9T  0 part 
  ├─nvmea--vg-ncdata   254:0    0   150G  0 lvm  /srv/nextcloud-data
  ├─nvmea--vg-sharenfs 254:3    0   750G  0 lvm  /sharenfs
  ├─nvmea--vg-kvm      254:4    0   200G  0 lvm  /srv/kvm
  └─nvmea--vg-private  254:5    0   150G  0 lvm  /srv/private
nvme1n1                259:2    0   1,8T  0 disk 
├─nvme1n1p1            259:3    0   976M  0 part /boot/efi
├─nvme1n1p2            259:4    0   977M  0 part /boot
└─nvme1n1p3            259:5    0   1,8T  0 part 
  ├─alder--vg-root     254:1    0   1,8T  0 lvm  /
  └─alder--vg-swap_1   254:2    0  31,7G  0 lvm  [SWAP]

Journaux

Users in groups ‘adm’, ‘systemd-journal’ can see all messages. Pour visualiser tous les messages de journal, ajouter l’utilisateur au groupe existant adm

1
2
sudo usermod -a -G adm $USER
sudo usermod -a -G systemd-journal $USER

Pour voir les messages sans coupures

1
SYSTEMD_LESS=FRXMK journalctl -u caddy

Ajouter au .bashrc

1
echo "export SYSTEMD_LESS=FRXMK"

Liens ln

sur home

1
2
ln -s /sharenfs sharenfs
ln -s /sharenfs/scripts scripts

Ethernet 2.5Gb enp4s0

Serveur Debian CWWK x86-P5 configuration du second port Ethernet 2.5 Gigabit enp4s0

Très largement inspiré de l’article Configuration du second réseau

  • Machine CWWK x86-P5 Debian 12 equioée de 2 ports ethernet
  • Accès internet
  • Switch pour le second réseau

Le réseau par défaut offre un moyen très simple d’obtenir une connectivité lors de la création de machines virtuelles : tout est « prêt » et fonctionne dès la sortie de la boîte. Parfois, cependant, nous souhaitons obtenir une connexion Bridge où les VM sont connectés au réseau local de l’hôte sans utiliser NAT.(Installing and Using KVM for Virtualization on Debian 12)

en mode su

Pour configurer le mode Bridge, vous devez créer un pont virtuel et partager l’une des interfaces Ethernet physiques de l’hôte.

Le programme dont vous aurez besoin s’appelle brctl et est inclus dans bridge-utils.

1
apt install bridge-utils

Configuration passerelle br0

Interface bridge, 2 configurations sont possibles

Interface bridge 192.168.10.0/24

Modification pour le second réseau , Interface enp4s0 192.168.10.0/24

Il faut relier le routeur Tenda avec CWWK enp4s0 par un câble ethernet

1
2
3
4
5
6
7
8
9
10
# Bridge setup
auto br0
iface br0 inet static
    bridge_ports enp4s0
    address 192.168.10.100
    netmask 255.255.255.0
    gateway 192.168.10.1
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0
  • enp3s0 est configurée avec une adresse IP statique qui lui permet de communiquer avec le réseau principal.
  • La passerelle par défaut est également définie pour diriger le trafic Internet
  • Pour enp4s0, une adresse IP statique est configurée pour le réseau secondaire.

Sur le routeur tenda, ajouter une réservation IP statique sur br0 (link/ether 96:9c:89:a6:a0:8f)

Après redémarrage de la machine: ip address show br0

1
2
3
4
5
6
7
8
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 86:17:e7:6c:62:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.100/24 brd 192.168.10.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2001:3::8417:e7ff:fe6c:62bc/64 scope global dynamic mngtmpaddr proto kernel_ra 
       valid_lft 106sec preferred_lft 106sec
    inet6 fe80::8417:e7ff:fe6c:62bc/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

Configuration réseau active

Interfaces réseau enp3s0 et enp4s0

Pour rendre votre configuration permanente, vous devez éditer le fichier /etc/network/interfaces

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp3s0
iface enp3s0 inet static
  address 192.168.0.205
  netmask 255.255.255.0
  gateway 192.168.0.254
# This is an autoconfigured IPv6 interface
iface enp3s0 inet6 static
    address 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45
    netmask 64
    gateway fe80::8e97:eaff:fe39:66d6

# Bridge setup
auto br0
iface br0 inet static
    bridge_ports enp4s0
    address 192.168.10.100
    netmask 255.255.255.0
    gateway 192.168.10.1
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0

La machine CWWK Debian sert de passerelle entre le réseau principal (192.168.0.0/24) et le réseau secondaire (192.168.10.0/24).
Cette configuration assure que le serveur CWWK peut communiquer à la fois avec les dispositifs internes sur les deux sous-réseaux et avec l’Internet externe.

Les interfaces réseau: ip link

1
2
3
4
5
6
7
8
9
10
11
12
13
root@alder:/home/yick# ip link show enp3s0
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether a8:b8:e0:04:ec:45 brd ff:ff:ff:ff:ff:ff
    altname enxa8b8e004ec45

root@alder:/home/yick# ip link show enp4s0
3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP mode DEFAULT group default qlen 1000
    link/ether a8:b8:e0:04:ec:46 brd ff:ff:ff:ff:ff:ff
    altname enxa8b8e004ec46

root@alder:/home/yick# ip link show br0
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 86:17:e7:6c:62:bc brd ff:ff:ff:ff:ff:ff

DNS Unbound

DNS Unbound
Les serveurs DNS sont des machines discutant entre elles afin de se communiquer les correspondances entre nom de domaine et adresses IP.

  1. Résolveur DNS Unbound

Procédure pour installer manuellement unbound adblock sur le serveur debian cwwk

En mode su

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Cloner le git
git clone https://gitea.rnmkcy.eu/yann/unbound-adblock
# Copier le script unbound-adblock
cp unbound-adblock/unbound-adblock /usr/local/bin/
# Le rendre éxécutable
chmod +x /usr/local/bin/unbound-adblock
# Copier liste-adblock.json dans /var/lib/unbound
cp unbound-adblock/liste-adblock.json /var/lib/unbound/
# Copier adblock dans /etc/logrotate.d/
cp unbound-adblock/adblock /etc/logrotate.d/ 
# Créer un service systemd adblock.service dans /etc/systemd/system
cp unbound-adblock/adblock.service /etc/systemd/system/
# activer et démarrer le service
systemctl daemon-reload
systemctl enable --now adblock.service

Status systemctl status adblock.service

1
2
3
4
5
6
7
8
9
10
11
12
13
● adblock.service - Unbound AdBlock List Making
     Loaded: loaded (/etc/systemd/system/adblock.service; enabled; preset: enabled)
     Active: active (exited) since Mon 2025-10-20 11:02:36 CEST; 27s ago
 Invocation: 4b8d2fa0eaaf42dbbe47077a8f9a338a
    Process: 1846706 ExecStart=/usr/local/bin/unbound-adblock /var/lib/unbound/liste-adblock.json (code=exited, status=0/SUCCESS)
   Main PID: 1846706 (code=exited, status=0/SUCCESS)
   Mem peak: 44.4M
        CPU: 2.224s

oct. 20 11:02:31 cwwk systemd[1]: Starting adblock.service - Unbound AdBlock List Making...
oct. 20 11:02:36 cwwk unbound-adblock[1846828]: ok
oct. 20 11:02:36 cwwk unbound-adblock[1846706]: Nouvelle version en place, 80202 domaines bloqués.
oct. 20 11:02:36 cwwk systemd[1]: Finished adblock.service - Unbound AdBlock List Making.

Test

Afin de tester que le comportement d’Unbound est bien correct après l’exécutuion du script, on peut prendre un domaine dans liste de domaines bloqués (google-analytics.com par exemple)
dig google-analytics.com

Les informations importantes sont :

  1. La réponse NXDOMAIN indiquant que le domaine n’existe pas
  2. Le bit AA signifiant « Authoritative Answer », la réponse du serveur intérrogé (le localhost ici en l’occurence) fait autorité. Aucun autre serveur n’a donc été intérrogé

Parefeu UFW

ufw

UFW, ou pare - feu simple , est une interface pour gérer les règles de pare-feu dans Arch Linux, Debian ou Ubuntu. UFW est utilisé via la ligne de commande (bien qu’il dispose d’interfaces graphiques disponibles), et vise à rendre la configuration du pare-feu facile.

Installation Debian / Ubuntu

1
sudo apt install ufw

Par défaut, les jeux de règles d’UFW sont vides, de sorte qu’il n’applique aucune règle de pare-feu, même lorsque le démon est en cours d’exécution.

En mode su

Les règles

1
2
3
4
5
6
7
8
9
10
ufw allow http                   # port 80
ufw allow https                  # port 443
ufw allow dns                    # port 53
ufw allow 55205/tcp              # port ssh
ufw allow 9100/tcp
ufw allow 59232/tcp
ufw allow from 192.168.0.0/24    # tout traffic
ufw allow from 192.168.10.0/24   # tout traffic
ufw allow from 10.19.55.0/24     # tout traffic
ufw allow frmo 2a01:e0a:9c8:2080::/48

Activer le parefeu

1
ufw enable
1
2
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Status

1
 ufw status 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Status: active

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
DNS                        ALLOW       Anywhere                  
55205/tcp                  ALLOW       Anywhere                  
9100/tcp                   ALLOW       Anywhere                  
59232/tcp                  ALLOW       Anywhere                  
Anywhere                   ALLOW       192.168.0.0/24            
Anywhere                   ALLOW       192.168.10.0/24           
Anywhere                   ALLOW       10.19.55.0/24             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             
DNS (v6)                   ALLOW       Anywhere (v6)             
55205/tcp (v6)             ALLOW       Anywhere (v6)             
9100/tcp (v6)              ALLOW       Anywhere (v6)             
59232/tcp (v6)             ALLOW       Anywhere (v6)             

désactiver la journalisation

1
ufw logging off

Configurer ufw pour permettre et contrôler le trafic entre les réseaux
Il faut autoriser le forwarding dans la configuration d’ufw.

1
nano /etc/default/ufw 

Recherchez la ligne commençant par DEFAULT_FORWARD_POLICY.
Remplacez la valeur DROP par ACCEPT. Enregistrez le fichier et quittez l’éditeur.

1
DEFAULT_FORWARD_POLICY="ACCEPT"

Recharger le service ufw

1
sudo ufw reload

Partage Samba Freebox

Partage disque USB 2To monté sur FreeboX

Accés partage samba depuis linux

Installation paquet cifs-utils

1
2
sudo apt install cifs-utils  # Debian
sudo pacman -S cifs-utils    # Archlinux 

Création répertoire de montage et lien

1
2
sudo mkdir /mnt/FreeUSB2To   
sudo ln -s /mnt/FreeUSB2To $HOME/FreeUSB2To

Création fichier caché pour login et mot de passe

1
sudo nano /root/.smbcredentials

Dans le fichier, ajoutez les lignes suivantes (remplacez les XXXX par votre login et mot de passe)

1
2
username=XXXXXX
password=XXXXXX

Donnez les droits adéquats au fichier

1
2
sudo chown -R root:root /root/.smbcredentials
sudo chmod -R 600 /root/.smbcredentials

Montage linux du disque USB Freebox

Résumé
Partage : //192.168.0.254/FreeUSB2To
Point de montage local : sudo mkdir -p /mnt/FreeUSB2To
Outil cifs : sudo apt install cifs-utils
Utlisateur mot de passe: /root/.smbcredentials
Lien: ln -s /mnt/FreeUSB2To/ $HOME/FreeUSB2To

Trois options de montage, via systemd.mount, systemd.automount ou fstab

A-Montage systemd mount

Le fichier mount: /etc/systemd/system/mnt-FreeUSB2To.mount

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
  Description=cifs mount script
  After=network-online.target
  Wants=network-online.target

[Mount]
  What=//192.168.0.254/FreeUSB2To
  Where=/mnt/FreeUSB2To
  Options=credentials=/root/.smbcredentials,rw,uid=1000,gid=1000,vers=3.0
  Type=cifs

[Install]
  WantedBy=multi-user.target

Lancement et activation mount

1
sudo systemctl enable mnt-FreeUSB2To.mount --now

Vérifier : ls /mnt/FreeUSB2To/

B-Montage systemd automount (UTILISE)

Le fichier mount: /etc/systemd/system/mnt-FreeUSB2To.mount

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
  Description=cifs mount script
  Requires=network-online.target
  After=network-online.service

[Mount]
  What=//192.168.0.254/FreeUSB2To
  Where=/mnt/FreeUSB2To
  Options=credentials=/root/.smbcredentials,rw,uid=1000,gid=1000,vers=3.0
  Type=cifs

[Install]
  WantedBy=multi-user.target

Le fichier automount: /etc/systemd/system/mnt-FreeUSB2To.automount

1
2
3
4
5
6
7
8
9
10
11
[Unit]
  Description=cifs mount script
  Requires=network-online.target
  After=network-online.service

[Automount]
  Where=/mnt/FreeUSB2To
  TimeoutIdleSec=0

[Install]
  WantedBy=multi-user.target

Lancement et activation automount

1
sudo systemctl enable mnt-FreeUSB2To.automount --now

Si vous utiliez mnt-FreeUSB2To.automount, mnt-FreeUSB2To.mount doit être désactivé

Vérifier : ls /mnt/FreeUSB2To/

C-Montage via fstab (NON UTILISE)

Modèle pour fstab

1
//[Serveur]/[Partage]  [PointDeMontage]  cifs  noauto,x-systemd.automount,_netdev,file_mode=0750,dir_mode=0750,uid=[Mon_UID],gid=[Mon_GID],credentials=~/.smbcredentials  0  0

Explication des options:

  • //[Serveur]/[Partage]: Adresse du serveur et nom du partage CIFS. Exemple: //192.168.1.10/Documents.
  • [PointDeMontage]: Chemin du dossier local où le partage sera monté. Exemple: /mnt/partage_documents.
  • cifs: Indique que le système de fichiers à monter est de type CIFS.
  • noauto: Empêche le montage automatique du partage au démarrage du système.
  • x-systemd.automount: Active le montage automatique à la demande via Systemd.
  • _netdev: Indique que le partage se trouve sur un périphérique réseau.
  • file_mode=0750: Définit les permissions des fichiers sur le partage monté (lecture, écriture et exécution pour le propriétaire et le groupe, aucune permission pour les autres).
  • dir_mode=0750: Définit les permissions des dossiers sur le partage monté.
  • uid=[Mon_UID]: ID utilisateur qui sera propriétaire des fichiers et dossiers sur le partage monté.
  • gid=[Mon_GID]: ID du groupe qui sera propriétaire des fichiers et dossiers sur le partage monté.
  • credentials=~/.smbcredentials: Chemin vers le fichier contenant les informations d’identification.

Ajout de la ligne suivante au fichier /etc/fstab

1
//192.168.0.254/FreeUSB2To /mnt/FreeUSB2To cifs _netdev,noauto,x-systemd.automount,uid=1000,gid=1000,credentials=/root/.smbcredentials 0 0

Le partage CIFS sera automatiquement monté lorsque vous accéderez au dossier de montage /mnt/FreeUSB2To. Il sera démonté automatiquement après une période d’inactivité.

Recharger

1
2
sudo systemctl daemon-reload
sudo mount -a

Virtualisation KVM


KVM, acronyme de Kernel-based Virtual Machine, est un outil de virtualisation complet et opensource pour les systèmes Linux avec des extensions de virtualisation matérielle basées sur les processeurs Intel-VT ou AMD-V.

Vérifiez la prise en charge de la virtualisation matérielle sur votre système avec la commande grep --color -iE 'vmx|svm' /proc/cpuinfo qui recherche les drapeaux du processeur : Intel vmx (Virtual Machine Extension) ou AMD svm (Secure virtual Machine).

Installer KVM sur un serveur

Sur un serveur headless sans interface graphique, il suffit d’exécuter la commande ci-dessous

1
2
3
4
5
sudo apt install qemu-kvm libvirt-daemon  bridge-utils virtinst libvirt-daemon-system
sudo apt install qemu-system libvirt-daemon-system virtinst qemu-utils
sudo apt install virt-viewer
# pour le partage
sudo apt install virtiofsd

Une fois l’installation terminée, vérifiez si les modules KVM sont chargés

1
lsmod | grep -i kvm
1
2
3
kvm_intel             380928  0
kvm                  1146880  1 kvm_intel
irqbypass              16384  1 kvm

bridge debian

/etc/network/interfaces

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp3s0
iface enp3s0 inet static
  address 192.168.0.205
  netmask 255.255.255.0
  gateway 192.168.0.254
# This is an autoconfigured IPv6 interface
#iface enp3s0 inet6 auto

# Bridge setup
auto br0
iface br0 inet static
    bridge_ports enp4s0
    address 192.168.10.100
    netmask 255.255.255.0
    gateway 192.168.10.1
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0

Redémarrer la machine

ip a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether a8:b8:e0:04:ec:45 brd ff:ff:ff:ff:ff:ff
    altname enxa8b8e004ec45
    inet 192.168.0.205/24 brd 192.168.0.255 scope global enp3s0
       valid_lft forever preferred_lft forever
    inet6 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45/64 scope global dynamic mngtmpaddr proto kernel_ra 
       valid_lft 85903sec preferred_lft 85903sec
    inet6 fe80::aab8:e0ff:fe04:ec45/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether a8:b8:e0:04:ec:46 brd ff:ff:ff:ff:ff:ff
    altname enxa8b8e004ec46
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 86:17:e7:6c:62:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.100/24 brd 192.168.10.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2001:3::8417:e7ff:fe6c:62bc/64 scope global dynamic mngtmpaddr proto kernel_ra 
       valid_lft 81sec preferred_lft 81sec
    inet6 fe80::8417:e7ff:fe6c:62bc/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

Démarrer le démon de gestion libvirt (libvirtd)

le programme libvirtd est le composant démon côté serveur du système de gestion de la virtualisation libvirt. Ce démon s’exécute sur les serveurs hôtes et exécute les tâches de gestion requises pour les invités virtualisés. Cela inclut des activités telles que le démarrage, l’arrêt et la migration des invités entre les serveurs hôtes, la configuration et la manipulation du réseau, et la gestion du stockage pour l’utilisation par les invités. Les bibliothèques et utilitaires clients libvirt se connectent à ce démon pour exécuter des tâches et collecter des informations sur la configuration et les ressources du système hôte et des invités.

Il convient donc de lancer et d’activer ce service au démarrage du système

1
sudo systemctl enable --now libvirtd

Vérifier l’état

1
systemctl  status libvirtd

le service libvirtd est activé et démarré !

Par défaut, le démon libvirtd écoute les requêtes sur un socket local de domaine Unix. En utilisant l’option de ligne de commande -l | --listen, il est possible de demander au démon libvirtd d’écouter également sur une socket TCP/IP. Le socket TCP/IP à utiliser est défini dans le fichier de configuration de libvirtd.

Ajouter en fin de fichier /etc/libvirt/qemu.conf

1
2
user = "yick"
group = "yick"

Ajoutez maintenant votre utilisateur actuel aux groupes libvirt-qemu et libvirt afin qu’il puisse créer et gérer des VM à l’aide de virsh utilitaire de ligne de commande ou Virt-manager interface graphique.

1
2
3
4
sudo usermod -aG libvirt-qemu $USER
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

Recharger l’appartenance à un groupe Linux à l’aide de la commande newgrp

1
2
3
newgrp libvirt
newgrp libvirt-qemu
newgrp kvm

La connexion “virsh” par défaut dans la configuration globale: uri_default = "qemu:///system"
Pour tester, se connecter à l’hyperviseur en exécutant

1
virsh list

Le résultat est une liste vide de machines virtuelles.

1
2
3
 ID   Nom   État
------------------

PC1 Virt Manager

La boîte de dialogue GUI de virt-manager ne permet pas de spécifier un port ssh autre que celui par défaut ou la clé privée à utiliser lors de la connexion au serveur distant, mais cela est facilement réalisable en démarrant virt-manager avec le paramètre ‘-c’

1
virt-manager -c 'qemu+ssh://yick@192.168.0.205:55205/system?keyfile=/home/yann/.ssh/yick-ed25519'

Sur PC1

Créer un stockage nommé machines

Modifier le réseau par défaut

pour démarrer le réseau

Modifier la plage DHCP <range start="192.168.110.128" end="192.168.110.254"/>

KVM - Pont réseau vituel

Créez un fichier XML qui définit le pont virtuel : bridged-network.xml

1
2
3
4
5
<network>
    <name>bridged-network</name>
    <forward mode="bridge" />
    <bridge name="br0" />
</network>

Pour définir un réseau à partir d’un fichier XML sans le démarrer

1
sudo virsh net-define bridged-network.xml

Réseau bridged-network défini depuis bridged-network.xml

Pour démarrer un réseau inactif (précédemment défini)

1
sudo virsh net-start bridged-network

Réseau bridged-network démarré

Pour configurer le réseau de manière à ce qu’il démarre automatiquement au démarrage du service

1
sudo virsh net-autostart bridged-network

Réseau bridged-network marqué en démarrage automatique

Vérifier pour confirmer que le drapeau de démarrage automatique est à oui - Persistent devrait aussi lire oui.

1
sudo virsh net-list --all

Résultat

1
2
3
4
 Nom               État    Démarrage automatique   Persistent
---------------------------------------------------------------
 bridged-network   actif   Oui                     Oui
 network-nat       actif   Oui                     Oui

Créer une machine virtuelle alpine linux

1
2
3
4
5
6
7
8
9
10
11
sudo virt-install \
--osinfo alpinelinux3.17 \
--name vm-alpine01 \
--memory 2048 \
--vcpus 1 \
--cpu host \
--hvm \
--disk path=/srv/kvm/libvirt/images/vm-alpine01.qcow2,format=qcow2,size=5 \
--cdrom /home/yick/FreeUSB2To/iso/alpine-standard-3.21.0-x86_64.iso \
--network bridge=br0 \
--graphics vnc  

Prendre la main en VNC

1
ssh -L 9500:127.0.0.1:5005 yick@192.168.0.205 -p 55205 -i /home/yann/.ssh/yick-ed25519

Structure des dossiers KVM

Les dossiers libvirt : sudo find / -name "libvirt" -type d

1
2
3
4
5
6
7
8
9
10
11
12
/var/cache/libvirt
/var/lib/libvirt
/var/log/libvirt
/etc/libvirt
/etc/apparmor.d/libvirt
/usr/lib/libvirt
/usr/lib/x86_64-linux-gnu/libvirt
/usr/share/libvirt
/home/yick/.config/libvirt
/home/yick/.cache/libvirt
/run/libvirt
/srv/kvm/libvirt

Les configurations xml réseau et machines virtuelles : tree -L 3 /etc/libvirt/qemu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/etc/libvirt/qemu
├── alpine-searx.xml
├── alpine-vm.xml
├── autostart
│   ├── alpine-searx.xml -> /etc/libvirt/qemu/alpine-searx.xml
│   ├── alpine-vm.xml -> /etc/libvirt/qemu/alpine-vm.xml
│   ├── vm-alpine01.xml -> /etc/libvirt/qemu/vm-alpine01.xml
│   ├── vm-alpine02.xml -> /etc/libvirt/qemu/vm-alpine02.xml
│   ├── vm-alpine03.xml -> /etc/libvirt/qemu/vm-alpine03.xml
│   ├── vm-alpine04.xml -> /etc/libvirt/qemu/vm-alpine04.xml
│   ├── vm-alpine05.xml -> /etc/libvirt/qemu/vm-alpine05.xml
│   ├── vm-alpine06.xml -> /etc/libvirt/qemu/vm-alpine06.xml
│   ├── vm-debian12.xml -> /etc/libvirt/qemu/vm-debian12.xml
│   ├── vm-debian13-02.xml -> /etc/libvirt/qemu/vm-debian13-02.xml
│   ├── vm-debian13.xml -> /etc/libvirt/qemu/vm-debian13.xml
│   └── vm-ntfy.xml -> /etc/libvirt/qemu/vm-ntfy.xml
├── networks
│   ├── autostart
│   │   ├── bridged-network.xml -> /etc/libvirt/qemu/networks/bridged-network.xml
│   │   └── network-nat.xml -> /etc/libvirt/qemu/networks/network-nat.xml
│   ├── bridged-network.xml
│   └── network-nat.xml
├── vm-alpine01.xml
├── vm-alpine02.xml
├── vm-alpine03.xml
├── vm-alpine04.xml
├── vm-alpine05.xml
├── vm-alpine06.xml
├── vm-alpine07.xml
├── vm-debian12.xml
├── vm-debian13-02.xml
├── vm-debian13.xml
├── vm-lldap.xml
└── vm-ntfy.xml

Systemd ‘stop-vm-before-shutdown’

Un service systemd qui exécute un script lors de l’arrêt ou redémarrage de la machine

Créer un script shell ‘stop-all-vm’

1
2
3
4
5
6
#!/bin/bash

# Liste des VM avec autostart actif
for vm in $(virsh -c qemu:///system list --all --name --autostart); do
        virsh -c qemu:///system shutdown "$vm"
done

Le rendre exécutable et le copier vers /usr/local/bin/

1
2
chmod +x stop-all-vm
sudo cp stop-all-vm /usr/local/bin/

Créer un service stop_vm_before_shutdown.service

1
sudo nano /etc/systemd/system/stop_vm_before_shutdown.service
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Force umount
DefaultDependencies=no
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/stop-all-vm
TimeoutStartSec=0

[Install]
WantedBy=shutdown.target

Rafraîchir les fichiers de configuration de systemd

1
sudo systemctl daemon-reload

Activer le script pour qu’il démarre automatiquement au prochain démarrage

1
sudo systemctl enable stop_vm_before_shutdown.service --now

Il faut modifier le fichier /usr/lib/systemd/system/libvirt-guests.service et désactiver ExecStop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[Unit]
Description=libvirt guests suspend/resume service
Documentation=man:libvirt-guests(8)
Documentation=https://libvirt.org/
Requires=virt-guest-shutdown.target
After=network.target
After=time-sync.target
After=libvirtd.socket
After=virtqemud.socket
After=virtlxcd.socket
After=virtvboxd.socket
After=virtvzd.socket
After=virtxend.socket
After=virt-guest-shutdown.target

[Service]
EnvironmentFile=-/etc/default/libvirt-guests
# Hack just call traditional service until we factor
# out the code
ExecStart=/usr/lib/libvirt/libvirt-guests.sh start
# Disable ExecStop
#ExecStop=/usr/lib/libvirt/libvirt-guests.sh stop
Type=oneshot
RemainAfterExit=yes
StandardOutput=journal+console
TimeoutStopSec=0

[Install]
WantedBy=multi-user.target

Rafraîchir les fichiers de configuration de systemd

1
sudo systemctl daemon-reload

PHP8 + MariaDB

Go + Node

1
2
3
4
5
cd ~
wget https://go.dev/dl/go1.23.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.4.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin"  >> ~/.bashrc
source ~/.bashrc
1
2
3
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
source ~/.bashrc
nvm ls-remote  # affiche les versions

Now using node v20.10.0 (npm v10.2.3)
Creating default alias: default -> 20.10.0 (-> v20.10.0)

Nginx + Certificats + sites

nginx extras

LLdap - (lldap.rnmkcy.eu)

Gestion de l’annuaire lldap des utilisateurs

Suivre la procédure sur le lien cwwk - Service LLdap)

Domaine lldap.home.arpa (Domaine home.arpa)

Ajout au fichier /etc/unbound/unbound.conf.d/local-unbound.conf

1
2
    local-data: "lldap.home.arpa.  86400 IN A 192.168.0.205"
    local-data-ptr: "192.168.10.205 86400 lldap.home.arpa."

Redémarrer unbound

1
sudo systemctl restart unbound

Générer les certificats lldap.home.arpa

1
2
3
4
5
6
# génération
cd ~
./gensert.sh lldap.home.arpa
# déplacer certificat et clé
sudo mv lldap.home.arpa.key /etc/ssl/private/
sudo mv lldap.home.arpa.crt /etc/ssl/private/

Création proxy nginx pour le gestionnaire web LLdap

1
/etc/nginx/conf.d/lldap.home.arpa.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
    listen 80;
    listen [::]:80;
    server_name  lldap.home.arpa;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://lldap.home.arpa$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  lldap.home.arpa;

    ssl_certificate      /etc/ssl/private/lldap.home.arpa.crt;
    ssl_certificate_key  /etc/ssl/private/lldap.home.arpa.key;

    # connexion nginx fermée si sous domaine inexistant
    if ($http_host != "lldap.home.arpa") {
     return 444;
    }

  location / { 
     proxy_pass              http://127.0.0.1:17170;
  } 

}

Vérifier et recharger nginx: sudo nginx -t && sudo systemctl reload nginx
Accès par le lien https://lldap.home.arpa/

Nextcloud (cloud.rnmkcy.eu]


Nginx PHP MariaDB Nextcloud Hub

Authentification unique


L’authentification unique, souvent désignée par le sigle anglais SSO (de single sign-on) est une méthode permettant à un utilisateur d’accéder à plusieurs applications informatiques (ou sites web sécurisés) en ne procédant qu’à une seule authentification.(Authentification unique WikipédiA )
Authelia pour gérer les autorisations d’accès à des applications en s’appuyant sur l’annuaire lldap

SSO Authelia

Domaines et sous Domaines rnmkcy.eu

Fichier Configuration SSL et Certificats

Configuration intermédiaire: /etc/nginx/conf.d/ssl-intermediate.inc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    ssl_certificate /etc/ssl/private/rnmkcy.eu-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/rnmkcy.eu-key.pem;

    # Use Mozilla's guidelines for SSL/TLS settings
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/
    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off;

    # see also ssl_session_ticket_key alternative to stateful session cache
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    ssl_dhparam "/etc/ssl/private/dhparam";

Configuration moderne: /etc/nginx/conf.d/ssl-modern.inc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    ssl_certificate /etc/ssl/private/rnmkcy.eu-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/rnmkcy.eu-key.pem;

    # Use Mozilla's guidelines for SSL/TLS settings
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/
    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_prefer_server_ciphers off;

    # uncomment to enable if ssl_protocols includes TLSv1.2 or earlier;
    # see also ssl_session_ticket_key alternative to stateful session cache
    #ssl_session_timeout 1d;
    #ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions

Dossier racine rnmkcy.eu

1
/etc/nginx/conf.d/rnmkcy.eu.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

    root /sharenfs/rnmkcy/racine/ ;
        location / {
            index index.html;
        }
  location ~ \.php(?:$|/) {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param HTTPS on;

    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
    fastcgi_param front_controller_active true;     # Enable pretty urls
    fastcgi_param HTTP_ACCEPT_ENCODING "";          # Disable encoding of nextcloud response to inject ynh scripts
    fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;
  }

}

Site statique jekyll (static.rnmkcy.eu)

Regroupe static site diceware et cartes

1
/etc/nginx/conf.d/static.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name static.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;
    root /sharenfs/multimedia/Divers/static/;

    location / {
      index index.htm index/ index.php;
		  location ~ \.php(?:$|/) {
		    include fastcgi_params;
		    fastcgi_param SCRIPT_FILENAME $request_filename;
		    fastcgi_split_path_info ^(.+\.php)(/.+)$;
		    fastcgi_param HTTPS on;
		
		    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
		    fastcgi_param front_controller_active true;     # Enable pretty urls
		    fastcgi_param HTTP_ACCEPT_ENCODING "";          # Disable encoding of nextcloud response to inject ynh scripts
		    fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
		    fastcgi_intercept_errors on;
		    fastcgi_request_buffering off;
		  }
    }
}

Site statique jekyll (chirpy.rnmkcy.eu)

1
/etc/nginx/conf.d/chirpy.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name chirpy.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;
    root /sharenfs/rnmkcy/chirpy/;

    location / {
      index index.html;
    }
}

Mot passe haute entropie (dice.rnmkcy.eu)

1
/etc/nginx/conf.d/dice.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name dice.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;
    root /sharenfs/multimedia/Divers/diceware/;

    location / {
      index index.htm index/;
    }
}

Leaflet cartographie osm-new (osm.rnmkcy.eu)

1
/etc/nginx/conf.d/osm.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name osm.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;
    root /sharenfs/multimedia/Divers/osm-new/;

    location / {
      index index.htm index/;
    }
}

Recharger : sudo systemctl reload nginx

Shaarli liens (shaarli.rnmkcy.eu)

Shaarli, le service personnel, minimaliste, super rapide, sans base de données, signet.

Installer Shaarli

Pour installer Shaarli, il suffit de placer les fichiers de la dernière archive .zip sous la racine du document de votre serveur web (directement à la racine du document, ou dans un sous-répertoire). Téléchargez l’archive shaarli-vX.X.X-full pour y inclure les dépendances.

1
2
3
wget https://github.com/shaarli/Shaarli/releases/download/v0.13.0/shaarli-v0.13.0-full.zip
unzip shaarli-v0.13.0-full.zip
sudo rsync -avP Shaarli/ /var/www/shaarli.rnmkcy.eu/

Définir les permissions de fichier

Quelle que soit la méthode d’installation, les autorisations de fichiers appropriées doivent être définies:

1
2
3
sudo chown -R root:www-data /var/www/shaarli.rnmkcy.eu
sudo chmod -R g+rX /var/www/shaarli.rnmkcy.eu
sudo chmod -R g+rwX /var/www/shaarli.rnmkcy.eu/{cache/,data/,pagecache/,tmp/}

nginx php-fpm

Installer si nécessaire nginx et php-fpm

1
sudo apt install nginx php-fpm

Extensions PHP nécessaires

Installer

1
sudo apt install php8.4-xml php8.4-common php8.4-gd php8.4-intl php8.4-curl php8.4-mbstring

Le fichier php fpm /etc/php/8.4/fpm/pool.d/shaarli.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[shaarli]

user = www-data
group = www-data

listen = /var/run/php/php8.4-fpm-shaarli.sock

listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

; Default Value: current directory or / when chroot
chdir = /var/www/shaarli.rnmkcy.eu

Modifier le fichier de configuration de virtualhost

1
sudo nano /etc/nginx/conf.d/shaarli.rnmkcy.eu.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
server {
    listen 80;
    listen [::]:80;
    server_name  shaarli.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://shaarli.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  shaarli.rnmkcy.eu;
    root         /var/www/shaarli.rnmkcy.eu;

    # log file locations
    # combined log format prepends the virtualhost/domain name to log entries
    access_log  /var/log/nginx/access.log combined;
    error_log   /var/log/nginx/error.log;

    include /etc/nginx/conf.d/ssl-modern.inc;
    #include snippets/authelia-location.conf; # Authelia auth endpoint

    # increase the maximum file upload size if needed: by default nginx limits file upload to 1MB (413 Entity Too Large error)
    client_max_body_size 100m;

    # relative path to shaarli from the root of the webserver
    # if shaarli is installed in a subdirectory of the main domain, edit the location accordingly
    location / {
        # default index file when no file URI is requested
        index index.php;
        try_files _ /index.php$is_args$args;
    }

    location ~ (index)\.php$ {
        try_files $uri =404;
        # slim API - split URL path into (script_filename, path_info)
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # pass PHP requests to PHP-FPM
        fastcgi_pass   unix:/var/run/php/php8.4-fpm-shaarli.sock;
        fastcgi_index  index.php;
        include        fastcgi.conf;
     #include snippets/authelia-authrequest.conf; # Protect this endpoint
    }

    location ~ /doc// {
        default_type "text/";
        try_files $uri $uri/ $uri/ =404;
    }

    location = /favicon.ico {
        # serve the Shaarli favicon from its custom location
        alias /var/www/shaarli/images/favicon.ico;
    }

    # allow client-side caching of static files
    location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$ {
        expires    max;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        # HTTP 1.0 compatibility
        add_header Pragma public;
    }
}

Vérifier

1
sudo nginx -t

Recharger les configurations php-fpm nginx

1
sudo systemctl reload php8.4-fpm nginx

Configurer Shaarli

Ouvrir le lien https://shaarli.rnmkcy.eu


Après avoir cliqué sur “Install” on arrive sur la page de connexion

Pour une utilisation avec Lldap(A VERIFIER)
IP_SRV_LLDAP=127.0.0.1
Si utilisation serveur LLDAP, ajouter les lignes suivantes au fichier /var/www/shaarli.rnmkcy.eu/data/config.json.php

1
2
3
4
    "ldap": {
        "host": "ldap://127.0.0.1:3890",
        "dn": "uid=%s,ou=people,dc=domain,dc=com"
    }

Linkwarden (link.home.arpa et link.rnmkcy.eu)

cwwk - Domaine link.home.arpa

Générer les certificats link.home.arpa

1
2
3
cd /home/yick/
./gencert.sh link.home.arpa
# Une passphrase est demandée (dans cle.txt)

A l’issue de cette commande des fichiers sont générés

1
2
3
4
├── link.home.arpa.crt
├── link.home.arpa.csr
├── link.home.arpa.ext
├── link.home.arpa.key

Copier les fichiers link.home.arpa.crt et link.home.arpa.key dans /etc/ssl/private/

1
sudo cp link.home.arpa.{crt,key} /etc/ssl/private/

Ajout à la configuration des accès réseaux locaux dans le fichier /etc/unbound/unbound.conf.d/local-unbound.conf

1
2
3
4
5
6
    # IPv4
    local-data: "link.home.arpa.  86400 IN A 192.168.0.205"

    # On ajoute les enregistrements PTR
    # PTR IPv4
    local-data-ptr: "192.168.0.205 86400 link.home.arpa."

Vérifications
Vérifier la configuration

1
sudo unbound-checkconf /etc/unbound/unbound.conf.d/local-unbound.conf

unbound-checkconf: no errors in /etc/unbound/unbound.conf.d/local-unbound.conf

Redémarrer Unbound

1
sudo systemctl restart unbound

on peut faire quelques tests

1
dig link.home.arpa

La configuration du proxy /etc/nginx/conf.d/link.home.arpa.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  link.home.arpa;

    ssl_certificate      /etc/ssl/private/link.home.arpa.crt;
    ssl_certificate_key  /etc/ssl/private/link.home.arpa.key;

   location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header X-Forwarded-Proto $scheme;

	 proxy_buffering off;
	 proxy_request_buffering off;
	 proxy_http_version 1.1;
	 proxy_intercept_errors on;
      
      proxy_pass http://192.168.10.215:3000;
   }

}

Vérifier

1
sudo nginx -t

Redémarrer le serveur

1
sudo systemctl reload nginx

Accessible par le lien https://link.home.arpa

cwwk - Domaine link.rnmkcy.eu
Lien publique: https://link.rnmkcy.eu

/etc/nginx/conf.d/link.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  link.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

   location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header X-Forwarded-Proto $scheme;

	 proxy_buffering off;
	 proxy_request_buffering off;
	 proxy_http_version 1.1;
	 proxy_intercept_errors on;
      
      proxy_pass http://192.168.10.215:3000;
   }

}

Gitea (gitea.rnmkcy.eu)

Gitea est une forge logicielle libre en Go sous licence MIT, pour l’hébergement de développement logiciel, basé sur le logiciel de gestion de versions Git pour la gestion du code source, comportant un système de suivi des bugs, un wiki, ainsi que des outils pour la relecture de code.

/etc/nginx/conf.d/gitea.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
    listen 80;
    listen [::]:80;
    server_name  gitea.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://gitea.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  gitea.rnmkcy.eu;
    client_max_body_size 100M;
    include /etc/nginx/conf.d/ssl-modern.inc;

  location / { 
      proxy_pass              http://127.0.0.1:3000;
  } 

}

Calibre web (calibre.rnmkcy.eu)

Les instructions pour une installation de calibre web

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo apt install python3-venv python3-dev 
sudo apt install build-essential libssl-dev libffi-dev 
sudo apt install libsasl2-dev libldap2-dev
# Création dossier puis un environnement virtuel pour calibre-web
sudo mkdir -p /sharenfs/rnmkcy/calibreweb
sudo chown $USER:$USER /sharenfs/rnmkcy/calibreweb
python3 -m venv /sharenfs/rnmkcy/calibreweb
# Activer l’environnement
source /sharenfs/rnmkcy/calibreweb/bin/activate
# nouveau prompt -> (calibreweb) yick@cwwk:~$ 
pip3 install --upgrade pip
pip3 install wheel
pip3 install cmake
pip3 install calibreweb
# ldap
pip3 install python-ldap
pip3 install Flask-SimpleLDAP

Utilisation fichier systemd pour le lancement automatique

1
sudo nano /etc/systemd/system/calibreweb.service

Contenu du fichier

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Service calibreweb
After=network.target

[Service]
Type=simple
User=yick
ExecStart=/sharenfs/rnmkcy/calibreweb/bin/cps

[Install]
WantedBy=multi-user.target

ATTENTION! , User est l’utilisateur connecté ($USER)

Recharger et activer le service calibreweb

1
2
sudo systemctl daemon-reload
sudo systemctl enable --now calibreweb

Vérifie

1
systemctl status calibreweb

proxy nginx

/etc/nginx/conf.d/calibre.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server {
    listen 80;
    listen [::]:80;
    server_name  calibre.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://calibre.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  calibre.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;
    #include snippets/authelia-location.conf; # Authelia auth endpoint

#  location / { 
#     proxy_pass              http://127.0.0.1:8083;
#     include snippets/authelia-authrequest.conf; # Protect this endpoint
#  } 
            location / { # Reduced to "/"
                proxy_pass              http://127.0.0.1:8083;
                proxy_set_header        Host            $http_host;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Scheme        $scheme;
                #include snippets/authelia-authrequest.conf; # Protect this endpoint
                # Removed proxy_set_header
        }

}

LLDAP…

Gpx studio (gpx.rnmkcy.eu)

Après la construction on copie le dossier build sous /var/www/gpx

1
2
3
sudo cp -r /sharenfs/rnmkcy/gpx.studio/website/build /var/www/gpx.studio
# les droits
sudo chown www-data:www-data -R /var/www/gpx.studio

Le site est accessible dans le dossier /sharenfs/rnmkcy/gpx.studio/website/build/ Configuration nginx /etc/nginx/conf.d/gpx.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name gpx.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;
    root /var/www/gpx.studio/;

    location / {
      index index/;
    }
}

Vérifier et recharger nginx

1
2
sudo nginx -t
sudo systemctl reload nginx

Accès par le lien https://gpx.rnmkcy.eu

Divers et tests (site.rnmkcy.eu)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name site.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;
    # Authelia
    include snippets/authelia-location.conf; # Authelia auth endpoint
    root /sharenfs/rnmkcy/site/;

    location / {
      index index/ index.php /_h5ai/public/index.php;
		  location ~ \.php(?:$|/) {
		    include fastcgi_params;
		    fastcgi_param SCRIPT_FILENAME $request_filename;
		    fastcgi_split_path_info ^(.+\.php)(/.+)$;
		    fastcgi_param HTTPS on;
		
		    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
		    fastcgi_param front_controller_active true;     # Enable pretty urls
		    fastcgi_param HTTP_ACCEPT_ENCODING "";          # Disable encoding of nextcloud response to in>
		    fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
		    fastcgi_intercept_errors on;
		    fastcgi_request_buffering off;
		  }
          # Authelia
	  include snippets/authelia-authrequest.conf; # Protect this endpoint
	}
}

Accès par le lien https://site.rnmkcy.eu

Outils IT-tools, Stirling PDF et PrivateBin

Ces 3 outils sont sur la machine virtuelle vm-alpine03

IT-Tools
https://tools.rnmkcy.eu
Fichier de configuration: /etc/nginx/conf.d/tools.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
    listen 80;
    listen [::]:80;
    server_name  tools.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://tools.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  tools.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

    location / {
	proxy_pass http://192.168.10.213:8080;
    }
}

Stirling PDF
https://pdf.rnmkcy.eu
Fichier de configuration: /etc/nginx/conf.d/pdf.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
    listen 80;
    listen [::]:80;
    server_name  pdf.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://pdf.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  pdf.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

    location / {
	proxy_pass http://192.168.10.213:8282;
    }
}

PrivateBin
https://privatebin.rnmkcy.eu
Fichier de configuration: /etc/nginx/conf.d/privatebin.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  privatebin.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

    gzip on;

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   Host $host;
        proxy_pass         http://192.168.10.213:8081;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
    }
}

Partage NFS

Partage Sans pseudo système de fichiers

1
2
sudo mkdir -p /sharenfs 
sudo chown $USER:$USER -R /sharenfs

NFS Serveur

Installation serveur NFSv4
Ouvrez le fichier /etc/exports à l’aide de la commande d’éditeur nano suivante.

1
sudo nano /etc/exports

Ajoutez les lignes suivantes au fichier.

1
2
3
/sharenfs 192.168.0.0/24(rw,no_root_squash,no_subtree_check)
/sharenfs 192.168.10.0/24(rw,no_root_squash,no_subtree_check)
/sharenfs 10.19.55.0/24(rw,no_root_squash,no_subtree_check)

Enregistrez et fermez le fichier lorsque vous avez terminé.

Vous trouverez ci-dessous quelques options NFS utilisées pour ce cas :

  • rw : autorise l’accès en lecture et en écriture pour le serveur et le client NFS au volume/répertoire.
  • no_subtree_check : désactive la vérification des sous-arbres, ce qui a de légères implications en matière de sécurité, mais peut améliorer la fiabilité dans certaines circonstances.
  • no_root_squash : désactive le squashing de la racine. Cette option est principalement utile pour les clients sans disque.
  • fsid=0 : pour NFSv4, si utilisé, ce paramètre est utilisé pour informer le serveur NFS que cette exportation est la racine de tous les systèmes de fichiers exportés.

Ensuite, exécutez la commande suivante pour redémarrer le service nfs-server et appliquer les modifications. Puis, vérifiez le serveur nfs pour vous assurer que le service est en cours d’exécution.

1
2
sudo systemctl restart nfs-server 
sudo systemctl status nfs-server

Enfin, exécutez la commande suivante pour vérifier le répertoire et le système de fichiers exportés sur le serveur NFS à l’aide de la commande suivante.

1
sudo showmount -e

Si tout se passe bien, vous devriez voir que le répertoire //sharenfs est exporté sur le serveur NFS.

1
2
Export list for cwwk:
/sharenfs 10.19.55.0/24,192.168.10.0/24,192.168.0.0/24

Créer des liens

1
2
3
ln -s /sharenfs $HOME/sharenfs
ln -s /sharenfs/scripts $HOME/scripts
sudo ln -s /sharenfs /mnt/sharenfs

NFS client

Installez le paquetage du client NFS

1
2
sudo apt install nfs-common # debian
sudo pacman -S nfs-utils    # archlinux

Créer dossier cible

1
sudo mkdir -p /mnt/cwwk

Montage manuel

1
sudo mount.nfs4 192.168.0.205:/sharenfs /mnt/cwwk

Démontage

1
sudo umount /mnt/cwwk

Montage /etc/fstab

1
2
# Serveur debian 12 cwwk 192.168.0.205
192.168.0.205:/sharenfs	/mnt/cwwk nfs4 nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10s,rsize=8192,wsize=8192 0 0

Rechargement et montage

1
2
sudo systemctl daemon-reload
sudo mount -a

Machines virtuelles

Machines virtuelles utilisées pour gérer les applications:

  • Collabora (Collabora 192.168.100.40 vm-debian12)
  • ttrss (Flux RSS ttrss 192.168.100.60 alpine-vm)
  • ntfy (Notification ntfy 192.168.100.50 vm-ntfy)
  • Searx (SearXNG 192.168.100.70 alpine-searx)
  • Audio Navidrome (Navidrome vm-alpine01 192.168.10.210)

Collabora Online (bora.rnmkcy.eu)

Installer collabora serveur sur une machine virtuelle debian 12

Proxy nginx /etc/nginx/conf.d/bora.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
server {
    listen 80;
    listen [::]:80;
    server_name  bora.rnmkcy.eu;

  # redirect all plain HTTP requests to HTTPS
  return 301 https://bora.rnmkcy.eu$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name bora.rnmkcy.eu;

    # Sécurité + https
    include /etc/nginx/conf.d/ssl-modern.inc;

    error_log /var/log/nginx/bora.error;

    # static files
    location ^~ /browser {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Host $http_host;
    }

    # WOPI discovery URL
    location ^~ /hosting/discovery {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Host $http_host;
    }

    # Capabilities
    location ^~ /hosting/capabilities {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Host $http_host;
    }

    # main websocket
    location ~ ^/cool/(.*)/ws$ {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $http_host;
    proxy_read_timeout 36000s;
    }

    # download, presentation and image upload
    location ~ ^/(c|l)ool {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Host $http_host;
    }

    # Admin Console websocket
    location ^~ /cool/adminws {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $http_host;
    proxy_read_timeout 36000s;
    }
}

Notifications (noti.rnmkcy.eu)


Ntfy, qui se prononce “notify”, est un service de notification ultra léger, permettant d’envoyer des messages vers un smartphone ou un ordinateur via de simples scripts, sans besoin de compte et totalement gratuitement !
cwwk KVM - Service de notification ntfy (Alpine Linux vm-ntfy)

Proxy nginx noti.rnmkcy.eu

Sur le serveur cwwk rnmkcy.eu, créer un proxy /etc/nginx/conf.d/noti.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
server {
    listen 80;
    listen [::]:80;
    server_name  noti.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://noti.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  noti.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

  location / { 
    proxy_pass              http://192.168.100.50:8080;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 3m;
    proxy_send_timeout 3m;
    proxy_read_timeout 3m;

    client_max_body_size 0; # Stream request body to backend
  } 

}

Recharger nginx

1
sudo systemctl reload nginx

Connexion depuis un navigateur https://noti.rnmkcy.eu

Envoi de notifications depuis le serveur cwwk avec curl en ligne de commande

1
curl -d "Backup successful 😀" https://noti.rnmkcy.eu/yan_infos

Flux Tiny Tiny RSS (rss.rnmkcy.eu)


cwwk KVM - Alpine Linux Tiny Tiny RSS (ttrss alpine-vm)

Fichier de configuration nginx

1
/etc/nginx/conf.d/rss.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
    listen 80;
    listen [::]:80;
    server_name  rss.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://rss.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  rss.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

   location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header X-Forwarded-Proto $scheme;
      
      proxy_pass http://192.168.100.60:8280/;
      break;
   }

}

Moteur de recherche (searx.rnmkcy.eu)

Le projet n’est plus maintenu


cwwk KVM - SearXNG Alpine Linux (alpine-searx)

Fichier de configuration nginx

1
/etc/nginx/conf.d/searx.rnmkcy.eu.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
    listen 80;
    listen [::]:80;
    server_name  searx.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://searx.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  searx.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

    location / {
	proxy_pass http://192.168.100.70:8080;
    }
}

Audio Navidrome (audio.rnmkcy.eu)

cwwk KVM Alpine Linux Navidrome (vm-alpine01)

Serveur Navidrome accessible ip 192.168.10.201 port 4533

Le fichier proxy nginx /etc/nginx/conf.d/audio.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
    listen 80;
    listen [::]:80;
    server_name  audio.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://audio.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  audio.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

    # Proxy audio navidrome server
    location / {
      proxy_pass          http://192.168.10.210:4533;
    }

}

Traduction LibreTranslate


https://github.com/LibreTranslate/LibreTranslate

VM debian 13 vmtrix02
IP: 192.168.10.221

Vous pouvez également exécuter l’application avec docker. Tout d’abord cloner le dépôt:

1
2
git clone https://github.com/LibreTranslate/LibreTranslate
cd LibreTranslate

Test, sous Linux/macOS, exécutez ./run.sh [args]

1
./run.sh --port 5000 --load-only en,fr

Puis ouvrez un navigateur Web à http://localhost:5000

1
ssh -L 9500:127.0.0.1:5000 userx@192.168.10.221 -p 55221 -i /home/yann/.ssh/vm-debian13-02

Déploiement avec docker compose
https://deepwiki.com/LibreTranslate/LibreTranslate/3.1-docker-deployment

$HOME:LibreTranslate/docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
services:
  libretranslate:
    container_name: libretranslate
    image: libretranslate/libretranslate:latest
    environment:
      - LT_LOAD_ONLY=en,fr
      - LT_PORT=5000
    ports:
      - "5000:5000"
    restart: unless-stopped
    healthcheck:
      test: ['CMD-SHELL', './venv/bin/python scripts/healthcheck.py']
      interval: 10s
      timeout: 4s
      retries: 4
      start_period: 5s

Exécuter

1
docker compose up -d

traduction.rnmkcy.eu

Proxy nginx
Le fichier de configuration nginx /etc/nginx/conf.d/traduction.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
server {
  listen 80;
  server_name traduction.rnmkcy.eu;
  return 301 https://$server_name$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl;
    server_name  traduction.rnmkcy.eu;

    include /etc/nginx/conf.d/ssl-modern.inc;

  # GZIP Section
  gzip on;
  gzip_disable "msie6";

  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_min_length 256;
  gzip_types text/xml text/javascript font/ttf font/eot font/otf application/x-javascript application/atom+xml application/javascript application/json application/manifest+json application/rss+xml application/x-web-app-manifest+json application/xhtml+xml application/xml image/svg+xml image/x-icon text/css text/plain;

  location / { 
      proxy_pass              http://192.168.10.221:5000;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      client_max_body_size 0;
  } 

}

Vérifier nginx

1
sudo nginx -t

Redémarrer nginx

1
sudo systemctl reload nginx

Lien https://traduction.rnmkcy.eu

traduction.home.arpa

Après avoir créé le domaine les certificats du domaine

Proxy nginx
Le fichier de configuration nginx /etc/nginx/conf.d/traduction.home.arpa.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server {
    # ipv4 listening port/protocol
    listen       443 ssl;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl;
    server_name  traduction.home.arpa;

    ssl_certificate      /etc/ssl/private/traduction.home.arpa.crt;
    ssl_certificate_key  /etc/ssl/private/traduction.home.arpa.key;


  # GZIP Section
  gzip on;
  gzip_disable "msie6";

  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_min_length 256;
  gzip_types text/xml text/javascript font/ttf font/eot font/otf application/x-javascript application/atom+xml application/javascript application/json application/manifest+json application/rss+xml application/x-web-app-manifest+json application/xhtml+xml application/xml image/svg+xml image/x-icon text/css text/plain;

  location / { 
      proxy_pass              http://192.168.10.221:5000;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      client_max_body_size 0;
  } 

}

Cockpit Admin gestion serveurs (NON INSTALLE)

Cockpit est une interface d’administration de serveur interactive. Il est facile à utiliser et très léger. Il interagit directement avec le système d’exploitation depuis une vraie session Linux dans un navigateur.

Cockpit, installation, …
Résumé des instructions

1
2
sudo apt update && sudo apt install cockpit cockpit-machines
#sudo usermod -aG sudo $USER

Proxy cat /etc/nginx/conf.d/cockpit.home.arpa.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
server {
    listen       443 ssl;
    listen       [::]:443 ssl;
    server_name  cockpit.home.arpa;

    ssl_certificate      /etc/ssl/private/cockpit.home.arpa.crt;
    ssl_certificate_key  /etc/ssl/private/cockpit.home.arpa.key;

    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_prefer_server_ciphers off;

    # Ajouts 2025
    more_set_headers "Strict-Transport-Security : max-age=63072000; includeSubDomains; preload";
    more_set_headers "Referrer-Policy: no-referrer";
    more_set_headers "X-Content-Type-Options: nosniff";
    more_set_headers "X-Download-Options: noopen";
    more_set_headers "X-Frame-Options: SAMEORIGIN";
    more_set_headers "X-Permitted-Cross-Domain-Policies: none";
    more_set_headers "X-Robots-Tag: noindex, nofollow";
    more_set_headers "X-XSS-Protection: 1; mode=block";
    # Fin ajouts 2025

    # OCSP stapling
    # Ending OCSP Support in 2025
    #ssl_stapling on;
    #ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    #ssl_trusted_certificate /etc/ssl/private/rnmkcy.eu-fullchain.pem;

    # replace with the IP address of your resolver
    resolver 192.168.0.205 valid=300s;
    resolver_timeout 5s;

    #include snippets/authelia-location.conf; # Authelia auth endpoint

    location / {
        # Required to proxy the connection to Cockpit
        proxy_pass https://192.168.0.205:9090;
        #include snippets/authelia-authrequest.conf; # Protect this endpoint
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Required for web sockets to function
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Pass ETag header from Cockpit to clients.
        # See: https://github.com/cockpit-project/cockpit/issues/5239
        gzip off;
    }

}

Gestion cockpit des machines externes via SSH

Pour gérer les machines externes, il faut générer des clés SSH car la communication cockpit se fait via SSH

Liste de machines externes

  • PC1 Bureau EndeavourOS
  • e6230 DELL EndeavourOS
  • xoyaz.xyz Debian
  • xoyize.xyz Debian
  • iceyan.xyz debian

Se rendre dans le dossier $HOME de la machine cwwk

Générer les clés privées/publiques SSH

1
2
3
4
5
6
7
8
9
10
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/pc1-ed25519
chmod 600 ~/.ssh/pc1-ed25519
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/e6230-ed25519
chmod 600 ~/.ssh/e6230-ed25519
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/xoyaz.xyz-ed25519
chmod 600 ~/.ssh/xoyaz.xyz-ed25519
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/xoyize.xyz-ed25519
chmod 600 ~/.ssh/xoyize.xyz-ed25519
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/iceyan.xyz-ed25519
chmod 600 ~/.ssh/iceyan.xyz-ed25519

La clé publique (.pub) sera ajoutée au fichier authorized_keys de la machine correspondante

La connexion SSH est du type

1
2
ssh Utilisateur@<Adresse IP ou Domaine> -p N°_Port -i Clef
# Par défaut le chemin pour "Clef" est $HOME/.ssh/

Le fichier ~/.ssh.ssh_servers

1
2
3
4
5
6
Alias;Utilisateur;Adresse IP ou Domaine;Port;Clef;Opt;Chemin Local;Chemin Distant
iceyan;iceyan;185.112.146.46;55046;iceyan.xyz-ed25519;;;Y;;4
xoyaz;yani;37.60.230.30;55030;xoyaz.xyz-ed25519;;;Y;;4
xoyize;xouser;158.220.91.148;55148;xoyize.xyz-ed25519;;;Y;;4
pc1;yann;192.168.0.20;22;pc1-ed25519;;;Y;;4
e6230w;yano;192.168.10.90;56230;e6230-ed25519;;;Y;;4

.bashrc et alias

Dans le fichier .bashrc, on se réfère au fichier nommé ~/.bash_aliases pour les alias

~/.bash_aliases

1
2
3
4
alias borglist='$HOME/scripts/borglist.sh'
alias etat='$HOME/scripts/etat_des_lieux_cwwk.sh > /sharenfs/rnmkcy/site/etat_cwwk.txt'
alias sshm='$HOME/scripts/ssh-manager.sh'
alias nmapl='echo "sudo nmap -T4 -sP 192.168.70.0/24" && sudo nmap -T4 -sP 192.168.70.0/24'

Après ajout ou suppression alias, ne pas oublier la commande source ~/.bash_aliases

Sauvegardes

BorgBackup Installation

1
sudo apt install borgbackup

BorgBackup dépôt cwwk

Création dépôt dans la boîte de stockage (repository)

Dépôt distant à travers SSH

1
ssh://u326239@u326239.your-storagebox.de:23/./backup/borg/cwwk

Copier la clé privée, en mode root

1
2
3
4
mkdir -p /root/.ssh
cp /sharenfs/pc1/.borg/cwwk.borgssh /root/.ssh/id_borg_ed25519
chown root:root /root/.ssh/id_borg_ed25519
chmod 400  /root/.ssh/id_borg_ed25519

Phrase forte: /sharenfs/pc1/.borg/cwwk.passphrase

Initialisation dépôt distant cwwk en mode su

1
2
3
4
export BORG_PASSPHRASE="$(cat /sharenfs/pc1/.borg/cwwk.passphrase)"
export BORG_RSH='ssh -i /root/.ssh/id_borg_ed25519'
BORG_REPOSITORY=ssh://u326239@u326239.your-storagebox.de:23/./backup/borg/cwwk
borg init --encryption=repokey $BORG_REPOSITORY

Le fichier d’exclusion /sharenfs/pc1/.borg/cwwk.exclusions En mode utilisateur

Créer un script de sauvegarde (notez l’usage de borg prune pour supprimer les archives trop anciennes)

1
sudo nano /sharenfs/scripts/borgbackup-cwwk.sh 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/sh
#
# Script de sauvegarde.
#
# Envoie les sauvegardes sur un serveur distant, via le programme Borg.
# Les sauvegardes sont chiffrées
t=$(date +%s)
export BORG_PASSPHRASE=`cat /sharenfs/pc1/.borg/cwwk.passphrase`
export BORG_RSH='ssh -i /root/.ssh/id_borg_ed25519'
BACKUP_DATE=`date +%Y-%m-%d-%Hh%M`
BORG_REPOSITORY=`cat /sharenfs/pc1/.borg/cwwk.repository`
borg create -v --progress --stats --exclude-from /sharenfs/pc1/.borg/cwwk.exclusions ${BORG_REPOSITORY}::${BACKUP_DATE} /
borg prune -v --list --stats --keep-daily=7 --keep-weekly=4 --keep-monthly=6 $BORG_REPOSITORY
d=$(($(date +%s) - $t))
DUREE=$(($d / 3600 ))h$((($d % 3600) / 60))m$(($d % 60))s
# Message
curl \
-H "X-Email: ntfy@cinay.eu" \
-H "Title: 💾 $HOSTNAME : Borgbackup CWWK en $DUREE" \
-H "Authorization: Bearer tk_.............................zr" \
-H prio:low \
-d "CWWK Debian 13
`hostname -I`
 ✔️ Fin de la sauvegarde Borgbackup `date +%d/%m/%Y-%Hh%M`" \
https://noti.rnmkcy.eu/yan_infos

Le rendre exécutable

1
chmod +x /sharenfs/scripts/borgbackup-cwwk.sh 

Planification de la sauvegarde en utilisant systemd timer

Le service /etc/systemd/system/borgbackup-cwwk.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=Service borgbackup-cwwk

[Service]
Type=oneshot
ExecStart=/usr/bin/bash /sharenfs/scripts/borgbackup-cwwk.sh

[Install]
WantedBy=multi-user.target

Le timer /etc/systemd/system/borgbackup-cwwk.timer

1
2
3
4
5
6
7
8
9
[Unit]
Description=Timer borgbackup-cwwk

[Timer]
OnCalendar=*-*-* 02:40
Persistent=true

[Install]
WantedBy=timers.target

Exécution tous les jours

Activez/démarrez le timer, puis vérifiez qu’il est chargé et actif

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable borgbackup-cwwk.timer --now
systemctl status borgbackup-cwwk.timer

Vérifiez s’il apparaît dans la liste des minuteries :

1
systemctl list-timers
1
2
NEXT                             LEFT LAST                              PASSED UNIT                         ACTIVATES                     
Sat 2025-11-01 02:50:00 CET       11h -                                      - borgbackup-cwwk.timer        borgbackup-cwwk.service

Lorsque vous voulez voir si les sauvegardes se sont déroulées correctement, vous pouvez consulter le journal le plus récent

1
systemctl status borgbackup-cwwk

Ou afficher tous les journaux avec :

1
sudo journalctl -u borgbackup-cwwk

BorgBackup dépôt sharenfs

Création dépôt dans la boîte de stockage (repository)

Dépôt distant à travers SSH

1
ssh://u326239@u326239.your-storagebox.de:23/./backup/borg/sharenfs

Copier la clé privée, en mode root

1
2
3
4
mkdir -p /root/.ssh
cp /sharenfs/pc1/.borg/sharenfs.borgssh /root/.ssh/id_borg_ed25519
chown root:root /root/.ssh/id_borg_ed25519
chmod 400  /root/.ssh/id_borg_ed25519

Phrase forte: /sharenfs/pc1/.borg/sharenfs.passphrase

Initialisation dépôt distant sharenfs en mode su

1
2
3
4
export BORG_PASSPHRASE="$(cat /sharenfs/pc1/.borg/sharenfs.passphrase)"
export BORG_RSH='ssh -i /root/.ssh/id_borg_ed25519'
BORG_REPOSITORY=ssh://u326239@u326239.your-storagebox.de:23/./backup/borg/sharenfs
borg init --encryption=repokey $BORG_REPOSITORY

Le fichier d’exclusion /sharenfs/pc1/.borg/sharenfs.exclusions En mode utilisateur

Créer un script de sauvegarde (notez l’usage de borg prune pour supprimer les archives trop anciennes)

1
sudo nano /sharenfs/scripts/borgbackup-sharenfs.sh 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/sh
#
# Script de sauvegarde.
#
# Envoie les sauvegardes sur un serveur distant, via le programme Borg.
# Les sauvegardes sont chiffrées
t=$(date +%s) 
export BORG_PASSPHRASE=`cat /sharenfs/pc1/.borg/sharenfs.passphrase`
export BORG_RSH='ssh -i /root/.ssh/id_borg_ed25519'
BACKUP_DATE=`date +%Y-%m-%d-%Hh%M`
BORG_REPOSITORY=`cat /sharenfs/pc1/.borg/sharenfs.repository`
borg create -v --progress --stats --exclude-from /sharenfs/pc1/.borg/sharenfs.exclusions ${BORG_REPOSITORY}::${BACKUP_DATE} /sharenfs
borg prune -v --list --stats --keep-daily=7 --keep-weekly=4 --keep-monthly=6 $BORG_REPOSITORY
d=$(($(date +%s) - $t))
DUREE=$(($d / 3600 ))h$((($d % 3600) / 60))m$(($d % 60))s
# Message
curl \
-H "X-Email: ntfy@cinay.eu" \
-H "Title: 💾 $HOSTNAME : Borgbackup sharenfs en $DUREE" \
-H "Authorization: Bearer tk_.....................zr" \
-H prio:low \
-d "Sharenfs Debian 13
`hostname -I`
 ✔️ Fin de la sauvegarde Borgbackup `date +%d/%m/%Y-%Hh%M`" \
https://noti.rnmkcy.eu/yan_infos

Le rendre exécutable

1
chmod +x /sharenfs/scripts/borgbackup-sharenfs.sh 

Planification de la sauvegarde en utilisant systemd timer

Le service /etc/systemd/system/borgbackup-sharenfs.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=Service borgbackup-sharenfs

[Service]
Type=oneshot
ExecStart=/usr/bin/bash /sharenfs/scripts/borgbackup-sharenfs.sh

[Install]
WantedBy=multi-user.target

Le timer /etc/systemd/system/borgbackup-sharenfs.timer

1
2
3
4
5
6
7
8
9
[Unit]
Description=Timer borgbackup-sharenfs

[Timer]
OnCalendar=*-*-* 02:50
Persistent=true

[Install]
WantedBy=timers.target

Exécution tous les jours

Activez/démarrez le timer, puis vérifiez qu’il est chargé et actif

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable borgbackup-sharenfs.timer --now
systemctl status borgbackup-sharenfs.timer

Vérifiez s’il apparaît dans la liste des minuteries :

1
systemctl list-timers
1
2
NEXT                             LEFT LAST                              PASSED UNIT                         ACTIVATES                     
Sat 2025-11-01 02:50:00 CET       11h -                                      - borgbackup-sharenfs.timer        borgbackup-sharenfs.service

Lorsque vous voulez voir si les sauvegardes se sont déroulées correctement, vous pouvez consulter le journal le plus récent

1
systemctl status borgbackup-sharenfs

Ou afficher tous les journaux avec :

1
sudo journalctl -u borgbackup-sharenfs

Synchronisation des backup borg

Synchronisation des backup borg entre le serveur de stockage (storage box) et le disque USB partagé monté sur la freebox en utilisant systemd timer.

Le script à exécuter en mode su /sharenfs/scripts/synchro-backup.sh

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

# Synchro BX11 --> FreeUSB2To
servers=$(cat /sharenfs/pc1/.borg/servers.list)
#servers="pc1 media iceyan.xyz e6230 cwwk asus-xh51 xoyize.xyz"
 hote_array=(${servers// / })
 for hote in "${hote_array[@]}"
 do
  rsync -avz --delete --rsync-path='rsync' -e 'ssh -p 23 -i /root/.ssh/id_borg_ed25519' u326239@u326239.your-storagebox.de:backup/borg/$hote /mnt/FreeUSB2To/sauvegardes/borgbackup/
 done

Script exécutable

1
chmod +x /sharenfs/scripts/synchro-backup.sh

Le service /etc/systemd/system/storage-freedisk.service

1
2
3
4
5
6
[Unit]
Description=Rsync storagebox vers FreeUSB2To

[Service]
Type=oneshot
ExecStart=/usr/bin/bash /sharenfs/scripts/synchro-backup.sh

Le timer /etc/systemd/system/storage-freedisk.timer

1
2
3
4
5
6
7
8
9
[Unit]
Description=Rsync storagebox vers FreeUSB2To

[Timer]
OnCalendar=*-*-* 04:25
Persistent=true

[Install]
WantedBy=timers.target

Exécution tous les jours à 4h25 du matin

Activez/démarrez le timer, puis vérifiez qu’il est chargé et actif

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable storage-freedisk.timer --now
systemctl status storage-freedisk.timer

Vérifiez qu’il a été démarré en vérifiant s’il apparaît dans la liste des minuteries :

1
systemctl list-timers
1
2
NEXT                        LEFT          LAST                        PASSED       UNIT                         ACTIVATES                     
Mon 2024-12-16 04:25:00 CET 20h left      -                           -            storage-freedisk.timer       storage-freedisk.service

Compactage des backup borg

Compacter les backup borg pour récupérer du stockage

Le script à exécuter en mode su /sharenfs/scripts/borg-compact.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

# compactage des dépôts borg distants
servers=$(cat /sharenfs/pc1/.borg/servers.list)
#servers="pc1 media iceyan.xyz e6230 cwwk asus-xh51 xoyize.xyz"
 hote_array=(${servers// / })
 for hote in "${hote_array[@]}"
 do
  export BORG_RSH='ssh -i /sharenfs/pc1/.borg/'$hote'.borgssh'
  export BORG_PASSPHRASE=$(cat /sharenfs/pc1/.borg/$hote.passphrase)
  export BORG_DEPOT=$(cat /sharenfs/pc1/.borg/$hote.repository)
  echo $BORG_DEPOT
  borg compact --progress  $BORG_DEPOT
 done
# Message
curl \
-H "X-Email: ntfy@cinay.eu" \
-H "Title: 💾​ Compactage dépôts BorgBackup" \
-H "Authorization: Bearer tk_xxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H prio:low \
-d "CWWK Debian 12
`hostname -I`
🟢​ Fin compactage des dépôts distants BorgBackup" \
https://noti.rnmkcy.eu/yan_infos

Script exécutable

1
chmod +x /sharenfs/scripts/borg-compact.sh

Le service /etc/systemd/system/borg-compact.service

1
2
3
4
5
6
[Unit]
Description=Rsync storagebox vers FreeUSB2To

[Service]
Type=oneshot
ExecStart=/usr/bin/bash /sharenfs/scripts/borg-compact.sh

Le timer /etc/systemd/system/borg-compact.timer

1
2
3
4
5
6
7
8
9
[Unit]
Description=Compactage des dépôts borg

[Timer]
OnCalendar=*-*-01 00:00:00
Persistent=true

[Install]
WantedBy=timers.target

Exécution tous les mois

Activez/démarrez le timer, puis vérifiez qu’il est chargé et actif

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable borg-compact.timer --now
systemctl status borg-compact.timer

Vérifiez qu’il a été démarré en vérifiant s’il apparaît dans la liste des minuteries :

1
systemctl list-timers

Domaine local home.arpa + Certificats Internes

Le domaine de deuxième niveau home.arpa a été réservé pour une utilisation dans les réseaux résidentiels (RFC 8375), bon choix pour un nom de domaine lors de la mise en place d’un réseau interne.
Domaine home.arpa

Gérer un domaine local avec Unbound

Gérer un domaine local avec Unbound, créer un domaine local, pour le réseau privé, ce qui est bien plus pratique que de retenir des IPs ou maintenir un fichier hosts sur les machines où l’on y a accès

Configuration des accès réseaux locaux dans le fichier /etc/unbound/unbound.conf.d/cwwk-unbound.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
server:
    # ne rien enregistrer dans les journaux hormis les erreurs
    verbosity: 0
    
    # n'écouter que sur l'interface locale en IPv4
    # unbound nécessite d'être relancé si modifié
     interface: enp3s0
    
    access-control: 192.168.0.0/16 allow
    access-control: 192.168.10.0/16 allow
    access-control: 127.0.0.0/8 allow

    do-ip6: no
    #access-control: 2a01:e0a:9c8:2080::/48 allow

    # par défaut, unbound ne log pas les requêtes ni les réponses
    # on peut le rappeler au cas où
    log-queries: no
    log-replies: no

    # imposer la QNAME minimisation (RFC 7816)
    # Pour mieux protéger la vie privée
    qname-minimisation: yes
    # même si le serveur faisant autorité ne le veut pas
    #   après discussion, il est possible que cette option ne soit
    #   pas recommandée dans le cadre d'un résolveur ouvert
    qname-minimisation-strict: yes
    
    ###########################################################################
    # PERFORMANCE SETTINGS
    ###########################################################################
    # https://nlnetlabs.nl/documentation/unbound/howto-optimise/

    # Number of slabs in the infrastructure cache. Slabs reduce lock contention
    # by threads. Must be set to a power of 2.
    infra-cache-slabs: 4

    # Number of slabs in the key cache. Slabs reduce lock contention by
    # threads. Must be set to a power of 2. Setting (close) to the number
    # of cpus is a reasonable guess.
    key-cache-slabs: 4

    # Number  of  bytes  size  of  the  message  cache.
    # Unbound recommendation is to Use roughly twice as much rrset cache memory
    # as you use msg cache memory.
    msg-cache-size: 128525653

    # Number of slabs in the message cache. Slabs reduce lock contention by
    # threads. Must be set to a power of 2. Setting (close) to the number of
    # cpus is a reasonable guess.
    msg-cache-slabs: 4

    # The number of queries that every thread will service simultaneously. If
    # more queries arrive that need servicing, and no queries can be jostled
    # out (see jostle-timeout), then the queries are dropped.
    # This is best set at half the number of the outgoing-range.
    # This Unbound instance was compiled with libevent so it can efficiently
    # use more than 1024 file descriptors.
    num-queries-per-thread: 4096

    # The number of threads to create to serve clients.
    # This is set dynamically at run time to effectively use available CPUs
    # resources
    num-threads: 3

    # Number of ports to open. This number of file descriptors can be opened
    # per thread.
    # This Unbound instance was compiled with libevent so it can efficiently
    # use more than 1024 file descriptors.
    outgoing-range: 8192

    # Number of bytes size of the RRset cache.
    # Use roughly twice as much rrset cache memory as msg cache memory
    rrset-cache-size: 257051306

    # Number of slabs in the RRset cache. Slabs reduce lock contention by
    # threads. Must be set to a power of 2.
    rrset-cache-slabs: 4

    # Do no insert authority/additional sections into response messages when
    # those sections are not required. This reduces response size
    # significantly, and may avoid TCP fallback for some responses. This may
    # cause a slight speedup.
    minimal-responses: yes

    # # Fetch the DNSKEYs earlier in the validation process, when a DS record
    # is encountered. This lowers the latency of requests at the expense of
    # little more CPU usage.
    prefetch: no

    # Fetch the DNSKEYs earlier in the validation process, when a DS record is
    # encountered. This lowers the latency of requests at the expense of little
    # more CPU usage.
    prefetch-key: yes

    # Have unbound attempt to serve old responses from cache with a TTL of 0 in
    # the response without waiting for the actual resolution to finish. The
    # actual resolution answer ends up in the cache later on.
    serve-expired: no

    # Open dedicated listening sockets for incoming queries for each thread and
    # try to set the SO_REUSEPORT socket option on each socket. May distribute
    # incoming queries to threads more evenly.
    so-reuseport: yes

Vérifier la configuration

1
sudo unbound-checkconf /etc/unbound/unbound.conf.d/cwwk-unbound.conf

Une fois tout configuré et Unbound relancé

1
systemctl restart unbound

on peut faire quelques tests

1
dig cwwk.home.arpa

1
dig -x 192.168.0.205

Autorité de Certification interne et Certificats Clients

Openssl - Création d’une Autorité de Certification interne et de Certificats Clients

Nebula

IP Privée: 10.19.55.4

Pour autoriser les accès au serveu NFS sur le réseau 10.19.55.0/24, il faut ouvrir les ports entrants du firewall nebula

Résumé

1
2
3
4
5
6
7
8
mkdir -p /etc/nebula
mv config-server-nfs.yaml /etc/nebula/config.yaml
mv ca.crt /etc/nebula/ca.crt
mv cwwk.crt /etc/nebula/host.crt
mv cwwk.key /etc/nebula/host.key
chmod +x nebula
mv nebula /usr/local/bin/
nebula -config /etc/nebula/config.yaml

Dans le fichier /etc/nebula/config.yaml, dans la zone firewall: , inbound: , remplacer proto: icmp par proto: any et relancer le service nebula; sudo systemctl restart nebula

Maintenance

Ajout point de montage NFS

Serveur NFS

Ajouter le dossier /srv/private
Configurer le partage NFS du dossier /srv/private dans le fichier /etc/exports
Ce fichier contient les paramètres de configuration des partages NFS sur le système serveur.

1
/srv/private 192.168.0.0/24(rw,no_root_squash,no_subtree_check)

Exporter le partage

1
sudo exportfs -a 

Montage partage NFS sur machine cliente

Une fois que nous avons terminé la configuration sur le système serveur, nous pouvons accéder au partage NFS à partir du système client.

Créez un répertoire où vous souhaitez monter le répertoire partagé.

1
sudo mkdir /mnt/private 

Configurer le système pour monter automatiquement le partage au démarrage
Modifier le fichier /etc/fstab

1
sudo nano /etc/fstab 

Ajouter la ligne suivante à la fin du fichier:

1
192.168.0.205:/srv/private	/mnt/private nfs4 nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10s,rsize=8192,wsize=8192,retry=0 0 0

Rechargement et montage

1
2
sudo systemctl daemon-reload
sudo mount -a

Ajout volume logique LVM ‘private’

Création volume logique 150Go pour les données privées

On utilise le volume physique nvmea-vg

1
lvcreate -L 150G -n private nvmea-vg

Format de la partition

1
mkfs.ext4 /dev/mapper/nvmea--vg-private

UUID de la partition : blkid | grep "/dev/mapper/nvmea--vg-private"

1
/dev/mapper/nvmea--vg-private: UUID="0d081c20-6b1d-461c-bc0e-a469e24e546d" BLOCK_SIZE="4096" TYPE="ext4"

Création point de montage /srv/private

1
mkdir -p /srv/private

ajout ligne au fichier /etc/fstab

1
2
# /dev/mapper/nvmea--vg-private
UUID=0d081c20-6b1d-461c-bc0e-a469e24e546d /srv/private   ext4    defaults        0       2

Montage

1
2
systemctl daemon-reload
mount -a

Droits utilisateur ID=1000

1
chown 1000:1000 -R /srv/private

Ajout partage NFS ‘proxmox’

Ajout volume logique LVM ‘proxmox’

En mode su

Création volume logique 100Go pour les sauvegardes proxmox

On utilise le volume physique nvmea-vg

1
lvcreate -L 100G -n proxmox nvmea-vg

Format de la partition

1
mkfs.ext4 /dev/mapper/nvmea--vg-proxmox

UUID de la partition : blkid | grep "/dev/mapper/nvmea--vg-proxmox"

1
/dev/mapper/nvmea--vg-proxmox: UUID="e6ebb82b-ffdb-43af-be92-a359886bd7bd" BLOCK_SIZE="4096" TYPE="ext4"

Création point de montage /srv/proxmox

1
mkdir -p /srv/proxmox

ajout ligne au fichier /etc/fstab

1
2
# /dev/mapper/nvmea--vg-proxmox
UUID=e6ebb82b-ffdb-43af-be92-a359886bd7bd /srv/proxmox   ext4    defaults        0       2

Montage

1
2
systemctl daemon-reload
mount -a

Droits utilisateur ID=1000

1
chown 1000:1000 -R /srv/proxmox

Ajout partage NFS

Ajouter la ligne suivante au fichier /etc/exports

1
/srv/proxmox 192.168.0.0/24(rw,no_root_squash,no_subtree_check)

Réactualiser les partages NFS

1
exportfs -ra

Vérifier

1
2
3
showmount -e |grep 'proxmox'
# renvoie
/srv/proxmox        192.168.0.0/24

Connexion BOX hetzner

Crér un jeu de clés

1
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/cwwk_bx11_plakar

Ajout clé publique: cat ~/.ssh/cwwk_bx11_plakar.pub au fichier /home/.ssh/authorized_keys de la boite BX1

1
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBqtUtZFA8uOHZve309r1pjGtKnkBB5hQfUNH9rTm88P yick@cwwk

Tester la connexion pour valider la clé

1
sftp -P 23 -i ~/.ssh/cwwk_bx11_plakar u326239@u326239.your-storagebox.de

Mises à jour automatiques sur debian

Mises à jour automatiques sur Debian

Disque externe USB3 NVME 2To

Connecter le disque externe USB3 NVME sur un port de la machine cwwk

Relever le mappage des disques : lsblk

1
2
NAME                   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                      8:0    0   1,8T  0 disk 

Le disque NVME de 1.8T est sur /dev/sda

Zapper le disque,

(Attention Ceci effacera de manière irréversible toutes les données de votre disque, veuillez sauvegarder toutes les données importantes) :

1
sgdisk --zap-all /dev/sda

On partitionne un disque en 2 avec gdisk

  • Partition 1 : 1024M EFI (code ef00) système de fichier FAT32
  • Partition restante Linux (code 8300) système de fichier EXT4

Créer une table de partition GPT à l’aide de la commande sgdisk :

1
sgdisk --clear --new=1:0:+1024MiB --typecode=1:ef00 --new=2:0:0 --typecode=2:8300 /dev/sda

Format des partitions

1
2
3
4
# EFI FAT32
mkfs.fat -F32 /dev/sda1 
# EXT4
mkfs.ext4 /dev/sda2

Montage auto disque externe USB3 NVME

How to Automount USB Devices

Disque USB NVME connecté sur un port USB3

Identifié le disque: lsblk

1
2
3
4
NAME                   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                      8:0    0   1,8T  0 disk 
├─sda1                   8:1    0     1G  0 part 
└─sda2                   8:2    0   1,8T  0 part 

Dans notre cas /dev/sda2
Son UUID: sudo blkid |grep '/dev/sda2'

1
/dev/sda2: UUID="d58a4656-bb6c-4750-8fbb-e5e356c353a0" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3d0c8a43-270a-466e-8156-f93fb796b7ad"

Créer un point de montage

1
sudo mkdir -p /mnt/usbnvme  

Montage /etc/fstab

1
2
# USB3 NVME 2To
UUID=d58a4656-bb6c-4750-8fbb-e5e356c353a0 /mnt/usbnvme auto defaults,nofail,x-systemd.automount 0 2

Recharger la configuration et le montage

1
2
sudo systemctl daemon-reload 
sudo mount -a

Disque externe USB3 SSD 1To

Connecter le disque externe SSD 1To sur un port USB3 de la machine cwwk

Relever le mappage des disques : lsblk

1
2
3
4
NAME                   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                      8:0    0 953,9G  0 disk 
├─sda1                   8:1    0     1G  0 part 
└─sda2                   8:2    0   700G  0 part 

Le disque SSD de 1To est sur /dev/sda

Zapper le disque,

(Attention Ceci effacera de manière irréversible toutes les données de votre disque, veuillez sauvegarder toutes les données importantes) :

1
sgdisk --zap-all /dev/sda

On partitionne le disque avec gdisk

  • Partition entière Linux (code 8300) système de fichier EXT4

Créer une table de partition GPT à l’aide de la commande sgdisk :

1
sgdisk --clear --new=1:0:0 --typecode=1:8300 /dev/sda

Format partition

1
2
# EXT4
mkfs.ext4 /dev/sda1

Montage auto disque externe USB3 SSD 1To

How to Automount USB Devices

Identifié le disque: lsblk

1
2
3
4
5
6
NAME                   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                      8:0    0 953,9G  0 disk 
└─sda1                   8:1    0 953,9G  0 part 
sdb                      8:16   0   1,8T  0 disk 
├─sdb1                   8:17   0     1G  0 part 
└─sdb2                   8:18   0   1,8T  0 part 

Dans notre cas /dev/sda1
Son UUID: sudo blkid |grep '/dev/sda1'

1
/dev/sda1: UUID="c9f4c586-6357-4300-85b0-d2fddb748e89" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="94d3ad9e-597a-4ed2-a1b4-064e3a324fe3"

Créer un point de montage

1
sudo mkdir -p /mnt/usbssd  

Montage /etc/fstab

1
2
# USB3 SSD 1To
UUID=ad820226-db7c-48f1-ba78-12a5d7c8f553 /mnt/usbssd auto defaults,nofail,x-systemd.automount 0 2

Recharger la configuration et le montage

1
2
sudo systemctl daemon-reload 
sudo mount -a

Supprimer lost+found: sudo rm -r /mnt/usbssd/lost+found/

Définir les droits utilisateur sur le montage

1
sudo chown $USER:$USER -R /mnt/usbssd

Créer un dossier backup

1
mkdir /mnt/usbssd/backup
Cet article est sous licence CC BY 4.0 par l'auteur.