Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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éthodePour quiAvantagesInconvénients
Serveur Linux installé à la main (Debian, Ubuntu)Production, épreuve E6 SISR, compréhension fineTu maîtrises chaque composant, chaque fichier de configurationPlus long ; mises à jour de PHP et de GLPI à suivre toi-même
Docker avec l'image officielle glpi/glpiTP, maquette, petite production bien sauvegardéeOpérationnel en quelques minutes, version identique pour toute la classeIl 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 serveurRien à installer ni à mettre à jourPayant ; 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émentGLPI 11GLPI 12
PHP8.2 minimum8.3 minimum
MariaDB10.6 minimum10.11 minimum
MySQL8.0 minimum8.0 minimum
Serveur webApache 2, Nginx, lighttpd ou IIS, racine du site sur le dossier publicIdem

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 :

bash
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) :

bash
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.

sql
-- 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 :

bash
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 :

bash
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.

ContenuEmplacement recommandéConstante de GLPI
Application/var/www/glpi—
Configuration (dont les identifiants de la base)/etc/glpiGLPI_CONFIG_DIR
Données : documents, images, cache, sessions/var/lib/glpi/filesGLPI_VAR_DIR
Plugins installés depuis le marketplace/var/lib/glpi/pluginsGLPI_MARKETPLACE_DIR
Journaux/var/log/glpiGLPI_LOG_DIR
bash
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
<?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
<?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.

bash
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 :

apache
<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 :

bash
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 :

ini
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 :

  1. Langue : Français.
  2. Licence : la GPL v3, à accepter.
  3. Installation ou mise à jour : Installer.
  4. Vérification des prérequis : chaque ligne doit être verte. Une ligne rouge bloque, une ligne orange est une recommandation.
  5. Connexion à la base : serveur localhost, utilisateur glpi et son mot de passe.
  6. Choix de la base : sélectionne glpi, que tu as créée.
  7. Initialisation : GLPI crée les tables et les données par défaut. Laisse-le travailler.
  8. Statistiques d'utilisation : l'envoi de télémétrie au projet est facultatif.
  9. 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 :

bash
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.

  1. Supprimer le script d'installation, qui permettrait sinon de réinstaller par-dessus ta base :

    bash
    sudo rm /var/www/glpi/install/install.php
    
  2. 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) :

    IdentifiantMot de passe par défautProfil
    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.

  3. 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.

  4. 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.php
    

    puis 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).

  5. 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) :

bash
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 :

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:
bash
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).

CommandeEffetDonnées
docker compose stop / startArrête ou relance les conteneursConservées
docker compose downSupprime les conteneurs (pas les volumes)Conservées
docker compose up -d après un changement de version de l'imageRecrée le conteneur ; l'image met à jour la base si besoinConservées, mais sauvegarde avant
docker compose down -vSupprime aussi les volumesPerdues définitivement

Les erreurs d'installation fréquentes

SymptômeCause probableCorrection
Toutes les pages sauf l'accueil répondent « 404 Not Found »Module rewrite non activé, ou règles de réécriture absentesa2enmod 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/publicCorriger DocumentRoot
Une ligne rouge sur une extension PHP aux prérequisPaquet php-… manquantInstaller le paquet, recharger Apache, relancer la vérification
« Accès refusé » à l'écran de connexion à la baseMauvais 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 horairesFuseaux 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éesLire /var/log/glpi/php-errors.log et /var/log/apache2/glpi-error.log
Les notifications ne partent jamaisCron absent, ou actions automatiques restées en mode GLPIÉtape 6, point 4
Les agents n'envoient rienURL de l'application fausse, certificat non reconnu, pare-feuChapitre 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.

  1. Debian 12, PHP 8.2, MariaDB 10.11.
  2. Debian 13, PHP 8.4, MariaDB 11.8.
  3. Ubuntu 24.04, PHP 8.3, MariaDB 10.11.
  4. Une distribution récente avec PHP 8.4 et MariaDB 10.6.
Voir la réponseMasquer la réponse de l'exercice 1
  1. Non : PHP 8.2 est sous le minimum de GLPI 12 (8.3). Cette machine convient en revanche à GLPI 11.
  2. Oui : PHP 8.4 et MariaDB 11.8 dépassent les minimums.
  3. Oui : PHP 8.3 et MariaDB 10.11 sont exactement les minimums.
  4. 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.

apache
<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
  1. Racine sur /var/www/glpi au 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é.
  2. 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 ».
  3. HTTP sur le port 80 sans HTTPS : identifiants, cookies de session et inventaires circulent en clair sur le réseau.
  4. GRANT ALL PRIVILEGES ON *.* donne au compte de GLPI tous les droits sur toutes les bases du serveur. Il faut ON 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.

  1. docker compose stop, puis docker compose start.
  2. docker compose down, puis docker compose up -d.
  3. Elle remplace glpi/glpi:12.0 par une version plus récente dans compose.yaml, puis docker compose up -d.
  4. docker compose down -v, puis docker compose up -d.
  5. Même question que 2, si son fichier ne déclarait aucun volume.
Voir la réponseMasquer la réponse de l'exercice 4
  1. Oui : les conteneurs sont seulement arrêtés.
  2. Oui : les conteneurs sont supprimés et recréés, mais les données sont dans les volumes glpi_data et db_data.
  3. 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.
  4. Non : -v supprime les volumes ; elle repart d'un GLPI vierge.
  5. 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 :

  1. La page des prérequis est entièrement verte (system:check_requirements).
  2. GLPI répond en HTTPS avec un certificat reconnu par les postes, et HTTP redirige vers HTTPS.
  3. La racine du site est le dossier public (aucune alerte de sécurité sur la page d'accueil).
  4. install/install.php est supprimé.
  5. Les comptes glpi, tech, normal et post-only sont désactivés ou ont un mot de passe changé ; les administrateurs ont des comptes nominatifs avec la double authentification.
  6. L'URL de l'application est renseignée.
  7. Le cron tourne : la colonne « dernière exécution » des actions automatiques se met à jour.
  8. Un courriel de test part (Configuration > Notifications, configuration des courriels).
  9. 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é ?

Chapitre terminé !

Fais les 5 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Entités, profils et habilitations dans GLPIRevoir le sommaire du cours