Réinstallation serveur ubuntu, résolution de problèmes divers

Author: Unknown

Date: 27/09/2025

Marre des rapspberry qui en rebootent plus à cause d'une carte SD qui a pris un coup de calcaire. J'ai récupéré un optiplex 9020 / Core i3 / 4Go de RAM / 250Go de disque dur, et j'ai commence depuis zéro l'installation d'un serveur qui réponds le mieux possible à mes besoins.

Je prends des notes pour gagner du temps la prochaine fois.

Ce fichier reprends la dernière version à jour, complète. Les versions intermédiaires sont ici:

  • 7 juin: [Première tentative, loupée](20250607-Réinstallation loupée d'un serveur ubuntu.md)
  • 8 juin: [Deuxième tentative](20250608-Réinstallation d'un serveur ubuntu, première étape.md)
  • 15 juillet:
  • 19 juillet: [Sauvegarde régulière des scripts et configuration docker](20250719-Sauvegarde régulière de la config docker et de mes scripts.md)
  • 28 juillet: [Création des différents sites webs, contenu statique de base, génération automatique de leur contenu dynamique](20250828-Réinstallation-serveur-ubuntu, suite.md)

Nouveautés du jour

J'ai éteint mon serveur pendant plusieurs semaines avant de le redémarrer. Je crois me souvenir avoir redémmarré les services docker. État de lieux quand je me reconnecte:

  • un docker stats m'indique qu'un seul service docker tourne. Il en manque tout plein. Pourquoi ? Comment faire pour qu'ils redémarrent automatiquement en cas dd'arrêt ? Et m'alertent en cas de soucis ?
  • les logs de la synchro NAS -> serveur montrent des erreurs IO:
    rsync -av --delete /mnt/nas_pctv_ro/PERSONNEL/NOS_PHOTOS_ET_VIDEOS/ /mnt/linux/PERSONNEL/NOS_PHOTOS_ET_VIDEOS
    sending incremental file list
    rsync: [Receiver] mkdir "/mnt/linux/PERSONNEL/NOS_PHOTOS_ET_VIDEOS" failed: No such file or directory (2)
    rsync error: error in file IO (code 11) at main.c(791) [Receiver=3.2.7]
    rsync: [sender] write error: Broken pipe (32)
    rsync error: error in file IO (code 11) at io.c(849) [sender=3.2.7]
    Sync for NOS_PHOTOS_ET_VIDEOS failed with exit code 11 at 20250927.033321
    Sync failed with exit code 11 at 20250927.033321
    
  • les logs de backup montrent également des erreurs:
    20250926.204501|/home/user/scripts/backup.bash|##################################################################
    20250926.204501|/home/user/scripts/backup.bash|Script: /home/user/scripts/backup.bash
    20250926.204501|/home/user/scripts/backup.bash|Arguments:
    20250926.204501|/home/user/scripts/backup.bash|Started
    mkdir: cannot create directory ‘/mnt/linux/PERSONNEL’: Permission denied
    [...]
    mkdir: cannot create directory ‘/mnt/linux/PERSONNEL’: Permission denied
    mv: cannot stat '/mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user/daily.6/docker': No such file or directory
    mv: cannot stat '/mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user/daily.5/docker': No such file or directory
    [...]
    mv: cannot stat '/mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user/daily.0/docker': No such file or directory
    20250926.204501|/home/user/scripts/backup.bash|rsync -a --delete --exclude='*.pem' --link-dest=/mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user/daily.1/docker /home/user/docker /mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user/daily.0/docker
    rsync: [Receiver] mkdir "/mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user/daily.0/docker" failed: No such file or directory (2)
    rsync error: error in file IO (code 11) at main.c(791) [Receiver=3.2.7]
    20250926.204501|/home/user/scripts/backup.bash|Sync for docker failed with exit code 11|error code=11
    

Il va falloir s'occuper de tout cela: comprendre les problèmes, les résoudre ou les contourner. Et, un jour, il faudra que je mette en place une centralisation de logs et de l'alerting.

Problème du disuque dur USB externe qui n'est pas/plus monté

Sur le dernier problème, quand je regarde, en effet, y a des couilles dans le potage, la paritition du disque dur USB externe n'est pas montée sous /mnt/linux/PERSONNEL:

user@lnxsrv:/var/log/backup$ ls /mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user/daily.6/docker
ls: cannot access '/mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user/daily.6/docker': No such file or directory
user@lnxsrv:/var/log/backup$ ls /mnt/linux/
user@lnxsrv:/var/log/backup$ df
Filesystem                         1K-blocks       Used Available Use% Mounted on
tmpfs                                 391532       1484    390048   1% /run
efivarfs                                 128         52        72  42% /sys/firmware/efi/efivars
/dev/mapper/ubuntu--vg-ubuntu--lv  252284792   13362624 227560344   6% /
tmpfs                                1957644          0   1957644   0% /dev/shm
tmpfs                                   5120          0      5120   0% /run/lock
/dev/mapper/ubuntu--vg-home         51290592     119272  48533496   1% /home
/dev/sda2                            1992552     197592   1673720  11% /boot
/dev/sda1                            1098628       6288   1092340   1% /boot/efi
//192.168.0.13/DD3TO_             2930265084 2634744408 295520676  90% /mnt/nas_pctv_ro
tmpfs                                 391528         12    391516   1% /run/user/1000

Je commence par améliorer le script de sauvegarde:

[...]
# On commence par vérifier que la destination existe bien
DEST=/mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user
if [ ! -d $DEST ]
then
    check_status 1 "N/A" "Fatal failure: Target directory does not exist ($DEST)"
    exit 1
fi
mkdir -p $DEST/daily.0 $DEST/daily.1 $DEST/daily.2 $DEST/daily.3 $DEST/daily.4 $DEST/daily.5 $DEST/daily.6 $DEST/daily.7
[...]

Je mets le tout en crontab pour exécution dans une minute, et cela fonctionne:

20250927.150501|/home/user/scripts/backup.bash|##################################################################
20250927.150501|/home/user/scripts/backup.bash|Script: /home/user/scripts/backup.bash
20250927.150501|/home/user/scripts/backup.bash|Arguments:
20250927.150501|/home/user/scripts/backup.bash|Started
20250927.150501|/home/user/scripts/backup.bash|Fatal failure: Target directory does not exist (/mnt/linux/PERSONNEL/SERVER/backup/lnxsrv/home_user)|error code=1

Reste à comprendre pourquoi cette parition ne se monte pas au démarrage. On pourrait penser que c'est tout simple et qu'il manquait un auto à la ligne /dev/sdb3 /mnt/linux ext4 defaults 0 2 de /etc/fstab. Nénamoins, après reboot, même sans modifier /etc/fstab, le disque était monté.

Chose intéressante, après rajout du auto et reboot, j'ai au reboot une ligne de Time out lors du montage de la partition, ce qui amène ensuite à l'interruption du boot, qui m'indique être en emergency mode et me propose soit de passer en mode maintenance, soit de continuer le boot. Je vais donc retirer cette option.

Je vais continuer à surveiller. Si nécessaire, j'autoriserai l'utilisateur non root user à utiliser la commande mount et je modifierai les scripts pour remonter si nécessaire le montage de la partition réseau et de la parition du disque dur USB.

Problème de la synchronisation NAS HS

Même souci de la destination qui n'était pas accessible. Je corrige également le script de synchronisation pour avoir une erreur plus parlante, et éviter des logs d'erreurs inutiles.

Services docker non démarrés

Un docker ps -a m'indique bien qu'un seul service fonctionne et pas les autres:

user@lnxsrv:~/scripts$ docker ps -a
CONTAINER ID   IMAGE                                                  COMMAND                  CREATED        STATUS                      PORTS                                                                          NAMES
78c55ce9d4ef   nginx:alpine                                           "/docker-entrypoint.…"   2 months ago   Exited (0) 2 weeks ago                                                                                     noteblogger-nginx
32389aa1f2e4   nginx:alpine                                           "/docker-entrypoint.…"   2 months ago   Exited (0) 2 weeks ago                                                                                     ia-nginx
46f31119e69c   nginx:alpine                                           "/docker-entrypoint.…"   2 months ago   Exited (0) 2 weeks ago                                                                                     articles-nginx
cce46cf15677   nginx:alpine                                           "/docker-entrypoint.…"   2 months ago   Exited (0) 2 weeks ago                                                                                     diary-nginx
453cacdece82   jrcs/letsencrypt-nginx-proxy-companion                 "/bin/bash /app/entr…"   2 months ago   Exited (0) 2 weeks ago                                                                                     letsencrypt-companion
a2bb571987a7   jwilder/nginx-proxy                                    "/app/docker-entrypo…"   2 months ago   Up 18 minutes               0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp   nginx-proxy
f18e936b827c   nginx:alpine                                           "/docker-entrypoint.…"   2 months ago   Exited (0) 2 weeks ago                                                                                     test-nginx

Les politiques de redémarrage sont pourtant les mêmes:

user@lnxsrv:~/scripts$ docker inspect -f '{{.Name}}: {{.HostConfig.RestartPolicy.Name}}' $(docker ps -aq)
/noteblogger-nginx: on-failure
/ia-nginx: on-failure
/articles-nginx: on-failure
/diary-nginx: on-failure
/letsencrypt-companion: on-failure
/nginx-proxy: on-failure
/test-nginx: on-failure

Je modifie dans les compose.yaml afin de passer la politique de redémarrage à unless-stopped. Je redémarre un par un les services docker via docker restart et tout fonctionne. Je rboote pour voir l'état après reboot.

Changements des noms des sites web

Je décide de changer le nom de certains de mes sites et je me restreint donc à :

  • articles.9h56.fr
  • ia.9h56.fr
  • misc.9h56.fr
  • www.9h56.fr
  • bullespositives.9h56.fr
  • calmsante-dev.9h56.fr
  • www.home.9h56.fr Et ce dernier doit être derrière une ACL.

Cela implique de recréer les arborescences disques des sitew webs et de modifier le fichier compose.yaml

Mise en place de l'ACL sur www.home.9h56.fr

Je mets en place le contrôle au niveau du reverse proxy. Celui-ci est basé sur le container jwilder/nginx-proxy qui crée automagiquement sa configuration. Il faut donc que je trouve comment y injecter la configuration spécifique pour le service www.home.9h56.fr. Pour générer le fichier de mot de passe, il faut l'utilitaire apache2-utils.

sudo apt-get install apache2-utils
cd ~/docker/front-nginx-proxy/
mkdir htpasswd
sudo htpasswd -c ./htpasswd/htpasswd.www.home.9h56.fr userACréér

Modification du fichier ~/docker/front-nginx-proxy/compose.yaml pour monter dans le container le répertoire htpasswd:

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    restart: "unless-stopped"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs
      - ./vhost.d:/etc/nginx/vhost.d
      - ./htpasswd:/etc/nginx/htpasswd
      - ./html:/usr/share/nginx/html
    environment:
      - TRUST_DOWNSTREAM_PROXY=false

Création du fichier ~/docker/front-nginx-proxy//vhost.d/www.home.9h56.fr :

auth_basic           "Family’s Area";
auth_basic_user_file /etc/nginx/htpasswd/htpasswd.www.home.9h56.fr;

Il ne faut pas oublier de reconstruire l'image après modification du fichier compose.yaml:

docker stop nginx-proxy
docker rm nginx-proxy
docker compose -f compose.yaml up -d

Génération automatique du contenu de certains des sites web

mkdir -p ~/noteblogger/code ~/noteblogger/conf ~/noteblogger/ ~/noteblogger/logs ~/noteblogger/out ~/noteblogger/scripts"

Création du script de génération. Le script récupère la dernière verion du code, le compile, puis génère chaque variante pour chaque site:


Cela suppose d'avoir les bons fichiers de configuration:

Bon, cela ne fonctionne pas. la compilation ne passe pas: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.14.1:compile (default-compile) on project noteblogger: Fatal error compiling: error: release version 22 not supported -> [Help 1] Maven n'est pas sur la dernière version sur mon serveur (mvn -V -> Apache Maven 3.8.7, or la dernière version est 3.9.11). Et surtout, je suis encore en java 21 ( java --version->openjdk 21.0.8 2025-07-15). Il faudrait mettre à jour java. Pas de verison 22 de java disponible à date. Je pourrais installer java 22 par moi-même, en dehors des repos officiels, mais je peux aussi rendre mon code compatible java 21 je pense. Ceci corrigé, tout cela tombe en marche.

C'est fini !

Ci-après la mise à jour du processus d'installation from scratch.

  • nouvelle version de backup.sh
  • /etc/fstab à jour
  • nouvelle version de ./synchro_pctv_personnel_to_local.bash
  • nouvelles version des compose.yaml
  • nouvelle arborescence disque

Install de base

J'installe une ubuntu serveur classique 24.04 LTS.

Update system

sudo apt update && sudo apt upgrade

Mise à jour automatiques de sécurité

sudo apt install unattended-upgrades -y

Remove Snap

J'aime pas Snap. Enfin, surtout, je connais pas assez. Alors, je vais le dégager dans un premier temps. Déjà, y a quoi d'installé avec snap ? snap list. J'ai rien d'installé, donc je vire le principe même de Snap.Ah, bah, sur ubunto, cela a l'air pas immédiat/recommandé de tout virer snap. Je vais gagner du temps et le laisser, du coup.

Packages à installer

J'ai des vieilles habitudes, donc, vieux packages à remettre: sudo apt install net-tools plocate

Firewall

The UFW (Uncomplicated Firewall) is a user-friendly way to manage your firewall rules on Ubuntu Server. It provides a simplified interface for configuring and managing iptables. Here’s how you can set up UFW:

  • Check the status of UFW: sudo ufw status verbose
  • Enable UFW: sudo ufw enable
  • Allow SSH access: sudo ufw enable
  • Allow necessary services, such as HTTP (port 80) or HTTPS (port 443): sudo ufw allow http et sudo ufw allow https
sudo ufw status verbose
sudo ufw enable
sudo ufw allow ssh 
sudo ufw allow http
sudo ufw allow https
sudo ufw status verbose

[Ajout du 15 juillet 2025] Bizarrement, après reboot, les règles ne sont plus en place

user@lnxsrv:~$ sudo ufw status
Status: inactive

La configuration n'est pas perdue pour autant:

user@lnxsrv:~$ sudo ufw show added
Added user rules (see 'ufw status' for running firewall):
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443
ufw allow 9090
ufw allow 9100
ufw allow 3000
ufw allow 3000/tcp

Une réactivation manuelle fonctionne:

user@lnxsrv:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
user@lnxsrv:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443                        ALLOW IN    Anywhere
9090                       ALLOW IN    Anywhere
9100                       ALLOW IN    Anywhere
3000                       ALLOW IN    Anywhere
3000/tcp                   ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443 (v6)                   ALLOW IN    Anywhere (v6)
9090 (v6)                  ALLOW IN    Anywhere (v6)
9100 (v6)                  ALLOW IN    Anywhere (v6)
3000 (v6)                  ALLOW IN    Anywhere (v6)
3000/tcp (v6)              ALLOW IN    Anywhere (v6)

Bizarrement, après reboot, cette fois-ci, les règles sont bien là. Ah zut non, finalement, plus tard, les règles ne sont plus là. Bizarre.

Fail2ban

sudo apt install fail2ban

Durcir accès ssh

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
sudo vi /etc/ssh/sshd_config

Uncomment the line under the PermitRootLogin directive to explicitly forbid SSH login attempts as root::

PermitRootLogin no
MaxAuthTries 3
LoginGraceTime 15
sudo sshd -t
sudo systemctl reload ssh

Packages divers

sudo apt-get install git

Docker

  • sudo apt install apt-transport-https curl
  • Add Docker’s Official GPG Key https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  • Set Up Docker’s Stable Repository echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • sudo apt update
  • sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • Vérification:
    • sudo systemctl is-active docker
    • sudo docker run hello-world
  • Enabling Non-root Users to Run Docker Commands: sudo usermod -aG docker ${USER} suivi d'un sudo reboot

Synchro du NAS

Montage partage du NAS

  • sudo mkdir -p /mnt/nas_pctv_ro
  • sudo cp /etc/fstab /etc/fstab.orig
  • sudo vi /etc/fstab et ajouter la ligne:
  • //192.168.0.13/DD3TO_ /mnt/nas_pctv_ro cifs username=****,password=****,ro,iocharset=utf8,file_mode=0777,dirmode=0777,vers=2.1 0 0
  • sudo systemctl daemon-reload
  • sudo mount /mnt/nas_pctv_ro
  • ls /mnt/nas_pctv_ro/

Montage du disque dur externe

Le disque dur interne de l'optiplex n'est pas assez grand. J'utilise un disque dur externe de 1To pour mes données. Dans un premier temps, pas chiffré, et c'est pas terrible.

  • lsblk pour repérer comment est identifié le disque dur externe. Cela me donne:
user@lnxsrv:~/scripts$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                         8:0    0 298,1G  0 disk
├─sda1                      8:1    0     1G  0 part /boot/efi
├─sda2                      8:2    0     2G  0 part /boot
└─sda3                      8:3    0   295G  0 part
  ├─ubuntu--vg-ubuntu--lv 252:0    0   245G  0 lvm  /
  └─ubuntu--vg-home       252:1    0    50G  0 lvm  /home
sdb                         8:16   0 931,5G  0 disk
├─sdb1                      8:17   0   100G  0 part
├─sdb2                      8:18   0    64G  0 part
└─sdb3                      8:19   0 767,5G  0 part
sr0                        11:0    1  1024M  0 rom
  • sudo mkdir -p /mnt/linux/
  • sudo vi /etc/fstab
  • rajouter la ligne /dev/sdb3 /mnt/linux ext4 defaults 0 2
  • sudo systemctl daemon-reload
  • sudo mount /mnt/linux
  • ls /mnt/linux/
  • touch /mnt/linux/PERSONNEL/test_prout

Script de synchro du NAS

  • Tout d'abord:
cd
mkdir -p scripts
cd scripts
vi synchro_pctv_personnel_to_local.bash

Synchro en crontab

  • crontab -e
  • 33 3,7,11,17 * * * /home/user/scripts/synchro_pctv_personnel_to_local.bash

Utilisation de docker pour les sites statiques et les redirections

  • Je ne veux pas avoir un seul fichier compose.yaml à rallonge.
  • Si je veux que le proxy et que letsencrypt-companion arrive à communiquer avec les sites web montés par d'aures fichiers compose.yaml, alors il faut expliciter un réseau web:
  • docker network ls devrait faire apparaitre uniquement bridge, host et none
  • docker network create nginx-proxy pour créer le réseau "externe" utilisable par différents compose.yaml
  • L'arbo disque:
user@lnxsrv:~/docker$ find . -type d
.
./noteblogger-sites
./front-nginx-proxy
./front-nginx-proxy/html
./front-nginx-proxy/certs
./front-nginx-proxy/vhost.d
./front-nginx-proxy/test-nginx
./front-nginx-proxy/test-nginx/html
  • Le fichier ./front-nginx-proxy/compose.yaml:
networks:
  default:
    external:
      name: nginx-proxy

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    restart: "unless-stopped"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs
      - ./vhost.d:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
    environment:
      - TRUST_DOWNSTREAM_PROXY=false

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-companion
    restart: "unless-stopped"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs
      - ./html:/usr/share/nginx/html
    environment:
      - NGINX_PROXY_CONTAINER=nginx-proxy
      - DEFAULT_EMAIL=anothermail@gmail.com
    depends_on:
      - nginx-proxy

  test-nginx:
    image: nginx:alpine
    container_name: test-nginx
    restart: "unless-stopped"
    volumes:
      - ./test-nginx/html:/usr/share/nginx/html:ro
    environment:
      - VIRTUAL_HOST=test.9h56.fr
      - LETSENCRYPT_HOST=test.9h56.fr
      - LETSENCRYPT_EMAIL=anothermail@gmail.com
    expose:
      - "80"
  • Le fichier ./noteblogger-sites/compose.yaml:
networks:
  default:
    external:
      name: nginx-proxy

services:
  articles.9h56.fr-nginx:
    image: nginx:alpine
    container_name: articles.9h56.fr-nginx
    restart: "unless-stopped"
    volumes:
      - /var/www/articles.9h56.fr/html:/usr/share/nginx/html:ro
    environment:
      - VIRTUAL_HOST=articles.9h56.fr
      - LETSENCRYPT_HOST=articles.9h56.fr
    expose:
      - "81"

  ia.9h56.fr-nginx:
    image: nginx:alpine
    container_name: ia.9h56.fr-nginx
    restart: "unless-stopped"
    volumes:
      - /var/www/ia.9h56.fr/html:/usr/share/nginx/html:ro
    environment:
      - VIRTUAL_HOST=ia.9h56.fr
      - LETSENCRYPT_HOST=ia.9h56.fr
    expose:
      - "83"

  misc.9h56.fr-nginx:
    image: nginx:alpine
    container_name: misc.9h56.fr-nginx
    restart: "unless-stopped"
    volumes:
      - /var/www/misc.9h56.fr/html:/usr/share/nginx/html:ro
    environment:
      - VIRTUAL_HOST=misc.9h56.fr
      - LETSENCRYPT_HOST=misc.9h56.fr
    expose:
      - "85"

  www.9h56.fr-nginx:
    image: nginx:alpine
    container_name: www.9h56.fr-nginx
    restart: "unless-stopped"
    volumes:
      - /var/www/www.9h56.fr/html:/usr/share/nginx/html:ro
    environment:
      - VIRTUAL_HOST=www.9h56.fr
      - LETSENCRYPT_HOST=www.9h56.fr
    expose:
      - "86"

  bullespositives.9h56.fr-nginx:
    image: nginx:alpine
    container_name: bullespositives.9h56.fr-nginx
    restart: "unless-stopped"
    volumes:
      - /var/www/bullespositives.9h56.fr/html:/usr/share/nginx/html:ro
    environment:
      - VIRTUAL_HOST=bullespositives.9h56.fr
      - LETSENCRYPT_HOST=bullespositives.9h56.fr
    expose:
      - "87"

  www.home.9h56.fr-nginx:
    image: nginx:alpine
    container_name: www.home.9h56.fr-nginx
    restart: "unless-stopped"
    volumes:
      - /var/www/www.home.9h56.fr/html:/usr/share/nginx/html:ro
    environment:
      - VIRTUAL_HOST=www.home.9h56.fr
      - LETSENCRYPT_HOST=www.home.9h56.fr
    expose:
      - "88"

  calmsante-dev.9h56.fr-nginx:
    image: nginx:alpine
    container_name: calmsante-dev.9h56.fr-nginx
    restart: "unless-stopped"
    volumes:
      - /var/www/calmsante-dev.9h56.fr/html:/usr/share/nginx/html:ro
    environment:
      - VIRTUAL_HOST=calmsante-dev.9h56.fr
      - LETSENCRYPT_HOST=calmsante-dev.9h56.fr
    expose:
      - "89"

Création des arborescences disques

cd /var/www
sudo mkdir articles.9h56.fr  bullespositives.9h56.fr  calmsante-dev.9h56.fr  ia.9h56.fr  misc.9h56.fr  www.9h56.fr  www.home.9h56.fr
sudo chown a+rwx articles.9h56.fr  bullespositives.9h56.fr  calmsante-dev.9h56.fr  ia.9h56.fr  misc.9h56.fr  www.9h56.fr  www.home.9h56.fr
for i in bullespositives.9h56.fr  calmsante-dev.9h56.fr  ia.9h56.fr  misc.9h56.fr  www.9h56.fr  www.home.9h56.fr
> do
> mkdir $i/html
> echo "$i" > $i/html/index.html
> done
mkdir www.home.9h56.fr/html/ia www.home.9h56.fr/html/articles www.home.9h56.fr/html/misc www.home.9h56.fr/html/bullespostives

Mise en place de l'ACL sur www.home.9h56.fr

Je mets en place le contrôle au niveau du reverse proxy. Celui-ci est basé sur le container jwilder/nginx-proxy qui crée automagiquement sa configuration. Il faut donc que je trouve comment y injecter la configuration spécifique pour le service www.home.9h56.fr. Pour générer le fichier de mot de passe, il faut l'utilitaire apache2-utils.

sudo apt-get install apache2-utils
cd ~/docker/front-nginx-proxy/
mkdir htpasswd
sudo htpasswd -c ./htpasswd/htpasswd.www.home.9h56.fr userACréér

Modification du fichier ~/docker/front-nginx-proxy/compose.yaml pour monter dans le container le répertoire htpasswd:

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    restart: "unless-stopped"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs
      - ./vhost.d:/etc/nginx/vhost.d
      - ./htpasswd:/etc/nginx/htpasswd
      - ./html:/usr/share/nginx/html
    environment:
      - TRUST_DOWNSTREAM_PROXY=false

Création du fichier ~/docker/front-nginx-proxy//vhost.d/www.home.9h56.fr :

auth_basic           "Family’s Area";
auth_basic_user_file /etc/nginx/htpasswd/htpasswd.www.home.9h56.fr;

Il ne faut pas oublier de reconstruire l'image après modification du fichier compose.yaml:

docker stop nginx-proxy
docker rm nginx-proxy
docker compose -f compose.yaml up -d

Sauvegarde régulière de la config docker et de mes scripts

Script de synchro

  • Tout d'abord:
cd
mkdir -p scripts
cd scripts
vi backup.bash

Synchro en crontab

  • crontab -e
  • 56 20 * * * /home/user/scripts/backup.bash

La suite:

J'aimerais également:

  • une génération régulière des mes blogs
  • remonter le disque dur externe si démonté-je-ne-sais-pas-pourquoi
  • remonter le partage du nas si démonté-je-ne-sais-pas-pourquoi
  • un redémarrage automatique des containers en cas de reboot du serveur
  • un suivi / admin web docker (https://github.com/henrygd/beszel?tab=readme-ov-file?)
  • une centralisation des logs apaches docker et les interroger via Matomo
  • installer une gallerie photo++ style photoprism
  • une centralisation des logs docker et les interroger via un ELK
  • une centralisation des logs locaux et les interroger via un ELK
  • vérifier que la sauvegarde mensuelle fonctionne
  • une centralisation de certains logs distants et les interroger via un ELK
  • sortir les éventuels password des fichiers de configuration

Tags: computing ubuntu serveur-bayart back2code informatique article mon-serveur-à-moi-qui-me-va-bien