Chapitre 224 minIntermédiaire
Installer GLPI 12 sur Debian ou avec Docker
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- vérifier qu'un serveur remplit les prérequis de GLPI 12 ;
- installer GLPI sur Debian 13 avec Apache et MariaDB ;
- lancer GLPI avec l'image Docker officielle sans perdre de données ;
- faire les gestes de sécurité qui suivent toute installation.
5 exercices corrigés
Installer GLPI, c'est mettre en place un serveur web avec PHP et une base MariaDB ou MySQL, y déposer l'application, puis lancer l'assistant d'installation qui crée les tables. Ce chapitre déroule une installation propre de GLPI 12 sur Debian 13, telle qu'on la fait en production, puis la variante Docker, plus rapide pour un TP. Il se termine par les gestes de sécurité à faire avant toute utilisation et par les erreurs les plus fréquentes.
Choisir sa méthode d'installation
| Méthode | Pour qui | Avantages | Inconvénients |
|---|---|---|---|
| Serveur Linux installé à la main (Debian, Ubuntu) | Production, épreuve E6 SISR, compréhension fine | Tu maîtrises chaque composant, chaque fichier de configuration | Plus long ; mises à jour de PHP et de GLPI à suivre toi-même |
Docker avec l'image officielle glpi/glpi | TP, maquette, petite production bien sauvegardée | Opérationnel en quelques minutes, version identique pour toute la classe | Il faut comprendre les volumes pour ne pas perdre les données |
| GLPI Network Cloud (offre hébergée de Teclib') | Organisation qui ne veut pas gérer de serveur | Rien à installer ni à mettre à jour | Payant ; moins de choses à montrer à un jury SISR |
Pour ton portfolio, l'installation à la main est la plus parlante : elle prouve que tu sais monter un service sur un serveur libre. Pour t'entraîner sur les écrans des chapitres suivants, Docker suffit.
Les prérequis de GLPI 12
GLPI vérifie ses prérequis au début de l'installation et refuse de continuer s'il en manque un. Autant les connaître avant de choisir le système.
| Élément | GLPI 11 | GLPI 12 |
|---|---|---|
| PHP | 8.2 minimum | 8.3 minimum |
| MariaDB | 10.6 minimum | 10.11 minimum |
| MySQL | 8.0 minimum | 8.0 minimum |
| Serveur web | Apache 2, Nginx, lighttpd ou IIS, racine du site sur le dossier public | Idem |
Extensions PHP obligatoires : bcmath, ctype, curl, dom, fileinfo, filter, gd, iconv, intl, json, libxml, mbstring, mysqli, openssl, session, simplexml, tokenizer, zlib. Recommandées : ldap (annuaire), sodium (chiffrement des données sensibles en base), zip et bz2 (plugins du marketplace), exif, et OPcache pour les performances.
Ce tableau a une conséquence pratique : Debian 12 fournit PHP 8.2, ce qui suffit pour GLPI 11 mais pas pour GLPI 12. Debian 13 (PHP 8.4, MariaDB 11.8) et Ubuntu 24.04 (PHP 8.3) conviennent à GLPI 12 avec leurs paquets standard.
Étape 1 : préparer le serveur Debian 13
Sur une Debian 13 fraîchement installée, à jour, avec une adresse IP fixe et un nom DNS (glpi.cedre.lan chez Cèdre Habitat), installe le serveur web, la base et PHP avec ses extensions :
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y apache2 mariadb-server libapache2-mod-php \
php-curl php-gd php-intl php-mysql php-xml php-mbstring php-bcmath \
php-zip php-bz2 php-ldap
php -v # doit afficher PHP 8.4.x
Les extensions ctype, fileinfo, iconv, openssl, session, tokenizer, zlib et sodium sont déjà compilées dans le paquet PHP de Debian : rien à ajouter. Sécurise ensuite MariaDB (mot de passe ou authentification par socket pour root, suppression des comptes anonymes et de la base de test) :
sudo mariadb-secure-installation
Étape 2 : créer la base de données et son compte
GLPI a besoin d'une base vide et d'un compte qui n'a de droits que sur elle. Jamais le compte root : si l'application était compromise, l'attaquant aurait toutes les bases du serveur.
-- sudo mariadb
CREATE DATABASE glpi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'glpi'@'localhost' IDENTIFIED BY 'Un-Mot-De-Passe-Long-Et-Unique';
GRANT ALL PRIVILEGES ON glpi.* TO 'glpi'@'localhost';
-- Lecture des fuseaux horaires, pour que chaque utilisateur voie les heures de son fuseau
GRANT SELECT ON mysql.time_zone_name TO 'glpi'@'localhost';
FLUSH PRIVILEGES;
Les fuseaux horaires ne sont pas chargés par défaut dans MariaDB. Charge-les une fois, depuis le shell :
mariadb-tzinfo-to-sql /usr/share/zoneinfo | sudo mariadb mysql
Le compte est déclaré 'glpi'@'localhost' parce que la base est sur la même machine que GLPI. Si la base est sur un autre serveur, remplace localhost par l'adresse du serveur GLPI, et n'ouvre le port 3306 qu'à cette adresse. Les commandes CREATE USER et GRANT sont détaillées dans le cours SQL.
Étape 3 : télécharger GLPI et ranger ses dossiers
Télécharge l'archive de la dernière version depuis la page des versions du projet sur GitHub, puis décompresse-la dans /var/www :
cd /tmp
wget https://github.com/glpi-project/glpi/releases/download/12.0.1/glpi-12.0.1.tgz
sudo tar -xzf glpi-12.0.1.tgz -C /var/www/ # crée /var/www/glpi
Par défaut, GLPI garde sa configuration (config), ses données (files) et ses plugins dans son propre dossier. La documentation officielle recommande de les sortir de l'arborescence web, selon les conventions de Linux : la configuration dans /etc, les données dans /var/lib, les journaux dans /var/log. Ainsi, une erreur de configuration du serveur web ne pourra jamais exposer ces fichiers, et une mise à jour consistera à remplacer le dossier de l'application sans toucher aux données.
| Contenu | Emplacement recommandé | Constante de GLPI |
|---|---|---|
| Application | /var/www/glpi | — |
| Configuration (dont les identifiants de la base) | /etc/glpi | GLPI_CONFIG_DIR |
| Données : documents, images, cache, sessions | /var/lib/glpi/files | GLPI_VAR_DIR |
| Plugins installés depuis le marketplace | /var/lib/glpi/plugins | GLPI_MARKETPLACE_DIR |
| Journaux | /var/log/glpi | GLPI_LOG_DIR |
sudo mkdir -p /etc/glpi /var/lib/glpi/files /var/lib/glpi/plugins /var/log/glpi
sudo cp -a /var/www/glpi/config/. /etc/glpi/
sudo cp -a /var/www/glpi/files/. /var/lib/glpi/files/
Deux petits fichiers PHP indiquent ensuite à GLPI où chercher. Le premier, /var/www/glpi/inc/downstream.php, désigne le dossier de configuration :
<?php
define('GLPI_CONFIG_DIR', '/etc/glpi/');
if (file_exists(GLPI_CONFIG_DIR . '/local_define.php')) {
require_once GLPI_CONFIG_DIR . '/local_define.php';
}
Le second, /etc/glpi/local_define.php, désigne les dossiers de données, de plugins et de journaux :
<?php
define('GLPI_VAR_DIR', '/var/lib/glpi/files');
define('GLPI_MARKETPLACE_DIR', '/var/lib/glpi/plugins');
define('GLPI_LOG_DIR', '/var/log/glpi');
Enfin, les droits. Le serveur web (l'utilisateur www-data sous Debian) doit pouvoir écrire dans les données, les plugins et les journaux, et dans la configuration pendant l'installation ; le code de l'application, lui, n'a pas à être modifiable par le serveur web.
sudo chown -R root:root /var/www/glpi
sudo chown -R www-data:www-data /etc/glpi /var/lib/glpi /var/log/glpi
Étape 4 : configurer Apache et PHP
La racine du site doit pointer sur le sous-dossier public de GLPI, et toutes les requêtes vers un fichier qui n'existe pas doivent être renvoyées vers index.php, le routeur de l'application. Crée /etc/apache2/sites-available/glpi.conf :
<VirtualHost *:80>
ServerName glpi.cedre.lan
# Tout le trafic en clair est redirigé vers HTTPS
Redirect permanent / https://glpi.cedre.lan/
</VirtualHost>
<VirtualHost *:443>
ServerName glpi.cedre.lan
DocumentRoot /var/www/glpi/public
SSLEngine on
SSLCertificateFile /etc/ssl/certs/glpi.cedre.lan.crt
SSLCertificateKeyFile /etc/ssl/private/glpi.cedre.lan.key
<Directory /var/www/glpi/public>
Require all granted
RewriteEngine On
# Transmettre l'en-tête Authorization à PHP (API, CalDAV)
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Envoyer au routeur de GLPI toute requête qui ne vise pas un fichier existant
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</Directory>
ErrorLog ${APACHE_LOG_DIR}/glpi-error.log
CustomLog ${APACHE_LOG_DIR}/glpi-access.log combined
</VirtualHost>
Active les modules et le site, puis désactive le site par défaut :
sudo a2enmod rewrite ssl
sudo a2ensite glpi.conf
sudo a2dissite 000-default.conf
sudo apachectl configtest && sudo systemctl reload apache2
Le certificat vient de l'autorité de certification interne de l'organisation (ou d'une autorité publique si GLPI est joignable depuis Internet) : le cours Cybersécurité des infrastructures explique comment l'obtenir. Les agents d'inventaire vérifieront ce certificat (chapitre 4).
Côté PHP, GLPI contrôle la sécurité des cookies de session. Dans /etc/php/8.4/apache2/php.ini, règle au minimum :
session.cookie_httponly = On ; le cookie de session n'est pas lisible par JavaScript
session.cookie_secure = On ; il ne circule qu'en HTTPS
session.cookie_samesite = Lax ; il n'est pas envoyé par les requêtes venues d'autres sites
memory_limit = 256M
upload_max_filesize = 20M ; taille maximale d'une pièce jointe
post_max_size = 20M
Recharge Apache après chaque modification de php.ini.
Étape 5 : lancer l'installation
Ouvre https://glpi.cedre.lan dans un navigateur. L'assistant enchaîne les écrans :
- Langue : Français.
- Licence : la GPL v3, à accepter.
- Installation ou mise à jour : Installer.
- Vérification des prérequis : chaque ligne doit être verte. Une ligne rouge bloque, une ligne orange est une recommandation.
- Connexion à la base : serveur
localhost, utilisateurglpiet son mot de passe. - Choix de la base : sélectionne
glpi, que tu as créée. - Initialisation : GLPI crée les tables et les données par défaut. Laisse-le travailler.
- Statistiques d'utilisation : l'envoi de télémétrie au projet est facultatif.
- Fin : l'écran rappelle les quatre comptes par défaut.
La même installation se fait en ligne de commande, ce qui est pratique pour l'automatiser. On lance la console de GLPI avec l'utilisateur du serveur web, pour que les fichiers créés lui appartiennent :
cd /var/www/glpi
sudo -u www-data php bin/console system:check_requirements
sudo -u www-data php bin/console db:install -L fr_FR -H localhost -d glpi -u glpi -p
# -p sans valeur : la console demande le mot de passe, qui n'apparaît pas dans l'historique du shell
sudo -u www-data php bin/console database:enable_timezones
Étape 6 : les gestes de sécurité juste après l'installation
À la première connexion, GLPI affiche des bandeaux d'alerte tant que ces points ne sont pas réglés. Ne les ignore pas : ce sont exactement les questions qu'un jury pose.
-
Supprimer le script d'installation, qui permettrait sinon de réinstaller par-dessus ta base :
sudo rm /var/www/glpi/install/install.php -
Changer les mots de passe des comptes par défaut, connus de tout le monde, ou désactiver ceux qui ne servent pas (Administration > Utilisateurs, champ Actif à Non) :
Identifiant Mot de passe par défaut Profil glpiglpiSuper-Admin techtechTechnician normalnormalObserver post-onlypostonlySelf-Service Le mieux est de créer ton propre compte Super-Admin nominatif, de vérifier qu'il fonctionne, puis de désactiver
glpi: chaque action sera ainsi attribuée à une vraie personne dans l'historique. -
Renseigner l'URL de l'application (
https://glpi.cedre.lan) dans Configuration > Générale, onglet Configuration générale. Les liens des notifications et l'adresse donnée aux agents en dépendent. -
Planifier les actions automatiques. Ajoute une ligne à la crontab de
www-data(sudo crontab -u www-data -e) :* * * * * /usr/bin/php /var/www/glpi/front/cron.phppuis passe les actions en mode CLI dans Configuration > Actions automatiques. Sans cette tâche, les notifications, les alertes de contrats et les rappels de SLA ne partent jamais (chapitre 14).
-
Activer la double authentification pour les comptes d'administration (chapitre 3).
Installer GLPI avec Docker
Le projet publie une image officielle, glpi/glpi, sur Docker Hub. Elle contient le serveur web, PHP et GLPI ; la base tourne dans un second conteneur. Les deux sont décrits dans un fichier compose.yaml, lancé par Docker Compose. Si les notions de conteneur, d'image et de volume sont nouvelles pour toi, commence par le cours Docker.
Dans un dossier ~/glpi, crée le fichier .env, qui contient les identifiants de la base (ne le publie jamais dans un dépôt Git) :
GLPI_DB_HOST=db
GLPI_DB_PORT=3306
GLPI_DB_NAME=glpi
GLPI_DB_USER=glpi
GLPI_DB_PASSWORD=Un-Mot-De-Passe-Long-Et-Unique
puis le fichier compose.yaml :
services:
glpi:
image: glpi/glpi:12.0 # version fixée : pas de mise à jour surprise
restart: unless-stopped
env_file: .env
depends_on:
- db
ports:
- "8080:80" # GLPI sur le port 8080 de la machine
volumes:
- glpi_data:/var/glpi # configuration, documents, plugins
db:
image: mariadb:11.8
restart: unless-stopped
environment:
MARIADB_RANDOM_ROOT_PASSWORD: "yes"
MARIADB_DATABASE: ${GLPI_DB_NAME}
MARIADB_USER: ${GLPI_DB_USER}
MARIADB_PASSWORD: ${GLPI_DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql # les tables de GLPI
volumes:
glpi_data:
db_data:
docker compose up -d # télécharge les images et démarre les deux conteneurs
docker compose ps # les deux services doivent être « running »
docker compose logs -f glpi # suit l'installation automatique
Au premier démarrage, l'image installe GLPI toute seule dans la base décrite par le fichier .env (les variables GLPI_SKIP_AUTOINSTALL et GLPI_SKIP_AUTOUPDATE désactivent ce comportement). Ouvre http://localhost:8080 et connecte-toi avec glpi / glpi, puis fais les gestes de sécurité de l'étape 6 et suis les alertes affichées sur la page d'accueil. Une différence avec l'installation à la main : le cron est déjà intégré au conteneur, qui lance les actions automatiques chaque minute (variable GLPI_CRONTAB_ENABLED).
| Commande | Effet | Données |
|---|---|---|
docker compose stop / start | Arrête ou relance les conteneurs | Conservées |
docker compose down | Supprime les conteneurs (pas les volumes) | Conservées |
docker compose up -d après un changement de version de l'image | Recrée le conteneur ; l'image met à jour la base si besoin | Conservées, mais sauvegarde avant |
docker compose down -v | Supprime aussi les volumes | Perdues définitivement |
Les erreurs d'installation fréquentes
| Symptôme | Cause probable | Correction |
|---|---|---|
| Toutes les pages sauf l'accueil répondent « 404 Not Found » | Module rewrite non activé, ou règles de réécriture absentes | a2enmod rewrite, vérifier le bloc <Directory>, recharger Apache |
| Alerte « la configuration du dossier racine du serveur web n'est pas sûre » | La racine du site pointe sur /var/www/glpi au lieu de /var/www/glpi/public | Corriger DocumentRoot |
| Une ligne rouge sur une extension PHP aux prérequis | Paquet php-… manquant | Installer le paquet, recharger Apache, relancer la vérification |
| « Accès refusé » à l'écran de connexion à la base | Mauvais mot de passe, ou compte déclaré sur un autre hôte ('glpi'@'%' contre 'glpi'@'localhost') | Vérifier avec mariadb -u glpi -p glpi depuis le serveur |
| Alerte sur les fuseaux horaires | Fuseaux non chargés dans MariaDB, ou droit SELECT manquant sur mysql.time_zone_name | Étape 2, puis database:enable_timezones |
| Page blanche ou « erreur interne » | Erreur PHP, souvent des droits sur les dossiers de données | Lire /var/log/glpi/php-errors.log et /var/log/apache2/glpi-error.log |
| Les notifications ne partent jamais | Cron absent, ou actions automatiques restées en mode GLPI | Étape 6, point 4 |
| Les agents n'envoient rien | URL de l'application fausse, certificat non reconnu, pare-feu | Chapitre 4 |
Exercices
Exercice 1 sur 5 Quel serveur pour GLPI 12 ? Réussi À revoir
Thomas dispose de quatre machines virtuelles. Pour chacune, dis si elle peut héberger GLPI 12 avec les paquets standard de son système, et sinon pourquoi.
- Debian 12, PHP 8.2, MariaDB 10.11.
- Debian 13, PHP 8.4, MariaDB 11.8.
- Ubuntu 24.04, PHP 8.3, MariaDB 10.11.
- Une distribution récente avec PHP 8.4 et MariaDB 10.6.
Voir la réponseMasquer la réponse de l'exercice 1
- Non : PHP 8.2 est sous le minimum de GLPI 12 (8.3). Cette machine convient en revanche à GLPI 11.
- Oui : PHP 8.4 et MariaDB 11.8 dépassent les minimums.
- Oui : PHP 8.3 et MariaDB 10.11 sont exactement les minimums.
- Non : MariaDB 10.6 est sous le minimum de GLPI 12 (10.11). Il faut mettre à jour MariaDB, ou utiliser MySQL 8.0 ou plus.
Tu avais trouvé ?
Exercice 2 sur 5 Trouver les erreurs Réussi À revoir
Un camarade a installé GLPI et te montre sa configuration. Relève les quatre erreurs et donne leur conséquence.
<VirtualHost *:80>
ServerName glpi.lab.lan
DocumentRoot /var/www/glpi
<Directory /var/www/glpi>
Require all granted
</Directory>
</VirtualHost>
Il a aussi créé le compte de base avec GRANT ALL PRIVILEGES ON *.* TO 'glpi'@'localhost' et lancé chmod -R 777 /var/www/glpi.
Voir la réponseMasquer la réponse de l'exercice 2
- Racine sur
/var/www/glpiau lieu de/var/www/glpi/public: les fichiers internes (configuration, journaux si on ne les a pas déplacés) peuvent devenir accessibles depuis le navigateur. GLPI affiche une alerte de sécurité. - Pas de règles de réécriture vers
index.php: le routeur de GLPI ne reçoit pas les requêtes, une bonne partie des pages répond « 404 ». - HTTP sur le port 80 sans HTTPS : identifiants, cookies de session et inventaires circulent en clair sur le réseau.
GRANT ALL PRIVILEGES ON *.*donne au compte de GLPI tous les droits sur toutes les bases du serveur. Il fautON glpi.*(moindre privilège).
Et chmod -R 777 rend le code et la configuration modifiables par n'importe quel processus de la machine : il faut rendre le code à root et donner seulement les dossiers de données, de plugins et de journaux à www-data.
Tu avais trouvé ?
Exercice 3 sur 5 Remettre les étapes dans l'ordre Réussi À revoir
Range ces actions dans l'ordre d'une installation à la main : (a) supprimer install/install.php ; (b) créer la base et le compte glpi ; (c) installer Apache, MariaDB et PHP ; (d) lancer db:install ou l'assistant web ; (e) créer le site Apache avec la racine sur public ; (f) ajouter la ligne de cron ; (g) décompresser l'archive et déplacer config et files ; (h) changer les mots de passe des comptes par défaut.
Voir la réponseMasquer la réponse de l'exercice 3
c, b, g, e, d, a, h, f. On prépare les logiciels (c), la base (b), les fichiers de GLPI (g) et le site web (e) ; on installe (d) ; puis on sécurise (a, h) et on planifie les actions automatiques (f). Les trois derniers gestes peuvent s'échanger, mais aucun ne doit attendre le lendemain.
Tu avais trouvé ?
Exercice 4 sur 5 Volumes Docker Réussi À revoir
Sarah a lancé GLPI avec Docker et saisi trente ordinateurs. Pour chaque commande, dis si ses fiches survivent.
docker compose stop, puisdocker compose start.docker compose down, puisdocker compose up -d.- Elle remplace
glpi/glpi:12.0par une version plus récente danscompose.yaml, puisdocker compose up -d. docker compose down -v, puisdocker compose up -d.- Même question que 2, si son fichier ne déclarait aucun volume.
Voir la réponseMasquer la réponse de l'exercice 4
- Oui : les conteneurs sont seulement arrêtés.
- Oui : les conteneurs sont supprimés et recréés, mais les données sont dans les volumes
glpi_dataetdb_data. - Oui : le nouveau conteneur retrouve les volumes et met la base à jour. Elle doit quand même faire une sauvegarde avant, car une mise à jour de base ne se défait pas.
- Non :
-vsupprime les volumes ; elle repart d'un GLPI vierge. - Non : sans volume, les données vivaient dans les conteneurs supprimés par
down.
Tu avais trouvé ?
Exercice 5 sur 5 La liste de contrôle de la mise en service Réussi À revoir
Inès demande à Sarah une liste de contrôle à cocher avant d'ouvrir GLPI aux utilisateurs. Propose au moins sept vérifications.
Voir la réponseMasquer la réponse de l'exercice 5
Exemple de liste :
- La page des prérequis est entièrement verte (
system:check_requirements). - GLPI répond en HTTPS avec un certificat reconnu par les postes, et HTTP redirige vers HTTPS.
- La racine du site est le dossier
public(aucune alerte de sécurité sur la page d'accueil). install/install.phpest supprimé.- Les comptes
glpi,tech,normaletpost-onlysont désactivés ou ont un mot de passe changé ; les administrateurs ont des comptes nominatifs avec la double authentification. - L'URL de l'application est renseignée.
- Le cron tourne : la colonne « dernière exécution » des actions automatiques se met à jour.
- Un courriel de test part (Configuration > Notifications, configuration des courriels).
- La base et le dossier des données sont sauvegardés chaque nuit, et une restauration a été testée (chapitre 14).
Tu avais trouvé ?