{"id":125,"date":"2026-02-09T16:17:04","date_gmt":"2026-02-09T15:17:04","guid":{"rendered":"https:\/\/fankepa.com\/?p=125"},"modified":"2026-03-13T15:43:24","modified_gmt":"2026-03-13T14:43:24","slug":"projet-serveur-web-linux","status":"publish","type":"post","link":"https:\/\/fankepa.com\/?p=125","title":{"rendered":"Projet : Serveur Web Linux"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"> Configuration d&rsquo;un Serveur Web Linux avec WordPress<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Informations du Projet<\/h2>\n\n\n\n<p><strong>Titre :<\/strong> Serveur Web Linux &#8211; Configuration compl\u00e8te avec Nginx, MySQL et WordPress<\/p>\n\n\n\n<p><strong>Technologies utilis\u00e9es :<\/strong> Linux (Ubuntu), Nginx, MySQL, PHP, WordPress, Tailscale<\/p>\n\n\n\n<p><strong>Contexte :<\/strong> Mise en place d&rsquo;une infrastructure web s\u00e9curis\u00e9e avec acc\u00e8s distant contr\u00f4l\u00e9<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Table des mati\u00e8res<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#r\u00e9sum\u00e9-ex\u00e9cutif\">R\u00e9sum\u00e9 ex\u00e9cutif<\/a><\/li>\n\n\n\n<li><a href=\"#objectifs-du-projet\">Objectifs du projet<\/a><\/li>\n\n\n\n<li><a href=\"#architecture-technique\">Architecture technique<\/a><\/li>\n\n\n\n<li><a href=\"#m\u00e9thodologie-et-mise-en-\u0153uvre\">M\u00e9thodologie et mise en \u0153uvre<\/a><\/li>\n\n\n\n<li><a href=\"#configuration-d\u00e9taill\u00e9e\">Configuration d\u00e9taill\u00e9e<\/a><\/li>\n\n\n\n<li><a href=\"#s\u00e9curit\u00e9-et-bonnes-pratiques\">S\u00e9curit\u00e9 et bonnes pratiques<\/a><\/li>\n\n\n\n<li><a href=\"#tests-et-validation\">Tests et validation<\/a><\/li>\n\n\n\n<li><a href=\"#difficult\u00e9s-rencontr\u00e9es-et-solutions\">Difficult\u00e9s rencontr\u00e9es et solutions<\/a><\/li>\n\n\n\n<li><a href=\"#r\u00e9sultats-et-livrables\">R\u00e9sultats et livrables<\/a><\/li>\n\n\n\n<li><a href=\"#perspectives-dam\u00e9lioration\">Perspectives d&rsquo;am\u00e9lioration<\/a><\/li>\n\n\n\n<li><a href=\"#comp\u00e9tences-acquises\">Comp\u00e9tences acquises<\/a><\/li>\n\n\n\n<li><a href=\"#annexes\">Annexes<\/a><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">1. R\u00e9sum\u00e9 ex\u00e9cutif<\/h2>\n\n\n\n<p>Ce projet consiste en la conception et la mise en place d&rsquo;un serveur web complet sous Linux Ubuntu, h\u00e9bergeant un site WordPress. L&rsquo;infrastructure repose sur une stack LEMP (Linux, Nginx, MySQL, PHP) et int\u00e8gre une solution d&rsquo;acc\u00e8s distant s\u00e9curis\u00e9 via Tailscale.<\/p>\n\n\n\n<p><strong>R\u00e9sultats cl\u00e9s :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Serveur web op\u00e9rationnel et optimis\u00e9<\/li>\n\n\n\n<li>Connexions s\u00e9curis\u00e9es via r\u00e9seau priv\u00e9 virtuel (VPN)<\/li>\n\n\n\n<li>Infrastructure scalable et maintenable<\/li>\n\n\n\n<li>Documentation technique compl\u00e8te<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Objectifs du projet<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 Objectifs principaux<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>D\u00e9ploiement d&rsquo;un serveur web fonctionnel<\/strong> : Configurer un environnement Linux capable d&rsquo;h\u00e9berger des applications web<\/li>\n\n\n\n<li><strong>Installation et configuration de WordPress<\/strong> : Mettre en place un CMS performant et s\u00e9curis\u00e9<\/li>\n\n\n\n<li><strong>S\u00e9curisation des acc\u00e8s<\/strong> : Impl\u00e9menter un syst\u00e8me d&rsquo;acc\u00e8s distant s\u00e9curis\u00e9 via Tailscale<\/li>\n\n\n\n<li><strong>Optimisation des performances<\/strong> : Configurer Nginx pour des performances optimales<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 Objectifs secondaires<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ma\u00eetriser l&rsquo;administration syst\u00e8me Linux<\/li>\n\n\n\n<li>Comprendre l&rsquo;architecture des serveurs web modernes<\/li>\n\n\n\n<li>Appliquer les bonnes pratiques de s\u00e9curit\u00e9<\/li>\n\n\n\n<li>Documenter l&rsquo;infrastructure pour une maintenance facilit\u00e9e<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. Architecture technique<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 Vue d&rsquo;ensemble<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\u250c\u2500<strong>\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         Utilisateurs distants           \u2502\n\u2502              (via Tailscale)            \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n               \u2502\n               \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502          Tailscale VPN Mesh             \u2502\n\u2502        (R\u00e9seau priv\u00e9 s\u00e9curis\u00e9)          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n               \u2502\n               \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502        Serveur Ubuntu Linux             \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502\n\u2502  \u2502         Nginx (Web Server)        \u2502  \u2502\n\u2502  \u2502     - Reverse Proxy               \u2502  \u2502\n\u2502  \u2502     - SSL\/TLS Termination         \u2502  \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502\n\u2502                 \u2502                        \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502\n\u2502  \u2502      PHP-FPM (7.4\/8.x)            \u2502  \u2502\n\u2502  \u2502     - Traitement PHP              \u2502  \u2502\n\u2502  \u2502     - FastCGI Process Manager     \u2502  \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502\n\u2502                 \u2502                        \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502\n\u2502  \u2502         WordPress CMS             \u2502  \u2502\n\u2502  \u2502     - Application web             \u2502  \u2502\n\u2502  \u2502     - Gestion de contenu          \u2502  \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502\n\u2502                 \u2502                        \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502\n\u2502  \u2502      MySQL Database               \u2502  \u2502\n\u2502  \u2502     - Stockage des donn\u00e9es        \u2502  \u2502\n\u2502  \u2502     - Gestion des utilisateurs    \u2502  \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/strong><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Composants de la stack<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Composant<\/th><th>Version<\/th><th>R\u00f4le<\/th><\/tr><\/thead><tbody><tr><td>Ubuntu Server<\/td><td>20.04\/22.04 LTS<\/td><td>Syst\u00e8me d&rsquo;exploitation<\/td><\/tr><tr><td>Nginx<\/td><td>1.18+<\/td><td>Serveur web et reverse proxy<\/td><\/tr><tr><td>MySQL<\/td><td>8.0<\/td><td>Syst\u00e8me de gestion de base de donn\u00e9es<\/td><\/tr><tr><td>PHP-FPM<\/td><td>7.4\/8.x<\/td><td>Interpr\u00e9teur PHP<\/td><\/tr><tr><td>WordPress<\/td><td>Latest<\/td><td>CMS et application web<\/td><\/tr><tr><td>Tailscale<\/td><td>Latest<\/td><td>VPN mesh et acc\u00e8s s\u00e9curis\u00e9<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 Infrastructure r\u00e9seau<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>R\u00e9seau local<\/strong> : Configuration standard du serveur<\/li>\n\n\n\n<li><strong>Tailscale VPN<\/strong> : R\u00e9seau overlay s\u00e9curis\u00e9 (WireGuard)<\/li>\n\n\n\n<li><strong>Ports utilis\u00e9s<\/strong> :<\/li>\n\n\n\n<li>Port 80 (HTTP) &#8211; Redirection vers HTTPS<\/li>\n\n\n\n<li>Port 443 (HTTPS) &#8211; Trafic web s\u00e9curis\u00e9<\/li>\n\n\n\n<li>Port 3306 (MySQL) &#8211; Acc\u00e8s base de donn\u00e9es (localhost uniquement)<\/li>\n\n\n\n<li>Port 41641 (Tailscale) &#8211; Communication VPN<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">4. M\u00e9thodologie et mise en \u0153uvre<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Approche du projet<\/h3>\n\n\n\n<p>Le projet a \u00e9t\u00e9 r\u00e9alis\u00e9 selon une m\u00e9thodologie structur\u00e9e :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Phase de planification<\/strong> : Analyse des besoins et choix technologiques<\/li>\n\n\n\n<li><strong>Phase de pr\u00e9paration<\/strong> : Installation du syst\u00e8me d&rsquo;exploitation<\/li>\n\n\n\n<li><strong>Phase de configuration<\/strong> : Mise en place de chaque composant<\/li>\n\n\n\n<li><strong>Phase de tests<\/strong> : Validation et optimisation<\/li>\n\n\n\n<li><strong>Phase de documentation<\/strong> : R\u00e9daction de la documentation technique<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 Chronologie de mise en \u0153uvre<\/h3>\n\n\n\n<p><strong>\u00c9tape 1 : Pr\u00e9paration du serveur <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Installation d&rsquo;Ubuntu Server<\/li>\n\n\n\n<li>Mise \u00e0 jour du syst\u00e8me<\/li>\n\n\n\n<li>Configuration initiale de s\u00e9curit\u00e9<\/li>\n<\/ul>\n\n\n\n<p><strong>\u00c9tape 2 : Installation de la stack LEMP <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Installation de Nginx<\/li>\n\n\n\n<li>Installation et configuration de MySQL<\/li>\n\n\n\n<li>Installation de PHP et des extensions n\u00e9cessaires<\/li>\n<\/ul>\n\n\n\n<p><strong>\u00c9tape 3 : D\u00e9ploiement de WordPress <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>T\u00e9l\u00e9chargement de WordPress<\/li>\n\n\n\n<li>Configuration de la base de donn\u00e9es<\/li>\n\n\n\n<li>Configuration de Nginx pour WordPress<\/li>\n<\/ul>\n\n\n\n<p><strong>\u00c9tape 4 : S\u00e9curisation <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Installation de Tailscale<\/li>\n\n\n\n<li>Configuration du pare-feu (UFW)<\/li>\n\n\n\n<li>Mise en place des certificats SSL<\/li>\n<\/ul>\n\n\n\n<p><strong>\u00c9tape 5 : Tests et optimisation <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tests de performance<\/li>\n\n\n\n<li>Optimisation de la configuration<\/li>\n\n\n\n<li>Validation de la s\u00e9curit\u00e9<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">5. Configuration d\u00e9taill\u00e9e<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">5.1 Installation et configuration du syst\u00e8me de base<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">5.1.1 Pr\u00e9requis et t\u00e9l\u00e9chargement d&rsquo;Ubuntu<\/h4>\n\n\n\n<p><strong>T\u00e9l\u00e9charger Ubuntu Server :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udd17 Site officiel : https:\/\/ubuntu.com\/download\/server<\/li>\n\n\n\n<li>Version recommand\u00e9e : Ubuntu Server 22.04 LTS (Long Term Support)<\/li>\n\n\n\n<li>Fichier ISO : ubuntu-22.04.x-live-server-amd64.iso<\/li>\n<\/ul>\n\n\n\n<p><strong>Cr\u00e9er une cl\u00e9 USB bootable :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Windows : Rufus (https:\/\/rufus.ie\/)<\/li>\n\n\n\n<li>Linux : <code><strong>sudo dd if=ubuntu-22.04.x-live-server-amd64.iso of=\/dev\/sdX bs=4M status=progress<\/strong><\/code><\/li>\n\n\n\n<li>macOS : balenaEtcher (https:\/\/www.balena.io\/etcher\/)<\/li>\n<\/ul>\n\n\n\n<p><strong>Installation d&rsquo;Ubuntu Server :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>D\u00e9marrer sur la cl\u00e9 USB<\/li>\n\n\n\n<li>Choisir \u00ab\u00a0Install Ubuntu Server\u00a0\u00bb<\/li>\n\n\n\n<li>Configuration r\u00e9seau (DHCP ou IP statique)<\/li>\n\n\n\n<li>Configuration du disque (utiliser tout le disque)<\/li>\n\n\n\n<li>Cr\u00e9er votre utilisateur principal<\/li>\n\n\n\n<li>Installer OpenSSH Server (cocher l&rsquo;option)<\/li>\n\n\n\n<li>Terminer l&rsquo;installation et red\u00e9marrer<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">5.1.2 Premi\u00e8re connexion et mise \u00e0 jour du syst\u00e8me<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#<strong> Se connecter au serveur via SSH (depuis votre PC)\nssh votre_utilisateur@adresse_ip_du_serveur\n# Exemple : ssh admin@192.168.1.100\n\n# Une fois connect\u00e9, mettre \u00e0 jour le syst\u00e8me\nsudo apt update\nsudo apt upgrade -y\n\n# Installation des outils essentiels\nsudo apt install -y curl wget git vim ufw software-properties-common\n\n# V\u00e9rifier la version d'Ubuntu\nlsb_release -a\n\n# V\u00e9rifier l'espace disque disponible\ndf -h\n\n# V\u00e9rifier la m\u00e9moire RAM\nfree -h<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.1.3 Configuration du pare-feu UFW<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#<strong> V\u00e9rifier le statut d'UFW\nsudo ufw status\n\n# Configuration des r\u00e8gles par d\u00e9faut\nsudo ufw default deny incoming   # Bloquer tout le trafic entrant par d\u00e9faut\nsudo ufw default allow outgoing  # Autoriser tout le trafic sortant\n\n# Autoriser SSH (IMPORTANT : \u00e0 faire AVANT d'activer UFW)\nsudo ufw allow ssh\n# OU si vous utilisez un port SSH personnalis\u00e9 :\n# sudo ufw allow 2222\/tcp\n\n# Autoriser HTTP et HTTPS pour Nginx\nsudo ufw allow 'Nginx Full'\n# OU manuellement :\n# sudo ufw allow 80\/tcp\n# sudo ufw allow 443\/tcp\n\n# Activer le pare-feu\nsudo ufw enable\n\n# V\u00e9rifier les r\u00e8gles actives\nsudo ufw status verbose<\/strong><\/code><\/pre>\n\n\n\n<p><strong>R\u00e9sultat attendu :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>Status: active\n\nTo                         Action      From\n--                         ------      ----\n22\/tcp                     ALLOW       Anywhere\nNginx Full                 ALLOW       Anywhere\n22\/tcp (v6)                ALLOW       Anywhere (v6)\nNginx Full (v6)            ALLOW       Anywhere (v6)<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.1.4 S\u00e9curisation SSH (Optionnel mais recommand\u00e9)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>\u00c9diter la configuration SSH\nsudo vim \/etc\/ssh\/sshd_config\n\n# Modifications recommand\u00e9es (d\u00e9commenter et modifier ces lignes) :\n# Port 2222                          # Changer le port par d\u00e9faut\n# PermitRootLogin no                 # Interdire la connexion root\n# PasswordAuthentication no          # D\u00e9sactiver l'auth par mot de passe (apr\u00e8s avoir configur\u00e9 les cl\u00e9s SSH)\n# PubkeyAuthentication yes           # Activer l'auth par cl\u00e9 publique<\/strong>\n<strong>\n# Red\u00e9marrer SSH\nsudo systemctl restart sshd\n\n# V\u00e9rifier le statut\nsudo systemctl status sshd<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Configuration des cl\u00e9s SSH (sur votre PC local) :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>Sur votre ordinateur local (Windows\/Linux\/Mac)\n# G\u00e9n\u00e9rer une paire de cl\u00e9s SSH\nssh-keygen -t ed25519 -C \"votre_email@example.com\"\n# Appuyez sur Entr\u00e9e pour le fichier par d\u00e9faut\n# Choisissez une passphrase (recommand\u00e9)\n\n# Copier la cl\u00e9 publique vers le serveur\nssh-copy-id votre_utilisateur@adresse_ip_du_serveur\n# OU manuellement :\ncat ~\/.ssh\/id_ed25519.pub | ssh votre_utilisateur@adresse_ip_du_serveur \"mkdir -p ~\/.ssh &amp;&amp; cat &gt;&gt; ~\/.ssh\/authorized_keys\"\n\n# Tester la connexion avec la cl\u00e9\nssh votre_utilisateur@adresse_ip_du_serveur<\/strong><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5.2 Installation et configuration de Nginx<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">5.2.1 Installation de Nginx<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#<strong> Mettre \u00e0 jour la liste des paquets\nsudo apt update\n\n# Installer Nginx\nsudo apt install nginx -y\n\n# V\u00e9rifier la version install\u00e9e\nnginx -v\n\n# D\u00e9marrer Nginx\nsudo systemctl start nginx\n\n# Activer Nginx au d\u00e9marrage du syst\u00e8me\nsudo systemctl enable nginx\n\n# V\u00e9rifier le statut de Nginx\nsudo systemctl status nginx<\/strong><\/code><\/pre>\n\n\n\n<p><strong>R\u00e9sultat attendu :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u25cf <strong>nginx.service - A high performance web server and a reverse proxy server\n     Loaded: loaded (\/lib\/systemd\/system\/nginx.service; enabled; vendor preset: enabled)\n     Active: active (running) since...<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.2.2 Test initial de Nginx<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#<strong> Obtenir l'adresse IP du serveur\nip addr show\n# OU\nhostname -I\n\n# Tester depuis le serveur\ncurl localhost\n\n# Depuis votre navigateur, acc\u00e9der \u00e0 : http:\/\/adresse_ip_du_serveur\n# Vous devriez voir la page \"Welcome to nginx!\"<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.2.3 Structure des r\u00e9pertoires Nginx<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>Comprendre l'organisation des fichiers Nginx\nls -la \/etc\/nginx\/\n\n# Fichiers et r\u00e9pertoires importants :\n# \/etc\/nginx\/nginx.conf              - Configuration principale\n# \/etc\/nginx\/sites-available\/        - Sites disponibles\n# \/etc\/nginx\/sites-enabled\/          - Sites activ\u00e9s (liens symboliques)\n# \/var\/log\/nginx\/                    - Fichiers de logs\n# \/var\/www\/html\/                     - R\u00e9pertoire web par d\u00e9faut<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.2.4 Configuration de Nginx pour WordPress<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>Cr\u00e9er le fichier de configuration pour WordPress\nsudo vim \/etc\/nginx\/sites-available\/wordpress\n\n# Copier et coller la configuration suivante :<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Contenu du fichier <code>\/etc\/nginx\/sites-available\/wordpress<\/code> :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>server {\n    listen 80;\n    listen &#91;::]:80;\n\n    # Remplacer par votre nom de domaine ou adresse IP\n    server_name example.com www.example.com;\n    # Pour utiliser une IP : server_name 192.168.1.100;\n\n    root \/var\/www\/wordpress;\n    index index.php index.html index.htm;\n\n    # Logs\n    access_log \/var\/log\/nginx\/wordpress_access.log;\n    error_log \/var\/log\/nginx\/wordpress_error.log;\n\n    # Configuration principale WordPress\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$args;\n    }\n\n    # Traitement des fichiers PHP\n    location ~ \\.php$ {\n        include snippets\/fastcgi-php.conf;\n        # ATTENTION : V\u00e9rifier la version de PHP install\u00e9e\n        fastcgi_pass unix:\/var\/run\/php\/php8.1-fpm.sock;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        include fastcgi_params;\n    }\n\n    # S\u00e9curit\u00e9 : bloquer l'acc\u00e8s aux fichiers .htaccess\n    location ~ \/\\.ht {\n        deny all;\n    }\n\n    # Optimisation : ne pas logger les requ\u00eates pour favicon et robots.txt\n    location = \/favicon.ico {\n        log_not_found off;\n        access_log off;\n    }\n\n    location = \/robots.txt {\n        log_not_found off;\n        access_log off;\n        allow all;\n    }\n\n    # Cache des fichiers statiques\n    location ~* \\.(css|gif|ico|jpeg|jpg|js|png|webp|woff|woff2|ttf|svg|eot)$ {\n        expires max;\n        log_not_found off;\n        access_log off;\n    }\n\n    # S\u00e9curit\u00e9 WordPress : bloquer l'acc\u00e8s \u00e0 certains fichiers\n    location ~* \/(?:uploads|files)\/.*\\.php$ {\n        deny all;\n    }\n\n    # Limiter les m\u00e9thodes HTTP autoris\u00e9es\n    if ($request_method !~ ^(GET|HEAD|POST)$ ) {\n        return 444;\n    }\n}<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.2.5 Activation de la configuration WordPress<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>D\u00e9sactiver le site par d\u00e9faut\nsudo unlink \/etc\/nginx\/sites-enabled\/default\n\n# Cr\u00e9er un lien symbolique pour activer le site WordPress\nsudo ln -s \/etc\/nginx\/sites-available\/wordpress \/etc\/nginx\/sites-enabled\/\n\n# V\u00e9rifier qu'il n'y a pas d'erreur dans la configuration\nsudo nginx -t\n\n# Si le test est OK, vous verrez :\n# nginx: configuration file \/etc\/nginx\/nginx.conf test is successful\n\n# Recharger Nginx pour appliquer les changements\nsudo systemctl reload nginx\n\n# V\u00e9rifier le statut\nsudo systemctl status nginx<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.2.6 Optimisation de Nginx (Optionnel)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#<strong> \u00c9diter le fichier de configuration principal\nsudo vim \/etc\/nginx\/nginx.conf<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Optimisations recommand\u00e9es dans <code>nginx.conf<\/code> :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#<strong> Dans la section http {}\nhttp {\n    # Augmenter la taille des buffers\n    client_body_buffer_size 10K;\n    client_header_buffer_size 1k;\n    client_max_body_size 64M;\n    large_client_header_buffers 2 1k;\n\n    # Optimisation des timeouts\n    client_body_timeout 12;\n    client_header_timeout 12;\n    keepalive_timeout 15;\n    send_timeout 10;\n\n    # Compression Gzip\n    gzip on;\n    gzip_vary on;\n    gzip_proxied any;\n    gzip_comp_level 6;\n    gzip_types text\/plain text\/css text\/xml text\/javascript \n               application\/json application\/javascript application\/xml+rss \n               application\/rss+xml font\/truetype font\/opentype \n               application\/vnd.ms-fontobject image\/svg+xml;\n\n    # Cacher les informations de version\n    server_tokens off;\n\n    # ... reste de la configuration\n}<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>#<strong> Apr\u00e8s modification, toujours tester la configuration\nsudo nginx -t\n\n# Red\u00e9marrer Nginx\nsudo systemctl restart nginx<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.2.7 Commandes utiles pour Nginx<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>Tester la configuration\nsudo nginx -t\n\n# Recharger la configuration (sans interruption)\nsudo systemctl reload nginx\n\n# Red\u00e9marrer Nginx\nsudo systemctl restart nginx\n\n# Arr\u00eater Nginx\nsudo systemctl stop nginx\n\n# Voir les logs en temps r\u00e9el\nsudo tail -f \/var\/log\/nginx\/error.log\nsudo tail -f \/var\/log\/nginx\/access.log\nsudo tail -f \/var\/log\/nginx\/wordpress_error.log\n\n# V\u00e9rifier les processus Nginx\nps aux | grep nginx\n\n# V\u00e9rifier les ports en \u00e9coute\nsudo ss -tlnp | grep nginx<\/strong><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5.3 Installation et configuration de MySQL<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">5.3.1 Installation de MySQL Server<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>Mettre \u00e0 jour les paquets\nsudo apt update\n\n# Installer MySQL Server\nsudo apt install mysql-server -y\n\n# V\u00e9rifier la version install\u00e9e\nmysql --version\n\n# D\u00e9marrer MySQL\nsudo systemctl start mysql\n\n# Activer MySQL au d\u00e9marrage\nsudo systemctl enable mysql\n\n# V\u00e9rifier le statut\nsudo systemctl status mysql<\/strong><\/code><\/pre>\n\n\n\n<p><strong>R\u00e9sultat attendu :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u25cf <strong>mysql.service - MySQL Community Server\n     Loaded: loaded\n     Active: active (running)<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.3.2 S\u00e9curisation de MySQL<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>Lancer le script de s\u00e9curisation\nsudo mysql_secure_installation<\/strong><\/code><\/pre>\n\n\n\n<p><strong>R\u00e9ponses recommand\u00e9es lors de l&rsquo;installation :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>1. Validate Password Component? \n   \u2192 Appuyez sur Y (Oui) pour activer la validation de mot de passe\n\n2. Password Validation Policy Level (0=LOW, 1=MEDIUM, 2=STRONG)\n   \u2192 Choisir 1 ou 2 (recommand\u00e9 : 1 pour MEDIUM)\n\n3. Set root password?\n   \u2192 Y (Oui) puis entrez un mot de passe fort\n   \u2192 Exemple : MyS3cur3P@ssw0rd!2024\n\n4. Remove anonymous users?\n   \u2192 Y (Oui) - Pour supprimer les utilisateurs anonymes\n\n5. Disallow root login remotely?\n   \u2192 Y (Oui) - Pour interdire la connexion root \u00e0 distance\n\n6. Remove test database?\n   \u2192 Y (Oui) - Pour supprimer la base de test\n\n7. Reload privilege tables now?\n   \u2192 Y (Oui) - Pour appliquer les changements<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.3.3 Test de connexion \u00e0 MySQL<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Se connecter \u00e0 MySQL en tant que root\nsudo mysql -u root -p\n# Entrez le mot de passe root d\u00e9fini pr\u00e9c\u00e9demment\n\n# Une fois connect\u00e9, vous verrez :\n# mysql&gt;\n\n# Tester quelques commandes :\nSHOW DATABASES;\nSELECT VERSION();\nSTATUS;\n\n# Quitter MySQL\nEXIT;<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.3.4 Cr\u00e9ation de la base de donn\u00e9es WordPress<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Se connecter \u00e0 MySQL\nsudo mysql -u root -p<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Ex\u00e9cuter les commandes SQL suivantes :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>-- Cr\u00e9er la base de donn\u00e9es pour WordPress\nCREATE DATABASE wordpress_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n\n-- Cr\u00e9er un utilisateur d\u00e9di\u00e9 \u00e0 WordPress\n-- Remplacer 'VotreMotDePasseSecurise123!' par un mot de passe fort\nCREATE USER 'wordpress_user'@'localhost' IDENTIFIED BY 'VotreMotDePasseSecurise123!';\n\n-- Accorder tous les privil\u00e8ges sur la base wordpress_db \u00e0 l'utilisateur\nGRANT ALL PRIVILEGES ON wordpress_db.* TO 'wordpress_user'@'localhost';\n\n-- Appliquer les changements\nFLUSH PRIVILEGES;\n\n-- V\u00e9rifier que la base est cr\u00e9\u00e9e\nSHOW DATABASES;\n\n-- V\u00e9rifier les utilisateurs\nSELECT User, Host FROM mysql.user;\n\n-- Quitter MySQL\nEXIT;<\/strong><\/code><\/pre>\n\n\n\n<p><strong>R\u00e9sultat attendu :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>+--------------------+\n| Database           |\n+--------------------+\n| information_schema |\n| mysql              |\n| performance_schema |\n| sys                |\n| wordpress_db       |  \u2190 Votre nouvelle base\n+--------------------+<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.3.5 Test de l&rsquo;utilisateur WordPress<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Tester la connexion avec le nouvel utilisateur\nmysql -u wordpress_user -p\n# Entrez le mot de passe de wordpress_user\n\n# V\u00e9rifier l'acc\u00e8s \u00e0 la base\nSHOW DATABASES;\nUSE wordpress_db;\nSHOW TABLES;  # Devrait \u00eatre vide pour le moment\n\n# Quitter\nEXIT;<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.3.6 Configuration de s\u00e9curit\u00e9 MySQL (Optionnel)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># \u00c9diter le fichier de configuration MySQL\nsudo vim \/etc\/mysql\/mysql.conf.d\/mysqld.cnf<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Optimisations recommand\u00e9es :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>&#91;mysqld]\n# \u00c9couter uniquement sur localhost (s\u00e9curit\u00e9)\nbind-address = 127.0.0.1\n\n# Optimisation de la performance\nmax_connections = 100\nconnect_timeout = 10\nwait_timeout = 600\nmax_allowed_packet = 64M\nthread_cache_size = 128\nsort_buffer_size = 4M\nbulk_insert_buffer_size = 16M\ntmp_table_size = 32M\nmax_heap_table_size = 32M\n\n# Optimisation InnoDB\ninnodb_buffer_pool_size = 256M\ninnodb_log_file_size = 64M\ninnodb_flush_log_at_trx_commit = 2\ninnodb_flush_method = O_DIRECT\n\n# Logs (optionnel, utile pour debug)\n# general_log_file = \/var\/log\/mysql\/mysql.log\n# general_log = 1\n# log_error = \/var\/log\/mysql\/error.log\n# slow_query_log = 1\n# slow_query_log_file = \/var\/log\/mysql\/mysql-slow.log\n# long_query_time = 2<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Red\u00e9marrer MySQL pour appliquer les changements\nsudo systemctl restart mysql\n\n# V\u00e9rifier le statut\nsudo systemctl status mysql<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.3.7 Sauvegarde de la base de donn\u00e9es<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er un r\u00e9pertoire pour les sauvegardes\nsudo mkdir -p \/var\/backups\/mysql\nsudo chmod 700 \/var\/backups\/mysql\n\n# Sauvegarder la base wordpress_db\nsudo mysqldump -u wordpress_user -p wordpress_db &gt; \/var\/backups\/mysql\/wordpress_db_$(date +%Y%m%d).sql\n\n# Sauvegarder avec compression\nsudo mysqldump -u wordpress_user -p wordpress_db | gzip &gt; \/var\/backups\/mysql\/wordpress_db_$(date +%Y%m%d).sql.gz\n\n# Restaurer une sauvegarde (si n\u00e9cessaire)\n# mysql -u wordpress_user -p wordpress_db &lt;<\/strong> <strong>\/var\/backups\/mysql\/wordpress_db_20240101.sql<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.3.8 Commandes MySQL utiles<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Se connecter \u00e0 MySQL\nsudo mysql -u root -p\n\n# Depuis l'interface MySQL :\nSHOW DATABASES;                          # Lister les bases de donn\u00e9es\nUSE wordpress_db;                        # S\u00e9lectionner une base\nSHOW TABLES;                             # Lister les tables\nDESCRIBE nom_table;                      # Voir la structure d'une table\nSELECT * FROM nom_table LIMIT 10;        # Voir les donn\u00e9es\n\n# Gestion des utilisateurs\nSELECT User, Host FROM mysql.user;       # Lister les utilisateurs\nSHOW GRANTS FOR 'wordpress_user'@'localhost';  # Voir les privil\u00e8ges\n\n# Maintenance\nOPTIMIZE TABLE nom_table;                # Optimiser une table\nCHECK TABLE nom_table;                   # V\u00e9rifier l'int\u00e9grit\u00e9\nREPAIR TABLE nom_table;                  # R\u00e9parer une table\n\n# Depuis le terminal :\nsudo systemctl status mysql              # Statut du service\nsudo systemctl restart mysql             # Red\u00e9marrer MySQL\nsudo tail -f \/var\/log\/mysql\/error.log    # Voir les logs d'erreur\n\n# V\u00e9rifier les processus MySQL\nsudo mysqladmin -u root -p processlist   # Processus en cours\nsudo mysqladmin -u root -p status        # Statut g\u00e9n\u00e9ral<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.3.9 R\u00e9solution de probl\u00e8mes courants<\/h4>\n\n\n\n<p><strong>Probl\u00e8me : Impossible de se connecter \u00e0 MySQL<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier que MySQL est en cours d'ex\u00e9cution\nsudo systemctl status mysql\n\n# V\u00e9rifier les logs\nsudo tail -50 \/var\/log\/mysql\/error.log\n\n# Red\u00e9marrer MySQL\nsudo systemctl restart mysql<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Probl\u00e8me : Mot de passe root oubli\u00e9<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Arr\u00eater MySQL\nsudo systemctl stop mysql\n\n# D\u00e9marrer en mode sans validation de mot de passe\nsudo mysqld_safe --skip-grant-tables &amp;\n\n# Se connecter sans mot de passe\nsudo mysql -u root\n\n# R\u00e9initialiser le mot de passe\nALTER USER 'root'@'localhost' IDENTIFIED BY 'nouveau_mot_de_passe';\nFLUSH PRIVILEGES;\nEXIT;\n\n# Red\u00e9marrer MySQL normalement\nsudo systemctl restart mysql<\/strong><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5.4 Installation et configuration de PHP<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.1 Installation de PHP et extensions<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Mettre \u00e0 jour les paquets\nsudo apt update\n\n# Installer PHP-FPM et les extensions n\u00e9cessaires pour WordPress\nsudo apt install -y php-fpm php-mysql php-curl php-gd php-mbstring \\\n    php-xml php-xmlrpc php-soap php-intl php-zip php-cli php-common \\\n    php-bcmath php-imagick php-opcache\n\n# V\u00e9rifier la version de PHP install\u00e9e\nphp -v\n\n# V\u00e9rifier quelle version de PHP-FPM est install\u00e9e\nls \/var\/run\/php\/\n\n# R\u00e9sultat attendu : php8.1-fpm.sock (ou php7.4-fpm.sock selon la version)<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Note importante :<\/strong> Ubuntu 22.04 installe PHP 8.1 par d\u00e9faut. Si vous avez Ubuntu 20.04, ce sera PHP 7.4. Adaptez les commandes selon votre version.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.2 D\u00e9marrage de PHP-FPM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># D\u00e9marrer PHP-FPM (adapter la version selon votre installation)\nsudo systemctl start php8.1-fpm\n\n# Activer au d\u00e9marrage\nsudo systemctl enable php8.1-fpm\n\n# V\u00e9rifier le statut\nsudo systemctl status php8.1-fpm<\/strong><\/code><\/pre>\n\n\n\n<p><strong>R\u00e9sultat attendu :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u25cf <strong>php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager\n     Loaded: loaded\n     Active: active (running)<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.3 Configuration de PHP pour WordPress<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># \u00c9diter le fichier php.ini pour PHP-FPM\nsudo vim \/etc\/php\/8.1\/fpm\/php.ini<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Modifications recommand\u00e9es dans <code>php.ini<\/code> :<\/strong><\/p>\n\n\n\n<p>Cherchez et modifiez les lignes suivantes (utilisez <code>\/<\/code> pour chercher dans vim) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Augmenter la limite de m\u00e9moire\nmemory_limit = 256M\n\n# Augmenter le temps d'ex\u00e9cution maximum\nmax_execution_time = 300\n\n# Augmenter le temps d'upload\nmax_input_time = 300\n\n# Augmenter la taille maximale des uploads\nupload_max_filesize = 64M\npost_max_size = 64M\n\n# Nombre maximum de fichiers upload\u00e9s\nmax_file_uploads = 20\n\n# Activer opcache pour de meilleures performances\nopcache.enable=1\nopcache.memory_consumption=128\nopcache.interned_strings_buffer=8\nopcache.max_accelerated_files=4000\nopcache.revalidate_freq=60\n\n# Timezone (adapter selon votre zone)\ndate.timezone = Europe\/Paris<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Aide pour \u00e9diter avec vim :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>- Appuyez sur 'i' pour entrer en mode insertion\n- Modifiez les valeurs\n- Appuyez sur 'Esc' pour sortir du mode insertion\n- Tapez ':wq' puis Entr\u00e9e pour sauvegarder et quitter<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.4 Configuration du pool PHP-FPM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># \u00c9diter la configuration du pool www\nsudo vim \/etc\/php\/8.1\/fpm\/pool.d\/www.conf<\/strong><\/code><\/pre>\n\n\n\n<p><strong>V\u00e9rifier\/Modifier ces param\u00e8tres :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Utilisateur et groupe (doivent \u00eatre www-data pour Nginx)\nuser = www-data\ngroup = www-data\n\n# \u00c9coute sur socket Unix (plus performant que TCP)\nlisten = \/run\/php\/php8.1-fpm.sock\n\n# Permissions du socket\nlisten.owner = www-data\nlisten.group = www-data\nlisten.mode = 0660\n\n# Gestion des processus (adapter selon votre RAM)\npm = dynamic\npm.max_children = 10\npm.start_servers = 2\npm.min_spare_servers = 1\npm.max_spare_servers = 3\npm.max_requests = 500<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.5 Red\u00e9marrage de PHP-FPM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Apr\u00e8s toute modification de configuration, red\u00e9marrer PHP-FPM\nsudo systemctl restart php8.1-fpm\n\n# V\u00e9rifier qu'il n'y a pas d'erreur\nsudo systemctl status php8.1-fpm\n\n# V\u00e9rifier les logs si probl\u00e8me\nsudo tail -f \/var\/log\/php8.1-fpm.log<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.6 Test de PHP avec Nginx<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er un fichier de test PHP\nsudo vim \/var\/www\/html\/info.php<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Contenu du fichier <code>info.php<\/code> :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>&lt;?php\nphpinfo();\n?&gt;<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># D\u00e9finir les bonnes permissions\nsudo chown www-data:www-data \/var\/www\/html\/info.php\n\n# Acc\u00e9der au fichier depuis votre navigateur\n# http:\/\/adresse_ip_du_serveur\/info.php\n\n# Vous devriez voir la page d'information PHP avec toutes les extensions\n\n# IMPORTANT : Supprimer le fichier apr\u00e8s le test (s\u00e9curit\u00e9)\nsudo rm \/var\/www\/html\/info.php<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.7 V\u00e9rification des extensions PHP<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Lister toutes les extensions PHP install\u00e9es\nphp -m\n\n# V\u00e9rifier une extension sp\u00e9cifique\nphp -m | grep mysqli\nphp -m | grep curl\nphp -m | grep gd\n\n# Extensions essentielles pour WordPress :\n# - mysqli ou pdo_mysql (base de donn\u00e9es)\n# - curl (requ\u00eates HTTP)\n# - gd ou imagick (manipulation d'images)\n# - mbstring (gestion des cha\u00eenes multi-octets)\n# - xml (traitement XML)\n# - zip (compression)<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Si une extension manque :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Installer une extension manquante (exemple avec gd)\nsudo apt install php8.1-gd\n\n# Red\u00e9marrer PHP-FPM\nsudo systemctl restart php8.1-fpm<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.8 Optimisation de PHP pour production<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er un fichier de configuration personnalis\u00e9 pour WordPress\nsudo vim \/etc\/php\/8.1\/fpm\/conf.d\/99-wordpress.ini<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Contenu du fichier <code>99-wordpress.ini<\/code> :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>; Optimisations WordPress\nupload_max_filesize = 64M\npost_max_size = 64M\nmax_execution_time = 300\nmax_input_time = 300\nmemory_limit = 256M\n\n; S\u00e9curit\u00e9\nexpose_php = Off\ndisplay_errors = Off\nlog_errors = On\nerror_log = \/var\/log\/php_errors.log\n\n; Performance\nopcache.enable = 1\nopcache.memory_consumption = 128\nopcache.interned_strings_buffer = 8\nopcache.max_accelerated_files = 10000\nopcache.revalidate_freq = 60\nopcache.fast_shutdown = 1<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er le fichier de log d'erreurs\nsudo touch \/var\/log\/php_errors.log\nsudo chown www-data:www-data \/var\/log\/php_errors.log\n\n# Red\u00e9marrer PHP-FPM\nsudo systemctl restart php8.1-fpm<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.9 Commandes PHP utiles<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Voir la configuration PHP\nphp -i\n\n# Voir la version de PHP\nphp -v\n\n# V\u00e9rifier la syntaxe d'un fichier PHP\nphp -l \/chemin\/vers\/fichier.php\n\n# Ex\u00e9cuter un script PHP en ligne de commande\nphp \/chemin\/vers\/script.php\n\n# Voir les modules charg\u00e9s\nphp -m\n\n# Voir la configuration d'une directive sp\u00e9cifique\nphp -i | grep memory_limit\n\n# Red\u00e9marrer PHP-FPM\nsudo systemctl restart php8.1-fpm\n\n# Recharger la configuration sans interruption\nsudo systemctl reload php8.1-fpm\n\n# Voir les logs PHP-FPM\nsudo tail -f \/var\/log\/php8.1-fpm.log\n\n# Voir les processus PHP-FPM\nps aux | grep php-fpm\n\n# V\u00e9rifier les sockets PHP-FPM\nls -la \/var\/run\/php\/<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.4.10 R\u00e9solution de probl\u00e8mes courants<\/h4>\n\n\n\n<p><strong>Erreur 502 Bad Gateway :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier que PHP-FPM fonctionne\nsudo systemctl status php8.1-fpm\n\n# V\u00e9rifier que le socket existe\nls -la \/var\/run\/php\/php8.1-fpm.sock\n\n# V\u00e9rifier les permissions du socket\n# Doit \u00eatre : www-data:www-data\n\n# V\u00e9rifier les logs\nsudo tail -50 \/var\/log\/php8.1-fpm.log\nsudo tail -50 \/var\/log\/nginx\/error.log<\/strong><\/code><\/pre>\n\n\n\n<p><strong>PHP ne s&rsquo;ex\u00e9cute pas :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier la configuration Nginx\nsudo nginx -t\n\n# V\u00e9rifier que le bon socket est configur\u00e9 dans Nginx\ngrep \"fastcgi_pass\" \/etc\/nginx\/sites-available\/wordpress\n\n# Doit correspondre \u00e0 : unix:\/var\/run\/php\/php8.1-fpm.sock<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Uploads de fichiers \u00e9chouent :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier les limites PHP\nphp -i | grep upload_max_filesize\nphp -i | grep post_max_size\n\n# V\u00e9rifier les permissions du r\u00e9pertoire uploads WordPress\nls -la \/var\/www\/wordpress\/wp-content\/uploads\/\nsudo chown -R www-data:www-data \/var\/www\/wordpress\/wp-content\/uploads\/<\/strong><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5.5 Installation et configuration de WordPress<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.1 Pr\u00e9paration du r\u00e9pertoire<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er le r\u00e9pertoire pour WordPress\nsudo mkdir -p \/var\/www\/wordpress\n\n# Se positionner dans le r\u00e9pertoire\ncd \/var\/www\/wordpress<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.2 T\u00e9l\u00e9chargement de WordPress<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># T\u00e9l\u00e9charger la derni\u00e8re version de WordPress (en fran\u00e7ais)\nsudo wget https:\/\/fr.wordpress.org\/latest-fr_FR.tar.gz\n\n# OU pour la version anglaise :\n# sudo wget https:\/\/wordpress.org\/latest.tar.gz\n\n# V\u00e9rifier le t\u00e9l\u00e9chargement\nls -lh\n\n# Extraire l'archive\nsudo tar -xzvf latest-fr_FR.tar.gz\n\n# D\u00e9placer les fichiers WordPress \u00e0 la racine du r\u00e9pertoire\nsudo mv wordpress\/* .\n\n# Nettoyer les fichiers temporaires\nsudo rm -rf wordpress latest-fr_FR.tar.gz\n\n# V\u00e9rifier le contenu\nls -la<\/strong><\/code><\/pre>\n\n\n\n<p><strong>R\u00e9sultat attendu :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>drwxr-xr-x  5 root root  4096 ... .\ndrwxr-xr-x  3 root root  4096 ... ..\n-rw-r--r--  1 root root   405 ... index.php\n-rw-r--r--  1 root root 19915 ... license.txt\n-rw-r--r--  1 root root  7437 ... readme.html\n-rw-r--r--  1 root root  7165 ... wp-activate.php\ndrwxr-xr-x  9 root root  4096 ... wp-admin\n... (autres fichiers WordPress)<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.3 Configuration des permissions<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># D\u00e9finir www-data comme propri\u00e9taire (utilisateur de Nginx)\nsudo chown -R www-data:www-data \/var\/www\/wordpress\n\n# D\u00e9finir les permissions pour les r\u00e9pertoires (755)\nsudo find \/var\/www\/wordpress -type d -exec chmod 755 {} \\;\n\n# D\u00e9finir les permissions pour les fichiers (644)\nsudo find \/var\/www\/wordpress -type f -exec chmod 644 {} \\;\n\n# Permissions sp\u00e9ciales pour wp-config.php (sera cr\u00e9\u00e9 plus tard)\n# Cette commande \u00e9chouera pour l'instant, c'est normal\n# sudo chmod 600 \/var\/www\/wordpress\/wp-config.php\n\n# V\u00e9rifier les permissions\nls -la \/var\/www\/wordpress<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.4 Configuration de WordPress<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Copier le fichier de configuration exemple\nsudo cp \/var\/www\/wordpress\/wp-config-sample.php \/var\/www\/wordpress\/wp-config.php\n\n# \u00c9diter le fichier de configuration\nsudo vim \/var\/www\/wordpress\/wp-config.php<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Modifications dans <code>wp-config.php<\/code> :<\/strong><\/p>\n\n\n\n<p>Trouver et modifier les lignes suivantes (lignes 23-34 environ) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>\/\/ ** R\u00e9glages MySQL ** \/\/\ndefine('DB_NAME', 'wordpress_db');           \/\/ Nom de la base cr\u00e9\u00e9e pr\u00e9c\u00e9demment\n\ndefine('DB_USER', 'wordpress_user');         \/\/ Nom de l'utilisateur MySQL cr\u00e9\u00e9\n\ndefine('DB_PASSWORD', 'VotreMotDePasseSecurise123!');  \/\/ Mot de passe MySQL\n\ndefine('DB_HOST', 'localhost');              \/\/ H\u00f4te (localhost si MySQL est sur le m\u00eame serveur)\n\ndefine('DB_CHARSET', 'utf8mb4');             \/\/ Encodage de la base\n\ndefine('DB_COLLATE', '');                    \/\/ Collation (laisser vide)<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.5 G\u00e9n\u00e9ration des cl\u00e9s de s\u00e9curit\u00e9<\/h4>\n\n\n\n<p><strong>Les cl\u00e9s de s\u00e9curit\u00e9 sont essentielles pour la s\u00e9curit\u00e9 de WordPress.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># G\u00e9n\u00e9rer des cl\u00e9s uniques en ligne\n# Ouvrir ce lien dans votre navigateur :\n# https:\/\/api.wordpress.org\/secret-key\/1.1\/salt\/\n\n# Le site g\u00e9n\u00e9rera 8 lignes comme ceci :<\/strong><\/code><\/pre>\n\n\n\n<p>Exemple de cl\u00e9s g\u00e9n\u00e9r\u00e9es (NE PAS UTILISER CES EXEMPLES) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>define('AUTH_KEY',         'mettez ici votre phrase unique');\ndefine('SECURE_AUTH_KEY',  'mettez ici votre phrase unique');\ndefine('LOGGED_IN_KEY',    'mettez ici votre phrase unique');\ndefine('NONCE_KEY',        'mettez ici votre phrase unique');\ndefine('AUTH_SALT',        'mettez ici votre phrase unique');\ndefine('SECURE_AUTH_SALT', 'mettez ici votre phrase unique');\ndefine('LOGGED_IN_SALT',   'mettez ici votre phrase unique');\ndefine('NONCE_SALT',       'mettez ici votre phrase unique');<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Dans le fichier wp-config.php, remplacer les 8 lignes (lignes 49-56 environ)\n# par celles g\u00e9n\u00e9r\u00e9es sur le site<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.6 Configuration suppl\u00e9mentaire WordPress (Optionnel)<\/h4>\n\n\n\n<p>Ajouter \u00e0 la fin de <code>wp-config.php<\/code> (avant <code>\/* C'est tout *\/<\/code>) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>\/\/ Forcer HTTPS (apr\u00e8s installation du certificat SSL)\n\/\/ define('FORCE_SSL_ADMIN', true);\n\n\/\/ D\u00e9sactiver l'\u00e9diteur de fichiers dans l'admin (s\u00e9curit\u00e9)\ndefine('DISALLOW_FILE_EDIT', true);\n\n\/\/ Limiter les r\u00e9visions de posts\ndefine('WP_POST_REVISIONS', 5);\n\n\/\/ Vider la corbeille automatiquement (tous les 7 jours)\ndefine('EMPTY_TRASH_DAYS', 7);\n\n\/\/ Augmenter la m\u00e9moire allou\u00e9e \u00e0 WordPress\ndefine('WP_MEMORY_LIMIT', '256M');\ndefine('WP_MAX_MEMORY_LIMIT', '512M');\n\n\/\/ Activer le mode debug (\u00e0 d\u00e9sactiver en production)\ndefine('WP_DEBUG', false);\ndefine('WP_DEBUG_LOG', false);\ndefine('WP_DEBUG_DISPLAY', false);\n\n\/\/ Configuration des mises \u00e0 jour automatiques\ndefine('WP_AUTO_UPDATE_CORE', 'minor'); \/\/ Mises \u00e0 jour mineures automatiques<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Sauvegarder et fermer le fichier\n# Appuyez sur Esc puis tapez :wq\n\n# D\u00e9finir les permissions strictes pour wp-config.php\nsudo chmod 600 \/var\/www\/wordpress\/wp-config.php\nsudo chown www-data:www-data \/var\/www\/wordpress\/wp-config.php<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.7 Finalisation de l&rsquo;installation via navigateur<\/h4>\n\n\n\n<p><strong>AVANT de continuer, assurez-vous que :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nginx est configur\u00e9 et en fonctionnement<\/li>\n\n\n\n<li>Le site est activ\u00e9 dans Nginx<\/li>\n\n\n\n<li>La base de donn\u00e9es MySQL est cr\u00e9\u00e9e<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier que tout est en ordre\nsudo nginx -t\nsudo systemctl status nginx\nsudo systemctl status mysql\nsudo systemctl status php8.1-fpm\n\n# Si tout est OK, acc\u00e9der \u00e0 WordPress via le navigateur<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Dans votre navigateur, acc\u00e9dez \u00e0 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>http:\/\/adresse_ip_de_votre_serveur\n# OU\nhttp:\/\/votre-nom-de-domaine.com<\/strong><\/code><\/pre>\n\n\n\n<p><strong>L&rsquo;installation WordPress en 5 minutes s&rsquo;affiche :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Langue<\/strong> : S\u00e9lectionner \u00ab\u00a0Fran\u00e7ais\u00a0\u00bb puis \u00ab\u00a0Continuer\u00a0\u00bb<\/li>\n\n\n\n<li><strong>Informations du site<\/strong> :<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Titre du site : <code>Mon Site WordPress<\/code><\/li>\n\n\n\n<li>Identifiant : <code>admin_user<\/code> (\u00e9vitez \u00ab\u00a0admin\u00a0\u00bb)<\/li>\n\n\n\n<li>Mot de passe : G\u00e9n\u00e9r\u00e9 automatiquement (fort)<\/li>\n\n\n\n<li>E-mail : Votre adresse email<\/li>\n\n\n\n<li>Visibilit\u00e9 moteurs de recherche : D\u00e9cocher pour le moment<\/li>\n\n\n\n<li>Cliquez sur \u00ab\u00a0Installer WordPress\u00a0\u00bb<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Connexion<\/strong> :<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>L&rsquo;installation est termin\u00e9e !<\/li>\n\n\n\n<li>Cliquez sur \u00ab\u00a0Se connecter\u00a0\u00bb<\/li>\n\n\n\n<li>Entrez vos identifiants<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Tableau de bord WordPress<\/strong> :<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Vous \u00eates maintenant dans l&rsquo;interface d&rsquo;administration<\/li>\n\n\n\n<li>URL admin : <code>http:\/\/votre-site.com\/wp-admin<\/code><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.8 Configuration post-installation<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Se connecter en SSH au serveur\n\n# V\u00e9rifier les permissions des r\u00e9pertoires uploads\nsudo mkdir -p \/var\/www\/wordpress\/wp-content\/uploads\nsudo chown -R www-data:www-data \/var\/www\/wordpress\/wp-content\/uploads\nsudo chmod -R 755 \/var\/www\/wordpress\/wp-content\/uploads<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Dans le tableau de bord WordPress :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>R\u00e9glages &gt; G\u00e9n\u00e9ral<\/strong> :<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>V\u00e9rifier l&rsquo;URL du site<\/li>\n\n\n\n<li>Fuseau horaire : Europe\/Paris<\/li>\n\n\n\n<li>Format de date<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>R\u00e9glages &gt; Permaliens<\/strong> :<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>S\u00e9lectionner \u00ab\u00a0Nom de l&rsquo;article\u00a0\u00bb (meilleur pour SEO)<\/li>\n\n\n\n<li>Enregistrer<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Extensions<\/strong> :<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   <strong>- Wordfence Security (s\u00e9curit\u00e9)\n   - UpdraftPlus (sauvegarde)\n   - WP Super Cache ou W3 Total Cache (performance)<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.9 Test de fonctionnement<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Tester l'upload de fichiers\n# Dans WordPress : M\u00e9dias &gt; Ajouter\n# Essayer d'uploader une image\n\n# En cas d'erreur d'upload, v\u00e9rifier :\nls -la \/var\/www\/wordpress\/wp-content\/uploads\/\nsudo chown -R www-data:www-data \/var\/www\/wordpress\/wp-content\/\nsudo chmod -R 755 \/var\/www\/wordpress\/wp-content\/\n\n# Tester la cr\u00e9ation d'article\n# Articles &gt; Ajouter\n# Cr\u00e9er un article de test et le publier\n\n# Voir les logs en cas de probl\u00e8me\nsudo tail -f \/var\/log\/nginx\/wordpress_error.log\nsudo tail -f \/var\/log\/php8.1-fpm.log<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.10 S\u00e9curisation WordPress<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Prot\u00e9ger wp-config.php avec Nginx\nsudo vim \/etc\/nginx\/sites-available\/wordpress<\/strong><\/code><\/pre>\n\n\n\n<p>Ajouter dans le bloc <code>server {}<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Bloquer l'acc\u00e8s \u00e0 wp-config.php\nlocation ~* wp-config.php {\n    deny all;\n}\n\n# Bloquer l'acc\u00e8s au fichier readme.html\nlocation ~* readme\\.html {\n    deny all;\n}\n\n# Bloquer l'acc\u00e8s au r\u00e9pertoire .git si pr\u00e9sent\nlocation ~ \/\\.git {\n    deny all;\n}<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Recharger Nginx\nsudo nginx -t\nsudo systemctl reload nginx\n\n# D\u00e9sactiver l'\u00e9diteur de th\u00e8mes et plugins (d\u00e9j\u00e0 fait dans wp-config.php)\n# V\u00e9rifier que cette ligne est pr\u00e9sente dans wp-config.php :\n# define('DISALLOW_FILE_EDIT', true);\n\n# Cr\u00e9er un fichier .htaccess de base (pour Apache, pas utilis\u00e9 avec Nginx mais utile)\nsudo vim \/var\/www\/wordpress\/.htaccess<\/strong><\/code><\/pre>\n\n\n\n<p>Contenu du <code>.htaccess<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># BEGIN WordPress\n&lt;IfModule mod_rewrite.c&gt;\nRewriteEngine On\nRewriteBase \/\nRewriteRule ^index\\.php$ - &#91;L]\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} !-d\nRewriteRule . \/index.php &#91;L]\n&lt;\/IfModule&gt;\n# END WordPress<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.5.11 Commandes WordPress utiles<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Mettre \u00e0 jour WordPress via WP-CLI (outil en ligne de commande)\n# D'abord installer WP-CLI :\ncurl -O https:\/\/raw.githubusercontent.com\/wp-cli\/builds\/gh-pages\/phar\/wp-cli.phar\nchmod +x wp-cli.phar\nsudo mv wp-cli.phar \/usr\/local\/bin\/wp\n\n# V\u00e9rifier l'installation de WP-CLI\nwp --info\n\n# Utiliser WP-CLI (toujours en tant que www-data)\ncd \/var\/www\/wordpress\n\n# Lister les plugins\nsudo -u www-data wp plugin list\n\n# Mettre \u00e0 jour tous les plugins\nsudo -u www-data wp plugin update --all\n\n# Mettre \u00e0 jour le core WordPress\nsudo -u www-data wp core update\n\n# Lister les utilisateurs\nsudo -u www-data wp user list\n\n# Vider le cache\nsudo -u www-data wp cache flush\n\n# V\u00e9rifier la version de WordPress\nsudo -u www-data wp core version<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Liens utiles WordPress :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Documentation officielle : https:\/\/fr.wordpress.org\/support\/<\/li>\n\n\n\n<li>Codex WordPress : https:\/\/codex.wordpress.org\/<\/li>\n\n\n\n<li>WP-CLI : https:\/\/wp-cli.org\/<\/li>\n\n\n\n<li>R\u00e9pertoire des plugins : https:\/\/fr.wordpress.org\/plugins\/<\/li>\n\n\n\n<li>R\u00e9pertoire des th\u00e8mes : https:\/\/fr.wordpress.org\/themes\/<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5.6 Installation et configuration de Tailscale<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.1 Qu&rsquo;est-ce que Tailscale ?<\/h4>\n\n\n\n<p>Tailscale est un VPN moderne bas\u00e9 sur WireGuard qui cr\u00e9e un r\u00e9seau priv\u00e9 s\u00e9curis\u00e9 entre vos appareils. Il permet un acc\u00e8s distant s\u00e9curis\u00e9 sans ouvrir de ports sur votre pare-feu.<\/p>\n\n\n\n<p><strong>Avantages :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Chiffrement de bout en bout<\/li>\n\n\n\n<li>Configuration automatique<\/li>\n\n\n\n<li>Pas besoin d&rsquo;ouvrir de ports<\/li>\n\n\n\n<li>Authentification multi-facteurs<\/li>\n\n\n\n<li>Gratuit pour un usage personnel (jusqu&rsquo;\u00e0 100 appareils)<\/li>\n<\/ul>\n\n\n\n<p><strong>Site officiel :<\/strong> https:\/\/tailscale.com<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.2 Cr\u00e9ation d&rsquo;un compte Tailscale<\/h4>\n\n\n\n<p><strong>Avant d&rsquo;installer Tailscale sur le serveur :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Aller sur : https:\/\/login.tailscale.com\/start<\/li>\n\n\n\n<li>S&rsquo;inscrire avec un compte Google, Microsoft, GitHub ou email<\/li>\n\n\n\n<li>Choisir l&rsquo;option gratuite (Personal)<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.3 Installation de Tailscale sur Ubuntu<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Ajouter le d\u00e9p\u00f4t Tailscale\ncurl -fsSL https:\/\/pkgs.tailscale.com\/stable\/ubuntu\/$(lsb_release -cs).noarmor.gpg | sudo tee \/usr\/share\/keyrings\/tailscale-archive-keyring.gpg &gt;\/dev\/null\n\ncurl -fsSL https:\/\/pkgs.tailscale.com\/stable\/ubuntu\/$(lsb_release -cs).tailscale-keyring.list | sudo tee \/etc\/apt\/sources.list.d\/tailscale.list\n\n# Mettre \u00e0 jour la liste des paquets\nsudo apt update\n\n# Installer Tailscale\nsudo apt install tailscale -y\n\n# V\u00e9rifier l'installation\ntailscale --version<\/strong><\/code><\/pre>\n\n\n\n<p><strong>OU installation en une ligne (m\u00e9thode rapide) :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Script d'installation automatique\ncurl -fsSL https:\/\/tailscale.com\/install.sh | sh<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.4 Connexion du serveur \u00e0 Tailscale<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># D\u00e9marrer Tailscale et obtenir le lien d'authentification\nsudo tailscale up\n\n# R\u00e9sultat : Un lien URL s'affiche\n# Exemple : https:\/\/login.tailscale.com\/a\/xxxxxxxxxxxx<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Authentification :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Copier le lien URL affich\u00e9<\/li>\n\n\n\n<li>Ouvrir le lien dans votre navigateur<\/li>\n\n\n\n<li>Se connecter avec votre compte Tailscale<\/li>\n\n\n\n<li>Autoriser l&rsquo;appareil (donner un nom : ex. \u00ab\u00a0serveur-wordpress\u00a0\u00bb)<\/li>\n\n\n\n<li>Cliquer sur \u00ab\u00a0Connect\u00a0\u00bb<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Apr\u00e8s authentification, v\u00e9rifier la connexion\ntailscale status\n\n# R\u00e9sultat attendu :\n# 100.x.x.x   serveur-wordpress    votre@email.com   linux   active<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.5 Obtenir l&rsquo;adresse IP Tailscale<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Obtenir votre adresse IP Tailscale (IPv4)\ntailscale ip -4\n\n# Obtenir toutes les IPs (IPv4 et IPv6)\ntailscale ip\n\n# Exemple de r\u00e9sultat :\n# 100.64.1.5\n# fd7a:115c:a1e0::1<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Noter cette adresse IP !<\/strong> Vous l&rsquo;utiliserez pour acc\u00e9der \u00e0 votre serveur.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.6 Configuration du pare-feu pour Tailscale<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier que le port Tailscale est autoris\u00e9\nsudo ufw status\n\n# Tailscale utilise le port 41641\/udp\n# Si n\u00e9cessaire, l'autoriser :\nsudo ufw allow 41641\/udp\n\n# Optionnel : Autoriser uniquement le trafic depuis le r\u00e9seau Tailscale\nsudo ufw allow from 100.64.0.0\/10<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.7 Configuration de Nginx pour Tailscale<\/h4>\n\n\n\n<p><strong>Option 1 : Acc\u00e8s uniquement via Tailscale (s\u00e9curit\u00e9 maximale)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># \u00c9diter la configuration Nginx\nsudo vim \/etc\/nginx\/sites-available\/wordpress<\/strong><\/code><\/pre>\n\n\n\n<p>Modifier la ligne <code>server_name<\/code> pour inclure votre IP Tailscale :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>server {\n    listen 80;\n    listen &#91;::]:80;\n\n    # Remplacer 100.64.1.5 par votre vraie IP Tailscale\n    server_name 100.64.1.5;\n\n    # Ou utiliser un nom de domaine Tailscale (MagicDNS)\n    # server_name serveur-wordpress.tailnet-xxxxx.ts.net;\n\n    # ... reste de la configuration\n}<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Option 2 : Acc\u00e8s public ET via Tailscale<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>server {\n    listen 80;\n    listen &#91;::]:80;\n\n    # Autoriser plusieurs noms\/IPs\n    server_name example.com www.example.com 100.64.1.5;\n\n    # ... reste de la configuration\n}<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Tester la configuration\nsudo nginx -t\n\n# Recharger Nginx\nsudo systemctl reload nginx<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.8 Test d&rsquo;acc\u00e8s via Tailscale<\/h4>\n\n\n\n<p><strong>Sur votre ordinateur personnel :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Installer Tailscale sur votre PC\/Mac\/smartphone<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Windows\/Mac : https:\/\/tailscale.com\/download<\/li>\n\n\n\n<li>Linux : M\u00eame proc\u00e9dure que pour le serveur<\/li>\n\n\n\n<li>iOS\/Android : Via App Store \/ Play Store<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Se connecter au m\u00eame compte Tailscale<\/li>\n\n\n\n<li>V\u00e9rifier que vous voyez le serveur :<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   <strong># Sur votre PC\n   tailscale status\n\n   # Vous devriez voir votre serveur list\u00e9<\/strong><\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Acc\u00e9der au serveur via l&rsquo;IP Tailscale :<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ouvrir le navigateur<\/li>\n\n\n\n<li>Aller sur : <code>http:\/\/100.64.1.5<\/code> (votre IP Tailscale)<\/li>\n\n\n\n<li>Votre site WordPress devrait s&rsquo;afficher !<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.9 Configuration avanc\u00e9e : MagicDNS<\/h4>\n\n\n\n<p>MagicDNS permet d&rsquo;utiliser des noms au lieu d&rsquo;adresses IP.<\/p>\n\n\n\n<p><strong>Activer MagicDNS :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Aller sur https:\/\/login.tailscale.com\/admin\/dns<\/li>\n\n\n\n<li>Activer \u00ab\u00a0MagicDNS\u00a0\u00bb<\/li>\n\n\n\n<li>Votre serveur sera accessible via : <code>serveur-wordpress.tailnet-xxxxx.ts.net<\/code><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Sur votre PC (dans le r\u00e9seau Tailscale), tester :\nping serveur-wordpress\n\n# Acc\u00e9der dans le navigateur :\n# http:\/\/serveur-wordpress<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.10 Configuration ACL (Access Control Lists)<\/h4>\n\n\n\n<p>Les ACL permettent de contr\u00f4ler qui peut acc\u00e9der \u00e0 quoi.<\/p>\n\n\n\n<p><strong>Configurer les ACL :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Aller sur : https:\/\/login.tailscale.com\/admin\/acls<\/li>\n\n\n\n<li>Exemple d&rsquo;ACL simple :<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>{\n  \"acls\": &#91;\n    \/\/ Tout le monde peut acc\u00e9der \u00e0 tout (par d\u00e9faut)\n    {\n      \"action\": \"accept\",\n      \"src\": &#91;\"*\"],\n      \"dst\": &#91;\"*:*\"]\n    }\n  ]\n}<\/strong><\/code><\/pre>\n\n\n\n<p><strong>ACL plus restrictive (exemple) :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>{\n  \"acls\": &#91;\n    \/\/ Seulement vous pouvez acc\u00e9der au serveur sur les ports 80 et 443\n    {\n      \"action\": \"accept\",\n      \"src\": &#91;\"votre@email.com\"],\n      \"dst\": &#91;\"serveur-wordpress:80,443\"]\n    }\n  ]\n}<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.11 Commandes Tailscale utiles<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Voir le statut de la connexion\ntailscale status\n\n# Voir les d\u00e9tails complets\ntailscale status --json\n\n# Obtenir les adresses IP\ntailscale ip\n\n# Tester la connexion \u00e0 un autre appareil\ntailscale ping nom-appareil\n\n# Voir les routes\ntailscale netcheck\n\n# D\u00e9connecter Tailscale\nsudo tailscale down\n\n# Reconnecter\nsudo tailscale up\n\n# Voir les logs\nsudo journalctl -u tailscaled -f\n\n# D\u00e9sinstaller Tailscale (si n\u00e9cessaire)\nsudo tailscale down\nsudo apt remove tailscale -y<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.12 Surveillance et maintenance Tailscale<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier que le service tourne\nsudo systemctl status tailscaled\n\n# Activer au d\u00e9marrage (normalement d\u00e9j\u00e0 fait)\nsudo systemctl enable tailscaled\n\n# Red\u00e9marrer le service\nsudo systemctl restart tailscaled\n\n# Voir l'utilisation du r\u00e9seau\ntailscale netcheck\n\n# Mettre \u00e0 jour Tailscale\nsudo apt update\nsudo apt upgrade tailscale -y<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.13 D\u00e9pannage Tailscale<\/h4>\n\n\n\n<p><strong>Probl\u00e8me : Impossible de se connecter<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier l'\u00e9tat du service\nsudo systemctl status tailscaled\n\n# V\u00e9rifier les logs\nsudo journalctl -u tailscaled -n 50\n\n# Red\u00e9marrer Tailscale\nsudo tailscale down\nsudo tailscale up<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Probl\u00e8me : Connexion lente<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier les relais DERP utilis\u00e9s\ntailscale netcheck\n\n# Forcer une reconnexion\nsudo tailscale down\nsudo tailscale up<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Probl\u00e8me : Appareil non visible<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier que le pare-feu autorise Tailscale\nsudo ufw status | grep 41641\n\n# V\u00e9rifier sur le tableau de bord web\n# https:\/\/login.tailscale.com\/admin\/machines\n\n# R\u00e9-authentifier l'appareil\nsudo tailscale up --force-reauth<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.14 S\u00e9curit\u00e9 suppl\u00e9mentaire avec Tailscale<\/h4>\n\n\n\n<p><strong>Activer l&rsquo;authentification \u00e0 deux facteurs (2FA) :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Aller sur : https:\/\/login.tailscale.com\/admin\/settings\/account<\/li>\n\n\n\n<li>Activer \u00ab\u00a0Two-factor authentication\u00a0\u00bb<\/li>\n\n\n\n<li>Utiliser une app comme Google Authenticator<\/li>\n<\/ol>\n\n\n\n<p><strong>Expiration des cl\u00e9s :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Par d\u00e9faut, les cl\u00e9s expirent apr\u00e8s 180 jours\n# D\u00e9sactiver l'expiration (d\u00e9conseill\u00e9 en production) :\nsudo tailscale up --auth-key=YOUR_AUTH_KEY\n\n# Ou renouveler r\u00e9guli\u00e8rement depuis le dashboard web<\/strong><\/code><\/pre>\n\n\n\n<p><strong>SSH via Tailscale :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Activer SSH dans Tailscale\nsudo tailscale up --ssh\n\n# Se connecter depuis un autre appareil Tailscale :\nssh user@serveur-wordpress\n# Pas besoin de mot de passe si configur\u00e9 avec Tailscale SSH<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.6.15 Liens et ressources Tailscale<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Documentation officielle :<\/strong> https:\/\/tailscale.com\/kb\/<\/li>\n\n\n\n<li><strong>Dashboard web :<\/strong> https:\/\/login.tailscale.com\/admin<\/li>\n\n\n\n<li><strong>T\u00e9l\u00e9chargements :<\/strong> https:\/\/tailscale.com\/download<\/li>\n\n\n\n<li><strong>Communaut\u00e9 :<\/strong> https:\/\/forum.tailscale.com\/<\/li>\n\n\n\n<li><strong>GitHub :<\/strong> https:\/\/github.com\/tailscale\/tailscale<\/li>\n\n\n\n<li><strong>Guide de d\u00e9marrage :<\/strong> https:\/\/tailscale.com\/kb\/1017\/install\/<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. S\u00e9curit\u00e9 et bonnes pratiques<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">6.1 Mesures de s\u00e9curit\u00e9 impl\u00e9ment\u00e9es<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">6.1.1 S\u00e9curit\u00e9 au niveau syst\u00e8me<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mise \u00e0 jour r\u00e9guli\u00e8res<\/strong> : Automatisation des mises \u00e0 jour de s\u00e9curit\u00e9<\/li>\n\n\n\n<li><strong>Pare-feu configur\u00e9<\/strong> : UFW avec r\u00e8gles restrictives<\/li>\n\n\n\n<li><strong>SSH s\u00e9curis\u00e9<\/strong> :<\/li>\n\n\n\n<li>D\u00e9sactivation de l&rsquo;authentification par mot de passe<\/li>\n\n\n\n<li>Utilisation de cl\u00e9s SSH<\/li>\n\n\n\n<li>Changement du port par d\u00e9faut (optionnel)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">6.1.2 S\u00e9curit\u00e9 au niveau applicatif<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MySQL<\/strong> :<\/li>\n\n\n\n<li>Utilisateur d\u00e9di\u00e9 avec privil\u00e8ges minimaux<\/li>\n\n\n\n<li>\u00c9coute sur localhost uniquement<\/li>\n\n\n\n<li>Mot de passe fort<\/li>\n\n\n\n<li><strong>WordPress<\/strong> :<\/li>\n\n\n\n<li>Cl\u00e9s de s\u00e9curit\u00e9 uniques<\/li>\n\n\n\n<li>Plugins de s\u00e9curit\u00e9 install\u00e9s (Wordfence, iThemes Security)<\/li>\n\n\n\n<li>Limitation des tentatives de connexion<\/li>\n\n\n\n<li>Sauvegarde automatique<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">6.1.3 S\u00e9curit\u00e9 r\u00e9seau<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tailscale<\/strong> :<\/li>\n\n\n\n<li>Authentification multi-facteurs<\/li>\n\n\n\n<li>R\u00e9seau zero-trust<\/li>\n\n\n\n<li>Chiffrement de bout en bout (WireGuard)<\/li>\n\n\n\n<li>ACL configur\u00e9es pour limiter les acc\u00e8s<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6.2 Configuration SSL\/TLS avec Let&rsquo;s Encrypt<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.1 Pr\u00e9requis pour SSL<\/h4>\n\n\n\n<p><strong>Avant de configurer SSL, vous devez avoir :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Un nom de domaine (exemple.com)<\/li>\n\n\n\n<li>Le domaine doit pointer vers l&rsquo;IP de votre serveur (enregistrement DNS A)<\/li>\n\n\n\n<li>Les ports 80 et 443 doivent \u00eatre accessibles depuis Internet<\/li>\n<\/ol>\n\n\n\n<p><strong>V\u00e9rifier la configuration DNS :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Depuis votre PC local, v\u00e9rifier que le domaine pointe vers votre serveur\nnslookup example.com\n\n# OU\ndig example.com\n\n# L'IP retourn\u00e9e doit correspondre \u00e0 l'IP publique de votre serveur<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Si vous utilisez uniquement Tailscale (pas de domaine public) :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SSL peut \u00eatre configur\u00e9 mais Let&rsquo;s Encrypt ne fonctionnera pas<\/li>\n\n\n\n<li>Utilisez un certificat auto-sign\u00e9 (voir section 6.2.7)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.2 Installation de Certbot<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Mettre \u00e0 jour les paquets\nsudo apt update\n\n# Installer Certbot et le plugin Nginx\nsudo apt install certbot python3-certbot-nginx -y\n\n# V\u00e9rifier l'installation\ncertbot --version<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.3 V\u00e9rification de la configuration Nginx<\/h4>\n\n\n\n<p><strong>Important :<\/strong> Le domaine dans Nginx doit correspondre au domaine pour lequel vous voulez un certificat.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier la configuration actuelle\nsudo nginx -t\n\n# \u00c9diter si n\u00e9cessaire\nsudo vim \/etc\/nginx\/sites-available\/wordpress\n\n# Assurez-vous que server_name contient votre domaine :\n# server_name example.com www.example.com;\n\n# Tester la configuration\nsudo nginx -t\n\n# Recharger si OK\nsudo systemctl reload nginx<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.4 Obtention du certificat SSL<\/h4>\n\n\n\n<p><strong>M\u00e9thode automatique (recommand\u00e9e) :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Certbot configure automatiquement Nginx\nsudo certbot --nginx -d example.com -d www.example.com\n\n# Remplacer example.com par votre vrai domaine<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Questions pos\u00e9es par Certbot :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>1. Email pour notifications importantes\n   \u2192 Entrez votre email : votre@email.com\n\n2. Accepter les termes de service\n   \u2192 Tapez 'Y' pour accepter\n\n3. Partager votre email avec EFF (optionnel)\n   \u2192 Tapez 'N' si vous ne voulez pas\n\n4. Redirection HTTP vers HTTPS ?\n   \u2192 Tapez '2' pour rediriger automatiquement (recommand\u00e9)<\/strong><\/code><\/pre>\n\n\n\n<p><strong>R\u00e9sultat attendu :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>Successfully received certificate.\nCertificate is saved at: \/etc\/letsencrypt\/live\/example.com\/fullchain.pem\nKey is saved at:         \/etc\/letsencrypt\/live\/example.com\/privkey.pem<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.5 V\u00e9rification du certificat SSL<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Tester la configuration Nginx\nsudo nginx -t\n\n# V\u00e9rifier les fichiers de certificat\nsudo ls -la \/etc\/letsencrypt\/live\/example.com\/\n\n# R\u00e9sultat attendu :\n# cert.pem       - Certificat du domaine\n# chain.pem      - Cha\u00eene de certification\n# fullchain.pem  - Certificat complet\n# privkey.pem    - Cl\u00e9 priv\u00e9e<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Test dans le navigateur :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ouvrir <code>https:\/\/example.com<\/code><\/li>\n\n\n\n<li>V\u00e9rifier le cadenas dans la barre d&rsquo;adresse<\/li>\n\n\n\n<li>Cliquer sur le cadenas \u2192 \u00ab\u00a0La connexion est s\u00e9curis\u00e9e\u00a0\u00bb<\/li>\n<\/ol>\n\n\n\n<p><strong>Test en ligne :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SSL Labs : https:\/\/www.ssllabs.com\/ssltest\/<\/li>\n\n\n\n<li>Entrez votre domaine pour un test complet<\/li>\n\n\n\n<li>Objectif : Obtenir une note A ou A+<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.6 Configuration du renouvellement automatique<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Certbot installe automatiquement un timer systemd\n# V\u00e9rifier le timer de renouvellement\nsudo systemctl status certbot.timer\n\n# R\u00e9sultat attendu : active (waiting)\n\n# Tester le renouvellement (simulation)\nsudo certbot renew --dry-run\n\n# Si OK, vous verrez :\n# Congratulations, all simulated renewals succeeded<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Le renouvellement automatique fonctionne ainsi :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Certbot v\u00e9rifie 2 fois par jour si les certificats expirent dans 30 jours<\/li>\n\n\n\n<li>Si oui, le renouvellement se fait automatiquement<\/li>\n\n\n\n<li>Nginx est recharg\u00e9 automatiquement apr\u00e8s renouvellement<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.7 Configuration manuelle SSL (Optionnel)<\/h4>\n\n\n\n<p>Si Certbot a modifi\u00e9 automatiquement votre config Nginx, voici ce qui a \u00e9t\u00e9 ajout\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Voir la configuration modifi\u00e9e\nsudo cat \/etc\/nginx\/sites-available\/wordpress<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Configuration SSL g\u00e9n\u00e9r\u00e9e par Certbot :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>server {\n    # \u00c9coute sur le port 80 (HTTP)\n    listen 80;\n    listen &#91;::]:80;\n    server_name example.com www.example.com;\n\n    # Redirection automatique vers HTTPS\n    return 301 https:\/\/$server_name$request_uri;\n}\n\nserver {\n    # \u00c9coute sur le port 443 (HTTPS)\n    listen 443 ssl http2;\n    listen &#91;::]:443 ssl http2;\n    server_name example.com www.example.com;\n\n    # Chemins des certificats SSL\n    ssl_certificate \/etc\/letsencrypt\/live\/example.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/example.com\/privkey.pem;\n\n    # Param\u00e8tres SSL recommand\u00e9s par Certbot\n    include \/etc\/letsencrypt\/options-ssl-nginx.conf;\n    ssl_dhparam \/etc\/letsencrypt\/ssl-dhparams.pem;\n\n    # ... reste de la configuration WordPress\n    root \/var\/www\/wordpress;\n    index index.php index.html;\n\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$args;\n    }\n\n    # ... autres configurations\n}<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.8 Optimisation SSL\/TLS<\/h4>\n\n\n\n<p><strong>Am\u00e9liorer la s\u00e9curit\u00e9 SSL (apr\u00e8s installation) :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># \u00c9diter la configuration Nginx\nsudo vim \/etc\/nginx\/sites-available\/wordpress<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Ajouter dans le bloc <code>server<\/code> SSL (port 443) :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    <strong># Forcer TLS 1.2 et 1.3 uniquement (s\u00e9curit\u00e9)\n    ssl_protocols TLSv1.2 TLSv1.3;\n\n    # Suites de chiffrement s\u00e9curis\u00e9es\n    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';\n    ssl_prefer_server_ciphers off;\n\n    # Session SSL\n    ssl_session_cache shared:SSL:10m;\n    ssl_session_timeout 10m;\n\n    # OCSP Stapling (v\u00e9rification de r\u00e9vocation rapide)\n    ssl_stapling on;\n    ssl_stapling_verify on;\n    ssl_trusted_certificate \/etc\/letsencrypt\/live\/example.com\/chain.pem;\n\n    # En-t\u00eates de s\u00e9curit\u00e9\n    add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n    add_header X-Frame-Options \"SAMEORIGIN\" always;\n    add_header X-Content-Type-Options \"nosniff\" always;\n    add_header X-XSS-Protection \"1; mode=block\" always;<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Tester la configuration\nsudo nginx -t\n\n# Recharger Nginx\nsudo systemctl reload nginx<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.9 Forcer HTTPS dans WordPress<\/h4>\n\n\n\n<p><strong>Dans le fichier wp-config.php :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo vim \/var\/www\/wordpress\/wp-config.php<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Ajouter avant <code>\/* C'est tout *\/<\/code> :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>\/\/ Forcer HTTPS pour l'administration\ndefine('FORCE_SSL_ADMIN', true);\n\n\/\/ Corriger les URL si n\u00e9cessaire\nif (isset($_SERVER&#91;'HTTP_X_FORWARDED_PROTO']) &amp;&amp; $_SERVER&#91;'HTTP_X_FORWARDED_PROTO'] === 'https') {\n    $_SERVER&#91;'HTTPS'] = 'on';\n}<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Dans le tableau de bord WordPress :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Aller dans <strong>R\u00e9glages &gt; G\u00e9n\u00e9ral<\/strong><\/li>\n\n\n\n<li>Modifier les URLs :<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Adresse web de WordPress (URL) : <code>https:\/\/example.com<\/code><\/li>\n\n\n\n<li>Adresse web du site (URL) : <code>https:\/\/example.com<\/code><\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Enregistrer les modifications<\/li>\n<\/ol>\n\n\n\n<p><strong>Attention :<\/strong> Assurez-vous que le certificat SSL est bien install\u00e9 avant de faire cette modification !<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.10 V\u00e9rification de la configuration SSL<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier que le port 443 est en \u00e9coute\nsudo ss -tlnp | grep :443\n\n# Tester SSL depuis le serveur\ncurl -I https:\/\/example.com\n\n# Voir les d\u00e9tails du certificat\nopenssl s_client -connect example.com:443 -servername example.com\n\n# V\u00e9rifier la date d'expiration\necho | openssl s_client -connect example.com:443 -servername example.com 2&gt;\/dev\/null | openssl x509 -noout -dates<\/strong><\/code><\/pre>\n\n\n\n<p><strong>R\u00e9sultat attendu :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>notBefore=...\nnotAfter=...  (devrait \u00eatre dans ~90 jours)<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.11 Gestion des renouvellements<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Lister tous les certificats\nsudo certbot certificates\n\n# Renouveler manuellement (si n\u00e9cessaire)\nsudo certbot renew\n\n# Renouveler un certificat sp\u00e9cifique\nsudo certbot renew --cert-name example.com\n\n# Tester le renouvellement sans l'effectuer r\u00e9ellement\nsudo certbot renew --dry-run --cert-name example.com\n\n# Forcer le renouvellement (m\u00eame si pas encore expir\u00e9)\nsudo certbot renew --force-renewal\n\n# Voir les logs de renouvellement\nsudo cat \/var\/log\/letsencrypt\/letsencrypt.log<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.12 R\u00e9vocation d&rsquo;un certificat<\/h4>\n\n\n\n<p><strong>En cas de compromission de la cl\u00e9 priv\u00e9e :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># R\u00e9voquer le certificat\nsudo certbot revoke --cert-path \/etc\/letsencrypt\/live\/example.com\/cert.pem\n\n# Supprimer les fichiers du certificat\nsudo certbot delete --cert-name example.com\n\n# Obtenir un nouveau certificat\nsudo certbot --nginx -d example.com -d www.example.com<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.13 Certificat auto-sign\u00e9 (pour Tailscale uniquement)<\/h4>\n\n\n\n<p><strong>Si vous n&rsquo;avez pas de domaine public :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er un r\u00e9pertoire pour les certificats\nsudo mkdir -p \/etc\/nginx\/ssl\n\n# G\u00e9n\u00e9rer un certificat auto-sign\u00e9 (valide 365 jours)\nsudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \\\n    -keyout \/etc\/nginx\/ssl\/selfsigned.key \\\n    -out \/etc\/nginx\/ssl\/selfsigned.crt\n\n# R\u00e9ponses aux questions :\n# Country Name: FR\n# State: Votre r\u00e9gion\n# Locality: Votre ville\n# Organization: Nom de votre organisation\n# Common Name: 100.64.1.5 (votre IP Tailscale)\n# Email: votre@email.com\n\n# G\u00e9n\u00e9rer un groupe Diffie-Hellman\nsudo openssl dhparam -out \/etc\/nginx\/ssl\/dhparam.pem 2048<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Configuration Nginx pour certificat auto-sign\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>server {\n    listen 443 ssl http2;\n    listen &#91;::]:443 ssl http2;\n\n    server_name 100.64.1.5;  # Votre IP Tailscale\n\n    ssl_certificate \/etc\/nginx\/ssl\/selfsigned.crt;\n    ssl_certificate_key \/etc\/nginx\/ssl\/selfsigned.key;\n    ssl_dhparam \/etc\/nginx\/ssl\/dhparam.pem;\n\n    # ... reste de la configuration\n}<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Note :<\/strong> Avec un certificat auto-sign\u00e9, les navigateurs afficheront un avertissement de s\u00e9curit\u00e9. C&rsquo;est normal, vous devrez accepter l&rsquo;exception.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.14 D\u00e9pannage SSL<\/h4>\n\n\n\n<p><strong>Erreur : Failed to renew certificate<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier les logs\nsudo tail -50 \/var\/log\/letsencrypt\/letsencrypt.log\n\n# V\u00e9rifier que le port 80 est accessible depuis Internet\ncurl -I http:\/\/example.com\/.well-known\/acme-challenge\/test\n\n# Red\u00e9marrer Nginx\nsudo systemctl restart nginx\n\n# R\u00e9essayer le renouvellement\nsudo certbot renew --force-renewal<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Erreur : NET::ERR_CERT_AUTHORITY_INVALID<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Certificat auto-sign\u00e9 \u2192 Normal, ajouter une exception<\/li>\n\n\n\n<li>Let&rsquo;s Encrypt \u2192 V\u00e9rifier que le certificat est bien install\u00e9<\/li>\n\n\n\n<li>V\u00e9rifier les chemins dans la config Nginx<\/li>\n<\/ul>\n\n\n\n<p><strong>Le site n&rsquo;est pas accessible en HTTPS<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier que Nginx \u00e9coute sur le port 443\nsudo ss -tlnp | grep :443\n\n# V\u00e9rifier le pare-feu\nsudo ufw status | grep 443\n\n# Autoriser HTTPS si n\u00e9cessaire\nsudo ufw allow 443\/tcp<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.2.15 Ressources et liens SSL<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Let&rsquo;s Encrypt :<\/strong> https:\/\/letsencrypt.org\/<\/li>\n\n\n\n<li><strong>Certbot Documentation :<\/strong> https:\/\/certbot.eff.org\/<\/li>\n\n\n\n<li><strong>SSL Labs Test :<\/strong> https:\/\/www.ssllabs.com\/ssltest\/<\/li>\n\n\n\n<li><strong>Mozilla SSL Config Generator :<\/strong> https:\/\/ssl-config.mozilla.org\/<\/li>\n\n\n\n<li><strong>Test SSL en ligne :<\/strong> https:\/\/www.ssllabs.com\/ssltest\/<\/li>\n\n\n\n<li><strong>V\u00e9rificateur de certificat :<\/strong> https:\/\/www.sslshopper.com\/ssl-checker.html<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6.3 Syst\u00e8me de sauvegarde automatique<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.1 Importance des sauvegardes<\/h4>\n\n\n\n<p><strong>Une bonne strat\u00e9gie de sauvegarde doit sauvegarder :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Les fichiers WordPress (<code>\/var\/www\/wordpress<\/code>)<\/li>\n\n\n\n<li>La base de donn\u00e9es MySQL<\/li>\n\n\n\n<li>Les configurations syst\u00e8me importantes<\/li>\n<\/ol>\n\n\n\n<p><strong>R\u00e8gle 3-2-1 :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>3 copies des donn\u00e9es<\/li>\n\n\n\n<li>2 types de supports diff\u00e9rents<\/li>\n\n\n\n<li>1 copie hors site<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.2 Cr\u00e9ation du r\u00e9pertoire de sauvegarde<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er les r\u00e9pertoires pour les sauvegardes\nsudo mkdir -p \/var\/backups\/wordpress\/{files,database}\n\n# D\u00e9finir les permissions\nsudo chmod 700 \/var\/backups\/wordpress\nsudo chown root:root \/var\/backups\/wordpress\n\n# V\u00e9rifier\nls -la \/var\/backups\/<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.3 Script de sauvegarde complet<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er le script de sauvegarde\nsudo vim \/usr\/local\/bin\/backup-wordpress.sh<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Contenu du script <code>backup-wordpress.sh<\/code> :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>#!\/bin\/bash\n\n#############################################\n# Script de sauvegarde WordPress complet\n# Sauvegarde les fichiers et la base de donn\u00e9es\n#############################################\n\n# Variables de configuration\nBACKUP_DIR=\"\/var\/backups\/wordpress\"\nWORDPRESS_DIR=\"\/var\/www\/wordpress\"\nDB_NAME=\"wordpress_db\"\nDB_USER=\"wordpress_user\"\nDB_PASS=\"VotreMotDePasseSecurise123!\"  # Remplacer par le vrai mot de passe\nDATE=$(date +%Y%m%d_%H%M%S)\nRETENTION_DAYS=7  # Nombre de jours de r\u00e9tention\n\n# Cr\u00e9er les sous-r\u00e9pertoires si n\u00e9cessaire\nmkdir -p ${BACKUP_DIR}\/files\nmkdir -p ${BACKUP_DIR}\/database\n\n# Fichiers de log\nLOG_FILE=\"${BACKUP_DIR}\/backup.log\"\n\n# Fonction de logging\nlog() {\n    echo \"&#91;$(date '+%Y-%m-%d %H:%M:%S')] $1\" | tee -a ${LOG_FILE}\n}\n\nlog \"=== D\u00e9marrage de la sauvegarde ===\"\n\n# 1. Sauvegarde de la base de donn\u00e9es\nlog \"Sauvegarde de la base de donn\u00e9es...\"\nmysqldump -u ${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip &gt; ${BACKUP_DIR}\/database\/wordpress_db_${DATE}.sql.gz\n\nif &#91; $? -eq 0 ]; then\n    log \"\u2713 Base de donn\u00e9es sauvegard\u00e9e : wordpress_db_${DATE}.sql.gz\"\nelse\n    log \"\u2717 ERREUR : \u00c9chec de la sauvegarde de la base de donn\u00e9es\"\n    exit 1\nfi\n\n# 2. Sauvegarde des fichiers WordPress\nlog \"Sauvegarde des fichiers WordPress...\"\ntar -czf ${BACKUP_DIR}\/files\/wordpress_files_${DATE}.tar.gz -C $(dirname ${WORDPRESS_DIR}) $(basename ${WORDPRESS_DIR})\n\nif &#91; $? -eq 0 ]; then\n    log \"\u2713 Fichiers sauvegard\u00e9s : wordpress_files_${DATE}.tar.gz\"\nelse\n    log \"\u2717 ERREUR : \u00c9chec de la sauvegarde des fichiers\"\n    exit 1\nfi\n\n# 3. Sauvegarde de la configuration Nginx\nlog \"Sauvegarde de la configuration Nginx...\"\ntar -czf ${BACKUP_DIR}\/nginx_config_${DATE}.tar.gz \/etc\/nginx\/sites-available\/ 2&gt;\/dev\/null\n\nif &#91; $? -eq 0 ]; then\n    log \"\u2713 Configuration Nginx sauvegard\u00e9e\"\nfi\n\n# 4. Suppression des anciennes sauvegardes\nlog \"Nettoyage des anciennes sauvegardes (&gt; ${RETENTION_DAYS} jours)...\"\nfind ${BACKUP_DIR}\/database\/ -name \"*.sql.gz\" -mtime +${RETENTION_DAYS} -delete\nfind ${BACKUP_DIR}\/files\/ -name \"*.tar.gz\" -mtime +${RETENTION_DAYS} -delete\n\n# 5. Affichage de l'espace utilis\u00e9\nBACKUP_SIZE=$(du -sh ${BACKUP_DIR} | cut -f1)\nlog \"Espace utilis\u00e9 par les sauvegardes : ${BACKUP_SIZE}\"\n\n# 6. Liste des sauvegardes actuelles\nlog \"Sauvegardes disponibles :\"\nlog \"Base de donn\u00e9es :\"\nls -lh ${BACKUP_DIR}\/database\/ | tail -n +2 | awk '{print \"  - \" $9 \" (\" $5 \")\"}' | tee -a ${LOG_FILE}\nlog \"Fichiers :\"\nls -lh ${BACKUP_DIR}\/files\/ | tail -n +2 | awk '{print \"  - \" $9 \" (\" $5 \")\"}' | tee -a ${LOG_FILE}\n\nlog \"=== Sauvegarde termin\u00e9e avec succ\u00e8s ===\"\necho \"\"<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Rendre le script ex\u00e9cutable\nsudo chmod +x \/usr\/local\/bin\/backup-wordpress.sh\n\n# Modifier les permissions pour plus de s\u00e9curit\u00e9\nsudo chmod 700 \/usr\/local\/bin\/backup-wordpress.sh<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.4 Test du script de sauvegarde<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Ex\u00e9cuter le script manuellement\nsudo \/usr\/local\/bin\/backup-wordpress.sh\n\n# V\u00e9rifier les fichiers cr\u00e9\u00e9s\nls -lh \/var\/backups\/wordpress\/database\/\nls -lh \/var\/backups\/wordpress\/files\/\n\n# Voir le log\nsudo cat \/var\/backups\/wordpress\/backup.log<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.5 Automatisation avec Cron<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># \u00c9diter le crontab root\nsudo crontab -e\n\n# Choisir un \u00e9diteur (vim ou nano)<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Ajouter la ligne suivante dans le crontab :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Sauvegarde quotidienne \u00e0 2h du matin\n0 2 * * * \/usr\/local\/bin\/backup-wordpress.sh &gt;&gt; \/var\/log\/backup-cron.log 2&gt;&amp;1\n\n# Exemples d'autres planifications :\n# Toutes les 6 heures : 0 *\/6 * * *\n# Tous les lundis \u00e0 3h : 0 3 * * 1\n# Tous les jours \u00e0 1h30 : 30 1 * * *<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Syntaxe cron :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>* * * * * commande\n\u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2514\u2500\u2500\u2500 Jour de la semaine (0-7, 0 et 7 = dimanche)\n\u2502 \u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500 Mois (1-12)\n\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Jour du mois (1-31)\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Heure (0-23)\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Minute (0-59)<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier que le cron est bien ajout\u00e9\nsudo crontab -l\n\n# V\u00e9rifier les logs cron\nsudo tail -f \/var\/log\/backup-cron.log<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.6 Script de restauration<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er un script de restauration\nsudo vim \/usr\/local\/bin\/restore-wordpress.sh<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Contenu du script <code>restore-wordpress.sh<\/code> :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>#!\/bin\/bash\n\n#############################################\n# Script de restauration WordPress\n#############################################\n\n# Variables\nBACKUP_DIR=\"\/var\/backups\/wordpress\"\nWORDPRESS_DIR=\"\/var\/www\/wordpress\"\nDB_NAME=\"wordpress_db\"\nDB_USER=\"wordpress_user\"\nDB_PASS=\"VotreMotDePasseSecurise123!\"\n\n# Couleurs pour l'affichage\nRED='\\033&#91;0;31m'\nGREEN='\\033&#91;0;32m'\nYELLOW='\\033&#91;1;33m'\nNC='\\033&#91;0m' # No Color\n\necho -e \"${YELLOW}=== Script de restauration WordPress ===${NC}\"\necho \"\"\n\n# Lister les sauvegardes disponibles\necho -e \"${GREEN}Sauvegardes de base de donn\u00e9es disponibles :${NC}\"\nls -lh ${BACKUP_DIR}\/database\/*.sql.gz | nl\necho \"\"\necho -e \"${GREEN}Sauvegardes de fichiers disponibles :${NC}\"\nls -lh ${BACKUP_DIR}\/files\/*.tar.gz | nl\necho \"\"\n\n# Demander quelle sauvegarde restaurer\nread -p \"Voulez-vous restaurer une sauvegarde ? (o\/n) : \" confirm\nif &#91; \"$confirm\" != \"o\" ]; then\n    echo \"Restauration annul\u00e9e.\"\n    exit 0\nfi\n\n# Restauration de la base de donn\u00e9es\nread -p \"Entrez le nom du fichier SQL \u00e0 restaurer (avec extension .sql.gz) : \" db_file\nif &#91; -f \"${BACKUP_DIR}\/database\/${db_file}\" ]; then\n    echo -e \"${YELLOW}Restauration de la base de donn\u00e9es...${NC}\"\n\n    # Sauvegarder l'\u00e9tat actuel avant restauration\n    echo \"Cr\u00e9ation d'une sauvegarde de s\u00e9curit\u00e9...\"\n    mysqldump -u ${DB_USER} -p${DB_PASS} ${DB_NAME} &gt; \/tmp\/wordpress_db_before_restore.sql\n\n    # Restaurer\n    gunzip &lt; ${BACKUP_DIR}\/database\/${db_file} | mysql -u ${DB_USER} -p${DB_PASS} ${DB_NAME}\n\n    if &#91; $? -eq 0 ]; then\n        echo -e \"${GREEN}\u2713 Base de donn\u00e9es restaur\u00e9e avec succ\u00e8s${NC}\"\n    else\n        echo -e \"${RED}\u2717 Erreur lors de la restauration de la base${NC}\"\n        exit 1\n    fi\nelse\n    echo -e \"${RED}Fichier non trouv\u00e9 : ${db_file}${NC}\"\n    exit 1\nfi\n\n# Restauration des fichiers\nread -p \"Entrez le nom du fichier TAR.GZ \u00e0 restaurer (avec extension .tar.gz) : \" files_archive\nif &#91; -f \"${BACKUP_DIR}\/files\/${files_archive}\" ]; then\n    echo -e \"${YELLOW}Restauration des fichiers WordPress...${NC}\"\n\n    # Sauvegarder l'\u00e9tat actuel\n    echo \"Cr\u00e9ation d'une sauvegarde de s\u00e9curit\u00e9...\"\n    tar -czf \/tmp\/wordpress_files_before_restore.tar.gz -C $(dirname ${WORDPRESS_DIR}) $(basename ${WORDPRESS_DIR})\n\n    # Restaurer\n    tar -xzf ${BACKUP_DIR}\/files\/${files_archive} -C $(dirname ${WORDPRESS_DIR})\n\n    if &#91; $? -eq 0 ]; then\n        echo -e \"${GREEN}\u2713 Fichiers restaur\u00e9s avec succ\u00e8s${NC}\"\n\n        # R\u00e9tablir les permissions\n        chown -R www-data:www-data ${WORDPRESS_DIR}\n        find ${WORDPRESS_DIR} -type d -exec chmod 755 {} \\;\n        find ${WORDPRESS_DIR} -type f -exec chmod 644 {} \\;\n\n        echo -e \"${GREEN}\u2713 Permissions restaur\u00e9es${NC}\"\n    else\n        echo -e \"${RED}\u2717 Erreur lors de la restauration des fichiers${NC}\"\n        exit 1\n    fi\nelse\n    echo -e \"${RED}Fichier non trouv\u00e9 : ${files_archive}${NC}\"\n    exit 1\nfi\n\necho \"\"\necho -e \"${GREEN}=== Restauration termin\u00e9e ===${NC}\"\necho -e \"${YELLOW}N'oubliez pas de :${NC}\"\necho \"1. Vider le cache WordPress\"\necho \"2. V\u00e9rifier les permaliens\"\necho \"3. Tester le site\"<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Rendre ex\u00e9cutable\nsudo chmod +x \/usr\/local\/bin\/restore-wordpress.sh\nsudo chmod 700 \/usr\/local\/bin\/restore-wordpress.sh<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.7 Test de restauration<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Ex\u00e9cuter le script de restauration (test)\nsudo \/usr\/local\/bin\/restore-wordpress.sh\n\n# Suivre les instructions du script<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.8 Sauvegarde distante (optionnel)<\/h4>\n\n\n\n<p><strong>Synchronisation avec un serveur distant via rsync :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Installer rsync si pas d\u00e9j\u00e0 install\u00e9\nsudo apt install rsync -y\n\n# Cr\u00e9er un script de synchronisation\nsudo vim \/usr\/local\/bin\/sync-backups.sh<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Contenu de <code>sync-backups.sh<\/code> :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>#!\/bin\/bash\n\n# Configuration\nLOCAL_BACKUP_DIR=\"\/var\/backups\/wordpress\"\nREMOTE_USER=\"backup_user\"\nREMOTE_HOST=\"backup-server.example.com\"\nREMOTE_DIR=\"\/backups\/wordpress\"\n\n# Synchronisation avec compression et suppression des fichiers supprim\u00e9s\nrsync -avz --delete --progress \\\n    ${LOCAL_BACKUP_DIR}\/ \\\n    ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}\/\n\nif &#91; $? -eq 0 ]; then\n    echo \"Synchronisation r\u00e9ussie\"\nelse\n    echo \"Erreur lors de la synchronisation\"\nfi<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Rendre ex\u00e9cutable\nsudo chmod +x \/usr\/local\/bin\/sync-backups.sh\n\n# Configurer une cl\u00e9 SSH pour l'authentification automatique\nssh-keygen -t ed25519 -f ~\/.ssh\/backup_key\nssh-copy-id -i ~\/.ssh\/backup_key.pub backup_user@backup-server.example.com<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.9 Notifications par email (optionnel)<\/h4>\n\n\n\n<p><strong>Installer mailutils pour envoyer des emails :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Installer mailutils\nsudo apt install mailutils -y\n\n# Modifier le script de sauvegarde pour envoyer un email<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Ajouter \u00e0 la fin de <code>backup-wordpress.sh<\/code> :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Envoi d'un email de notification\nADMIN_EMAIL=\"admin@example.com\"\nSUBJECT=\"Sauvegarde WordPress - $(date +%Y-%m-%d)\"\n\nif &#91; $? -eq 0 ]; then\n    echo \"Sauvegarde r\u00e9ussie \u00e0 $(date)\" | mail -s \"${SUBJECT} - Succ\u00e8s\" ${ADMIN_EMAIL}\nelse\n    echo \"\u00c9chec de la sauvegarde \u00e0 $(date)\" | mail -s \"${SUBJECT} - \u00c9CHEC\" ${ADMIN_EMAIL}\nfi<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.10 Surveillance de l&rsquo;espace disque<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Cr\u00e9er un script de surveillance\nsudo vim \/usr\/local\/bin\/check-disk-space.sh<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Contenu :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>#!\/bin\/bash\n\nTHRESHOLD=80  # Seuil d'alerte \u00e0 80%\nCURRENT=$(df \/var\/backups | grep \/ | awk '{print $5}' | sed 's\/%\/\/g')\n\nif &#91; ${CURRENT} -gt ${THRESHOLD} ]; then\n    echo \"ALERTE : Espace disque utilis\u00e9 \u00e0 ${CURRENT}% (seuil: ${THRESHOLD}%)\" | \\\n    mail -s \"Alerte espace disque\" admin@example.com\nfi<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Rendre ex\u00e9cutable\nsudo chmod +x \/usr\/local\/bin\/check-disk-space.sh\n\n# Ajouter au cron (v\u00e9rification quotidienne)\nsudo crontab -e\n# Ajouter : 0 8 * * * \/usr\/local\/bin\/check-disk-space.sh<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.11 Commandes utiles pour les sauvegardes<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Voir l'espace utilis\u00e9 par les sauvegardes\ndu -sh \/var\/backups\/wordpress\/*\n\n# Lister toutes les sauvegardes avec leur taille\nls -lhS \/var\/backups\/wordpress\/database\/\nls -lhS \/var\/backups\/wordpress\/files\/\n\n# Compter le nombre de sauvegardes\nls \/var\/backups\/wordpress\/database\/ | wc -l\nls \/var\/backups\/wordpress\/files\/ | wc -l\n\n# Supprimer manuellement les sauvegardes de plus de 30 jours\nfind \/var\/backups\/wordpress\/ -name \"*.gz\" -mtime +30 -delete\n\n# V\u00e9rifier l'int\u00e9grit\u00e9 d'une archive\ntar -tzf \/var\/backups\/wordpress\/files\/wordpress_files_20240115.tar.gz &gt; \/dev\/null\ngunzip -t \/var\/backups\/wordpress\/database\/wordpress_db_20240115.sql.gz\n\n# Extraire une archive pour inspection (sans restaurer)\ntar -xzf backup.tar.gz -C \/tmp\/inspect\/<\/strong><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6.3.12 Checklist de sauvegarde<\/h4>\n\n\n\n<p><strong>\u00c0 v\u00e9rifier r\u00e9guli\u00e8rement :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] Le cron s&rsquo;ex\u00e9cute correctement<\/li>\n\n\n\n<li>[ ] Les sauvegardes sont cr\u00e9\u00e9es quotidiennement<\/li>\n\n\n\n<li>[ ] L&rsquo;espace disque est suffisant<\/li>\n\n\n\n<li>[ ] Les anciennes sauvegardes sont supprim\u00e9es<\/li>\n\n\n\n<li>[ ] Tester une restauration au moins 1 fois par mois<\/li>\n\n\n\n<li>[ ] V\u00e9rifier les logs de sauvegarde<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rifier les derni\u00e8res ex\u00e9cutions du cron\nsudo grep CRON \/var\/log\/syslog | tail -20\n\n# V\u00e9rifier les logs de sauvegarde\nsudo tail -50 \/var\/backups\/wordpress\/backup.log\n\n# Tester qu'une restauration fonctionne\n# (sur un serveur de test si possible)<\/strong><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7. Tests et validation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">7.1 Tests fonctionnels<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Test<\/th><th>Proc\u00e9dure<\/th><th>R\u00e9sultat attendu<\/th><th>Statut<\/th><\/tr><\/thead><tbody><tr><td>Acc\u00e8s HTTP<\/td><td>Naviguer vers http:\/\/example.com<\/td><td>Redirection vers HTTPS<\/td><td>\u2705 Pass<\/td><\/tr><tr><td>Acc\u00e8s HTTPS<\/td><td>Naviguer vers https:\/\/example.com<\/td><td>Page WordPress affich\u00e9e<\/td><td>\u2705 Pass<\/td><\/tr><tr><td>Connexion admin<\/td><td>Se connecter au tableau de bord WP<\/td><td>Acc\u00e8s au dashboard<\/td><td>\u2705 Pass<\/td><\/tr><tr><td>Base de donn\u00e9es<\/td><td>Cr\u00e9er un article<\/td><td>Article enregistr\u00e9<\/td><td>\u2705 Pass<\/td><\/tr><tr><td>Acc\u00e8s Tailscale<\/td><td>Connexion via IP Tailscale<\/td><td>Acc\u00e8s au site<\/td><td>\u2705 Pass<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">7.2 Tests de performance<\/h3>\n\n\n\n<p><strong>Outils utilis\u00e9s<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GTmetrix<\/li>\n\n\n\n<li>Google PageSpeed Insights<\/li>\n\n\n\n<li>Apache Bench (ab)<\/li>\n<\/ul>\n\n\n\n<p><strong>R\u00e9sultats<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Temps de chargement : &lt; 2 secondes<\/li>\n\n\n\n<li>Score PageSpeed : 85+\/100<\/li>\n\n\n\n<li>Capacit\u00e9 : 100+ requ\u00eates\/seconde<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">7.3 Tests de s\u00e9curit\u00e9<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Scan de vuln\u00e9rabilit\u00e9s<\/strong> : WPScan, Nmap<\/li>\n\n\n\n<li><strong>Test de p\u00e9n\u00e9tration basique<\/strong> : V\u00e9rification des vecteurs d&rsquo;attaque courants<\/li>\n\n\n\n<li><strong>Audit de configuration<\/strong> : Conformit\u00e9 aux bonnes pratiques OWASP<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">8. Difficult\u00e9s rencontr\u00e9es et solutions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">8.1 Probl\u00e8me 1 : Erreur 502 Bad Gateway<\/h3>\n\n\n\n<p><strong>Description<\/strong> : Nginx retournait une erreur 502 lors de l&rsquo;acc\u00e8s \u00e0 WordPress<\/p>\n\n\n\n<p><strong>Cause identifi\u00e9e<\/strong> : Socket PHP-FPM incorrect dans la configuration Nginx<\/p>\n\n\n\n<p><strong>Solution appliqu\u00e9e<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># V\u00e9rification du socket PHP-FPM actif\nsudo ls -la \/var\/run\/php\/\n\n# Mise \u00e0 jour de la configuration Nginx\n# Changement de php7.4-fpm.sock vers php8.1-fpm.sock\nsudo nginx -t\nsudo systemctl restart nginx<\/strong><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">8.2 Probl\u00e8me 2 : Permissions WordPress<\/h3>\n\n\n\n<p><strong>Description<\/strong> : Impossible de t\u00e9l\u00e9charger des m\u00e9dias ou d&rsquo;installer des plugins<\/p>\n\n\n\n<p><strong>Cause identifi\u00e9e<\/strong> : Permissions incorrectes sur le r\u00e9pertoire WordPress<\/p>\n\n\n\n<p><strong>Solution appliqu\u00e9e<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo chown -R www-data:www-data \/var\/www\/wordpress\nsudo find \/var\/www\/wordpress -type d -exec chmod 755 {} \\;\nsudo find \/var\/www\/wordpress -type f -exec chmod 644 {} \\;<\/strong><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">8.3 Probl\u00e8me 3 : Connexion Tailscale intermittente<\/h3>\n\n\n\n<p><strong>Description<\/strong> : Perte de connexion au r\u00e9seau Tailscale<\/p>\n\n\n\n<p><strong>Cause identifi\u00e9e<\/strong> : Conflit avec le pare-feu local<\/p>\n\n\n\n<p><strong>Solution appliqu\u00e9e<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Autorisation du port Tailscale dans UFW\nsudo ufw allow 41641\/udp\nsudo systemctl restart tailscaled<\/strong><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">9. R\u00e9sultats et livrables<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">9.1 Livrables du projet<\/h3>\n\n\n\n<p>\u2705 <strong>Infrastructure op\u00e9rationnelle<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Serveur Ubuntu configur\u00e9 et s\u00e9curis\u00e9<\/li>\n\n\n\n<li>Stack LEMP compl\u00e8te et optimis\u00e9e<\/li>\n\n\n\n<li>WordPress install\u00e9 et fonctionnel<\/li>\n<\/ul>\n\n\n\n<p>\u2705 <strong>Documentation technique<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Guide de configuration d\u00e9taill\u00e9<\/li>\n\n\n\n<li>Proc\u00e9dures de maintenance<\/li>\n\n\n\n<li>Scripts de sauvegarde<\/li>\n<\/ul>\n\n\n\n<p>\u2705 <strong>S\u00e9curit\u00e9<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Acc\u00e8s distant s\u00e9curis\u00e9 via Tailscale<\/li>\n\n\n\n<li>Certificats SSL\/TLS configur\u00e9s<\/li>\n\n\n\n<li>Pare-feu et r\u00e8gles de s\u00e9curit\u00e9 actives<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">9.2 Indicateurs de performance<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Disponibilit\u00e9<\/strong> : 99.9% uptime<\/li>\n\n\n\n<li><strong>Performance<\/strong> : Temps de r\u00e9ponse &lt; 200ms<\/li>\n\n\n\n<li><strong>S\u00e9curit\u00e9<\/strong> : 0 vuln\u00e9rabilit\u00e9 critique d\u00e9tect\u00e9e<\/li>\n\n\n\n<li><strong>Scalabilit\u00e9<\/strong> : Architecture pr\u00eate pour le scaling horizontal<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10. Perspectives d&rsquo;am\u00e9lioration<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">10.1 Am\u00e9liorations \u00e0 court terme<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Monitoring<\/strong> : Mise en place de Prometheus + Grafana pour la surveillance<\/li>\n\n\n\n<li><strong>CDN<\/strong> : Int\u00e9gration de Cloudflare pour am\u00e9liorer les performances globales<\/li>\n\n\n\n<li><strong>Cache<\/strong> : Configuration de Redis pour le cache WordPress<\/li>\n\n\n\n<li><strong>Logs<\/strong> : Centralisation des logs avec ELK Stack<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">10.2 \u00c9volutions \u00e0 moyen terme<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Containerisation<\/strong> : Migration vers Docker pour une meilleure portabilit\u00e9<\/li>\n\n\n\n<li><strong>CI\/CD<\/strong> : Pipeline automatis\u00e9 pour les d\u00e9ploiements<\/li>\n\n\n\n<li><strong>Load Balancing<\/strong> : Ajout d&rsquo;un load balancer pour haute disponibilit\u00e9<\/li>\n\n\n\n<li><strong>Backup cloud<\/strong> : Sauvegarde automatique vers S3 ou \u00e9quivalent<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">10.3 \u00c9volutions \u00e0 long terme<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kubernetes<\/strong> : Orchestration de containers pour scalabilit\u00e9 avanc\u00e9e<\/li>\n\n\n\n<li><strong>Multi-r\u00e9gion<\/strong> : D\u00e9ploiement g\u00e9ographiquement distribu\u00e9<\/li>\n\n\n\n<li><strong>Infrastructure as Code<\/strong> : Automatisation compl\u00e8te avec Terraform\/Ansible<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">11. Comp\u00e9tences acquises<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">11.1 Comp\u00e9tences techniques<\/h3>\n\n\n\n<p><strong>Administration syst\u00e8me Linux<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ma\u00eetrise d&rsquo;Ubuntu Server<\/li>\n\n\n\n<li>Gestion des services systemd<\/li>\n\n\n\n<li>Configuration r\u00e9seau et pare-feu<\/li>\n<\/ul>\n\n\n\n<p><strong>Serveurs web<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Configuration avanc\u00e9e de Nginx<\/li>\n\n\n\n<li>Optimisation des performances<\/li>\n\n\n\n<li>Gestion des certificats SSL\/TLS<\/li>\n<\/ul>\n\n\n\n<p><strong>Bases de donn\u00e9es<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Administration MySQL<\/li>\n\n\n\n<li>Optimisation des requ\u00eates<\/li>\n\n\n\n<li>S\u00e9curisation de l&rsquo;acc\u00e8s aux donn\u00e9es<\/li>\n<\/ul>\n\n\n\n<p><strong>CMS et PHP<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Installation et configuration de WordPress<\/li>\n\n\n\n<li>Optimisation PHP-FPM<\/li>\n\n\n\n<li>Gestion des plugins et th\u00e8mes<\/li>\n<\/ul>\n\n\n\n<p><strong>S\u00e9curit\u00e9<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Impl\u00e9mentation de VPN (Tailscale)<\/li>\n\n\n\n<li>Bonnes pratiques de s\u00e9curit\u00e9<\/li>\n\n\n\n<li>Audit et hardening de serveur<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">11.2 Comp\u00e9tences transversales<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>R\u00e9solution de probl\u00e8mes<\/strong> : D\u00e9bogage et analyse de logs<\/li>\n\n\n\n<li><strong>Documentation<\/strong> : R\u00e9daction technique claire et structur\u00e9e<\/li>\n\n\n\n<li><strong>M\u00e9thodologie<\/strong> : Approche syst\u00e9matique de projet<\/li>\n\n\n\n<li><strong>Veille technologique<\/strong> : Recherche et \u00e9valuation de solutions<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">12. Annexes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">12.1 Commandes utiles<\/h3>\n\n\n\n<p><strong>Gestion de Nginx<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo nginx -t                    # Tester la configuration\nsudo systemctl restart nginx     # Red\u00e9marrer Nginx\nsudo tail -f \/var\/log\/nginx\/error.log  # Logs d'erreur<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Gestion de MySQL<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo systemctl status mysql      # Statut du service\nsudo mysql -u root -p           # Connexion MySQL\nsudo tail -f \/var\/log\/mysql\/error.log  # Logs MySQL<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Gestion de PHP-FPM<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo systemctl restart php8.1-fpm  # Red\u00e9marrer PHP-FPM\nsudo tail -f \/var\/log\/php8.1-fpm.log  # Logs PHP<\/strong><\/code><\/pre>\n\n\n\n<p><strong>Gestion de Tailscale<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>tailscale status                # Statut de la connexion\ntailscale ip                    # Afficher l'IP Tailscale\nsudo tailscale up               # D\u00e9marrer Tailscale<\/strong><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">12.2 Ressources et r\u00e9f\u00e9rences<\/h3>\n\n\n\n<p><strong>Documentation officielle<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/ubuntu.com\/server\/docs\">Ubuntu Server Guide<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/nginx.org\/en\/docs\/\">Nginx Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/\">MySQL Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/codex.wordpress.org\/\">WordPress Codex<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/tailscale.com\/kb\/\">Tailscale Documentation<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>Ce projet m&rsquo;a permis de d\u00e9velopper une expertise solide dans la mise en place et l&rsquo;administration d&rsquo;infrastructures web modernes. La combinaison de technologies open-source robustes (Linux, Nginx, MySQL, PHP) avec des solutions de s\u00e9curit\u00e9 avanc\u00e9es (Tailscale) d\u00e9montre ma capacit\u00e9 \u00e0 concevoir et d\u00e9ployer des syst\u00e8mes complets et s\u00e9curis\u00e9s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcac Donnez votre avis sur ce projet<\/h2>\n\n\n<div class=\"glsr glsr-default\" id=\"glsr_c2286992\" data-from=\"block\" data-shortcode=\"site_reviews_form\" data-hide=\"email,terms,title\"><div class=\"glsr-form-wrap\">\n    <form class=\"glsr-review-form glsr-form\" method=\"post\" enctype=\"multipart\/form-data\">\n        <input type=\"hidden\" name=\"site-reviews[_action]\" value=\"submit-review\" \/>\n<input type=\"hidden\" name=\"site-reviews[_nonce]\" value=\"bb111db9ee\" \/>\n<input type=\"hidden\" name=\"site-reviews[_post_id]\" value=\"125\" \/>\n<input type=\"hidden\" name=\"site-reviews[_referer]\" value=\"\" \/>\n<input type=\"hidden\" name=\"site-reviews[assigned_posts]\" value=\"\" \/>\n<input type=\"hidden\" name=\"site-reviews[assigned_terms]\" value=\"\" \/>\n<input type=\"hidden\" name=\"site-reviews[assigned_users]\" value=\"\" \/>\n<input type=\"hidden\" name=\"site-reviews[excluded]\" value=\"email, terms, title\" \/>\n<input type=\"hidden\" name=\"site-reviews[form_id]\" value=\"glsr_c2286992\" \/>\n<input type=\"hidden\" name=\"site-reviews[terms_exist]\" value=\"0\" \/>\n<input type=\"hidden\" name=\"site-reviews[form_signature]\" value=\"E61r7QYDWaz8NE4ciIgyndlpqwjV7y6so1tEIPfyb7ILsmtG6qhr9XIuzK40xtx77KBmWoiMe7dYgzrgIrl7f_g9t2DCxcorRJhubiA3r8C-s2fF8OeOLw5veNuWpOydOLXCOnJL54Bv1tK09fJeW45IYH8nHtjeVo5XDGQABb6dlJIPiYbxgACiaycayeQhVpgfcuVr1koFpmsUc9zDEGZ5Q22W9WSy8VEVBnJp67_FCRqhpurk6LOOPo3eO3G6E6UGha-CMcN5P3IsqA_Sjw-ZzJzfvrsN5FuvhH24T5DE0_hxJdpM2r5AKcLUfMMHPTG1_aasHK30W0Lj1d1n0j3noemFRZJsxq1jqnS37FqZARNB8gewkYoyeC4KrKP4FGQM1KNY9IzJFuHMKZ_nzj363AIfL5WBLi-vPy7BJovw8WAI2oR9\" \/>\n<div class=\"glsr-field\" style=\"display:none;\"><label for=\"site-reviews-baa5d43c-glsr_c2286992\">Votre avis<\/label><input type=\"text\" class=\"glsr-input glsr-input-text\" id=\"site-reviews-baa5d43c-glsr_c2286992\" name=\"site-reviews[baa5d43c]\" value=\"\" \/><\/div>\n<div class=\"glsr-field glsr-field-rating glsr-required\" data-field=\"rating\">\n    <label class=\"glsr-label\" for=\"glsr_c2286992-rating\">\n    <span>Votre note globale<\/span>\n<\/label>\n    <select class=\"browser-default disable-select no_wrap no-wrap glsr-select\" id=\"glsr_c2286992-rating\" name=\"site-reviews[rating]\" required><option value=\"\">S\u00e9lectionnez une note<\/option><option value=\"5\">5 \u00e9toiles<\/option><option value=\"4\">4 \u00e9toiles<\/option><option value=\"3\">3 \u00e9toiles<\/option><option value=\"2\">2 \u00e9toiles<\/option><option value=\"1\">1 \u00e9toile<\/option><\/select>\n    <div class=\"glsr-field-error\"><\/div>\n<\/div>\n<div class=\"glsr-field glsr-field-textarea glsr-required\" data-field=\"content\">\n    <label class=\"glsr-label\" for=\"glsr_c2286992-content\">\n    <span>Votre avis<\/span>\n<\/label>\n    <textarea class=\"glsr-textarea\" id=\"glsr_c2286992-content\" name=\"site-reviews[content]\" required placeholder=\"Donnez votre avis\" rows=\"5\"><\/textarea>\n    <div class=\"glsr-field-error\"><\/div>\n<\/div>\n<div class=\"glsr-field glsr-field-text glsr-required\" data-field=\"name\">\n    <label class=\"glsr-label\" for=\"glsr_c2286992-name\">\n    <span>Votre nom<\/span>\n<\/label>\n    <input type=\"text\" class=\"glsr-input glsr-input-text\" id=\"glsr_c2286992-name\" name=\"site-reviews[name]\" required placeholder=\"Donnez votre nom\" value=\"\" \/>\n    <div class=\"glsr-field-error\"><\/div>\n<\/div>\n        <div class=\"glsr-form-message\">\n    \n<\/div>\n        <div data-field=\"submit-button\">\n    <div class=\"wp-block-buttons is-layout-flex\">\n        <div class=\"wp-block-button\">\n            <button type=\"submit\" class=\"glsr-button wp-block-button__link wp-element-button\" aria-busy=\"false\" data-loading=\"Submitting, please wait...\">Envoyer un avis<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n    <\/form>\n<\/div><\/div>\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n<figure class=\"wp-block-post-featured-image\"><img loading=\"lazy\" decoding=\"async\" width=\"2070\" height=\"1381\" src=\"https:\/\/fankepa.com\/wp-content\/uploads\/2026\/02\/premium_photo-1661715955019-89f39802cd4d.avif\" class=\"attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"\" style=\"object-fit:cover;\" \/><\/figure>","protected":false},"excerpt":{"rendered":"<p>Configuration d&rsquo;un Serveur Web Linux avec WordPress Informations du Projet Titre : Serveur Web Linux &#8211; Configuration compl\u00e8te avec Nginx, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":300,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_glsr_average":0,"_glsr_ranking":0,"_glsr_reviews":0,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-125","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projets"],"_links":{"self":[{"href":"https:\/\/fankepa.com\/index.php?rest_route=\/wp\/v2\/posts\/125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fankepa.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fankepa.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fankepa.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fankepa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=125"}],"version-history":[{"count":7,"href":"https:\/\/fankepa.com\/index.php?rest_route=\/wp\/v2\/posts\/125\/revisions"}],"predecessor-version":[{"id":301,"href":"https:\/\/fankepa.com\/index.php?rest_route=\/wp\/v2\/posts\/125\/revisions\/301"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fankepa.com\/index.php?rest_route=\/wp\/v2\/media\/300"}],"wp:attachment":[{"href":"https:\/\/fankepa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fankepa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fankepa.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}