Réinstallation loupée d'un serveur ubuntu

Author: Unknown

Date: 07/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

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

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
  • 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.bash
    • sudo mkdir -p /var/log/sync_nas
    • sudo chmod a+rwx /var/log/sync_nas

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 e

  • mkdir -p ./test-nginx/html ./front-nginx-proxy/html ./front-nginx-proxy/certs ./front-nginx-proxy/conf ./front-nginx-proxy/vhost.d
  • cd ~/docker/front-nginx
  • À ce stade, voici mon [compose.yaml
  • Il faut créer le fichier ./front-nginx-proxy/conf/custom.conf avec ce contenu.
  • Il faut créer le fichier ./front-nginx-proxy/conf/force-ssl.conf avec ce contenu.
  • Puis docker compose up -d

Métriques serveur: Prometheus + grafana

  • mkdir -p ./prometheus ./grafana/data ./grafana/datasources
  • Il faut créer le fichier ./prometheus/prometheus.yaml avec ce contenu.
  • Il faut créer le fichier ./grafana/datasources/node-exporter-full.json avec ce contenu.
  • Il faut créer le fichier ./grafana/datasources/datasource.yaml avec ce contenu.
  • Une fois le tout lancé, Pour le dashboard Grafana, je rajoute ce dashboard par défaut, qui m'affiche plein de métriques.

ELK et centralisation des logs du NAS

ELK

  • J'ai intégré cela à mon fichier docer compose.yaml:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.7.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    networks:
      - web

  logstash:
    image: docker.elastic.co/logstash/logstash:8.7.0
    container_name: logstash
    environment:
      - LS_JAVA_OPTS=-Xms512m -Xmx512m
    ports:
      - "5000:5000"  # pour réception logs via TCP/UDP
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline
    networks:
      - web
    depends_on:
      - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:8.7.0
    container_name: kibana
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    networks:
      - web
    depends_on:
      - elasticsearch

# Volume pour elasticsearch
  volumes:
    ...
    elasticsearch-data:
  • puis, mkdir -p ~/docker/logstash/pipeline
  • dans ~/docker/logstash/pipeline, créer le fichier logstash.conf avec (ce contenu)[install-ubuntu-server-logstash.conf]
  • ja rajoute kibana.admin.home.9h56.fr dans la config DNS de 9h56.fr
  • j'ajoute les VIRTUAL_HOST=kibana.admin.home.9h56.fr, LETSENCRYPT_HOST=kibana.admin.home.9h56.fr et LETSENCRYPT_EMAIL=anothermail@gmail.com dans la section kibana de compose?yaml
  • j'ajoute kibana.admin.home.9h56.fr dans ./front-nginx-proxy/conf/force-ssl.conf
  • puis cd ~/docker/ && docker compose stop && docker compose up -d
  • cela ne fonctionne pas...
    • logstash ne démarre pas
      • des erreurs dans le fichier de configuration ~/docker/logstash/pipeline/logstash.conf
    • logstash n'arrive pas à parler à elasticsearch car elasticsearch demande une authentification par défaut
      • ajout d'un ELASTIC_PASSWORD= dans la section logstash de compose.yaml
      • ajout du user elastic et du password associé dans ~/docker/logstash/pipeline/logstash.conf
    • kibana est de coin
      • il manque les données d'authentification quand il se connecte à elastic search
      • ajout de ELASTICSEARCH_USERNAME et ELASTICSEARCH_PASSWORD dans la section kibana de compose.yaml
      • mais de toute façon, cela ne lui va pas, il faut apparemmennt passer par un système de token pour accéder à l'API depuis kibana (mais pas depuis logstash?!?). Erreur dans le cotnainer kibana: [2025-06-08T12:18:20.205+00:00][FATAL][root] Error: [config validation of [elasticsearch].username]: value of "elastic" is forbidden. This is a superuser account that cannot write to system indices that Kibana needs to function. Use a service account token instead. Learn more: https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html
      • Il faut générer le token
curl -u elastic:anotherpassword -X POST "localhost:9200/_security/api_key" -H "Content-Type: application/json" -d'
{
  "name": "kibana-access",
  "role_descriptors": {
    "kibana-user": {
      "cluster": ["monitor"],
      "index": [ { "names": ["*"], "privileges": ["all"] }]
    }
  }
}'
      • Cela retourne un machin du type: {"id":"gO-GT5cBIXLH_RmQ_NH4","name":"kibana-access","api_key":"_Fx7vVgQRLa5t0h_MeREpw","encoded":"Z08tR1Q1Y0JJWExIX1JtUV9OSDQ6X0Z4N3ZWZ1FSTGE1dDBoX01lUkVwdw=="}
      • Il faut rajouter le token déjà encodé base 64 dans compose.yaml sous la forme ELASTICSEARCH_API_KEY=ApiKey "ID:Chaque clé API générée"
      • J'ai toujours la même erreur [2025-06-08T12:33:12.426+00:00][FATAL][root] Error: [config validation of [elasticsearch].username]: value of "elastic" is forbidden. This is a superuser account that cannot write to system indices that Kibana needs to function. Use a service account token instead. Learn more: https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html
  • Ah, merde, même les sites statiques de base se mettent à merder. J'arrête et je recommence à zéro.

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