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
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

Les serveurs DNS sont des machines discutant entre elles afin de se communiquer les correspondances entre nom de domaine et adresses IP.
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 :
- La réponse NXDOMAIN indiquant que le domaine n’existe pas
- 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, 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'
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
)
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
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)
- Linkwarden - gestionnaire de liens open-source est installé sur la machine virtuelle Alpine vm-alpine05
- Linkwarden - Extension firefox
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
- cwwk KVM - Serveur Debian 12 (image cloud “generic”)
Machine virtuelle vm-debian12 (192.168.100.40) qui héberge le serveur collabora online - Installation de collabora online sur le serveur virtuel debian12 vm-debian12, voir le lien Collabora
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)
- Publishing
- Emoji reference
- UTF-8 emojis in bash or zsh
- How to Use the Command ‘ntfy’ (with examples)
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
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
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




















