</Introduction>

Contexte Déployer une solution de gestion de parc (GLPI) et de supervision réseau (Zabbix) sécurisée, en limitant le temps d'intégration grâce à Docker. Ce projet s'inscrit dans le cadre du BTS SIO option SISR.

Objectifs du projet :

  • Objectif principal : Mettre en place une infrastructure GLPI + Zabbix sécurisée, maintenable et documentée.
  • Objectifs secondaires :
    • Normaliser l'installation et les mises à jour via Docker Compose.
    • Sécuriser les accès par HTTPS et isoler les services dans un réseau Docker interne.
    • Documenter une procédure claire et réplicable (PPE).
    • Séparer les bases de données GLPI et Zabbix.
💡 Docker permet d'encapsuler chaque service dans un conteneur isolé. Les mises à jour, redémarrages et sauvegardes deviennent ainsi beaucoup plus simples à gérer qu'avec des installations classiques.

Stack technologique

🐳 Docker

Isolation des services, reproductibilité, réseau interne sécurisé, mises à jour simplifiées.

🎫 GLPI

ITSM open-source : ticketing, inventaire parc, base de connaissance, gestion des utilisateurs.

📡 Zabbix

Supervision complète hôtes/services, alerting configurable, tableaux de bord personnalisables.

🔒 NGINX

Reverse proxy, terminaison SSL, seul point d'entrée exposé (ports 80/443).

</Méthodologie>

Accessibilité et Professionnalisme

  • Besoins du client : accès simple aux consoles web GLPI/Zabbix, image professionnelle, sécurité renforcée.
  • Compétences utilisateurs : hétérogènes — procédure écrite et automatisation nécessaires.
  • Budget : priorité à des composants open-source et au temps d'intégration réduit grâce à Docker.

Considérations de Sécurité

  • Séparation des bases : deux instances MariaDB indépendantes (GLPI / Zabbix).
  • Réseau Docker interne : aucun port applicatif n'est exposé directement.
  • NGINX seul point d'entrée : gère SSL et la redirection 80 → 443.
  • Variables sensibles : stockées dans le fichier .env, jamais en dur dans docker-compose.yml.
  • Certificats SSL : autosignés en test, AC valide recommandée en production.

Phases du projet

  1. Recherche — Analyse des besoins, choix des technologies, étude des risques.
  2. Développement — Rédaction des fichiers Compose/.env, configuration NGINX/SSL, tests.
  3. Présentation — Démonstration fonctionnelle, documentation, passation.

</Déploiement>

Architecture de la Plateforme

L'infrastructure repose sur 5 conteneurs communiquant via un réseau Docker interne :

  • nginx:alpine — Reverse proxy, terminaison SSL, ports 80 et 443 exposés.
  • glpi/glpi:latest — Application GLPI (PHP/Apache).
  • mariadb:10.11 ×2 — Une instance dédiée GLPI, une dédiée Zabbix.
  • zabbix-server-mysql — Serveur Zabbix (collecte des données).
  • zabbix-web-nginx-mysql — Interface web Zabbix.
Architecture Docker

Figure 1 — Architecture Docker : NGINX reverse proxy + GLPI + Zabbix + MariaDB (réseau interne)


Installation de l'environnement

Installation de Docker

apt update && apt install -y docker.io docker-compose-plugin
systemctl enable --now docker
docker --version && docker compose version

Arborescence du projet

mkdir -p glpi-zabbix/{nginx/conf.d,ssl,glpi,mariadb-glp,mariadb-zbx,zabbix}
cd glpi-zabbix

Configuration SSL

Génération d'un certificat autosigné (test)

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ssl/key.pem -out ssl/cert.pem \
    -subj "/CN=10.0.30.11/O=PPE-SISR/C=FR"
⚠ En production, remplacer par un certificat Let's Encrypt (certbot) ou un certificat signé par une AC interne.

Fichier .env

# .env — NE PAS COMMITTER CE FICHIER
GLPI_DB_PASSWORD=ChangeMe123!
ZBX_DB_PASSWORD=ChangeMe456!

docker-compose.yml

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./ssl:/etc/nginx/ssl
    networks: [internal]

  glpi:
    image: glpi/glpi:latest
    environment:
      - DB_HOST=mariadb-glp
      - DB_NAME=glpi
      - DB_USER=glpi_user
      - DB_PASSWORD=${GLPI_DB_PASSWORD}
    volumes: [./glpi:/var/www/html]
    networks: [internal]
    depends_on: [mariadb-glp]

  mariadb-glp:
    image: mariadb:10.11
    environment:
      - MYSQL_ROOT_PASSWORD=${GLPI_DB_PASSWORD}
      - MYSQL_DATABASE=glpi
      - MYSQL_USER=glpi_user
      - MYSQL_PASSWORD=${GLPI_DB_PASSWORD}
    volumes: [./mariadb-glp:/var/lib/mysql]
    networks: [internal]

  zabbix-server:
    image: zabbix/zabbix-server-mysql:latest
    environment:
      - DB_SERVER_HOST=mariadb-zbx
      - DB_SERVER_DBNAME=zabbix
      - DB_SERVER_USER=zabbix
      - DB_SERVER_PASSWORD=${ZBX_DB_PASSWORD}
    volumes: [./zabbix:/var/lib/zabbix]
    networks: [internal]
    depends_on: [mariadb-zbx]

  mariadb-zbx:
    image: mariadb:10.11
    environment:
      - MYSQL_ROOT_PASSWORD=${ZBX_DB_PASSWORD}
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=${ZBX_DB_PASSWORD}
    volumes: [./mariadb-zbx:/var/lib/mysql]
    networks: [internal]

  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:latest
    environment:
      - DB_SERVER_HOST=mariadb-zbx
      - DB_SERVER_DBNAME=zabbix
      - DB_SERVER_USER=zabbix
      - DB_SERVER_PASSWORD=${ZBX_DB_PASSWORD}
    networks: [internal]
    depends_on: [zabbix-server]

networks:
  internal:
    driver: bridge

Configuration NGINX — Redirection HTTPS

# nginx/conf.d/default.conf
server {
    listen 80;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    ssl_certificate     /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    location /glpi/ {
        proxy_pass http://glpi/;
        proxy_set_header Host $host;
    }
    location /zabbix/ {
        proxy_pass http://zabbix-web/;
        proxy_set_header Host $host;
    }
}

Mise en service

# Lancer tous les conteneurs
docker compose up -d

# Vérifier l'état
docker compose ps

# Consulter les logs NGINX
docker compose logs -f nginx

# Accès aux interfaces
# GLPI   → https://10.0.30.11/glpi
# Zabbix → https://10.0.30.11/zabbix

</Résultats>

Interface GLPI

GLPI est accessible via HTTPS. Le tableau de bord présente en temps réel les tickets ouverts, l'inventaire matériel et les indicateurs clés de gestion du parc.

Interface GLPI

Figure 2 — Interface GLPI : tableau de bord tickets & inventaire

Interface Zabbix

Zabbix supervise les hôtes et services de l'infrastructure. Les problèmes sont remontés en temps réel avec leur niveau de sévérité.

Interface Zabbix

Figure 3 — Interface Zabbix : tableau de bord supervision & alertes


Analyse des résultats

  • Isolation réussie : chaque service tourne dans son propre conteneur.
  • SSL opérationnel : redirection 80 → 443 fonctionnelle, certificat appliqué.
  • Bases séparées : aucune interférence entre GLPI et Zabbix.
  • Procédure réplicable : redéploiement possible en moins de 15 minutes.

Problèmes Rencontrés

SSL_ERROR_RX_RECORD_TOO_LONG

  • Cause : le bloc server { listen 443 ssl; } ne contenait pas ssl_certificate ni ssl_certificate_key.
  • Solution : ajouter ces deux directives dans le bloc 443.
server {
    listen 443 ssl;
    ssl_certificate     /etc/nginx/ssl/cert.pem;   # ← manquant
    ssl_certificate_key /etc/nginx/ssl/key.pem;    # ← manquant
    ...
}

Variables .env manquantes

  • Cause : le fichier .env n'était pas commis dans le dépôt.
  • Solution : créer un .env.example commis, puis cp .env.example .env et relancer.
💡 La flexibilité est une compétence clé. Les erreurs SSL proviennent souvent d'une configuration incomplète. Toujours vérifier les logs avec docker compose logs nginx.

</Conclusion>

Bilan du projet :
Le déploiement de GLPI et Zabbix via Docker s'est révélé une approche efficace et professionnelle. Les objectifs fixés ont tous été atteints : isolation des services, sécurisation HTTPS, bases de données séparées et procédure documentée et reproductible.

Perspectives d'avenir

  • Let's Encrypt — Remplacer le certificat autosigné par Certbot.
  • Haute disponibilité — Load balancer et répliques MariaDB.
  • Durcissement sécurité — Restreindre les ports entre conteneurs, pare-feu applicatif.
  • Sauvegarde automatique — Dumps MariaDB quotidiens vers stockage externe.
  • CI/CD — Automatiser les mises à jour via GitHub Actions.

Annexes — Identifiants par défaut

⚠ Ces identifiants doivent être modifiés immédiatement après le premier lancement.
Service Identifiant Remarque
GLPI (admin) [Créer au 1er lancement] Changer immédiatement le MDP
Zabbix (Admin) Admin / zabbix Changer immédiatement le MDP
MariaDB GLPI glpi_user / (env) Variable dans .env
MariaDB Zabbix zabbix / (env) Variable dans .env

Commandes de référence rapide

docker compose up -d           # Démarrer
docker compose down            # Arrêter
docker compose ps              # Statut
docker compose logs -f nginx   # Logs NGINX
docker compose pull && docker compose up -d  # Mettre à jour

— Fin du document —