# Chapitre 2 - Installation de GLPI

Installation du serveur, de la base de données, de PHP et d’Apache.

# Installation d’Apache, PHP et MariaDB

## 3.1 Installer Apache, MariaDB et PHP

```bash
sudo apt install -y \
  apache2 mariadb-server cron \
  libapache2-mod-php8.2 \
  php8.2 php8.2-cli php8.2-common php8.2-opcache \
  php8.2-mysql php8.2-curl php8.2-gd php8.2-intl \
  php8.2-bcmath php8.2-mbstring php8.2-xml \
  php8.2-zip php8.2-bz2 php8.2-ldap php8.2-apcu \
  curl wget ca-certificates tar unzip ldap-utils netcat-openbsd
```

Activer et démarrer les services :

```bash
sudo systemctl enable --now apache2 mariadb
sudo systemctl status apache2 mariadb --no-pager
```

Contrôler PHP :

```bash
php -v
php -m | sort
```

Les modules importants doivent inclure au minimum `bcmath`, `curl`, `dom`, `fileinfo`, `gd`, `intl`, `mbstring`, `mysqli`, `openssl`, `session`, `xml` et `zlib`.

---

## 3.2 Sécuriser MariaDB

```bash
sudo mariadb-secure-installation
```

Recommandations :

- supprimer les utilisateurs anonymes ;
- interdire la connexion distante de `root` ;
- supprimer la base de test ;
- recharger les privilèges.

Sur Debian, le compte MariaDB `root` utilise généralement l’authentification locale par socket. Il n’est pas obligatoire de lui attribuer un mot de passe si l’accès administrateur se fait avec `sudo mariadb`.

---

> Documentation GLPI 11 — Debian 12, Apache, PHP 8.2 et MariaDB.

# Base de données et fuseaux horaires

## 3.3 Créer la base GLPI

Ouvrir MariaDB :

```bash
sudo mariadb
```

Exécuter les requêtes suivantes en remplaçant le mot de passe :

```sql
CREATE DATABASE glpi
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

CREATE USER 'glpi'@'localhost'
  IDENTIFIED BY 'MOT_DE_PASSE_BDD_TRES_LONG';

GRANT ALL PRIVILEGES ON glpi.* TO 'glpi'@'localhost';

FLUSH PRIVILEGES;
EXIT;
```

Tester le compte :

```bash
mariadb -u glpi -p -e "SHOW DATABASES;"
```

Le compte doit voir la base `glpi`.

---

## 3.4 Charger les fuseaux horaires dans MariaDB

Cette étape permet à GLPI de proposer correctement les fuseaux horaires :

```bash
sudo mysql_tzinfo_to_sql /usr/share/zoneinfo | sudo mariadb mysql
sudo systemctl restart mariadb
```

Vérification :

```bash
sudo mariadb mysql -e \
  "SELECT Name FROM time_zone_name WHERE Name='Europe/Paris';"
```

Avec GLPI 11, il ne faut pas accorder au compte applicatif des droits globaux sur les tables système MariaDB.

---

> Documentation GLPI 11 — Debian 12, Apache, PHP 8.2 et MariaDB.

# Téléchargement et organisation des répertoires

## 3.5 Télécharger GLPI

Toujours télécharger l’archive officielle `glpi-VERSION.tgz`. Les archives GitHub nommées **Source code** ne contiennent pas toutes les dépendances nécessaires et ne doivent pas être utilisées.

```bash
cd /tmp
GLPI_VERSION="11.0.8"
wget "https://github.com/glpi-project/glpi/releases/download/${GLPI_VERSION}/glpi-${GLPI_VERSION}.tgz"
tar -xzf "glpi-${GLPI_VERSION}.tgz"
sudo mv glpi /var/www/glpi
```

Vérifier la présence des fichiers :

```bash
ls -la /var/www/glpi
ls -la /var/www/glpi/public
```

---

## 3.6 Séparer le code, la configuration et les données

Créer les répertoires persistants :

```bash
sudo mkdir -p \
  /etc/glpi \
  /var/lib/glpi/files \
  /var/lib/glpi/marketplace \
  /var/log/glpi
```

Copier les données initiales :

```bash
sudo cp -a /var/www/glpi/config/. /etc/glpi/
sudo cp -a /var/www/glpi/files/. /var/lib/glpi/files/
```

Créer `/var/www/glpi/inc/downstream.php` :

```bash
sudo tee /var/www/glpi/inc/downstream.php >/dev/null <<'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';
}
PHP
```

Créer `/etc/glpi/local_define.php` :

```bash
sudo tee /etc/glpi/local_define.php >/dev/null <<'PHP'
<?php
define('GLPI_VAR_DIR', '/var/lib/glpi/files');
define('GLPI_LOG_DIR', '/var/log/glpi');
define('GLPI_MARKETPLACE_DIR', '/var/lib/glpi/marketplace');
PHP
```

Appliquer les permissions :

```bash
sudo chown -R root:root /var/www/glpi
sudo find /var/www/glpi -type d -exec chmod 0755 {} \;
sudo find /var/www/glpi -type f -exec chmod 0644 {} \;

sudo chown -R www-data:www-data \
  /etc/glpi \
  /var/lib/glpi \
  /var/log/glpi

sudo find /etc/glpi /var/lib/glpi /var/log/glpi \
  -type d -exec chmod 0750 {} \;
sudo find /etc/glpi /var/lib/glpi /var/log/glpi \
  -type f -exec chmod 0640 {} \;
```

Le code de GLPI est en lecture seule pour Apache. Les répertoires contenant la configuration, les documents, le cache, les journaux et la Marketplace restent accessibles en écriture à `www-data`.

---

> Documentation GLPI 11 — Debian 12, Apache, PHP 8.2 et MariaDB.

# Configuration de PHP et Apache

## 3.7 Configurer PHP

Créer `/etc/php/8.2/apache2/conf.d/99-glpi.ini` :

```bash
sudo tee /etc/php/8.2/apache2/conf.d/99-glpi.ini >/dev/null <<'INI'
date.timezone = Europe/Paris
memory_limit = 512M
max_execution_time = 600
max_input_vars = 5000
post_max_size = 64M
upload_max_filesize = 64M

session.cookie_httponly = On
session.cookie_samesite = Lax

opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
INI
```

Lorsque l’instance est accessible uniquement en HTTPS, ajouter :

```ini
session.cookie_secure = On
```

Redémarrer Apache :

```bash
sudo systemctl restart apache2
```

Contrôler les valeurs chargées :

```bash
php -i | grep -E \
  'date.timezone|memory_limit|upload_max_filesize|post_max_size'
```

---

## 3.8 Configurer le VirtualHost Apache

Créer `/etc/apache2/sites-available/glpi.conf` :

```apache
<VirtualHost *:80>
    ServerName glpi.dreamsaphir.fr

    DocumentRoot /var/www/glpi/public

    <Directory /var/www/glpi/public>
        Options FollowSymLinks
        AllowOverride None
        Require all granted

        RewriteEngine On

        # Transmettre l'en-tête Authorization à GLPI.
        RewriteCond %{HTTP:Authorization} ^(.+)$
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

        # Envoyer les requêtes vers le routeur GLPI,
        # sauf lorsqu'un fichier existe réellement.
        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>
```

Activer le site et la réécriture :

```bash
sudo a2enmod rewrite
sudo a2ensite glpi.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
```

Le résultat de `apache2ctl configtest` doit être :

```text
Syntax OK
```

---

> Documentation GLPI 11 — Debian 12, Apache, PHP 8.2 et MariaDB.

# Finalisation de l’installation et comptes par défaut

## 3.9 Vérifier les prérequis GLPI

Toujours lancer les commandes de la console GLPI avec le compte du serveur Web afin d’éviter la création de fichiers appartenant à `root` :

```bash
cd /var/www/glpi
sudo -u www-data php bin/console glpi:system:check_requirements
```

Corriger toutes les erreurs obligatoires avant de poursuivre.

---

## 3.10 Terminer l’installation depuis le navigateur

Ouvrir :

```text
http://glpi.dreamsaphir.fr
```

Puis :

1. choisir le français ;
2. accepter la licence ;
3. sélectionner **Installer** ;
4. saisir le serveur MariaDB `localhost` ;
5. saisir l’utilisateur `glpi` et son mot de passe ;
6. sélectionner la base `glpi` ;
7. terminer l’installation.

### Installation alternative en ligne de commande

```bash
cd /var/www/glpi
sudo -u www-data php bin/console db:install \
  --default-language=fr_FR \
  --db-host=localhost \
  --db-name=glpi \
  --db-user=glpi \
  --db-password
```

L’option `--db-password` sans valeur demande le mot de passe de façon interactive et évite de l’enregistrer dans l’historique du shell.

---

## 3.11 Comptes créés par défaut

| Identifiant | Mot de passe initial | Profil |
|---|---|---|
| `glpi` | `glpi` | Super-Admin |
| `tech` | `tech` | Technicien |
| `normal` | `normal` | Utilisateur |
| `post-only` | `postonly` | Libre-service |

Immédiatement après la première connexion :

1. créer un compte administrateur nominatif ;
2. tester ce nouveau compte ;
3. changer le mot de passe du compte `glpi` et le désactiver si possible ;
4. supprimer ou désactiver les comptes `tech`, `normal` et `post-only` s’ils ne sont pas utilisés ;
5. activer l’authentification multifacteur pour les comptes privilégiés.

Il peut être utile de conserver un compte administrateur local de secours, avec un mot de passe long conservé dans un coffre-fort et utilisé uniquement en cas de panne de l’annuaire.

---

---

> Documentation GLPI 11 — Debian 12, Apache, PHP 8.2 et MariaDB.