450 lines
10 KiB
Markdown
450 lines
10 KiB
Markdown
# 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"* 🐳🚀 |