docs: add comprehensive README for Docker infrastructure project

This commit is contained in:
kinou-p 2025-10-02 10:16:17 +02:00
parent 34820e9812
commit 1a6a9ffb52

450
README.md Normal file
View File

@ -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"* 🐳🚀