Introduction
voici un tutoriel d’installation ElasticSearch. En suivant la doc ElasticSearch ici, vous devriez y arriver tout aussi bien.
Dans ce document, je m’attache à présenter une installation avec une partition dédiée pour ElasticSearch, ainsi qu’avec certain critère particulier. On peut trouver les réponses dans les docs en ligne, mais ce n’est pas toujours simple de s’y retrouver.
Ce texte n’a pas pour vocation à être exhaustif.
Pour mon installation, j 'utilise une machine physique dont un disque nvme est dédié au système, et un disque pour les données (quelles soient de bases de données, d’indexer comme ElasticSearch, etc…). Je ne parle pas ici des données de /home qui ne sert que pour les utilisateur identifié connecté.
J’ai un partitionnement non standard:
- les disques sont chiffrés
- J’utilise bien sur LVM
- Le partitionnement est conçu pour sécuriser les points de montages avec les options nodev, nosuid et noexec.
nvme0n1 259:0 0 476,9G 0 disk
├─nvme0n1p1 259:1 0 953M 0 part /boot/efi
└─nvme0n1p2 259:2 0 476G 0 part
└─nvme0n1p2_crypt 254:0 0 476G 0 crypt
├─vg103-swap 254:1 0 47,8G 0 lvm [SWAP]
├─vg103-boot 254:2 0 952M 0 lvm /boot
├─vg103-root 254:3 0 14G 0 lvm /
├─vg103-home 254:4 0 23,3G 0 lvm /home
├─vg103-var 254:5 0 14G 0 lvm /var
├─vg103-var_log 254:6 0 4,7G 0 lvm /var/log
├─vg103-var_log_audit 254:7 0 4,7G 0 lvm /var/log/audit
├─vg103-var_tmp 254:8 0 3,7G 0 lvm /var/tmp
└─vg103-tmp 254:9 0 3,7G 0 lvm /tmp
Préparation
Installation du paquet
Tout d’abord il va falloir configurer apt pour accéder au dépôt ElasticSearch.
Télécharger la clef du dépot:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
La source apt est donnée par elastic search avec:
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/9.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-9.x.list
Convertir en DEB822 dans le fichier /etc/apt/sources.list.d/elastic-9.x.sources:
Types: deb
URIs: https://artifacts.elastic.co/packages/9.x/apt
Suites: stable
Components: main
Signed-By: /usr/share/keyrings/elasticsearch-keyring.gpg
Sur un système susceptible d’utiliser plusieurs architectures, ajouter à la fin du fichier:
Architectures: amd64
Installer
Mettre à jour la base apt:
apt update
Pour installer elasticsearch:
apt-get install elasticsearch
ATTENTION: Prêter la plus grande attention au message suivant:
--------------------------- Security autoconfiguration information ------------------------------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.
The generated password for the elastic built-in superuser is : qmsldjfmlkqjsmfkljqsmlkjdfmsqkjlfmkldjfmql
If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token ’
after creating an enrollment token on your existing cluster.
You can complete the following actions at any time:
Reset the password of the elastic built-in superuser with
‹ /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic ›.
Generate an enrollment token for Kibana instances with
‹ /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana ›.
Generate an enrollment token for Elasticsearch nodes with
‹ /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node ›.
C’est votre mot de passe.
Dossier chiffré dédié
Introduction
J’ai décidé dans mon architecture que le dossier /var/lib/elasticsearch serait sur une partition chiffrée dédiée.
C’est un choix personnel que vous n’êtes pas obligé de faire.
Si vous voulez rester avec le répertoire standard, passer ce chapitre.
Création de la partition chiffrée et montage
Pour cela j’ai utilisé l’intégralité d’un disque dur. j’ai créé manuellement la partition ainsi:
cryptsetup luksFormat --label ELK --cipher=serpent-xts-plain64 --hash=SHA512 --pbkdf=argon2id /dev/sda
Ouvrir la partition chiffrée ELK_crypt à partir de /dev/sda:
cryptsetup luksOpen /dev/sda ELK_crypt
Ajouter celle-ci comme volume physique LVM:
pvcreate /dev/mapper/ELK_crypt
Créer un nouveau groupe de volumes LVM:
vgcreate vgelk /dev/mapper/ELK_crypt
Dans lequel j’ai créé un volume logique LVM de 300G pour commencer:
lvcreate -L 300G --name var_lib_elasticsearch vgelk
Comme j’aime bien avoir des labels:
Pour le volume logique:
e2label /dev/mapper/vgelk-var_lib_elasticsearch ELASTIC
Sachez que pour un LUKS la commande de changement d’un label c’est
cryptsetup config <mon device> --label <mon label>
Pour être sûr du déchiffrement au démarrage (obligatoire, car sinon le montage ne pourra pas se faire, et le système sera en échec au démarrage), il faut ajouter le disque dans /etc/crypttab:
echo "ELK_crypt UUID=<le UUID de la partition> none luks,discard,x-initrd.attach,initramfs" >> /etc/crypttab
Et bien sur mettre à jour l’initramfs:
update-initramfs -k all -u
Maintenant il faut créer le montage dans fstab. Le répertoire créer par l’installation du paquet a été créé ainsi:
drwxr-s--- 2 elasticsearch elasticsearch 4096 8 janv. 23:14 elasticsearch
Soit:
~# stat /var/lib/elasticsearch
Fichier : /var/lib/elasticsearch
Taille : 4096 Blocs : 8 Blocs d'E/S : 4096 directory
Périphérique : 254/5 Inœud : 143482 Liens : 2
Accès : (2750/drwxr-s---) UID : ( 110/elasticsearch) GID : ( 116/elasticsearch)
Il faut donc créer le montage dans /etc/fstab pour qu’il soit absolument identique:
On utilisera les éléments suivants:
- Pour s’assurer que le user et le groupe propriétaire soit les bon, nous utiliserons X-mount.owner pour le user, et X-mount.group, en utilisant les ID correspondant
- Pour s’assurer que les permissions seront les bonne, y compris le sticky bit, nous utiliserons X-mount.mode avec l’accè_s tel que montré par la commande stat.
Ce qui donne l’entrée suivante:
/dev/mapper/vgelk-var_lib_elasticsearch /var/lib/elasticsearch ext4 relatime,nodev,nosuid,X-mount.owner=110,X-mount.group=116,X-mount.mode=2750 0 2
Ne pas oublier de faire la commande suivante pour cette modification soit prise en compte:
systemctl daemon-reload
Et on peut monter le répertoire:
mount /var/lib/elasticsearch
Le répertoire temporaire
Introduction
Autre point, Elasticsearch utilise par défaut le répertoire /tmp avec des droits exec. Si vous êtes comme moi et que /tmp est monté en mode noexec, le démarrage d’elastic sera en échec car les accès au répertoire temporaire de gestion JNA ne marchera pas.
Il faut soit enlever le noexec de /tmp (mauvaise idée car c’est là pour une bonne raison, la sécurité), soit définir un autre répertoire temporaire.
Création du répertoire temporaire
Personnellement, j’utiliserais /var/lib/elasticsearch/tmp, en le créant ainsi:
mkdir /var/lib/elasticsearch/tmp
puis en modifiant l’utilisateur et le groupe propriétaire:
chown elasticsearch:elasticsearch /var/lib/elasticsearch/tmp
Puis en modifiant les permissions:
chmod 2750 /var/lib/elasticsearch/tmp
Et on a:
drwxr-s--- 2 elasticsearch elasticsearch 4096 17 janv. 16:01 tmp
Soit:
~# stat /var/lib/elasticsearch/tmp
Fichier : /var/lib/elasticsearch/tmp
Taille : 4096 Blocs : 8 Blocs d'E/S : 4096 directory
Périphérique : 254/11 Inœud : 9699329 Liens : 2
Accès : (2750/drwxr-s---) UID : ( 110/elasticsearch) GID : ( 116/elasticsearch)
Pour que ce soit pris en compte, il faut modifier systemd pour lui dire d’utiliser l’environnement temporaire ainsi créé:
systemctl edit elasticsearch
Et entrer dans l’espace autorisé:
[Service]
Environment=ES_TMPDIR=/var/lib/elasticsearch/tmp
Le fichier d’override a ainsi été créé: /etc/systemd/system/elasticsearch.service.d/override.conf
N’oubliez par de recharger la configuration systemd:
systemctl daemon-reload
Ne reste plus qu’à faire la configuration de base d’elasticsearch dans /etc/elasticsearch/elasticsearch.yml
Configuration ElasticSearch
Introduction
La configuration ici présentée est une configuration de base, elle n’a pas pour vocation d’être une configuration de production (il y aurait des éléments de configuration de sécurisation à faire et d’autres aussi pour les performances.
Configuration
le cluster:
cluster.name: my-application
Le node:
node.name: node-1
Le réseau (pour le moment j’autorise toutes les interfaces):
network.host: 0.0.0.0
Le port HTTP:
http.port: 9200
Les connections API:
http.host: 0.0.0.0
Le transport:
transport.host: 0.0.0.0
Si tout est bon, vous pouvez démarrer le service elasticsearch:
systemctl start elasticsearch
Pour qu’il soit démarré à chaque démarrage du système:
systemctl enable elasticsearch
Et voilà, vous avez un elasticsearch fonctionnel.
~# systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; preset: enabled)
Drop-In: /etc/systemd/system/elasticsearch.service.d
└─override.conf
Active: active (running) since Sat 2026-01-17 16:16:13 CET; 38s ago
Invocation: 1a4fadc5ae524b36a397ff2922eea21c
Docs: https://www.elastic.co
Main PID: 12958 (java)
Tasks: 98 (limit: 18942)
Memory: 8.4G (peak: 8.4G)
CPU: 1min 11.206s
CGroup: /system.slice/elasticsearch.service
├─12958 /usr/share/elasticsearch/jdk/bin/java -Xms4m -Xmx64m -XX:+UseSerialGC -Dcli.name=server -Dcli.script=/usr/share/elasticsearch/bin/elasticsearch -Dcli.libs=lib>
├─13026 /usr/share/elasticsearch/jdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headles>
└─13059 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller
janv. 17 16:15:23 asmodee systemd[1]: Starting elasticsearch.service - Elasticsearch...
janv. 17 16:16:13 asmodee systemd[1]: Started elasticsearch.service - Elasticsearch.
Et pour tester
~# curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:_qq9Y30M20MNqQ*GnC+b https://localhost:9200 | jq .
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 531 100 531 0 0 1902 0 --:--:-- --:--:-- --:--:-- 1903
{
"name": "ENED001",
"cluster_name": "Enedwaith.Org",
"cluster_uuid": "DlTJsaH0RNGLjlsANIx8gw",
"version": {
"number": "9.2.4",
"build_flavor": "default",
"build_type": "deb",
"build_hash": "dfc5c38614c29a598e132c035b66160d3d350894",
"build_date": "2026-01-08T22:07:25.170027027Z",
"build_snapshot": false,
"lucene_version": "10.3.2",
"minimum_wire_compatibility_version": "8.19.0",
"minimum_index_compatibility_version": "8.0.0"
},
"tagline": "You Know, for Search"
}
Conclusion
Il n’y a rien de compliqué, mais il faut bien établir les étapes de l’installation pour s’assurer d’avoir une configuration fiable et stable; sans bidouille en somme ;).
L’étape suivant sera de sécuriser l’installation (utiliser des certificat qui ne soit pas des certificat auto-générés) et de faire l’installation et la configuration de Kibana.