Go to file
2025-10-02 10:16:17 +02:00
srcs Update and rename .env to env.exemple 2025-02-16 15:24:25 +01:00
Makefile done 2022-10-08 12:41:31 +02:00
README.md docs: add comprehensive README for Docker infrastructure project 2025-10-02 10:16:17 +02:00

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/ :

# 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)

echo "127.0.0.1 apommier.42.fr" >> /etc/hosts

Déploiement

Commandes Make

# 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

Configuration des conteneurs

Nginx 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

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

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

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

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

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

#!/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

# É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

# 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

# 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

# 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

# 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

; Configuration PHP optimisée
memory_limit = 256M
max_execution_time = 300
upload_max_filesize = 64M
post_max_size = 64M

Optimisations MariaDB

[mysqld]
innodb_buffer_pool_size = 256M
query_cache_type = 1
query_cache_size = 64M
max_connections = 100

Optimisations 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

# 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" 🐳🚀