--- type: exo id: E-347-ep2-training-telegraph-php title: "EP2 entraînement — Télégraphe PHP: Nginx + PHP-FPM + MariaDB" seq: SEQ-07 order: 30 method: exercice align_ict: ["ICT-347.2", "ICT-347.4", "ICT-347.5"] goals: - "Déployer une application PHP existante en multi-conteneurs" - "Exposer un endpoint d’ingestion fiable côté PHP-FPM" - "Assurer la persistance et la traçabilité des impulsions dans la base" success_criteria: "Application accessible via Nginx, endpoint d’ingestion fonctionnel, enregistrements visibles après redémarrage, healthcheck DB et dépendances opérationnels" duree: "90min" materiel: ["Docker Engine", "Docker Compose", "Editeur de texte", "Navigateur web"] --- # EP2-Training Vous disposez d’une application PHP existante de télégraphe : - L’utilisateur clique une image de télégraphe. - Le JavaScript client code les impulsions en bits (0 ou 1) selon la durée. - Le backend PHP reçoit la requête et enregistre les données en base de données. Votre mission : conteneuriser et exécuter cette application à l’aide de **Docker Compose**, avec : - **Nginx** pour le frontal web, - **PHP-FPM** pour le backend, - **MySQL** pour la persistance. Merci de commencer par télécharger ces ressources : [📥 Télegraphe à dockeriser (ZIP)](ressources/telegraph_a_dockeriser.zip) [📥 Nginx config file (CONF)](ressources/default.conf.txt) (⚠️ à renommer en default.conf après télechargement) [📥 PHP initialisation file (INI)](ressources/php.ini) --- ## Spécifications techniques ### 1. Service `db` (MySQL) - Image : `mysql:latest` - Variables d’environnement : - `MYSQL_DATABASE=db_telegraph` - `MYSQL_ROOT_PASSWORD=root` - d'autres variables ? - Volume nommé : `db_data:/var/lib/mysql` - Réseau : `backend` - Redémarrage : `always` - Healthcheck : ```yaml healthcheck: test: ["CMD-SHELL", "mysql -h 127.0.0.1 -u $$MYSQL_USER --password=$$MYSQL_PASSWORD -e 'USE db_telegraph;'"] interval: 5s timeout: 10s retries: 5 ``` --- ### 2. Service `php` (PHP-FPM) - Image : `php:8.2-fpm` - Extensions requises : `pdo`, `pdo_mysql` - (ou installation via `docker-php-ext-install pdo pdo_mysql`) - Copie du code backend : `/var/www/html/api/` - Variables d’environnement : - `DB_HOST=db` - `DB_PORT=3306` - `DB_NAME=db_telegraph` - `DB_USER=root` - `DB_PASSWORD=root` - Réseaux : `backend` - Redémarrage : `always` - Dépendances : ```yaml depends_on: db: condition: service_healthy ``` le fichier php.ini doit être copié et renommé vers cet emplacement : `/usr/local/etc/php/conf.d/z-app.ini` --- ### 3. Service `nginx` (reverse proxy + statique) - Image : `nginx:1.27-alpine` - Ports exposés : `80:80` - Réseau : `frontend`, `backend` - Dépend de `php` - Redémarrage : `always` - Copie des fichier `default.conf` dans `/etc/nginx/conf.d/default.conf` - Copie des fichiers clients dans `/usr/share/nginx/html/` --- ### 4. Réseaux et volumes Un réseau `frontend` et un réseau `backend` doivent être créés. Un volume nommé `db_data` doit permettre la persistance de la base de données. --- ## Endpoints attendus - **Interface utilisateur** : `GET /` affiche l’image du télégraphe et le script JS. - **Interface utilisateur** : `GET /api/test_db_connection.php` initie un test de connection à la base de données. --- --- ## Travail demandé 1. Écrire le fichier `docker-compose.yml` complet selon les spécifications. 2. Fournir les fichiers nécessaires : - `php/Dockerfile` - `nginx/default.conf` - `app/` avec votre code télégraphe. 3. Démarrer la stack et vérifier : - l’accès via `http://localhost` - l’accès via `http://localhost/api/test_db_connection.php` 4. Vérifier la **persistance** après `docker compose down && docker compose up`. --- ## Livrables - `docker-compose.yml` - `php/Dockerfile` - Captures dans un dossier `captures/` : - `ui.png` — interface du télégraphe - `post_ok.png` — réponse du backend après envoi - `last_message.png` — lecture des données - `docker_ps.png` - `persistence.png` --- ## Critères de réussite - Application accessible via Nginx - API PHP opérationnelle (`/api/test_db_connection.php`) - Données persistantes après redémarrage - Volume et réseaux configurés - Healthcheck DB et dépendances fonctionnels - Structure `docker-compose.yml` propre et lisible