Réinstallation d'un serveur ubuntu, première étape
Author: Unknown
Date: 08/06/2025
Marre des rapspberry qui en rebootent plus à cause d'une carte SD qui a pris un coup de calcaire. Je récupère un optiplex 9020 / Core i3 / 4Go de RAM / 250Go de disque dur, et je re re recommence à zéro.
Mais je prends des notes pour gagner du temps la prochaine fois.
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 httpetsudo 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
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 updatesudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin- Vérification:
sudo systemctl is-active dockersudo docker run hello-world
- Enabling Non-root Users to Run Docker Commands:
sudo usermod -aG docker ${USER}suivi d'unsudo reboot
Synchro du NAS
Montage partage du NAS
sudo mkdir -p /mnt/nas_pctv_rosudo cp /etc/fstab /etc/fstab.origsudo vi /etc/fstabet 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 0sudo systemctl daemon-reloadsudo mount /mnt/nas_pctv_rols /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.
lsblkpour 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-reloadsudo mount /mnt/linuxls /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
- Le (fichier synchro_pctv_personnel_to_local.bashà recopier dans vi)[install-ubuntu-server-synchro_pctv_personnel_to_local.bash]
- Puis:
chmod +x synchro_pctv_personnel_to_local.bashsudo mkdir -p /var/log/sync_nassudo chmod a+rwx /var/log/sync_nas
Synchro en crontab
crontab -e33 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 lsdevrait faire apparaitre uniquement bridge, host et nonedocker network create nginx-proxypour créer le réseau "externe" utilisable par différentscompose.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
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
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=liocttnavud@gmail.com
depends_on:
- nginx-proxy
test-nginx:
image: nginx:alpine
container_name: test-nginx
volumes:
- ./test-nginx/html:/usr/share/nginx/html:ro
environment:
- VIRTUAL_HOST=test.9h56.fr
- LETSENCRYPT_HOST=test.9h56.fr
- LETSENCRYPT_EMAIL=liocttnavud@gmail.com
expose:
- "80"
- Le fichier
./noteblogger-sites/compose.yaml:
networks:
default:
external:
name: nginx-proxy
services:
articles-nginx:
image: nginx:alpine
container_name: articles-nginx
volumes:
- /var/www/articles.home.9h56.fr/html:/usr/share/nginx/html:ro
environment:
- VIRTUAL_HOST=articles.home.9h56.fr
- LETSENCRYPT_HOST=articles.home.9h56.fr
expose:
- "81"
diary-nginx:
image: nginx:alpine
container_name: diary-nginx
volumes:
- /var/www/diary.home.9h56.fr/html:/usr/share/nginx/html:ro
environment:
- VIRTUAL_HOST=diary.home.9h56.fr
- LETSENCRYPT_HOST=diary.home.9h56.fr
expose:
- "82"
ia-nginx:
image: nginx:alpine
container_name: ia-nginx
volumes:
- /var/www/ia.home.9h56.fr/html:/usr/share/nginx/html:ro
environment:
- VIRTUAL_HOST=ia.home.9h56.fr
- LETSENCRYPT_HOST=ia.home.9h56.fr
expose:
- "83"
noteblogger-nginx:
image: nginx:alpine
container_name: noteblogger-nginx
volumes:
- /var/www/noteblogger.home.9h56.fr/html:/usr/share/nginx/html:ro
environment:
- VIRTUAL_HOST=noteblogger.home.9h56.fr
- LETSENCRYPT_HOST=noteblogger.home.9h56.fr
expose:
- "84"
So what ?
Cela fonctionne, et chacun des fichiers compose.yaml fait au maximum un écran, donc cela reste gérable et compréhensible ;-)
La suite:
J'aimerais également:
- une centralisation des logs docker et les interroger via un ELK
- une centralisation des logs locaux et les interroger via un ELK
- une centralisation de certains logs distants et les interroger via un ELK
- une génération régulière des mes blogs
- une sauvegarde régulière de la config docker et de mes scripts
- sortir les éventuels password des fichiers de configuration
Tags: computing ubuntu serveur-bayart back2code informatique article mon-serveur-à-moi-qui-me-va-bien