# Inception - École 42 ## Description Inception est un projet de l'École 42 qui consiste à créer une infrastructure complète avec Docker en utilisant des conteneurs personnalisés. Le projet déploie un stack LEMP (Linux, Nginx, MariaDB, PHP/WordPress) entièrement containerisé avec des images Docker créées from scratch. ## Objectifs pédagogiques - Maîtriser **Docker** et la containerisation - Comprendre l'**orchestration de services** avec Docker Compose - Créer des **Dockerfiles** optimisés et sécurisés - Gérer les **volumes persistants** et réseaux Docker - Apprendre l'**administration système** et sécurité - Mettre en place une **infrastructure LEMP** complète ## Architecture du projet ### Stack technique - **🌐 Nginx** : Reverse proxy avec TLS v1.2/v1.3 - **🗄️ MariaDB** : Base de données relationnelle - **📝 WordPress** : CMS avec PHP-FPM - **🔐 SSL/TLS** : Certificats auto-signés - **🐳 Docker** : Containerisation complète ### Structure des fichiers ``` inception/ ├── Makefile # Automatisation des tâches └── srcs/ ├── docker-compose.yml # Orchestration des services ├── .env # Variables d'environnement └── requirements/ # Dockerfiles personnalisés ├── nginx/ # Reverse proxy │ ├── Dockerfile │ └── conf/ ├── wordpress/ # CMS PHP │ ├── Dockerfile │ └── conf/ └── mariadb/ # Base de données ├── Dockerfile └── conf/ ``` ## Services containerisés ### 🌐 Nginx - **Image** : Alpine Linux custom - **Port** : 443 (HTTPS uniquement) - **Fonctionnalités** : - Reverse proxy vers WordPress - Certificats SSL auto-signés - Configuration TLS v1.2/v1.3 - Compression gzip - Sécurité headers ### 📝 WordPress + PHP-FPM - **Image** : Alpine Linux + PHP-FPM - **Fonctionnalités** : - Installation automatique WordPress - Configuration multi-utilisateurs - Connexion sécurisée à MariaDB - Volumes persistants - PHP optimisé pour production ### 🗄️ MariaDB - **Image** : Alpine Linux + MariaDB - **Fonctionnalités** : - Base de données WordPress - Utilisateurs multiples avec privilèges - Volumes persistants - Configuration optimisée - Sécurité renforcée ## Installation et déploiement ### Prérequis - **Docker** 20.10+ - **Docker Compose** 1.28+ - **Make** pour l'automatisation - **Système Linux** recommandé ### Configuration #### 1. Fichier d'environnement Créer `.env` dans `srcs/` : ```bash # Database DB_NAME=wordpress_db DB_USER=wp_user DB_PASSWORD=secure_password DB_ROOT_PASSWORD=root_secure_password # WordPress WP_TITLE="Mon Site WordPress" WP_ADMIN_USER=admin WP_ADMIN_PASSWORD=admin_password WP_ADMIN_EMAIL=admin@example.com WP_USER=user WP_USER_PASSWORD=user_password WP_USER_EMAIL=user@example.com # Domain DOMAIN_NAME=apommier.42.fr ``` #### 2. Hosts file (pour les tests locaux) ```bash echo "127.0.0.1 apommier.42.fr" >> /etc/hosts ``` ### Déploiement #### Commandes Make ```bash # Déploiement complet make # Démarrage en arrière-plan make back # Arrêt des services make down # Nettoyage complet make fclean # Redémarrage complet make re ``` #### Accès aux services - **WordPress** : https://apommier.42.fr - **Interface d'admin** : https://apommier.42.fr/wp-admin ## Configuration des conteneurs ### Nginx Dockerfile ```dockerfile FROM alpine:3.16 RUN apk update && apk upgrade && \ apk add --no-cache nginx openssl # Génération certificats SSL RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/nginx.key \ -out /etc/ssl/certs/nginx.crt \ -subj "/C=FR/ST=IDF/L=Paris/O=42/OU=42/CN=apommier.42.fr" COPY conf/nginx.conf /etc/nginx/nginx.conf EXPOSE 443 CMD ["nginx", "-g", "daemon off;"] ``` ### WordPress Dockerfile ```dockerfile FROM alpine:3.16 RUN apk update && apk upgrade && \ apk add --no-cache \ php8 php8-fpm php8-mysqli php8-json php8-curl \ php8-dom php8-exif php8-fileinfo php8-mbstring \ php8-openssl php8-xml php8-zip wget WORKDIR /var/www/html # Installation WP-CLI RUN wget https://raw.githubusercontent.com/wp-cli/wp-cli/release/wp-cli.phar && \ chmod +x wp-cli.phar && \ mv wp-cli.phar /usr/local/bin/wp COPY conf/setup.sh /usr/local/bin/ COPY conf/www.conf /etc/php8/php-fpm.d/ EXPOSE 9000 CMD ["sh", "/usr/local/bin/setup.sh"] ``` ### MariaDB Dockerfile ```dockerfile FROM alpine:3.16 RUN apk update && apk upgrade && \ apk add --no-cache mariadb mariadb-client RUN mysql_install_db --user=mysql --datadir=/var/lib/mysql COPY conf/setup.sh /usr/local/bin/ COPY conf/mariadb-server.cnf /etc/my.cnf.d/ EXPOSE 3306 CMD ["sh", "/usr/local/bin/setup.sh"] ``` ## Volumes et persistance ### Configuration des volumes ```yaml volumes: wp_files: driver: local driver_opts: type: none o: bind device: /home/apommier/data/wordpress db_files: driver: local driver_opts: type: none o: bind device: /home/apommier/data/mariadb ``` ### Répertoires de données - `/home/apommier/data/wordpress` : Fichiers WordPress - `/home/apommier/data/mariadb` : Base de données MariaDB ## Réseau et sécurité ### Configuration réseau ```yaml networks: wpnetwork: driver: bridge ``` ### Sécurité implémentée - **HTTPS uniquement** (pas de HTTP) - **Certificats TLS** v1.2/v1.3 - **Isolation des conteneurs** - **Variables d'environnement** sécurisées - **Utilisateurs non-root** dans les conteneurs - **Ports exposés minimaux** ### Headers de sécurité Nginx ```nginx add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self'" always; ``` ## Scripts d'automatisation ### Setup WordPress ```bash #!/bin/sh # Téléchargement WordPress wp core download --allow-root # Configuration base de données wp config create \ --dbname=$DB_NAME \ --dbuser=$DB_USER \ --dbpass=$DB_PASSWORD \ --dbhost=mariadb:3306 \ --allow-root # Installation WordPress wp core install \ --url=$DOMAIN_NAME \ --title="$WP_TITLE" \ --admin_user=$WP_ADMIN_USER \ --admin_password=$WP_ADMIN_PASSWORD \ --admin_email=$WP_ADMIN_EMAIL \ --allow-root # Création utilisateur supplémentaire wp user create $WP_USER $WP_USER_EMAIL \ --user_pass=$WP_USER_PASSWORD \ --role=author \ --allow-root # Démarrage PHP-FPM php-fpm8 --nodaemonize ``` ## Monitoring et logs ### Surveillance des conteneurs ```bash # État des conteneurs docker ps # Logs en temps réel docker-compose -f srcs/docker-compose.yml logs -f # Utilisation des ressources docker stats # Inspection des volumes docker volume ls docker volume inspect inception_wp_files ``` ### Logs des services ```bash # Logs Nginx docker exec nginx tail -f /var/log/nginx/access.log docker exec nginx tail -f /var/log/nginx/error.log # Logs WordPress/PHP docker exec wordpress tail -f /var/log/php8/error.log # Logs MariaDB docker exec mariadb tail -f /var/log/mysql/error.log ``` ## Troubleshooting ### Problèmes courants #### Connexion base de données ```bash # Test connexion MariaDB docker exec -it mariadb mysql -u$DB_USER -p$DB_PASSWORD $DB_NAME # Vérifier les variables d'environnement docker exec wordpress env | grep DB_ ``` #### Problèmes SSL ```bash # Vérifier certificats docker exec nginx openssl x509 -in /etc/ssl/certs/nginx.crt -text -noout # Test connexion HTTPS curl -k https://apommier.42.fr ``` #### Permissions volumes ```bash # Vérifier propriétaire des volumes ls -la /home/apommier/data/ # Corriger permissions si nécessaire sudo chown -R $USER:$USER /home/apommier/data/ ``` ## Performance et optimisation ### Optimisations PHP ```ini ; Configuration PHP optimisée memory_limit = 256M max_execution_time = 300 upload_max_filesize = 64M post_max_size = 64M ``` ### Optimisations MariaDB ```ini [mysqld] innodb_buffer_pool_size = 256M query_cache_type = 1 query_cache_size = 64M max_connections = 100 ``` ### Optimisations Nginx ```nginx worker_processes auto; worker_connections 1024; gzip on; gzip_vary on; gzip_min_length 1024; ``` ## Compétences développées - **Containerisation** avec Docker avancé - **Orchestration** de services avec Docker Compose - **Administration système** Linux - **Sécurité** web et infrastructures - **Automatisation** et scripting - **Debugging** d'environnements complexes - **Performance** et optimisation - **Infrastructure as Code** ## Contraintes et spécifications 42 ### Contraintes obligatoires - **Images Alpine** Linux uniquement - **Dockerfiles personnalisés** (pas d'images pré-construites) - **HTTPS uniquement** (port 443) - **Volumes persistants** obligatoires - **Variables d'environnement** pour la configuration - **Restart automatique** des conteneurs ### Interdictions - ❌ Images Docker Hub toutes faites - ❌ Docker images avec tags "latest" - ❌ Boucles infinites dans les scripts - ❌ Mots de passe en dur dans les Dockerfiles - ❌ HTTP non sécurisé ## Extensions possibles ### Bonus recommandés - **Redis** cache pour WordPress - **FTP** serveur pour uploads - **Adminer** interface base de données - **Monitoring** avec Prometheus/Grafana - **Backup** automatisé des données ### Améliorations avancées - **Multi-stage builds** pour optimiser les images - **Health checks** pour les services - **Load balancing** avec plusieurs instances WordPress - **CI/CD** avec GitLab/GitHub Actions ## Tests et validation ### Tests de fonctionnement ```bash # Test complet du déploiement make fclean && make # Vérification HTTPS curl -k -I https://apommier.42.fr # Test base de données docker exec mariadb mysql -u$DB_USER -p$DB_PASSWORD -e "SHOW DATABASES;" # Performance test ab -n 100 -c 10 https://apommier.42.fr/ ``` ### Checklist de validation - ✅ Tous les conteneurs démarrent sans erreur - ✅ WordPress accessible en HTTPS - ✅ Interface admin fonctionnelle - ✅ Base de données persistante - ✅ Volumes correctement montés - ✅ Certificats SSL valides - ✅ Pas de mots de passe en dur ## Auteur Alexandre Pommier (apommier) - École 42 ## Licence Projet académique - École 42 --- *"Infrastructure moderne avec Docker"* 🐳🚀