</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.
Stack technologique
Isolation des services, reproductibilité, réseau interne sécurisé, mises à jour simplifiées.
ITSM open-source : ticketing, inventaire parc, base de connaissance, gestion des utilisateurs.
Supervision complète hôtes/services, alerting configurable, tableaux de bord personnalisables.
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 dansdocker-compose.yml. - Certificats SSL : autosignés en test, AC valide recommandée en production.
Phases du projet
- Recherche — Analyse des besoins, choix des technologies, étude des risques.
- Développement — Rédaction des fichiers Compose/.env, configuration NGINX/SSL, tests.
- 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.
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"
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.
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é.
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 passsl_certificatenissl_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
.envn'était pas commis dans le dépôt. - Solution : créer un
.env.examplecommis, puiscp .env.example .envet relancer.
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
| 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 —