diff --git a/README.md b/README.md new file mode 100644 index 0000000..b9d12a6 --- /dev/null +++ b/README.md @@ -0,0 +1,450 @@ +# 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"* 🐳🚀 \ No newline at end of file