docs: add comprehensive README for Docker infrastructure project
This commit is contained in:
parent
34820e9812
commit
1a6a9ffb52
450
README.md
Normal file
450
README.md
Normal 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"* 🐳🚀
|
||||
Loading…
Reference in New Issue
Block a user