<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>VPS &#8211; Guides en français pour créer un site WordPress, Prestashop &#8211; Tutoriels LWS</title>
	<atom:link href="https://tutoriels.lws.fr/category/vps/feed" rel="self" type="application/rss+xml" />
	<link>https://tutoriels.lws.fr</link>
	<description>Didacticiels pour apprendre à utiliser WordPress et Prestashop</description>
	<lastBuildDate>Mon, 17 Aug 2026 12:26:47 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
<site xmlns="com-wordpress:feed-additions:1">203137720</site>	<item>
		<title>Comment utiliser Whisper AI pour transcrire des audios sur VPS</title>
		<link>https://tutoriels.lws.fr/vps/whisper-ai-transcription-audio-vps</link>
					<comments>https://tutoriels.lws.fr/vps/whisper-ai-transcription-audio-vps#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Mon, 17 Aug 2026 12:26:47 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=29915</guid>

					<description><![CDATA[Podcasts, webinaires, interviews, réunions ou vidéos : dès que vous produisez régulièrement du contenu audio, la transcription automatique peut faire gagner un temps précieux. ✨Elle permet notamment de créer des sous-titres, préparer des comptes-rendus, améliorer l’accessibilité d’une vidéo ou transformer un podcast en contenu textuel destiné au référencement. Les services de transcription dans le cloud &#8230; <a href="https://tutoriels.lws.fr/vps/whisper-ai-transcription-audio-vps" class="more-link">Continue reading <span class="screen-reader-text">Comment utiliser Whisper AI pour transcrire des audios sur VPS</span></a>]]></description>
										<content:encoded><![CDATA[<p>Podcasts, webinaires, interviews, réunions ou vidéos : dès que vous produisez régulièrement du contenu audio, la <strong>transcription automatique</strong> peut faire gagner un temps précieux. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />Elle permet notamment de créer des sous-titres, préparer des comptes-rendus, améliorer l’accessibilité d’une vidéo ou transformer un podcast en contenu textuel destiné au référencement. Les services de transcription dans le cloud sont pratiques, mais ils impliquent généralement une <strong>facturation liée à l’utilisation</strong> et l’envoi des fichiers audio vers une infrastructure tierce.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a5.png" alt="💥" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />Une autre approche consiste à installer <strong>Whisper AI</strong> directement sur son propre serveur. Le traitement peut alors être réalisé localement, sans transmettre les enregistrements à une API de transcription externe. Avec un <strong>VPS</strong>, il devient ainsi possible de mettre en place une solution de <strong>transcription audio open source</strong>, automatisable et entièrement contrôlée depuis son environnement Linux.</p>
<h2>Objectif</h2>
<p>Dans ce tutoriel, nous allons voir comment <strong>installer Whisper AI sur un VPS</strong> et l’utiliser pour transformer automatiquement des fichiers audio ou vidéo en texte. Whisper est un modèle de <strong>reconnaissance automatique de la parole</strong>, ou ASR (<em>Automatic Speech Recognition</em>), publié par OpenAI sous licence MIT. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />Nous nous concentrerons sur deux implémentations particulièrement intéressantes pour un serveur fonctionnant principalement avec son processeur : <strong>faster-whisper</strong>, basé sur CTranslate2, et <strong>whisper.cpp</strong>, une implémentation C/C++ légère pouvant fonctionner sans environnement Python. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />À la fin du tutoriel, votre <strong>VPS KVM LWS</strong> pourra transcrire un fichier en français, produire une transcription texte et générer des <strong>sous-titres SRT</strong>. Nous verrons également comment traiter plusieurs fichiers automatiquement et surveiller les ressources consommées pendant l’inférence.</p>
<h2>Pré-requis</h2>
<p>Avant de commencer l’installation de <strong>Whisper AI sur votre VPS</strong>, assurez-vous de disposer des éléments suivants :</p>
<ul>
<li>un <a title="VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">VPS KVM LWS</a> sous <strong>Ubuntu 22.04/24.04</strong> ou Debian avec un accès administrateur via <strong>SSH</strong> ;</li>
<li>au moins <strong>4 Go de RAM</strong> pour commencer confortablement avec des modèles légers ou intermédiaires ; davantage de mémoire est conseillé pour les modèles les plus volumineux ;</li>
<li>une installation fonctionnelle de <strong>Python 3</strong> si vous choisissez faster-whisper. À la date où nous rédigeons ce tutoriel, la documentation officielle de <strong>faster-whisper</strong> exige <strong>Python 3.9 ou supérieur</strong>.</li>
<li>l’outil <strong>ffmpeg</strong>, notamment utile pour convertir les fichiers audio avant leur traitement avec whisper.cpp ;</li>
<li>quelques connaissances de base des commandes Linux : connexion SSH, navigation entre les répertoires et installation de paquets.</li>
</ul>
<p>Les VPS utilisés dans ce tutoriel ne nécessitent pas de <strong>GPU dédié</strong>. Nous privilégierons des configurations adaptées à l’<strong>inférence CPU</strong> et éviterons de reprendre des performances mesurées sur GPU comme référence pour un VPS.</p>
<h2>Qu&rsquo;est-ce que Whisper : présentation factuelle</h2>
<p><strong>Whisper</strong> est un système de reconnaissance automatique de la parole développé par OpenAI et publié en open source en septembre 2022. Il repose sur une architecture Transformer capable d’effectuer plusieurs tâches liées au traitement de la voix, notamment la <strong>transcription multilingue</strong>, l’identification de la langue et la traduction de la parole vers l’anglais. Le modèle original a été entraîné sur <strong>680 000 heures de données audio et de transcriptions collectées sur Internet</strong>.</p>
<p>Le code de référence est distribué sous <strong>licence MIT</strong>, ce qui permet notamment une utilisation commerciale. Lorsqu’il est exécuté localement, Whisper ne nécessite pas de facturation à la minute : le coût correspond principalement aux ressources du serveur utilisé pour effectuer les calculs.</p>
<p>Pour une entreprise ou un créateur de contenu, l’auto-hébergement présente également un intérêt important : <strong>le fichier audio peut être traité directement sur le VPS</strong>, sans être envoyé à une API de transcription tierce.</p>
<table>
<thead>
<tr>
<th><strong>Critère</strong></th>
<th><strong>Whisper auto-hébergé</strong></th>
<th><strong>API de transcription cloud</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<blockquote><p><strong>Facturation de la transcription</strong></p></blockquote>
</td>
<td>
<blockquote><p>Pas de coût à la minute lié au modèle</p></blockquote>
</td>
<td>
<blockquote><p>Généralement liée au volume traité</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Emplacement des audios</strong></p></blockquote>
</td>
<td>
<blockquote><p>Traitement possible directement sur le serveur</p></blockquote>
</td>
<td>
<blockquote><p>Fichiers transmis au fournisseur</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Fonctionnement hors API externe</strong></p></blockquote>
</td>
<td>
<blockquote><p>Oui, une fois le modèle disponible localement</p></blockquote>
</td>
<td>
<blockquote><p>Non</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Contrôle de l’environnement</strong></p></blockquote>
</td>
<td>
<blockquote><p>Élevé : serveur, runtime et modèle sont configurables</p></blockquote>
</td>
<td>
<blockquote><p>Dépend du fournisseur</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Automatisation</strong></p></blockquote>
</td>
<td>
<blockquote><p>Scripts Python, Bash, Cron, n8n, etc.</p></blockquote>
</td>
<td>
<blockquote><p>API et outils proposés par le service</p></blockquote>
</td>
</tr>
</tbody>
</table>
<h3>Quels modèles Whisper sont disponibles ?</h3>
<p>Le dépôt officiel d’OpenAI référence actuellement six tailles principales : <strong>tiny, base, small, medium, large et turbo</strong>. Le choix du modèle influence directement la consommation de ressources et la qualité attendue de la transcription. OpenAI précise également que les vitesses relatives publiées dans sa documentation ont été mesurées sur GPU A100 : elles ne doivent donc pas être transposées à un <strong>VPS fonctionnant uniquement sur CPU</strong>.</p>
<table>
<thead>
<tr>
<th><strong>Modèle</strong></th>
<th align="right"><strong>Paramètres</strong></th>
<th align="right"><strong>Mémoire indicative avec whisper.cpp</strong>*</th>
<th><strong>Usage conseillé sur VPS</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<blockquote><p><code>tiny</code></p></blockquote>
</td>
<td align="right">
<blockquote><p>39 M</p></blockquote>
</td>
<td align="right">
<blockquote><p>~273 Mo</p></blockquote>
</td>
<td>
<blockquote><p>Tests rapides et ressources très limitées</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><code>base</code></p></blockquote>
</td>
<td align="right">
<blockquote><p>74 M</p></blockquote>
</td>
<td align="right">
<blockquote><p>~388 Mo</p></blockquote>
</td>
<td>
<blockquote><p>Premiers essais de transcription</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><code>small</code></p></blockquote>
</td>
<td align="right">
<blockquote><p>244 M</p></blockquote>
</td>
<td align="right">
<blockquote><p>~852 Mo</p></blockquote>
</td>
<td>
<blockquote><p>Bon point de départ pour un usage courant</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><code>medium</code></p></blockquote>
</td>
<td align="right">
<blockquote><p>769 M</p></blockquote>
</td>
<td align="right">
<blockquote><p>~2,1 Go</p></blockquote>
</td>
<td>
<blockquote><p>Plus exigeant en CPU et en mémoire</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><code>large</code> / <code>large-v3</code></p></blockquote>
</td>
<td align="right">
<blockquote><p>1 550 M</p></blockquote>
</td>
<td align="right">
<blockquote><p>~3,9 Go pour la famille large</p></blockquote>
</td>
<td>
<blockquote><p>À réserver aux VPS disposant de davantage de ressources</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><code>turbo</code></p></blockquote>
</td>
<td align="right">
<blockquote><p>809 M</p></blockquote>
</td>
<td align="right">
<blockquote><p>Variable selon le runtime et la quantification</p></blockquote>
</td>
<td>
<blockquote><p>Compromis intéressant à évaluer selon le serveur</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p>Les valeurs de mémoire indiquées proviennent de la documentation actuelle de <strong>whisper.cpp</strong> pour ses modèles GGML et ne doivent pas être assimilées aux besoins exacts de faster-whisper ou de l’implémentation PyTorch officielle.</p>
<p>Le modèle <strong>turbo</strong> est une version optimisée de <code>large-v3</code> utilisant <strong>809 millions de paramètres</strong>. OpenAI le présente comme plus rapide tout en limitant la dégradation de précision par rapport à <code>large-v3</code>. Il est toujours référencé dans le dépôt officiel en août 2026, et aucune annonce officielle d&rsquo;un modèle <strong>« Whisper v4 »</strong> n’apparaît actuellement dans les annonces du projet.</p>
<p>Dans un contexte <strong>VPS sans GPU</strong>, la taille du modèle n’est cependant qu’une partie de l’équation. Le <strong>runtime utilisé pour exécuter Whisper</strong> joue lui aussi un rôle déterminant. C’est précisément ce que nous allons comparer dans la section suivante.</p>
<h2>Choisir le bon runtime pour un VPS sans GPU</h2>
<p>Installer <strong>Whisper AI</strong> ne consiste pas seulement à choisir un modèle comme <code>small</code>, <code>medium</code> ou <code>turbo</code>. Il faut également sélectionner le <strong>runtime</strong>, c’est-à-dire l’implémentation qui chargera le modèle et réalisera concrètement la transcription.</p>
<p>Sur un <strong>VPS sans GPU dédié</strong>, ce choix est particulièrement important. Les trois principales solutions n’ont pas les mêmes dépendances ni les mêmes besoins.</p>
<table>
<thead>
<tr>
<th><strong>Runtime</strong></th>
<th><strong>Fonctionnement</strong></th>
<th><strong>Adapté à un VPS CPU ?</strong></th>
<th><strong>À privilégier si…</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<blockquote><p><strong>openai-whisper</strong></p></blockquote>
</td>
<td>
<blockquote><p>Implémentation de référence en Python utilisant notamment PyTorch</p></blockquote>
</td>
<td>
<blockquote><p>Oui, mais ce n’est pas l’option privilégiée dans ce tutoriel</p></blockquote>
</td>
<td>
<blockquote><p>Vous souhaitez utiliser directement l’implémentation officielle</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>faster-whisper</strong></p></blockquote>
</td>
<td>
<blockquote><p>Réimplémentation de Whisper avec <strong>CTranslate2</strong></p></blockquote>
</td>
<td>
<blockquote><p>Oui</p></blockquote>
</td>
<td>
<blockquote><p>Vous souhaitez travailler en Python et automatiser facilement vos transcriptions</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>whisper.cpp</strong></p></blockquote>
</td>
<td>
<blockquote><p>Implémentation légère en <strong>C/C++</strong>, avec prise en charge de l’inférence CPU</p></blockquote>
</td>
<td>
<blockquote><p>Oui</p></blockquote>
</td>
<td>
<blockquote><p>Vous recherchez une solution légère sans environnement Python pour l’exécution</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p>L’implémentation officielle <strong>openai-whisper</strong> repose notamment sur Python et PyTorch. Elle reste utile comme version de référence, mais nous utiliserons plutôt des runtimes spécifiquement intéressants pour un environnement serveur fonctionnant sur CPU.</p>
<p><strong>faster-whisper</strong> réimplémente Whisper avec le moteur d’inférence <strong>CTranslate2</strong>. Il prend en charge la quantification <strong>8 bits</strong>, y compris sur CPU, ce qui permet notamment de réduire l’empreinte mémoire dans certaines configurations. Son principal avantage dans ce tutoriel est de conserver un environnement <strong>Python</strong>, pratique pour intégrer ensuite la transcription dans un script, une application ou un workflow automatisé.</p>
<p><strong>whisper.cpp</strong>, de son côté, fournit une implémentation en C/C++ et prend explicitement en charge l’<strong>inférence uniquement sur CPU</strong>. Le projet fonctionne sous Linux et propose également la quantification des modèles. Il constitue donc une alternative particulièrement intéressante lorsqu’on souhaite limiter les dépendances logicielles liées à Python.</p>
<p>Dans la suite de ce tutoriel, nous allons installer <strong>les deux solutions</strong>. Vous pourrez ainsi choisir <strong>faster-whisper</strong> pour sa souplesse côté Python ou <strong>whisper.cpp</strong> pour son approche légère orientée CPU.</p>
<div class="alert_warning"><strong>Important :</strong> nous ne donnerons pas de durée de transcription théorique pour un VPS KVM LWS. Les performances dépendent du modèle, du nombre de cœurs CPU, du fichier traité et du runtime utilisé. Les résultats publiés par les projets sur d’autres configurations matérielles ne doivent pas être considérés comme des mesures représentatives d’un VPS LWS.</div>
<div class="bborder blue"></p>
<p><strong>Besoin d’un serveur pour héberger Whisper AI ?</strong></p>
<p>Un <strong>VPS KVM LWS</strong> fournit un <strong>accès root SSH</strong>, un stockage <strong>SSD NVMe</strong> et un système de <strong>monitoring CPU et RAM</strong>, autant d’éléments utiles pour installer et superviser un outil de transcription auto-hébergé. Les offres permettent également de conserver jusqu’à <strong>3 snapshots simultanés gratuits</strong>.</p>
<p><strong><a href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Voir les VPS KVM LWS</a></strong></p>
<p></div>
<h2>Créer un snapshot LWS avant l&rsquo;installation</h2>
<p>Avant d’installer des dépendances Python ou de compiler <strong>whisper.cpp</strong>, il est recommandé de créer un <strong>snapshot de votre VPS</strong>. Celui-ci capture l’état du serveur à un instant donné et peut faciliter un retour à une configuration précédente en cas de problème pendant vos manipulations.</p>
<p>Depuis votre espace de gestion LWS :</p>
<ul>
<li>accédez au <strong>VPS</strong> concerné ;</li>
<li>ouvrez la rubrique “<strong>Snapshots</strong>” ;</li>
</ul>
<p><img class="aligncenter wp-image-29428 size-full"  alt="Snapshots" width="1182" height="896" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Snapshots.webp"></p>
<ul>
<li>renseignez un nom permettant d’identifier facilement le snapshot ;</li>
<li>cliquez sur le bouton “<strong>Créer le snapshot</strong>”.</li>
</ul>
<p><img class="aligncenter wp-image-29924 size-full"  alt="Créer un snapshot sur un VPS KVM LWS" width="1177" height="737" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Creer-un-snapshot-sur-un-VPS-KVM-LWS.webp"></p>
<p>La gamme <strong>VPS KVM LWS</strong> permet actuellement de conserver jusqu’à <strong>3 snapshots simultanés gratuits</strong>. Cette précaution est particulièrement utile avant une installation, une compilation ou une modification importante de l’environnement logiciel.</p>
<p>Un snapshot constitue toutefois un <strong>point de restauration</strong> et ne doit pas remplacer une véritable stratégie de sauvegarde de vos données.</p>
<h2>Méthode 1 : Installer faster-whisper (Python)</h2>
<p>Commençons par <strong>faster-whisper</strong>, la méthode la plus adaptée si vous souhaitez manipuler les transcriptions depuis <strong>Python</strong>. Nous allons isoler son installation dans un environnement virtuel, puis créer un premier script capable de <strong>transcrire automatiquement un fichier audio en français</strong>.</p>
<h3>1. Installer les dépendances système</h3>
<p>Connectez-vous à votre <strong>VPS en SSH</strong> avec un compte disposant des droits nécessaires, puis mettez à jour l’index des paquets :</p>
<pre><code class="language-bash">apt update
</code></pre>
<p><img class="aligncenter size-full wp-image-29929"  alt="Mettre à jour les dépendances" width="1013" height="794" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Mettre-a-jour-les-dependances.webp"></p>
<p>Installez ensuite <strong>Python</strong>, <code>pip</code>, le module permettant de créer des environnements virtuels ainsi que <strong>ffmpeg</strong> :</p>
<pre><code class="language-bash">apt install python3 python3-pip python3-venv ffmpeg -y
</code></pre>
<p><img class="aligncenter size-full wp-image-29926"  alt="Installation de python en cours sur un VPS KVM" width="1011" height="792" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Installation-de-python-en-cours.webp"></p>
<p>La documentation actuelle de <strong>faster-whisper</strong> précise que le runtime décode lui-même les fichiers audio avec <strong>PyAV</strong>, qui embarque les bibliothèques FFmpeg nécessaires. L’installation de la commande système <code>ffmpeg</code> n’est donc pas indispensable à faster-whisper seul. Nous l’installons néanmoins dès maintenant, car elle sera utile pour <strong>convertir les fichiers audio</strong>, notamment lors de la méthode avec <strong>whisper.cpp</strong>.</p>
<h3>2. Vérifier la version de Python</h3>
<p>Avant d’installer <strong>faster-whisper</strong>, vérifiez la version de <strong>Python 3</strong> disponible sur votre VPS :</p>
<pre><code class="language-bash">python3 --version
</code></pre>
<p><img class="aligncenter size-full wp-image-29931"  alt="Vérifier la version de Python" width="1017" height="313" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Verifier-la-version-de-Python.webp"></p>
<p>La documentation actuelle de faster-whisper exige <strong>Python 3.9 ou une version supérieure</strong>. Si la commande renvoie une version compatible, vous pouvez poursuivre directement l’installation.</p>
<p>Pour connaître également la version de <code>pip</code>, utilisez :</p>
<pre><code class="language-bash">python3 -m pip --version
</code></pre>
<p><img class="aligncenter size-full wp-image-29932"  alt="vérifier le version de PIP" width="1011" height="320" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/verifier-le-version-de-PIP.webp"></p>
<p>L’utilisation de <code>python3 -m pip</code> permet de s’assurer que le gestionnaire de paquets appelé correspond bien à l’installation de <strong>Python</strong> utilisée sur le VPS.</p>
<h3>3. Créer un environnement virtuel (bonne pratique)</h3>
<p>Il est fortement recommandé d’installer <strong>faster-whisper dans un environnement virtuel Python</strong> plutôt que directement dans l’environnement système du VPS. Cette méthode permet d’isoler ses bibliothèques et leurs versions des autres applications Python installées sur le serveur.</p>
<p>Créez un environnement appelé <code>whisper-env</code> :</p>
<pre><code class="language-bash">python3 -m venv whisper-env
</code></pre>
<p><img class="aligncenter size-full wp-image-29923"  alt="créer un environnement whisper" width="1008" height="314" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/creer-un-environnement-whisper.webp"></p>
<p>Activez-le ensuite :</p>
<pre><code class="language-bash">source whisper-env/bin/activate</code></pre>
<p>Une fois l’environnement activé, le début de votre invite de commande devrait généralement afficher son nom :</p>
<pre><code class="language-text">(whisper-env) root@vps:~#<img class="aligncenter size-full wp-image-29922"  alt="Activer whisper après connexion" width="1022" height="420" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Activer-whisper-apres-connexion.webp"></code></pre>
<p>Vous pouvez également vérifier quel interpréteur Python est utilisé :</p>
<pre><code class="language-bash">which python
</code></pre>
<p><img class="aligncenter wp-image-29925 size-full"  alt="Exécuter la commande which command" width="1027" height="309" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Executer-la-commande-which-command.webp"></p>
<p>Le chemin retourné doit pointer vers le répertoire <code>whisper-env</code>.</p>
<p>Avant d’installer faster-whisper, vous pouvez mettre à jour <code>pip</code> dans cet environnement :</p>
<pre><code class="language-bash">python -m pip install --upgrade pip
</code></pre>
<p>À partir de maintenant, les dépendances installées resteront <strong>isolées dans cet environnement virtuel</strong>. Lors d’une future connexion SSH, pensez donc à le réactiver avec :</p>
<pre><code class="language-bash">source whisper-env/bin/activate
</code></pre>
<h3>4. Installer faster-whisper</h3>
<p>Une fois l’environnement virtuel actif, installez <strong>faster-whisper</strong> depuis PyPI :</p>
<pre><code class="language-bash">python -m pip install faster-whisper
</code></pre>
<p><img class="aligncenter size-full wp-image-29928"  alt="Installer Faster whisper" width="1017" height="696" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Installer-Faster-whisper.webp"></p>
<p>Il s’agit de la méthode d’installation actuellement recommandée. <strong>faster-whisper</strong> utilise <strong>CTranslate2</strong> comme moteur d’inférence et prend en charge la quantification en <strong>INT8 sur CPU</strong>, configuration que nous allons utiliser sur notre VPS.</p>
<p>Une fois l’installation terminée, vous pouvez vérifier que le paquet est bien présent :</p>
<pre><code class="language-bash">python -m pip show faster-whisper
</code></pre>
<p>La commande doit notamment afficher son nom et la version installée.</p>
<p>À ce stade, <strong>aucun modèle Whisper n’a nécessairement encore été téléchargé</strong>. Lorsque nous indiquerons une taille de modèle à <code>WhisperModel</code>, faster-whisper récupérera automatiquement le modèle CTranslate2 correspondant depuis <strong>Hugging Face Hub</strong> s’il n’est pas déjà disponible localement.</p>
<h3>5. Premier test de transcription</h3>
<p>Nous pouvons maintenant effectuer notre première <strong>transcription audio avec Whisper AI</strong>.</p>
<p>Pour commencer, placez un fichier appelé <code>audio.mp3</code> dans votre répertoire de travail. Vous pouvez vérifier sa présence avec :</p>
<pre><code class="language-bash">ls -lh audio.mp3
</code></pre>
<p>Créez ensuite un fichier Python nommé <code>transcrire.py</code> :</p>
<pre><code class="language-bash">nano transcrire.py
</code></pre>
<p>Ajoutez le code suivant :</p>
<pre><code class="language-python">from faster_whisper import WhisperModel

model_size = "small"

model = WhisperModel(
    model_size,
    device="cpu",
    compute_type="int8"
)

segments, info = model.transcribe(
    "audio.mp3",
    beam_size=5
)

print(
    f"Langue détectée : {info.language} "
    f"(confiance : {info.language_probability:.2f})"
)

for segment in segments:
    print(
        f"[{segment.start:.2f}s -&gt; {segment.end:.2f}s] "
        f"{segment.text}"
    )
</code></pre>
<p>Nous utilisons ici le modèle <strong><code>small</code></strong>, qui constitue un point de départ raisonnable pour tester l’installation avant d’expérimenter avec des modèles plus exigeants.</p>
<p>Le paramètre :</p>
<pre><code class="language-python">device="cpu"
</code></pre>
<p>indique explicitement que l’inférence doit être effectuée avec le <strong>processeur du VPS</strong>, tandis que :</p>
<pre><code class="language-python">compute_type="int8"
</code></pre>
<p>active le calcul <strong>INT8</strong>. Cette configuration CPU/INT8 est directement documentée par faster-whisper.</p>
<p>Dans cet exemple, nous ne renseignons volontairement pas <code>language="fr"</code>. Whisper peut ainsi effectuer la <strong>détection de langue</strong>, ce qui nous permet de vérifier que le fichier français est correctement identifié.</p>
<p>Si vous savez que tous vos fichiers seront en français, vous pourrez ensuite imposer cette langue :</p>
<pre><code class="language-python">segments, info = model.transcribe(
    "audio.mp3",
    language="fr"
)
</code></pre>
<p>Enregistrez le fichier avec <code>Ctrl + O</code>, validez avec <code>Entrée</code>, puis quittez Nano avec <code>Ctrl + X</code>.</p>
<p>Lancez maintenant le script :</p>
<pre><code class="language-bash">python transcrire.py
</code></pre>
<p>Lors du <strong>premier lancement</strong>, faster-whisper télécharge automatiquement le modèle correspondant à la taille indiquée lorsque celui-ci n’est pas encore disponible localement. Une connexion Internet est donc nécessaire pour cette première récupération.</p>
<p>Une fois le modèle chargé, le terminal devrait afficher la langue identifiée puis les différents segments de transcription avec leurs <strong>timestamps</strong> :</p>
<pre><code class="language-text">Langue détectée : fr (confiance : 0.99)
[0.00s -&gt; 4.28s] Bonjour et bienvenue dans cet épisode.
[4.28s -&gt; 8.74s] Aujourd'hui, nous allons parler d'hébergement web.
</code></pre>
<p>Les valeurs ci-dessus sont uniquement un <strong>exemple de format de sortie</strong> : la confiance, les timestamps et le texte dépendront évidemment de votre propre enregistrement.</p>
<p>Un détail important concerne le fonctionnement de faster-whisper : l’objet <code>segments</code> retourné par <code>model.transcribe()</code> est un <strong>générateur Python</strong>. La transcription est réellement exécutée lorsque ce générateur est parcouru, ce que réalise ici la boucle <code>for segment in segments</code>.</p>
<h2>Méthode 2 : Installer whisper.cpp (C/C++, léger)</h2>
<p>La deuxième méthode repose sur <strong>whisper.cpp</strong>, une implémentation de Whisper en <strong>C/C++</strong> particulièrement intéressante pour un serveur fonctionnant principalement sur <strong>CPU</strong>. Le projet prend en charge Linux et fournit un exécutable en ligne de commande, <code>whisper-cli</code>, permettant d’effectuer des transcriptions sans avoir à maintenir un environnement Python pour l’exécution.</p>
<p>Cette solution convient donc bien à un <strong>VPS aux ressources limitées</strong>, mais aussi aux utilisateurs qui souhaitent intégrer la transcription dans des scripts Bash ou d’autres outils système.</p>
<p>Contrairement à la méthode avec faster-whisper, nous allons ici <strong>compiler le programme directement sur le VPS</strong>, puis télécharger séparément un modèle Whisper converti au format <strong>GGML</strong>.</p>
<h3>1. Installer les outils de compilation</h3>
<p>Commencez par installer les paquets nécessaires à la récupération et à la <strong>compilation de whisper.cpp</strong> :</p>
<pre><code class="language-bash">apt update
</code></pre>
<p>Puis :</p>
<pre><code class="language-bash">apt install build-essential cmake git ffmpeg -y
</code></pre>
<p>Ces différents outils ont chacun un rôle précis :</p>
<ul>
<li><strong><code>build-essential</code></strong> fournit notamment le compilateur et les outils nécessaires à la compilation sous Linux ;</li>
<li><strong><code>cmake</code></strong> permet de configurer et construire la version actuelle de whisper.cpp ;</li>
<li><strong><code>git</code></strong> sert à récupérer le code source depuis son dépôt ;</li>
<li><strong><code>ffmpeg</code></strong> nous permettra de convertir les fichiers audio dans un format compatible avec la procédure utilisée dans ce tutoriel.</li>
</ul>
<p>La documentation actuelle de whisper.cpp utilise <strong>CMake</strong> pour construire <code>whisper-cli</code>. Les anciennes procédures basées uniquement sur des commandes <code>make</code> ne doivent donc pas être utilisées comme méthode principale d’installation.</p>
<p>Vous pouvez vérifier que les principaux outils sont disponibles avec :</p>
<pre><code class="language-bash">git --version
cmake --version
gcc --version
ffmpeg -version
</code></pre>
<p>Il n’est pas nécessaire d’installer <strong>CUDA</strong> pour suivre ce tutoriel. Nous compilons ici une version destinée à fonctionner avec le <strong>CPU du VPS</strong>.</p>
<h3>2. Cloner et compiler whisper.cpp</h3>
<p>Placez-vous dans le répertoire dans lequel vous souhaitez installer le programme, puis clonez le dépôt officiel :</p>
<pre><code class="language-bash">git clone https://github.com/ggml-org/whisper.cpp.git
</code></pre>
<p>Accédez ensuite au dossier créé :</p>
<pre><code class="language-bash">cd whisper.cpp
</code></pre>
<p>Configurez le projet avec <strong>CMake</strong> :</p>
<pre><code class="language-bash">cmake -B build
</code></pre>
<p>Puis lancez la compilation :</p>
<pre><code class="language-bash">cmake --build build -j --config Release
</code></pre>
<p>Cette procédure correspond au <strong>Quick Start actuel du projet whisper.cpp</strong>. Elle construit notamment l’exécutable <code>whisper-cli</code>, que nous utiliserons ensuite pour lancer nos transcriptions.</p>
<p>L’option <code>-j</code> permet à l’outil de compilation de paralléliser les tâches lorsque cela est possible. Comme cette opération peut solliciter plusieurs cœurs du serveur, il est normal d’observer temporairement une hausse de la <strong>charge CPU</strong> pendant la compilation.</p>
<p>Une fois l’opération terminée, vérifiez que l’exécutable a correctement été généré :</p>
<pre><code class="language-bash">ls -lh build/bin/whisper-cli
</code></pre>
<p>Vous pouvez également afficher son aide :</p>
<pre><code class="language-bash">./build/bin/whisper-cli -h
</code></pre>
<p>Si cette commande affiche les différentes options disponibles, <strong>whisper.cpp est correctement compilé</strong>.</p>
<p>À noter que le projet propose également des raccourcis tels que :</p>
<pre><code class="language-bash">make -j small
</code></pre>
<p>Cependant, cette commande ne se contente pas de télécharger le modèle : le <code>Makefile</code> actuel télécharge le modèle demandé, lance la construction puis exécute celui-ci sur les fichiers d’exemple présents dans le projet. Pour un tutoriel plus clair et plus contrôlé, nous séparons donc <strong>compilation</strong>, <strong>téléchargement du modèle</strong> et <strong>transcription</strong>.</p>
<h3>3. Télécharger un modèle</h3>
<p>whisper.cpp n’utilise pas directement les fichiers PyTorch distribués par OpenAI. Il charge des modèles convertis dans un format <strong>GGML</strong> adapté à l’implémentation C/C++. Le projet fournit un script permettant de télécharger directement ces modèles préconvertis.</p>
<p>Pour commencer avec le modèle <strong><code>small</code></strong>, exécutez depuis le répertoire <code>whisper.cpp</code> :</p>
<pre><code class="language-bash">sh ./models/download-ggml-model.sh small
</code></pre>
<p>Le fichier est alors enregistré dans le dossier <code>models</code>. Vous pouvez vérifier sa présence avec :</p>
<pre><code class="language-bash">ls -lh models/ggml-small.bin
</code></pre>
<p>Au moment de la rédaction, whisper.cpp propose notamment les modèles multilingues suivants :</p>
<pre><code class="language-text">tiny
base
small
medium
large-v1
large-v2
large-v3
large-v3-turbo
</code></pre>
<p>Le modèle <strong><code>large-v3-turbo</code></strong> est bien le nom actuellement utilisé par whisper.cpp pour la variante Turbo. Le projet propose aussi plusieurs modèles <strong>quantifiés</strong>, par exemple <code>large-v3-turbo-q5_0</code>, dont les fichiers occupent moins d’espace disque et nécessitent moins de mémoire que leur équivalent non quantifié.</p>
<p>Pour une <strong>transcription en français</strong>, choisissez un modèle multilingue comme <code>small</code> plutôt qu’une variante portant le suffixe <code>.en</code>. La documentation du projet précise en effet que les modèles contenant <code>.en</code> dans leur nom sont destinés à l’anglais, tandis que les autres modèles de cette liste sont multilingues.</p>
<p>Pour un premier essai sur VPS, nous resterons sur :</p>
<pre><code class="language-bash">sh ./models/download-ggml-model.sh small
</code></pre>
<p>Vous pourrez ensuite tester un autre modèle en fonction de la <strong>mémoire disponible</strong>, de la précision recherchée et du comportement réellement observé sur votre VPS. À titre indicatif, la documentation de whisper.cpp annonce environ <strong>466 MiB sur disque et 852 Mo de mémoire pour <code>small</code></strong>, contre environ <strong>1,5 GiB sur disque et 2,1 Go de mémoire pour <code>medium</code></strong>. Ces valeurs concernent le runtime whisper.cpp et ne constituent pas des mesures de vitesse de transcription.</p>
<p>Nous allons maintenant préparer notre fichier audio dans le format attendu avant de lancer la <strong>première transcription avec whisper.cpp</strong>.</p>
<h3>4. Convertir un fichier audio au format attendu</h3>
<p>Avant la transcription, nous allons convertir le fichier en <strong>WAV 16 bits, mono et 16 kHz</strong>. Le README principal de whisper.cpp recommande toujours ce format pour <code>whisper-cli</code>, même si l’aide actuelle de la commande mentionne également la prise en charge de fichiers FLAC, MP3 et OGG. Pour obtenir un fonctionnement reproductible sur VPS, la conversion préalable avec <strong>ffmpeg</strong> reste donc la méthode retenue dans ce tutoriel.</p>
<p>Depuis le dossier contenant votre fichier <code>audio.mp3</code>, exécutez :</p>
<pre><code class="language-bash">ffmpeg -i audio.mp3 -ar 16000 -ac 1 -c:a pcm_s16le audio.wav
</code></pre>
<p>Dans cette commande, <code>-ar 16000</code> fixe la fréquence d’échantillonnage à <strong>16 kHz</strong>, <code>-ac 1</code> produit une piste <strong>mono</strong> et <code>-c:a pcm_s16le</code> utilise un encodage PCM signé sur <strong>16 bits</strong>. Il s’agit de la commande de conversion fournie dans la documentation officielle de whisper.cpp.</p>
<p>Vérifiez ensuite que le fichier a bien été créé :</p>
<pre><code class="language-bash">ls -lh audio.wav
</code></pre>
<p>Vous disposez maintenant d’un fichier prêt à être utilisé pour notre premier test avec <strong>whisper.cpp</strong>.</p>
<h3>5. Lancer la transcription</h3>
<p>Depuis le répertoire <code>whisper.cpp</code>, lancez la transcription avec le modèle <strong><code>small</code></strong> téléchargé précédemment :</p>
<pre><code class="language-bash">./build/bin/whisper-cli \
  -m models/ggml-small.bin \
  -f audio.wav \
  -l fr
</code></pre>
<p>L’option <code>-m</code> indique le <strong>modèle Whisper</strong> à charger, <code>-f</code> désigne le fichier audio et <code>-l fr</code> précise que la langue parlée est le <strong>français</strong>. Cette dernière option est importante : l’aide actuelle de <code>whisper-cli</code> permet de fournir explicitement une langue ou d’utiliser <code>auto</code> pour demander une détection automatique.</p>
<p>Si vous souhaitez tester cette détection, utilisez plutôt :</p>
<pre><code class="language-bash">./build/bin/whisper-cli \
  -m models/ggml-small.bin \
  -f audio.wav \
  -l auto
</code></pre>
<p>Le terminal affiche progressivement les <strong>segments transcrits avec leurs timestamps</strong>. Le résultat exact dépend évidemment de l’enregistrement et du modèle sélectionné.</p>
<p>Nous disposons désormais de deux installations fonctionnelles de <strong>Whisper AI sur VPS</strong>. Voyons comment exploiter les timestamps produits pour créer directement des fichiers de sous-titres.</p>
<h2>Générer des sous-titres au format SRT</h2>
<p>Le format <strong>SRT (<em>SubRip Subtitle</em>)</strong> associe chaque portion de texte à un intervalle temporel. Il peut ensuite être importé dans de nombreux lecteurs et outils vidéo pour ajouter des <strong>sous-titres synchronisés</strong>, notamment à partir d’un podcast vidéo, d’un webinaire ou d’une interview.</p>
<h3>Avec faster-whisper (script Python) :</h3>
<p>Avec <strong>faster-whisper</strong>, nous pouvons construire le fichier SRT à partir des propriétés <code>start</code>, <code>end</code> et <code>text</code> de chaque segment retourné par la transcription. Ces informations sont exposées directement par l’objet <code>Segment</code> de faster-whisper.</p>
<p>Créez un nouveau fichier :</p>
<pre><code class="language-bash">nano generer_srt.py
</code></pre>
<p>Ajoutez le script suivant :</p>
<pre><code class="language-python">from faster_whisper import WhisperModel


def format_timestamp(seconds):
    milliseconds = round(seconds * 1000)

    hours, remainder = divmod(milliseconds, 3_600_000)
    minutes, remainder = divmod(remainder, 60_000)
    seconds, milliseconds = divmod(remainder, 1000)

    return (
        f"{hours:02d}:{minutes:02d}:"
        f"{seconds:02d},{milliseconds:03d}"
    )


model = WhisperModel(
    "small",
    device="cpu",
    compute_type="int8"
)

segments, info = model.transcribe(
    "audio.mp3",
    language="fr"
)

with open("sous-titres.srt", "w", encoding="utf-8") as fichier_srt:
    for numero, segment in enumerate(segments, start=1):
        fichier_srt.write(f"{numero}\n")
        fichier_srt.write(
            f"{format_timestamp(segment.start)} --&gt; "
            f"{format_timestamp(segment.end)}\n"
        )
        fichier_srt.write(f"{segment.text.strip()}\n\n")

print("Fichier sous-titres.srt généré avec succès.")
</code></pre>
<p>La configuration <strong>CPU avec <code>compute_type="int8"</code></strong> est prise en charge officiellement par faster-whisper. Comme <code>segments</code> est un générateur, la transcription est effectivement exécutée lorsque la boucle parcourt les différents segments pour écrire le fichier SRT.</p>
<p>Exécutez le script :</p>
<pre><code class="language-bash">python generer_srt.py
</code></pre>
<p>Vous devriez obtenir un fichier :</p>
<pre><code class="language-text">sous-titres.srt
</code></pre>
<p>Vous pouvez en afficher les premières lignes avec :</p>
<pre><code class="language-bash">head -n 12 sous-titres.srt
</code></pre>
<p>Le résultat prendra cette forme :</p>
<pre><code class="language-text">1
00:00:00,000 --&gt; 00:00:04,280
Bonjour et bienvenue dans cet épisode.

2
00:00:04,280 --&gt; 00:00:08,740
Aujourd'hui, nous allons parler d'hébergement web.
</code></pre>
<p>Les phrases et timestamps ci-dessus servent uniquement d’<strong>exemple de structure SRT</strong>. Ils seront remplacés par ceux calculés à partir de votre propre fichier audio.</p>
<h3>Avec whisper.cpp (option intégrée) :</h3>
<p>Avec <strong>whisper.cpp</strong>, la génération d’un fichier SRT est plus directe : <code>whisper-cli</code> possède une option dédiée aux <strong>sous-titres SRT</strong>. Le code source actuel du projet confirme que <code>-osrt</code> est l’alias de <code>--output-srt</code>.</p>
<p>Depuis le répertoire <code>whisper.cpp</code>, exécutez :</p>
<pre><code class="language-bash">./build/bin/whisper-cli \
  -m models/ggml-small.bin \
  -f audio.wav \
  -l fr \
  -osrt
</code></pre>
<p>La transcription est alors également enregistrée au <strong>format SRT</strong>.</p>
<p>Si vous souhaitez définir explicitement le nom du fichier de sortie, <code>whisper-cli</code> propose l’option <code>-of</code>, ou <code>--output-file</code>. Le chemin doit être fourni <strong>sans extension</strong>.</p>
<p>Par exemple :</p>
<pre><code class="language-bash">./build/bin/whisper-cli \
  -m models/ggml-small.bin \
  -f audio.wav \
  -l fr \
  -osrt \
  -of sous-titres
</code></pre>
<p>Vous obtenez alors :</p>
<pre><code class="language-text">sous-titres.srt
</code></pre>
<p>Vous pouvez vérifier les premières lignes avec :</p>
<pre><code class="language-bash">head -n 12 sous-titres.srt
</code></pre>
<p>Cette méthode est particulièrement pratique lorsque votre objectif principal consiste à <strong>générer rapidement des sous-titres</strong> sans développer de script Python supplémentaire.</p>
<h2>Traiter plusieurs fichiers automatiquement : script batch</h2>
<p>Une fois <strong>Whisper AI</strong> opérationnel, il est possible d’automatiser la transcription de plusieurs fichiers. C’est utile, par exemple, pour traiter une archive de podcasts, des enregistrements de réunions ou des fichiers audio déposés régulièrement sur le VPS.</p>
<p>Le premier script <code>transcrire.py</code> de ce tutoriel utilisait directement <code>audio.mp3</code>. Pour un traitement par lot, nous devons d’abord lui permettre de recevoir le <strong>chemin du fichier audio en argument</strong>.</p>
<p>Remplacez son contenu par :</p>
<pre><code class="language-python">import sys

from faster_whisper import WhisperModel


if len(sys.argv) != 2:
    print("Usage : python transcrire.py fichier_audio")
    sys.exit(1)

fichier_audio = sys.argv[1]

model = WhisperModel(
    "small",
    device="cpu",
    compute_type="int8"
)

segments, info = model.transcribe(
    fichier_audio,
    language="fr"
)

for segment in segments:
    print(segment.text.strip())
</code></pre>
<p>Vous pouvez désormais appeler le script avec n’importe quel fichier :</p>
<pre><code class="language-bash">python transcrire.py podcast.mp3
</code></pre>
<p>Créez ensuite les dossiers qui accueilleront les fichiers :</p>
<pre><code class="language-bash">mkdir -p /home/utilisateur/audios
mkdir -p /home/utilisateur/transcriptions
</code></pre>
<p>Puis créez <code>transcrire_dossier.sh</code> :</p>
<pre><code class="language-bash">nano transcrire_dossier.sh
</code></pre>
<p>Ajoutez :</p>
<pre><code class="language-bash">#!/bin/bash

shopt -s nullglob

for fichier in /home/utilisateur/audios/*.mp3; do
    nom=$(basename "$fichier" .mp3)

    /home/utilisateur/whisper-env/bin/python \
        /home/utilisateur/transcrire.py \
        "$fichier" \
        &gt; "/home/utilisateur/transcriptions/${nom}.txt"
done
</code></pre>
<p>Adaptez <code>/home/utilisateur/</code> au chemin réellement utilisé sur votre VPS.</p>
<p>Rendez ensuite le script exécutable :</p>
<pre><code class="language-bash">chmod +x transcrire_dossier.sh
</code></pre>
<p>Puis lancez-le :</p>
<pre><code class="language-bash">./transcrire_dossier.sh
</code></pre>
<p>Chaque fichier MP3 présent dans <code>audios</code> produit alors une <strong>transcription TXT portant le même nom</strong> dans le dossier <code>transcriptions</code>.</p>
<p>Nous utilisons volontairement le chemin complet vers :</p>
<pre><code class="language-text">/home/utilisateur/whisper-env/bin/python
</code></pre>
<p>Cette méthode évite de dépendre de l’activation manuelle de l’<strong>environnement virtuel Python</strong>, ce qui devient particulièrement important lorsqu’un script est lancé automatiquement par <strong>Cron</strong>.</p>
<p>Pour planifier, par exemple, une transcription chaque nuit, vous pouvez ensuite créer une tâche Cron. Le guide LWS consacré aux Cron Jobs détaille la syntaxe et la gestion de ces tâches sur Linux.</p>
<p>Vous pouvez consulter le tutoriel : <a title="Cron Job : Guide complet pour les débutants" href="https://tutoriels.lws.fr/vps/guide-cron-job-pour-debutant-2022">automatiser vos transcriptions avec une tâche planifiée Cron</a>.</p>
<div class="bborder green"></p>
<p><strong>À savoir :</strong> cette méthode simple relance Python et recharge le modèle pour chaque fichier. Elle convient bien pour comprendre le principe ou traiter un nombre limité d’audios. Pour des volumes importants, un script Python unique chargeant le modèle une seule fois avant de parcourir tous les fichiers sera plus efficace.</div>
<h2>Superviser les ressources pendant la transcription</h2>
<p>La <strong>transcription audio par IA</strong> sollicite principalement le processeur et la mémoire lorsque Whisper fonctionne sans GPU. Plus le modèle choisi est volumineux, plus il est important de vérifier le comportement réel du serveur pendant les premiers traitements.</p>
<p>Le <strong>Panel KVM LWS</strong> permet de suivre depuis une interface graphique différentes ressources du VPS, notamment la <strong>charge CPU</strong>, la <strong>mémoire RAM</strong> et le trafic réseau. Cette supervision est déjà utilisée dans les tutoriels LWS consacrés aux VPS pour identifier rapidement une hausse de consommation.</p>
<p>Pendant une transcription, ouvrez donc la partie consacrée à la <strong>supervision des ressources</strong> dans votre Panel KVM et observez principalement :</p>
<ul>
<li>la <strong>charge CPU</strong> pendant le traitement ;</li>
<li>la <strong>mémoire RAM utilisée</strong> ;</li>
<li>l’évolution des ressources lorsque plusieurs fichiers sont traités successivement ;</li>
<li>l’impact éventuel sur les autres services hébergés sur le même VPS.</li>
</ul>
<p>Un CPU fortement sollicité pendant l’inférence n’indique pas nécessairement une anomalie. En revanche, si le serveur devient difficilement utilisable ou manque régulièrement de mémoire, commencez par tester un <strong>modèle Whisper plus léger</strong> avant d’augmenter les ressources du VPS.</p>
<p>Aucun temps de traitement précis n’est donné ici : il doit être mesuré sur la <strong>configuration CPU réelle du VPS KVM LWS</strong> utilisé.</p>
<h2>Cas d&rsquo;usage concrets sur un VPS LWS</h2>
<p>Une fois la <strong>transcription Whisper automatisée</strong>, elle peut être intégrée à de nombreux workflows : création de contenus SEO à partir de podcasts, <strong>sous-titrage de vidéos</strong>, comptes-rendus confidentiels ou encore automatisations combinant Whisper avec d’autres outils hébergés sur le même VPS.</p>
<h3>Transcription de podcasts pour le SEO</h3>
<p>Une <strong>transcription de podcast</strong> peut servir de matière première pour créer un article de blog, une FAQ, un résumé ou des extraits destinés aux réseaux sociaux. Whisper produit d’abord le texte brut de l’épisode, qui doit ensuite être <strong>relue, corrigé et restructuré</strong> avant publication : une transcription automatique ne remplace pas le travail éditorial nécessaire à un contenu SEO de qualité.</p>
<p>Vous pouvez également <a title="LLM AI open source : déployer et utiliser un modèle de langage sur son VPS" href="https://tutoriels.lws.fr/vps/llm-ai-open-source-vps">combiner Whisper avec un LLM local pour résumer automatiquement vos transcriptions</a>.</p>
<p>Un workflow peut ainsi suivre cette logique :</p>
<p><strong>Podcast → Whisper → transcription texte → LLM local → résumé ou structure d’article → relecture humaine<br />
→ publication</strong></p>
<p>Cette approche permet d’exploiter plus facilement un même contenu audio sous plusieurs formats tout en conservant le traitement principal sur votre infrastructure.</p>
<h3>Sous-titrage de vidéos et accessibilité</h3>
<p>Les fichiers <strong>SRT générés avec Whisper AI</strong> peuvent également servir à créer des sous-titres synchronisés pour des interviews, tutoriels vidéo, webinaires ou podcasts filmés.</p>
<p>Les <strong>WCAG 2.2</strong> prévoient notamment, avec le critère 1.2.2 de niveau A, des sous-titres pour les contenus audio préenregistrés présents dans un média synchronisé. Le W3C précise que ces sous-titres doivent transmettre non seulement les paroles, mais aussi les informations sonores nécessaires à la compréhension, comme l’identification d’un intervenant ou certains effets sonores significatifs.</p>
<p>Une transcription Whisper constitue donc une excellente base, mais elle doit être <strong>vérifiée et éventuellement complétée manuellement</strong> avant d’être considérée comme un véritable sous-titrage accessible.</p>
<p>Pour approfondir ce sujet, consultez le guide LWS expliquant comment <a title="Comment rendre son site web accessible : guide WCAG pour WordPress" href="https://tutoriels.lws.fr/wordpress/accessibilite-site-web-wcag-wordpress">les sous-titres générés contribuent aux critères d&rsquo;accessibilité WCAG de votre site</a>. Cet article détaille notamment l’accessibilité des contenus audio et vidéo.</p>
<h3>Comptes-rendus de réunions confidentielles</h3>
<p>Pour une entreprise, <strong>Whisper auto-hébergé</strong> peut aussi être utilisé pour transcrire des réunions internes, entretiens ou échanges contenant des informations sensibles.</p>
<p>Lorsque la transcription est entièrement réalisée sur votre propre VPS, il est possible d’éviter l’envoi du fichier audio à une <strong>API de transcription externe</strong>. Cette approche donne davantage de contrôle sur l’emplacement du fichier, le modèle utilisé et la suppression des données après traitement.</p>
<p>Il faut toutefois éviter de présenter l’auto-hébergement comme une <strong>garantie automatique de conformité au RGPD</strong>. L’entreprise reste responsable de la sécurité, des droits d’accès, des sauvegardes et de la durée de conservation des enregistrements et transcriptions. La CNIL rappelle notamment que les données personnelles ne doivent pas être conservées indéfiniment et que leur accès doit être protégé.</p>
<p>Pour des réunions sensibles, prévoyez donc une <strong>politique de conservation</strong>, des droits d’accès limités et une suppression des fichiers devenus inutiles.</p>
<h3>Automatisation via n8n</h3>
<p>Whisper peut enfin être intégré dans un <strong>workflow n8n auto-hébergé</strong> afin d’automatiser toute la chaîne de transcription.</p>
<p>Un scénario peut, par exemple, démarrer lorsqu’un fichier est reçu via un <strong>webhook</strong>. Le nœud Webhook de n8n est précisément conçu pour déclencher un workflow lorsqu’une requête arrive sur une URL dédiée.</p>
<p>Le workflow peut ensuite :</p>
<ol>
<li>récupérer ou enregistrer le fichier audio ;</li>
<li>lancer le script <strong>faster-whisper</strong> ou la commande <code>whisper-cli</code> ;</li>
<li>récupérer la transcription produite ;</li>
<li>l’envoyer vers un autre traitement local ;</li>
<li>enregistrer le résultat ou déclencher une notification.</li>
</ol>
<p>Sur une instance n8n auto-hébergée, le nœud <strong>Execute Command</strong> permet d’exécuter des commandes shell sur la machine qui héberge n8n. Il est toutefois classé parmi les nœuds pouvant être <strong>bloqués par défaut</strong> dans certaines configurations récentes pour des raisons de sécurité : vérifiez donc sa disponibilité avant de construire votre workflow.</p>
<p>Vous pouvez ainsi créer un pipeline entièrement automatisé du type :</p>
<p><strong>Dépôt audio → n8n → Whisper AI → transcription → LLM local → résumé → archivage ou notification</strong></p>
<h2>Vérification du bon fonctionnement</h2>
<p>Avant d’automatiser vos <strong>transcriptions Whisper AI</strong>, effectuez quelques contrôles simples pour vous assurer que l’installation fonctionne correctement.</p>
<p>Vérifiez les points suivants :</p>
<ul>
<li>le script <strong>faster-whisper</strong> transcrit correctement un fichier audio et détecte une langue cohérente ;</li>
<li><code>whisper-cli</code> se lance sans erreur et produit une transcription exploitable ;</li>
<li>le fichier <strong>SRT</strong> contient des numéros de séquence, des timestamps et du texte ;</li>
<li>le script batch génère bien un fichier <code>.txt</code> pour chaque audio traité ;</li>
<li>la <strong>RAM du VPS</strong> reste suffisante pendant le chargement du modèle ;</li>
<li>la charge CPU observée dans le <strong>Panel KVM LWS</strong> reste compatible avec les autres services hébergés sur le serveur. Le Panel permet notamment de suivre la consommation CPU et mémoire du VPS.</li>
</ul>
<p>Pour vérifier rapidement un fichier SRT :</p>
<pre><code class="language-bash">head -n 20 sous-titres.srt
</code></pre>
<p>Avec whisper.cpp, assurez-vous également que vos fichiers suivent le format recommandé par le projet, à savoir un <strong>WAV PCM 16 bits, mono et 16 kHz</strong> pour la procédure utilisée dans ce tutoriel.</p>
<h2>Erreurs fréquentes et cas de blocage</h2>
<p>Même avec une installation correcte, certaines erreurs peuvent apparaître selon la configuration du VPS, le modèle choisi ou l’environnement Python.</p>
<table>
<thead>
<tr>
<th><strong>Erreur ou symptôme</strong></th>
<th><strong>Cause probable</strong></th>
<th><strong>Solution</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<blockquote><p><code>ModuleNotFoundError: No module named 'faster_whisper'</code></p></blockquote>
</td>
<td>
<blockquote><p>L’environnement virtuel n’est pas actif ou faster-whisper a été installé avec un autre interpréteur Python</p></blockquote>
</td>
<td>
<blockquote><p>Exécuter <code>source whisper-env/bin/activate</code>, puis vérifier avec <code>python -m pip show faster-whisper</code></p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><code>whisper-cli: No such file or directory</code></p></blockquote>
</td>
<td>
<blockquote><p>whisper.cpp n’a pas été compilé ou la commande est lancée depuis le mauvais répertoire</p></blockquote>
</td>
<td>
<blockquote><p>Vérifier la compilation et la présence de <code>build/bin/whisper-cli</code></p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>Erreur concernant le format WAV</p></blockquote>
</td>
<td>
<blockquote><p>Le fichier n’est pas au format attendu par la procédure whisper.cpp</p></blockquote>
</td>
<td>
<blockquote><p>Convertir l’audio avec <code>ffmpeg -ar 16000 -ac 1 -c:a pcm_s16le</code></p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>Échec lors du premier chargement du modèle</p></blockquote>
</td>
<td>
<blockquote><p>Le modèle n’est pas encore présent localement ou son téléchargement n’a pas abouti</p></blockquote>
</td>
<td>
<blockquote><p>Vérifier la connexion réseau et relancer le script</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>Processus interrompu et journal système indiquant un manque de mémoire</p></blockquote>
</td>
<td>
<blockquote><p>Le modèle choisi nécessite davantage de RAM que celle disponible</p></blockquote>
</td>
<td>
<blockquote><p>Tester <code>base</code> ou <code>small</code>, ou un modèle quantifié avec whisper.cpp</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>Transcription particulièrement lente</p></blockquote>
</td>
<td>
<blockquote><p>Le modèle est trop exigeant pour les ressources CPU disponibles</p></blockquote>
</td>
<td>
<blockquote><p>Tester un modèle plus léger et mesurer les performances sur le VPS réel</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>La commande <code>whisper</code> est introuvable</p></blockquote>
</td>
<td>
<blockquote><p>Confusion avec le CLI de l’implémentation officielle OpenAI Whisper</p></blockquote>
</td>
<td>
<blockquote><p>Avec faster-whisper, utiliser le script Python créé dans ce tutoriel plutôt que la commande <code>whisper</code></p></blockquote>
</td>
</tr>
</tbody>
</table>
<p>Pour diagnostiquer l’installation de <strong>faster-whisper</strong>, commencez par vérifier :</p>
<pre><code class="language-bash">source whisper-env/bin/activate
python --version
python -m pip show faster-whisper
</code></pre>
<p>La version actuelle de faster-whisper nécessite <strong>Python 3.9 ou supérieur</strong> et s’installe avec <code>pip</code>. Elle utilise par ailleurs PyAV pour le décodage audio.</p>
<p>Pour whisper.cpp, contrôlez l’exécutable :</p>
<pre><code class="language-bash">ls -lh build/bin/whisper-cli
</code></pre>
<p>Puis le modèle :</p>
<pre><code class="language-bash">ls -lh models/ggml-small.bin
</code></pre>
<p>Si le problème concerne l’audio, reconvertissez-le :</p>
<pre><code class="language-bash">ffmpeg -i audio.mp3 -ar 16000 -ac 1 -c:a pcm_s16le audio.wav
</code></pre>
<p>Cette conversion correspond à celle recommandée actuellement dans la documentation de <strong>whisper.cpp</strong>.</p>
<p>Enfin, ne cherchez pas à résoudre systématiquement un problème de lenteur en installant un modèle plus volumineux. Sur un <strong>VPS sans GPU</strong>, il est préférable de commencer petit, puis de comparer la qualité obtenue avec les ressources réellement disponibles.</p>
<h2>Bonnes pratiques à suivre</h2>
<p>Pour utiliser <strong>Whisper AI sur un VPS</strong> de manière régulière, quelques précautions permettent de conserver une installation plus stable et prévisible.</p>
<p>Commencez vos essais avec un modèle <strong><code>base</code> ou <code>small</code></strong>. Vous pourrez ensuite tester un modèle plus volumineux si la qualité obtenue ne répond pas à vos besoins. whisper.cpp propose également plusieurs modèles quantifiés, conçus notamment pour diminuer la taille du modèle et son empreinte mémoire.</p>
<p>Avec faster-whisper, conservez votre installation dans un <strong>environnement virtuel Python</strong> et utilisez <code>compute_type="int8"</code> lorsque vous souhaitez exploiter le mode CPU INT8 pris en charge par CTranslate2.</p>
<p>Pour whisper.cpp, conservez la conversion systématique vers un fichier :</p>
<pre><code class="language-text">WAV + PCM 16 bits + 16 kHz + mono
</code></pre>
<p>Vous réduirez ainsi les problèmes de compatibilité entre fichiers provenant de sources différentes. La documentation officielle de whisper.cpp recommande toujours cette préparation pour <code>whisper-cli</code>.</p>
<p>Pensez également à :</p>
<ul>
<li>créer un <strong>snapshot</strong> avant une mise à jour importante ;</li>
<li>surveiller la <strong>RAM et le CPU</strong> lors des premiers traitements ;</li>
<li>éviter de lancer simultanément plusieurs gros modèles sur un VPS déjà chargé ;</li>
<li>conserver les fichiers audio sensibles uniquement pendant la durée réellement nécessaire ;</li>
<li>tester vos scripts sur quelques fichiers avant de lancer une archive complète ;</li>
<li>mesurer vous-même les performances avant de dimensionner un workflow de production.</li>
</ul>
<p>Le <strong>Panel KVM LWS</strong> permet de suivre notamment le CPU, la RAM, le disque et l’activité réseau du VPS, ce qui facilite ces contrôles pendant les premiers traitements.</p>
<h2>FAQ</h2>
<p><strong>Whisper AI est-il gratuit pour un usage commercial ?</strong></p>
<p>Oui. <strong>Whisper AI</strong> est publié sous licence MIT, ce qui autorise un usage commercial. En auto-hébergement, vous ne payez pas la transcription à la minute, mais uniquement les ressources de votre serveur.</p>
<p><strong>Peut-on utiliser Whisper AI sans GPU sur un VPS ?</strong></p>
<p>Oui. <strong>faster-whisper</strong> et <strong>whisper.cpp</strong> peuvent fonctionner sur CPU sans GPU dédié. Sur un VPS, commencez avec un modèle léger comme <code>base</code> ou <code>small</code> pour limiter la consommation de ressources.</p>
<p><strong>Quelle est la différence entre faster-whisper et whisper.cpp ?</strong></p>
<p><strong>faster-whisper</strong> s’appuie sur CTranslate2 et s’intègre facilement dans des scripts Python. <strong>whisper.cpp</strong> est une implémentation C/C++ plus légère, particulièrement adaptée à une utilisation en ligne de commande sur CPU.</p>
<p><strong>Whisper transcrit-il bien le français ?</strong></p>
<p>Oui. Les modèles multilingues de <strong>Whisper</strong> prennent en charge le français. La qualité varie toutefois selon le modèle utilisé, la qualité de l’enregistrement, le bruit ambiant et les conditions de prise de son.</p>
<p><strong>Comment générer des sous-titres SRT avec Whisper ?</strong></p>
<p>Avec <strong>faster-whisper</strong>, un script Python peut transformer les segments transcrits en fichier SRT. Avec <strong>whisper.cpp</strong>, l’option <code>-osrt</code> permet de générer directement les sous-titres.</p>
<p><strong>Les enregistrements transcrits avec Whisper restent-ils confidentiels ?</strong></p>
<p>Avec une installation locale sur votre VPS, les fichiers n’ont pas besoin d’être envoyés à une API de transcription tierce. La confidentialité dépend néanmoins de la sécurité du serveur, des droits d’accès et de votre politique de conservation.</p>
<h2>Conclusion</h2>
<p>Installer <strong>Whisper AI sur un VPS</strong> permet de disposer d’une solution de <strong>transcription audio auto-hébergée</strong>, sans dépendre systématiquement d’une API facturée à l’usage. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" />Avec <strong>faster-whisper</strong>, vous profitez d’un environnement Python pratique pour créer des scripts et automatiser vos traitements. <strong>whisper.cpp</strong> constitue de son côté une alternative légère particulièrement adaptée à une exécution sur CPU. Dans les deux cas, commencez avec un modèle raisonnable comme <code>small</code>, mesurez la consommation réelle de votre serveur et augmentez progressivement les ressources si nécessaire. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />Vous pourrez ensuite générer des <strong>sous-titres SRT</strong>, traiter automatiquement des dossiers d’enregistrements ou intégrer Whisper à un workflow n8n ou à un <strong>LLM local</strong>. Pensez enfin à protéger vos fichiers audio, surveiller votre VPS et conserver uniquement les données réellement nécessaires.</p>
<div class="alert_more_info"><p class="title">Plus d'informations</p><hr><p></p>
<p><strong>Transcrivez vos podcasts, réunions et vidéos sur votre propre serveur.</strong></p>
<p>Les <strong>VPS KVM LWS</strong> offrent l’accès root nécessaire pour installer vos outils d’IA open source, ainsi que des fonctions de snapshot et de supervision utiles pour administrer votre environnement.</p>
<p><strong><a title="Découvrir les VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Découvrir les VPS KVM LWS</a></strong></p>
<p></p></div>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/whisper-ai-transcription-audio-vps/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29915</post-id>	</item>
		<item>
		<title>Comment utiliser GitHub Actions pour déployer automatiquement son site</title>
		<link>https://tutoriels.lws.fr/vps/comment-utiliser-github-actions-pour-deployer-automatiquement-son-site</link>
					<comments>https://tutoriels.lws.fr/vps/comment-utiliser-github-actions-pour-deployer-automatiquement-son-site#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Fri, 07 Aug 2026 12:49:51 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=29883</guid>

					<description><![CDATA[Déployer un site ou une application à la main peut vite devenir répétitif. À chaque mise à jour, il faut se connecter au serveur en SSH, lancer un git pull, installer d’éventuelles dépendances, puis redémarrer l’application. Cette méthode fonctionne, mais elle prend du temps et augmente le risque d’erreur : mauvaise branche déployée, commande oubliée, &#8230; <a href="https://tutoriels.lws.fr/vps/comment-utiliser-github-actions-pour-deployer-automatiquement-son-site" class="more-link">Continue reading <span class="screen-reader-text">Comment utiliser GitHub Actions pour déployer automatiquement son site</span></a>]]></description>
										<content:encoded><![CDATA[<p>Déployer un site ou une application à la main peut vite devenir répétitif. À chaque mise à jour, il faut se connecter au serveur en <strong>SSH</strong>, lancer un <code>git pull</code>, installer d’éventuelles dépendances, puis redémarrer l’application. Cette méthode fonctionne, mais elle prend du temps et augmente le risque d’erreur : mauvaise branche déployée, commande oubliée, service non relancé ou fichier modifié directement sur le serveur.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Avec <strong>GitHub Actions</strong>, il est possible d’automatiser ce processus et de déclencher un <strong>déploiement automatique</strong> à chaque <code>push</code> sur la branche principale. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" />Ce tutoriel vous guide pas à pas pour mettre en place un <strong>workflow YAML GitHub Actions</strong> capable de se connecter à un <strong>VPS LWS</strong> via <strong>SSH</strong>, récupérer le nouveau code et relancer l’application de façon plus fiable, plus rapide et plus sécurisée.</p>
<h2>Objectif</h2>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’objectif de ce guide est de vous aider à configurer un pipeline simple de <strong>CI/CD avec GitHub Actions</strong> pour déployer automatiquement votre site ou votre application sur un <strong>VPS Linux</strong>. À la fin du tutoriel, chaque modification envoyée sur la branche <code>main</code> de votre dépôt GitHub déclenchera un <strong>workflow de déploiement</strong>. Celui-ci se connectera à votre serveur avec une <strong>clé SSH dédiée</strong>, utilisera des <strong>secrets GitHub</strong> pour protéger les informations sensibles, exécutera les commandes nécessaires sur le VPS, puis redémarrera l’application. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />Le but n’est pas de remplacer un déploiement initial, mais d’automatiser les mises à jour d’un projet déjà installé une première fois sur le serveur. Vous gagnerez ainsi du temps, tout en réduisant les manipulations manuelles et les erreurs de mise en production.</p>
<h2>Pré-requis</h2>
<p>Avant de commencer, vous devez disposer :</p>
<ul>
<li>d’un <strong>dépôt GitHub</strong> contenant le code de votre site ou de votre application. Le dépôt peut être public ou privé : dans les deux cas, <strong>GitHub Actions</strong> pourra exécuter un workflow dès lors que celui-ci est correctement configuré dans le projet.</li>
<li>Accès à un <strong>VPS Linux</strong>, idéalement un <a title="Découvrir les VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">VPS KVM LWS</a>, avec une connexion <strong>SSH</strong> fonctionnelle. Ce tutoriel part du principe que votre application a déjà été déployée manuellement au moins une fois. Autrement dit, le serveur doit déjà contenir le projet, cloné avec Git, par exemple dans un dossier comme <code>/var/www/monsite</code>.</li>
<li>Il est aussi nécessaire d’avoir quelques bases en <strong>Git</strong> et en ligne de commande : savoir créer un commit, pousser du code avec <code>git push</code>, naviguer dans un terminal Linux et comprendre la notion de branche principale, généralement appelée <code>main</code>.</li>
<li>Vous n’avez en revanche pas besoin de connaître <strong>GitHub Actions</strong> avant de lire ce guide. Les notions essentielles seront expliquées progressivement.</li>
</ul>
<div class="bborder blue">Important ! <strong>GitHub Actions</strong> va automatiser les mises à jour, mais il ne corrige pas une installation serveur incomplète. Si votre application ne fonctionne pas encore manuellement sur le VPS, commencez par stabiliser ce déploiement avant d’ajouter l’automatisation.</div>
<h2>Qu&rsquo;est-ce que GitHub Actions : en une explication claire</h2>
<p><strong>GitHub Actions</strong> est un outil d’<strong>intégration continue</strong> et de <strong>déploiement continu</strong> directement intégré à GitHub. Il permet d’automatiser des actions à partir d’événements qui se produisent dans un dépôt : un <code>push</code>, une <code>pull request</code>, la création d’un tag, ou encore une exécution planifiée à une date précise.</p>
<p>Dans le cadre de ce tutoriel, l’objectif est simple : lorsqu’un développeur pousse du code sur la branche <code>main</code>, GitHub lance automatiquement un <strong>workflow</strong>. Ce workflow se connecte ensuite au <strong>VPS</strong> en <strong>SSH</strong>, récupère la dernière version du code et redémarre l’application. Cette logique évite d’avoir à refaire les mêmes commandes à la main à chaque mise à jour.</p>
<p>Un workflow <strong>GitHub Actions</strong> est défini dans un fichier au format <strong>YAML</strong>. Ce fichier indique quand l’automatisation doit se déclencher, sur quelle machine elle doit s’exécuter, et quelles étapes doivent être réalisées. C’est ce fichier que nous allons créer plus loin dans ce tutoriel.</p>
<p>Voici le vocabulaire essentiel à connaître avant de passer à la configuration :</p>
<table>
<thead>
<tr>
<th>Terme</th>
<th>Signification</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<blockquote><p><strong>Workflow</strong></p></blockquote>
</td>
<td>
<blockquote><p>Processus d’automatisation complet, défini dans un fichier <strong>YAML</strong></p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Job</strong></p></blockquote>
</td>
<td>
<blockquote><p>Ensemble d’étapes exécutées sur une même machine virtuelle</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Step</strong></p></blockquote>
</td>
<td>
<blockquote><p>Action unitaire au sein d’un job, comme lancer une commande ou utiliser une action existante</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Runner</strong></p></blockquote>
</td>
<td>
<blockquote><p>Machine qui exécute le workflow, généralement fournie par GitHub</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Secret</strong></p></blockquote>
</td>
<td>
<blockquote><p>Variable sensible stockée de manière sécurisée, comme une <strong>clé SSH</strong> ou une adresse IP serveur</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p>La force de <strong>GitHub Actions</strong> est son intégration native avec GitHub. Vous n’avez pas besoin d’installer un outil externe pour commencer. Il suffit d’ajouter un fichier dans le dépôt, puis de suivre les exécutions depuis l’onglet « <strong>Actions </strong>».</p>
<p>Ce tutoriel couvre un cas précis : le <strong>déploiement automatique d’une application déjà hébergée sur un VPS</strong>, via une connexion <strong>SSH</strong> déclenchée à chaque <code>push</code>. Nous allons donc nous concentrer sur une approche simple, adaptée à un développeur qui gère son code sur GitHub et souhaite automatiser la mise en production sur son propre serveur.</p>
<p>En revanche, nous n’aborderons pas ici les pipelines complexes avec plusieurs environnements séparés, les runners auto-hébergés ou les stratégies avancées de tests automatisés. Pour comparer cette approche avec une solution auto-hébergée, vous pouvez aussi <a title="Configurer une CI/CD avec GitLab auto-hébergé chez LWS" href="https://tutoriels.lws.fr/vps/configurer-une-ci-cd-avec-gitlab-auto-heberge-lws">découvrir une alternative auto-hébergée avec GitLab CI/CD/.</a></p>
<div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div>
<h2>Créer un snapshot LWS avant de commencer</h2>
<p>Avant de connecter <strong>GitHub Actions</strong> à votre serveur, il est recommandé de créer un <strong>snapshot</strong> de votre <strong>VPS LWS</strong>. Cette étape est souvent négligée, mais elle apporte une sécurité importante lors de la mise en place d’un <strong>déploiement automatique</strong>.</p>
<p>Un snapshot correspond à une copie de l’état de votre serveur à un instant précis. Si une erreur de configuration provoque un problème lors du premier déploiement, vous pouvez revenir rapidement à une version stable du VPS, sans devoir tout réinstaller manuellement.</p>
<p>Depuis votre espace client, rendez-vous dans le <strong>LWS Panel KVM</strong>, puis dans la rubrique « <strong>Snapshots </strong>».</p>
<p><img class="aligncenter wp-image-29428 size-full"  alt="Snapshots" width="1182" height="896" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Snapshots.webp"></p>
<p>Cliquez ensuite sur le bouton  « <strong>Créer un snapshot</strong> ».</p>
<p><img class="aligncenter wp-image-29546 size-full"  alt="Créer un snapshot sur un VPS KVM LWS" width="1259" height="724" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/creer-un-snapshot-2.webp"></p>
<p>Donnez-lui un nom explicite, par exemple <code>avant-github-actions</code>.</p>
<p><img class="aligncenter wp-image-29890 size-full"  alt="Interface de création de snapshot dans le VPS KVM LWS" width="1039" height="656" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Interface-de-creation-de-snapshot-dans-le-VPS-KVM-LWS.webp"></p>
<p>Cette précaution est particulièrement utile lorsque vous modifiez la façon dont votre serveur reçoit du code. Avec un workflow automatisé, une mauvaise commande dans le fichier YAML peut être exécutée à distance sur le VPS. Le snapshot vous permet donc de tester plus sereinement la configuration, surtout lors du premier essai.</p>
<p>Gardez toutefois en tête qu’un snapshot ne remplace pas une vraie stratégie de sauvegarde. Il s’agit ici d’un filet de sécurité temporaire avant de modifier votre processus de déploiement.</p>
<h2>Générer une paire de clés SSH dédiée au déploiement</h2>
<p>Pour que <strong>GitHub Actions</strong> puisse se connecter à votre <strong>VPS</strong> sans intervention manuelle, il faut utiliser une <strong>clé SSH</strong>. Cette clé permet au workflow de s’authentifier auprès du serveur sans saisir de mot de passe.</p>
<p>Il est fortement déconseillé de réutiliser votre clé SSH personnelle. Créer une <strong>clé SSH dédiée au déploiement</strong> limite les risques : si cette clé doit être révoquée plus tard, vous pourrez la supprimer sans impacter vos propres accès administrateur.</p>
<p>Dans cette étape, nous allons générer une nouvelle paire de clés, autoriser la clé publique sur le VPS, puis conserver la clé privée pour l’ajouter ensuite dans les <strong>secrets GitHub</strong>.</p>
<h3>1. Générer la clé (depuis votre machine locale ou le VPS)</h3>
<p>Depuis votre machine locale, ou directement depuis le <strong>VPS</strong> si vous préférez centraliser la configuration.</p>
<p><img class="aligncenter size-full wp-image-29891"  alt="Interface SSH dans le VPS KVM LWS" width="1007" height="838" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Interface-SSH-dans-le-VPS-KVM-LWS.webp"></p>
<p>Lancez la commande suivante :</p>
<pre><code class="language-bash">ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_actions_deploy
</code></pre>
<p>Cette commande crée une paire de clés SSH avec l’algorithme <strong>ed25519</strong>, recommandé pour sa sécurité et sa légèreté. Le commentaire <code>"github-actions-deploy"</code> permet simplement d’identifier plus facilement l’usage de cette clé.</p>
<p>Lorsque le terminal demande une passphrase, appuyez deux fois sur “<strong>Entrée</strong>” pour la laisser vide. Dans un contexte classique, protéger une clé SSH par mot de passe est une bonne pratique. Mais ici, le workflow <strong>GitHub Actions</strong> doit pouvoir l’utiliser automatiquement, sans intervention humaine. Une passphrase bloquerait donc l’exécution du déploiement.</p>
<p>Deux fichiers sont créés :</p>
<ul>
<li><code>~/.ssh/github_actions_deploy</code> : la <strong>clé privée</strong>, à garder secrète ;</li>
<li><code>~/.ssh/github_actions_deploy.pub</code> : la <strong>clé publique</strong>, à autoriser sur le VPS.</li>
</ul>
<p>La clé privée ne devra jamais être ajoutée dans le dépôt Git.</p>
<h3>2. Autoriser la clé publique sur le VPS</h3>
<p>Une fois la clé générée, vous devez autoriser sa partie publique sur le <strong>VPS Linux</strong>. Cela permet au serveur de reconnaître la connexion initiée par <strong>GitHub Actions</strong> comme légitime.</p>
<p>La méthode la plus simple consiste à utiliser la commande <code>ssh-copy-id</code> :</p>
<pre><code class="language-bash">ssh-copy-id -i ~/.ssh/github_actions_deploy.pub -p 22 utilisateur@IP_DU_VPS
</code></pre>
<p>Remplacez <code>utilisateur</code> par le nom de l’utilisateur SSH utilisé pour le déploiement, par exemple <code>root</code> ou un utilisateur dédié. Remplacez également <code>IP_DU_VPS</code> par l’adresse IP de votre serveur. Si votre port SSH n’est pas <code>22</code>, adaptez la valeur après l’option <code>-p</code>.</p>
<p>Cette commande ajoute automatiquement le contenu de la clé publique dans le fichier <code>~/.ssh/authorized_keys</code> de l’utilisateur distant.</p>
<p>Si <code>ssh-copy-id</code> n’est pas disponible sur votre système, vous pouvez copier manuellement le contenu du fichier <code>.pub</code>, puis l’ajouter dans <code>~/.ssh/authorized_keys</code> sur le VPS. Veillez à ne copier que la clé publique, jamais la clé privée.</p>
<h3>3. Conserver la clé privée pour l&rsquo;étape suivante</h3>
<p>La dernière étape consiste à récupérer le contenu de la <strong>clé privée SSH</strong>. C’est cette clé qui sera ajoutée dans les <strong>secrets GitHub</strong> afin que le workflow puisse se connecter au <strong>VPS</strong> pendant le déploiement.</p>
<p>Affichez le contenu de la clé privée avec la commande suivante :</p>
<pre><code class="language-bash">cat ~/.ssh/github_actions_deploy
</code></pre>
<p>Copiez l’intégralité du résultat, y compris les lignes de début et de fin :</p>
<pre><code class="language-text">-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
</code></pre>
<p>Cette clé privée doit être manipulée avec beaucoup de prudence. Elle donne accès au serveur pour l’utilisateur SSH configuré. Elle ne doit donc jamais être copiée dans un fichier du dépôt, envoyée par email, partagée dans un outil collaboratif ou committée, même temporairement.</p>
<p>Une fois la clé ajoutée dans les <strong>secrets GitHub</strong>, supprimez tout fichier temporaire qui aurait pu servir à la copier. Si vous pensez qu’elle a été exposée par erreur, révoquez-la immédiatement en supprimant la clé publique correspondante du fichier <code>authorized_keys</code> sur le VPS, puis générez une nouvelle paire de clés.</p>
<h2>Configurer les secrets GitHub</h2>
<p>Les <strong>secrets GitHub</strong> permettent de stocker des informations sensibles de manière sécurisée. Dans notre cas, ils serviront à transmettre au workflow les informations nécessaires pour se connecter au <strong>VPS LWS</strong> :</p>
<ul>
<li>adresse IP,</li>
<li>utilisateur SSH,</li>
<li>port de connexion et <strong>clé privée SSH</strong>.</li>
</ul>
<p>L’intérêt des secrets est d’éviter d’inscrire ces données directement dans le fichier <code>deploy.yml</code>. Le workflow pourra les utiliser pendant son exécution, mais elles ne seront pas visibles en clair dans le dépôt.</p>
<p>Cette étape est essentielle pour sécuriser votre <strong>déploiement automatique avec GitHub Actions</strong>. Un fichier YAML peut être lu par toutes les personnes ayant accès au dépôt. Les identifiants, eux, doivent rester protégés.</p>
<h3>1. Accéder aux réglages des secrets</h3>
<p>Pour ajouter les secrets nécessaires, ouvrez le dépôt GitHub concerné, puis rendez-vous dans les paramètres du projet.</p>
<p>Rendez-vous dans la section : <strong>“Settings &gt; Secrets and variables &gt; Actions &gt; New repository secret”.</strong></p>
<p><img class="aligncenter wp-image-29893 size-full"  alt="New repository secret" width="1243" height="889" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/New-repository-secret.webp"></p>
<p>GitHub permet de créer plusieurs types de variables. Ici, vous devez bien choisir les <strong>repository secrets</strong>, car ils seront associés uniquement à ce dépôt. C’est le bon choix pour un projet qui déploie une application précise vers un <strong>VPS</strong> précis.</p>
<p>Chaque secret est composé d’un nom et d’une valeur. Le nom sera utilisé dans le fichier YAML, tandis que la valeur restera masquée dans l’interface GitHub après enregistrement.</p>
<p>Avant de passer à la suite, préparez les informations suivantes :</p>
<ul>
<li>l’adresse IP du serveur,</li>
<li>l’utilisateur SSH,</li>
<li>le port SSH et le contenu complet de la clé privée générée précédemment.</li>
</ul>
<h3>2. Créer les secrets nécessaires</h3>
<p>Créez maintenant les secrets utilisés par le workflow <strong>GitHub Actions</strong>. Les noms doivent être saisis avec exactitude, car ils seront appelés ensuite dans le fichier <code>deploy.yml</code>.</p>
<table>
<thead>
<tr>
<th>Nom du secret</th>
<th>Valeur à renseigner</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<blockquote><p><strong>VPS_HOST</strong></p></blockquote>
</td>
<td>
<blockquote><p>Adresse IP de votre <strong>VPS LWS</strong></p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>VPS_USERNAME</strong></p></blockquote>
</td>
<td>
<blockquote><p>Nom de l’utilisateur SSH, par exemple <code>root</code> ou un utilisateur dédié</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>VPS_SSH_KEY</strong></p></blockquote>
</td>
<td>
<blockquote><p>Contenu complet de la <strong>clé privée SSH</strong> générée à l’étape précédente</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>VPS_PORT</strong></p></blockquote>
</td>
<td>
<blockquote><p>Port SSH du serveur, généralement <code>22</code> si vous ne l’avez pas modifié</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p>Le secret <strong>VPS_SSH_KEY</strong> doit contenir toute la clé privée, sans supprimer les lignes <code>-----BEGIN OPENSSH PRIVATE KEY-----</code> et <code>-----END OPENSSH PRIVATE KEY-----</code>. Une erreur de copie à ce niveau provoquera souvent une erreur de connexion du type <code>Permission denied</code>.</p>
<p>Une fois les secrets enregistrés, GitHub masque automatiquement leurs valeurs dans l’interface. Vous pourrez modifier ou supprimer un secret, mais vous ne pourrez pas relire sa valeur en clair. C’est un comportement normal, conçu pour protéger vos informations sensibles.</p>
<p><img class="aligncenter wp-image-29892 size-full"  alt="Liste de variables et secrets" width="1077" height="639" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Liste-de-variables-et-secrets.webp"></p>
<div class="alert_more_info"><p class="title">Plus d'informations</p><hr><p></p>
<p>Pour déployer automatiquement vos projets avec <strong>GitHub Actions</strong>, un <strong>VPS KVM LWS</strong> offre l’accès root nécessaire à la configuration <strong>SSH</strong>, ainsi que des snapshots gratuits pour sécuriser chaque étape de mise en place de votre pipeline. Vous pouvez choisir un <strong>VPS KVM LWS avec accès root pour vos déploiements automatisés</strong> afin de garder le contrôle sur votre environnement serveur.</p>
<p><a title="Voir les VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Voir les VPS KVM LWS</a></p>
<p></p></div>
<h2>Créer le fichier de workflow</h2>
<p>Nous avons maintenant un <strong>VPS accessible en SSH</strong> et des <strong>secrets GitHub</strong> prêts à être utilisés. Il reste à créer le fichier qui va décrire le comportement de <strong>GitHub Actions</strong>. Ce fichier s’appelle un <strong>workflow</strong>. Il indique à GitHub quand déclencher l’automatisation, sur quelle machine l’exécuter et quelles commandes lancer pour mettre à jour le site sur le serveur.</p>
<p>Dans notre exemple, le workflow se déclenchera à chaque <code>push</code> sur la branche <code>main</code>. Il se connectera ensuite au <strong>VPS LWS</strong> avec les secrets configurés précédemment, se placera dans le dossier du projet, récupérera la dernière version du code et relancera l’application.</p>
<h3>1. Structure du dossier</h3>
<p>GitHub Actions détecte automatiquement les workflows placés dans le dossier <code>.github/workflows/</code> à la racine du dépôt. Si ce dossier n’existe pas encore dans votre projet, créez-le avec la commande suivante :</p>
<pre><code class="language-bash">mkdir -p .github/workflows
</code></pre>
<p>La structure du dépôt doit ensuite ressembler à ceci :</p>
<pre><code class="language-text">mon-projet/
├── .github/
│   └── workflows/
│       └── deploy.yml
├── package.json
├── src/
└── README.md
</code></pre>
<p>Le nom du fichier est libre, mais il doit se terminer par l’extension <code>.yml</code> ou <code>.yaml</code>. Dans ce tutoriel, nous utiliserons <code>deploy.yml</code>, car son rôle est clair : gérer le <strong>déploiement automatique</strong> du projet.</p>
<p>Veillez à bien placer ce fichier dans <code>.github/workflows/</code>. S’il est créé ailleurs, GitHub ne le considérera pas comme un workflow et aucune automatisation ne sera déclenchée lors de vos prochains <code>push</code>.</p>
<h3>2. Créer le fichier de déploiement</h3>
<p>Créez maintenant le fichier <code>.github/workflows/deploy.yml</code>, puis ajoutez le contenu suivant :</p>
<pre><code class="language-yaml">name: Déploiement automatique VPS

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Déployer sur le VPS via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.VPS_HOST }}
          username: ${{ secrets.VPS_USERNAME }}
          key: ${{ secrets.VPS_SSH_KEY }}
          port: ${{ secrets.VPS_PORT }}
          script: |
            cd /var/www/monsite
            git pull origin main
            npm ci --production
            pm2 restart monapp
</code></pre>
<p>Ce workflow est volontairement simple pour rester facile à comprendre.</p>
<p><img class="aligncenter size-full wp-image-29895"  alt="Fichier yaml" width="1014" height="702" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Fichier-yaml.png"></p>
<p>Lorsqu’un <code>push</code> est effectué sur la branche <code>main</code>, GitHub lance un job nommé <code>deploy</code>. Ce job utilise une machine virtuelle Ubuntu fournie par GitHub, puis exécute une action SSH qui se connecte à votre <strong>VPS</strong>.</p>
<p>Les informations sensibles ne sont jamais écrites en clair dans le fichier. Elles sont appelées avec la syntaxe <code>${{ secrets.NOM_DU_SECRET }}</code>. C’est cette syntaxe qui permet d’utiliser les <strong>secrets GitHub</strong> créés à l’étape précédente.</p>
<p>Vous devez adapter trois éléments à votre propre projet :</p>
<ul>
<li>le chemin <code>/var/www/monsite</code>, qui doit correspondre au dossier réel de votre application sur le VPS ;</li>
<li>la commande <code>npm ci --production</code>, utile pour une application <strong>Node.js</strong>, mais à adapter pour une autre stack ;</li>
<li>la commande <code>pm2 restart monapp</code>, qui doit correspondre au nom exact du processus géré par <strong>PM2</strong>.</li>
</ul>
<p>Pour une application <strong>Next.js</strong>, cette logique peut servir de base afin d’<a title="Déployer Next.js sur VPS Linux : guide complet 2026" href="https://tutoriels.lws.fr/vps/docker-vps-lws-deployer-ses-applications">automatiser le déploiement de votre application Next.js avec GitHub Actions</a>. Pour une application PHP ou un site statique, les commandes exécutées dans <code>script</code> seront différentes, mais le principe reste le même : se connecter au serveur, récupérer le code, puis relancer ou rafraîchir le service nécessaire.</p>
<h3>3. Explication ligne par ligne</h3>
<p>Le fichier <code>deploy.yml</code> peut sembler technique au premier abord, mais chaque bloc a un rôle précis. Voici les principaux éléments à comprendre.</p>
<table>
<thead>
<tr>
<th>Élément</th>
<th>Rôle</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<blockquote><p><strong>name</strong></p></blockquote>
</td>
<td>
<blockquote><p>Nom affiché dans l’onglet <strong>Actions</strong> de GitHub</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>on: push</strong></p></blockquote>
</td>
<td>
<blockquote><p>Déclenche le workflow lorsqu’un <code>push</code> est envoyé sur le dépôt</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>branches: [main]</strong></p></blockquote>
</td>
<td>
<blockquote><p>Limite le déclenchement à la branche <code>main</code></p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>jobs</strong></p></blockquote>
</td>
<td>
<blockquote><p>Contient les tâches à exécuter dans le workflow</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>deploy</strong></p></blockquote>
</td>
<td>
<blockquote><p>Nom du job chargé du déploiement</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>runs-on: ubuntu-latest</strong></p></blockquote>
</td>
<td>
<blockquote><p>Indique que le job s’exécute sur une machine virtuelle Ubuntu</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>steps</strong></p></blockquote>
</td>
<td>
<blockquote><p>Liste les étapes exécutées dans le job</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>uses: appleboy/ssh-action@v1</strong></p></blockquote>
</td>
<td>
<blockquote><p>Utilise une action SSH pour lancer des commandes sur le VPS</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>with</strong></p></blockquote>
</td>
<td>
<blockquote><p>Regroupe les paramètres transmis à l’action</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>script</strong></p></blockquote>
</td>
<td>
<blockquote><p>Contient les commandes exécutées directement sur le serveur</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p>Le bloc le plus important est <code>script</code>, car c’est lui qui décrit réellement ce qui se passe sur le <strong>VPS</strong>. Dans notre exemple, le workflow commence par entrer dans le dossier du projet avec <code>cd /var/www/monsite</code>. Il récupère ensuite le dernier code disponible sur la branche <code>main</code> avec <code>git pull origin main</code>.</p>
<p>La commande <code>npm ci --production</code> installe les dépendances nécessaires en production pour une application <strong>Node.js</strong>. Elle peut être remplacée selon votre stack : <code>composer install --no-dev</code> pour un projet PHP, une commande de build pour un site statique, ou encore une commande Docker pour un projet conteneurisé.</p>
<p>Enfin, <code>pm2 restart monapp</code> redémarre l’application gérée par <strong>PM2</strong>. Avant d’utiliser cette ligne, vérifiez le nom exact du processus avec <code>pm2 list</code> ou <code>pm2 status</code>. Un mauvais nom de processus peut donner l’impression que le déploiement fonctionne, alors que l’application n’a pas réellement été relancée.</p>
<p>Ce fichier constitue une première base fonctionnelle. Vous pourrez ensuite l’améliorer avec des tests, des filtres de fichiers ou une stratégie Docker, mais il est préférable de commencer par un workflow simple et compréhensible avant d’ajouter des couches plus avancées.</p>
<h2>Déclencher et vérifier le premier déploiement automatique</h2>
<p>Votre fichier <strong>deploy.yml</strong> est maintenant prêt. Pour vérifier que le <strong>workflow GitHub Actions</strong> fonctionne correctement, il faut l’ajouter au dépôt, le pousser sur la branche <code>main</code>, puis observer son exécution depuis l’onglet <strong>Actions</strong> de GitHub.</p>
<p>Ce premier lancement est une étape importante. Il permet de valider à la fois la syntaxe du fichier <strong>YAML</strong>, la configuration des <strong>secrets GitHub</strong>, la connexion <strong>SSH</strong> au <strong>VPS</strong>, et les commandes exécutées côté serveur. Si une erreur apparaît, elle sera visible dans les logs du workflow.</p>
<h3>1. Commit et push du workflow</h3>
<p>Depuis votre machine locale, ajoutez le fichier de workflow à Git, créez un commit, puis envoyez-le sur la branche <code>main</code> :</p>
<pre><code class="language-bash">git add .github/workflows/deploy.yml
git commit -m "Ajout du workflow de déploiement automatique"
git push origin main
</code></pre>
<p>Dès que le <code>push</code> est reçu par GitHub, le déclencheur défini dans le fichier <code>deploy.yml</code> s’active. Comme nous avons configuré :</p>
<pre><code class="language-yaml">on:
  push:
    branches: [main]
</code></pre>
<p>le workflow ne se lance que lorsqu’un changement est envoyé sur la branche <strong>main</strong>. Un <code>push</code> sur une autre branche ne déclenchera donc pas le <strong>déploiement automatique</strong>.</p>
<p>Après cette commande, GitHub doit normalement créer une nouvelle exécution du workflow. Si rien ne se passe, vérifiez d’abord que le fichier se trouve bien dans <code>.github/workflows/</code> et que l’indentation du fichier YAML est correcte.</p>
<h3>2. Suivre l&rsquo;exécution dans l&rsquo;onglet Actions</h3>
<p>Pour suivre le déploiement, ouvrez votre dépôt GitHub, puis cliquez sur l’onglet « <strong>Actions </strong>».</p>
<p><img class="aligncenter wp-image-29894 size-full"  alt="Onglet Github actions" width="1152" height="817" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/08/Onglet-Github-actions.webp"></p>
<p>Vous devriez voir apparaître un workflow nommé « <strong>Déploiement automatique VPS </strong>», correspondant à la valeur définie dans la ligne <code>name</code>.</p>
<p>Cliquez sur l’exécution en cours pour afficher le détail du job <code>deploy</code>. GitHub affiche alors chaque étape du workflow, son état et sa durée. Si tout se déroule correctement, l’exécution se termine avec une <strong>coche verte</strong>.</p>
<p>Cette page est très utile pour confirmer que GitHub a bien déclenché le workflow après le <code>push</code>, que l’action <strong>SSH</strong> a pu se connecter au <strong>VPS</strong>, et que les commandes du bloc <code>script</code> ont été exécutées jusqu’au bout.</p>
<h3>3. Lire les logs en cas d&rsquo;échec</h3>
<p>Si le workflow échoue, GitHub affiche une <strong>croix rouge</strong> sur l’exécution concernée. Cliquez sur le job, puis ouvrez l’étape en erreur pour lire les logs détaillés. Ces logs indiquent généralement à quel moment le déploiement s’est arrêté.</p>
<p>Une erreur de type <code>Permission denied (publickey)</code> indique souvent un problème de <strong>clé SSH</strong> : clé publique absente du fichier <code>authorized_keys</code>, mauvaise clé privée copiée dans le secret <strong>VPS_SSH_KEY</strong>, ou utilisateur SSH incorrect.</p>
<p>Une erreur liée à <code>cd /var/www/monsite</code> signifie généralement que le chemin du projet sur le <strong>VPS</strong> n’est pas le bon. Dans ce cas, connectez-vous manuellement au serveur en SSH et vérifiez l’emplacement exact de votre application.</p>
<p>Si l’erreur vient de <code>npm ci</code>, <code>pm2 restart</code> ou d’une autre commande du bloc <code>script</code>, le problème concerne probablement la stack applicative elle-même. Le workflow fonctionne peut-être correctement, mais la commande exécutée sur le serveur doit être adaptée à votre projet.</p>
<p>Les <strong>secrets GitHub</strong> peuvent apparaître sous la forme <code>***</code> dans les logs. C’est normal : GitHub masque automatiquement les valeurs sensibles pour éviter leur exposition.</p>
<h2>Superviser le déploiement côté VPS</h2>
<p>Une fois le <strong>déploiement automatique GitHub Actions</strong> exécuté avec succès, il est important de vérifier que l’application fonctionne réellement côté serveur. Une coche verte dans l’onglet « <strong>Actions</strong> » confirme que le workflow est allé au bout, mais elle ne garantit pas toujours que le site répond correctement aux visiteurs.</p>
<p>La supervision côté <strong>VPS</strong> permet de contrôler l’état du processus, les logs applicatifs, la consommation de ressources et les éventuelles erreurs après redémarrage. Cette étape est particulièrement utile lors des premiers déploiements automatisés, lorsque vous ajustez encore les commandes du fichier <code>deploy.yml</code>.</p>
<p>L’objectif est simple : confirmer que le code a bien été mis à jour, que l’application a redémarré proprement, et que le serveur reste stable après le déploiement.</p>
<h3>Avec PM2 (applications Node.js) :</h3>
<p>Si votre application <strong>Node.js</strong> est gérée avec <strong>PM2</strong>, vous pouvez vérifier rapidement son état avec les commandes suivantes :</p>
<pre><code class="language-bash">pm2 status
pm2 logs monapp --lines 20
</code></pre>
<p>La commande <code>pm2 status</code> affiche la liste des processus gérés par <strong>PM2</strong>, leur statut, leur consommation mémoire et leur durée d’exécution. Le processus concerné doit apparaître avec un état stable, généralement <code>online</code>.</p>
<p>La commande <code>pm2 logs monapp --lines 20</code> permet de consulter les dernières lignes de logs de l’application. Remplacez <code>monapp</code> par le nom exact de votre processus. Cette vérification aide à repérer rapidement une erreur de démarrage, une dépendance manquante, un problème de variable d’environnement ou une exception déclenchée après la mise à jour du code.</p>
<h3>Depuis le Panel KVM LWS :</h3>
<p>En complément des commandes en ligne, le <strong>LWS Panel KVM</strong> permet de surveiller l’état général du <strong>VPS</strong>. Depuis la rubrique <strong>Supervision</strong>, vous pouvez suivre la charge <strong>CPU</strong>, l’utilisation de la <strong>RAM</strong> et l’activité du serveur au moment du déploiement.</p>
<p><img class="aligncenter wp-image-29772 size-full"  alt="Graphiques d'utilisation du VPS KVM LWS pendant l'interaction avec ollama" width="1058" height="886" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Graphiques-dutilisation-du-VPS-KVM-LWS-pendant-linterraction-avec-ollama.png"></p>
<p>Cette vue est utile pour identifier un comportement anormal après l’exécution du workflow. Par exemple, un build trop lourd peut provoquer un pic de mémoire, tandis qu’une application mal redémarrée peut générer une consommation CPU inhabituelle.</p>
<p>Si vous observez une hausse importante des ressources après chaque déploiement, revoyez les commandes exécutées dans le bloc <code>script</code> du workflow. Il peut être nécessaire d’optimiser l’installation des dépendances, de déplacer certaines étapes de build, ou de mieux encadrer le redémarrage de l’application.</p>
<h2>Aller plus loin : variantes utiles</h2>
<p>Le workflow présenté dans ce tutoriel constitue une base simple et efficace pour automatiser un <strong>déploiement sur VPS avec GitHub Actions</strong>. Une fois cette première version fonctionnelle, vous pouvez l’améliorer progressivement selon les besoins de votre projet.</p>
<p>Les variantes suivantes permettent de limiter les déclenchements inutiles, de sécuriser la mise en production avec des tests, ou d’adapter le déploiement à des projets plus complexes, notamment ceux qui utilisent <strong>Docker</strong>. L’idée n’est pas de tout ajouter dès le départ, mais de faire évoluer votre pipeline étape par étape, lorsque le besoin devient réel.</p>
<h3>1. Restreindre le déploiement à certains fichiers modifiés</h3>
<p>Par défaut, le workflow <strong>GitHub Actions</strong> se déclenche à chaque <code>push</code> sur la branche <code>main</code>. Cette configuration est simple, mais elle peut provoquer des déploiements inutiles. Par exemple, si vous modifiez uniquement un fichier de documentation, comme <code>README.md</code>, il n’est pas forcément nécessaire de relancer tout le processus de mise en production.</p>
<p>Pour éviter cela, vous pouvez ajouter un filtre avec <code>paths-ignore</code>. Il permet d’ignorer certains fichiers ou dossiers lors du déclenchement du workflow.</p>
<p>Voici un exemple :</p>
<pre><code class="language-yaml">on:
  push:
    branches: [main]
    paths-ignore:
      - '**.md'
      - 'docs/**'
</code></pre>
<p>Avec cette configuration, un <code>push</code> qui modifie uniquement des fichiers Markdown ou des fichiers présents dans le dossier <code>docs/</code> ne déclenchera pas le <strong>déploiement automatique</strong>. En revanche, si le commit contient une modification du code applicatif, le workflow sera exécuté normalement.</p>
<p>Cette variante est utile pour les projets actifs, où plusieurs types de changements cohabitent : documentation, configuration, code source, scripts ou fichiers de build. Elle permet de limiter les exécutions inutiles dans l’onglet « <strong>Actions</strong> », de réduire le temps consommé par les workflows et d’éviter des redémarrages serveur sans intérêt.</p>
<p>Il est aussi possible d’utiliser <code>paths</code> au lieu de <code>paths-ignore</code> pour déclencher le workflow uniquement lorsque certains fichiers changent. Par exemple, vous pouvez choisir de déployer seulement si le dossier <code>src/</code>, le fichier <code>package.json</code> ou un dossier applicatif précis est modifié. Le bon choix dépend de votre organisation de projet.</p>
<h3>2. Ajouter une étape de test avant déploiement</h3>
<p>Un <strong>workflow GitHub Actions</strong> plus robuste ne déploie pas immédiatement le code après un <code>push</code>. Il commence par exécuter des tests automatisés, puis lance le <strong>déploiement sur le VPS</strong> uniquement si ces tests réussissent. Cette approche limite le risque de mettre en production une version cassée de l’application.</p>
<p>Voici un exemple de workflow avec deux jobs : un job <code>test</code>, puis un job <code>deploy</code>.</p>
<pre><code class="language-yaml">name: Tests puis déploiement VPS

on:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test

  deploy:
    needs: [test]
    runs-on: ubuntu-latest

    steps:
      - name: Déployer sur le VPS via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.VPS_HOST }}
          username: ${{ secrets.VPS_USERNAME }}
          key: ${{ secrets.VPS_SSH_KEY }}
          port: ${{ secrets.VPS_PORT }}
          script: |
            cd /var/www/monsite
            git pull origin main
            npm ci --production
            pm2 restart monapp
</code></pre>
<p>Dans cet exemple, le job <code>test</code> récupère d’abord le code avec <code>actions/checkout@v4</code>, installe les dépendances avec <code>npm ci</code>, puis exécute les tests avec <code>npm test</code>.</p>
<p>La ligne importante est la suivante :</p>
<pre><code class="language-yaml">needs: [test]
</code></pre>
<p>Elle indique que le job <code>deploy</code> dépend du job <code>test</code>. Si les tests échouent, le déploiement ne sera pas lancé. Cette sécurité est particulièrement importante pour les projets collaboratifs, les applications avec de nombreuses dépendances ou les sites e-commerce où une erreur peut avoir un impact direct sur l’expérience utilisateur.</p>
<p>Vous pouvez adapter cette logique à votre stack. Pour un projet PHP, il peut s’agir de tests PHPUnit. Pour une application front-end, vous pouvez lancer un build ou des tests unitaires JavaScript. L’essentiel est de vérifier automatiquement que le code est dans un état acceptable avant de l’envoyer sur le <strong>VPS de production</strong>.</p>
<h3>3. Déploiement via Docker plutôt que git pull direct</h3>
<p>Le déploiement présenté jusqu’ici repose sur une logique simple : le <strong>VPS</strong> contient déjà le dépôt Git, et le workflow exécute un <code>git pull</code> pour récupérer la dernière version du code. Cette méthode est facile à comprendre et convient à de nombreux projets, notamment pour commencer avec <strong>GitHub Actions</strong>.</p>
<p>Pour des projets plus complexes, une approche avec <strong>Docker</strong> peut être plus robuste. Au lieu de mettre à jour directement le code sur le serveur, le workflow peut construire une image Docker, la publier dans un registre, puis demander au VPS de récupérer et relancer le conteneur correspondant.</p>
<p>Cette méthode présente plusieurs avantages. Elle permet de mieux maîtriser l’environnement d’exécution, de limiter les différences entre développement et production, et de rendre les déploiements plus reproductibles. Elle est particulièrement intéressante lorsque votre projet utilise plusieurs services, des dépendances système précises ou une configuration applicative avancée.</p>
<p>Dans ce cas, le workflow <strong>GitHub Actions</strong> ne se contente plus d’exécuter <code>git pull</code>. Il peut inclure des étapes comme :</p>
<ul>
<li>construire une image Docker ;</li>
<li>pousser l’image vers un registre ;</li>
<li>se connecter au VPS en <strong>SSH</strong> ;</li>
<li>exécuter <code>docker compose pull</code> ;</li>
<li>relancer les conteneurs avec <code>docker compose up -d</code>.</li>
</ul>
<p>Cette variante dépasse le cadre de ce tutoriel, mais elle constitue une évolution naturelle si votre projet grandit. Pour approfondir cette approche, vous pouvez consulter un guide dédié afin de <a title="Docker sur VPS LWS : installer et déployer ses applications en 2026" href="https://tutoriels.lws.fr/vps/docker-vps-lws-deployer-ses-applications">déployer vos applications conteneurisées avec Docker sur VPS.</a></p>
<h2>Vérification du bon fonctionnement</h2>
<p>Après la mise en place de votre <strong>déploiement automatique avec GitHub Actions</strong>, prenez le temps de vérifier chaque point important. Une automatisation fiable ne se limite pas à une première exécution réussie : elle doit être compréhensible, reproductible et facile à diagnostiquer en cas de problème.</p>
<p>Commencez par effectuer un petit changement dans votre projet, par exemple une modification mineure dans le code ou dans une page de test. Créez un commit, puis poussez-le sur la branche <code>main</code>. Le workflow doit apparaître automatiquement dans l’onglet « <strong>Actions</strong> » du dépôt GitHub.</p>
<p>Vérifiez ensuite les points suivants :</p>
<ul>
<li>un <code>push</code> sur la branche <strong>main</strong> déclenche bien le workflow ;</li>
<li>le workflow apparaît dans l’onglet <strong>Actions</strong> avec le bon nom ;</li>
<li>l’exécution se termine avec une <strong>coche verte</strong> ;</li>
<li>aucune erreur de connexion <strong>SSH</strong> n’apparaît dans les logs ;</li>
<li>les commandes du bloc <code>script</code> sont exécutées dans le bon dossier sur le <strong>VPS</strong> ;</li>
<li>l’application reflète bien la dernière version du code ;</li>
<li>le processus applicatif est bien redémarré, par exemple avec <code>pm2 status</code> ;</li>
<li>les <strong>secrets GitHub</strong> ne sont jamais visibles en clair dans les logs ;</li>
<li>le serveur reste stable après le déploiement, sans pic anormal de <strong>CPU</strong> ou de <strong>RAM</strong>.</li>
</ul>
<p>Si tous ces points sont validés, votre pipeline de <strong>déploiement automatique</strong> est opérationnel. Vous pouvez maintenant pousser vos mises à jour depuis GitHub et laisser le workflow se charger des commandes répétitives sur le serveur.</p>
<p>Gardez toutefois une bonne habitude : surveillez les premières exécutions, surtout après une modification du fichier <code>deploy.yml</code>. Une petite erreur d’indentation, un mauvais chemin serveur ou une commande inadaptée peuvent bloquer le déploiement. Une fois le workflow stabilisé, il deviendra un véritable gain de temps dans votre routine de développement.</p>
<h2>Erreurs fréquentes et cas de blocage</h2>
<p>Même avec un workflow bien structuré, un premier <strong>déploiement GitHub Actions sur VPS</strong> peut échouer pour des raisons simples : clé mal copiée, mauvais chemin serveur, port SSH bloqué ou commande de redémarrage incorrecte. L’avantage de <strong>GitHub Actions</strong> est que chaque exécution produit des logs détaillés. Il faut donc les lire étape par étape, sans se limiter au message final d’échec.</p>
<p>Voici les erreurs les plus fréquentes et les solutions à vérifier en priorité.</p>
<table>
<thead>
<tr>
<th>Erreur</th>
<th>Cause probable</th>
<th>Solution recommandée</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<blockquote><p><strong>Permission denied (publickey)</strong></p></blockquote>
</td>
<td>
<blockquote><p>La clé publique n’a pas été ajoutée au fichier <code>authorized_keys</code>, la mauvaise clé privée a été collée dans <strong>VPS_SSH_KEY</strong>, ou l’utilisateur SSH est incorrect.</p></blockquote>
</td>
<td>
<blockquote><p>Vérifier que la clé publique correspond bien à la clé privée utilisée dans GitHub. Contrôler aussi le nom d’utilisateur dans <strong>VPS_USERNAME</strong>.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Le workflow ne se déclenche jamais</strong></p></blockquote>
</td>
<td>
<blockquote><p>Le fichier YAML n’est pas placé dans <code>.github/workflows/</code>, ou le déclencheur <code>on:</code> contient une erreur de syntaxe.</p></blockquote>
</td>
<td>
<blockquote><p>Vérifier l’emplacement exact du fichier <code>deploy.yml</code> et contrôler l’indentation YAML.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Erreur de connexion au VPS</strong></p></blockquote>
</td>
<td>
<blockquote><p>L’adresse IP, le port SSH ou le pare-feu du serveur empêche la connexion.</p></blockquote>
</td>
<td>
<blockquote><p>Vérifier <strong>VPS_HOST</strong>, <strong>VPS_PORT</strong>, la configuration SSH du VPS et les règles de pare-feu.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong><code>cd /var/www/monsite</code> échoue</strong></p></blockquote>
</td>
<td>
<blockquote><p>Le chemin indiqué dans le workflow ne correspond pas au dossier réel du projet sur le VPS.</p></blockquote>
</td>
<td>
<blockquote><p>Se connecter manuellement en SSH au serveur et vérifier le chemin exact avec <code>pwd</code> et <code>ls</code>.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong><code>git pull</code> échoue pendant le déploiement</strong></p></blockquote>
</td>
<td>
<blockquote><p>Des modifications locales non commitées existent sur le VPS et entrent en conflit avec la version GitHub.</p></blockquote>
</td>
<td>
<blockquote><p>Éviter de modifier le code directement sur le serveur. En cas de besoin, analyser les changements avant d’utiliser <code>git stash</code> ou <code>git reset --hard origin/main</code>.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>L’application ne redémarre pas</strong></p></blockquote>
</td>
<td>
<blockquote><p>Le nom du processus <strong>PM2</strong> est incorrect, ou la commande de redémarrage n’est pas adaptée à la stack.</p></blockquote>
</td>
<td>
<blockquote><p>Utiliser <code>pm2 list</code> ou <code>pm2 status</code> pour retrouver le nom exact du processus.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Le workflow reste bloqué trop longtemps</strong></p></blockquote>
</td>
<td>
<blockquote><p>La connexion SSH attend une réponse, le serveur ne répond pas, ou une commande ne se termine pas.</p></blockquote>
</td>
<td>
<blockquote><p>Ajouter une limite de temps avec <code>timeout-minutes</code> et vérifier l’état du VPS.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Un secret apparaît sous la forme <code>***</code> dans les logs</strong></p></blockquote>
</td>
<td>
<blockquote><p>GitHub masque automatiquement les valeurs correspondant aux <strong>secrets GitHub</strong>.</p></blockquote>
</td>
<td>
<blockquote><p>Ne rien corriger : c’est un comportement normal de protection des données sensibles.</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p>Pour faciliter le diagnostic, commencez toujours par distinguer deux types de problèmes. Si l’erreur intervient avant l’exécution du bloc <code>script</code>, le souci vient probablement de la connexion <strong>SSH</strong> ou des <strong>secrets GitHub</strong>. Si l’erreur apparaît après la connexion au serveur, le problème vient plutôt des commandes exécutées sur le <strong>VPS</strong>.</p>
<p>Vous pouvez aussi tester manuellement chaque commande du bloc <code>script</code> en vous connectant au serveur en SSH. Par exemple :</p>
<pre><code class="language-bash">cd /var/www/monsite
git pull origin main
npm ci --production
pm2 restart monapp
</code></pre>
<p>Si une commande échoue manuellement, elle échouera aussi dans <strong>GitHub Actions</strong>. Cette méthode permet souvent de résoudre rapidement les problèmes sans modifier inutilement le workflow.</p>
<h2>Bonnes pratiques</h2>
<p>Une fois le <strong>déploiement automatique</strong> opérationnel, il est important de sécuriser et de fiabiliser votre configuration. Un workflow qui fonctionne une première fois n’est pas forcément un workflow prêt pour la production à long terme. Quelques bonnes pratiques permettent de réduire les risques et d’améliorer la maintenance.</p>
<p>Utilisez toujours une <strong>clé SSH dédiée</strong> à l’automatisation. Cette clé ne doit servir qu’au workflow <strong>GitHub Actions</strong>. En cas de suspicion de compromission, vous pourrez la révoquer rapidement sans bloquer vos propres accès administrateur au serveur.</p>
<p>Évitez autant que possible d’utiliser le compte <code>root</code> pour le déploiement. Lorsque c’est possible, créez un utilisateur dédié avec uniquement les droits nécessaires au projet. Cette approche limite les conséquences en cas d’erreur dans le workflow ou d’exposition accidentelle d’un accès.</p>
<p>Ne stockez jamais d’identifiant, d’adresse IP sensible, de mot de passe ou de <strong>clé privée SSH</strong> directement dans le fichier <code>deploy.yml</code>. Toutes les données sensibles doivent passer par les <strong>secrets GitHub</strong>. Le fichier YAML doit rester lisible, mais jamais contenir d’informations confidentielles.</p>
<p>Ajoutez progressivement une étape de test avant le déploiement. Même un test simple, un lint ou une commande de build peut éviter de mettre en production une version cassée. Pour un projet professionnel, le couple <strong>tests automatisés + déploiement conditionnel</strong> devient rapidement indispensable.</p>
<p>Créez un <strong>snapshot LWS</strong> avant les changements importants du pipeline. C’est particulièrement utile lorsque vous modifiez le processus de build, le gestionnaire de processus, la configuration <strong>PM2</strong>, Docker ou les permissions serveur.</p>
<p>Surveillez régulièrement l’onglet “<strong>Actions</strong>” de GitHub. Un workflow peut échouer silencieusement si personne ne consulte les exécutions. Prenez l’habitude de vérifier les premiers déploiements après chaque modification du fichier YAML.</p>
<p>Enfin, documentez votre processus. Ajoutez dans le dépôt un court fichier expliquant le rôle du workflow, les secrets nécessaires, le chemin du projet sur le VPS et les commandes exécutées. Cette documentation sera précieuse si un autre développeur doit reprendre le projet.</p>
<div class="alert_more_info"><p class="title">Plus d'informations</p><hr><p></p>
<p>Envie d’automatiser le déploiement de vos projets sur votre propre infrastructure ? Les <strong>VPS KVM LWS</strong> offrent un <strong>accès root complet</strong>, un <strong>Panel de supervision</strong> et un support francophone 7j/7 pour accompagner votre workflow DevOps. Avec un <strong>VPS KVM LWS avec accès root pour vos déploiements automatisés</strong>, vous gardez la maîtrise de votre serveur tout en simplifiant vos mises en production.</p>
<p><a title="Découvrir les VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Découvrir les VPS KVM LWS</a></p>
<p></p></div>
<h2>FAQ</h2>
<p><strong>GitHub Actions est-il gratuit pour déployer sur un VPS personnel ?</strong></p>
<p>Oui, <strong>GitHub Actions</strong> peut être utilisé pour déployer un site sur un <strong>VPS personnel</strong>. GitHub propose des minutes d’exécution incluses selon le type de compte et la visibilité du dépôt. Pour un petit projet, un workflow simple de déploiement SSH consomme généralement peu de ressources. Il faut toutefois surveiller l’usage si les workflows deviennent fréquents, longs ou complexes.</p>
<p><strong>Quelle est la différence entre GitHub Actions et GitLab CI/CD ?</strong></p>
<p><strong>GitHub Actions</strong> est intégré à GitHub, tandis que <strong>GitLab CI/CD</strong> est intégré à GitLab. Les deux outils permettent d’automatiser des tests, des builds et des déploiements. Le choix dépend surtout de l’endroit où votre code est hébergé, de vos habitudes de travail et de votre besoin éventuel d’une solution auto-hébergée.</p>
<p><strong>Comment sécuriser les identifiants utilisés dans un workflow GitHub Actions ?</strong></p>
<p>Il faut utiliser les <strong>secrets GitHub</strong> pour stocker les informations sensibles : adresse du serveur, utilisateur SSH, port et <strong>clé privée SSH</strong>. Ces données ne doivent jamais être écrites directement dans le fichier YAML. Il est aussi recommandé d’utiliser une clé SSH dédiée au déploiement et un utilisateur serveur avec des permissions limitées.</p>
<p><strong>Peut-on utiliser GitHub Actions pour déployer un site WordPress ?</strong></p>
<p>Oui, il est possible d’utiliser <strong>GitHub Actions</strong> pour déployer un site <strong>WordPress</strong>, mais la méthode dépend de votre organisation. Vous pouvez automatiser le déploiement d’un thème, d’un plugin ou d’un projet versionné. En revanche, il faut faire attention aux fichiers générés par WordPress, aux médias, à la base de données et aux modifications réalisées directement depuis l’administration.</p>
<p><strong>Que faire si le déploiement automatique échoue sans message d&rsquo;erreur clair ?</strong></p>
<p>Commencez par ouvrir l’onglet <strong>Actions</strong>, puis consultez les logs détaillés du job en erreur. Vérifiez ensuite la connexion <strong>SSH</strong>, les <strong>secrets GitHub</strong>, le chemin du projet sur le <strong>VPS</strong> et chaque commande du bloc <code>script</code>. Le plus efficace est souvent de se connecter manuellement au serveur et de rejouer les commandes une par une.</p>
<p><strong>Faut-il un VPS pour utiliser GitHub Actions, ou existe-t-il des alternatives ?</strong></p>
<p>Il n’est pas obligatoire d’avoir un <strong>VPS</strong> pour utiliser <strong>GitHub Actions</strong>. L’outil peut aussi servir à lancer des tests, construire un site statique, publier un paquet ou déployer vers d’autres plateformes. En revanche, pour déployer sur une infrastructure que vous contrôlez totalement, un <strong>VPS Linux</strong> reste une solution flexible, notamment grâce à l’accès SSH et aux droits d’administration.</p>
<h2>Conclusion</h2>
<p>Mettre en place un <strong>déploiement automatique avec GitHub Actions</strong> permet de gagner du temps, de réduire les erreurs humaines et de fiabiliser les mises en production. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />En configurant un <strong>workflow YAML</strong>, une <strong>clé SSH dédiée</strong> et des <strong>secrets GitHub</strong>, vous pouvez déclencher la mise à jour de votre site à chaque <code>push</code> sur la branche <code>main</code>, sans vous connecter manuellement au serveur. Cette approche reste simple à comprendre, tout en constituant une excellente première étape vers une vraie logique <strong>CI/CD</strong>. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" />Avec un <strong>VPS KVM LWS</strong>, vous disposez d’un environnement flexible, d’un accès root, de snapshots et d’outils de supervision pour sécuriser votre pipeline. Une fois ce premier workflow stabilisé, vous pourrez l’enrichir avec des tests, des filtres de déclenchement ou un déploiement Docker.</p>
<div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div>
<p><em>Vous avez une question, un retour d’expérience ou une difficulté avec GitHub Actions ? Partagez-la en commentaire : cela pourra aider d’autres lecteurs à sécuriser leur propre déploiement automatique.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/comment-utiliser-github-actions-pour-deployer-automatiquement-son-site/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29883</post-id>	</item>
		<item>
		<title>LLM AI open source : déployer et utiliser un modèle de langage sur son VPS</title>
		<link>https://tutoriels.lws.fr/vps/llm-ai-open-source-vps</link>
					<comments>https://tutoriels.lws.fr/vps/llm-ai-open-source-vps#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Mon, 13 Jul 2026 13:59:46 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=29763</guid>

					<description><![CDATA[Les LLM AI open source attirent de plus en plus les développeurs, administrateurs système et entreprises qui souhaitent utiliser l’intelligence artificielle sans dépendre uniquement d’une API cloud externe. 😊Les services comme OpenAI, Anthropic ou Google sont puissants, mais ils peuvent entraîner deux limites importantes : un coût d’utilisation variable selon le volume de requêtes, et &#8230; <a href="https://tutoriels.lws.fr/vps/llm-ai-open-source-vps" class="more-link">Continue reading <span class="screen-reader-text">LLM AI open source : déployer et utiliser un modèle de langage sur son VPS</span></a>]]></description>
										<content:encoded><![CDATA[<p class="isSelectedEnd">Les <strong>LLM AI open source</strong> attirent de plus en plus les développeurs, administrateurs système et entreprises qui souhaitent utiliser l’<strong>intelligence artificielle</strong> sans dépendre uniquement d’une API cloud externe. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" />Les services comme OpenAI, Anthropic ou Google sont puissants, mais ils peuvent entraîner deux limites importantes : un <strong>coût d’utilisation variable</strong> selon le volume de requêtes, et des questions de <strong>confidentialité des données</strong> lorsque des documents clients, du code propriétaire ou des informations sensibles sont envoyés vers un prestataire tiers.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p class="isSelectedEnd">Avec un <strong>VPS Linux</strong>, il devient possible d’héberger un <strong>modèle IA local</strong> grâce à Ollama, sans clé API obligatoire. L’approche ne transforme pas un VPS CPU en machine GPU haute performance, mais elle permet de créer une <strong>IA auto-hébergée</strong>, maîtrisée, utile pour des usages internes, des tests, de l’automatisation ou du traitement confidentiel.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f512.png" alt="🔒" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2>Objectif</h2>
<p class="isSelectedEnd">L’objectif de ce tutoriel est de vous guider pas à pas pour <strong>installer Ollama sur un VPS KVM LWS</strong> sous Ubuntu ou Debian, puis télécharger un <strong>modèle de langage open source</strong> adapté aux ressources disponibles. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />Vous apprendrez à vérifier la mémoire et l’espace disque, lancer un premier modèle depuis le terminal, utiliser l’<strong>API REST locale d’Ollama</strong> et comprendre les bonnes pratiques de sécurité avant toute exposition externe.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/263a.png" alt="☺" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ollama propose une intégration locale via une API accessible par défaut sur <code dir="ltr">localhost:11434</code>, ce qui permet d’intégrer le modèle dans des scripts ou applications sans exposer directement le service sur Internet. En fin de parcours, votre VPS pourra exécuter un <strong>LLM local sans API cloud</strong>, avec une supervision depuis le Panel KVM LWS et une architecture pensée pour préserver la maîtrise des données.</p>
<h2>Pré-requis</h2>
<p class="isSelectedEnd">Avant de commencer :</p>
<ul>
<li class="isSelectedEnd">prévoyez un <strong>VPS KVM LWS</strong> avec accès root SSH, idéalement sous <strong>Ubuntu 22.04/24.04</strong> ou <strong>Debian 11/12</strong>. Pour un petit modèle de 3 à 4 milliards de paramètres, <strong>8 Go de RAM</strong> peuvent suffire. Pour un modèle 7B ou 8B, visez plutôt <strong>16 Go de RAM</strong> afin d’éviter une saturation rapide.</li>
<li class="isSelectedEnd">Gardez aussi au moins <strong>10 à 20 Go d’espace disque libre</strong>, car les modèles peuvent occuper plusieurs gigaoctets. Les offres VPS KVM LWS mettent en avant un stockage <strong>SSD NVMe</strong> et des fonctions de sauvegarde, utiles pour ce type d’installation serveur.</li>
<li class="isSelectedEnd">Enfin, gardez en tête qu’un VPS KVM standard fonctionne ici en <strong>inférence CPU</strong>, sans GPU dédié : les réponses seront donc plus lentes qu’avec une infrastructure IA spécialisée.</li>
</ul>
<h2>Pourquoi faire tourner un LLM sur son VPS : les cas d&rsquo;usage réels</h2>
<p class="isSelectedEnd">Déployer un <strong>LLM open source sur VPS</strong> répond à un besoin très concret : garder la main sur l’exécution du modèle, les données traitées et les coûts. Pour une entreprise, un indépendant ou une équipe technique, cette approche permet de tester des usages IA sans envoyer systématiquement les contenus vers une plateforme externe.</p>
<table>
<tbody>
<tr>
<th>Motivation</th>
<th>Explication</th>
</tr>
<tr>
<td>
<blockquote><p><strong>Confidentialité / RGPD</strong></p></blockquote>
</td>
<td>
<blockquote><p>Les données restent sur le serveur que vous administrez. Cette approche limite les transferts vers des services tiers, un point important lorsque les traitements impliquent des données personnelles ou sensibles. Le RGPD encadre notamment les transferts de données vers des pays tiers via son chapitre V et son article 44.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Coût zéro à l’usage</strong></p></blockquote>
</td>
<td>
<blockquote><p>Une fois Ollama installé et le modèle téléchargé, vous ne payez pas chaque requête envoyée au modèle. Cela peut être intéressant pour des scripts internes, des traitements batch ou des tests répétés.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>Indépendance technique</strong></p></blockquote>
</td>
<td>
<blockquote><p>Le modèle tourne sur votre propre VPS. Vous n’êtes pas bloqué par un quota API, une clé expirée, une limite de débit ou une indisponibilité ponctuelle d’un service IA externe.</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p class="isSelectedEnd">Cette solution est particulièrement pertinente pour résumer des documents internes, analyser des textes, assister un développeur, générer des brouillons, créer des réponses automatiques ou enrichir une application métier via une <strong>API IA locale</strong>. Ollama est disponible sur Linux et propose une API utilisable pour intégrer le modèle dans une application ou un workflow.</p>
<p>Il faut toutefois rester réaliste. Un <strong>VPS sans GPU</strong> ne fournit pas les mêmes performances qu’une API IA commerciale ou qu’un serveur équipé d’une carte graphique spécialisée. Les grands modèles, notamment les modèles 70B, ne sont généralement pas adaptés à une inférence CPU sur VPS classique.</p>
<p>Le bon choix consiste donc à privilégier des modèles plus légers, comme des modèles 3B, 4B, 7B ou 8B, selon la mémoire disponible. L’administrateur doit aussi gérer l’espace disque, les mises à jour d’Ollama, les modèles installés et la sécurité réseau. C’est le prix de l’<strong>IA auto-hébergée</strong> : plus de contrôle, mais aussi plus de responsabilité technique.</p>
<div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div>
<h2>Comprendre Ollama : ce que c&rsquo;est exactement</h2>
<p class="isSelectedEnd"><strong>Ollama</strong> est un outil qui permet d’installer, de télécharger et d’exécuter facilement des <strong>modèles de langage open source</strong> sur une machine locale ou un serveur Linux. Dans le cadre de ce tutoriel, il sert d’intermédiaire entre votre <strong>VPS KVM LWS</strong> et le <strong>LLM AI open source</strong> que vous souhaitez utiliser. Au lieu de configurer manuellement un moteur d’inférence, les fichiers du modèle, les paramètres de lancement et l’accès API, Ollama simplifie l’ensemble avec quelques commandes.</p>
<p class="isSelectedEnd">Concrètement, Ollama permet de récupérer des modèles depuis sa bibliothèque officielle, puis de les lancer depuis le terminal avec une commande comme <code dir="ltr">ollama run</code>.</p>
<p class="isSelectedEnd">Sa documentation indique que l’API locale est exposée, après installation, sur l’URL de base <code dir="ltr">http://localhost:11434/api</code>. Cela signifie que le service répond localement sur le VPS, sans être automatiquement publié sur Internet.</p>
<p class="isSelectedEnd">Ollama propose aussi une API utilisable par des scripts, des applications ou des outils d’automatisation. Pour un administrateur VPS, c’est un point important : le <strong>modèle IA local</strong> peut être interrogé par un script Python, une application web, un workflow n8n ou un connecteur interne, sans passer par une API cloud payante.</p>
<p class="isSelectedEnd">Il faut toutefois bien comprendre ce qu’Ollama n’est pas. Ce n’est pas une interface graphique complète comme ChatGPT. Ce n’est pas non plus un service cloud managé, ni une plateforme d’entraînement ou de fine-tuning avancé. Ollama sert principalement à <strong>exécuter des modèles LLM localement</strong>, à les gérer plus simplement et à fournir une <strong>API REST locale</strong> exploitable dans vos projets. Pour une interface web, il faudra ajouter une solution complémentaire comme <strong>Open WebUI</strong>, que nous verrons plus loin.</p>
<div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div>
<h2>Choisir le bon modèle selon les ressources du VPS</h2>
<p class="isSelectedEnd">Le choix du modèle est l’étape la plus importante lorsque l’on veut déployer un <strong>LLM open source sur VPS</strong>. Un modèle trop lourd peut saturer la mémoire, ralentir fortement le serveur ou empêcher le service de démarrer correctement. Sur un VPS sans GPU dédié, il faut raisonner en priorité selon la <strong>RAM disponible</strong>, l’espace disque et le type d’usage attendu.</p>
<p class="isSelectedEnd">Les petits modèles sont adaptés aux tests, aux résumés simples, aux réponses courtes ou à l’automatisation légère. Les modèles 7B ou 8B offrent généralement de meilleurs résultats, mais demandent davantage de mémoire. Les modèles beaucoup plus volumineux, comme les modèles 24B, 30B ou 70B, doivent être abordés avec prudence sur une infrastructure CPU-only.</p>
<table>
<tbody>
<tr>
<th>RAM du VPS</th>
<th>Modèles envisageables</th>
<th>Taille approximative</th>
<th>Usage conseillé</th>
</tr>
<tr>
<td>
<blockquote><p><strong>8 Go</strong></p></blockquote>
</td>
<td>
<blockquote><p><strong>Phi-3 Mini</strong>, <strong>Gemma 3 4B</strong>, petits modèles 1B à 4B</p></blockquote>
</td>
<td>
<blockquote><p>2 à 4 Go selon le tag</p></blockquote>
</td>
<td>
<blockquote><p>Tests, prompts courts, automatisation légère</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>16 Go</strong></p></blockquote>
</td>
<td>
<blockquote><p><strong>Mistral 7B</strong>, <strong>Llama 3.x 8B</strong>, <strong>Qwen 3 8B</strong></p></blockquote>
</td>
<td>
<blockquote><p>4 à 6 Go selon le tag</p></blockquote>
</td>
<td>
<blockquote><p>Usage régulier non temps réel</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>32 Go</strong></p></blockquote>
</td>
<td>
<blockquote><p>Modèles 14B à 24B selon quantification</p></blockquote>
</td>
<td>
<blockquote><p>8 à 16 Go ou plus</p></blockquote>
</td>
<td>
<blockquote><p>Tests avancés, réponses plus longues</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p><strong>64 Go et plus</strong></p></blockquote>
</td>
<td>
<blockquote><p>Modèles plus lourds</p></blockquote>
</td>
<td>
<blockquote><p>30 à 40 Go ou plus</p></blockquote>
</td>
<td>
<blockquote><p>Possible, mais rarement recommandé en CPU pur</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p class="isSelectedEnd">Parmi les modèles légers, <strong>Phi-3 Mini</strong> est intéressant pour un VPS de taille modeste : la fiche Ollama le présente comme un modèle de <strong>3,8 milliards de paramètres</strong>, conçu pour rester léger. <strong>Gemma 3</strong> propose également plusieurs tailles, dont des variantes compactes comme 1B et 4B, pensées pour des environnements aux ressources limitées.</p>
<p class="isSelectedEnd">Pour un VPS plus confortable, <strong>Mistral 7B</strong> reste un choix pertinent : la fiche Ollama indique qu’il s’agit d’un modèle 7B distribué sous licence Apache. <strong>Qwen 3 8B</strong> peut aussi être envisagé pour des usages plus polyvalents, notamment lorsque l’on recherche un modèle récent avec plusieurs variantes dans la famille Qwen.</p>
<p class="isSelectedEnd">Sur un <strong>VPS KVM LWS sans GPU</strong>, ne promettez pas des performances comparables à une plateforme IA cloud. L’<strong>inférence CPU</strong> fonctionne, mais elle est plus lente. Pour un usage confortable, mieux vaut commencer par un modèle raisonnable, mesurer la consommation réelle, puis augmenter progressivement la taille du modèle si les ressources le permettent.</p>
<h2>Créer un snapshot LWS avant l&rsquo;installation</h2>
<p class="isSelectedEnd">Avant d’installer Ollama, créez un <strong>snapshot LWS</strong> de votre VPS. Cette étape est simple, mais elle peut vous éviter une restauration longue en cas de mauvaise manipulation, d’installation incomplète ou de manque d’espace disque pendant le téléchargement d’un modèle volumineux.</p>
<p class="isSelectedEnd">Un snapshot fige l’état du serveur à un instant donné. Vous pouvez ainsi revenir en arrière si le système devient instable, si un service ne démarre plus correctement ou si vous souhaitez annuler les modifications.</p>
<p class="isSelectedEnd">Sur la page des <strong>VPS KVM LWS</strong>, LWS indique que les offres incluent des sauvegardes quotidiennes et jusqu’à trois snapshots gratuits simultanés pour figer l’état du VPS.</p>
<p class="isSelectedEnd">Dans le <strong>Panel KVM LWS</strong>, ouvrez la gestion de votre VPS, rendez-vous dans la partie dédiée aux snapshots.</p>
<p><img class="aligncenter wp-image-29428 size-full"  alt="Snapshots" width="1182" height="896" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Snapshots.webp"></p>
<p class="isSelectedEnd">Puis créez un instantané avant de poursuivre. C’est une bonne pratique avant toute installation serveur significative.</p>
<p><img class="aligncenter wp-image-29546 size-full"  alt="Créer un snapshot sur un VPS KVM LWS" width="1259" height="724" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/creer-un-snapshot-2.webp"></p>
<p>&nbsp;</p>
<h2>Installer Ollama sur le VPS</h2>
<p class="isSelectedEnd">L’installation d’<strong>Ollama sur un VPS Linux</strong> se fait depuis un terminal SSH avec un compte disposant des droits nécessaires. La méthode officielle pour Linux indiquée sur la page de téléchargement d’Ollama repose sur une commande <code dir="ltr">curl</code> qui récupère et exécute le script d’installation.</p>
<p>Avant de lancer cette commande, il faut toutefois vérifier deux points : l’<strong>espace disque disponible</strong> et la <strong>mémoire RAM</strong>. Ces contrôles évitent de télécharger un modèle trop lourd pour votre VPS. Les étapes suivantes vont donc commencer par les vérifications système, puis l’installation du service, le contrôle de <code dir="ltr">systemd</code> et le test de l’API locale.</p>
<h3>1. Vérifier l&rsquo;espace disque disponible</h3>
<p class="isSelectedEnd">Avant d’installer <strong>Ollama sur votre VPS Linux</strong>, commencez par vérifier que le serveur dispose de suffisamment de ressources. Cette étape est importante, car un <strong>modèle LLM open source</strong> peut occuper plusieurs gigaoctets sur le disque et consommer une part importante de la mémoire vive pendant l’inférence.</p>
<p class="isSelectedEnd">Connectez-vous à votre <strong>VPS KVM LWS</strong> en SSH en utilisant vos accès root.</p>
<p><img class="aligncenter wp-image-29776 size-full"  alt="se connecter à son VPS KVM LWS" width="1094" height="804" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/se-connecter-a-son-VPS.png"></p>
<p class="isSelectedEnd">Puis exécutez les commandes suivantes :</p>
<pre dir="ltr"><code dir="ltr">df -h /
free -h</code></pre>
<p class="isSelectedEnd">La commande <code dir="ltr">df -h /</code> affiche l’espace disque disponible sur la partition principale comme vous pouvez le voir sur la capture ci-dessous :</p>
<p><img class="aligncenter wp-image-29782 size-full"  alt="Vérifier l'espace disponible sur VPS KVM LWS avec la commande df -h" width="1090" height="341" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Voir-lespace-disponible-sur-VPS-KVM-LWS-avec-la-commande-df.png"></p>
<p class="isSelectedEnd">La commande <code dir="ltr">free -h</code> indique la quantité de <strong>RAM disponible</strong> et l’utilisation éventuelle du swap.</p>
<p><img class="aligncenter wp-image-29779 size-full"  alt="Utiliser la commande free sur son VPS KVM LWS" width="1087" height="361" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Utiliser-la-commande-free.png"></p>
<p class="isSelectedEnd">Pour un premier test avec un petit modèle, gardez au minimum <strong>10 Go d’espace libre</strong>. Pour plusieurs modèles ou un modèle 7B/8B, prévoyez plutôt <strong>20 Go ou plus</strong>.</p>
<p class="isSelectedEnd">Si votre VPS manque d’espace disque ou de mémoire, mieux vaut corriger le problème avant de poursuivre. Télécharger un modèle trop volumineux sur un serveur déjà presque plein peut provoquer des erreurs d’installation, ralentir le système ou rendre le VPS difficile à administrer.</p>
<h3>2. Installer Ollama</h3>
<p class="isSelectedEnd">Une fois les ressources vérifiées, vous pouvez installer <strong>Ollama</strong>. La méthode officielle pour Linux consiste à exécuter le script d’installation fourni depuis la page de téléchargement d’Ollama. Au moment de la vérification et de cette rédaction, la commande Linux officielle indiquée est la suivante :</p>
<pre dir="ltr"><code dir="ltr">curl -fsSL https://ollama.com/install.sh | sh</code></pre>
<p class="isSelectedEnd">Cette commande télécharge le script d’installation et l’exécute sur le serveur. Sur un <strong>VPS Ubuntu</strong> ou <strong>Debian</strong> administré en root, elle permet d’installer Ollama directement depuis le terminal SSH. Si vous utilisez un utilisateur non root avec privilèges <code dir="ltr">sudo</code>, vérifiez que votre session dispose bien des droits nécessaires. Regardez le résultat de l&rsquo;installation de Ollama sur notre VPS KVM LWS de test dans la capture ci-dessous :</p>
<p><img class="aligncenter wp-image-29773 size-full"  alt="installation du modèle ollama sur VPS KVM LWS" width="1164" height="817" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/installation-du-modele-ollama-sur-VPS-KVM-LWS.png"></p>
<p class="isSelectedEnd">Pendant l’installation, le script prépare les fichiers nécessaires au fonctionnement d’Ollama. Sur Linux, Ollama peut ensuite être géré comme un service système. C’est ce service qui permettra au <strong>LLM local</strong> de rester disponible sur le VPS, même après la fermeture de votre session SSH.</p>
<p class="isSelectedEnd">À ce stade, ne téléchargez pas encore de modèle. L’objectif est d’abord de confirmer que le service <strong>Ollama</strong> est correctement installé et actif.</p>
<h3>3. Vérifier que le service est actif</h3>
<p class="isSelectedEnd">Après l’installation, vérifiez que le service <strong>Ollama</strong> fonctionne correctement. Utilisez la commande suivante :</p>
<pre dir="ltr"><code dir="ltr">systemctl status ollama</code></pre>
<p class="isSelectedEnd">Le retour attendu doit indiquer un service actif, avec une ligne proche de :</p>
<pre dir="ltr"><code dir="ltr">active (running)</code></pre>
<p><img class="aligncenter wp-image-29769 size-full"  alt="Afficher le statut de Ollama sur le VPS KVM LWS" width="1091" height="497" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Afficher-le-statut-de-Ollama.png"></p>
<p class="isSelectedEnd">Vous pouvez également contrôler la version installée avec :</p>
<pre dir="ltr"><code dir="ltr">ollama --version</code></pre>
<p><img class="aligncenter wp-image-29775 size-full"  alt="Vérifier la version Ollama installée sur son VPS KVM LWS" width="1090" height="336" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Ollama-version.png"></p>
<p class="isSelectedEnd">Cette vérification est utile pour deux raisons. D’abord, elle confirme que le binaire Ollama est bien disponible depuis le terminal. Ensuite, elle vous permet de comparer la version installée avec la version stable publiée sur le site officiel si vous préparez une mise en production.</p>
<p class="isSelectedEnd">Si le service n’est pas actif, ne passez pas tout de suite à l’étape suivante. Relancez d’abord le service avec :</p>
<pre dir="ltr"><code dir="ltr">systemctl restart ollama</code></pre>
<p class="isSelectedEnd">Puis vérifiez à nouveau son état :</p>
<pre dir="ltr"><code dir="ltr">systemctl status ollama</code></pre>
<h3>4. Vérifier que l&rsquo;API répond localement</h3>
<p class="isSelectedEnd">Ollama expose une <strong>API locale</strong> qui permet d’interagir avec les modèles depuis des scripts, des applications ou des outils externes. La documentation officielle indique que l’API d’Ollama est servie par défaut à l’adresse <code dir="ltr">http://localhost:11434/api</code> après installation.</p>
<p class="isSelectedEnd">Pour vérifier rapidement que le service répond sur votre VPS, lancez :</p>
<pre dir="ltr"><code dir="ltr">curl http://localhost:11434/</code></pre>
<p class="isSelectedEnd">Si Ollama fonctionne correctement, vous devez obtenir un message de confirmation du type :</p>
<pre dir="ltr"><code dir="ltr">Ollama is running</code></pre>
<p><img class="aligncenter wp-image-29781 size-full"  alt="Vérifier le lancement local de Ollama" width="1083" height="316" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Verifier-le-lancement-local-de-Ollama.png"></p>
<p class="isSelectedEnd">Ce test est volontairement effectué sur <code dir="ltr">localhost</code>. Cela signifie que le service répond depuis le VPS lui-même, sans être exposé publiquement sur Internet. C’est le comportement recherché pour une première installation sécurisée : votre <strong>API IA locale</strong> reste accessible uniquement depuis le serveur.</p>
<p class="isSelectedEnd">Vous pouvez aussi vérifier la base API documentée avec :</p>
<pre dir="ltr"><code dir="ltr">curl http://localhost:11434/api/tags</code></pre>
<p class="isSelectedEnd">Tant qu’aucun modèle n’a été téléchargé, la réponse peut être vide ou ne lister aucun modèle. C’est normal. Les modèles seront installés dans l’étape suivante avec la commande <code dir="ltr">ollama pull</code>.</p>
<p class="isSelectedEnd"><img class="aligncenter wp-image-29780 size-full"  alt="Vérifier la base API si elle est fonctionnelle sur Ollama" width="1077" height="314" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Verifier-la-base-API-si-elle-est-fonctionnelle-sur-Ollama.png"></p>
<div class="alert_tips"><p class="title">Trucs et astuces</p><hr><p></p>
<p>Pour faire tourner un <strong>LLM open source en production</strong>, un <strong>VPS KVM LWS</strong> offre l’accès root nécessaire à l’installation d’Ollama, un stockage <strong>SSD NVMe</strong>, des <strong>snapshots</strong>, des sauvegardes et un monitoring des ressources CPU/RAM depuis le Panel KVM. Ces éléments sont particulièrement utiles pour surveiller la charge pendant l’inférence et adapter les ressources du serveur.</p>
<p><a title="VPS KVM LWS pour héberger votre IA privée open source" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Voir les VPS KVM LWS</a></p>
<p></p></div>
<h2>Télécharger et lancer un premier modèle</h2>
<p class="isSelectedEnd">Une fois <strong>Ollama installé sur votre VPS</strong>, l’étape suivante consiste à télécharger un premier <strong>modèle de langage open source</strong>. Ollama fonctionne avec une bibliothèque de modèles que vous pouvez récupérer depuis le terminal, sans configurer manuellement les fichiers du modèle. La documentation CLI d’Ollama indique notamment les commandes <code dir="ltr">ollama pull</code> pour télécharger un modèle, <code dir="ltr">ollama run</code> pour l’exécuter, <code dir="ltr">ollama rm</code> pour le supprimer et <code dir="ltr">ollama ls</code> pour lister les modèles locaux.</p>
<p class="isSelectedEnd">Pour ce tutoriel, nous utilisons <strong>Mistral</strong> comme exemple, car il s’agit d’un modèle 7B disponible dans la bibliothèque Ollama, avec une taille indiquée d’environ <strong>4,4 Go</strong> pour le tag <code dir="ltr">mistral:latest</code>.</p>
<h3>1. Télécharger un modèle (exemple : Mistral 3 8B)</h3>
<p class="isSelectedEnd">Depuis votre session SSH, lancez la commande suivante :</p>
<pre dir="ltr"><code dir="ltr">ollama pull mistral</code></pre>
<p class="isSelectedEnd">Cette commande télécharge le modèle <strong>Mistral</strong> sur votre VPS.</p>
<p><img class="aligncenter wp-image-29778 size-full"  alt="Télécharger le modèle Mistral 3B sur son VPS KVM LWS via le terminal SSH" width="1101" height="328" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Telecharger-le-modele-Mistral-3B-sur-son-VPS-KVM-LWS-via-le-terminal-SSH.png"></p>
<p class="isSelectedEnd">Selon la connexion réseau, l’espace disque disponible et la charge du serveur, l’opération peut prendre quelques minutes. Ollama indique que le modèle <code dir="ltr">mistral:latest</code> pèse environ <strong>4,4 Go</strong>, ce qui confirme l’importance d’avoir vérifié l’espace disque avant cette étape. Une fois que tout est terminé, vous avez le message du succès.</p>
<p><img class="aligncenter wp-image-29777 size-full"  alt="Téléchargement avec succès du modèle Mistral 3B sur Ollama" width="1101" height="492" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Telechargement-avec-succes-du-modele-Mistral-3B-sur-Ollama.png"></p>
<p class="isSelectedEnd">Sur un <strong>VPS KVM LWS</strong> sans GPU dédié, ce modèle reste exploitable pour des tests et des usages non temps réel, mais il faut garder des attentes raisonnables. L’<strong>inférence CPU</strong> sera plus lente qu’avec une infrastructure équipée d’un GPU. Si votre VPS dispose de peu de RAM, commencez plutôt par un modèle plus léger, puis augmentez progressivement.</p>
<h3>2. Lancer une session de chat interactive</h3>
<p class="isSelectedEnd">Une fois le modèle téléchargé, vous pouvez lancer une session interactive avec :</p>
<pre dir="ltr"><code dir="ltr">ollama run mistral</code></pre>
<p><img class="aligncenter wp-image-29774 size-full"  alt="Interface interactive avec Ollama" width="1084" height="317" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Interface-interractive-avec-Ollama.png"></p>
<p class="isSelectedEnd">La page officielle du modèle Mistral indique justement cette commande comme usage CLI pour l’exécuter avec Ollama. Après le chargement du modèle, le terminal affiche un prompt interactif. Vous pouvez alors saisir une demande en français, par exemple :</p>
<pre dir="ltr"><code dir="ltr">Réponds en français. Explique en 5 lignes ce qu’est un LLM open source.</code></pre>
<p><img class="aligncenter wp-image-29770 size-full"  alt="Faire une demande au modèle Mistral 3B via Ollama" width="1093" height="473" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Faire-une-demande-au-modele-Mistral-3B-via-Ollama.png"></p>
<p class="isSelectedEnd">Ollama génère ensuite une réponse directement dans le terminal, comme vous le voyez sur l&rsquo;image ci-haut. Pour quitter la session, utilisez :</p>
<pre dir="ltr"><code dir="ltr">/bye</code></pre>
<p class="isSelectedEnd">Cette première interaction permet de valider que le <strong>LLM local</strong> fonctionne réellement sur votre VPS. C’est aussi un bon moment pour ouvrir la supervision du <strong>Panel KVM LWS</strong> et observer la consommation CPU/RAM pendant la génération.</p>
<h3>3. Commandes de gestion essentielles</h3>
<p class="isSelectedEnd">Après vos premiers tests, quelques commandes permettent de gérer proprement vos <strong>modèles Ollama</strong> :</p>
<pre dir="ltr"><code dir="ltr">ollama list          # Lister les modèles installés et leur taille
ollama ps            # Voir les modèles actuellement chargés en mémoire
ollama pull phi3     # Télécharger un autre modèle sans le lancer
ollama rm mistral    # Supprimer un modèle pour libérer de l'espace disque
ollama stop mistral  # Décharger un modèle de la mémoire</code></pre>
<p><img class="aligncenter wp-image-29771 size-full"  alt="Gestion de commandes via Ollama ps" width="1083" height="400" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Gestion-de-commandes-via-Ollama-ps.png"></p>
<p class="isSelectedEnd">La documentation CLI officielle mentionne notamment <code dir="ltr">ollama pull</code>, <code dir="ltr">ollama rm</code> et <code dir="ltr">ollama ls</code> pour télécharger, supprimer et lister les modèles. La FAQ Ollama indique aussi que <code dir="ltr">ollama ps</code> sert à voir les modèles chargés en mémoire, avec une colonne permettant d’identifier si le modèle tourne côté CPU ou GPU. Sur un <strong>VPS KVM LWS CPU-only</strong>, vous devez donc vous attendre à une exécution en mémoire système.</p>
<p>Enfin, <code dir="ltr">ollama stop</code> permet de décharger un modèle de la mémoire lorsqu’il n’est plus nécessaire. C’est une bonne habitude sur un <strong>VPS Linux</strong> : elle évite de conserver inutilement un modèle en RAM et limite les risques de saturation lors d’autres tâches serveur.</p>
<h2>Utiliser l&rsquo;API REST locale d&rsquo;Ollama</h2>
<p class="isSelectedEnd">L’un des grands intérêts d’<strong>Ollama sur VPS</strong> est de ne pas limiter l’usage du modèle au terminal. Une fois le service installé, vous pouvez interroger votre <strong>LLM AI open source</strong> depuis une application, un script, un outil d’automatisation ou un service interne. Ollama documente une API locale servie par défaut sur <code dir="ltr">http://localhost:11434/api</code>, utilisable notamment avec <code dir="ltr">curl</code>.</p>
<p class="isSelectedEnd">Cette approche est pratique pour transformer votre <strong>VPS Linux</strong> en brique IA privée. Par exemple, un script Python peut envoyer un texte à résumer, une application métier peut générer une réponse automatique, ou un workflow n8n peut appeler le modèle pour classer des contenus. Dans tous les cas, l’appel reste local au VPS tant que vous utilisez <code dir="ltr">localhost</code>.</p>
<p class="isSelectedEnd">Le point important est de bien distinguer deux usages. D’un côté, l’API native Ollama, avec des endpoints comme <code dir="ltr">/api/generate</code> ou <code dir="ltr">/api/chat</code>. De l’autre, l’endpoint compatible OpenAI, qui permet d’adapter certains scripts déjà conçus pour l’écosystème OpenAI en changeant l’URL de base. Cette compatibilité est utile, mais elle doit toujours être testée avec la version d’Ollama installée avant une mise en production.</p>
<h3>1. Appel simple depuis le terminal</h3>
<p class="isSelectedEnd">Pour tester l’<strong>API REST locale d’Ollama</strong>, vous pouvez envoyer une requête simple vers <code dir="ltr">/api/generate</code>. La documentation officielle donne ce type d’appel comme exemple d’utilisation de l’API locale.</p>
<pre dir="ltr"><code dir="ltr">curl http://localhost:11434/api/generate \
  -d '{
    "model": "mistral",
    "prompt": "Explique le swap Linux en 3 phrases.",
    "stream": false
  }'</code></pre>
<p class="isSelectedEnd">Le paramètre <code dir="ltr">"model"</code> indique le modèle à utiliser. Il doit correspondre à un modèle déjà téléchargé avec <code dir="ltr">ollama pull</code>. Le paramètre <code dir="ltr">"prompt"</code> contient la demande envoyée au <strong>modèle IA local</strong>. Enfin, <code dir="ltr">"stream": false</code> demande à Ollama de retourner la réponse complète en une seule fois, ce qui simplifie la lecture dans le terminal ou dans un script.</p>
<p class="isSelectedEnd">Si le modèle n’est pas encore installé, Ollama ne pourra pas générer de réponse avec ce nom. Dans ce cas, vérifiez les modèles disponibles localement avec :</p>
<pre dir="ltr"><code dir="ltr">ollama list</code></pre>
<p class="isSelectedEnd">Ce premier appel API permet de confirmer que votre <strong>LLM local sans API cloud</strong> peut être utilisé autrement que via <code dir="ltr">ollama run</code>.</p>
<h3>2. Endpoint compatible OpenAI</h3>
<p class="isSelectedEnd">Ollama propose aussi une compatibilité avec plusieurs endpoints au format OpenAI, dont <code dir="ltr">/v1/chat/completions</code>. La documentation officielle indique que cet endpoint prend en charge les <strong>chat completions</strong>, le streaming, le mode JSON, les sorties reproductibles, la vision, les outils et certains paramètres de raisonnement selon les modèles utilisés.</p>
<p class="isSelectedEnd">Cette compatibilité permet d’adapter un script existant en remplaçant principalement l’URL de base par celle d’Ollama. Voici un exemple simple avec Python et la bibliothèque <code dir="ltr">requests</code> :</p>
<pre dir="ltr"><code dir="ltr">import requests

response = requests.post(
    "http://localhost:11434/v1/chat/completions",
    json={
        "model": "mistral",
        "messages": <span class="text-token-text-primary cursor-text rounded-sm" data-placeholder-token="true">[
            {
                "role": "user",
                "content": "Résume ce texte en 3 points : ..."
            }
        ]</span>,
        "stream": False
    },
    timeout=120
)

response.raise_for_status()
data = response.json()
print(data<span class="text-token-text-primary cursor-text rounded-sm" data-placeholder-token="true">["choices"]</span><span class="text-token-text-primary cursor-text rounded-sm" data-placeholder-token="true">[0]</span><span class="text-token-text-primary cursor-text rounded-sm" data-placeholder-token="true">["message"]</span><span class="text-token-text-primary cursor-text rounded-sm" data-placeholder-token="true">["content"]</span>)</code></pre>
<p class="isSelectedEnd">Dans cet exemple, l’application ne contacte pas une API externe : elle interroge votre <strong>VPS KVM LWS</strong> sur <code dir="ltr">localhost</code>. C’est précisément ce qui rend l’approche intéressante pour un projet qui traite des données sensibles ou qui veut éviter des coûts variables à chaque requête.</p>
<p class="isSelectedEnd">Avant de migrer un script complet, testez toujours les paramètres utilisés. Certains champs OpenAI peuvent ne pas se comporter exactement comme avec une API cloud, notamment selon le modèle, la version d’Ollama et les capacités activées. Pour un usage stable, commencez avec des requêtes simples, puis ajoutez progressivement le streaming, le mode JSON ou les outils si votre modèle les prend en charge.</p>
<h2>Sécuriser l&rsquo;accès à Ollama</h2>
<p class="isSelectedEnd">La sécurité est un point central lorsque vous installez une <strong>IA open source auto-hébergée</strong> sur un VPS. Par défaut, l’usage local d’Ollama ne nécessite pas d’authentification lorsqu’il est appelé depuis <code dir="ltr">http://localhost:11434</code>. La documentation officielle précise qu’aucune authentification n’est requise pour accéder localement à l’API Ollama via cette adresse.</p>
<p class="isSelectedEnd">Ce comportement est adapté à une installation initiale : votre <strong>API IA locale</strong> reste disponible pour les scripts exécutés sur le VPS, sans être exposée directement sur Internet. Il ne faut donc pas ouvrir le port <code dir="ltr">11434</code> publiquement sans protection. Un <strong>LLM local</strong> peut recevoir des prompts sensibles, consommer fortement le CPU et être détourné si l’accès est mal sécurisé.</p>
<p class="isSelectedEnd">Si vous devez accéder à Ollama depuis l’extérieur, évitez d’exposer directement le service avec une configuration trop permissive. Préférez un <strong>reverse proxy Nginx</strong> avec HTTPS, authentification, restrictions IP ou mécanisme de clé API côté application. Vous pouvez aussi limiter l’accès à un VPN ou à un tunnel sécurisé. L’objectif est simple : ne jamais laisser une API de génération IA accessible librement sur l’IP publique de votre VPS.</p>
<p class="isSelectedEnd">Pendant les tests, surveillez aussi la consommation de ressources depuis le <strong>Panel KVM LWS</strong>. Au moment de l&rsquo;interaction avec Ollama, nous avons effectivement constaté au pic comme le graphique ci-dessous :</p>
<p><img class="aligncenter wp-image-29772 size-full"  alt="Graphiques d'utilisation du VPS KVM LWS pendant l'interaction avec ollama" width="1058" height="886" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Graphiques-dutilisation-du-VPS-KVM-LWS-pendant-linterraction-avec-ollama.png"></p>
<p class="isSelectedEnd">Une génération longue peut utiliser fortement le CPU et augmenter la mémoire consommée. Cette supervision permet d’identifier rapidement un modèle trop lourd, une file de requêtes trop importante ou un risque de ralentissement général du serveur. Pour en savoir plus, découvrez comment <span style="font-weight: 400;"><a title="Nginx reverse proxy VPS : configuration complète 2026" href="https://tutoriels.lws.fr/vps/nginx-reverse-proxy-vps">sécuriser l&rsquo;accès à votre API Ollama derrière un reverse proxy Nginx</a>.</span></p>
<h2>Option avancée — Open WebUI : interface graphique pour Ollama</h2>
<p class="isSelectedEnd">L’utilisation d’<strong>Ollama en ligne de commande</strong> suffit pour tester un <strong>LLM AI open source</strong> ou l’intégrer dans un script. En revanche, si vous souhaitez offrir une interface plus simple à un utilisateur non technique, vous pouvez ajouter <strong>Open WebUI</strong>. Il s’agit d’une interface web auto-hébergée compatible avec Ollama et avec des API compatibles OpenAI. Le projet se présente comme une plateforme IA self-hosted, utilisable hors ligne, avec des fonctions comme la gestion de plusieurs modèles et le RAG.</p>
<p class="isSelectedEnd">La méthode Docker officielle expose l’interface sur le port <code dir="ltr">3000</code> du serveur, avec un volume persistant pour conserver les données de l’application. La documentation Open WebUI rappelle que le volume <code dir="ltr">open-webui:/app/backend/data</code> est important pour éviter la perte de données lors des redémarrages ou mises à jour.</p>
<pre dir="ltr"><code dir="ltr">docker pull ghcr.io/open-webui/open-webui:main

docker run -d \
  -p 3000:8080 \
  -v open-webui:/app/backend/data \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main</code></pre>
<p class="isSelectedEnd">Une fois le conteneur lancé, Open WebUI est disponible côté serveur sur le port <code dir="ltr">3000</code>. Si vous l’utilisez uniquement en local depuis le VPS, gardez l’accès restreint. Si vous souhaitez ouvrir l’interface depuis Internet, placez-la derrière un <strong>reverse proxy Nginx</strong>, activez le <strong>HTTPS</strong>, ajoutez une authentification et évitez toute exposition directe non protégée.</p>
<p class="isSelectedEnd">Attention également à la connexion entre Open WebUI et Ollama. Si Ollama tourne sur l’hôte Linux et Open WebUI dans un conteneur Docker, <code dir="ltr">localhost</code> ne désigne pas toujours le même environnement. La documentation Open WebUI signale que le conteneur peut ne pas atteindre Ollama sur <code dir="ltr">127.0.0.1:11434</code> et mentionne l’usage de <code dir="ltr">--network=host</code> comme solution dans certains cas, avec un port d’accès qui peut alors changer.</p>
<p class="isSelectedEnd">Pour une installation de production, évitez les tags trop mouvants si vous souhaitez stabiliser votre environnement. Open WebUI recommande de pouvoir épingler une version précise plutôt que d’utiliser uniquement un tag flottant comme <code dir="ltr">main</code>.</p>
<div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div>
<h2>Cas d&rsquo;usage concrets sur un VPS LWS</h2>
<p class="isSelectedEnd">Un <strong>LLM open source sur VPS</strong> devient intéressant dès que vous avez besoin d’automatiser des traitements IA tout en gardant la maîtrise du serveur :</p>
<ul>
<li class="isSelectedEnd">Le premier cas d’usage concerne les <strong>documents confidentiels</strong> : contrats, rapports internes, comptes rendus, cahiers des charges ou notes techniques. Plutôt que d’envoyer ces contenus vers une API externe, vous pouvez les traiter sur votre propre VPS, avec un modèle local adapté au volume et à la sensibilité des données.</li>
<li class="isSelectedEnd">Le deuxième cas d’usage est l’<strong>automatisation via API REST</strong>. Ollama peut être appelé depuis un script Python, une application Node.js, une tâche cron ou un outil d’automatisation. L’intérêt est de générer des résumés, classer des textes, reformuler des contenus, préparer des brouillons ou enrichir une base interne sans coût à chaque requête. Les intégrations n8n documentent d’ailleurs un nœud Ollama permettant d’utiliser un modèle local dans des workflows d’automatisation.</li>
<li class="isSelectedEnd">Troisième cas : <a title="WordPress 7.0 : connecter OpenAI, Claude et Gemini à son site" href="https://tutoriels.lws.fr/wordpress/wordpress-7-0-connecteurs-ia-openai-claude-gemini">connecter votre LLM local Ollama<strong> à</strong> WordPress<strong> 7.0</strong></a> dans une logique de provider IA local. Dans ce scénario, WordPress ou une extension métier peut déléguer certaines tâches à l’API Ollama hébergée sur le même VPS ou sur un VPS privé. L’avantage est de garder les appels IA dans une infrastructure maîtrisée, sans dépendre systématiquement d’une clé API externe.</li>
</ul>
<p class="isSelectedEnd">Enfin, un <strong>assistant de développement local</strong> peut être utile pour travailler sur du code propriétaire. Des outils comme Continue documentent l’usage de modèles auto-hébergés et expliquent que, lorsqu’une API est compatible OpenAI, il est souvent possible de configurer un provider OpenAI en changeant l’URL de base vers le serveur concerné. Pour un développeur, cela permet d’obtenir une assistance au codage, des explications ou des résumés sans envoyer automatiquement le code vers un service cloud tiers.</p>
<h2>Vérification du bon fonctionnement</h2>
<p class="isSelectedEnd">Après l’installation, le téléchargement du modèle et les premiers tests, prenez le temps de vérifier que votre <strong>IA open source auto-hébergée</strong> fonctionne correctement. Cette étape permet d’identifier rapidement une erreur de service, un modèle absent, une API inaccessible ou un problème de ressources.</p>
<p class="isSelectedEnd">Commencez par contrôler le service :</p>
<pre dir="ltr"><code dir="ltr">systemctl status ollama</code></pre>
<p class="isSelectedEnd">Le service doit être indiqué comme <strong>active (running)</strong>. Vérifiez ensuite que l’API répond localement :</p>
<pre dir="ltr"><code dir="ltr">curl http://localhost:11434/</code></pre>
<p class="isSelectedEnd">Le message attendu est :</p>
<pre dir="ltr"><code dir="ltr">Ollama is running</code></pre>
<p class="isSelectedEnd">Listez ensuite les modèles installés :</p>
<pre dir="ltr"><code dir="ltr">ollama list</code></pre>
<p class="isSelectedEnd">Vous devez retrouver le modèle téléchargé, par exemple <strong>Mistral</strong>, avec sa taille. Lancez enfin une session interactive :</p>
<pre dir="ltr"><code dir="ltr">ollama run mistral</code></pre>
<p class="isSelectedEnd">Posez une question simple en français et vérifiez que le modèle répond correctement. Pendant cette génération, ouvrez la supervision du <strong>Panel KVM LWS</strong>. Un pic CPU peut apparaître : c’est normal, car l’<strong>inférence CPU</strong> mobilise fortement les ressources pendant la génération. Si la RAM est saturée ou si le serveur devient difficile à utiliser, le modèle choisi est probablement trop lourd pour votre VPS.</p>
<h2>Erreurs fréquentes et cas de blocage</h2>
<p class="isSelectedEnd">L’installation d’un <strong>modèle IA local sur VPS</strong> reste accessible, mais certains blocages sont fréquents. La plupart proviennent d’un modèle trop volumineux, d’un mauvais nom de tag, d’un service arrêté ou d’une exposition réseau mal comprise.</p>
<table>
<tbody>
<tr>
<th>Erreur</th>
<th>Cause probable</th>
<th>Solution</th>
</tr>
<tr>
<td>
<blockquote><p><code dir="ltr">Error: model 'xxx' not found</code></p></blockquote>
</td>
<td>
<blockquote><p>Le nom du modèle ou le tag est incorrect.</p></blockquote>
</td>
<td>
<blockquote><p>Vérifiez le nom exact dans la bibliothèque Ollama, puis relancez <code dir="ltr">ollama pull &lt;nom-du-modele&gt;</code>.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>Le VPS devient très lent pendant l’inférence</p></blockquote>
</td>
<td>
<blockquote><p>Le modèle consomme trop de <strong>RAM</strong> ou monopolise le <strong>CPU</strong>.</p></blockquote>
</td>
<td>
<blockquote><p>Choisissez un modèle plus petit, déchargez le modèle avec <code dir="ltr">ollama stop</code>, ou augmentez les ressources du VPS.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>Erreur <code dir="ltr">out of memory</code> au lancement</p></blockquote>
</td>
<td>
<blockquote><p>La mémoire disponible est insuffisante pour le modèle choisi.</p></blockquote>
</td>
<td>
<blockquote><p>Passez à un modèle 3B/4B, fermez les services inutiles ou ajoutez du swap si votre stratégie serveur le permet.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>Réponses uniquement en anglais</p></blockquote>
</td>
<td>
<blockquote><p>Le modèle répond par défaut en anglais ou comprend mal la consigne.</p></blockquote>
</td>
<td>
<blockquote><p>Ajoutez au prompt : <code dir="ltr">Réponds en français.</code> ou testez un modèle plus adapté au français.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>Ollama ne démarre pas après redémarrage</p></blockquote>
</td>
<td>
<blockquote><p>Le service n’est pas lancé ou n’est pas activé au démarrage.</p></blockquote>
</td>
<td>
<blockquote><p>Lancez <code dir="ltr">systemctl restart ollama</code>, puis vérifiez avec <code dir="ltr">systemctl status ollama</code>.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>L’API REST ne répond pas</p></blockquote>
</td>
<td>
<blockquote><p>Le service est arrêté, le port local ne répond pas ou la requête cible le mauvais hôte.</p></blockquote>
</td>
<td>
<blockquote><p>Testez <code dir="ltr">curl http://localhost:11434/</code>, puis consultez l’état du service.</p></blockquote>
</td>
</tr>
<tr>
<td>
<blockquote><p>Open WebUI ne voit pas Ollama</p></blockquote>
</td>
<td>
<blockquote><p>Le conteneur Docker ne peut pas joindre Ollama sur l’hôte.</p></blockquote>
</td>
<td>
<blockquote><p>Vérifiez la configuration réseau Docker. Dans certains cas, l’option <code dir="ltr">--network=host</code> ou une URL d’hôte adaptée est nécessaire.</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p>En cas de doute, commencez toujours par revenir aux tests simples : service actif, API locale joignable, modèle visible avec <code dir="ltr">ollama list</code>, puis test interactif avec <code dir="ltr">ollama run</code>. Cette méthode évite de chercher trop vite un problème applicatif alors que la cause vient souvent d’un modèle absent ou d’un service non démarré. Et pour sécuriser votre instance, il faut <span style="font-weight: 400;"><a title="Swap VPS Linux : créer, configurer et optimiser la RAM" href="https://tutoriels.lws.fr/vps/swap-vps-linux-optimiser-ram">configurer le swap pour éviter les erreurs mémoire pendant l&rsquo;inférence</a>.</span></p>
<h2>Bonnes pratiques</h2>
<p class="isSelectedEnd">Une fois votre <strong>LLM AI open source</strong> installé sur le VPS, l’objectif est de conserver un environnement stable, sécurisé et facile à maintenir. La première bonne pratique consiste à surveiller régulièrement l’<strong>espace disque</strong>. Les modèles peuvent peser plusieurs gigaoctets chacun, et il est facile d’accumuler des versions inutilisées après plusieurs tests. Pour faire le point, utilisez :</p>
<pre dir="ltr"><code dir="ltr">ollama list</code></pre>
<p class="isSelectedEnd">Si un modèle n’est plus utile, supprimez-le proprement :</p>
<pre dir="ltr"><code dir="ltr">ollama rm nom-du-modele</code></pre>
<p class="isSelectedEnd">Surveillez aussi la <strong>mémoire RAM</strong> et la charge CPU depuis le <strong>Panel KVM LWS</strong>. Si le serveur utilise constamment le swap ou devient très lent pendant l’inférence, cela signifie généralement que le modèle est trop lourd pour les ressources disponibles. Dans ce cas, passez à un modèle plus petit avant d’envisager une montée en gamme.</p>
<p class="isSelectedEnd">Côté sécurité, ne publiez jamais le port <code dir="ltr">11434</code> directement sur l’IP publique de votre VPS. Ollama indique que l’API locale ne nécessite pas d’authentification lorsqu’elle est appelée depuis <code dir="ltr">http://localhost:11434</code>, ce qui est adapté à un usage local mais dangereux si le service est exposé sans protection. Pour un accès externe, privilégiez un <strong>reverse proxy Nginx</strong>, le <strong>HTTPS</strong>, une authentification et, si possible, des restrictions IP.</p>
<p class="isSelectedEnd">Avant de tester un nouveau modèle volumineux, créez un <strong>snapshot LWS</strong>. Cette précaution permet de revenir rapidement à un état stable si le téléchargement remplit le disque, si une dépendance pose problème ou si la configuration doit être annulée.</p>
<p class="isSelectedEnd">Enfin, vérifiez régulièrement votre version d’Ollama :</p>
<pre dir="ltr"><code dir="ltr">ollama --version</code></pre>
<p class="isSelectedEnd">Les outils IA évoluent vite. Des mises à jour peuvent améliorer la compatibilité des modèles, la stabilité de l’API ou les performances d’<strong>inférence CPU</strong>. Pour un usage de production, évitez toutefois de modifier votre environnement sans test préalable.</p>
<p class="isSelectedEnd"><div class="alert_tips"><p class="title">Trucs et astuces</p><hr><p></p>
<p class="isSelectedEnd">Hébergez votre <strong>IA privée open source</strong> sur un <strong>VPS KVM LWS</strong> : accès root complet, stockage SSD NVMe, supervision CPU/RAM, snapshots, sauvegardes automatiques et support francophone. C’est une base adaptée pour déployer <strong>Ollama</strong>, tester des modèles locaux et garder la maîtrise de vos données.</p>
<p class="isSelectedEnd"><a href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Découvrir le VPS KVM LWS pour héberger votre IA privée open source</a></p>
<p class="isSelectedEnd"></p></div></p>
<h2>FAQ</h2>
<p class="isSelectedEnd"><strong>Peut-on faire tourner un LLM open source sur un VPS sans GPU ?</strong><br />
Oui, il est possible de faire tourner un <strong>LLM open source</strong> sur un <strong>VPS sans GPU</strong>, mais avec des performances plus modestes qu’une infrastructure équipée d’une carte graphique. Sur un VPS CPU-only, il faut privilégier des modèles légers, par exemple des modèles 3B, 4B, 7B ou 8B selon la RAM disponible.</p>
<p class="isSelectedEnd"><strong>Quelle est la différence entre Ollama et une API IA comme OpenAI ?</strong><br />
Une API IA cloud est hébergée par un fournisseur externe et facturée selon l’usage ou l’abonnement. <strong>Ollama</strong>, lui, exécute le modèle localement sur votre serveur. Vous gardez la maîtrise de l’environnement, mais vous devez gérer les ressources, les mises à jour, la sécurité et les modèles installés.</p>
<p class="isSelectedEnd"><strong>Quels modèles Ollama fonctionnent sur un VPS avec 8 Go de RAM ?</strong><br />
Avec <strong>8 Go de RAM</strong>, il est préférable de commencer par des modèles compacts comme <strong>Phi-3 Mini</strong>, <strong>Gemma 3 4B</strong> ou d’autres modèles de petite taille disponibles dans la bibliothèque Ollama. Les modèles 7B ou 8B peuvent être trop lourds selon les autres services actifs sur le VPS.</p>
<p class="isSelectedEnd"><strong>Ollama expose-t-il l’IA publiquement sur Internet par défaut ?</strong><br />
Non. Ollama documente une API locale accessible par défaut sur <code dir="ltr">http://localhost:11434/api</code>, ce qui signifie qu’elle répond depuis la machine locale. La FAQ Ollama précise également que le service se lie par défaut à <code dir="ltr">127.0.0.1</code> sur le port <code dir="ltr">11434</code>.</p>
<p class="isSelectedEnd"><strong>Comment connecter Ollama à une interface graphique sur mon VPS ?</strong><br />
Vous pouvez installer une interface comme <strong>Open WebUI</strong>, qui fournit une interface web compatible avec Ollama. Pour un accès depuis Internet, il faut impérativement sécuriser l’interface avec HTTPS, authentification et reverse proxy.</p>
<p><strong>L’utilisation d’Ollama sur VPS est-elle conforme au RGPD ?</strong><br />
Ollama peut aider à limiter les transferts de données vers des services IA externes, car les prompts et réponses restent sur votre infrastructure si tout est configuré localement. Cela ne garantit pas automatiquement la conformité RGPD : vous devez aussi sécuriser le VPS, gérer les accès, documenter les traitements et respecter les obligations applicables aux données personnelles.</p>
<h2>Conclusion</h2>
<p>Déployer un <strong>LLM AI open source sur un VPS</strong> permet de créer une solution d’<strong>IA auto-hébergée</strong>, utile pour réduire la dépendance aux API cloud, mieux maîtriser les données et expérimenter des traitements IA sans coût à chaque requête. Avec <strong>Ollama</strong>, l’installation reste accessible : un service local, quelques commandes, un modèle adapté aux ressources du serveur et une API REST exploitable dans vos scripts ou applications. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />La clé est de rester réaliste : sur un <strong>VPS sans GPU</strong>, privilégiez les modèles légers, surveillez la RAM, gardez le port <code dir="ltr">11434</code> privé et sécurisez tout accès externe.</p>
<div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div>
<p><em>Pour héberger ce type d’environnement, un <strong>VPS KVM LWS</strong> offre l’accès root, la supervision, les snapshots et les ressources nécessaires pour tester puis exploiter votre propre <strong>modèle IA local</strong>. Et si vous avez des questions, des ajouts ou des suggestions, n&rsquo;hésitez pas à nous écrire dans la section Commentaires.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/llm-ai-open-source-vps/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29763</post-id>	</item>
		<item>
		<title>Swap VPS Linux : comment créer, configurer et optimiser la mémoire en 2026</title>
		<link>https://tutoriels.lws.fr/vps/swap-vps-linux-optimiser-ram</link>
					<comments>https://tutoriels.lws.fr/vps/swap-vps-linux-optimiser-ram#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Sat, 04 Jul 2026 12:16:54 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=29666</guid>

					<description><![CDATA[Un VPS Linux peut rapidement devenir instable lorsque sa mémoire RAM est trop sollicitée. Le problème se manifeste souvent par des ralentissements, des services qui ne répondent plus, des applications qui s’arrêtent sans raison apparente ou des processus tués automatiquement par le noyau. ⚡Dans les journaux système, ce type d’incident est souvent associé à une &#8230; <a href="https://tutoriels.lws.fr/vps/swap-vps-linux-optimiser-ram" class="more-link">Continue reading <span class="screen-reader-text">Swap VPS Linux : comment créer, configurer et optimiser la mémoire en 2026</span></a>]]></description>
										<content:encoded><![CDATA[<p class="PDq2pG_selectionAnchorContainer" data-start="93" data-end="620">Un <strong data-start="96" data-end="109">VPS Linux</strong> peut rapidement devenir instable lorsque sa <strong data-start="154" data-end="169">mémoire RAM</strong> est trop sollicitée. Le problème se manifeste souvent par des ralentissements, des services qui ne répondent plus, des applications qui s’arrêtent sans raison apparente ou des processus tués automatiquement par le noyau. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />Dans les journaux système, ce type d’incident est souvent associé à une <strong data-start="463" data-end="477">erreur OOM</strong>, pour <em data-start="484" data-end="499">Out of Memory</em>. Cela signifie que le serveur n’a plus assez de mémoire disponible pour continuer à exécuter correctement ses processus.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p data-start="622" data-end="965">En vérifiant l’état du serveur avec la commande <code data-start="670" data-end="679">free -h</code>, on constate parfois qu’aucun <strong data-start="710" data-end="718">swap</strong> n’est configuré. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" />Dans d’autres cas, le <strong data-start="758" data-end="776">swap VPS Linux</strong> existe déjà, mais il est utilisé en permanence alors que de la RAM semble encore disponible. Cette situation indique souvent une configuration mémoire inadaptée à un serveur en production. Bien configuré, le <strong data-start="986" data-end="1000">swap Linux</strong> permet d’absorber certains pics de charge et de limiter les interruptions brutales.</p>
<h2 data-section-id="1fbt9uu" data-start="1086" data-end="1109">Objectif</h2>
<p data-start="1111" data-end="1480"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’objectif de ce tutoriel est de vous montrer comment <strong data-start="1165" data-end="1207">créer un fichier swap sur un VPS Linux</strong>, l’activer correctement, puis le rendre <strong data-start="1248" data-end="1280">persistant après redémarrage</strong>. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />La procédure présentée s’adresse principalement aux serveurs sous <strong data-start="1348" data-end="1358">Debian</strong> et <strong data-start="1362" data-end="1372">Ubuntu</strong>, deux distributions très utilisées pour l’hébergement de sites web, d’applications ou de services en ligne. Nous verrons comment créer le <strong data-start="1512" data-end="1528">fichier swap</strong> avec <code data-start="1534" data-end="1545">fallocate</code>, comment le sécuriser avec les bonnes permissions, puis comment l’activer avec <code data-start="1625" data-end="1633">mkswap</code> et <code data-start="1637" data-end="1645">swapon</code>. Vous apprendrez aussi à modifier le fichier <code data-start="1691" data-end="1703">/etc/fstab</code> afin que le <strong data-start="1716" data-end="1724">swap</strong> reste actif après chaque redémarrage du VPS.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Enfin, nous aborderons l’optimisation de deux paramètres importants du noyau Linux : <strong data-start="1856" data-end="1873">vm.swappiness</strong> et <strong data-start="1877" data-end="1902">vm.vfs_cache_pressure</strong>. Ces réglages permettent de mieux contrôler l’utilisation du swap et d’adapter le comportement mémoire à un <strong data-start="2011" data-end="2026">serveur VPS</strong> en production.</p>
<h2 data-section-id="2gncjr" data-start="2043" data-end="2055">Pré-requis</h2>
<p data-start="2057" data-end="2438">Avant de suivre ce guide, vous devez :</p>
<ul>
<li data-start="2057" data-end="2438">disposer d’un <strong data-start="2108" data-end="2121">VPS Linux</strong> sous <strong data-start="2127" data-end="2143">Debian 11/12</strong> ou <strong data-start="2147" data-end="2169">Ubuntu 22.04/24.04</strong>, avec un accès <strong data-start="2185" data-end="2197">SSH root</strong> ou un utilisateur autorisé à utiliser <code data-start="2236" data-end="2242">sudo</code>. Sur un <strong data-start="2251" data-end="2266">VPS KVM LWS</strong>, les identifiants de connexion sont généralement transmis dans l’email de confirmation de commande, ce qui permet d’administrer rapidement le serveur en ligne de commande,</li>
<li data-start="2057" data-end="2438">connaître les bases de la <strong data-start="2487" data-end="2514">ligne de commande Linux</strong> : vous connecter en SSH, exécuter une commande, lire un résultat dans le terminal et modifier un fichier avec un éditeur comme <code data-start="2642" data-end="2648">nano</code>,</li>
<li data-start="2057" data-end="2438">Aucune compétence avancée en administration système n’est nécessaire, mais chaque commande doit être exécutée avec attention, notamment lors de la modification de fichiers système comme <code data-start="2836" data-end="2848">/etc/fstab</code>,</li>
<li data-start="2057" data-end="2438">vérifier l’<strong data-start="2892" data-end="2920">espace disque disponible</strong> avant de créer un <strong data-start="2939" data-end="2955">fichier swap</strong>.</li>
</ul>
<h2 data-section-id="1w7m5co" data-start="3458" data-end="3511">Comprendre le swap Linux : ce que c&rsquo;est réellement</h2>
<p data-start="3513" data-end="3796">Le <strong data-start="3516" data-end="3530">swap Linux</strong> est un espace situé sur le disque que le noyau peut utiliser lorsque la <strong data-start="3603" data-end="3618">mémoire RAM</strong> disponible devient insuffisante. Concrètement, Linux déplace certaines pages mémoire peu utilisées vers le <strong data-start="3726" data-end="3734">swap</strong> afin de libérer de la RAM pour les processus les plus actifs.</p>
<p data-start="3798" data-end="4287">Sur un <strong data-start="3805" data-end="3818">VPS Linux</strong>, ce mécanisme peut éviter qu’un service soit interrompu brutalement lors d’un pic de consommation mémoire. Par exemple, un site <strong data-start="3947" data-end="3960">WordPress</strong>, une application <strong data-start="3978" data-end="3989">Node.js</strong>, un processus <strong data-start="4004" data-end="4015">PHP-FPM</strong> ou une base de données peuvent consommer plus de RAM que prévu pendant une mise à jour, un trafic important ou une tâche lourde. Sans <strong data-start="4150" data-end="4166">fichier swap</strong>, le noyau Linux peut alors tuer un processus pour protéger le système. C’est ce qui provoque souvent une <strong data-start="4272" data-end="4286">erreur OOM</strong>.</p>
<p data-start="4289" data-end="4615">Le swap agit donc comme une réserve de secours. Il donne au système une marge supplémentaire lorsque la RAM physique arrive à saturation. Cette marge peut suffire à stabiliser un serveur pendant un pic ponctuel, à éviter l’arrêt d’un service critique ou à laisser le temps à l’administrateur d’identifier la cause du problème.</p>
<p data-start="4617" data-end="4965">Il ne faut cependant pas confondre <strong data-start="4652" data-end="4660">swap</strong> et <strong data-start="4664" data-end="4680">RAM physique</strong>. La RAM est conçue pour des accès extrêmement rapides, tandis que le swap repose sur le disque. Même avec un disque <strong data-start="4797" data-end="4809">SSD NVMe</strong>, le swap reste beaucoup plus lent. Un serveur qui utilise constamment son swap n’est donc pas réellement optimisé : il manque probablement de mémoire vive.</p>
<p data-start="4967" data-end="5274">Dans le cadre d’un <strong data-start="4986" data-end="5004">swap VPS Linux</strong>, l’objectif n’est pas de transformer le disque en RAM, mais de réduire les risques de crash lors de pics temporaires. Si le swap est sollicité en permanence, il faut envisager une optimisation applicative ou une montée en gamme vers un VPS disposant de plus de <strong data-start="5266" data-end="5273">RAM</strong>.</p>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="1bs769t" data-start="0" data-end="33">Deux formes de swap sous Linux</h2>
<p data-start="35" data-end="440">Sous Linux, le <strong data-start="50" data-end="58">swap</strong> peut être configuré de deux manières principales : sous forme de <strong data-start="124" data-end="140">fichier swap</strong> ou sous forme de <strong data-start="158" data-end="176">partition swap</strong>. Les deux méthodes poursuivent le même objectif : fournir au système un espace disque utilisable lorsque la <strong data-start="285" data-end="292">RAM</strong> disponible devient insuffisante. En revanche, elles ne présentent pas la même souplesse, surtout dans le contexte d’un <strong data-start="412" data-end="425">VPS Linux</strong> déjà installé.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="442" data-end="750">
<thead data-start="442" data-end="493">
<tr data-start="442" data-end="493">
<th class="last:pe-10" data-start="442" data-end="457" data-col-size="sm">Type de swap</th>
<th class="last:pe-10" data-start="457" data-end="471" data-col-size="md">Description</th>
<th class="last:pe-10" data-start="471" data-end="493" data-col-size="md">Recommandé sur VPS</th>
</tr>
</thead>
<tbody data-start="508" data-end="750">
<tr data-start="508" data-end="634">
<td data-start="508" data-end="527" data-col-size="sm">
<blockquote><p><strong data-start="510" data-end="526">Fichier swap</strong></p></blockquote>
</td>
<td data-start="527" data-end="584" data-col-size="md">
<blockquote><p>Fichier dédié créé sur le système de fichiers existant</p></blockquote>
</td>
<td data-start="584" data-end="634" data-col-size="md">
<blockquote><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Oui — flexible, simple à créer et à modifier</p></blockquote>
</td>
</tr>
<tr data-start="635" data-end="750">
<td data-start="635" data-end="656" data-col-size="sm">
<blockquote><p><strong data-start="637" data-end="655">Partition swap</strong></p></blockquote>
</td>
<td data-start="656" data-end="704" data-col-size="md">
<blockquote><p>Partition disque dédiée exclusivement au swap</p></blockquote>
</td>
<td data-start="704" data-end="750" data-col-size="md">
<blockquote><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b1c.png" alt="⬜" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Peu pratique sur un VPS déjà partitionné</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="752" data-end="1113">Sur un <strong data-start="759" data-end="774">VPS KVM LWS</strong>, la méthode la plus adaptée est généralement le <strong data-start="823" data-end="839">fichier swap</strong>. Elle ne nécessite pas de repartitionner le disque, ne demande pas de réinstallation du système et peut être ajustée plus facilement si vos besoins évoluent. Vous pouvez créer un fichier de 2 Go, le remplacer plus tard par un fichier de 4 Go, ou le supprimer si nécessaire.</p>
<p data-start="1115" data-end="1468">La <strong data-start="1118" data-end="1136">partition swap</strong>, elle, est plutôt prévue au moment de l’installation initiale d’un système. Sur un serveur déjà en production, la modifier peut être plus risqué, car cela touche à la structure du disque. Pour un administrateur VPS qui souhaite une solution rapide, propre et réversible, le <strong data-start="1411" data-end="1433">fichier swap Linux</strong> est donc la méthode à privilégier.</p>
<h2 data-section-id="zxzffb" data-start="1470" data-end="1497">Ce que le swap n&rsquo;est pas</h2>
<p data-start="1499" data-end="1935">Le <strong data-start="1502" data-end="1520">swap VPS Linux</strong> est utile, mais il ne doit pas être mal interprété. Il ne s’agit pas d’un remplacement de la <strong data-start="1614" data-end="1630">RAM physique</strong>. La RAM reste beaucoup plus rapide que le disque, même lorsque le VPS utilise un stockage <strong data-start="1721" data-end="1733">SSD NVMe</strong>. Lorsqu’un serveur commence à utiliser intensivement son swap, les performances peuvent donc se dégrader : les pages mémoire doivent être lues et écrites sur le disque, ce qui ralentit les traitements.</p>
<p data-start="1937" data-end="2314">Le swap n’est pas non plus une solution durable à un manque chronique de mémoire. Si votre serveur utilise constamment son <strong data-start="2060" data-end="2076">fichier swap</strong>, cela signifie souvent que les applications installées consomment plus de <strong data-start="2151" data-end="2158">RAM</strong> que le VPS ne peut en fournir. Dans ce cas, il faut analyser les processus actifs, optimiser les services ou envisager une offre avec davantage de mémoire.</p>
<p data-start="2316" data-end="2593">Enfin, le swap ne protège pas absolument contre toutes les <strong data-start="2375" data-end="2390">erreurs OOM</strong>. Il réduit les risques lors de pics ponctuels, mais il ne peut pas compenser une saturation permanente. Il doit être vu comme un <strong data-start="2520" data-end="2549">filet de sécurité mémoire</strong>, pas comme une extension magique de la RAM.</p>
<p data-start="2595" data-end="2886">Une bonne configuration consiste donc à créer un swap raisonnable, à ajuster <strong data-start="2672" data-end="2689">vm.swappiness</strong>, puis à surveiller régulièrement la mémoire. Si le swap reste fortement utilisé pendant plusieurs jours, le vrai problème n’est probablement pas la configuration : c’est le dimensionnement du VPS.</p>
<h2 data-section-id="1hzbydt" data-start="2888" data-end="2938">Vérifier l&rsquo;état actuel de la mémoire et du swap</h2>
<p data-start="2940" data-end="3269">Avant de <strong data-start="2949" data-end="2974">créer un fichier swap</strong>, il faut toujours commencer par vérifier l’état actuel de la <strong data-start="3036" data-end="3051">mémoire RAM</strong>, du <strong data-start="3056" data-end="3064">swap</strong> et de l’espace disque disponible. Cette étape permet d’éviter deux erreurs fréquentes : créer un swap inutile alors qu’il existe déjà, ou créer un fichier trop volumineux sur une partition presque pleine.</p>
<p data-start="3271" data-end="3358">Sur un <strong data-start="3278" data-end="3291">VPS Linux</strong>, le diagnostic repose principalement sur trois commandes simples :</p>
<ul data-start="3360" data-end="3568">
<li data-section-id="1lo497j" data-start="3360" data-end="3430"><code data-start="3362" data-end="3371">free -h</code> pour afficher l’utilisation de la <strong data-start="3406" data-end="3413">RAM</strong> et du <strong data-start="3420" data-end="3428">swap</strong> ;</li>
<li data-section-id="3plaen" data-start="3431" data-end="3485"><code data-start="3433" data-end="3448">swapon --show</code> pour vérifier si un swap est actif ;</li>
<li data-section-id="devffb" data-start="3486" data-end="3568"><code data-start="3488" data-end="3497">df -h /</code> pour contrôler l’espace disque disponible sur la partition principale.</li>
</ul>
<p data-start="3570" data-end="3806">Ces commandes doivent être exécutées en SSH, avec un utilisateur disposant des droits nécessaires. Elles ne modifient rien sur le serveur : elles servent uniquement à observer l’état actuel du système avant de passer à la configuration.</p>
<h3 data-section-id="1etwgxt" data-start="3808" data-end="3860">1. Afficher l&rsquo;utilisation de la RAM et du swap</h3>
<p data-start="3862" data-end="4023">La première commande à utiliser est <code data-start="3898" data-end="3907">free -h</code>. Elle affiche l’état de la <strong data-start="3935" data-end="3950">mémoire RAM</strong> et du <strong data-start="3957" data-end="3965">swap</strong> dans un format lisible, avec des unités comme MiB ou GiB.</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>free <span class="ͼ12">-h</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4046" data-end="4114">Exemple de sortie typique sur un <strong data-start="4079" data-end="4112">VPS Linux sans swap configuré</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>               total        used        free      shared  buff/cache   available
Mem:           <span class="ͼy">1</span>.9Gi       856Mi       124Mi        12Mi       982Mi       852Mi
Swap:             0B          0B          0B</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div><img class="aligncenter size-full wp-image-29672"  alt="Vérifier l'état du swap sur un VPS KVM LWS" width="1005" height="833" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/verifier-letat-du-swap-sur-un-VPS-KVM-LWS.webp"></div>
<div class="">Dans cet exemple, la ligne <strong data-start="4363" data-end="4371">Swap</strong> affiche <code data-start="4380" data-end="4384">0B</code>. Cela signifie qu’aucun <strong data-start="4409" data-end="4417">swap</strong> n’est disponible sur le serveur. Si la <strong data-start="4457" data-end="4464">RAM</strong> vient à manquer, le noyau Linux n’aura donc pas d’espace de secours sur le disque. Le risque d’<strong data-start="4560" data-end="4574">erreur OOM</strong> est alors plus élevé en cas de pic de charge.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4622" data-end="4975">Il faut aussi bien interpréter les colonnes de la ligne <strong data-start="4678" data-end="4685">Mem</strong>. La colonne <code data-start="4698" data-end="4704">free</code> indique uniquement la mémoire totalement libre, mais ce n’est pas toujours la valeur la plus importante. Sous Linux, une partie de la RAM est utilisée comme cache disque afin d’améliorer les performances. Cette mémoire peut être récupérée si une application en a besoin.</p>
<p data-start="4977" data-end="5277">La colonne la plus utile est donc souvent <strong data-start="5019" data-end="5032">available</strong>. Elle indique la mémoire réellement disponible pour de nouveaux processus, en tenant compte de la mémoire libre et du cache récupérable. Une valeur <code data-start="5181" data-end="5187">free</code> faible n’est donc pas forcément inquiétante si la valeur <strong data-start="5245" data-end="5258">available</strong> reste confortable.</p>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="icmtn4" data-start="0" data-end="47">2. Vérifier si un swap est déjà configuré</h3>
<p data-start="49" data-end="246">Après avoir consulté l’état global de la mémoire avec <code data-start="103" data-end="112">free -h</code>, il est utile de vérifier plus précisément si un <strong data-start="162" data-end="176">swap Linux</strong> est déjà actif sur le VPS. Pour cela, utilisez la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon <span class="ͼ12">--show</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="275" data-end="417"><img class="aligncenter size-full wp-image-29671"  alt="Vérifier si un swap est déjà configuré" width="1006" height="820" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Executer-la-commande-swapon.webp"></p>
<p data-start="275" data-end="417">Si aucun résultat ne s’affiche, cela signifie qu’aucun <strong data-start="330" data-end="346">fichier swap</strong> ni aucune <strong data-start="357" data-end="375">partition swap</strong> n’est actuellement activé sur le serveur.</p>
<p data-start="419" data-end="445">Exemple de résultat vide :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon <span class="ͼ12">--show</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="474" data-end="655">Dans ce cas, la commande revient simplement à la ligne suivante sans afficher de tableau. C’est le comportement attendu lorsque le <strong data-start="605" data-end="618">VPS Linux</strong> ne dispose pas encore de swap actif.</p>
<p data-start="657" data-end="850">Si un swap est configuré, la commande affiche généralement plusieurs informations : le chemin du fichier ou de la partition, le type de swap, sa taille, son niveau d’utilisation et sa priorité.</p>
<p data-start="852" data-end="861">Exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   <span class="ͼ12">-2</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Ici, le serveur dispose d’un <strong data-start="965" data-end="981">fichier swap</strong> nommé <code data-start="988" data-end="999">/swapfile</code>, avec une taille de <strong data-start="1020" data-end="1028">2 Go</strong>. La colonne <code data-start="1041" data-end="1047">USED</code> indique la quantité actuellement utilisée. Si cette valeur augmente régulièrement, il faudra surveiller le comportement mémoire du VPS, car un <strong data-start="1191" data-end="1221">swap utilisé en permanence</strong> peut révéler un manque de <strong data-start="1248" data-end="1255">RAM</strong>.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h3 data-section-id="vi90yq" data-start="1258" data-end="1325">3. Vérifier l&rsquo;espace disque disponible avant de créer le swap</h3>
<p data-start="1327" data-end="1682">Avant de <strong data-start="1336" data-end="1361">créer un fichier swap</strong>, vous devez vérifier que la partition principale dispose de suffisamment d’<strong data-start="1437" data-end="1460">espace disque libre</strong>. Un fichier swap occupe réellement de l’espace sur le disque. Par exemple, un swap de <strong data-start="1547" data-end="1555">2 Go</strong> réduit d’autant l’espace disponible pour le système, les sites web, les bases de données, les logs et les sauvegardes locales.</p>
<p data-start="1684" data-end="1754">Pour contrôler l’espace disponible sur la partition racine, utilisez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>df <span class="ͼ12">-h</span> /</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1777" data-end="1796">Exemple de sortie :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   12G   26G  <span class="ͼy">32</span>% /</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div><img class="aligncenter size-full wp-image-29670"  alt="Vérifier l'espace disque disponible avant de créer le swap" width="1000" height="825" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Executer-la-commande-df.webp"></div>
<div class="">Dans cet exemple, la colonne <code data-start="1929" data-end="1936">Avail</code> indique qu’il reste <strong data-start="1957" data-end="1978">26 Go disponibles</strong> sur la partition <code data-start="1996" data-end="1999">/</code>. Il est donc possible de créer un <strong data-start="2034" data-end="2050">fichier swap</strong> de 2 Go sans risque immédiat.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2082" data-end="2381">En revanche, si la partition est déjà utilisée à plus de <strong data-start="2139" data-end="2155">85 % ou 90 %</strong>, évitez de créer un swap volumineux sans nettoyage préalable. Un disque saturé peut provoquer d’autres problèmes : impossibilité d’écrire des logs, erreurs applicatives, échec des mises à jour ou blocage de certains services.</p>
<p data-start="2082" data-end="2381"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="1ohcvni" data-start="2520" data-end="2544">Créer un fichier swap</h2>
<p data-start="2546" data-end="2792">Une fois l’état de la <strong data-start="2568" data-end="2575">RAM</strong>, du <strong data-start="2580" data-end="2588">swap</strong> et du disque vérifié, vous pouvez passer à la création du <strong data-start="2647" data-end="2663">fichier swap</strong>. Cette méthode est particulièrement adaptée à un <strong data-start="2713" data-end="2726">VPS Linux</strong>, car elle ne nécessite pas de modifier les partitions existantes.</p>
<p data-start="2794" data-end="3025">Le principe est simple : vous créez un fichier dédié, vous limitez ses permissions, vous le formatez comme espace de swap, puis vous l’activez. Ensuite, vous pourrez le rendre persistant au redémarrage dans le fichier <code data-start="3012" data-end="3024">/etc/fstab</code>.</p>
<p data-start="3027" data-end="3305">Dans ce guide, nous allons créer un fichier nommé <code data-start="3077" data-end="3088">/swapfile</code>. C’est un nom courant, simple à identifier et facile à maintenir. Vous pouvez choisir un autre chemin, mais il est conseillé de rester sur une convention claire pour éviter les erreurs lors des futures interventions.</p>
<h3 data-section-id="1ywzalp" data-start="3307" data-end="3347">1. Créer le fichier avec fallocate</h3>
<p data-start="3349" data-end="3526">La méthode la plus simple pour créer un <strong data-start="3389" data-end="3411">fichier swap Linux</strong> consiste à utiliser la commande <code data-start="3444" data-end="3455">fallocate</code>. Elle permet de réserver rapidement un fichier de la taille souhaitée.</p>
<p data-start="3528" data-end="3570">Pour créer un <strong data-start="3542" data-end="3558">swap de 2 Go</strong>, exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> fallocate <span class="ͼ12">-l</span> 2G /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3616" data-end="3748"><img class="aligncenter size-full wp-image-29675"  alt="créer le fichier swap" width="1012" height="332" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/creer-le-fichier-swap.webp"></p>
<p data-start="3616" data-end="3748">Cette commande crée un fichier nommé <code data-start="3653" data-end="3664">/swapfile</code> à la racine du système. L’option <code data-start="3698" data-end="3705">-l 2G</code> indique la taille souhaitée, ici <strong data-start="3739" data-end="3747">2 Go</strong>.</p>
<p data-start="3750" data-end="3808">Vous pouvez vérifier que le fichier a bien été créé avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3840" data-end="3861"><img class="aligncenter size-full wp-image-29674"  alt="Afficher le fichier swap" width="1007" height="327" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Afficher-le-fichier-swap.webp"></p>
<p data-start="3840" data-end="3861">Exemple de résultat :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ12">-rw-r--r--</span> <span class="ͼy">1</span> root root <span class="ͼy">2</span>.0G Jun <span class="ͼy">10</span> <span class="ͼy">14</span>:22 /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3927" data-end="4073">À ce stade, le fichier existe, mais il n’est pas encore sécurisé, formaté ni activé comme <strong data-start="4017" data-end="4025">swap</strong>. Les étapes suivantes sont donc indispensables.</p>
<p data-start="4075" data-end="4200">Si <code data-start="4078" data-end="4089">fallocate</code> n’est pas disponible ou si le système de fichiers ne le prend pas en charge, utilisez <code data-start="4176" data-end="4180">dd</code> comme alternative :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> dd <span class="ͼ11">if</span><span class="ͼv">=</span>/dev/zero <span class="ͼ11">of</span><span class="ͼv">=</span>/swapfile <span class="ͼ11">bs</span><span class="ͼv">=</span><span class="ͼy">1024</span> <span class="ͼ11">count</span><span class="ͼv">=</span><span class="ͼy">2097152</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Cette commande crée également un fichier de <strong data-start="4315" data-end="4323">2 Go</strong>, mais elle est généralement plus lente que <code data-start="4367" data-end="4378">fallocate</code>, car elle écrit réellement des blocs de zéros dans le fichier.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h4 data-section-id="1ae09cx" data-start="4443" data-end="4470">Quelle taille choisir ?</h4>
<p data-start="4472" data-end="4755">La taille idéale du <strong data-start="4492" data-end="4510">swap VPS Linux</strong> dépend de la quantité de <strong data-start="4536" data-end="4552">RAM physique</strong>, du type d’applications hébergées et du niveau de sécurité souhaité contre les pics mémoire. Il n’existe pas de règle universelle, mais les repères suivants conviennent à de nombreux usages sur serveur.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="4757" data-end="5233">
<thead data-start="4757" data-end="4811">
<tr data-start="4757" data-end="4811">
<th class="last:pe-10" data-start="4757" data-end="4770" data-col-size="sm">RAM du VPS</th>
<th class="last:pe-10" data-start="4770" data-end="4799" data-col-size="sm">Taille de swap recommandée</th>
<th class="last:pe-10" data-start="4799" data-end="4811" data-col-size="md">Contexte</th>
</tr>
</thead>
<tbody data-start="4827" data-end="5233">
<tr data-start="4827" data-end="4915">
<td data-start="4827" data-end="4838" data-col-size="sm">
<blockquote><p><strong data-start="4829" data-end="4837">1 Go</strong></p></blockquote>
</td>
<td data-start="4838" data-end="4849" data-col-size="sm">
<blockquote><p><strong data-start="4840" data-end="4848">2 Go</strong></p></blockquote>
</td>
<td data-start="4849" data-end="4915" data-col-size="md">
<blockquote><p>Protection contre les <strong data-start="4873" data-end="4888">erreurs OOM</strong> sur un serveur web léger</p></blockquote>
</td>
</tr>
<tr data-start="4916" data-end="5027">
<td data-start="4916" data-end="4927" data-col-size="sm">
<blockquote><p><strong data-start="4918" data-end="4926">2 Go</strong></p></blockquote>
</td>
<td data-start="4927" data-end="4942" data-col-size="sm">
<blockquote><p><strong data-start="4929" data-end="4941">2 à 4 Go</strong></p></blockquote>
</td>
<td data-start="4942" data-end="5027" data-col-size="md">
<blockquote><p><strong data-start="4944" data-end="4957">WordPress</strong>, <strong data-start="4959" data-end="4970">PHP-FPM</strong>, applications <strong data-start="4985" data-end="4996">Node.js</strong>, petits services applicatifs</p></blockquote>
</td>
</tr>
<tr data-start="5028" data-end="5134">
<td data-start="5028" data-end="5039" data-col-size="sm">
<blockquote><p><strong data-start="5030" data-end="5038">4 Go</strong></p></blockquote>
</td>
<td data-start="5039" data-end="5050" data-col-size="sm">
<blockquote><p><strong data-start="5041" data-end="5049">2 Go</strong></p></blockquote>
</td>
<td data-start="5050" data-end="5134" data-col-size="md">
<blockquote><p>Serveur web avec base de données légère, RAM suffisante pour la plupart des pics</p></blockquote>
</td>
</tr>
<tr data-start="5135" data-end="5233">
<td data-start="5135" data-end="5154" data-col-size="sm">
<blockquote><p><strong data-start="5137" data-end="5153">8 Go et plus</strong></p></blockquote>
</td>
<td data-start="5154" data-end="5169" data-col-size="sm">
<blockquote><p><strong data-start="5156" data-end="5168">1 à 2 Go</strong></p></blockquote>
</td>
<td data-start="5169" data-end="5233" data-col-size="md">
<blockquote><p>Filet de sécurité, rarement utilisé en fonctionnement normal</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="5235" data-end="5560">Pour un <strong data-start="5243" data-end="5273">VPS Linux avec 2 Go de RAM</strong>, un <strong data-start="5278" data-end="5302">fichier swap de 2 Go</strong> constitue souvent un bon point de départ. Vous pouvez monter à <strong data-start="5366" data-end="5374">4 Go</strong> si le serveur exécute des tâches ponctuellement gourmandes, comme des builds applicatifs, des traitements d’images, des sauvegardes compressées ou des opérations de maintenance lourdes.</p>
<p data-start="5562" data-end="5917">Attention toutefois à ne pas surdimensionner le swap. Un fichier swap très volumineux ne remplace pas une vraie montée en <strong data-start="5684" data-end="5691">RAM</strong>. Si le serveur utilise constamment plusieurs gigaoctets de swap, les performances seront fortement dégradées. Dans ce cas, il vaut mieux analyser les processus actifs ou envisager un <strong data-start="5875" data-end="5890">VPS KVM LWS</strong> avec davantage de mémoire.</p>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="105vqwn" data-start="0" data-end="50">2. Sécuriser les permissions du fichier swap</h3>
<p data-start="52" data-end="428">Avant d’activer le <strong data-start="71" data-end="87">fichier swap</strong>, il est indispensable de corriger ses permissions. Par défaut, après sa création avec <code data-start="174" data-end="185">fallocate</code>, le fichier peut être lisible par d’autres utilisateurs du système. Or, un <strong data-start="261" data-end="283">fichier swap Linux</strong> peut contenir temporairement des fragments de mémoire issus de processus actifs. Il doit donc être strictement réservé à l’utilisateur <strong data-start="419" data-end="427">root</strong>.</p>
<p data-start="430" data-end="467">Appliquez les permissions suivantes :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> <span class="ͼ10">chmod</span> <span class="ͼy">600</span> /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="507" data-end="658">Cette commande donne les droits de lecture et d’écriture uniquement à <strong data-start="577" data-end="585">root</strong>. Aucun autre utilisateur du serveur ne peut lire ou modifier le fichier.</p>
<p data-start="660" data-end="703">Vous pouvez vérifier les permissions avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="735" data-end="779">Le résultat attendu doit ressembler à ceci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ12">-rw-------</span> <span class="ͼy">1</span> root root <span class="ͼy">2</span>.0G Jun <span class="ͼy">10</span> <span class="ͼy">14</span>:22 /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="845" data-end="1173"><img class="aligncenter size-full wp-image-29677"  alt="Sécuriser les permissions du fichier swap" width="1003" height="347" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Securiser-les-permissions-du-fichier-swap.webp"></p>
<p data-start="845" data-end="1173">Les permissions <code data-start="861" data-end="873">-rw-------</code> indiquent que seul <strong data-start="893" data-end="901">root</strong> peut accéder au fichier. Cette étape est importante pour la sécurité, mais aussi pour le bon fonctionnement du <strong data-start="1013" data-end="1031">swap VPS Linux</strong>. Si les permissions sont trop ouvertes, par exemple en <code data-start="1087" data-end="1093">0644</code>, le noyau Linux peut refuser d’activer le swap et afficher une erreur du type :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon: /swapfile: insecure permissions <span class="ͼy">0644</span>, <span class="ͼy">0600</span> suggested.</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1250" data-end="1286">Dans ce cas, il suffit de relancer :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> <span class="ͼ10">chmod</span> <span class="ͼy">600</span> /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1326" data-end="1370">Puis de reprendre la procédure d’activation.</p>
<h3 data-section-id="qrbc5c" data-start="1372" data-end="1418">3. Formater le fichier en espace de swap</h3>
<p data-start="1420" data-end="1611">Le fichier <code data-start="1431" data-end="1442">/swapfile</code> existe désormais et ses permissions sont correctes, mais il ne peut pas encore être utilisé comme <strong data-start="1541" data-end="1555">swap Linux</strong>. Il faut d’abord le formater avec la commande <code data-start="1602" data-end="1610">mkswap</code>.</p>
<p data-start="1613" data-end="1623">Exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> mkswap /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1660" data-end="1766">Cette commande prépare le fichier pour qu’il soit reconnu par le noyau comme un <strong data-start="1740" data-end="1758">espace de swap</strong> valide.</p>
<p data-start="1768" data-end="1796">Exemple de sortie possible :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Setting up swapspace version <span class="ͼy">1</span>, size <span class="ͼv">=</span> <span class="ͼy">2</span> GiB (2147479552 bytes)
no label, <span class="ͼ11">UUID</span><span class="ͼv">=</span>2f4b7d9e-2d91-4b84-91c7-9e8d2c8f2b31</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div></div>
<div><img class="aligncenter size-full wp-image-29676"  alt="Formater le fichier en espace de swap" width="1007" height="347" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Formater-le-fichier-swap.webp"></div>
<div class="">Le système indique ici que le fichier a bien été configuré comme <strong data-start="1992" data-end="2000">swap</strong>. L’UUID affiché peut être différent sur votre serveur : c’est normal, il est généré automatiquement.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2103" data-end="2252">Cette étape est obligatoire. Si vous tentez d’activer le fichier avec <code data-start="2173" data-end="2181">swapon</code> sans avoir exécuté <code data-start="2201" data-end="2209">mkswap</code>, vous risquez d’obtenir une erreur comme :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon: /swapfile: read swap header failed</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2310" data-end="2344">Dans ce cas, relancez simplement :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> mkswap /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2381" data-end="2422">Puis continuez avec l’activation du swap.</p>
<h3 data-section-id="1jaty2k" data-start="2424" data-end="2448">4. Activer le swap</h3>
<p data-start="2450" data-end="2555">Une fois le fichier créé, sécurisé et formaté, vous pouvez activer le <strong data-start="2520" data-end="2528">swap</strong> avec la commande <code data-start="2546" data-end="2554">swapon</code>.</p>
<p data-start="2557" data-end="2567">Exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> swapon /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2604" data-end="2801"><img class="aligncenter size-full wp-image-29673"  alt="Activer le swap" width="1003" height="308" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Activer-le-fichier-swap.webp"></p>
<p data-start="2604" data-end="2801">La commande ne retourne généralement aucun message si tout s’est bien passé. C’est un comportement normal sous Linux : l’absence d’erreur signifie que le <strong data-start="2758" data-end="2774">fichier swap</strong> a été activé correctement.</p>
<p data-start="2803" data-end="3063">À partir de ce moment, le noyau peut utiliser <code data-start="2849" data-end="2860">/swapfile</code> comme espace mémoire secondaire lorsque la <strong data-start="2904" data-end="2911">RAM</strong> devient insuffisante. Le serveur dispose donc d’une marge supplémentaire pour absorber certains pics de charge et limiter les risques d’<strong data-start="3048" data-end="3062">erreur OOM</strong>.</p>
<p data-start="3065" data-end="3351"><div class="alert_warning">Attention toutefois : cette activation est immédiate, mais elle n’est pas encore <strong data-start="3146" data-end="3179">persistante après redémarrage</strong>. Si vous redémarrez le <strong data-start="3203" data-end="3216">VPS Linux</strong> maintenant, le swap ne sera pas automatiquement réactivé. Nous corrigerons cela dans la section suivante avec le fichier <code data-start="3338" data-end="3350">/etc/fstab</code>.</div></p>
<p data-start="3353" data-end="3422">Avant d’aller plus loin, il faut vérifier que le swap est bien actif.</p>
<h3 data-section-id="bn9zz9" data-start="3424" data-end="3463">5. Vérifier que le swap est actif</h3>
<p data-start="3465" data-end="3541">Pour confirmer que le <strong data-start="3487" data-end="3505">swap VPS Linux</strong> est bien activé, utilisez d’abord :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon <span class="ͼ12">--show</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3570" data-end="3614">Vous devriez obtenir un résultat similaire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   <span class="ͼ12">-2</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3689" data-end="4002"><img class="aligncenter size-full wp-image-29679"  alt="Vérification de swap si actif sur un VPS KVM LWS" width="1004" height="350" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Verification-de-swap-si-actif-sur-un-VPS-KVM-LWS.webp"></p>
<p data-start="3689" data-end="4002">Ce tableau confirme que le fichier <code data-start="3724" data-end="3735">/swapfile</code> est reconnu comme <strong data-start="3754" data-end="3772">espace de swap</strong>. La colonne <code data-start="3785" data-end="3791">SIZE</code> indique sa taille totale, ici <strong data-start="3822" data-end="3830">2 Go</strong>. La colonne <code data-start="3843" data-end="3849">USED</code> indique la quantité actuellement utilisée. Juste après l’activation, elle peut afficher <code data-start="3938" data-end="3942">0B</code>, ce qui est normal si la <strong data-start="3968" data-end="3975">RAM</strong> disponible est suffisante.</p>
<p data-start="4004" data-end="4041">Vous pouvez également vérifier avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>free <span class="ͼ12">-h</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4064" data-end="4102">Exemple de résultat après activation :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>               total        used        free      shared  buff/cache   available
Mem:           <span class="ͼy">1</span>.9Gi       870Mi       110Mi        12Mi       980Mi       830Mi
Swap:          <span class="ͼy">2</span>.0Gi          0B       <span class="ͼy">2</span>.0Gi</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4324" data-end="4443">La ligne <strong data-start="4333" data-end="4341">Swap</strong> affiche maintenant une valeur non nulle. Cela signifie que le <strong data-start="4404" data-end="4420">fichier swap</strong> est bien opérationnel.</p>
<p data-start="4445" data-end="4696">À ce stade, le <strong data-start="4460" data-end="4473">VPS Linux</strong> dispose d’un swap actif, mais uniquement pour la session système en cours. Pour éviter de devoir relancer manuellement <code data-start="4593" data-end="4611">swapon /swapfile</code> après chaque redémarrage, il faut maintenant rendre cette configuration persistante.</p>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="12gujv7" data-start="0" data-end="43">Rendre le swap persistant au redémarrage</h2>
<p data-start="45" data-end="367">À ce stade, le <strong data-start="60" data-end="76">fichier swap</strong> est actif, mais uniquement pour la session en cours. Cela signifie qu’il fonctionne tant que le <strong data-start="173" data-end="186">VPS Linux</strong> reste démarré. En revanche, après un redémarrage du serveur, le système ne réactivera pas automatiquement <code data-start="293" data-end="304">/swapfile</code> si aucune entrée n’a été ajoutée dans le fichier <code data-start="354" data-end="366">/etc/fstab</code>.</p>
<p data-start="369" data-end="603">Le fichier <strong data-start="380" data-end="394">/etc/fstab</strong> sert à indiquer au système quels volumes, partitions ou espaces spéciaux doivent être montés ou activés au démarrage. Pour rendre le <strong data-start="528" data-end="546">swap VPS Linux</strong> persistant, il faut donc y ajouter une ligne spécifique.</p>
<p data-start="605" data-end="819">Cette étape doit être réalisée avec attention. Une erreur dans <code data-start="668" data-end="680">/etc/fstab</code> peut provoquer des problèmes au démarrage du serveur. C’est pourquoi il est recommandé de sauvegarder le fichier avant toute modification.</p>
<h3 data-section-id="185yfhl" data-start="821" data-end="871">1. Sauvegarder /etc/fstab avant modification</h3>
<p data-start="873" data-end="1048">Avant de modifier <code data-start="891" data-end="903">/etc/fstab</code>, créez une copie de sauvegarde. Cette précaution permet de restaurer le fichier d’origine en cas d’erreur de saisie ou de mauvaise manipulation.</p>
<p data-start="1050" data-end="1081">Exécutez la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> <span class="ͼ10">cp</span> /etc/fstab /etc/fstab.bak</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1130" data-end="1247">Cette commande crée une sauvegarde nommée <code data-start="1172" data-end="1188">/etc/fstab.bak</code>. Elle ne modifie pas la configuration actuelle du serveur.</p>
<p data-start="1249" data-end="1301">Vous pouvez vérifier que la sauvegarde existe avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /etc/fstab.bak</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1338" data-end="1359">Exemple de résultat :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ12">-rw-r--r--</span> <span class="ͼy">1</span> root root <span class="ͼy">625</span> Jun <span class="ͼy">10</span> <span class="ͼy">14</span>:35 /etc/fstab.bak</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1429" data-end="1700"><img class="aligncenter size-full wp-image-29680"  alt="Sauvegarder /etc/fstab avant modification" width="1006" height="345" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/creer-une-sauvegarde-de-lenvironnement.webp"></p>
<p data-start="1429" data-end="1700">Cette sauvegarde est particulièrement utile avant toute intervention sur un fichier système sensible. Sur un <strong data-start="1538" data-end="1559">VPS en production</strong>, il est également conseillé de créer un <strong data-start="1600" data-end="1612">snapshot</strong> depuis le panel d’administration avant de modifier une configuration liée au démarrage.</p>
<p data-start="1702" data-end="1828">En cas de problème, cette copie vous permettra de comparer les deux fichiers ou de restaurer rapidement la version précédente.</p>
<h3 data-section-id="1nx30pp" data-start="1830" data-end="1870">2. Ajouter le swap dans /etc/fstab</h3>
<p data-start="1872" data-end="2026">Pour que le <strong data-start="1884" data-end="1900">fichier swap</strong> soit automatiquement activé à chaque démarrage du <strong data-start="1951" data-end="1964">VPS Linux</strong>, ajoutez la ligne suivante à la fin du fichier <code data-start="2012" data-end="2024">/etc/fstab</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">echo</span> <span class="ͼz">'/swapfile none swap sw 0 0'</span> | <span class="ͼ10">sudo</span> <span class="ͼ10">tee</span> <span class="ͼ12">-a</span> /etc/fstab</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2100" data-end="2306">Cette commande ajoute l’entrée nécessaire sans ouvrir manuellement le fichier. Le point important est l’option <code data-start="2211" data-end="2215">-a</code> utilisée avec <code data-start="2230" data-end="2235">tee</code>. Elle signifie <strong data-start="2251" data-end="2261">append</strong>, c’est-à-dire “ajouter à la fin du fichier”.</p>
<p data-start="2308" data-end="2578">Sans cette option, vous pourriez écraser le contenu existant de <code data-start="2372" data-end="2384">/etc/fstab</code>, ce qui serait problématique. Le fichier contient souvent des informations essentielles sur la partition racine, les volumes montés et d’autres éléments nécessaires au bon démarrage du système.</p>
<p data-start="2580" data-end="2607">La ligne ajoutée signifie :</p>
<ul data-start="2609" data-end="2898">
<li data-section-id="t507vz" data-start="2609" data-end="2653"><code data-start="2611" data-end="2622">/swapfile</code> : chemin du <strong data-start="2635" data-end="2651">fichier swap</strong> ;</li>
<li data-section-id="1ljd5n8" data-start="2654" data-end="2716"><code data-start="2656" data-end="2662">none</code> : aucun point de montage classique n’est nécessaire ;</li>
<li data-section-id="332gsv" data-start="2717" data-end="2751"><code data-start="2719" data-end="2725">swap</code> : type d’espace utilisé ;</li>
<li data-section-id="112iey7" data-start="2752" data-end="2799"><code data-start="2754" data-end="2758">sw</code> : option standard pour activer le swap ;</li>
<li data-section-id="1p8h799" data-start="2800" data-end="2898"><code data-start="2802" data-end="2807">0 0</code> : options liées à la sauvegarde et à la vérification du système de fichiers, inutiles ici.</li>
</ul>
<p data-start="2900" data-end="3015">Grâce à cette configuration, le <strong data-start="2932" data-end="2946">swap Linux</strong> sera automatiquement pris en compte lors des prochains redémarrages.</p>
<h3 data-section-id="1rkj1kb" data-start="3017" data-end="3052">3. Vérifier le contenu ajouté</h3>
<p data-start="3054" data-end="3161">Après avoir modifié <code data-start="3074" data-end="3086">/etc/fstab</code>, vérifiez toujours que la ligne a bien été ajoutée. Utilisez par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-3</span> /etc/fstab</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3195" data-end="3256">Vous devriez voir apparaître une ligne similaire à celle-ci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/swapfile none swap sw <span class="ͼy">0</span> <span class="ͼy">0</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3298" data-end="3372">Si cette ligne est présente, la configuration de persistance est correcte.</p>
<p data-start="3374" data-end="3427">Vous pouvez également afficher tout le fichier avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cat</span> /etc/fstab</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3457" data-end="3720">Vérifiez que le contenu existant n’a pas été supprimé et que la ligne du <strong data-start="3530" data-end="3538">swap</strong> se trouve bien en plus des autres entrées. Cette vérification est importante, car une mauvaise modification de <code data-start="3650" data-end="3662">/etc/fstab</code> peut empêcher un <strong data-start="3680" data-end="3693">VPS Linux</strong> de redémarrer normalement.</p>
<p data-start="3722" data-end="3829">Pour tester la configuration sans redémarrer immédiatement, vous pouvez désactiver puis réactiver le swap :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> swapoff /swapfile
<span class="ͼ10">sudo</span> swapon /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3889" data-end="3948">Ensuite, contrôlez à nouveau l’état du <strong data-start="3928" data-end="3946">swap VPS Linux</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon <span class="ͼ12">--show</span>
free <span class="ͼ12">-h</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3985" data-end="4201">Si <code data-start="3988" data-end="3999">/swapfile</code> apparaît bien dans <code data-start="4019" data-end="4034">swapon --show</code> et que la ligne <strong data-start="4051" data-end="4059">Swap</strong> est visible dans <code data-start="4077" data-end="4086">free -h</code>, votre configuration est opérationnelle. Le <strong data-start="4131" data-end="4147">fichier swap</strong> est maintenant actif et persistant après redémarrage.</p>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="62q9pq" data-start="0" data-end="68">Optimiser les paramètres noyau : swappiness et vfs_cache_pressure</h2>
<p data-start="70" data-end="386">Une fois le <strong data-start="82" data-end="100">swap VPS Linux</strong> créé, activé et rendu persistant, il est important d’ajuster le comportement du noyau Linux. Par défaut, certains paramètres mémoire sont pensés pour un usage généraliste. Ils peuvent convenir à un poste de travail, mais ne sont pas toujours adaptés à un <strong data-start="356" data-end="385">serveur VPS en production</strong>.</p>
<p data-start="388" data-end="432">Deux réglages sont particulièrement utiles :</p>
<ul data-start="434" data-end="644">
<li data-section-id="8xxer5" data-start="434" data-end="515"><strong data-start="436" data-end="453">vm.swappiness</strong> : il contrôle la tendance du système à utiliser le <strong data-start="505" data-end="513">swap</strong> ;</li>
<li data-section-id="1lgspse" data-start="516" data-end="644"><strong data-start="518" data-end="543">vm.vfs_cache_pressure</strong> : il influence la manière dont Linux conserve ou libère certains caches liés au système de fichiers.</li>
</ul>
<p data-start="646" data-end="996">Ces paramètres ne changent pas la quantité de <strong data-start="692" data-end="699">RAM</strong> disponible. En revanche, ils permettent d’optimiser la façon dont le noyau arbitre entre <strong data-start="789" data-end="805">mémoire vive</strong>, <strong data-start="807" data-end="823">cache disque</strong> et <strong data-start="827" data-end="843">fichier swap</strong>. Sur un VPS hébergeant un site web, une base de données ou une application, ce réglage peut améliorer la stabilité et limiter l’usage prématuré du swap.</p>
<h3 data-section-id="f9urcf" data-start="998" data-end="1054">1. vm.swappiness : contrôler l&rsquo;agressivité du swap</h3>
<p data-start="1056" data-end="1402">Le paramètre <strong data-start="1069" data-end="1086">vm.swappiness</strong> indique au noyau Linux à quel point il doit utiliser le <strong data-start="1143" data-end="1151">swap</strong> plutôt que de conserver les données en <strong data-start="1191" data-end="1198">RAM</strong>. Plus la valeur est élevée, plus le système aura tendance à déplacer des pages mémoire vers le swap. Plus elle est basse, plus Linux cherchera à conserver les données en RAM aussi longtemps que possible.</p>
<p data-start="1404" data-end="1725">Sur de nombreuses distributions Linux, la valeur par défaut est souvent <strong data-start="1476" data-end="1482">60</strong>. Ce réglage peut être pertinent pour un usage polyvalent, mais il est généralement trop agressif pour un <strong data-start="1588" data-end="1603">serveur VPS</strong>. Sur un serveur en production, on préfère que le <strong data-start="1653" data-end="1661">swap</strong> serve de filet de sécurité, et non qu’il soit utilisé trop tôt.</p>
<p data-start="1727" data-end="1913">Pour un <strong data-start="1735" data-end="1748">VPS Linux</strong>, une valeur de <strong data-start="1764" data-end="1770">10</strong> est souvent recommandée. Elle permet de limiter l’utilisation du swap aux situations où la <strong data-start="1862" data-end="1882">pression mémoire</strong> devient réellement importante.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="1915" data-end="2496">
<thead data-start="1915" data-end="1958">
<tr data-start="1915" data-end="1958">
<th class="last:pe-10" data-start="1915" data-end="1924" data-col-size="sm">Valeur</th>
<th class="last:pe-10" data-start="1924" data-end="1939" data-col-size="md">Comportement</th>
<th class="last:pe-10" data-start="1939" data-end="1958" data-col-size="md">Recommandé pour</th>
</tr>
</thead>
<tbody data-start="1974" data-end="2496">
<tr data-start="1974" data-end="2123">
<td data-start="1974" data-end="1982" data-col-size="sm">
<blockquote><p><strong data-start="1976" data-end="1981">0</strong></p></blockquote>
</td>
<td data-start="1982" data-end="2046" data-col-size="md">
<blockquote><p>Utilisation du swap très limitée, proche d’un dernier recours</p></blockquote>
</td>
<td data-start="2046" data-end="2123" data-col-size="md">
<blockquote><p>À éviter dans la plupart des cas, car le risque d’<strong data-start="2098" data-end="2112">erreur OOM</strong> augmente</p></blockquote>
</td>
</tr>
<tr data-start="2124" data-end="2262">
<td data-start="2124" data-end="2133" data-col-size="sm">
<blockquote><p><strong data-start="2126" data-end="2132">10</strong></p></blockquote>
</td>
<td data-start="2133" data-end="2211" data-col-size="md">
<blockquote><p>Le swap est utilisé surtout lorsque la <strong data-start="2174" data-end="2181">RAM</strong> devient fortement sollicitée</p></blockquote>
</td>
<td data-start="2211" data-end="2262" data-col-size="md">
<blockquote><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="2215" data-end="2231">Serveurs VPS</strong>, hébergement web, production</p></blockquote>
</td>
</tr>
<tr data-start="2263" data-end="2391">
<td data-start="2263" data-end="2272" data-col-size="sm">
<blockquote><p><strong data-start="2265" data-end="2271">60</strong></p></blockquote>
</td>
<td data-start="2272" data-end="2350" data-col-size="md">
<blockquote><p>Valeur par défaut fréquente, comportement équilibré mais parfois trop actif</p></blockquote>
</td>
<td data-start="2350" data-end="2391" data-col-size="md">
<blockquote><p>Usage généraliste ou poste de travail</p></blockquote>
</td>
</tr>
<tr data-start="2392" data-end="2496">
<td data-start="2392" data-end="2402" data-col-size="sm">
<blockquote><p><strong data-start="2394" data-end="2401">100</strong></p></blockquote>
</td>
<td data-start="2402" data-end="2448" data-col-size="md">
<blockquote><p>Utilisation beaucoup plus fréquente du swap</p></blockquote>
</td>
<td data-start="2448" data-end="2496" data-col-size="md">
<blockquote><p>Non recommandé pour un serveur web classique</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="2498" data-end="2564">Pour consulter la valeur actuelle de <strong data-start="2535" data-end="2552">vm.swappiness</strong>, utilisez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cat</span> /proc/sys/vm/swappiness</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2607" data-end="2668">Pour appliquer immédiatement une valeur de <strong data-start="2650" data-end="2656">10</strong>, exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> sysctl vm<span class="ͼ11">.swappiness</span><span class="ͼv">=</span><span class="ͼy">10</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2712" data-end="2775">Vérifiez ensuite que la modification est bien prise en compte :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cat</span> /proc/sys/vm/swappiness</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2818" data-end="2840">Vous devriez obtenir :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼy">10</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2858" data-end="3017"><img class="aligncenter size-full wp-image-29682"  alt="Exécuter la commande VM" width="1001" height="455" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/executer-la-commande-VM.webp"></p>
<p data-start="2858" data-end="3017">Cette modification est immédiate, mais elle n’est pas encore <strong data-start="2919" data-end="2952">persistante après redémarrage</strong>. Pour conserver ce réglage, ajoutez-le dans <code data-start="2997" data-end="3015">/etc/sysctl.conf</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">echo</span> <span class="ͼz">'vm.swappiness=10'</span> | <span class="ͼ10">sudo</span> <span class="ͼ10">tee</span> <span class="ͼ12">-a</span> /etc/sysctl.conf</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3087" data-end="3329">À partir de là, le <strong data-start="3106" data-end="3119">VPS Linux</strong> utilisera une configuration plus adaptée à un contexte serveur. Le <strong data-start="3187" data-end="3203">fichier swap</strong> restera disponible, mais le noyau évitera de l’utiliser trop tôt tant que la <strong data-start="3281" data-end="3297">RAM physique</strong> peut encore absorber la charge.</p>
<h3 data-section-id="p6ui8j" data-start="3331" data-end="3409">2. vm.vfs_cache_pressure : contrôler la libération du cache inode/dentry</h3>
<p data-start="3411" data-end="3705">Le paramètre <strong data-start="3424" data-end="3449">vm.vfs_cache_pressure</strong> contrôle la manière dont le noyau Linux libère certains caches liés au système de fichiers, notamment les <strong data-start="3556" data-end="3566">inodes</strong> et les <strong data-start="3574" data-end="3586">dentries</strong>. Ces éléments permettent au système de retrouver plus rapidement les informations sur les fichiers et les répertoires.</p>
<p data-start="3707" data-end="4114">Par défaut, la valeur est souvent fixée à <strong data-start="3749" data-end="3756">100</strong>. Cela signifie que le noyau applique un comportement équilibré pour libérer ce cache. Sur un <strong data-start="3850" data-end="3863">VPS Linux</strong> qui accède fréquemment à de nombreux fichiers, comme un serveur <strong data-start="3928" data-end="3941">WordPress</strong>, un hébergement PHP ou une application avec beaucoup de fichiers statiques, réduire légèrement cette valeur peut aider à conserver plus longtemps ces informations en cache.</p>
<p data-start="4116" data-end="4367">Une valeur de <strong data-start="4130" data-end="4136">50</strong> est généralement utilisée pour inciter le système à libérer moins rapidement ce cache. Cela peut améliorer les performances dans certains contextes, car le serveur évite de relire trop souvent les mêmes informations sur le disque.</p>
<p data-start="4369" data-end="4420">Pour appliquer immédiatement ce réglage, utilisez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> sysctl vm<span class="ͼ11">.vfs_cache_pressure</span><span class="ͼv">=</span><span class="ͼy">50</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4472" data-end="4504">Puis vérifiez la valeur active :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cat</span> /proc/sys/vm/vfs_cache_pressure</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4555" data-end="4577">Vous devriez obtenir :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼy">50</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4595" data-end="4767"><img class="aligncenter size-full wp-image-29681"  alt="Exécuter la commande vfs" width="1005" height="370" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Executer-la-commande-vfs.webp"></p>
<p data-start="4595" data-end="4767">Comme pour <strong data-start="4606" data-end="4623">vm.swappiness</strong>, cette modification disparaîtra après redémarrage si elle n’est pas enregistrée dans <code data-start="4709" data-end="4727">/etc/sysctl.conf</code>. Pour la rendre persistante, exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">echo</span> <span class="ͼz">'vm.vfs_cache_pressure=50'</span> | <span class="ͼ10">sudo</span> <span class="ͼ10">tee</span> <span class="ͼ12">-a</span> /etc/sysctl.conf</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4845" data-end="5134">Ce réglage ne doit pas être considéré comme une solution miracle. Il permet d’affiner le comportement mémoire du noyau, mais il doit rester cohérent avec l’usage réel du serveur. Si le <strong data-start="5030" data-end="5037">VPS</strong> manque fortement de <strong data-start="5058" data-end="5065">RAM</strong>, ce paramètre ne suffira pas à compenser un mauvais dimensionnement.</p>
<h3 data-section-id="lsvzgu" data-start="5136" data-end="5208">3. Appliquer toutes les modifications persistantes sans redémarrer</h3>
<p data-start="5210" data-end="5387">Après avoir ajouté <strong data-start="5229" data-end="5246">vm.swappiness</strong> et <strong data-start="5250" data-end="5275">vm.vfs_cache_pressure</strong> dans <code data-start="5281" data-end="5299">/etc/sysctl.conf</code>, vous pouvez demander au système de relire ce fichier sans redémarrer le <strong data-start="5373" data-end="5386">VPS Linux</strong>.</p>
<p data-start="5389" data-end="5399">Exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> sysctl <span class="ͼ12">-p</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5429" data-end="5458">Exemple de résultat attendu :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>vm.swappiness <span class="ͼv">=</span> <span class="ͼy">10</span>
vm.vfs_cache_pressure <span class="ͼv">=</span> <span class="ͼy">50</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5519" data-end="5651">Cette sortie confirme que les deux paramètres ont bien été chargés par le noyau. Vous pouvez également vérifier chaque valeur avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cat</span> /proc/sys/vm/swappiness
<span class="ͼ10">cat</span> /proc/sys/vm/vfs_cache_pressure</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5730" data-end="5748">Résultat attendu :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼy">10</span>
<span class="ͼy">50</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5769" data-end="6042">À ce stade, votre <strong data-start="5787" data-end="5805">swap VPS Linux</strong> est non seulement actif et persistant, mais aussi associé à des paramètres mémoire plus adaptés à un <strong data-start="5907" data-end="5932">serveur en production</strong>. Le système évitera d’utiliser trop agressivement le swap, tout en conservant un cache fichier plus efficace.</p>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="1sg2i6t" data-start="0" data-end="52">Surveiller l&rsquo;utilisation de la mémoire et du swap</h2>
<p data-start="54" data-end="360">Après avoir créé et optimisé le <strong data-start="86" data-end="104">swap VPS Linux</strong>, il est important de surveiller son comportement dans le temps. Un <strong data-start="172" data-end="188">fichier swap</strong> correctement configuré ne doit pas être utilisé en permanence. Il doit surtout servir de <strong data-start="278" data-end="299">filet de sécurité</strong> lorsque la <strong data-start="311" data-end="318">RAM</strong> approche temporairement de la saturation.</p>
<p data-start="362" data-end="658">La surveillance permet de répondre à plusieurs questions importantes : le serveur dispose-t-il encore de suffisamment de <strong data-start="483" data-end="505">mémoire disponible</strong> ? Le swap est-il utilisé ponctuellement ou constamment ? Certains processus consomment-ils trop de RAM ? Le VPS doit-il être optimisé ou redimensionné ?</p>
<p data-start="660" data-end="948">Sur un <strong data-start="667" data-end="680">VPS Linux</strong>, vous pouvez effectuer ce suivi directement en ligne de commande avec <code data-start="751" data-end="757">free</code>, <code data-start="759" data-end="767">swapon</code>, <code data-start="769" data-end="776">watch</code>, <code data-start="778" data-end="784">htop</code> ou via l’analyse des processus. Ces outils permettent d’obtenir une vision rapide de l’état mémoire du serveur, sans installer de solution de supervision complexe.</p>
<h3 data-section-id="1na3v5i" data-start="950" data-end="976">1. Vue en temps réel</h3>
<p data-start="978" data-end="1179">Pour surveiller la <strong data-start="997" data-end="1004">RAM</strong> et le <strong data-start="1011" data-end="1019">swap</strong> en temps réel, vous pouvez combiner <code data-start="1056" data-end="1065">free -h</code> et <code data-start="1069" data-end="1084">swapon --show</code> avec la commande <code data-start="1102" data-end="1109">watch</code>. Celle-ci relance automatiquement une commande à intervalle régulier.</p>
<p data-start="1181" data-end="1191">Exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>watch <span class="ͼ12">-n</span> <span class="ͼy">1</span> <span class="ͼz">'free -h &amp;&amp; echo "---" &amp;&amp; swapon --show'</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1258" data-end="1506"><img class="aligncenter size-full wp-image-29686"  alt="vérifier les états du swap sur un VPS KVM LWS" width="1006" height="583" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/verifier-les-etats.webp"></p>
<p data-start="1258" data-end="1506">Cette commande met à jour l’affichage toutes les secondes. La première partie affiche l’état de la <strong data-start="1357" data-end="1372">mémoire RAM</strong>, puis la ligne <code data-start="1388" data-end="1393">---</code> sépare visuellement les résultats, et <code data-start="1432" data-end="1447">swapon --show</code> affiche les informations détaillées sur le <strong data-start="1491" data-end="1505">swap actif</strong>.</p>
<p data-start="1508" data-end="1731">Vous obtenez ainsi une vue pratique pour observer le comportement du serveur pendant une opération lourde : mise à jour système, sauvegarde, import de base de données, build applicatif, pic de trafic ou traitement planifié.</p>
<p data-start="1733" data-end="1768">Surveillez surtout trois éléments :</p>
<ul data-start="1770" data-end="2013">
<li data-section-id="1lwel3z" data-start="1770" data-end="1859">la colonne <strong data-start="1783" data-end="1796">available</strong> dans <code data-start="1802" data-end="1811">free -h</code>, qui indique la mémoire réellement disponible ;</li>
<li data-section-id="dqv2k5" data-start="1860" data-end="1928">la ligne <strong data-start="1871" data-end="1879">Swap</strong>, qui montre si le swap commence à être utilisé ;</li>
<li data-section-id="1qhr7bu" data-start="1929" data-end="2013">la colonne <strong data-start="1942" data-end="1950">USED</strong> de <code data-start="1954" data-end="1969">swapon --show</code>, qui indique la quantité de swap consommée.</li>
</ul>
<p data-start="2015" data-end="2282">Si le <strong data-start="2021" data-end="2039">swap VPS Linux</strong> reste à <code data-start="2048" data-end="2052">0B</code> ou augmente seulement pendant de courts pics, le comportement est généralement sain. En revanche, si le swap augmente régulièrement et ne redescend jamais, cela peut révéler un manque de <strong data-start="2240" data-end="2247">RAM</strong> ou une application trop gourmande.</p>
<h3 data-section-id="19izab5" data-start="2284" data-end="2339">2. Identifier les processus qui utilisent le swap</h3>
<p data-start="2341" data-end="2562">Lorsque le <strong data-start="2352" data-end="2360">swap</strong> est utilisé, il peut être utile d’identifier les processus responsables. Linux expose de nombreuses informations dans le répertoire <code data-start="2493" data-end="2500">/proc</code>, notamment la quantité de swap utilisée par chaque processus.</p>
<p data-start="2564" data-end="2646">La commande suivante affiche les 10 processus qui consomment le plus de <strong data-start="2636" data-end="2644">swap</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼv">for</span> file <span class="ͼv">in</span> /proc/*/status; <span class="ͼv">do</span>
  <span class="ͼ10">awk</span> <span class="ͼz">'/VmSwap|Name/{printf $2 " " $3}END{ print ""}'</span> <span class="ͼ11">$file</span>
<span class="ͼv">done</span> | <span class="ͼ10">sort</span> <span class="ͼ12">-k</span> <span class="ͼy">2</span> <span class="ͼ12">-n</span> <span class="ͼ12">-r</span> | head <span class="ͼ12">-10</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2786" data-end="2984">Cette commande parcourt les fichiers <code data-start="2823" data-end="2831">status</code> des processus actifs, extrait le nom du processus et la valeur <strong data-start="2895" data-end="2905">VmSwap</strong>, puis trie les résultats pour afficher les plus gros consommateurs en premier.</p>
<p data-start="2986" data-end="3016">Exemple de résultat possible :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>mysqld <span class="ͼy">524288</span> kB
php-fpm8.2 <span class="ͼy">131072</span> kB
<span class="ͼ10">node</span> <span class="ͼy">65536</span> kB
apache2 <span class="ͼy">32768</span> kB</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Dans cet exemple, le processus <strong data-start="3131" data-end="3141">mysqld</strong> utilise une quantité importante de swap. Cela peut indiquer une base de données trop sollicitée, un cache mal dimensionné ou une <strong data-start="3271" data-end="3291">RAM insuffisante</strong> pour la charge réelle du serveur.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3327" data-end="3685">Cette analyse est particulièrement utile sur un <strong data-start="3375" data-end="3388">VPS Linux</strong> qui héberge plusieurs services : serveur web, base de données, moteur PHP, application Node.js, tâches cron ou outils de sauvegarde. Elle permet d’éviter une conclusion trop rapide. Le problème ne vient pas toujours du swap lui-même : il vient souvent d’un processus qui consomme trop de mémoire.</p>
<p data-start="3687" data-end="3989">Si un processus apparaît systématiquement en tête, analysez sa configuration avant d’augmenter la taille du <strong data-start="3795" data-end="3811">fichier swap</strong>. Par exemple, il peut être plus efficace d’ajuster les paramètres de <strong data-start="3881" data-end="3892">PHP-FPM</strong>, de réduire la mémoire allouée à une base de données ou de désactiver une extension trop lourde.</p>
<h3 data-section-id="9658tx" data-start="3991" data-end="4016">3. Lecture via htop</h3>
<p data-start="4018" data-end="4235">L’outil <strong data-start="4026" data-end="4034">htop</strong> offre une lecture plus visuelle de l’utilisation des ressources système. Il permet d’observer la <strong data-start="4132" data-end="4139">RAM</strong>, le <strong data-start="4144" data-end="4152">swap</strong>, la charge CPU et les processus actifs dans une interface interactive en terminal.</p>
<p data-start="4237" data-end="4302">Si <code data-start="4240" data-end="4246">htop</code> n’est pas encore installé, vous pouvez l’ajouter avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> apt update
<span class="ͼ10">sudo</span> apt install htop <span class="ͼ12">-y</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Lancez ensuite l’outil :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>htop</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div><img class="aligncenter size-full wp-image-29684"  alt="Exécuter la commande htop" width="1001" height="600" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/Executer-la-commande-htop.webp"></div>
<div class="">En haut de l’écran, <strong data-start="4422" data-end="4430">htop</strong> affiche généralement des barres dédiées au <strong data-start="4474" data-end="4481">CPU</strong>, à la <strong data-start="4488" data-end="4503">mémoire RAM</strong> et au <strong data-start="4510" data-end="4518">swap</strong>. Vous pouvez ainsi voir rapidement si le <strong data-start="4560" data-end="4576">fichier swap</strong> est utilisé et dans quelle proportion.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4617" data-end="4722">Pour obtenir une lecture plus précise, vous pouvez ajouter une colonne dédiée au <strong data-start="4698" data-end="4706">swap</strong> par processus :</p>
<ul data-start="4724" data-end="4904">
<li data-section-id="l6mpv" data-start="4724" data-end="4774">appuyez sur <strong data-start="4739" data-end="4745">F2</strong> pour ouvrir les paramètres ;</li>
<li data-section-id="ijz0zl" data-start="4775" data-end="4802">allez dans <strong data-start="4789" data-end="4800">Columns</strong> ;</li>
<li data-section-id="t74bb2" data-start="4803" data-end="4858">ajoutez la colonne <strong data-start="4825" data-end="4833">SWAP</strong> si elle est disponible ;</li>
<li data-section-id="1hmmjmp" data-start="4859" data-end="4904">sauvegardez la configuration avec <strong data-start="4896" data-end="4903">F10</strong>.</li>
</ul>
<p data-start="4906" data-end="5284">Cette vue est pratique pour repérer les services qui utilisent beaucoup de mémoire. Elle permet aussi de vérifier si le serveur revient à un état normal après une opération lourde. Par exemple, si le <strong data-start="5106" data-end="5114">swap</strong> augmente pendant une sauvegarde puis se stabilise ensuite, le comportement peut être acceptable. Si le swap reste élevé en permanence, il faut approfondir le diagnostic.</p>
<p data-start="5286" data-end="5522">Sur un <strong data-start="5293" data-end="5314">VPS en production</strong>, <strong data-start="5316" data-end="5324">htop</strong> ne remplace pas une supervision longue durée, mais il reste très utile pour un contrôle immédiat en SSH. Il complète les commandes <code data-start="5456" data-end="5465">free -h</code>, <code data-start="5467" data-end="5482">swapon --show</code> et l’analyse des processus via <code data-start="5514" data-end="5521">/proc</code>.</p>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="rgadsf" data-start="0" data-end="44">4. Supervision depuis le Panel KVM LWS</h3>
<p data-start="46" data-end="360">En complément des commandes exécutées en SSH, le <strong data-start="95" data-end="112">Panel KVM LWS</strong> permet de suivre l’état général de votre <strong data-start="154" data-end="167">VPS Linux</strong> depuis une interface graphique. C’est une solution pratique lorsque vous souhaitez vérifier rapidement si le serveur subit une pression mémoire, sans ouvrir immédiatement une session terminal.</p>
<p data-start="362" data-end="752">Depuis le <strong data-start="372" data-end="389">Panel KVM LWS</strong>, vous pouvez consulter les graphiques de performance liés aux ressources du VPS, notamment l’utilisation du <strong data-start="498" data-end="505">CPU</strong>, de la <strong data-start="513" data-end="520">RAM</strong> et du réseau. Selon la configuration disponible dans votre interface, ces graphiques permettent d’observer l’évolution des ressources sur différentes périodes, par exemple sur quelques heures, plusieurs jours ou plusieurs semaines.</p>
<p data-start="362" data-end="752"><img class="aligncenter wp-image-29685 size-full"  alt="Surveiller les graphiques depuis le panel LWS" width="1920" height="885" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/07/surveiller-les-graphiques-depuis-le-panel-LWS.avif"></p>
<p data-start="754" data-end="1082">Cette supervision est particulièrement utile pour repérer les tendances. Une commande comme <code data-start="846" data-end="855">free -h</code> donne une photographie instantanée de l’état mémoire, tandis qu’un graphique permet de voir si la <strong data-start="954" data-end="961">RAM</strong> se remplit progressivement, si les pics sont ponctuels ou si le serveur reste sous pression pendant de longues périodes.</p>
<p data-start="1084" data-end="1337">Pour accéder aux informations de performance, rendez-vous dans votre espace client LWS, puis dans la gestion de votre <strong data-start="1202" data-end="1213">VPS KVM</strong>. Recherchez ensuite la rubrique liée à la <strong data-start="1256" data-end="1271">supervision</strong>, aux <strong data-start="1277" data-end="1306">graphiques de performance</strong> ou aux <strong data-start="1314" data-end="1336">ressources serveur</strong>. Pour aller plus loin, consultez notre guide pour <span style="font-weight: 400;"><a title="VPS pour DDoS : protéger son serveur — configuration complète" href="https://tutoriels.lws.fr/vps/vps-pour-ddos-protection-configuration">surveiller les ressources système avec le Panel KVM LWS</a>.</span></p>
<p data-start="1084" data-end="1337"><div class="alert_tips"><p class="title">Trucs et astuces</p><hr><p><strong data-start="1679" data-end="1731">Besoin de surveiller plus facilement votre VPS ?</strong><br data-start="1731" data-end="1734" />Le <strong data-start="1739" data-end="1756">Panel KVM LWS</strong> permet de suivre les ressources de votre serveur et d’identifier plus rapidement les périodes de forte consommation mémoire. Les offres <strong data-start="1893" data-end="1908">VPS KVM LWS</strong> incluent un accès root complet, un stockage <strong data-start="1953" data-end="1965">SSD NVMe</strong> et des outils pratiques pour administrer votre serveur Linux.<br data-start="2027" data-end="2030" /><a title="Voir les VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Voir les VPS KVM LWS</a> </p></div></p>
<h2 data-section-id="19ry2o8" data-start="2058" data-end="2097">Diagnostiquer un VPS qui swappe trop</h2>
<p data-start="2099" data-end="2435">Un <strong data-start="2102" data-end="2120">swap VPS Linux</strong> bien configuré doit rester un mécanisme de secours. Il est normal qu’il soit utilisé ponctuellement lors d’un pic de charge, par exemple pendant une sauvegarde, un import de base de données, un traitement d’images ou un build applicatif. En revanche, un <strong data-start="2375" data-end="2405">swap utilisé en permanence</strong> doit attirer votre attention.</p>
<p data-start="2437" data-end="2753">Lorsqu’un VPS swappe trop, le serveur peut devenir lent même si les services restent actifs. Les pages mémoire sont alors déplacées entre la <strong data-start="2578" data-end="2585">RAM</strong> et le disque, ce qui augmente les temps d’accès. Même sur un stockage <strong data-start="2656" data-end="2668">SSD NVMe</strong>, cette opération reste beaucoup plus lente qu’un accès direct à la <strong data-start="2736" data-end="2752">mémoire vive</strong>.</p>
<p data-start="2755" data-end="2820">Le diagnostic consiste donc à comprendre si le swap est utilisé :</p>
<ul data-start="2822" data-end="2996">
<li data-section-id="xyk8t1" data-start="2822" data-end="2877">de manière ponctuelle, pendant une tâche temporaire ;</li>
<li data-section-id="vgu7ax" data-start="2878" data-end="2926">de manière régulière, lors de pics de trafic ;</li>
<li data-section-id="iy61jc" data-start="2927" data-end="2996">de manière chronique, même lorsque le serveur semble peu sollicité.</li>
</ul>
<p data-start="2998" data-end="3241">Dans les deux premiers cas, un <strong data-start="3029" data-end="3045">fichier swap</strong> correctement dimensionné peut remplir son rôle. Dans le troisième cas, le problème vient souvent d’un manque structurel de <strong data-start="3169" data-end="3176">RAM</strong>, d’un service mal configuré ou d’une application trop gourmande.</p>
<h3 data-section-id="b0k6tv" data-start="3243" data-end="3331">Symptôme fréquent : le swap est utilisé alors que la RAM n&rsquo;est pas pleinement saturée</h3>
<p data-start="3333" data-end="3637">Un cas fréquent consiste à voir du <strong data-start="3368" data-end="3384">swap utilisé</strong> alors que la <strong data-start="3398" data-end="3405">RAM</strong> semble encore disponible. Cela peut surprendre, mais ce comportement est souvent lié au paramètre <strong data-start="3504" data-end="3521">vm.swappiness</strong>. Si sa valeur est trop élevée, le noyau Linux peut déplacer des pages mémoire vers le swap plus tôt que nécessaire.</p>
<p data-start="3639" data-end="3687">Vous pouvez observer ce type de situation avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>free <span class="ͼ12">-h</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3710" data-end="3729">Exemple simplifié :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>               total        used        free      shared  buff/cache   available
Mem:           <span class="ͼy">2</span>.0Gi       <span class="ͼy">1</span>.2Gi       300Mi        20Mi       500Mi       800Mi
Swap:          <span class="ͼy">2</span>.0Gi       500Mi       <span class="ͼy">1</span>.5Gi</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Dans cet exemple, la colonne <strong data-start="3980" data-end="3993">available</strong> indique encore environ <strong data-start="4017" data-end="4028">800 Mio</strong> de mémoire disponible, mais le <strong data-start="4060" data-end="4068">swap</strong> est déjà utilisé à hauteur de <strong data-start="4099" data-end="4110">500 Mio</strong>. Cela ne signifie pas forcément que le serveur est en crise, mais cela peut indiquer que Linux a commencé à déplacer certaines pages mémoire vers le swap plus tôt que souhaité.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4289" data-end="4456">Si <strong data-start="4292" data-end="4309">vm.swappiness</strong> est encore à sa valeur par défaut, par exemple <strong data-start="4357" data-end="4363">60</strong>, vous pouvez appliquer une valeur plus adaptée à un <strong data-start="4416" data-end="4431">serveur VPS</strong>, comme vu précédemment :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> sysctl vm<span class="ͼ11">.swappiness</span><span class="ͼv">=</span><span class="ͼy">10</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4500" data-end="4515">Puis vérifiez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cat</span> /proc/sys/vm/swappiness</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4558" data-end="4798">Si le résultat est bien <code data-start="4582" data-end="4586">10</code>, le noyau sera moins agressif dans son utilisation du <strong data-start="4641" data-end="4655">swap Linux</strong>. Le swap restera disponible en cas de pression mémoire réelle, mais il sera moins sollicité lorsque la <strong data-start="4759" data-end="4766">RAM</strong> peut encore absorber la charge.</p>
<h3 data-section-id="1os66qt" data-start="4800" data-end="4858">Forcer la libération du swap (si la RAM est disponible)</h3>
<p data-start="4860" data-end="5234">Dans certains cas, vous pouvez vouloir vider le <strong data-start="4908" data-end="4916">swap</strong> après un pic de charge terminé. Par exemple, une tâche lourde a consommé beaucoup de mémoire, le serveur a utilisé le swap, puis la charge est revenue à la normale. Si la <strong data-start="5088" data-end="5106">RAM disponible</strong> est suffisante, il est possible de désactiver puis réactiver le swap pour forcer Linux à rapatrier son contenu en mémoire vive.</p>
<p data-start="5236" data-end="5265">La commande est la suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> swapoff <span class="ͼ12">-a</span> &amp;&amp; <span class="ͼ10">sudo</span> swapon <span class="ͼ12">-a</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Cette commande désactive tous les espaces de <strong data-start="5359" data-end="5367">swap</strong>, puis les réactive immédiatement. Si le serveur dispose d’assez de <strong data-start="5435" data-end="5442">RAM</strong>, les données présentes dans le swap sont replacées en mémoire.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5507" data-end="5772"><div class="alert_warning">Attention : cette commande doit être utilisée avec prudence. Si la <strong data-start="5574" data-end="5581">RAM</strong> est réellement saturée, désactiver le swap peut provoquer une <strong data-start="5644" data-end="5658">erreur OOM</strong> et entraîner l’arrêt brutal de certains processus. Avant de l’exécuter, vérifiez toujours la mémoire disponible : <code>free <span class="ͼ12">-h</span></code></div></p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="">Regardez en priorité la colonne <strong data-start="5827" data-end="5840">available</strong>. Si elle est faible, ne forcez pas la libération du swap. Il est préférable d’identifier les processus consommateurs, de réduire la charge ou d’attendre la fin d’une tâche lourde.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6022" data-end="6263">Cette manipulation peut être utile ponctuellement, mais elle ne doit pas devenir une habitude. Si vous devez vider le swap régulièrement, c’est probablement le signe que le <strong data-start="6195" data-end="6208">VPS Linux</strong> manque de <strong data-start="6219" data-end="6226">RAM</strong> ou qu’un service doit être optimisé.</p>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="1w3md68" data-start="0" data-end="67">Quand le swap ne suffit plus : passer à une offre VPS supérieure</h2>
<p data-start="69" data-end="392">Le <strong data-start="72" data-end="90">swap VPS Linux</strong> est utile pour absorber des pics ponctuels, mais il ne doit pas masquer un manque durable de <strong data-start="184" data-end="191">RAM</strong>. Si votre serveur utilise son <strong data-start="222" data-end="238">fichier swap</strong> tous les jours, ou si la courbe mémoire reste constamment élevée dans le <strong data-start="312" data-end="329">Panel KVM LWS</strong>, le problème n’est probablement plus la configuration du swap.</p>
<p data-start="394" data-end="719">Dans ce cas, augmenter la taille du swap peut même donner une fausse impression de sécurité. Le serveur disposera de plus d’espace disque utilisable comme mémoire secondaire, mais les performances resteront limitées. Plus le système utilise le swap, plus il dépend du disque, et plus les temps de réponse peuvent se dégrader.</p>
<p data-start="721" data-end="811">Les signes d’un manque structurel de <strong data-start="758" data-end="773">mémoire RAM</strong> sont généralement faciles à repérer :</p>
<ul data-start="813" data-end="1234">
<li data-section-id="1pzu9xu" data-start="813" data-end="872">le <strong data-start="818" data-end="826">swap</strong> reste utilisé même après les pics de charge ;</li>
<li data-section-id="juofe5" data-start="873" data-end="927">la colonne <strong data-start="886" data-end="899">available</strong> de <code data-start="903" data-end="912">free -h</code> reste faible ;</li>
<li data-section-id="f7gosc" data-start="928" data-end="1069">les services comme <strong data-start="949" data-end="958">MySQL</strong>, <strong data-start="960" data-end="971">MariaDB</strong>, <strong data-start="973" data-end="984">PHP-FPM</strong>, <strong data-start="986" data-end="996">Apache</strong>, <strong data-start="998" data-end="1007">Nginx</strong> ou <strong data-start="1011" data-end="1022">Node.js</strong> consomment régulièrement beaucoup de mémoire ;</li>
<li data-section-id="1rv0p3u" data-start="1070" data-end="1142">des <strong data-start="1076" data-end="1091">erreurs OOM</strong> apparaissent encore malgré la présence d’un swap ;</li>
<li data-section-id="1lroead" data-start="1143" data-end="1234">les graphiques de supervision montrent une pression mémoire continue sur plusieurs jours.</li>
</ul>
<p data-start="1236" data-end="1601">Dans cette situation, la bonne solution consiste à optimiser les services lorsque c’est possible, puis à envisager une montée en gamme vers un <strong data-start="1379" data-end="1394">VPS KVM LWS</strong> disposant de plus de <strong data-start="1416" data-end="1432">RAM physique</strong>. Le swap restera utile comme sécurité, mais le serveur retrouvera de meilleures performances si les processus actifs peuvent fonctionner principalement en mémoire vive.</p>
<h2 data-section-id="1gr9pc9" data-start="1603" data-end="1643">Modifier ou supprimer le fichier swap</h2>
<p data-start="1645" data-end="1907">La configuration d’un <strong data-start="1667" data-end="1689">fichier swap Linux</strong> n’est pas figée. Vous pouvez l’agrandir, le réduire ou le supprimer selon l’évolution de votre <strong data-start="1785" data-end="1798">VPS Linux</strong>. Cette souplesse est l’un des principaux avantages du <strong data-start="1853" data-end="1869">fichier swap</strong> par rapport à une <strong data-start="1888" data-end="1906">partition swap</strong>.</p>
<p data-start="1909" data-end="2204">Par exemple, vous pouvez commencer avec un <strong data-start="1952" data-end="1968">swap de 2 Go</strong>, puis passer à <strong data-start="1984" data-end="1992">4 Go</strong> si votre serveur héberge une application plus gourmande. À l’inverse, si vous migrez vers une offre avec plus de <strong data-start="2106" data-end="2113">RAM</strong>, vous pouvez réduire la taille du swap ou le conserver uniquement comme filet de sécurité.</p>
<p data-start="2206" data-end="2273">Avant toute modification, vérifiez toujours l’état actuel du swap :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon <span class="ͼ12">--show</span>
free <span class="ͼ12">-h</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2310" data-end="2480">Ces commandes permettent de confirmer le chemin du <strong data-start="2361" data-end="2377">fichier swap</strong>, sa taille et son niveau d’utilisation. Par défaut, dans ce guide, le fichier utilisé est <code data-start="2468" data-end="2479">/swapfile</code>.</p>
<p data-start="2482" data-end="2571">Il est aussi recommandé de vérifier l’espace disque disponible avant d’agrandir le swap :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>df <span class="ͼ12">-h</span> /</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2594" data-end="2834">Si la partition principale est presque pleine, évitez de créer un fichier swap plus volumineux. Un disque saturé peut provoquer des erreurs système, bloquer les mises à jour ou empêcher certains services d’écrire leurs fichiers temporaires.</p>
<h2 data-section-id="uhavlh" data-start="2836" data-end="2864">Agrandir le swap existant</h2>
<p data-start="2866" data-end="3056">Pour agrandir un <strong data-start="2883" data-end="2908">fichier swap existant</strong>, il faut d’abord le désactiver, recréer le fichier avec la nouvelle taille, lui appliquer les bonnes permissions, le reformater, puis le réactiver.</p>
<p data-start="3058" data-end="3128">L’exemple suivant remplace le fichier actuel par un <strong data-start="3110" data-end="3126">swap de 4 Go</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> swapoff /swapfile
<span class="ͼ10">sudo</span> fallocate <span class="ͼ12">-l</span> 4G /swapfile
<span class="ͼ10">sudo</span> <span class="ͼ10">chmod</span> <span class="ͼy">600</span> /swapfile
<span class="ͼ10">sudo</span> mkswap /swapfile
<span class="ͼ10">sudo</span> swapon /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3266" data-end="3300">Chaque commande a un rôle précis :</p>
<ul data-start="3302" data-end="3603">
<li data-section-id="7icusn" data-start="3302" data-end="3362"><code data-start="3304" data-end="3323">swapoff /swapfile</code> désactive temporairement le <strong data-start="3352" data-end="3360">swap</strong> ;</li>
<li data-section-id="fn5wxg" data-start="3363" data-end="3440"><code data-start="3365" data-end="3392">fallocate -l 4G /swapfile</code> recrée le fichier avec une taille de <strong data-start="3430" data-end="3438">4 Go</strong> ;</li>
<li data-section-id="v5j7rr" data-start="3441" data-end="3491"><code data-start="3443" data-end="3464">chmod 600 /swapfile</code> sécurise les permissions ;</li>
<li data-section-id="1lqxeyb" data-start="3492" data-end="3564"><code data-start="3494" data-end="3512">mkswap /swapfile</code> formate le fichier comme espace de <strong data-start="3548" data-end="3562">swap Linux</strong> ;</li>
<li data-section-id="vygelh" data-start="3565" data-end="3603"><code data-start="3567" data-end="3585">swapon /swapfile</code> réactive le swap.</li>
</ul>
<p data-start="3605" data-end="3646">Après l’opération, vérifiez le résultat :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon <span class="ͼ12">--show</span>
free <span class="ͼ12">-h</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3683" data-end="3737">Vous devriez voir <code data-start="3701" data-end="3712">/swapfile</code> avec sa nouvelle taille.</p>
<p data-start="3739" data-end="3883">L’entrée déjà présente dans <code data-start="3767" data-end="3779">/etc/fstab</code> n’a normalement pas besoin d’être modifiée, car elle référence le chemin du fichier, et non sa taille :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/swapfile none swap sw <span class="ͼy">0</span> <span class="ͼy">0</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3925" data-end="4044">Tant que le fichier conserve le même chemin, le <strong data-start="3973" data-end="3991">swap VPS Linux</strong> sera toujours activé automatiquement au redémarrage.</p>
<p data-start="4046" data-end="4277"><div class="alert_warning">Attention toutefois : avant de lancer <code data-start="4084" data-end="4093">swapoff</code>, assurez-vous que la <strong data-start="4115" data-end="4133">RAM disponible</strong> est suffisante. Si le swap est fortement utilisé et que la mémoire vive est déjà saturée, désactiver le swap peut provoquer une <strong data-start="4262" data-end="4276">erreur OOM</strong>.</div></p>
<h2 data-section-id="1vq7n6m" data-start="4279" data-end="4299">Supprimer le swap</h2>
<p data-start="4301" data-end="4522">Vous pouvez aussi supprimer le <strong data-start="4332" data-end="4348">fichier swap</strong> si vous n’en avez plus besoin, par exemple après une montée en gamme vers un VPS avec davantage de <strong data-start="4448" data-end="4455">RAM</strong> ou dans le cadre d’une réorganisation de la configuration système.</p>
<p data-start="4524" data-end="4558">Commencez par désactiver le swap :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> swapoff /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Supprimez ensuite l’entrée correspondante dans <code data-start="4643" data-end="4655">/etc/fstab</code> afin d’éviter que le système tente de réactiver un fichier inexistant au prochain démarrage :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> <span class="ͼ10">sed</span> <span class="ͼ12">-i</span> <span class="ͼz">'/swapfile/d'</span> /etc/fstab</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4801" data-end="4828">Puis supprimez le fichier :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> <span class="ͼ10">rm</span> /swapfile</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4861" data-end="4908">Vérifiez ensuite que le swap n’est plus actif :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon <span class="ͼ12">--show</span>
free <span class="ͼ12">-h</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4945" data-end="5073">Si <code data-start="4948" data-end="4963">swapon --show</code> ne retourne rien et que la ligne <strong data-start="4997" data-end="5005">Swap</strong> de <code data-start="5009" data-end="5018">free -h</code> affiche <code data-start="5027" data-end="5031">0B</code>, le <strong data-start="5036" data-end="5052">fichier swap</strong> a bien été supprimé.</p>
<p data-start="5075" data-end="5496">Cette suppression doit être réalisée uniquement si vous comprenez l’impact sur votre serveur. Sans swap, un <strong data-start="5183" data-end="5196">VPS Linux</strong> disposera de moins de marge en cas de pic mémoire. Si la <strong data-start="5254" data-end="5261">RAM</strong> est saturée, le noyau pourra tuer plus rapidement certains processus pour protéger le système.</p>
<p data-start="5075" data-end="5496">Pour un serveur en production, il est souvent préférable de conserver un petit <strong data-start="5436" data-end="5456">swap de sécurité</strong>, même lorsque la RAM semble suffisante.</p>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="12rt5lv" data-start="0" data-end="37">Vérification du bon fonctionnement</h2>
<p data-start="39" data-end="350">Après avoir créé, activé et optimisé votre <strong data-start="82" data-end="100">swap VPS Linux</strong>, il est important de vérifier que tout fonctionne correctement. Cette étape permet de confirmer que le <strong data-start="204" data-end="220">fichier swap</strong> est bien actif, que les paramètres noyau sont appliqués et que la configuration restera en place après un redémarrage du serveur.</p>
<p data-start="352" data-end="401">Commencez par vérifier la présence du swap avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon <span class="ͼ12">--show</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="430" data-end="488">Le résultat doit afficher une ligne similaire à celle-ci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   <span class="ͼ12">-2</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="563" data-end="781">La présence de <code data-start="578" data-end="589">/swapfile</code> confirme que le <strong data-start="606" data-end="628">fichier swap Linux</strong> est bien reconnu par le système. La colonne <code data-start="673" data-end="679">SIZE</code> indique la taille configurée, tandis que la colonne <code data-start="732" data-end="738">USED</code> indique la quantité actuellement utilisée.</p>
<p data-start="783" data-end="844">Vérifiez ensuite l’état global de la <strong data-start="820" data-end="827">RAM</strong> et du <strong data-start="834" data-end="842">swap</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>free <span class="ͼ12">-h</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="867" data-end="921">La ligne <strong data-start="876" data-end="884">Swap</strong> doit afficher une valeur non nulle :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Swap:          <span class="ͼy">2</span>.0Gi          0B       <span class="ͼy">2</span>.0Gi</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="981" data-end="1038">Contrôlez ensuite les paramètres d’optimisation mémoire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cat</span> /proc/sys/vm/swappiness
<span class="ͼ10">cat</span> /proc/sys/vm/vfs_cache_pressure</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1117" data-end="1142">Le résultat attendu est :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼy">10</span>
<span class="ͼy">50</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1163" data-end="1280">Ces valeurs confirment que <strong data-start="1190" data-end="1207">vm.swappiness</strong> et <strong data-start="1211" data-end="1236">vm.vfs_cache_pressure</strong> sont bien configurés pour un usage serveur.</p>
<p data-start="1282" data-end="1346">Enfin, redémarrez le <strong data-start="1303" data-end="1316">VPS Linux</strong> pour valider la persistance :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> reboot</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1373" data-end="1413">Reconnectez-vous en SSH, puis relancez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>swapon <span class="ͼ12">--show</span>
free <span class="ͼ12">-h</span>
<span class="ͼ10">cat</span> /proc/sys/vm/swappiness
<span class="ͼ10">cat</span> /proc/sys/vm/vfs_cache_pressure</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Si les mêmes valeurs sont toujours présentes après redémarrage, votre <strong data-start="1584" data-end="1602">swap VPS Linux</strong> est correctement configuré. Vous pouvez également compléter cette vérification avec les graphiques du <strong data-start="1705" data-end="1722">Panel KVM LWS</strong> afin d’observer l’évolution de la <strong data-start="1757" data-end="1764">RAM</strong> dans le temps.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h2 data-section-id="1wbg0sh" data-start="1781" data-end="1820">Erreurs fréquentes et cas de blocage</h2>
<p data-start="1822" data-end="2166">Même si la procédure de création d’un <strong data-start="1860" data-end="1876">fichier swap</strong> est relativement simple, certaines erreurs peuvent empêcher son activation ou sa persistance. La plupart sont liées aux permissions, à l’absence de formatage avec <code data-start="2040" data-end="2048">mkswap</code>, à une mauvaise modification de <code data-start="2081" data-end="2093">/etc/fstab</code> ou à une confusion entre manque ponctuel et manque chronique de <strong data-start="2158" data-end="2165">RAM</strong>.</p>
<p data-start="2168" data-end="2231">Le tableau suivant récapitule les problèmes les plus fréquents.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="2233" data-end="4154">
<thead data-start="2233" data-end="2271">
<tr data-start="2233" data-end="2271">
<th class="last:pe-10" data-start="2233" data-end="2242" data-col-size="md">Erreur</th>
<th class="last:pe-10" data-start="2242" data-end="2259" data-col-size="md">Cause probable</th>
<th class="last:pe-10" data-start="2259" data-end="2271" data-col-size="md">Solution</th>
</tr>
</thead>
<tbody data-start="2286" data-end="4154">
<tr data-start="2286" data-end="2473">
<td data-start="2286" data-end="2335" data-col-size="md">
<blockquote><p><code data-start="2288" data-end="2334">swapon: /swapfile: insecure permissions 0644</code></p></blockquote>
</td>
<td data-start="2335" data-end="2395" data-col-size="md">
<blockquote><p>Le <strong data-start="2340" data-end="2356">fichier swap</strong> possède des permissions trop ouvertes</p></blockquote>
</td>
<td data-start="2395" data-end="2473" data-col-size="md">
<blockquote><p>Exécuter <code data-start="2406" data-end="2432">sudo chmod 600 /swapfile</code>, puis relancer <code data-start="2448" data-end="2471">sudo swapon /swapfile</code></p></blockquote>
</td>
</tr>
<tr data-start="2474" data-end="2651">
<td data-start="2474" data-end="2521" data-col-size="md">
<blockquote><p><code data-start="2476" data-end="2520">swapon: /swapfile: read swap header failed</code></p></blockquote>
</td>
<td data-start="2521" data-end="2585" data-col-size="md">
<blockquote><p>Le fichier n’a pas été formaté comme espace de <strong data-start="2570" data-end="2584">swap Linux</strong></p></blockquote>
</td>
<td data-start="2585" data-end="2651" data-col-size="md">
<blockquote><p>Exécuter <code data-start="2596" data-end="2619">sudo mkswap /swapfile</code>, puis <code data-start="2626" data-end="2649">sudo swapon /swapfile</code></p></blockquote>
</td>
</tr>
<tr data-start="2652" data-end="2832">
<td data-start="2652" data-end="2690" data-col-size="md">
<blockquote><p>Le swap disparaît après redémarrage</p></blockquote>
</td>
<td data-start="2690" data-end="2768" data-col-size="md">
<blockquote><p>La ligne <code data-start="2701" data-end="2729">/swapfile none swap sw 0 0</code> n’a pas été ajoutée dans <code data-start="2755" data-end="2767">/etc/fstab</code></p></blockquote>
</td>
<td data-start="2768" data-end="2832" data-col-size="md">
<blockquote><p>Vérifier <code data-start="2779" data-end="2791">/etc/fstab</code> et ajouter la ligne avec <code data-start="2817" data-end="2830">sudo tee -a</code></p></blockquote>
</td>
</tr>
<tr data-start="2833" data-end="3027">
<td data-start="2833" data-end="2861" data-col-size="md">
<blockquote><p><code data-start="2835" data-end="2847">/etc/fstab</code> a été écrasé</p></blockquote>
</td>
<td data-start="2861" data-end="2942" data-col-size="md">
<blockquote><p>La commande a été utilisée sans option d’ajout ou le fichier a été mal modifié</p></blockquote>
</td>
<td data-start="2942" data-end="3027" data-col-size="md">
<blockquote><p>Restaurer la sauvegarde avec <code data-start="2973" data-end="2989">/etc/fstab.bak</code> ou corriger le fichier manuellement</p></blockquote>
</td>
</tr>
<tr data-start="3028" data-end="3188">
<td data-start="3028" data-end="3085" data-col-size="md">
<blockquote><p><code data-start="3030" data-end="3084">fallocate: fallocate failed: Operation not supported</code></p></blockquote>
</td>
<td data-start="3085" data-end="3145" data-col-size="md">
<blockquote><p>Le système de fichiers ne prend pas en charge <code data-start="3133" data-end="3144">fallocate</code></p></blockquote>
</td>
<td data-start="3145" data-end="3188" data-col-size="md">
<blockquote><p>Utiliser <code data-start="3156" data-end="3160">dd</code> à la place de <code data-start="3175" data-end="3186">fallocate</code></p></blockquote>
</td>
</tr>
<tr data-start="3189" data-end="3354">
<td data-start="3189" data-end="3237" data-col-size="md">
<blockquote><p>Des <strong data-start="3195" data-end="3210">erreurs OOM</strong> persistent malgré le swap</p></blockquote>
</td>
<td data-start="3237" data-end="3284" data-col-size="md">
<blockquote><p>La <strong data-start="3242" data-end="3249">RAM</strong> est structurellement insuffisante</p></blockquote>
</td>
<td data-start="3284" data-end="3354" data-col-size="md">
<blockquote><p>Optimiser les services ou passer à un <strong data-start="3324" data-end="3331">VPS</strong> avec plus de mémoire</p></blockquote>
</td>
</tr>
<tr data-start="3355" data-end="3569">
<td data-start="3355" data-end="3408" data-col-size="md">
<blockquote><p><strong data-start="3357" data-end="3374">vm.swappiness</strong> revient à <code data-start="3385" data-end="3389">60</code> après redémarrage</p></blockquote>
</td>
<td data-start="3408" data-end="3485" data-col-size="md">
<blockquote><p>La modification a été appliquée uniquement avec <code data-start="3458" data-end="3466">sysctl</code>, sans persistance</p></blockquote>
</td>
<td data-start="3485" data-end="3569" data-col-size="md">
<blockquote><p>Ajouter <code data-start="3495" data-end="3513">vm.swappiness=10</code> dans <code data-start="3519" data-end="3537">/etc/sysctl.conf</code>, puis lancer <code data-start="3551" data-end="3567">sudo sysctl -p</code></p></blockquote>
</td>
</tr>
<tr data-start="3570" data-end="3768">
<td data-start="3570" data-end="3632" data-col-size="md">
<blockquote><p><strong data-start="3572" data-end="3597">vm.vfs_cache_pressure</strong> revient à <code data-start="3608" data-end="3613">100</code> après redémarrage</p></blockquote>
</td>
<td data-start="3632" data-end="3692" data-col-size="md">
<blockquote><p>Le réglage n’a pas été enregistré dans <code data-start="3673" data-end="3691">/etc/sysctl.conf</code></p></blockquote>
</td>
<td data-start="3692" data-end="3768" data-col-size="md">
<blockquote><p>Ajouter <code data-start="3702" data-end="3728">vm.vfs_cache_pressure=50</code>, puis appliquer avec <code data-start="3750" data-end="3766">sudo sysctl -p</code></p></blockquote>
</td>
</tr>
<tr data-start="3769" data-end="3961">
<td data-start="3769" data-end="3821" data-col-size="md">
<blockquote><p>Le serveur devient lent quand le swap est utilisé</p></blockquote>
</td>
<td data-start="3821" data-end="3887" data-col-size="md">
<blockquote><p>Le système dépend trop du disque au lieu de la <strong data-start="3870" data-end="3886">RAM physique</strong></p></blockquote>
</td>
<td data-start="3887" data-end="3961" data-col-size="md">
<blockquote><p>Surveiller les processus, réduire la charge ou augmenter la RAM du VPS</p></blockquote>
</td>
</tr>
<tr data-start="3962" data-end="4154">
<td data-start="3962" data-end="4005" data-col-size="md">
<blockquote><p><code data-start="3964" data-end="3973">swapoff</code> bloque ou provoque des erreurs</p></blockquote>
</td>
<td data-start="4005" data-end="4080" data-col-size="md">
<blockquote><p>La <strong data-start="4010" data-end="4028">RAM disponible</strong> est insuffisante pour rapatrier le contenu du swap</p></blockquote>
</td>
<td data-start="4080" data-end="4154" data-col-size="md">
<blockquote><p>Ne pas forcer <code data-start="4096" data-end="4105">swapoff</code> tant que la mémoire disponible est trop faible</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="4156" data-end="4247">Si vous rencontrez un blocage, commencez toujours par revenir aux commandes de diagnostic :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>free <span class="ͼ12">-h</span>
swapon <span class="ͼ12">--show</span>
df <span class="ͼ12">-h</span> /
<span class="ͼ10">cat</span> /proc/sys/vm/swappiness</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Ces quatre commandes permettent de comprendre rapidement si le problème vient du <strong data-start="4401" data-end="4409">swap</strong>, de l’espace disque, de la <strong data-start="4437" data-end="4455">RAM disponible</strong> ou des paramètres noyau.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4482" data-end="4634">En cas de doute après une modification de <code data-start="4524" data-end="4536">/etc/fstab</code>, ne redémarrez pas immédiatement le serveur. Vérifiez d’abord que la ligne ajoutée est correcte :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-3</span> /etc/fstab</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4668" data-end="4691">La ligne attendue est :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/swapfile none swap sw <span class="ͼy">0</span> <span class="ͼy">0</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4733" data-end="4964">Une erreur dans ce fichier peut rendre le démarrage plus difficile à diagnostiquer. C’est pourquoi la sauvegarde initiale de <code data-start="4858" data-end="4870">/etc/fstab</code> et la création d’un <strong data-start="4891" data-end="4907">snapshot VPS</strong> avant intervention sont de bonnes pratiques à conserver.</p>
<h2 data-section-id="kgs582" data-start="4966" data-end="4985">Bonnes pratiques</h2>
<p data-start="4987" data-end="5271">Pour tirer le meilleur parti d’un <strong data-start="5021" data-end="5039">swap VPS Linux</strong>, il ne suffit pas de créer un fichier et de l’activer. Il faut aussi adopter quelques bonnes pratiques pour préserver la stabilité du serveur, éviter les mauvaises manipulations et repérer à temps les signes d’un manque de <strong data-start="5263" data-end="5270">RAM</strong>.</p>
<p data-start="5273" data-end="5685">Avant toute modification sensible, créez un <strong data-start="5317" data-end="5329">snapshot</strong> depuis le <strong data-start="5340" data-end="5357">Panel KVM LWS</strong> si cette option est disponible pour votre offre. C’est particulièrement recommandé avant de modifier <code data-start="5459" data-end="5471">/etc/fstab</code>, car ce fichier intervient dans le démarrage du système. Vous pouvez également consulter le tutoriel LWS dédié à la sauvegarde automatique VPS pour <a title="Sauvegarde automatique VPS : rsync, cron et snapshots" href="https://tutoriels.lws.fr/vps/sauvegarde-automatique-vps">créer un snapshot avant de modifier la configuration système</a>.</p>
<p data-start="5687" data-end="6021">Évitez de configurer <strong data-start="5708" data-end="5725">vm.swappiness</strong> à <code data-start="5728" data-end="5731">0</code> sur un serveur de production, sauf cas très spécifique. Une valeur trop basse peut réduire l’utilisation du swap, mais elle peut aussi augmenter le risque d’<strong data-start="5889" data-end="5903">erreur OOM</strong> lors d’un pic mémoire brutal. Pour un <strong data-start="5942" data-end="5955">VPS Linux</strong>, une valeur autour de <strong data-start="5978" data-end="5984">10</strong> offre généralement un bon équilibre.</p>
<p data-start="6023" data-end="6521">Surveillez régulièrement la <strong data-start="6051" data-end="6058">RAM</strong> et le <strong data-start="6065" data-end="6073">swap</strong>, surtout après une mise en production, une migration, une mise à jour applicative ou l’ajout d’un nouveau service. Le <strong data-start="6192" data-end="6209">Panel KVM LWS</strong> peut servir de premier niveau de supervision, tandis que les commandes <code data-start="6281" data-end="6290">free -h</code>, <code data-start="6292" data-end="6298">htop</code> et <code data-start="6302" data-end="6317">swapon --show</code> permettent d’approfondir le diagnostic en SSH. Pour compléter ce suivi, vous pouvez aussi vous appuyer sur les bonnes pratiques utilisées pour <strong data-start="6461" data-end="6520">surveiller les ressources système avec le Panel KVM LWS</strong>.</p>
<p data-start="6523" data-end="6870">Ne considérez pas le swap comme une solution permanente à un manque de mémoire. Si le <strong data-start="6609" data-end="6617">swap</strong> est utilisé en permanence à un niveau élevé, par exemple plus de <strong data-start="6683" data-end="6691">50 %</strong> sur plusieurs jours, le VPS manque probablement de <strong data-start="6743" data-end="6759">RAM physique</strong>. Dans ce cas, il vaut mieux optimiser les services actifs ou envisager une offre <strong data-start="6841" data-end="6856">VPS KVM LWS</strong> plus adaptée.</p>
<p data-start="6872" data-end="6951">Documentez enfin votre configuration. Un simple fichier de notes peut suffire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">sudo</span> nano /root/README-swap.txt</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Vous pouvez y indiquer la taille du <strong data-start="7034" data-end="7050">fichier swap</strong>, les valeurs de <strong data-start="7067" data-end="7084">vm.swappiness</strong> et <strong data-start="7088" data-end="7113">vm.vfs_cache_pressure</strong>, la date de modification et la raison de cette configuration. Cette documentation sera utile lors d’une future maintenance, d’une migration ou d’un changement d’administrateur.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7292" data-end="7620">Si votre serveur héberge des applications gourmandes, comme des containers Docker ou des builds applicatifs, pensez aussi à <strong data-start="7416" data-end="7474">gérer la mémoire disponible pour vos containers Docker</strong> ou à dimensionner correctement la <strong data-start="7509" data-end="7516">RAM</strong> avant les tâches lourdes. Le swap doit accompagner une bonne stratégie de ressources, pas la remplacer.</p>
<div class="alert_tips"><p class="title">Trucs et astuces</p><hr><p><strong data-start="5369" data-end="5435">Votre VPS manque encore de RAM malgré un swap bien configuré ?</strong><br data-start="5435" data-end="5438" />Si le <strong data-start="5446" data-end="5464">swap VPS Linux</strong> est utilisé en permanence, la solution la plus fiable consiste souvent à passer à une offre avec davantage de <strong data-start="5575" data-end="5591">RAM physique</strong>. Les <strong data-start="5597" data-end="5612">VPS KVM LWS</strong> sont disponibles en plusieurs configurations, avec stockage <strong data-start="5673" data-end="5685">SSD NVMe</strong>, accès root complet et outils de supervision pour suivre les ressources serveur.<br data-start="5766" data-end="5769" /><a title="Voir les VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Découvrir les VPS KVM LWS</a>.</p></div>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="vi5xqa" data-start="93" data-end="106">FAQ</h2>
<p data-section-id="1ormm0o" data-start="108" data-end="167"><strong>Comment vérifier si mon VPS Linux a un swap configuré ?</strong></p>
<p data-start="169" data-end="481">Pour vérifier si un <strong data-start="189" data-end="202">VPS Linux</strong> dispose d’un <strong data-start="216" data-end="224">swap</strong> actif, utilisez la commande <code data-start="253" data-end="268">swapon --show</code>.<br data-start="269" data-end="272" />Si aucune ligne ne s’affiche, aucun <strong data-start="308" data-end="324">fichier swap</strong> ni aucune <strong data-start="335" data-end="353">partition swap</strong> n’est activé.<br data-start="367" data-end="370" />Vous pouvez aussi utiliser <code data-start="397" data-end="406">free -h</code> : si la ligne <strong data-start="421" data-end="429">Swap</strong> affiche <code data-start="438" data-end="442">0B</code>, le serveur n’a pas de swap configuré.</p>
<p data-section-id="1smknip" data-start="483" data-end="544"><strong>Quelle taille de swap créer sur un VPS avec 2 Go de RAM ?</strong></p>
<p data-start="546" data-end="836">Pour un <strong data-start="554" data-end="584">VPS Linux avec 2 Go de RAM</strong>, un <strong data-start="589" data-end="613">fichier swap de 2 Go</strong> est généralement suffisant.<br data-start="641" data-end="644" />Vous pouvez monter à <strong data-start="665" data-end="673">4 Go</strong> si le serveur exécute des tâches ponctuellement lourdes.<br data-start="730" data-end="733" />Le swap reste toutefois un filet de sécurité : il ne remplace pas une vraie montée en <strong data-start="819" data-end="835">RAM physique</strong>.</p>
<p data-section-id="40q2wz" data-start="838" data-end="923"><strong>Pourquoi mon VPS utilise-t-il le swap alors que de la RAM est encore disponible ?</strong></p>
<p data-start="925" data-end="1205">Ce comportement peut venir d’une valeur <strong data-start="965" data-end="982">vm.swappiness</strong> trop élevée.<br data-start="995" data-end="998" />Avec une valeur par défaut comme <strong data-start="1031" data-end="1037">60</strong>, Linux peut utiliser le <strong data-start="1062" data-end="1070">swap</strong> avant que la RAM soit réellement saturée.<br data-start="1112" data-end="1115" />Sur un <strong data-start="1122" data-end="1137">serveur VPS</strong>, une valeur autour de <strong data-start="1160" data-end="1166">10</strong> limite cette utilisation trop précoce.</p>
<p data-section-id="1b4tcfm" data-start="1207" data-end="1270"><strong>Quelle valeur de swappiness utiliser sur un serveur Linux ?</strong></p>
<p data-start="1272" data-end="1536">Sur un <strong data-start="1279" data-end="1296">serveur Linux</strong>, une valeur <strong data-start="1309" data-end="1329">vm.swappiness=10</strong> est généralement recommandée.<br data-start="1359" data-end="1362" />Elle permet de conserver le <strong data-start="1390" data-end="1398">swap</strong> comme sécurité, sans l’utiliser trop agressivement.<br data-start="1450" data-end="1453" />Évitez <code data-start="1460" data-end="1463">0</code> sauf cas spécifique, car cela peut augmenter le risque d’<strong data-start="1521" data-end="1535">erreur OOM</strong>.</p>
<p data-section-id="85seu0" data-start="1538" data-end="1594"><strong>Le swap sur SSD NVMe est-il adapté pour un VPS LWS ?</strong></p>
<p data-start="1596" data-end="1818">Oui, le <strong data-start="1604" data-end="1625">swap sur SSD NVMe</strong> est adapté sur un <strong data-start="1644" data-end="1655">VPS LWS</strong> comme filet de sécurité.<br data-start="1680" data-end="1683" />Il peut absorber des pics ponctuels de consommation mémoire.<br data-start="1743" data-end="1746" />Mais même sur SSD NVMe, le swap reste plus lent que la <strong data-start="1801" data-end="1817">RAM physique</strong>.</p>
<p data-section-id="7db6g6" data-start="1820" data-end="1897"><strong>Comment savoir si mon VPS manque de RAM et a besoin d&rsquo;une mise à niveau ?</strong></p>
<p data-start="1899" data-end="2206" data-is-last-node="" data-is-only-node="">Votre <strong data-start="1905" data-end="1918">VPS Linux</strong> manque probablement de <strong data-start="1942" data-end="1949">RAM</strong> si le swap est utilisé en permanence.<br data-start="1987" data-end="1990" />Des <strong data-start="1994" data-end="2009">erreurs OOM</strong>, une mémoire <strong data-start="2023" data-end="2036">available</strong> faible ou des ralentissements récurrents sont aussi des signaux d’alerte.<br data-start="2110" data-end="2113" />Dans ce cas, il faut optimiser les services ou passer à un VPS avec plus de <strong data-start="2189" data-end="2205">RAM physique</strong>.</p>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="8dtpi" data-start="0" data-end="13">Conclusion</h2>
<p data-start="15" data-end="373">Configurer un <strong data-start="29" data-end="47">swap VPS Linux</strong> est une étape simple, mais très utile pour améliorer la stabilité d’un serveur sous <strong data-start="132" data-end="142">Debian</strong> ou <strong data-start="146" data-end="156">Ubuntu</strong>. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />En créant un <strong data-start="171" data-end="187">fichier swap</strong>, en le sécurisant avec les bonnes permissions, puis en le rendant persistant dans <code data-start="270" data-end="282">/etc/fstab</code>, vous offrez au noyau Linux une marge de sécurité lorsque la <strong data-start="344" data-end="351">RAM</strong> devient insuffisante. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’optimisation de <strong data-start="393" data-end="410">vm.swappiness</strong> et de <strong data-start="417" data-end="442">vm.vfs_cache_pressure</strong> permet ensuite d’adapter le comportement mémoire à un usage serveur, en évitant une utilisation trop agressive du swap. Mais le swap ne remplace jamais la <strong data-start="598" data-end="614">RAM physique</strong> : s’il est utilisé en permanence, le VPS est probablement sous-dimensionné.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a5.png" alt="💥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> La bonne approche consiste donc à <strong data-start="726" data-end="735">créer</strong>, <strong data-start="737" data-end="750">optimiser</strong>, puis <strong data-start="757" data-end="771">surveiller</strong> régulièrement la mémoire avec <code data-start="802" data-end="811">free -h</code>, <code data-start="813" data-end="819">htop</code>, <code data-start="821" data-end="836">swapon --show</code> et le <strong data-start="843" data-end="860">Panel KVM LWS</strong>.</p>
<p data-start="15" data-end="373"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<p data-start="15" data-end="373"><em>Vous pourrez ainsi anticiper les saturations, limiter les <strong data-start="920" data-end="935">erreurs OOM</strong> et décider au bon moment si une montée en gamme vers un VPS avec plus de <strong data-start="1009" data-end="1016">RAM</strong> devient nécessaire. Et si vous avez des questions ou rencontrez des problèmes dans la gestion de votre VPS, n&rsquo;hésitez pas à nous contacter dans la section Commentaires.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/swap-vps-linux-optimiser-ram/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29666</post-id>	</item>
		<item>
		<title>Mettre à jour WordPress manuellement sur un VPS : procédure complète via SSH</title>
		<link>https://tutoriels.lws.fr/vps/mettre-a-jour-wordpress-manuellement-sur-vps</link>
					<comments>https://tutoriels.lws.fr/vps/mettre-a-jour-wordpress-manuellement-sur-vps#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Thu, 25 Jun 2026 11:50:53 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=29539</guid>

					<description><![CDATA[Mettre à jour WordPress est une opération courante, mais elle devient plus sensible lorsque le site est hébergé sur un serveur VPS et administré directement en SSH. ✨Dans certains cas, la mise à jour automatique depuis wp-admin échoue à cause d’un problème de droits, d’une connexion interrompue, d’un conflit avec une extension ou d’une erreur &#8230; <a href="https://tutoriels.lws.fr/vps/mettre-a-jour-wordpress-manuellement-sur-vps" class="more-link">Continue reading <span class="screen-reader-text">Mettre à jour WordPress manuellement sur un VPS : procédure complète via SSH</span></a>]]></description>
										<content:encoded><![CDATA[<p class="PDq2pG_selectionAnchorContainer" data-start="97" data-end="576">Mettre à jour WordPress est une opération courante, mais elle devient plus sensible lorsque le site est hébergé sur un <strong data-start="216" data-end="231">serveur VPS</strong> et administré directement en <strong data-start="261" data-end="268">SSH</strong>. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />Dans certains cas, la mise à jour automatique depuis <strong data-start="323" data-end="335">wp-admin</strong> échoue à cause d’un problème de droits, d’une connexion interrompue, d’un conflit avec une extension ou d’une erreur PHP. Dans d’autres situations, l’administrateur préfère simplement garder un contrôle précis sur chaque étape du processus.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p data-start="578" data-end="940">Si vous gérez un ou plusieurs sites WordPress avec un accès root, savoir <strong data-start="651" data-end="699">mettre à jour WordPress manuellement sur VPS</strong> est une compétence essentielle. Cette méthode permet d’intervenir même lorsque l’interface d’administration n’est plus accessible, tout en sécurisant l’opération grâce à des sauvegardes, des vérifications préalables et une procédure claire.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2 data-section-id="clqq33" data-start="942" data-end="966">Objectif</h2>
<p data-start="968" data-end="1336"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’objectif de ce tutoriel est de vous guider pas à pas pour <strong data-start="1028" data-end="1085">mettre à jour WordPress manuellement sur un VPS Linux</strong> à l’aide de la ligne de commande. Vous allez découvrir deux approches complémentaires : la méthode manuelle par remplacement des fichiers du core WordPress, puis la méthode avec <strong data-start="1264" data-end="1274">WP-CLI</strong>, plus rapide lorsque cet outil est disponible sur le serveur. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />Nous verrons également comment préparer correctement l’intervention : vérifier le chemin d’installation, contrôler la version PHP, créer une sauvegarde complète, protéger la base de données et prévoir un retour arrière en cas de problème. À la fin de ce guide, vous saurez effectuer une <strong data-start="1625" data-end="1654">mise à jour WordPress SSH</strong> de manière plus sûre, sans dépendre uniquement de l’interface graphique de WordPress.</p>
<h2 data-section-id="2gncjr" data-start="1742" data-end="1754">Pré-requis</h2>
<p data-start="1756" data-end="1976">Avant de commencer, vous devez disposer d’un environnement adapté. Vous aurez besoin des éléments suivants :</p>
<ul data-start="2021" data-end="2403">
<li data-section-id="mf0601" data-start="2021" data-end="2075">un <a title="VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">VPS Linux</a>, idéalement sous Ubuntu ou Debian ;</li>
<li data-section-id="1gabw45" data-start="2076" data-end="2152">un accès <strong data-start="2087" data-end="2099">SSH root</strong> ou un utilisateur disposant des droits nécessaires ;</li>
<li data-section-id="1bzyemb" data-start="2153" data-end="2212">une installation WordPress fonctionnelle sur le serveur ;</li>
<li data-section-id="42wln8" data-start="2213" data-end="2276">le chemin du site WordPress, par exemple <code data-start="2256" data-end="2274">/var/www/monsite</code> ;</li>
<li data-section-id="epmzo3" data-start="2277" data-end="2348">les informations de connexion à la base de données MySQL ou MariaDB ;</li>
<li data-section-id="19wuc4k" data-start="2349" data-end="2403">quelques notions de base en ligne de commande Linux;</li>
<li data-section-id="19wuc4k" data-start="2349" data-end="2403">faire une sauvegarde avant de démarrer la mise à jour;</li>
<li data-section-id="19wuc4k" data-start="2349" data-end="2403">Connaître l’utilisateur utilisé par le serveur web;</li>
</ul>
<h2 data-section-id="1oase7d" data-start="3218" data-end="3290">Pourquoi mettre à jour WordPress manuellement plutôt que via wp-admin</h2>
<p data-start="3292" data-end="3618">Dans la majorité des cas, la mise à jour de WordPress peut être effectuée depuis le tableau de bord, via la section « <strong data-start="3397" data-end="3431">Tableau de bord &gt; Mises à jour </strong>». Cette méthode reste la plus simple pour un utilisateur classique. Cependant, elle n’est pas toujours suffisante dans un contexte VPS, surtout lorsque vous gérez le serveur en autonomie.</p>
<p data-start="3620" data-end="3880">La <strong data-start="3623" data-end="3662">mise à jour WordPress sans wp-admin</strong> devient utile lorsque l’interface d’administration est inaccessible, instable ou bloquée par une erreur. Elle permet aussi de mieux contrôler les fichiers remplacés, les sauvegardes créées et les étapes de validation.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="3882" data-end="4678">
<thead data-start="3882" data-end="3929">
<tr data-start="3882" data-end="3929">
<th class="last:pe-10" data-start="3882" data-end="3894" data-col-size="md">Situation</th>
<th class="last:pe-10" data-start="3894" data-end="3929" data-col-size="lg">Pourquoi wp-admin ne suffit pas</th>
</tr>
</thead>
<tbody data-start="3940" data-end="4678">
<tr data-start="3940" data-end="4088">
<td data-start="3940" data-end="3974" data-col-size="md">
<blockquote><p>Mise à jour automatique échouée</p></blockquote>
</td>
<td data-start="3974" data-end="4088" data-col-size="lg">
<blockquote><p>Un problème de droits d’écriture, une connexion interrompue ou un conflit de plugin peut bloquer le processus.</p></blockquote>
</td>
</tr>
<tr data-start="4089" data-end="4217">
<td data-start="4089" data-end="4117" data-col-size="md">
<blockquote><p>Accès wp-admin impossible</p></blockquote>
</td>
<td data-start="4117" data-end="4217" data-col-size="lg">
<blockquote><p>Une erreur fatale PHP, un écran blanc ou un site cassé peut empêcher l’accès à l’administration.</p></blockquote>
</td>
</tr>
<tr data-start="4218" data-end="4373">
<td data-start="4218" data-end="4262" data-col-size="md">
<blockquote><p>Plusieurs sites WordPress sur le même VPS</p></blockquote>
</td>
<td data-start="4262" data-end="4373" data-col-size="lg">
<blockquote><p>La ligne de commande permet d’aller plus vite que des mises à jour répétées dans chaque interface wp-admin.</p></blockquote>
</td>
</tr>
<tr data-start="4374" data-end="4522">
<td data-start="4374" data-end="4401" data-col-size="md">
<blockquote><p>Besoin de contrôle total</p></blockquote>
</td>
<td data-start="4401" data-end="4522" data-col-size="lg">
<blockquote><p>L’administrateur VPS peut valider chaque étape : sauvegarde, remplacement des fichiers, permissions, base de données.</p></blockquote>
</td>
</tr>
<tr data-start="4523" data-end="4678">
<td data-start="4523" data-end="4546" data-col-size="md">
<blockquote><p>Architecture avancée</p></blockquote>
</td>
<td data-start="4546" data-end="4678" data-col-size="lg">
<blockquote><p>Un site WordPress multisite, un déploiement Git ou une configuration personnalisée peut nécessiter une procédure plus maîtrisée.</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="4680" data-end="4725">Ce tutoriel couvre deux méthodes principales.</p>
<ul>
<li data-start="4727" data-end="5089">La première consiste à effectuer un <strong data-start="4763" data-end="4795">wordpress core update manuel</strong> par remplacement des fichiers. Elle repose sur le téléchargement de la dernière version de WordPress, le remplacement des dossiers <code data-start="4927" data-end="4937">wp-admin</code> et <code data-start="4941" data-end="4954">wp-includes</code>, puis la mise à jour éventuelle de la base de données.</li>
<li data-start="5091" data-end="5368">La seconde méthode utilise <strong data-start="5118" data-end="5128">WP-CLI</strong>, l’outil officiel permettant de gérer WordPress en ligne de commande. Elle est souvent plus rapide et réduit le risque d’erreur humaine, car les commandes <code data-start="5284" data-end="5300">wp core update</code> et <code data-start="5304" data-end="5323">wp core update-db</code> automatisent une grande partie du processus.</li>
</ul>
<p data-start="5370" data-end="5741">En revanche, ce guide ne traite pas de l’installation initiale de WP-CLI, ni de la mise à jour détaillée des thèmes et extensions. Ces opérations suivent une logique proche, mais elles méritent un traitement séparé. Pour une mise à jour classique depuis l’interface WordPress ou par FTP, vous pouvez vous référer à <a title="Comment mettre à jour WordPress (manuellement ou automatiquement)" href="https://tutoriels.lws.fr/wordpress/mettre-a-jour-wordpress">la méthode de mise à jour classique via wp-admin et FTP</a>.</p>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="7202cw" data-start="0" data-end="55">Vérifier les pré-requis techniques avant de commencer</h2>
<p data-start="57" data-end="354">Avant de lancer une <strong data-start="77" data-end="106">mise à jour WordPress SSH</strong>, prenez quelques minutes pour vérifier l’environnement du serveur. Cette étape permet d’éviter les erreurs les plus courantes :</p>
<ul>
<li data-start="57" data-end="354">mauvais chemin d’installation,</li>
<li data-start="57" data-end="354">version PHP incompatible,</li>
<li data-start="57" data-end="354">espace disque insuffisant ou version WordPress mal identifiée.</li>
</ul>
<p data-start="356" data-end="593">Toutes les commandes suivantes sont à exécuter depuis votre <strong data-start="416" data-end="429">VPS Linux</strong>, en SSH. Adaptez systématiquement les chemins à votre propre installation. Dans les exemples, le site WordPress est supposé être installé dans le dossier suivant :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/var/www/monsite</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Si votre site se trouve dans un autre répertoire, remplacez ce chemin dans toutes les commandes du tutoriel.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h3 data-section-id="1qonz41" data-start="735" data-end="790">1. Identifier le chemin d&rsquo;installation WordPress</h3>
<p data-start="792" data-end="1045">Pour <strong data-start="797" data-end="845">mettre à jour WordPress manuellement sur VPS</strong>, vous devez d’abord connaître le dossier exact dans lequel WordPress est installé. Ce dossier contient notamment les répertoires <code data-start="975" data-end="985">wp-admin</code>, <code data-start="987" data-end="1000">wp-includes</code>, <code data-start="1002" data-end="1014">wp-content</code> et le fichier <code data-start="1029" data-end="1044">wp-config.php</code>.</p>
<p data-start="1047" data-end="1158">Si vous ne connaissez pas le chemin du site, vous pouvez rechercher le fichier <code data-start="1126" data-end="1141">wp-config.php</code> sur le serveur :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">find</span> / <span class="ͼ12">-name</span> <span class="ͼz">"wp-config.php"</span> <span class="ͼy">2</span>&gt;/dev/null</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Cette commande parcourt le serveur à la recherche des fichiers nommés <code data-start="1284" data-end="1299">wp-config.php</code>. La partie <code data-start="1311" data-end="1324">2&gt;/dev/null</code> permet de masquer les messages d’erreur liés aux répertoires auxquels l’utilisateur n’a pas accès.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1425" data-end="1455">Exemple de résultat possible :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/var/www/monsite/wp-config.php</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Dans cet exemple, le chemin d’installation WordPress est donc :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/var/www/monsite</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1596" data-end="1793">Notez ce chemin avant de continuer. Une erreur de répertoire peut entraîner la modification du mauvais site, surtout si plusieurs installations WordPress sont hébergées sur le même <strong data-start="1777" data-end="1792">serveur VPS</strong>.</p>
<h3 data-section-id="33kmwl" data-start="1795" data-end="1835">2. Vérifier la version PHP active</h3>
<p data-start="1837" data-end="2142">WordPress dépend de <strong data-start="1857" data-end="1864">PHP</strong> pour fonctionner. Avant une mise à jour du core, il est donc indispensable de vérifier la version PHP active sur le serveur. Une version trop ancienne peut provoquer des erreurs après la mise à jour, notamment avec certains thèmes, extensions ou versions majeures de WordPress.</p>
<p data-start="2144" data-end="2175">Exécutez la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>php <span class="ͼ12">-v</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2197" data-end="2247">Vous obtiendrez un résultat similaire à celui-ci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>PHP <span class="ͼy">8</span>.2.12 (cli) (built: Nov <span class="ͼy">24</span> <span class="ͼy">2025</span> <span class="ͼy">12</span>:00:00)
Copyright (c) The PHP Group
Zend Engine v4.2.12</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div><img class="aligncenter size-full wp-image-29552"  alt="Vérifier la version PHP active" width="1018" height="878" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/verifier-la-version-de-php-sur-un-VPS-KVM-LWS.webp"></div>
<div class="">Cette commande indique la version PHP utilisée en ligne de commande. Attention toutefois : sur certains VPS, la version PHP utilisée par le terminal peut être différente de celle utilisée par Apache, Nginx ou PHP-FPM pour afficher le site. Si votre serveur utilise plusieurs versions de PHP, vérifiez également la configuration du vhost, de PHP-FPM ou de votre panel d’administration.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2743" data-end="2998"><div class="bborder blue">Avant une <strong data-start="2753" data-end="2789">mise à jour majeure de WordPress</strong>, consultez toujours les prérequis officiels WordPress afin de confirmer la version PHP minimale recommandée. Si votre version PHP est trop ancienne, mettez-la à jour avant de remplacer les fichiers WordPress.</div></p>
<h3 data-section-id="8xeezj" data-start="3000" data-end="3045">3. Vérifier l&rsquo;espace disque disponible</h3>
<p data-start="3047" data-end="3349">Une <strong data-start="3051" data-end="3085">mise à jour manuelle WordPress</strong> nécessite suffisamment d’espace disque pour télécharger l’archive, la décompresser, conserver temporairement les anciens dossiers et créer des sauvegardes. Si le disque est presque plein, la copie des fichiers peut échouer ou produire une installation incomplète.</p>
<p data-start="3351" data-end="3407">Vérifiez l’espace disponible avec la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>df <span class="ͼ12">-h</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3428" data-end="3449">Exemple de résultat :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   18G   20G  <span class="ͼy">48</span>% /
tmpfs           <span class="ͼy">2</span>.0G     <span class="ͼy">0</span>  <span class="ͼy">2</span>.0G   <span class="ͼy">0</span>% /tmp</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div><img class="aligncenter size-full wp-image-29553"  alt="Vérifier l'espace disque disponible" width="1017" height="878" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/verifier-lespace-disque-sur-un-VPS-KVM-LWS.webp"></div>
<div class="">La colonne importante est <code data-start="3622" data-end="3629">Avail</code>, qui indique l’espace encore disponible. Vérifiez surtout la partition qui contient votre site WordPress, généralement <code data-start="3749" data-end="3752">/</code>, <code data-start="3754" data-end="3760">/var</code> ou <code data-start="3764" data-end="3771">/home</code> selon la configuration du VPS.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3804" data-end="4077">Si l’espace disponible est faible, supprimez d’abord les anciennes archives inutiles, les sauvegardes obsolètes ou les fichiers temporaires. Ne commencez pas un <strong data-start="3965" data-end="3997">wordpress core update manuel</strong> sur un serveur saturé : une copie interrompue peut rendre le site inaccessible.</p>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="ixmb31" data-start="0" data-end="64">4. Identifier la version WordPress actuellement installée</h3>
<p data-start="66" data-end="341">Avant de remplacer les fichiers du core, vérifiez la <strong data-start="119" data-end="163">version WordPress actuellement installée</strong>. Cette information permet de savoir si la mise à jour est mineure ou majeure, et d’anticiper d’éventuels changements de compatibilité avec PHP, le thème ou certaines extensions.</p>
<p data-start="343" data-end="446">Depuis le serveur, vous pouvez consulter le fichier <code data-start="395" data-end="408">version.php</code> situé dans le dossier <code data-start="431" data-end="444">wp-includes</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">grep</span> <span class="ͼz">"wp_version ="</span> /var/www/monsite/wp-includes/version.php</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="522" data-end="543">Exemple de résultat :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ11">$wp_version</span> <span class="ͼv">=</span> <span class="ͼz">'6.8.1'</span>;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="581" data-end="804">Cette commande ne modifie rien sur le site. Elle lit simplement la valeur de version déclarée par WordPress. Si vous gérez plusieurs sites sur le même <strong data-start="732" data-end="739">VPS</strong>, exécutez cette vérification dans chaque installation concernée.</p>
<p data-start="806" data-end="901">Vous pouvez également obtenir cette information avec <strong data-start="859" data-end="869">WP-CLI</strong>, si l’outil est déjà installé :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www/monsite
wp core version</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Cette seconde méthode sera surtout utile dans la partie consacrée à la <strong data-start="1023" data-end="1060">mise à jour WordPress avec WP-CLI</strong>.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h2 data-section-id="ggep83" data-start="1063" data-end="1139">Créer un snapshot LWS et une sauvegarde complète avant toute manipulation</h2>
<p data-start="1141" data-end="1495">Avant de <strong data-start="1150" data-end="1201">mettre à jour WordPress manuellement sur un VPS</strong>, la sauvegarde est une étape indispensable. Une mise à jour du core modifie des fichiers essentiels comme <code data-start="1308" data-end="1318">wp-admin</code>, <code data-start="1320" data-end="1333">wp-includes</code> et plusieurs fichiers PHP situés à la racine du site. Une erreur de commande, un mauvais chemin ou un conflit après mise à jour peut rendre le site inaccessible.</p>
<p data-start="1497" data-end="1647">L’objectif est donc simple : pouvoir revenir rapidement à l’état précédent si la mise à jour échoue. Pour cela, combinez idéalement deux protections :</p>
<ul data-start="1649" data-end="1797">
<li data-section-id="l9snus" data-start="1649" data-end="1711">un <strong data-start="1654" data-end="1670">snapshot VPS</strong>, qui capture l’état complet du serveur ;</li>
<li data-section-id="157hfzl" data-start="1712" data-end="1797">une <strong data-start="1718" data-end="1751">sauvegarde WordPress complète</strong>, incluant les fichiers et la base de données.</li>
</ul>
<p data-start="1799" data-end="2046">Le snapshot est très pratique en cas de problème global sur le serveur. La sauvegarde fichiers/base de données est plus précise si vous souhaitez restaurer uniquement le site concerné. Ces deux approches ne se remplacent pas : elles se complètent.</p>
<h3 data-section-id="h8ajxr" data-start="2048" data-end="2107">1. Snapshot LWS Panel KVM (recommandé en complément)</h3>
<p data-start="2109" data-end="2363">Si votre site est hébergé sur un <strong data-start="2142" data-end="2157">VPS KVM LWS</strong>, commencez par créer un snapshot depuis le panel. Cette opération permet de conserver une image complète du VPS à un instant donné : système, fichiers, configuration serveur, sites web et bases de données.</p>
<p data-start="2365" data-end="2411">Depuis votre espace client, rendez-vous dans la section « <strong data-start="2413" data-end="2462">LWS Panel KVM &gt; Snapshots &gt; Créer un snapshot </strong>».</p>
<p data-start="2365" data-end="2411"><img class="aligncenter wp-image-29546 size-full"  alt="Créer un snapshot sur un VPS KVM LWS" width="1259" height="724" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/creer-un-snapshot-2.webp"></p>
<p data-start="2464" data-end="2519">Donnez un nom explicite à votre snapshot, par exemple « <strong>Snapshot_1</strong>« . Evidement, vous pouvez trouver une combinaison alphanumérique qui vous convient le mieux.</p>
<p data-start="2464" data-end="2519"><img class="aligncenter wp-image-29547 size-full"  alt="Processus de création de snapshot sur un VPS KVM LWS" width="1158" height="728" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Fenetre-de-creation-de-snapshot.webp"></p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="">
<div class="">L’intérêt du snapshot est sa rapidité de restauration. Si la <strong data-start="2634" data-end="2668">mise à jour WordPress manuelle</strong> provoque une erreur importante, vous pouvez restaurer le VPS dans l’état exact où il se trouvait avant l’intervention. C’est particulièrement utile lorsque vous administrez un site en production, un WooCommerce ou plusieurs sites WordPress sur le même serveur.</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2931" data-end="3227"><div class="alert_warning">Attention toutefois : un snapshot ne dispense pas d’une sauvegarde classique. Il restaure l’ensemble du VPS, ce qui peut être moins adapté si d’autres sites ou services ont évolué entre-temps. Pour cette raison, conservez aussi une sauvegarde dédiée du dossier WordPress et de sa base de données.</div></p>
<p data-start="2931" data-end="3227"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h3 data-section-id="3utyug" data-start="3229" data-end="3272">2. Sauvegarde des fichiers WordPress</h3>
<p data-start="3274" data-end="3530">La première sauvegarde à créer concerne les <strong data-start="3318" data-end="3340">fichiers WordPress</strong>. Elle doit inclure le core, le dossier <code data-start="3380" data-end="3392">wp-content</code>, les thèmes, les extensions, les médias, le fichier <code data-start="3445" data-end="3460">wp-config.php</code> et les éventuels fichiers personnalisés présents à la racine du site.</p>
<p data-start="3532" data-end="3629">Dans cet exemple, le site est situé dans <code data-start="3573" data-end="3591">/var/www/monsite</code>. Placez-vous dans le dossier parent :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3656" data-end="3702"><img class="aligncenter size-full wp-image-29554"  alt="se mettre dans le répertoire racine" width="1019" height="876" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/se-mettre-dans-le-repertoire-racine.webp"></p>
<p data-start="3656" data-end="3702">Créez ensuite une archive compressée du site :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tar <span class="ͼ12">-czvf</span> monsite-backup-$(date +%F).tar.gz monsite/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3770" data-end="3846">Cette commande génère une archive nommée avec la date du jour, par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>monsite-backup-2026-06-24.tar.gz</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3894" data-end="3943">Vérifiez ensuite que le fichier a bien été créé :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> monsite-backup-*.tar.gz</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3989" data-end="4327">Cette sauvegarde vous permettra de restaurer rapidement les fichiers si une erreur survient pendant le <strong data-start="4092" data-end="4131">remplacement des fichiers WordPress</strong>. Elle est particulièrement importante pour protéger le dossier <code data-start="4195" data-end="4207">wp-content</code>, qui contient les éléments spécifiques de votre site : thème actif, extensions, images, documents et personnalisations.</p>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="6m8b07" data-start="0" data-end="42">3. Sauvegarde de la base de données</h3>
<p data-start="44" data-end="320">La sauvegarde des fichiers ne suffit pas. WordPress stocke une grande partie du contenu du site dans sa <strong data-start="148" data-end="184">base de données MySQL ou MariaDB</strong> : articles, pages, réglages, comptes utilisateurs, options du thème, paramètres des extensions et commandes WooCommerce le cas échéant.</p>
<p data-start="322" data-end="431">Avant toute <strong data-start="334" data-end="368">mise à jour WordPress manuelle</strong>, vous devez donc exporter la base de données associée au site.</p>
<p data-start="433" data-end="591">Les identifiants de connexion se trouvent dans le fichier <code data-start="491" data-end="506">wp-config.php</code>, situé à la racine de votre installation WordPress. Vous pouvez les consulter avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">grep</span> <span class="ͼz">"DB_"</span> /var/www/monsite/wp-config.php</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="648" data-end="696">Vous verrez notamment les constantes suivantes :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<pre class="cm-scroller"><code>define( 'DB_NAME', 'nom_de_la_bdd' );
define( 'DB_USER', 'utilisateur_bdd' );
define( 'DB_PASSWORD', 'mot_de_passe' );
define( 'DB_HOST', 'localhost' );</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Créez ensuite un dossier de sauvegarde si nécessaire :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">mkdir</span> <span class="ͼ12">-p</span> /root/backups</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="955" data-end="1006">Puis exportez la base de données avec <code data-start="993" data-end="1004">mysqldump</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>mysqldump <span class="ͼ12">--user</span><span class="ͼv">=</span>utilisateur_bdd <span class="ͼ12">--password</span><span class="ͼv">=</span>mot_de_passe nom_de_la_bdd \
  <span class="ͼ12">--single-transaction</span> &gt; /root/backups/monsite-bdd-$(date +%F).sql</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1161" data-end="1329">L’option <code data-start="1170" data-end="1192">--single-transaction</code> permet de réaliser une sauvegarde plus propre pour les bases utilisant InnoDB, sans verrouiller inutilement les tables pendant l’export.</p>
<p data-start="1331" data-end="1386">Vérifiez ensuite que le fichier SQL a bien été généré :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /root/backups/monsite-bdd-*.sql</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1440" data-end="1748">Pour des raisons de sécurité, évitez autant que possible de laisser le mot de passe MySQL en clair dans l’historique Bash. Sur un serveur administré régulièrement, il est préférable d’utiliser un fichier <code data-start="1644" data-end="1653">.my.cnf</code> protégé, afin d’exécuter <code data-start="1679" data-end="1690">mysqldump</code> sans saisir le mot de passe directement dans la commande.</p>
<p data-start="1750" data-end="1922">À ce stade, vous disposez de trois protections complémentaires : un <strong data-start="1818" data-end="1834">snapshot VPS</strong>, une sauvegarde des <strong data-start="1855" data-end="1877">fichiers WordPress</strong> et une sauvegarde de la <strong data-start="1902" data-end="1921">base de données</strong>.</p>
<p data-start="1750" data-end="1922"><div class="alert_more_info"><p class="title">Plus d'informations</p><hr><p><strong data-start="1926" data-end="1992">Besoin d’un VPS pensé pour l’administration WordPress en SSH ? </strong>Les <strong data-start="2001" data-end="2016">VPS KVM LWS</strong> permettent de créer des snapshots avant toute opération sensible, avec une restauration possible depuis le Panel KVM. C’est une sécurité supplémentaire très utile avant de <strong data-start="2189" data-end="2237">mettre à jour WordPress manuellement sur VPS</strong>.<br data-start="2238" data-end="2241" /><a title="Voir les VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Voir les VPS KVM LWS</a>.</p></div></p>
<h2 data-section-id="16xpvzd" data-start="2302" data-end="2366">Méthode 1 : Mise à jour manuelle par remplacement de fichiers</h2>
<p data-start="2368" data-end="2740">La première méthode consiste à remplacer manuellement les fichiers du <strong data-start="2438" data-end="2456">core WordPress</strong> depuis le terminal. C’est la méthode la plus universelle, car elle ne dépend pas de l’accès à <strong data-start="2551" data-end="2563">wp-admin</strong>. Elle peut donc être utilisée lorsqu’une mise à jour automatique a échoué, lorsque l’administration WordPress est inaccessible ou lorsque vous souhaitez contrôler chaque étape.</p>
<p data-start="2742" data-end="2766">Le principe est simple :</p>
<ul data-start="2768" data-end="3105">
<li data-section-id="hl5ani" data-start="2768" data-end="2813">télécharger la dernière archive WordPress ;</li>
<li data-section-id="1dq77x3" data-start="2814" data-end="2852">décompresser les nouveaux fichiers ;</li>
<li data-section-id="1l4q54d" data-start="2853" data-end="2907">remplacer les dossiers <code data-start="2878" data-end="2888">wp-admin</code> et <code data-start="2892" data-end="2905">wp-includes</code> ;</li>
<li data-section-id="16hyyaz" data-start="2908" data-end="2971">fusionner prudemment <code data-start="2931" data-end="2943">wp-content</code> sans écraser vos contenus ;</li>
<li data-section-id="fzael0" data-start="2972" data-end="3012">copier les fichiers PHP de la racine ;</li>
<li data-section-id="fs1cmc" data-start="3013" data-end="3041">corriger les permissions ;</li>
<li data-section-id="mknfoy" data-start="3042" data-end="3105">finaliser la mise à jour de la base de données si nécessaire.</li>
</ul>
<p data-start="3107" data-end="3443">Cette méthode demande de la rigueur. Vous devez toujours vérifier les chemins avant d’exécuter une commande de copie ou de suppression. Une erreur sur le dossier <code data-start="3269" data-end="3281">wp-content</code> peut entraîner la perte de thèmes, extensions ou médias personnalisés. C’est pour cette raison que la sauvegarde réalisée à l’étape précédente est indispensable.</p>
<h3 data-section-id="1k86ddr" data-start="3445" data-end="3499">1. Télécharger la dernière version de WordPress</h3>
<p data-start="3501" data-end="3652">Commencez par vous placer dans un dossier temporaire. Cela évite de mélanger les fichiers d’installation avec les fichiers de votre site en production.</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /tmp</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3675" data-end="3739">Téléchargez ensuite la dernière version française de WordPress :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">wget</span> https://fr.wordpress.org/latest-fr_FR.zip</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3801" data-end="3985">Cette archive contient les fichiers WordPress à jour en français. Si votre site utilise la version internationale en anglais, vous pouvez utiliser l’archive officielle correspondante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">wget</span> https://wordpress.org/latest.zip</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4038" data-end="4219">Dans le cadre d’un site français, l’URL <code data-start="4078" data-end="4113">fr.wordpress.org/latest-fr_FR.zip</code> est généralement la plus adaptée. Elle permet de récupérer directement la version localisée de WordPress.</p>
<p data-start="4221" data-end="4288">Après le téléchargement, vérifiez que le fichier est bien présent :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> latest-fr_FR.zip</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4327" data-end="4483">Si la commande <code data-start="4342" data-end="4348">wget</code> n’est pas installée sur votre VPS, vous pouvez l’ajouter avec le gestionnaire de paquets de votre distribution. Sur Debian ou Ubuntu :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>apt update
apt install <span class="ͼ10">wget</span> unzip <span class="ͼ12">-y</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4535" data-end="4624">L’outil <code data-start="4543" data-end="4550">unzip</code> sera également nécessaire à l’étape suivante pour décompresser l’archive.</p>
<h3 data-section-id="10r8er1" data-start="4626" data-end="4658">2. Décompresser l&rsquo;archive</h3>
<p data-start="4660" data-end="4736">Une fois l’archive téléchargée, décompressez-la dans le dossier temporaire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>unzip latest-fr_FR.zip</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4774" data-end="4919">Cette commande crée un nouveau dossier nommé <code data-start="4819" data-end="4830">wordpress</code> dans <code data-start="4836" data-end="4842">/tmp</code>. Ce dossier contient les fichiers propres de la dernière version WordPress :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /tmp/wordpress</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4956" data-end="5013">Vous devez y retrouver les éléments principaux suivants :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp-admin
wp-content
wp-includes
index.php
wp-config-sample.php
wp-login.php</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">À ce stade, ne copiez encore rien dans votre site en production. Le dossier <code data-start="5180" data-end="5196">/tmp/wordpress</code> sert uniquement de source propre pour récupérer les nouveaux fichiers du <strong data-start="5270" data-end="5288">core WordPress</strong>.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5291" data-end="5475">La suite de la procédure consistera à préparer le site, activer temporairement le <strong data-start="5373" data-end="5393">mode maintenance</strong>, puis remplacer les fichiers nécessaires sans écraser les éléments personnalisés.</p>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="um1sxn" data-start="0" data-end="72">3. Mettre le site en mode maintenance (optionnel mais recommandé)</h3>
<p data-start="74" data-end="314">Avant de remplacer les fichiers du <strong data-start="109" data-end="127">core WordPress</strong>, il est préférable de placer temporairement le site en <strong data-start="183" data-end="203">mode maintenance</strong>. Cette étape évite qu’un visiteur ou un administrateur interagisse avec le site pendant la copie des fichiers.</p>
<p data-start="316" data-end="377">Placez-vous dans le dossier de votre installation WordPress :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www/monsite</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="412" data-end="453">Créez ensuite le fichier <code data-start="437" data-end="451">.maintenance</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">touch</span> .maintenance
<span class="ͼ10">echo</span> <span class="ͼz">'&lt;?php $upgrading = time(); ?&gt;'</span> &gt; .maintenance</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="539" data-end="742">Ce fichier indique à WordPress qu’une opération de maintenance est en cours. Les visiteurs verront alors un message temporaire au lieu d’accéder à un site potentiellement instable pendant la mise à jour.</p>
<p data-start="744" data-end="804">Cette étape est particulièrement recommandée si vous gérez :</p>
<ul data-start="806" data-end="999">
<li data-section-id="2yb6ma" data-start="806" data-end="841">un site avec beaucoup de trafic ;</li>
<li data-section-id="ca98pv" data-start="842" data-end="874">une boutique <strong data-start="857" data-end="872">WooCommerce</strong> ;</li>
<li data-section-id="1idm4rs" data-start="875" data-end="930">un site avec formulaire de contact ou espace membre ;</li>
<li data-section-id="51iwuh" data-start="931" data-end="999">une installation WordPress utilisée par plusieurs administrateurs.</li>
</ul>
<p data-start="1001" data-end="1221">Le mode maintenance doit rester actif uniquement le temps du remplacement des fichiers. Une fois la <strong data-start="1101" data-end="1135">mise à jour WordPress manuelle</strong> terminée, vous devrez supprimer ce fichier pour rendre le site de nouveau accessible.</p>
<h3 data-section-id="19n39fn" data-start="1223" data-end="1306">4. Renommer les anciens dossiers core (au lieu de les supprimer directement)</h3>
<p data-start="1308" data-end="1543">La procédure manuelle de mise à jour consiste à remplacer les dossiers <code data-start="1379" data-end="1389">wp-admin</code> et <code data-start="1393" data-end="1406">wp-includes</code>. Ces deux dossiers font partie du <strong data-start="1441" data-end="1459">core WordPress</strong>. Ils ne contiennent normalement pas vos médias, thèmes ou extensions personnalisés.</p>
<p data-start="1545" data-end="1766">Par précaution, il est préférable de <strong data-start="1582" data-end="1615">renommer les anciens dossiers</strong> plutôt que de les supprimer immédiatement. Cette méthode vous laisse une possibilité de retour arrière rapide si une erreur survient pendant la copie.</p>
<p data-start="1768" data-end="1801">Depuis le dossier de votre site :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www/monsite</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1836" data-end="1875">Renommez les deux dossiers principaux :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">mv</span> wp-admin wp-admin-old
<span class="ͼ10">mv</span> wp-includes wp-includes-old</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1946" data-end="2161">Après cette opération, votre site ne peut plus fonctionner correctement tant que les nouveaux dossiers n’ont pas été copiés. C’est normal : vous êtes dans une phase intermédiaire de la <strong data-start="2131" data-end="2160">mise à jour WordPress SSH</strong>.</p>
<p data-start="2163" data-end="2237">Vous pouvez vérifier que les anciens dossiers ont bien été renommés avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2259" data-end="2287">Vous devez voir apparaître :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp-admin-old
wp-includes-old</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2331" data-end="2571">Ne renommez pas le dossier <code data-start="2358" data-end="2370">wp-content</code>. Ce dossier contient les éléments spécifiques de votre site : <strong data-start="2433" data-end="2444">plugins</strong>, <strong data-start="2446" data-end="2456">thèmes</strong>, <strong data-start="2458" data-end="2468">médias</strong>, traductions, caches et fichiers personnalisés. Il doit être conservé avec une attention particulière.</p>
<h3 data-section-id="2ugz9t" data-start="2573" data-end="2616">5. Copier les nouveaux dossiers core</h3>
<p data-start="2618" data-end="2789">Une fois les anciens dossiers renommés, vous pouvez copier les nouveaux dossiers <code data-start="2699" data-end="2709">wp-admin</code> et <code data-start="2713" data-end="2726">wp-includes</code> depuis l’archive WordPress décompressée dans <code data-start="2772" data-end="2788">/tmp/wordpress</code>.</p>
<p data-start="2791" data-end="2825">Exécutez les commandes suivantes :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cp</span> <span class="ͼ12">-r</span> /tmp/wordpress/wp-admin /var/www/monsite/
<span class="ͼ10">cp</span> <span class="ͼ12">-r</span> /tmp/wordpress/wp-includes /var/www/monsite/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Ces commandes copient les dossiers propres de la dernière version WordPress dans votre installation existante. Elles remplacent donc les éléments essentiels du <strong data-start="3099" data-end="3117">core WordPress</strong>, sans toucher au dossier <code data-start="3143" data-end="3155">wp-content</code>.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3158" data-end="3221">Vérifiez ensuite que les nouveaux dossiers sont bien présents :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /var/www/monsite/wp-admin
<span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /var/www/monsite/wp-includes</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3305" data-end="3457">Si les dossiers sont vides ou absents, n’allez pas plus loin. Revenez à l’étape précédente, vérifiez le chemin <code data-start="3416" data-end="3432">/tmp/wordpress</code>, puis relancez la copie.</p>
<p data-start="3459" data-end="3715">Cette étape est simple, mais elle demande de la précision. Sur un <strong data-start="3525" data-end="3538">VPS Linux</strong>, une commande exécutée dans le mauvais répertoire peut modifier une autre installation WordPress. Vérifiez toujours le chemin complet avant de copier ou supprimer des fichiers.</p>
<h3 data-section-id="jiimgq" data-start="3717" data-end="3802">6. Fusionner le dossier wp-content (sans écraser les thèmes/plugins existants)</h3>
<p data-start="3804" data-end="4040">Le dossier <code data-start="3815" data-end="3827">wp-content</code> est le point le plus sensible d’une <strong data-start="3864" data-end="3898">mise à jour WordPress manuelle</strong>. Il contient les fichiers propres à votre site : thèmes, extensions, médias, traductions, fichiers de cache et personnalisations éventuelles.</p>
<p data-start="4042" data-end="4267">Vous ne devez jamais supprimer entièrement ce dossier dans le cadre d’une mise à jour du core. L’objectif est seulement de fusionner les éventuels fichiers standards fournis par WordPress, sans écraser vos éléments existants.</p>
<p data-start="4269" data-end="4300">Utilisez la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cp</span> <span class="ͼ12">-rn</span> /tmp/wordpress/wp-content/* /var/www/monsite/wp-content/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4379" data-end="4531">L’option importante est <code data-start="4403" data-end="4407">-n</code>, qui signifie <strong data-start="4422" data-end="4436">no-clobber</strong>. Elle empêche la commande de remplacer un fichier déjà présent dans le dossier de destination.</p>
<p data-start="4533" data-end="4570">Concrètement, cette commande permet :</p>
<ul data-start="4572" data-end="4812">
<li data-section-id="qmvjd" data-start="4572" data-end="4618">d’ajouter les fichiers standards manquants ;</li>
<li data-section-id="1jrciaf" data-start="4619" data-end="4671">de conserver vos <strong data-start="4638" data-end="4659">plugins WordPress</strong> existants ;</li>
<li data-section-id="1cgmsjn" data-start="4672" data-end="4720">de conserver votre <strong data-start="4693" data-end="4712">thème WordPress</strong> actif ;</li>
<li data-section-id="1j7j1xz" data-start="4721" data-end="4753">de ne pas écraser vos médias ;</li>
<li data-section-id="yddv70" data-start="4754" data-end="4812">de limiter le risque de perte de fichiers personnalisés.</li>
</ul>
<p data-start="4814" data-end="4858">N’utilisez pas une commande comme celle-ci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">rm</span> <span class="ͼ12">-rf</span> /var/www/monsite/wp-content</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4908" data-end="4970">Et évitez également une synchronisation destructrice du type :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>rsync <span class="ͼ12">-av</span> <span class="ͼ12">--delete</span> /tmp/wordpress/wp-content/ /var/www/monsite/wp-content/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Ces commandes peuvent supprimer vos thèmes, vos extensions ou vos médias. Dans une procédure de <strong data-start="5156" data-end="5188">wordpress core update manuel</strong>, le dossier <code data-start="5201" data-end="5213">wp-content</code> doit être traité comme un dossier à préserver, pas comme un dossier à remplacer.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="877qks" data-start="0" data-end="54">7. Copier les fichiers individuels de la racine</h3>
<p data-start="56" data-end="289">Après avoir remplacé les dossiers <code data-start="90" data-end="100">wp-admin</code> et <code data-start="104" data-end="117">wp-includes</code>, vous devez copier les fichiers WordPress situés à la racine de l’archive téléchargée. Ces fichiers font partie du <strong data-start="233" data-end="251">core WordPress</strong> et doivent être mis à jour eux aussi.</p>
<p data-start="291" data-end="353">Depuis votre <strong data-start="304" data-end="317">VPS Linux</strong>, exécutez les commandes suivantes :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cp</span> /tmp/wordpress/wp-*.php /var/www/monsite/
<span class="ͼ10">cp</span> /tmp/wordpress/index.php /var/www/monsite/
<span class="ͼ10">cp</span> /tmp/wordpress/xmlrpc.php /var/www/monsite/ <span class="ͼy">2</span>&gt;/dev/null</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Ces commandes copient les <strong>fichiers PHP principaux de WordPress</strong> vers votre installation existante. Le <code data-start="619" data-end="632">2&gt;/dev/null</code> sur <code data-start="637" data-end="649">xmlrpc.php</code> évite simplement d’afficher une erreur si ce fichier n’est pas présent dans l’archive ou si votre installation ne l’utilise pas.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="780" data-end="983">Le point de vigilance essentiel concerne le fichier <code data-start="832" data-end="847">wp-config.php</code>. Ce fichier ne doit jamais être écrasé pendant une <strong data-start="899" data-end="933">mise à jour WordPress manuelle</strong>. Il contient les informations sensibles du site :</p>
<ul data-start="985" data-end="1209">
<li data-section-id="rrjmjk" data-start="985" data-end="1043">les identifiants de connexion à la <strong data-start="1022" data-end="1041">base de données</strong> ;</li>
<li data-section-id="3vaeny" data-start="1044" data-end="1078">les clés de sécurité WordPress ;</li>
<li data-section-id="13f40nw" data-start="1079" data-end="1104">le préfixe des tables ;</li>
<li data-section-id="1gnalnc" data-start="1105" data-end="1144">certaines constantes personnalisées ;</li>
<li data-section-id="sjwh09" data-start="1145" data-end="1209">des réglages propres à votre serveur ou à votre environnement.</li>
</ul>
<p data-start="1211" data-end="1424">L’archive WordPress contient un fichier nommé <code data-start="1257" data-end="1279">wp-config-sample.php</code>, mais pas votre fichier <code data-start="1304" data-end="1319">wp-config.php</code> personnalisé. Vous ne devez donc pas copier ce fichier exemple par-dessus votre configuration existante.</p>
<p data-start="1426" data-end="1493">Après la copie, vérifiez que <code data-start="1455" data-end="1470">wp-config.php</code> est toujours présent :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /var/www/monsite/wp-config.php</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1546" data-end="1630">Vous pouvez également contrôler rapidement son contenu sans l’afficher entièrement :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">grep</span> <span class="ͼz">"DB_NAME"</span> /var/www/monsite/wp-config.php</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1691" data-end="1848">Si le fichier <code data-start="1705" data-end="1720">wp-config.php</code> a été supprimé ou modifié par erreur, restaurez-le immédiatement depuis la <strong data-start="1796" data-end="1820">sauvegarde WordPress</strong> créée avant l’intervention.</p>
<h3 data-section-id="tsh699" data-start="1850" data-end="1896">8. Corriger les permissions de fichiers</h3>
<p data-start="1898" data-end="2194">Après le remplacement des fichiers, il est important de vérifier les <strong data-start="1967" data-end="1992">permissions WordPress</strong>. Des permissions incorrectes peuvent provoquer plusieurs problèmes : erreur 500, page blanche, impossibilité de téléverser des médias, échec des mises à jour futures ou blocage de certaines extensions.</p>
<p data-start="2196" data-end="2373">Sur une configuration Debian ou Ubuntu classique avec Apache ou Nginx, l’utilisateur du serveur web est souvent <code data-start="2308" data-end="2318">www-data</code>. Vous pouvez alors appliquer les commandes suivantes :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">chown</span> <span class="ͼ12">-R</span> www-data:www-data /var/www/monsite
<span class="ͼ10">find</span> /var/www/monsite <span class="ͼ12">-type</span> d <span class="ͼ12">-exec</span> <span class="ͼ10">chmod</span> <span class="ͼy">755</span> {} \;
<span class="ͼ10">find</span> /var/www/monsite <span class="ͼ12">-type</span> f <span class="ͼ12">-exec</span> <span class="ͼ10">chmod</span> <span class="ͼy">644</span> {} \;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">La commande <code data-start="2548" data-end="2555">chown</code> attribue les fichiers à l’utilisateur et au groupe du serveur web. Les commandes <code data-start="2637" data-end="2644">chmod</code> appliquent ensuite des droits standards :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<ul data-start="2688" data-end="2742">
<li data-section-id="q6z29s" data-start="2688" data-end="2715"><code data-start="2690" data-end="2695">755</code> pour les dossiers ;</li>
<li data-section-id="1qpl5wb" data-start="2716" data-end="2742"><code data-start="2718" data-end="2723">644</code> pour les fichiers.</li>
</ul>
<p data-start="2744" data-end="3040">Ces valeurs conviennent à de nombreuses installations WordPress, mais elles doivent être adaptées si votre serveur utilise une configuration spécifique. Par exemple, certains environnements utilisent un utilisateur différent, comme <code data-start="2976" data-end="2983">nginx</code>, <code data-start="2985" data-end="2993">apache</code> ou un utilisateur système dédié à chaque site.</p>
<p data-start="3042" data-end="3144">Pour identifier l’utilisateur utilisé par le serveur web, vous pouvez consulter les processus actifs :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ps</span> aux | <span class="ͼ10">grep</span> <span class="ͼ12">-E</span> <span class="ͼz">'apache|nginx|php-fpm'</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3199" data-end="3509">Ne donnez pas des permissions trop larges comme <code data-start="3247" data-end="3252">777</code> sur l’ensemble du site. Même si cela peut sembler résoudre un problème de droits à court terme, cette pratique affaiblit fortement la <strong data-start="3387" data-end="3409">sécurité WordPress</strong>. Un site correctement administré sur <strong data-start="3447" data-end="3454">VPS</strong> doit conserver des permissions strictes et cohérentes.</p>
<p data-start="3511" data-end="3622">Une fois les permissions corrigées, vous pouvez poursuivre la finalisation de la <strong data-start="3592" data-end="3621">mise à jour WordPress SSH</strong>.</p>
<h3 data-section-id="1e6qn9n" data-start="3624" data-end="3661">9. Retirer le mode maintenance</h3>
<p data-start="3663" data-end="3853">Si vous avez activé le <strong data-start="3686" data-end="3716">mode maintenance WordPress</strong> à l’étape 6.3, vous devez maintenant le désactiver. Pour cela, supprimez simplement le fichier <code data-start="3812" data-end="3826">.maintenance</code> placé à la racine du site.</p>
<p data-start="3855" data-end="3886">Exécutez la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">rm</span> /var/www/monsite/.maintenance</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3934" data-end="3993">Vous pouvez ensuite vérifier que le fichier n’existe plus :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-la</span> /var/www/monsite | <span class="ͼ10">grep</span> maintenance</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4051" data-end="4114">Si aucun résultat ne s’affiche, le fichier a bien été supprimé.</p>
<p data-start="4116" data-end="4391">Cette étape est importante, car un fichier <code data-start="4159" data-end="4173">.maintenance</code> oublié peut afficher un message de maintenance permanent aux visiteurs. C’est aussi l’une des causes fréquentes du message indiquant qu’une <strong data-start="4314" data-end="4348">mise à jour WordPress a échoué</strong> ou qu’une opération est toujours en cours.</p>
<p data-start="4393" data-end="4657">Après suppression, ouvrez le site dans un navigateur. Il est possible que WordPress vous demande encore de finaliser la mise à jour de la base de données. C’est normal si la nouvelle version du core introduit des changements dans la structure interne de WordPress.</p>
<h3 data-section-id="tlgzyz" data-start="4659" data-end="4716">10. Finaliser la mise à jour de la base de données</h3>
<p data-start="4718" data-end="4919">Une fois les fichiers remplacés, WordPress peut avoir besoin de mettre à jour sa <strong data-start="4799" data-end="4818">base de données</strong>. Cette étape dépend de la version installée précédemment et de la version vers laquelle vous migrez.</p>
<p data-start="4921" data-end="4966">Connectez-vous à l’administration WordPress :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://monsite.fr/wp-admin/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5010" data-end="5182">Si une mise à jour de la base de données est nécessaire, WordPress affiche automatiquement un écran dédié. Il vous proposera de lancer la procédure via une URL de ce type :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://monsite.fr/wp-admin/upgrade.php</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5237" data-end="5411">Cliquez sur le bouton proposé pour finaliser l’opération. Cette étape met à jour les tables WordPress afin qu’elles correspondent à la nouvelle version du <strong data-start="5392" data-end="5410">core WordPress</strong>.</p>
<p data-start="5413" data-end="5640">Si vous ne pouvez pas accéder à <strong data-start="5445" data-end="5457">wp-admin</strong>, vous pouvez tenter d’ouvrir directement l’URL <code data-start="5505" data-end="5518">upgrade.php</code> dans le navigateur. Assurez-vous toutefois que le site répond correctement et que les permissions ont bien été corrigées.</p>
<p data-start="5642" data-end="5759">Après la mise à jour de la base de données, reconnectez-vous au tableau de bord WordPress. Rendez-vous ensuite dans la section « <strong data-start="5761" data-end="5795">Tableau de bord &gt; Mises à jour </strong>».</p>
<p data-start="5797" data-end="5878">Vous pourrez y vérifier que WordPress indique bien la dernière version installée.</p>
<p data-start="5880" data-end="6124">Cette étape marque la fin fonctionnelle du <strong data-start="5923" data-end="5969">remplacement manuel des fichiers WordPress</strong>. Il reste toutefois une dernière opération importante : nettoyer les anciens dossiers uniquement après avoir confirmé que le site fonctionne correctement.</p>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="1xocxu3" data-start="0" data-end="72">11. Nettoyer les anciens dossiers une fois la mise à jour validée</h3>
<p data-start="74" data-end="357">Une fois la <strong data-start="86" data-end="120">mise à jour WordPress manuelle</strong> terminée, ne supprimez pas immédiatement les anciens dossiers si vous n’avez pas encore testé le site. Commencez par vérifier que le front-end fonctionne, que l’accès à <strong data-start="290" data-end="302">wp-admin</strong> est possible et qu’aucune erreur visible ne s’affiche.</p>
<p data-start="359" data-end="437">Lorsque tout est validé, vous pouvez supprimer les anciens dossiers renommés :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">rm</span> <span class="ͼ12">-rf</span> /var/www/monsite/wp-admin-old
<span class="ͼ10">rm</span> <span class="ͼ12">-rf</span> /var/www/monsite/wp-includes-old</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="529" data-end="604">Vous pouvez également nettoyer les fichiers temporaires créés dans <code data-start="596" data-end="602">/tmp</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">rm</span> <span class="ͼ12">-rf</span> /tmp/wordpress
<span class="ͼ10">rm</span> <span class="ͼ12">-f</span> /tmp/latest-fr_FR.zip</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="669" data-end="827">Ce nettoyage évite de conserver inutilement des fichiers obsolètes sur le serveur. Il réduit aussi les risques de confusion lors d’une prochaine intervention.</p>
<p data-start="829" data-end="1063"><div class="alert_warning">Attention : ne lancez ces commandes qu’après avoir vérifié que vous êtes dans le bon environnement et que la <strong data-start="938" data-end="968">nouvelle version WordPress</strong> fonctionne correctement. Une suppression trop rapide peut compliquer un retour arrière manuel.</div></p>
<p data-start="829" data-end="1063"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="1vv12gt" data-start="1065" data-end="1130">Méthode 2 : Mise à jour via WP-CLI (recommandée si disponible)</h2>
<p data-start="1132" data-end="1486">La deuxième méthode consiste à utiliser <strong data-start="1172" data-end="1182">WP-CLI</strong>, l’interface en ligne de commande officielle de WordPress. Si l’outil est installé sur votre VPS, il simplifie fortement la procédure. Au lieu de télécharger manuellement l’archive, de remplacer les dossiers et de copier les fichiers un par un, vous pouvez lancer la mise à jour avec quelques commandes.</p>
<p data-start="1488" data-end="1819">WP-CLI est particulièrement utile pour les administrateurs qui gèrent plusieurs sites WordPress sur le même <strong data-start="1596" data-end="1611">serveur VPS</strong>. Il permet de vérifier la version installée, rechercher les mises à jour disponibles, exporter la base de données, mettre à jour le core et finaliser la base de données sans passer par l’interface graphique.</p>
<p data-start="1821" data-end="2103">Cette méthode est souvent plus rapide et limite les erreurs humaines. Elle reste toutefois soumise aux mêmes règles de sécurité : avant toute commande de <strong data-start="1975" data-end="2007">wp-cli mise à jour WordPress</strong>, créez un <strong data-start="2018" data-end="2034">snapshot VPS</strong>, sauvegardez les fichiers importants et exportez la base de données.</p>
<p data-start="2105" data-end="2348">Si WP-CLI n’est pas encore installé sur votre serveur, vous pouvez suivre le tutoriel LWS dédié pour <a title="WP-CLI WordPress : gérer son site en ligne de commande en 2026" href="https://tutoriels.lws.fr/wordpress/wp-cli-wordpress-ligne-de-commande">installer WP-CLI sur votre VPS pour automatiser vos mises à jour.</a></p>
<h3 data-section-id="19s26zl" data-start="2350" data-end="2392">1. Vérifier que WP-CLI est installé</h3>
<p data-start="2394" data-end="2516">Pour commencer, connectez-vous en <strong data-start="2428" data-end="2435">SSH</strong> à votre VPS, puis vérifiez que WP-CLI est disponible avec la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp <span class="ͼ12">--info</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2541" data-end="2732">Si WP-CLI est installé, vous obtiendrez des informations sur l’environnement utilisé : version de WP-CLI, version PHP, système d’exploitation, chemin de l’exécutable et configuration chargée.</p>
<p data-start="2734" data-end="2762">Exemple de retour possible :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>OS:	Linux
Shell:	/bin/bash
PHP binary:	/usr/bin/php
PHP version:	<span class="ͼy">8</span>.2.12
WP-CLI version:	<span class="ͼy">2</span>.10.0</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Si la commande renvoie une erreur du type <code data-start="2914" data-end="2933">command not found</code>, cela signifie que WP-CLI n’est pas installé ou qu’il n’est pas disponible dans le <code data-start="3017" data-end="3023">PATH</code> de l’utilisateur courant.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3051" data-end="3258">Dans ce cas, installez d’abord WP-CLI avant de poursuivre avec cette méthode. Vous pouvez aussi revenir à la méthode précédente par <strong data-start="3183" data-end="3229">remplacement manuel des fichiers WordPress</strong>, qui fonctionne sans WP-CLI.</p>
<p data-start="3260" data-end="3452">Sur un VPS, il est fréquent d’exécuter certaines commandes en root. WP-CLI peut alors demander l’option <code data-start="3364" data-end="3378">--allow-root</code>. Utilisez-la avec prudence, uniquement si vous savez ce que vous faites :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp <span class="ͼ12">--info</span> <span class="ͼ12">--allow-root</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h3 data-section-id="r8sc9z" data-start="3490" data-end="3538">2. Se placer dans le répertoire WordPress</h3>
<p data-start="3540" data-end="3724">Avant d’exécuter une commande WP-CLI, placez-vous dans le dossier de l’installation WordPress concernée. WP-CLI doit détecter le fichier <code data-start="3677" data-end="3692">wp-config.php</code> pour savoir sur quel site agir.</p>
<p data-start="3726" data-end="3746">Dans notre exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www/monsite</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3781" data-end="3860">Vous pouvez ensuite vérifier que le fichier de configuration est bien présent :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> wp-config.php</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3896" data-end="4156">Si le fichier existe, vous êtes normalement dans le bon répertoire. Si vous gérez plusieurs sites sur le même <strong data-start="4006" data-end="4023">VPS WordPress</strong>, cette étape est essentielle. Une commande WP-CLI exécutée dans le mauvais dossier peut mettre à jour un autre site que celui prévu.</p>
<p data-start="4158" data-end="4241">Pour confirmer que WP-CLI détecte correctement l’installation, vous pouvez lancer :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core version</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4272" data-end="4338">Si vous êtes connecté en root et que WP-CLI le demande, utilisez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core version <span class="ͼ12">--allow-root</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4382" data-end="4510">Cette vérification confirme que WP-CLI communique bien avec votre installation WordPress avant de lancer une opération sensible.</p>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="1x8rdn8" data-start="0" data-end="76">3. Vérifier la version actuelle et la disponibilité d&rsquo;une mise à jour</h3>
<p data-start="78" data-end="232">Avant de lancer une <strong data-start="98" data-end="135">mise à jour WordPress avec WP-CLI</strong>, commencez par vérifier la version actuellement installée. Depuis le dossier du site, exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core version</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="263" data-end="323">Si vous utilisez WP-CLI en root, ajoutez l’option suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core version <span class="ͼ12">--allow-root</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="367" data-end="521">Cette commande affiche uniquement le numéro de version du <strong data-start="425" data-end="443">core WordPress</strong> installé. Elle permet de confirmer l’état de départ avant toute modification.</p>
<p data-start="523" data-end="575">Vérifiez ensuite si une mise à jour est disponible :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core check-update</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="611" data-end="821">Si WordPress est déjà à jour, WP-CLI l’indiquera clairement. Si une nouvelle version est disponible, la commande affichera les informations principales : version proposée, type de mise à jour et URL du package.</p>
<p data-start="823" data-end="1133">Cette étape est utile pour éviter de lancer une opération inutile. Elle permet aussi d’identifier si vous passez vers une <strong data-start="945" data-end="977">version majeure de WordPress</strong>, ce qui demande davantage de prudence. Dans ce cas, vérifiez la compatibilité de votre version PHP, de votre thème et de vos extensions avant de continuer.</p>
<p data-start="1135" data-end="1328">Sur un <strong data-start="1142" data-end="1159">VPS WordPress</strong>, cette vérification est particulièrement pratique si vous administrez plusieurs sites. Vous pouvez rapidement savoir quels sites nécessitent réellement une mise à jour.</p>
<h3 data-section-id="1c3mau1" data-start="1330" data-end="1416">4. Sauvegarder via WP-CLI (alternative aux commandes manuelles de la section 5)</h3>
<p data-start="1418" data-end="1660">WP-CLI permet également d’exporter la <strong data-start="1456" data-end="1485">base de données WordPress</strong> en une seule commande. Cette méthode peut remplacer la commande <code data-start="1550" data-end="1561">mysqldump</code> si WP-CLI est correctement configuré et si WordPress parvient à se connecter à la base de données.</p>
<p data-start="1662" data-end="1746">Depuis le dossier du site, créez d’abord un répertoire de sauvegarde si nécessaire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">mkdir</span> <span class="ͼ12">-p</span> /root/backups</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1784" data-end="1821">Exportez ensuite la base de données :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp db <span class="ͼv">export</span> /root/backups/monsite-bdd-$(date +%F).sql</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1891" data-end="1925">Avec l’option root si nécessaire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp db <span class="ͼv">export</span> /root/backups/monsite-bdd-$(date +%F).sql <span class="ͼ12">--allow-root</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2008" data-end="2133">Cette commande génère un fichier <code data-start="2041" data-end="2047">.sql</code> contenant les tables de votre site WordPress. Vérifiez que l’export a bien été créé :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /root/backups/monsite-bdd-*.sql</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2187" data-end="2460">Même avec WP-CLI, cette sauvegarde reste indispensable. Une <strong data-start="2247" data-end="2276">mise à jour WordPress SSH</strong> peut modifier la structure de la base de données, notamment lors d’un changement de version important. Sans export préalable, un retour arrière propre devient beaucoup plus difficile.</p>
<p data-start="2462" data-end="2593">Pour une sécurité maximale, conservez également la <strong data-start="2513" data-end="2550">sauvegarde des fichiers WordPress</strong> et le <strong data-start="2557" data-end="2573">snapshot VPS</strong> créés précédemment.</p>
<h3 data-section-id="13bi3pw" data-start="2595" data-end="2626">5. Lancer la mise à jour</h3>
<p data-start="2628" data-end="2760">Une fois les vérifications effectuées et la sauvegarde validée, vous pouvez lancer la <strong data-start="2714" data-end="2747">mise à jour du core WordPress</strong> avec WP-CLI.</p>
<p data-start="2762" data-end="2795">Depuis le dossier de votre site :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core update</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2825" data-end="2863">Si vous exécutez la commande en root :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core update <span class="ͼ12">--allow-root</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2906" data-end="3196">WP-CLI télécharge automatiquement la dernière version disponible, remplace les fichiers nécessaires et affiche un message de confirmation lorsque l’opération est terminée. Cette méthode évite de manipuler manuellement les dossiers <code data-start="3137" data-end="3147">wp-admin</code>, <code data-start="3149" data-end="3162">wp-includes</code> et les fichiers PHP de la racine.</p>
<p data-start="3198" data-end="3366">Pendant l’exécution, ne fermez pas votre session SSH et n’interrompez pas la commande. Une coupure au mauvais moment peut laisser l’installation dans un état incomplet.</p>
<p data-start="3368" data-end="3469">Si vous souhaitez mettre à jour vers une version précise, vous pouvez utiliser l’option <code data-start="3456" data-end="3467">--version</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core update <span class="ͼ12">--version</span><span class="ͼv">=</span><span class="ͼy">6</span>.8.1</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3515" data-end="3741">Cette option peut être utile dans un environnement de staging ou lors d’une intervention contrôlée. En production, privilégiez toujours une version stable compatible avec votre configuration PHP, votre thème et vos extensions.</p>
<h3 data-section-id="3qndv1" data-start="3743" data-end="3785">6. Mettre à jour la base de données</h3>
<p data-start="3787" data-end="3976">Après la mise à jour des fichiers du <strong data-start="3824" data-end="3842">core WordPress</strong>, il peut être nécessaire de mettre à jour la <strong data-start="3888" data-end="3907">base de données</strong>. Avec WP-CLI, cette étape se fait directement en ligne de commande :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core update-db</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4009" data-end="4043">Avec l’option root si nécessaire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core update-db <span class="ͼ12">--allow-root</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4089" data-end="4286">Cette commande applique les éventuelles modifications de structure ou de données attendues par la nouvelle version de WordPress. Elle remplace le passage manuel par l’écran <code data-start="4262" data-end="4285">/wp-admin/upgrade.php</code>.</p>
<p data-start="4288" data-end="4449">Si aucune mise à jour de base de données n’est nécessaire, WP-CLI l’indiquera. Dans le cas contraire, il exécutera l’opération et affichera un message de succès.</p>
<p data-start="4451" data-end="4746">Cette étape est importante : un site peut sembler fonctionner après le remplacement des fichiers, mais rester incomplet si la base de données n’a pas été finalisée. Cela peut provoquer des erreurs dans le tableau de bord, des comportements incohérents ou des messages de mise à jour persistants.</p>
<p data-start="4748" data-end="4940">Une fois cette commande exécutée, vous êtes proche de la fin de la <strong data-start="4815" data-end="4852">mise à jour WordPress avec WP-CLI</strong>. Il reste à contrôler la version installée et à vérifier le bon fonctionnement du site.</p>
<h3 class="PDq2pG_selectionAnchorContainer" data-section-id="ov340v" data-start="0" data-end="47">7. Vérifier la version après mise à jour</h3>
<p data-start="49" data-end="159">Une fois la <strong data-start="61" data-end="98">mise à jour WordPress avec WP-CLI</strong> terminée, vérifiez que la nouvelle version est bien active :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core version</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="190" data-end="224">Avec l’option root si nécessaire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core version <span class="ͼ12">--allow-root</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="268" data-end="353">Comparez le numéro affiché avec la version attendue. Vous pouvez également relancer :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>wp core check-update</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="389" data-end="488">Si WordPress indique qu’aucune mise à jour n’est disponible, le <strong data-start="453" data-end="471">core WordPress</strong> est bien à jour. Cette vérification est simple, mais importante. Elle confirme que la commande <code data-start="568" data-end="584">wp core update</code> s’est correctement appliquée et que le site utilise bien la version attendue.</p>
<p data-start="389" data-end="488">Pour les administrateurs qui gèrent plusieurs sites sur le même <strong data-start="727" data-end="734">VPS</strong>, cette commande peut aussi être intégrée dans un script Bash afin de contrôler rapidement toutes les installations WordPress présentes sur le serveur.</p>
<p data-start="389" data-end="488"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="12rt5lv" data-start="887" data-end="924">Vérification du bon fonctionnement</h2>
<p data-start="926" data-end="1150">Après avoir <strong data-start="938" data-end="983">mis à jour WordPress manuellement sur VPS</strong>, ne vous contentez pas d’un simple message de succès dans le terminal. Vous devez vérifier que le site fonctionne réellement, côté visiteur comme côté administration.</p>
<p data-start="1152" data-end="1472">Commencez par ouvrir le site en front-end. Vérifiez que la page d’accueil se charge correctement, sans <strong data-start="1255" data-end="1269">erreur PHP</strong>, sans écran blanc et sans message de maintenance persistant. Testez ensuite plusieurs pages importantes : page d’accueil, articles récents, page contact, formulaire, espace membre ou pages stratégiques.</p>
<p data-start="1474" data-end="1527">Connectez-vous ensuite à l’administration WordPress :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://monsite.fr/wp-admin/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1571" data-end="1787">Dans le tableau de bord, vérifiez que l’accès est normal et qu’aucun message critique ne s’affiche. Rendez-vous dans la suite « <strong data-start="1688" data-end="1722">Tableau de bord &gt; Mises à jour</strong> » pour confirmer que WordPress reconnaît bien la nouvelle version.</p>
<p data-start="1789" data-end="1865">Si vous utilisez <strong data-start="1806" data-end="1816">WP-CLI</strong>, vous pouvez aussi confirmer la version en SSH :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www/monsite
wp core version</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Contrôlez ensuite les extensions et le thème actif. Rendez-vous dans la section « <strong data-start="1985" data-end="2023">Extensions &gt; Extensions installées</strong> » et vérifiez qu’aucun plugin essentiel n’a été désactivé. Si le site utilise <strong data-start="2100" data-end="2115">WooCommerce</strong>, testez le tunnel d’achat complet : ajout au panier, page commande, choix du mode de paiement et validation jusqu’à l’étape autorisée.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2252" data-end="2410">Enfin, consultez les logs du serveur pour repérer d’éventuelles erreurs invisibles côté navigateur. Selon votre configuration, la commande peut ressembler à :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-f</span> /var/log/php-fpm/error.log</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2460" data-end="2464">ou :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-f</span> /var/log/apache2/error.log</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2514" data-end="2773">Adaptez le chemin des logs à votre configuration <strong data-start="2563" data-end="2573">Apache</strong>, <strong data-start="2575" data-end="2584">Nginx</strong> ou <strong data-start="2588" data-end="2599">PHP-FPM</strong>. Cette vérification permet de détecter rapidement une extension incompatible, une fonction PHP obsolète ou un problème de permissions après la <strong data-start="2743" data-end="2772">mise à jour WordPress SSH</strong>.</p>
<h2 data-section-id="1wbg0sh" data-start="2775" data-end="2814">Erreurs fréquentes et cas de blocage</h2>
<p data-start="2816" data-end="3102">Même en suivant une procédure propre, une <strong data-start="2858" data-end="2892">mise à jour WordPress manuelle</strong> peut rencontrer des blocages. Les causes les plus fréquentes sont liées aux permissions, aux extensions incompatibles, à un fichier <code data-start="3025" data-end="3039">.maintenance</code> oublié ou à une mauvaise manipulation du dossier <code data-start="3089" data-end="3101">wp-content</code>.</p>
<p data-start="3104" data-end="3164">Le tableau ci-dessous résume les principaux cas à connaître.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="3166" data-end="4373">
<thead data-start="3166" data-end="3204">
<tr data-start="3166" data-end="3204">
<th class="last:pe-10" data-start="3166" data-end="3175" data-col-size="md">Erreur</th>
<th class="last:pe-10" data-start="3175" data-end="3192" data-col-size="md">Cause probable</th>
<th class="last:pe-10" data-start="3192" data-end="3204" data-col-size="md">Solution</th>
</tr>
</thead>
<tbody data-start="3219" data-end="4373">
<tr data-start="3219" data-end="3410">
<td data-start="3219" data-end="3255" data-col-size="md">
<blockquote><p>Écran blanc après mise à jour</p></blockquote>
</td>
<td data-start="3255" data-end="3345" data-col-size="md">
<blockquote><p>Un plugin ou un thème est incompatible avec la nouvelle version de WordPress ou de PHP.</p></blockquote>
</td>
<td data-start="3345" data-end="3410" data-col-size="md">
<blockquote><p>Renommer temporairement le dossier du plugin suspect via SSH.</p></blockquote>
</td>
</tr>
<tr data-start="3411" data-end="3606">
<td data-start="3411" data-end="3462" data-col-size="md">
<blockquote><p>Message “Échec de la mise à jour” persistant</p></blockquote>
</td>
<td data-start="3462" data-end="3546" data-col-size="md">
<blockquote><p>Le fichier <code data-start="3475" data-end="3489">.maintenance</code> n’a pas été supprimé après une mise à jour interrompue.</p></blockquote>
</td>
<td data-start="3546" data-end="3606" data-col-size="md">
<blockquote><p>Supprimer le fichier <code data-start="3569" data-end="3583">.maintenance</code> à la racine du site.</p></blockquote>
</td>
</tr>
<tr data-start="3607" data-end="3807">
<td data-start="3607" data-end="3644" data-col-size="md">
<blockquote><p>wp-config.php écrasé ou absent</p></blockquote>
</td>
<td data-start="3644" data-end="3729" data-col-size="md">
<blockquote><p>Mauvaise copie des fichiers de la racine ou confusion avec <code data-start="3705" data-end="3727">wp-config-sample.php</code>.</p></blockquote>
</td>
<td data-start="3729" data-end="3807" data-col-size="md">
<blockquote><p>Restaurer <code data-start="3741" data-end="3756">wp-config.php</code> depuis la sauvegarde créée avant l’intervention.</p></blockquote>
</td>
</tr>
<tr data-start="3808" data-end="4008">
<td data-start="3808" data-end="3857" data-col-size="md">
<blockquote><p>Erreur 500 après remplacement des fichiers</p></blockquote>
</td>
<td data-start="3857" data-end="3921" data-col-size="md">
<blockquote><p>Permissions incorrectes ou propriétaire de fichiers inadapté.</p></blockquote>
</td>
<td data-start="3921" data-end="4008" data-col-size="md">
<blockquote><p>Reprendre les commandes <code data-start="3947" data-end="3954">chown</code> et <code data-start="3958" data-end="3965">chmod</code> selon l’utilisateur réel du serveur web.</p></blockquote>
</td>
</tr>
<tr data-start="4009" data-end="4199">
<td data-start="4009" data-end="4037" data-col-size="md">
<blockquote><p>wp core update échoue</p></blockquote>
</td>
<td data-start="4037" data-end="4113" data-col-size="md">
<blockquote><p>L’utilisateur exécutant WP-CLI n’a pas les droits d’écriture nécessaires.</p></blockquote>
</td>
<td data-start="4113" data-end="4199" data-col-size="md">
<blockquote><p>Vérifier les droits du dossier WordPress ou utiliser <code data-start="4168" data-end="4182">--allow-root</code> avec prudence.</p></blockquote>
</td>
</tr>
<tr data-start="4200" data-end="4373">
<td data-start="4200" data-end="4241" data-col-size="md">
<blockquote><p>Médias, thèmes ou plugins disparus</p></blockquote>
</td>
<td data-start="4241" data-end="4305" data-col-size="md">
<blockquote><p>Le dossier <code data-start="4254" data-end="4266">wp-content</code> a été écrasé au lieu d’être fusionné.</p></blockquote>
</td>
<td data-start="4305" data-end="4373" data-col-size="md">
<blockquote><p>Restaurer le dossier <code data-start="4328" data-end="4340">wp-content</code> depuis la sauvegarde fichiers.</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="4375" data-end="4469">Pour désactiver rapidement un plugin suspect sans accès à <strong data-start="4433" data-end="4445">wp-admin</strong>, renommez son dossier :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www/monsite
<span class="ͼ10">mv</span> wp-content/plugins/plugin-suspect wp-content/plugins/plugin-suspect-off</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4579" data-end="4736">Si le site redevient accessible, le plugin désactivé est probablement en cause. Vous pourrez ensuite le mettre à jour, le remplacer ou contacter son éditeur.</p>
<p data-start="4738" data-end="4787">Pour supprimer un fichier <code data-start="4764" data-end="4778">.maintenance</code> oublié :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">rm</span> /var/www/monsite/.maintenance</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4835" data-end="4914">Pour corriger des permissions classiques sur Debian ou Ubuntu avec <code data-start="4902" data-end="4912">www-data</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">chown</span> <span class="ͼ12">-R</span> www-data:www-data /var/www/monsite
<span class="ͼ10">find</span> /var/www/monsite <span class="ͼ12">-type</span> d <span class="ͼ12">-exec</span> <span class="ͼ10">chmod</span> <span class="ͼy">755</span> {} \;
<span class="ͼ10">find</span> /var/www/monsite <span class="ͼ12">-type</span> f <span class="ͼ12">-exec</span> <span class="ͼ10">chmod</span> <span class="ͼy">644</span> {} \;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5077" data-end="5292">L’objectif n’est pas de corriger au hasard, mais d’identifier la cause du blocage. Avant toute suppression importante, vérifiez toujours que votre <strong data-start="5224" data-end="5248">sauvegarde WordPress</strong> et votre <strong data-start="5258" data-end="5274">snapshot VPS</strong> sont disponibles.</p>
<h2 data-section-id="17fjudj" data-start="5294" data-end="5345">Revenir en arrière en cas de problème (rollback)</h2>
<p data-start="5347" data-end="5621">Si la <strong data-start="5353" data-end="5387">mise à jour WordPress manuelle</strong> provoque un problème bloquant, vous devez revenir à l’état précédent avec méthode. Le choix de la solution dépend du niveau de gravité : erreur limitée aux fichiers du core, site totalement inaccessible ou problème global sur le VPS.</p>
<p data-start="5623" data-end="5774">La solution la plus rapide consiste à restaurer le <strong data-start="5674" data-end="5700">snapshot LWS Panel KVM</strong> créé avant l’intervention. Depuis votre espace client, rendez-vous dans la section « <strong data-start="5776" data-end="5817">LWS Panel KVM &gt; Snapshots &gt; Restaurer </strong>».</p>
<p data-start="5623" data-end="5774"><img class="aligncenter wp-image-29549 size-full"  alt="Revenir en arrière en cas de problème (rollback) sur un VPS KVM" width="1200" height="683" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Restaurer-le-snapshot.webp"></p>
<p data-start="5819" data-end="6082">Cette option restaure l’<strong>état complet du VPS</strong> au moment du snapshot. Elle est particulièrement utile si plusieurs fichiers, services ou configurations ont été modifiés par erreur. En revanche, elle restaure tout le serveur, pas seulement le site WordPress concerné.</p>
<p data-start="5819" data-end="6082"><img class="aligncenter size-full wp-image-29548"  alt="Restauration en cours du VPS KVM LWS" width="1000" height="515" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Restauration-en-cours.webp"></p>
<p data-start="6084" data-end="6265">Si vous avez seulement besoin de revenir aux anciens dossiers du <strong data-start="6149" data-end="6167">core WordPress</strong>, et si vous ne les avez pas encore supprimés, vous pouvez restaurer <code data-start="6236" data-end="6246">wp-admin</code> et <code data-start="6250" data-end="6263">wp-includes</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www/monsite
<span class="ͼ10">rm</span> <span class="ͼ12">-rf</span> wp-admin wp-includes
<span class="ͼ10">mv</span> wp-admin-old wp-admin
<span class="ͼ10">mv</span> wp-includes-old wp-includes</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6384" data-end="6539">Cette méthode peut suffire si le problème vient du remplacement des fichiers WordPress et que la base de données n’a pas été modifiée de manière bloquante.</p>
<p data-start="6541" data-end="6680">Pour une restauration complète du site, restaurez les fichiers puis la base de données depuis les sauvegardes créées avant la mise à jour :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www
<span class="ͼ10">rm</span> <span class="ͼ12">-rf</span> monsite
tar <span class="ͼ12">-xzvf</span> monsite-backup-YYYY-MM-DD.tar.gz</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6765" data-end="6800">Puis restaurez la base de données :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>mysql <span class="ͼ12">--user</span><span class="ͼv">=</span>utilisateur_bdd <span class="ͼ12">--password</span><span class="ͼv">=</span>mot_de_passe nom_de_la_bdd &lt; /root/backups/monsite-bdd-YYYY-MM-DD.sql</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6925" data-end="7026">Remplacez <code data-start="6935" data-end="6947">YYYY-MM-DD</code>, <code data-start="6949" data-end="6966">utilisateur_bdd</code>, <code data-start="6968" data-end="6982">mot_de_passe</code> et <code data-start="6986" data-end="7001">nom_de_la_bdd</code> par vos propres valeurs.</p>
<p data-start="7028" data-end="7228">Pour aller plus loin, vous pouvez consulter le tutoriel LWS dédié pour <a title="Comment rétrograder WordPress ? Revenir à une version précédente" href="https://tutoriels.lws.fr/wordpress/retrograder-wordpress">revenir à une version antérieure de WordPress en cas de problème<strong>.</strong></a></p>
<h2 class="PDq2pG_selectionAnchorContainer" data-section-id="kgs582" data-start="0" data-end="19">Bonnes pratiques</h2>
<p data-start="21" data-end="327">Pour <strong data-start="26" data-end="74">mettre à jour WordPress manuellement sur VPS</strong> dans de bonnes conditions, adoptez une méthode stable et reproductible. Une mise à jour réussie ne repose pas seulement sur les commandes exécutées, mais aussi sur la préparation, les sauvegardes et les contrôles réalisés avant et après l’intervention.</p>
<p data-start="329" data-end="642">Commencez toujours par créer un <strong data-start="361" data-end="377">snapshot VPS</strong> avant toute manipulation. Même si vous avez déjà exporté les fichiers et la base de données, le snapshot reste une sécurité rapide à restaurer en cas de problème global sur le serveur. Sur un environnement de production, cette précaution doit devenir systématique.</p>
<p data-start="644" data-end="910">Testez aussi les mises à jour importantes sur un environnement de <strong data-start="710" data-end="721">staging</strong> avant de les appliquer au site principal. C’est particulièrement recommandé pour les sites WooCommerce, les sites à fort trafic ou les installations qui utilisent de nombreuses extensions.</p>
<p data-start="912" data-end="966">Avant chaque <strong data-start="925" data-end="954">mise à jour WordPress SSH</strong>, vérifiez :</p>
<ul data-start="968" data-end="1234">
<li data-section-id="reiy7y" data-start="968" data-end="1006">la compatibilité de la version PHP ;</li>
<li data-section-id="1b8bzf9" data-start="1007" data-end="1037">l’espace disque disponible ;</li>
<li data-section-id="1hwnl0i" data-start="1038" data-end="1087">la présence d’une sauvegarde fichiers récente ;</li>
<li data-section-id="5qwdmm" data-start="1088" data-end="1131">la présence d’un export SQL exploitable ;</li>
<li data-section-id="uy1zqs" data-start="1132" data-end="1176">la compatibilité du thème et des plugins ;</li>
<li data-section-id="4v3x1f" data-start="1177" data-end="1234">l’utilisateur réel du serveur web pour les permissions.</li>
</ul>
<p data-start="1236" data-end="1511">Privilégiez <strong data-start="1248" data-end="1258">WP-CLI</strong> dès qu’il est disponible. Les commandes <code data-start="1299" data-end="1315">wp core update</code> et <code data-start="1319" data-end="1338">wp core update-db</code> réduisent les manipulations manuelles et limitent les risques d’erreur sur les dossiers sensibles. En revanche, même avec WP-CLI, ne supprimez jamais l’étape de sauvegarde.</p>
<p data-start="1513" data-end="1752">Enfin, ne modifiez pas le dossier <code data-start="1547" data-end="1559">wp-content</code> sans précaution. Ce dossier contient les éléments personnalisés du site. Dans une <strong data-start="1642" data-end="1676">mise à jour manuelle WordPress</strong>, il doit être conservé, fusionné prudemment et jamais remplacé brutalement.</p>
<h2 data-section-id="vi5xqa" data-start="1754" data-end="1767">FAQ</h2>
<p data-section-id="u0hfz9" data-start="1769" data-end="1828"><strong>Peut-on mettre à jour WordPress sans accès à wp-admin ?</strong></p>
<p data-start="1830" data-end="2184">Oui. Il est possible de <strong data-start="1854" data-end="1895">mettre à jour WordPress sans wp-admin</strong> en passant par SSH sur un serveur VPS. Deux méthodes sont possibles : le remplacement manuel des fichiers du <strong data-start="2005" data-end="2023">core WordPress</strong> ou l’utilisation de <strong data-start="2044" data-end="2054">WP-CLI</strong>. Cette approche est utile lorsqu’une erreur PHP, un écran blanc ou une mise à jour interrompue bloque l’accès à l’administration.</p>
<p data-section-id="1781di4" data-start="2186" data-end="2269"><strong>Quelle est la différence entre la mise à jour manuelle par fichiers et WP-CLI ?</strong></p>
<p data-start="2271" data-end="2676">La méthode par fichiers consiste à télécharger WordPress, remplacer les dossiers <code data-start="2352" data-end="2362">wp-admin</code> et <code data-start="2366" data-end="2379">wp-includes</code>, puis copier les fichiers nécessaires à la racine. <strong data-start="2431" data-end="2441">WP-CLI</strong>, lui, automatise une grande partie du processus avec des commandes comme <code data-start="2515" data-end="2531">wp core update</code> et <code data-start="2535" data-end="2554">wp core update-db</code>. La méthode WP-CLI est généralement plus rapide, mais elle nécessite que l’outil soit installé et fonctionnel sur le VPS.</p>
<p data-section-id="1d89va6" data-start="2678" data-end="2782"><strong>Faut-il supprimer ou renommer les dossiers wp-admin et wp-includes lors d&rsquo;une mise à jour manuelle ?</strong></p>
<p data-start="2784" data-end="3079">Il est préférable de les <strong data-start="2809" data-end="2836">renommer temporairement</strong> plutôt que de les supprimer directement. Par exemple, vous pouvez renommer <code data-start="2912" data-end="2922">wp-admin</code> en <code data-start="2926" data-end="2940">wp-admin-old</code> et <code data-start="2944" data-end="2957">wp-includes</code> en <code data-start="2961" data-end="2978">wp-includes-old</code>. Cette précaution facilite un retour arrière rapide si la <strong data-start="3037" data-end="3071">mise à jour WordPress manuelle</strong> échoue.</p>
<p data-section-id="5mtlvm" data-start="3081" data-end="3160"><strong>Comment revenir en arrière si la mise à jour manuelle de WordPress échoue ?</strong></p>
<p data-start="3162" data-end="3447">Vous pouvez restaurer le <strong data-start="3187" data-end="3203">snapshot VPS</strong> créé avant l’intervention, remettre en place les anciens dossiers <code data-start="3270" data-end="3280">wp-admin</code> et <code data-start="3284" data-end="3297">wp-includes</code>, ou restaurer la sauvegarde complète des fichiers et de la base de données. Le choix dépend de la gravité du problème et des sauvegardes disponibles.</p>
<p data-section-id="3nnwww" data-start="3449" data-end="3494"><strong>WP-CLI est-il disponible sur un VPS LWS ?</strong></p>
<p data-start="3496" data-end="3759">Un <strong data-start="3499" data-end="3510">VPS LWS</strong> avec accès root permet d’installer et d’utiliser <strong data-start="3560" data-end="3570">WP-CLI</strong>. Selon l’image système ou la configuration choisie, l’outil peut nécessiter une installation manuelle. Avant de suivre la méthode WP-CLI, vérifiez sa présence avec la commande <code data-start="3747" data-end="3758">wp --info</code>.</p>
<p data-section-id="12oa72c" data-start="3761" data-end="3845"><strong>Le dossier wp-content est-il affecté par une mise à jour manuelle de WordPress ?</strong></p>
<p data-start="3847" data-end="4180">Le dossier <code data-start="3858" data-end="3870">wp-content</code> ne doit pas être remplacé entièrement. Il contient les <strong data-start="3926" data-end="3936">thèmes</strong>, <strong data-start="3938" data-end="3949">plugins</strong>, médias et fichiers personnalisés du site. Lors d’un <strong data-start="4003" data-end="4035">wordpress core update manuel</strong>, il faut uniquement fusionner les fichiers nécessaires avec prudence, par exemple avec <code data-start="4123" data-end="4131">cp -rn</code>, afin d’éviter d’écraser les contenus existants.</p>
<h2 data-section-id="8dtpi" data-start="7848" data-end="7861">Conclusion</h2>
<p data-start="7863" data-end="8195">Savoir <strong data-start="7870" data-end="7918">mettre à jour WordPress manuellement sur VPS</strong> permet de garder le contrôle lorsque l’interface wp-admin ne suffit plus. Avec une connexion <strong data-start="8012" data-end="8019">SSH</strong>, vous pouvez remplacer les fichiers du core, corriger les permissions, finaliser la base de données et résoudre une mise à jour bloquée sans dépendre de l’interface graphique.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> La clé reste la préparation : vérification du serveur, <strong data-start="8252" data-end="8268">snapshot VPS</strong>, sauvegarde des fichiers et export de la base de données. Pour les administrateurs réguliers, <strong data-start="8363" data-end="8373">WP-CLI</strong> représente ensuite la méthode la plus rapide et la plus fiable pour maintenir WordPress à jour.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f501.png" alt="🔁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> En appliquant ces bonnes pratiques, vous réduisez les risques d’interruption, protégez vos données et sécurisez durablement vos sites WordPress hébergés sur un <strong data-start="8631" data-end="8644">VPS Linux</strong>.</p>
<p data-start="7863" data-end="8195"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<p data-start="7863" data-end="8195"><em>Vous avez déjà réalisé une mise à jour WordPress manuelle sur un VPS ou rencontré un blocage pendant l’opération ? Partagez votre retour d’expérience en commentaire : vos questions et astuces pourront aider d’autres administrateurs WordPress.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/mettre-a-jour-wordpress-manuellement-sur-vps/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29539</post-id>	</item>
		<item>
		<title>Déployer une application Next.js sur VPS Linux : Node.js, PM2, Nginx et SSL</title>
		<link>https://tutoriels.lws.fr/vps/deployer-nextjs-sur-vps</link>
					<comments>https://tutoriels.lws.fr/vps/deployer-nextjs-sur-vps#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Thu, 18 Jun 2026 07:37:26 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=29478</guid>

					<description><![CDATA[Développer une application Next.js est souvent simple au départ : quelques pages, une API route, une authentification, puis progressivement un vrai projet prend forme. Le besoin change alors : vous ne voulez plus seulement tester votre application, mais la déployer en production sur une infrastructure fiable, maîtrisée et évolutive.✨Beaucoup de développeurs commencent avec Vercel ou &#8230; <a href="https://tutoriels.lws.fr/vps/deployer-nextjs-sur-vps" class="more-link">Continue reading <span class="screen-reader-text">Déployer une application Next.js sur VPS Linux : Node.js, PM2, Nginx et SSL</span></a>]]></description>
										<content:encoded><![CDATA[<p data-start="135" data-end="477">Développer une <strong data-start="150" data-end="173">application Next.js</strong> est souvent simple au départ : quelques pages, une API route, une authentification, puis progressivement un vrai projet prend forme. Le besoin change alors : vous ne voulez plus seulement tester votre application, mais la <strong data-start="396" data-end="422">déployer en production</strong> sur une infrastructure fiable, maîtrisée et évolutive.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />Beaucoup de développeurs commencent avec Vercel ou Netlify, puis rencontrent certaines limites : coût des offres payantes, <strong data-start="602" data-end="639">timeouts des fonctions serverless</strong>, besoin d’une base de données persistante, accès système limité ou volonté de garder un contrôle complet sur l’environnement serveur.</p>
<p data-start="135" data-end="477">Dans ce contexte, choisir un <strong data-start="803" data-end="816">VPS Linux</strong> devient une alternative solide pour héberger une application SaaS, un portfolio avancé, une plateforme e-commerce personnalisée ou une application full-stack basée sur <strong data-start="985" data-end="996">Next.js</strong>.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2 data-section-id="1fbt9uu" data-start="999" data-end="1022">Objectif</h2>
<p data-start="1024" data-end="1473"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’objectif de ce guide est de vous montrer comment <strong data-start="1075" data-end="1128">déployer une application Next.js sur un VPS Linux</strong> en suivant une méthode claire, reproductible et adaptée à un environnement de production. Nous allons partir d’un serveur Ubuntu ou Debian, installer <strong data-start="1279" data-end="1290">Node.js</strong>, préparer l’application avec le mode <strong data-start="1328" data-end="1342">standalone</strong>, gérer le processus Node avec <strong data-start="1373" data-end="1380">PM2</strong>, configurer <strong data-start="1393" data-end="1422">Nginx comme reverse proxy</strong>, puis activer un certificat <strong data-start="1451" data-end="1472">SSL Let’s Encrypt</strong>.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f512.png" alt="🔒" class="wp-smiley" style="height: 1em; max-height: 1em;" /> À la fin du tutoriel, votre application sera accessible en <strong data-start="1534" data-end="1543">HTTPS</strong> depuis un nom de domaine personnalisé. Elle pourra redémarrer automatiquement en cas de crash ou de reboot du serveur, ses logs seront consultables avec PM2, et les ressources du serveur pourront être surveillées depuis le <strong data-start="1767" data-end="1784">LWS Panel KVM</strong>.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4af.png" alt="💯" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2 data-section-id="2gncjr" data-start="3984" data-end="3996">Pré-requis</h2>
<p data-start="3998" data-end="4319">Avant de commencer, vous devez :</p>
<ul>
<li data-start="3998" data-end="4319">Disposer d’un <strong data-start="4043" data-end="4056">VPS Linux</strong> prêt à être configuré. Ce guide s’adresse principalement aux utilisateurs d’un <strong data-start="4136" data-end="4151">VPS KVM LWS</strong> sous Ubuntu 22.04, Ubuntu 24.04 ou Debian 12, avec un accès root en SSH. Les identifiants de connexion au serveur sont transmis après la livraison du VPS,</li>
<li data-start="3998" data-end="4319">Vous aurez également besoin d’un <strong data-start="4354" data-end="4372">nom de domaine</strong> pointant vers l’adresse IP du VPS. Pour cela, créez ou modifiez un enregistrement DNS de type <strong data-start="4467" data-end="4472">A</strong> depuis votre espace client, par exemple dans la section « <strong data-start="4518" data-end="4560">LWS Panel &gt; Noms de domaine &gt; Zone DNS </strong>». Les ports <strong data-start="4572" data-end="4578">22</strong>, <strong data-start="4580" data-end="4586">80</strong> et <strong data-start="4590" data-end="4597">443</strong> doivent être ouverts afin d’autoriser respectivement SSH, HTTP et HTTPS,</li>
<li data-start="3998" data-end="4319">Enfin, votre <strong data-start="4685" data-end="4708">application Next.js</strong> doit être disponible dans un dépôt Git, par exemple GitHub, GitLab ou Gitea,</li>
<li data-start="3998" data-end="4319">Vous devez aussi être à l’aise avec les commandes de base Linux, l’utilisation de SSH, <code data-start="4873" data-end="4884">git clone</code>, <code data-start="4886" data-end="4891">npm</code>, ainsi que les notions essentielles de <strong data-start="4931" data-end="4956">Next.js en production</strong>.</li>
</ul>
<h2 data-section-id="135f71l" data-start="1787" data-end="1841">Pourquoi déployer Next.js sur VPS plutôt que Vercel</h2>
<p data-start="1843" data-end="2210">Vercel est une excellente plateforme pour démarrer rapidement avec <strong data-start="1910" data-end="1921">Next.js</strong>, notamment parce qu’elle est conçue autour de ce framework. Elle simplifie le déploiement, l’intégration Git et la gestion des previews. Cependant, dès qu’un projet devient plus exigeant, un <strong data-start="2113" data-end="2126">VPS Linux</strong> peut offrir davantage de liberté, de stabilité budgétaire et de contrôle technique.</p>
<p data-start="2212" data-end="2624">Déployer Next.js sur un VPS permet notamment de maîtriser l’environnement d’exécution, d’installer ses propres services, d’héberger une base de données locale et de configurer finement <strong data-start="2397" data-end="2406">Nginx</strong>, <strong data-start="2408" data-end="2415">PM2</strong>, les certificats SSL, les logs ou les sauvegardes. Cette approche demande plus de configuration initiale, mais elle convient très bien aux développeurs qui veulent comprendre et contrôler leur infrastructure.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="2626" data-end="3233">
<thead data-start="2626" data-end="2670">
<tr data-start="2626" data-end="2670">
<th class="last:pe-10" data-start="2626" data-end="2636" data-col-size="sm">Critère</th>
<th class="last:pe-10" data-start="2636" data-end="2659" data-col-size="sm">Vercel gratuit / pro</th>
<th class="last:pe-10" data-start="2659" data-end="2670" data-col-size="md">VPS LWS</th>
</tr>
</thead>
<tbody data-start="2685" data-end="3233">
<tr data-start="2685" data-end="2787">
<td data-start="2685" data-end="2713" data-col-size="sm">
<blockquote><p>Timeout des fonctions API</p></blockquote>
</td>
<td data-start="2713" data-end="2736" data-col-size="sm">
<blockquote><p>Limité selon l’offre</p></blockquote>
</td>
<td data-start="2736" data-end="2787" data-col-size="md">
<blockquote><p><strong data-start="2738" data-end="2763">Illimité côté serveur</strong>, selon vos ressources</p></blockquote>
</td>
</tr>
<tr data-start="2788" data-end="2901">
<td data-start="2788" data-end="2813" data-col-size="sm">
<blockquote><p>Base de données locale</p></blockquote>
</td>
<td data-start="2813" data-end="2838" data-col-size="sm">
<blockquote><p>Service externe requis</p></blockquote>
</td>
<td data-start="2838" data-end="2901" data-col-size="md">
<blockquote><p><strong data-start="2840" data-end="2854">PostgreSQL</strong>, MySQL ou Redis possible sur le même serveur</p></blockquote>
</td>
</tr>
<tr data-start="2902" data-end="2968">
<td data-start="2902" data-end="2909" data-col-size="sm">
<blockquote><p>Coût</p></blockquote>
</td>
<td data-start="2909" data-end="2934" data-col-size="sm">
<blockquote><p>Variable selon l’usage</p></blockquote>
</td>
<td data-start="2934" data-end="2968" data-col-size="md">
<blockquote><p><strong data-start="2936" data-end="2966">Mensuel fixe et prévisible</strong></p></blockquote>
</td>
</tr>
<tr data-start="2969" data-end="3025">
<td data-start="2969" data-end="2982" data-col-size="sm">
<blockquote><p>Accès root</p></blockquote>
</td>
<td data-start="2982" data-end="2999" data-col-size="sm">
<blockquote><p>Non disponible</p></blockquote>
</td>
<td data-start="2999" data-end="3025" data-col-size="md">
<blockquote><p><strong data-start="3001" data-end="3023">Accès root complet</strong></p></blockquote>
</td>
</tr>
<tr data-start="3026" data-end="3121">
<td data-start="3026" data-end="3053" data-col-size="sm">
<blockquote><p>Personnalisation serveur</p></blockquote>
</td>
<td data-start="3053" data-end="3063" data-col-size="sm">
<blockquote><p>Limitée</p></blockquote>
</td>
<td data-start="3063" data-end="3121" data-col-size="md">
<blockquote><p>Totale : paquets Linux, services, configuration réseau</p></blockquote>
</td>
</tr>
<tr data-start="3122" data-end="3233">
<td data-start="3122" data-end="3147" data-col-size="sm">
<blockquote><p>Plusieurs applications</p></blockquote>
</td>
<td data-start="3147" data-end="3188" data-col-size="sm">
<blockquote><p>Dépend de l’offre et de l’organisation</p></blockquote>
</td>
<td data-start="3188" data-end="3233" data-col-size="md">
<blockquote><p>Plusieurs vhosts possibles avec <strong data-start="3222" data-end="3231">Nginx</strong></p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="3235" data-end="3458">Ce tutoriel couvre le <strong data-start="3257" data-end="3293">déploiement manuel de Next.js 15</strong> en production avec <strong data-start="3313" data-end="3324">Node.js</strong>, <strong data-start="3326" data-end="3333">PM2</strong>, <strong data-start="3335" data-end="3344">Nginx</strong> et <strong data-start="3348" data-end="3365">Let’s Encrypt</strong>. Il se concentre sur une installation classique, sans couche d’orchestration supplémentaire.</p>
<p data-start="3460" data-end="3982">Il ne couvre pas le déploiement via Docker. Pour cette approche, vous pouvez consulter le tutoriel dédié pour <a class="decorated-link" title="Docker sur VPS LWS : installer et déployer ses applications en 2026" href="https://tutoriels.lws.fr/vps/docker-vps-lws-deployer-ses-applications" data-start="3570" data-end="3692">déployer Next.js dans un container Docker sur VPS</a>. Si votre objectif principal est de quitter Vercel sans gérer manuellement toute la configuration serveur, l’alternative Coolify peut aussi être intéressante pour <a class="decorated-link" title="Vercel function timeout 504 : solution VPS Coolify LWS" href="https://tutoriels.lws.fr/vps/vercel-function-timeout" data-start="3856" data-end="3981">migrer de Vercel vers un VPS avec Coolify pour supprimer les timeouts</a>.</p>
<p data-start="3460" data-end="3982"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="164mrm3" data-start="0" data-end="43">Créer un snapshot LWS avant de commencer</h2>
<p data-start="45" data-end="393">Avant de modifier la configuration de votre serveur, il est fortement recommandé de créer un <strong data-start="138" data-end="154">snapshot LWS</strong>. Un snapshot est une image instantanée de l’état de votre <strong data-start="213" data-end="224">VPS KVM</strong> à un moment précis. En cas d’erreur de configuration, de mauvaise installation ou de problème pendant le déploiement, vous pouvez revenir rapidement à l’état précédent.</p>
<p data-start="395" data-end="645">Cette précaution est particulièrement utile avant d’installer <strong data-start="457" data-end="468">Node.js</strong>, <strong data-start="470" data-end="477">PM2</strong>, <strong data-start="479" data-end="488">Nginx</strong> ou Certbot. Elle permet de travailler plus sereinement, surtout si vous configurez votre premier environnement de production pour <strong data-start="619" data-end="644">Next.js sur VPS Linux</strong>.</p>
<p data-start="647" data-end="693">Depuis votre espace client, rendez-vous dans la section « <strong data-start="695" data-end="744">LWS Panel KVM &gt; Snapshots &gt; Créer un snapshot </strong>».</p>
<p data-start="647" data-end="693"><img class="aligncenter wp-image-29422 size-full"  alt="Créer un snapshot sur VPS KVM LWS" width="1411" height="566" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Creer-un-snapshot.webp"></p>
<p data-start="746" data-end="1046">Donnez un nom explicite à votre snapshot, par exemple <code data-start="800" data-end="826">avant-deploiement-nextjs</code>, puis lancez sa création.</p>
<p data-start="746" data-end="1046"><img class="aligncenter size-full wp-image-29482"  alt="Créer un snapshot sur un VPS KVM LWS" width="1000" height="646" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Creer-un-snapshot-1.webp"></p>
<p data-start="746" data-end="1046">Les <strong data-start="857" data-end="872">VPS KVM LWS</strong> permettent de conserver plusieurs snapshots simultanés, ce qui est pratique pour sécuriser les grandes étapes de configuration serveur.</p>
<h2 data-section-id="1ooq06k" data-start="1048" data-end="1079">Installer Node.js sur le VPS</h2>
<p data-start="1081" data-end="1464">Une application <strong data-start="1097" data-end="1108">Next.js</strong> fonctionne avec <strong data-start="1125" data-end="1136">Node.js</strong>. Sur un VPS Linux, vous devez donc installer une version compatible avant de cloner et builder votre projet. La méthode recommandée ici consiste à utiliser <strong data-start="1293" data-end="1300">nvm</strong>, pour <em data-start="1307" data-end="1329">Node Version Manager</em>. Cet outil permet d’installer facilement une version LTS de Node.js, de la mettre à jour et de gérer plusieurs versions si nécessaire.</p>
<p data-start="1466" data-end="1616">Connectez-vous d’abord à votre serveur en SSH avec votre utilisateur root ou un utilisateur disposant des droits nécessaires, puis installez <strong data-start="1607" data-end="1614">nvm</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># Installer nvm</span>
<span class="ͼ10">curl</span> <span class="ͼ12">-o-</span> https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | <span class="ͼ10">bash</span>

<span class="ͼt"># Recharger le shell</span>
<span class="ͼ10">source</span> ~/.bashrc

<span class="ͼt"># Installer la version LTS de Node.js</span>
nvm install <span class="ͼ12">--lts</span>

<span class="ͼt"># Vérifier les versions installées</span>
<span class="ͼ10">node</span> <span class="ͼ12">--version</span>
<span class="ͼ10">npm</span> <span class="ͼ12">--version</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1888" data-end="2109">La commande <code data-start="1900" data-end="1919">nvm install --lts</code> installe la version <strong data-start="1940" data-end="1961">Long Term Support</strong> de Node.js. C’est généralement le meilleur choix pour un serveur de production, car cette version bénéficie d’un support plus stable dans le temps.</p>
<p data-start="2111" data-end="2316">Une fois <strong data-start="2120" data-end="2131">Node.js</strong> et <strong data-start="2135" data-end="2142">npm</strong> disponibles, installez <strong data-start="2166" data-end="2173">PM2</strong> globalement. PM2 servira ensuite à maintenir votre application Next.js active en production, même après un crash ou un redémarrage du serveur.</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">npm</span> install <span class="ͼ12">-g</span> pm2

pm2 <span class="ͼ12">--version</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">À ce stade, votre VPS dispose des deux éléments essentiels pour exécuter une application Next.js : <strong data-start="2464" data-end="2475">Node.js</strong> pour lancer le serveur applicatif, et <strong data-start="2514" data-end="2521">PM2</strong> pour gérer le processus en arrière-plan. Avant de continuer, vérifiez bien que les commandes <code data-start="2615" data-end="2621">node</code>, <code data-start="2623" data-end="2628">npm</code> et <code data-start="2632" data-end="2637">pm2</code> répondent correctement dans le terminal.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h2 data-section-id="1cnyg8d" data-start="2680" data-end="2732">Préparer l&rsquo;application Next.js pour la production</h2>
<p data-start="2734" data-end="2991">Avant de copier ou de lancer votre projet sur le serveur, il faut vérifier que votre <strong data-start="2819" data-end="2842">application Next.js</strong> est prête pour un déploiement en production. L’objectif est de générer un build optimisé, plus léger et plus simple à exécuter sur un <strong data-start="2977" data-end="2990">VPS Linux</strong>.</p>
<p data-start="2993" data-end="3268">Dans ce tutoriel, nous allons utiliser le mode <strong data-start="3040" data-end="3054">standalone</strong> de Next.js. Ce mode produit un dossier autonome contenant uniquement les fichiers nécessaires à l’exécution de l’application. Il est particulièrement adapté à un déploiement avec <strong data-start="3234" data-end="3245">Node.js</strong>, <strong data-start="3247" data-end="3254">PM2</strong> et <strong data-start="3258" data-end="3267">Nginx</strong>.</p>
<h3 data-section-id="6i0b5v" data-start="3270" data-end="3336">1. Activer le mode output: &lsquo;standalone&rsquo; dans next.config.js</h3>
<p data-start="3338" data-end="3613">Le mode <strong data-start="3346" data-end="3360">standalone</strong> se configure directement dans le fichier <code data-start="3402" data-end="3418">next.config.js</code> ou <code data-start="3422" data-end="3438">next.config.ts</code> de votre projet. Il permet à Next.js de générer un dossier <code data-start="3498" data-end="3517">.next/standalone/</code> contenant un fichier <code data-start="3539" data-end="3550">server.js</code> et les dépendances nécessaires à l’exécution de l’application.</p>
<p data-start="3615" data-end="3713">Dans votre projet local, ouvrez le fichier de configuration Next.js et ajoutez l’option suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt">// next.config.js</span>
<span class="ͼv">const</span> <span class="ͼ11">nextConfig</span> <span class="ͼv">=</span> {
  output: <span class="ͼz">'standalone'</span>,
};

<span class="ͼv">export</span> <span class="ͼv">default</span> <span class="ͼ11">nextConfig</span>;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3828" data-end="3922">Si votre projet utilise encore une syntaxe CommonJS, la configuration peut ressembler à ceci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt">// next.config.js</span>
<span class="ͼt">/** @type {import('next').NextConfig} */</span>
<span class="ͼv">const</span> <span class="ͼ11">nextConfig</span> <span class="ͼv">=</span> {
  output: <span class="ͼz">'standalone'</span>,
};

<span class="ͼ11">module</span><span class="ͼv">.</span>exports <span class="ͼv">=</span> <span class="ͼ11">nextConfig</span>;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Cette option est importante pour <strong data-start="4113" data-end="4141">déployer Next.js sur VPS</strong>, car elle évite de dépendre d’un lancement classique avec <code data-start="4200" data-end="4212">next start</code>. Après le build, l’application pourra être exécutée directement avec <strong data-start="4282" data-end="4293">Node.js</strong> à partir du fichier :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>.next/standalone/server.js</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4357" data-end="4482">Concrètement, cela rend le déploiement plus propre, plus prévisible et mieux adapté à une gestion en production avec <strong data-start="4474" data-end="4481">PM2</strong>.</p>
<h3 data-section-id="5gh1lc" data-start="0" data-end="35">2. Variables d&rsquo;environnement</h3>
<p data-start="37" data-end="444">Les <strong data-start="41" data-end="70">variables d’environnement</strong> permettent de stocker les informations sensibles ou spécifiques à votre environnement de production : URL de base de données, clé secrète d’authentification, jetons API, URL publique de l’application ou paramètres SMTP. Sur un <strong data-start="298" data-end="311">VPS Linux</strong>, elles doivent être gérées avec soin, car elles conditionnent le bon fonctionnement et la sécurité de votre <strong data-start="420" data-end="443">application Next.js</strong>.</p>
<p data-start="446" data-end="690">La règle principale est simple : ne commitez jamais vos fichiers <code data-start="511" data-end="517">.env</code> dans votre dépôt Git. Un fichier comme <code data-start="557" data-end="574">.env.production</code> doit être créé directement sur le serveur, ou bien ses valeurs doivent être définies dans la configuration <strong data-start="682" data-end="689">PM2</strong>.</p>
<p data-start="692" data-end="991">Attention également aux variables préfixées par <code data-start="740" data-end="754">NEXT_PUBLIC_</code>. Dans <strong data-start="761" data-end="772">Next.js</strong>, ces variables sont exposées côté navigateur. Elles peuvent donc être lues par les visiteurs de votre site. Il ne faut jamais y placer de secrets, de mots de passe, de clés privées ou d’identifiants de base de données.</p>
<p data-start="692" data-end="991"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="123p4k5" data-start="993" data-end="1038">Cloner et builder l&rsquo;application sur le VPS</h2>
<p data-start="1040" data-end="1298">Une fois <strong data-start="1049" data-end="1060">Node.js</strong>, <strong data-start="1062" data-end="1069">npm</strong> et <strong data-start="1073" data-end="1080">PM2</strong> installés, vous pouvez récupérer votre application depuis son dépôt Git. Dans cet exemple, le projet sera installé dans <code data-start="1201" data-end="1218">/var/www/monapp</code>, un emplacement courant pour héberger une application web sur un serveur Linux.</p>
<p data-start="1300" data-end="1382">Connectez-vous en SSH à votre <strong data-start="1330" data-end="1337">VPS</strong>, puis créez le répertoire de l’application :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># Créer le répertoire de l'application</span>
<span class="ͼ10">mkdir</span> <span class="ͼ12">-p</span> /var/www/monapp
<span class="ͼ10">cd</span> /var/www/monapp

<span class="ͼt"># Cloner le dépôt Git</span>
<span class="ͼ10">git</span> clone https://github.com/utilisateur/mon-app-nextjs.git .</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1565" data-end="1710">Remplacez l’URL Git par celle de votre propre dépôt. Vous pouvez utiliser une URL HTTPS ou SSH selon votre configuration GitHub, GitLab ou Gitea.</p>
<p data-start="1712" data-end="1757">Installez ensuite les dépendances du projet :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># Installer les dépendances avec les versions exactes du package-lock.json</span>
<span class="ͼ10">npm</span> ci</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1854" data-end="2103">La commande <code data-start="1866" data-end="1874">npm ci</code> est préférable à <code data-start="1892" data-end="1905">npm install</code> en production. Elle s’appuie sur le fichier <code data-start="1950" data-end="1969">package-lock.json</code> et garantit une installation plus reproductible, avec les mêmes versions de dépendances que celles validées pendant le développement.</p>
<p data-start="2105" data-end="2167">Créez ensuite votre fichier de <strong data-start="2136" data-end="2165">variables d’environnement</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano .env.production</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2203" data-end="2273">Ajoutez-y les variables nécessaires à votre application, par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ11">DATABASE_URL</span><span class="ͼv">=</span><span class="ͼz">"postgresql://user:password@localhost:5432/monapp"</span>
<span class="ͼ11">NEXTAUTH_SECRET</span><span class="ͼv">=</span><span class="ͼz">"une-cle-secrete-longue-et-aleatoire"</span>
<span class="ͼ11">NEXT_PUBLIC_SITE_URL</span><span class="ͼv">=</span><span class="ͼz">"https://mondomaine.fr"</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2451" data-end="2511">Enregistrez le fichier, puis lancez le build de production :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">npm</span> run build</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2540" data-end="2701">Si votre configuration <code data-start="2563" data-end="2585">output: 'standalone'</code> est correcte, Next.js génère un dossier <code data-start="2626" data-end="2645">.next/standalone/</code>. Vous pouvez le vérifier avec les commandes suivantes :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> .next/standalone/
<span class="ͼ10">ls</span> .next/static/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2754" data-end="2949">Le dossier <code data-start="2765" data-end="2784">.next/standalone/</code> contient notamment le fichier <code data-start="2815" data-end="2826">server.js</code>, qui sera ensuite lancé avec <strong data-start="2856" data-end="2863">PM2</strong>. Cependant, une étape importante est souvent oubliée : la copie des assets statiques.</p>
<p data-start="2951" data-end="3222">Avec le mode <strong data-start="2964" data-end="2978">standalone</strong>, les dossiers <code data-start="2993" data-end="3002">public/</code> et <code data-start="3006" data-end="3021">.next/static/</code> ne sont pas toujours copiés automatiquement dans le dossier autonome. Sans cette étape, votre application peut s’afficher sans CSS, sans images ou avec des erreurs de chargement de fichiers statiques.</p>
<p data-start="3224" data-end="3263">Exécutez donc les commandes suivantes :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># Copier le dossier public dans le build standalone</span>
<span class="ͼ10">cp</span> <span class="ͼ12">-r</span> public .next/standalone/

<span class="ͼt"># Copier les assets statiques Next.js</span>
<span class="ͼ10">cp</span> <span class="ͼ12">-r</span> .next/static .next/standalone/.next/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3443" data-end="3665">Cette étape est essentielle pour un <strong data-start="3479" data-end="3510">déploiement Next.js sur VPS</strong> propre. Avant de continuer, assurez-vous que le build s’est terminé sans erreur et que les dossiers statiques sont bien présents dans <code data-start="3645" data-end="3664">.next/standalone/</code>.</p>
<h2 data-section-id="1mzyams" data-start="3667" data-end="3697">Gérer le processus avec PM2</h2>
<p data-start="3699" data-end="4083">Votre application est maintenant buildée, mais elle ne doit pas être lancée manuellement avec une simple commande <code data-start="3813" data-end="3829">node server.js</code> laissée ouverte dans un terminal SSH. En production, il faut utiliser un <strong data-start="3903" data-end="3940">gestionnaire de processus Node.js</strong> capable de maintenir l’application active, de la redémarrer en cas de crash et de la relancer automatiquement après un redémarrage du serveur.</p>
<p data-start="4085" data-end="4322">C’est le rôle de <strong data-start="4102" data-end="4109">PM2</strong>. Il permet de lancer votre application <strong data-start="4149" data-end="4176">Next.js en arrière-plan</strong>, de consulter ses logs, de surveiller sa consommation mémoire et CPU, puis de gérer les redémarrages sans avoir à garder une session SSH ouverte.</p>
<p data-start="4324" data-end="4626">Cette approche est particulièrement adaptée si vous utilisez un <strong data-start="4388" data-end="4443">VPS KVM LWS pour héberger votre application Next.js</strong>, car vous gardez un contrôle complet sur le processus applicatif tout en profitant des outils de supervision du serveur depuis le LWS Panel KVM.</p>
<h3 data-section-id="veo81j" data-start="4628" data-end="4675">1. Créer le fichier de configuration PM2</h3>
<p data-start="4677" data-end="4949">Pour lancer proprement votre application, créez un fichier de configuration <strong data-start="4753" data-end="4760">PM2</strong> dans le répertoire du projet. Ce fichier permet de centraliser le nom de l’application, le script à exécuter, le port d’écoute, le dossier de travail et certains paramètres de redémarrage.</p>
<p data-start="4951" data-end="4976">Depuis le VPS, exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /var/www/monapp/ecosystem.config.js</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5032" data-end="5075">Ajoutez ensuite la configuration suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ11">module</span><span class="ͼv">.</span>exports <span class="ͼv">=</span> {
  apps: [
    {
      name: <span class="ͼz">'monapp-nextjs'</span>,
      script: <span class="ͼz">'.next/standalone/server.js'</span>,
      cwd: <span class="ͼz">'/var/www/monapp'</span>,
      instances: <span class="ͼy">1</span>,
      exec_mode: <span class="ͼz">'fork'</span>,
      env: {
        NODE_ENV: <span class="ͼz">'production'</span>,
        PORT: <span class="ͼy">3000</span>,
        HOSTNAME: <span class="ͼz">'0.0.0.0'</span>,
      },
      max_memory_restart: <span class="ͼz">'500M'</span>,
      error_file: <span class="ͼz">'/var/log/pm2/monapp-error.log'</span>,
      out_file: <span class="ͼz">'/var/log/pm2/monapp-out.log'</span>,
    },
  ],
};</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5529" data-end="5925">Dans cette configuration, le champ <code data-start="5564" data-end="5572">script</code> indique à <strong data-start="5583" data-end="5590">PM2</strong> de lancer le fichier <code data-start="5612" data-end="5623">server.js</code> généré par le build <strong data-start="5644" data-end="5658">standalone</strong>. Le champ <code data-start="5669" data-end="5674">cwd</code> définit le dossier de travail de l’application. Les variables <code data-start="5737" data-end="5747">NODE_ENV</code>, <code data-start="5749" data-end="5755">PORT</code> et <code data-start="5759" data-end="5769">HOSTNAME</code> indiquent que l’application doit fonctionner en production, écouter sur le port <code data-start="5850" data-end="5856">3000</code> et accepter les connexions locales transmises ensuite par <strong data-start="5915" data-end="5924">Nginx</strong>.</p>
<p data-start="5927" data-end="6198">Le paramètre <code data-start="5940" data-end="5960">max_memory_restart</code> permet de redémarrer automatiquement le processus si sa consommation mémoire dépasse la limite définie. C’est une sécurité utile pour éviter qu’un processus Node.js instable ne consomme progressivement toute la mémoire disponible du VPS.</p>
<h3 data-section-id="2m1upd" data-start="0" data-end="32">2. Démarrer l&rsquo;application</h3>
<p data-start="34" data-end="219">Une fois le fichier <code data-start="54" data-end="75">ecosystem.config.js</code> créé, vous pouvez démarrer votre <strong data-start="109" data-end="132">application Next.js</strong> avec <strong data-start="138" data-end="145">PM2</strong>. Placez-vous dans le répertoire du projet, puis lancez la configuration :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www/monapp

<span class="ͼt"># Créer le dossier de logs si nécessaire</span>
<span class="ͼ10">mkdir</span> <span class="ͼ12">-p</span> /var/log/pm2

<span class="ͼt"># Démarrer l'application avec PM2</span>
pm2 <span class="ͼ10">start</span> ecosystem.config.js</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="382" data-end="558">PM2 démarre alors le fichier <code data-start="411" data-end="439">.next/standalone/server.js</code> avec les paramètres définis dans la configuration. Pour vérifier que l’application fonctionne correctement, utilisez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 status</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="584" data-end="725">Vous devez voir votre application, ici <code data-start="623" data-end="638">monapp-nextjs</code>, avec le statut <strong data-start="655" data-end="665">online</strong>. Ce statut indique que le processus Node.js est bien actif.</p>
<p data-start="727" data-end="829">Vous pouvez aussi consulter les derniers logs pour vérifier qu’aucune erreur ne remonte au lancement :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 logs monapp-nextjs <span class="ͼ12">--lines</span> <span class="ͼy">20</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="878" data-end="1216">Les <strong data-start="882" data-end="894">logs PM2</strong> sont très utiles pour diagnostiquer une erreur de variable d’environnement, un problème de port, une dépendance manquante ou une erreur côté serveur. À ce stade, l’application écoute normalement sur le port <strong data-start="1102" data-end="1110">3000</strong>, mais elle n’est pas encore exposée publiquement en HTTPS. Cette étape sera gérée ensuite avec <strong data-start="1206" data-end="1215">Nginx</strong>.</p>
<h3 data-section-id="wvxsgr" data-start="1218" data-end="1266">3. Démarrage automatique au reboot du VPS</h3>
<p data-start="1268" data-end="1622">Par défaut, PM2 peut lancer votre application en arrière-plan, mais il faut aussi lui indiquer de la relancer automatiquement après un <strong data-start="1403" data-end="1425">redémarrage du VPS</strong>. C’est indispensable en production : si le serveur redémarre après une mise à jour système, une intervention technique ou une coupure, votre application doit revenir en ligne sans action manuelle.</p>
<p data-start="1624" data-end="1642">Exécutez d’abord :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 startup systemd</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1677" data-end="1804">PM2 affiche alors une commande adaptée à votre système. Copiez-collez cette commande complète dans le terminal, puis exécutez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 save</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1828" data-end="2046">La commande <code data-start="1840" data-end="1850">pm2 save</code> enregistre la liste des processus actuellement gérés par PM2. Ainsi, au prochain redémarrage du serveur, PM2 saura qu’il doit relancer automatiquement votre <strong data-start="2008" data-end="2045">application Next.js en production</strong>.</p>
<p data-start="2048" data-end="2220">Après cette étape, votre application devient beaucoup plus robuste : elle peut être arrêtée, redémarrée ou relancée automatiquement sans dépendre d’une session SSH ouverte.</p>
<h3 data-section-id="1o65ev0" data-start="2222" data-end="2252">4. Commandes PM2 utiles</h3>
<p data-start="2254" data-end="2512">PM2 propose plusieurs commandes pratiques pour administrer une <strong data-start="2317" data-end="2340">application Node.js</strong> en production. Elles permettent de redémarrer l’application après une mise à jour, de suivre les logs, de surveiller les ressources ou d’arrêter temporairement le service.</p>
<p data-start="2514" data-end="2551">Voici les commandes les plus utiles :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># Redémarrer l'application</span>
pm2 <span class="ͼ10">restart</span> monapp-nextjs

<span class="ͼt"># Recharger l'application sans coupure si possible</span>
pm2 reload monapp-nextjs

<span class="ͼt"># Arrêter l'application</span>
pm2 <span class="ͼ10">stop</span> monapp-nextjs

<span class="ͼt"># Supprimer l'application du registre PM2</span>
pm2 delete monapp-nextjs

<span class="ͼt"># Afficher les logs</span>
pm2 logs monapp-nextjs

<span class="ͼt"># Ouvrir le tableau de supervision temps réel</span>
pm2 monit</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2913" data-end="3192">La commande <code data-start="2925" data-end="2936">pm2 monit</code> affiche un tableau de bord en temps réel avec la consommation <strong data-start="2999" data-end="3006">CPU</strong>, la mémoire utilisée, les logs et l’état des processus. Elle complète très bien la supervision disponible dans le <strong data-start="3121" data-end="3138">LWS Panel KVM</strong>, qui permet de suivre les ressources globales du VPS.</p>
<p data-start="3194" data-end="3477">En pratique, après chaque nouvelle version de votre application, vous utiliserez surtout <code data-start="3283" data-end="3309">pm2 reload monapp-nextjs</code> ou <code data-start="3313" data-end="3340">pm2 restart monapp-nextjs</code>. Le rechargement est souvent préférable, car il limite les interruptions de service lorsque la configuration de l’application le permet.</p>
<p data-start="3194" data-end="3477"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="1xpkhik" data-start="3479" data-end="3518">Configurer Nginx comme reverse proxy</h2>
<p data-start="3520" data-end="3787">Votre application <strong data-start="3538" data-end="3549">Next.js</strong> tourne maintenant sur le serveur grâce à <strong data-start="3591" data-end="3598">PM2</strong>, mais elle écoute uniquement sur un port interne, généralement <code data-start="3662" data-end="3668">3000</code>. Pour la rendre accessible depuis un navigateur avec un nom de domaine, il faut placer <strong data-start="3756" data-end="3765">Nginx</strong> devant l’application.</p>
<p data-start="3789" data-end="4066">Nginx va jouer le rôle de <strong data-start="3815" data-end="3832">reverse proxy</strong> : il reçoit les requêtes HTTP ou HTTPS sur les ports <strong data-start="3886" data-end="3892">80</strong> et <strong data-start="3896" data-end="3903">443</strong>, puis les transmet à Next.js sur <code data-start="3937" data-end="3953">127.0.0.1:3000</code>. Cette architecture est plus propre et plus sécurisée que d’exposer directement le serveur Node.js sur Internet.</p>
<p data-start="4068" data-end="4493">Elle permet aussi de gérer le <strong data-start="4098" data-end="4130">cache des fichiers statiques</strong>, les en-têtes HTTP, les certificats SSL, les redirections et plusieurs applications sur le même VPS grâce aux vhosts. Pour aller plus loin sur ce sujet, vous pouvez consulter le tutoriel dédié pour <a class="decorated-link" title="Nginx reverse proxy VPS : configuration complète 2026" href="https://tutoriels.lws.fr/vps/nginx-reverse-proxy-vps" data-start="4329" data-end="4454">configurer Nginx comme reverse proxy devant votre application Next.js</a>.</p>
<h3 data-section-id="1vqk3f8" data-start="0" data-end="25">1. Installer Nginx</h3>
<p data-start="27" data-end="355">Pour exposer votre <strong data-start="46" data-end="69">application Next.js</strong> sur le Web, vous devez installer <strong data-start="103" data-end="112">Nginx</strong> sur le VPS. Nginx recevra les requêtes entrantes sur le port <strong data-start="174" data-end="180">80</strong> pour HTTP, puis sur le port <strong data-start="209" data-end="216">443</strong> une fois le certificat SSL activé. Il transmettra ensuite ces requêtes vers l’application Next.js exécutée par <strong data-start="328" data-end="335">PM2</strong> sur le port <code data-start="348" data-end="354">3000</code>.</p>
<p data-start="357" data-end="453">Connectez-vous à votre <strong data-start="380" data-end="393">VPS Linux</strong> en SSH, puis installez Nginx avec les commandes suivantes :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>apt update
apt install nginx <span class="ͼ12">-y</span>
systemctl enable nginx
systemctl <span class="ͼ10">start</span> nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="545" data-end="593">Vérifiez ensuite que le service est bien actif :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl status nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="631" data-end="904">Si Nginx fonctionne correctement, vous devez obtenir un statut <strong data-start="694" data-end="712">active running</strong>. À ce stade, le serveur web est installé, mais il ne sait pas encore vers quelle application transmettre les requêtes. Il faut donc créer un <strong data-start="854" data-end="869">vhost Nginx</strong> dédié à votre application Next.js.</p>
<h3 data-section-id="1bjr85j" data-start="906" data-end="930">2. Créer le vhost</h3>
<p data-start="932" data-end="1197">Un <strong data-start="935" data-end="950">vhost Nginx</strong> permet d’associer un nom de domaine à une configuration précise. Dans notre cas, il va indiquer à Nginx que les requêtes envoyées vers <code data-start="1086" data-end="1101">mondomaine.fr</code> doivent être transmises à l’application <strong data-start="1142" data-end="1153">Next.js</strong> qui tourne localement sur <code data-start="1180" data-end="1196">127.0.0.1:3000</code>.</p>
<p data-start="1199" data-end="1242">Créez un nouveau fichier de configuration :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /etc/nginx/sites-available/monapp</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1296" data-end="1402">Ajoutez ensuite la configuration suivante, en remplaçant <code data-start="1353" data-end="1368">mondomaine.fr</code> par votre propre nom de domaine :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>server {
    listen 80;
    server_name mondomaine.fr www.mondomaine.fr;

    # Servir les fichiers statiques Next.js directement depuis Nginx
    location /_next/static/ {
        alias /var/www/monapp/.next/static/;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # Servir le dossier public si nécessaire
    location /public/ {
        alias /var/www/monapp/public/;
        expires 30d;
    }

    # Transmettre toutes les autres requêtes vers Next.js
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_read_timeout 60s;
    }
}</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2347" data-end="2630">Cette configuration remplit plusieurs rôles. Les fichiers statiques générés par <strong data-start="2427" data-end="2438">Next.js</strong>, comme les fichiers CSS, JavaScript et chunks de build, sont servis directement par <strong data-start="2523" data-end="2532">Nginx</strong> depuis <code data-start="2540" data-end="2556">/_next/static/</code>. C’est plus performant que de faire passer tous les fichiers par Node.js.</p>
<p data-start="2632" data-end="2884">Le bloc <code data-start="2640" data-end="2652">location /</code> transmet toutes les autres requêtes vers votre application Next.js. Les en-têtes <code data-start="2734" data-end="2745">X-Real-IP</code>, <code data-start="2747" data-end="2764">X-Forwarded-For</code> et <code data-start="2768" data-end="2787">X-Forwarded-Proto</code> permettent à l’application de connaître l’adresse IP réelle du visiteur et le protocole utilisé.</p>
<p data-start="2886" data-end="3236">Les directives <code data-start="2901" data-end="2910">Upgrade</code> et <code data-start="2914" data-end="2936">Connection "upgrade"</code> sont également importantes. Elles assurent la compatibilité avec certains usages comme les <strong data-start="3028" data-end="3042">WebSockets</strong>, les connexions persistantes ou certains comportements liés à l’App Router de Next.js. Il est préférable de les conserver, même si votre application ne semble pas en avoir besoin immédiatement.</p>
<p data-start="3238" data-end="3293">Activez ensuite le vhost en créant un lien symbolique :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ln</span> <span class="ͼ12">-s</span> /etc/nginx/sites-available/monapp /etc/nginx/sites-enabled/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3374" data-end="3405">Testez la configuration Nginx :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx <span class="ͼ12">-t</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3429" data-end="3486">Si le test retourne une syntaxe valide, rechargez Nginx :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl reload nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3524" data-end="3717">Votre <strong data-start="3530" data-end="3561">application Next.js sur VPS</strong> est maintenant accessible en HTTP depuis votre nom de domaine, à condition que l’enregistrement DNS de type <strong data-start="3670" data-end="3675">A</strong> pointe bien vers l’adresse IP du serveur.</p>
<h2 data-section-id="5i0d7g" data-start="3719" data-end="3762">Ajouter SSL avec Let&rsquo;s Encrypt (Certbot)</h2>
<p data-start="3764" data-end="4067">Une application en production doit être accessible en <strong data-start="3818" data-end="3827">HTTPS</strong>. Le protocole HTTPS chiffre les échanges entre le navigateur du visiteur et votre serveur. Il est indispensable pour sécuriser les formulaires, les espaces membres, les paiements, les cookies d’authentification et les données personnelles.</p>
<p data-start="4069" data-end="4294">Pour activer HTTPS gratuitement, vous pouvez utiliser <strong data-start="4123" data-end="4140">Let’s Encrypt</strong> avec <strong data-start="4146" data-end="4157">Certbot</strong>. Certbot va générer un certificat SSL, modifier automatiquement la configuration Nginx et mettre en place le renouvellement automatique.</p>
<p data-start="4296" data-end="4335">Installez Certbot et son module Nginx :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>apt install certbot python3-certbot-nginx <span class="ͼ12">-y</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4395" data-end="4439">Lancez ensuite la génération du certificat :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot <span class="ͼ12">--nginx</span> <span class="ͼ12">-d</span> mondomaine.fr <span class="ͼ12">-d</span> www.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4508" data-end="4737">Remplacez <code data-start="4518" data-end="4533">mondomaine.fr</code> par votre propre domaine. Certbot va vérifier que le domaine pointe bien vers votre VPS, générer le certificat <strong data-start="4645" data-end="4666">SSL Let’s Encrypt</strong>, puis proposer de rediriger automatiquement le trafic HTTP vers HTTPS.</p>
<p data-start="4739" data-end="4808">Une fois l’opération terminée, ouvrez votre navigateur et accédez à :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4845" data-end="4946">Vous devez voir votre <strong data-start="4867" data-end="4890">application Next.js</strong> chargée avec un cadenas valide dans la barre d’adresse.</p>
<p data-start="4948" data-end="5022">Vérifiez enfin que le renouvellement automatique fonctionne correctement :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot renew <span class="ͼ12">--dry-run</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5061" data-end="5264">Cette commande simule le renouvellement du certificat sans modifier votre configuration. Si aucun message d’erreur n’apparaît, votre certificat pourra être renouvelé automatiquement avant son expiration.</p>
<p data-start="5266" data-end="5527">À ce stade, votre application est disponible en <strong data-start="5314" data-end="5323">HTTPS</strong>, derrière <strong data-start="5334" data-end="5343">Nginx</strong>, avec un processus applicatif géré par <strong data-start="5383" data-end="5390">PM2</strong>. Vous disposez donc d’une base solide pour un <strong data-start="5437" data-end="5488">déploiement Next.js en production sur VPS Linux</strong>.</p>
<h2 data-section-id="my7q3z" data-start="5529" data-end="5585">Mettre à jour l&rsquo;application : workflow de déploiement</h2>
<p data-start="5587" data-end="5856">Après le premier déploiement, vous devrez régulièrement mettre à jour votre application : correction de bug, ajout de fonctionnalité, mise à jour de dépendances ou modification du design. Il est donc important de définir un <strong data-start="5811" data-end="5838">workflow de déploiement</strong> simple et fiable.</p>
<p data-start="5858" data-end="6107">Avant chaque mise à jour importante, créez un nouveau <strong data-start="5912" data-end="5948">snapshot depuis le LWS Panel KVM</strong>. Cette précaution vous permet de restaurer rapidement l’état précédent du VPS si le build échoue ou si une nouvelle version provoque une erreur en production.</p>
<p data-start="6109" data-end="6168">Ensuite, placez-vous dans le dossier de votre application :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cd</span> /var/www/monapp</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6202" data-end="6241">Récupérez la dernière version du code :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">git</span> pull origin main</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6277" data-end="6344">Installez les dépendances à partir du fichier <code data-start="6323" data-end="6342">package-lock.json</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">npm</span> ci</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6366" data-end="6407">Relancez ensuite le build de production :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">npm</span> run build</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6436" data-end="6539">Comme lors du premier déploiement, recopiez les fichiers statiques nécessaires au mode <strong data-start="6523" data-end="6537">standalone</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">cp</span> <span class="ͼ12">-r</span> public .next/standalone/
<span class="ͼ10">cp</span> <span class="ͼ12">-r</span> .next/static .next/standalone/.next/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6628" data-end="6668">Rechargez enfin l’application avec PM2 :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 reload monapp-nextjs</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6708" data-end="6919">La commande <code data-start="6720" data-end="6732">pm2 reload</code> permet de relancer l’application plus proprement qu’un arrêt manuel suivi d’un redémarrage. Elle est particulièrement utile pour limiter l’interruption de service lors d’une mise à jour.</p>
<p data-start="6921" data-end="6992">Pour simplifier ce processus, vous pouvez créer un script <code data-start="6979" data-end="6990">deploy.sh</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /var/www/monapp/deploy.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7038" data-end="7066">Ajoutez le contenu suivant :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼu">#!/bin/bash</span>
<span class="ͼv">set</span> <span class="ͼ12">-e</span>

<span class="ͼ10">cd</span> /var/www/monapp

<span class="ͼ10">git</span> pull origin main
<span class="ͼ10">npm</span> ci
<span class="ͼ10">npm</span> run build

<span class="ͼ10">cp</span> <span class="ͼ12">-r</span> public .next/standalone/
<span class="ͼ10">cp</span> <span class="ͼ12">-r</span> .next/static .next/standalone/.next/

pm2 reload monapp-nextjs

<span class="ͼ10">echo</span> <span class="ͼz">"Déploiement terminé — </span>$(date)<span class="ͼz">"</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7302" data-end="7339">Rendez ensuite le script exécutable :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">chmod</span> <span class="ͼv">+</span>x /var/www/monapp/deploy.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7389" data-end="7467">Vous pourrez alors lancer vos prochains déploiements avec une seule commande :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>./deploy.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7494" data-end="7774">Ce script ne remplace pas une vraie chaîne CI/CD, mais il offre une base pratique pour gérer un <strong data-start="7590" data-end="7621">déploiement Next.js sur VPS</strong> de manière répétable. Pour un projet critique, pensez à tester le build sur un environnement de préproduction avant de l’appliquer au serveur principal.</p>
<h2 data-section-id="epnpkn" data-start="0" data-end="51">Superviser l&rsquo;application depuis le LWS Panel KVM</h2>
<p data-start="53" data-end="379">Une fois votre <strong data-start="68" data-end="105">application Next.js en production</strong> déployée, la supervision devient essentielle. Il ne suffit pas que le site soit accessible en HTTPS : vous devez aussi vérifier que le <strong data-start="241" data-end="254">VPS Linux</strong> dispose de suffisamment de ressources pour absorber le trafic, exécuter les builds et maintenir le processus Node.js stable.</p>
<p data-start="53" data-end="379"><img class="aligncenter wp-image-29376 size-full"  alt="Gestion de ressources VPS KVM" width="1200" height="812" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Gestion-de-ressources-VPS-KVM.webp"></p>
<p data-start="381" data-end="669">Depuis le <strong data-start="391" data-end="408">LWS Panel KVM</strong>, vous pouvez suivre l’utilisation du <strong data-start="446" data-end="453">CPU</strong>, de la <strong data-start="461" data-end="468">RAM</strong>, du disque et du trafic réseau. Ces informations permettent d’identifier rapidement un serveur sous-dimensionné, un pic de charge anormal ou une consommation mémoire trop élevée après une mise à jour.</p>
<p data-start="671" data-end="731">La supervision doit être utilisée en complément de <strong data-start="722" data-end="729">PM2</strong> :</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="733" data-end="1009">
<thead data-start="733" data-end="791">
<tr data-start="733" data-end="791">
<th class="last:pe-10" data-start="733" data-end="741" data-col-size="sm">Outil</th>
<th class="last:pe-10" data-start="741" data-end="758" data-col-size="sm">Rôle principal</th>
<th class="last:pe-10" data-start="758" data-end="791" data-col-size="md">Ce qu’il permet de surveiller</th>
</tr>
</thead>
<tbody data-start="806" data-end="1009">
<tr data-start="806" data-end="909">
<td data-start="806" data-end="822" data-col-size="sm">
<blockquote><p><strong data-start="808" data-end="821">PM2 monit</strong></p></blockquote>
</td>
<td data-start="822" data-end="848" data-col-size="sm">
<blockquote><p>Supervision applicative</p></blockquote>
</td>
<td data-start="848" data-end="909" data-col-size="md">
<blockquote><p>Processus Node.js, mémoire du process, logs, redémarrages</p></blockquote>
</td>
</tr>
<tr data-start="910" data-end="1009">
<td data-start="910" data-end="930" data-col-size="sm">
<blockquote><p><strong data-start="912" data-end="929">LWS Panel KVM</strong></p></blockquote>
</td>
<td data-start="930" data-end="959" data-col-size="sm">
<blockquote><p>Supervision infrastructure</p></blockquote>
</td>
<td data-start="959" data-end="1009" data-col-size="md">
<blockquote><p>CPU global, RAM système, disque, trafic réseau</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="1011" data-end="1325">Un pic de CPU ou de RAM pendant <code data-start="1043" data-end="1058">npm run build</code> est normal, car la compilation d’une application <strong data-start="1108" data-end="1119">Next.js</strong> peut être gourmande. En revanche, si le serveur manque régulièrement de mémoire, il peut être nécessaire d’optimiser l’application, de réduire la charge ou de passer à une offre <strong data-start="1298" data-end="1313">VPS KVM LWS</strong> supérieure.</p>
<p data-start="1327" data-end="1477">Pour une analyse simple, utilisez donc <strong data-start="1366" data-end="1373">PM2</strong> pour surveiller votre application et le <strong data-start="1414" data-end="1431">LWS Panel KVM</strong> pour vérifier l’état global de votre serveur.</p>
<h2 data-section-id="12rt5lv" data-start="1479" data-end="1516">Vérification du bon fonctionnement</h2>
<p data-start="1518" data-end="1726">Après le déploiement, prenez le temps de contrôler chaque élément important. Cette étape évite de découvrir plus tard une erreur de configuration, un certificat mal installé ou des fichiers statiques absents.</p>
<p data-start="1728" data-end="1799">Commencez par vérifier que l’application est bien active avec <strong data-start="1790" data-end="1797">PM2</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 status</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1825" data-end="1950">Le statut de votre application doit être <strong data-start="1866" data-end="1876">online</strong>. Consultez ensuite les logs pour détecter d’éventuelles erreurs serveur :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 logs monapp-nextjs <span class="ͼ12">--lines</span> <span class="ͼy">50</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1999" data-end="2051">Ouvrez votre navigateur et accédez à votre domaine :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2088" data-end="2220">L’application doit se charger en <strong data-start="2121" data-end="2130">HTTPS</strong>, avec un cadenas valide dans la barre d’adresse. Vérifiez ensuite les éléments suivants :</p>
<ul data-start="2222" data-end="2520">
<li data-section-id="8pdtyu" data-start="2222" data-end="2260">les pages se chargent correctement ;</li>
<li data-section-id="tcpui" data-start="2261" data-end="2323">les fichiers <strong data-start="2276" data-end="2283">CSS</strong>, images et polices sont bien affichés ;</li>
<li data-section-id="er4c9a" data-start="2324" data-end="2362">les routes dynamiques fonctionnent ;</li>
<li data-section-id="f0aneb" data-start="2363" data-end="2418">le rechargement d’une page ne provoque pas d’erreur ;</li>
<li data-section-id="emg40i" data-start="2419" data-end="2460">les appels API répondent correctement ;</li>
<li data-section-id="yz5mmh" data-start="2461" data-end="2520">les variables d’environnement sont bien prises en compte.</li>
</ul>
<p data-start="2522" data-end="2562">Testez également le renouvellement SSL :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot renew <span class="ͼ12">--dry-run</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2601" data-end="2649">Enfin, simulez un redémarrage du processus PM2 :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 <span class="ͼ10">restart</span> monapp-nextjs</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2690" data-end="2779">Si tout fonctionne après ce test, votre <strong data-start="2730" data-end="2761">déploiement Next.js sur VPS</strong> est opérationnel.</p>
<h2 data-section-id="1wbg0sh" data-start="2781" data-end="2820">Erreurs fréquentes et cas de blocage</h2>
<p data-start="2822" data-end="3065">Même avec une configuration correcte, certaines erreurs reviennent souvent lors d’un <strong data-start="2907" data-end="2944">déploiement Next.js sur VPS Linux</strong>. La plupart sont liées aux fichiers statiques, aux ports, aux variables d’environnement ou à la configuration <strong data-start="3055" data-end="3064">Nginx</strong>.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="3067" data-end="4782">
<thead data-start="3067" data-end="3105">
<tr data-start="3067" data-end="3105">
<th class="last:pe-10" data-start="3067" data-end="3076" data-col-size="md">Erreur</th>
<th class="last:pe-10" data-start="3076" data-end="3093" data-col-size="md">Cause probable</th>
<th class="last:pe-10" data-start="3093" data-end="3105" data-col-size="md">Solution</th>
</tr>
</thead>
<tbody data-start="3120" data-end="4782">
<tr data-start="3120" data-end="3347">
<td data-start="3120" data-end="3183" data-col-size="md">
<blockquote><p><strong data-start="3122" data-end="3168">Application error: a client-side exception</strong> au chargement</p></blockquote>
</td>
<td data-col-size="md" data-start="3183" data-end="3252">
<blockquote><p>Les assets statiques n’ont pas été copiés dans <code data-start="3232" data-end="3251">.next/standalone/</code></p></blockquote>
</td>
<td data-col-size="md" data-start="3252" data-end="3347">
<blockquote><p>Relancer <code data-start="3263" data-end="3295">cp -r public .next/standalone/</code> puis <code data-start="3301" data-end="3345">cp -r .next/static .next/standalone/.next/</code></p></blockquote>
</td>
</tr>
<tr data-start="3348" data-end="3511">
<td data-start="3348" data-end="3370" data-col-size="md">
<blockquote><p><strong data-start="3350" data-end="3369">502 Bad Gateway</strong></p></blockquote>
</td>
<td data-start="3370" data-end="3446" data-col-size="md">
<blockquote><p>L’application PM2 n’est pas démarrée ou Nginx pointe vers le mauvais port</p></blockquote>
</td>
<td data-col-size="md" data-start="3446" data-end="3511">
<blockquote><p>Vérifier <code data-start="3457" data-end="3469">pm2 status</code>, puis contrôler le port avec <code data-start="3499" data-end="3509">ss -tlnp</code></p></blockquote>
</td>
</tr>
<tr data-start="3512" data-end="3668">
<td data-start="3512" data-end="3537" data-col-size="md">
<blockquote><p><code data-start="3514" data-end="3529">npm run build</code> échoue</p></blockquote>
</td>
<td data-start="3537" data-end="3571" data-col-size="md">
<blockquote><p>Mémoire insuffisante sur le VPS</p></blockquote>
</td>
<td data-col-size="md" data-start="3571" data-end="3668">
<blockquote><p>Ajouter plus de RAM, optimiser le projet ou utiliser <code data-start="3626" data-end="3666">NODE_OPTIONS=--max-old-space-size=2048</code></p></blockquote>
</td>
</tr>
<tr data-start="3669" data-end="3830">
<td data-start="3669" data-end="3694" data-col-size="md">
<blockquote><p>Variables non chargées</p></blockquote>
</td>
<td data-col-size="md" data-start="3694" data-end="3742">
<blockquote><p>Fichier <code data-start="3704" data-end="3721">.env.production</code> absent ou mal placé</p></blockquote>
</td>
<td data-col-size="md" data-start="3742" data-end="3830">
<blockquote><p>Vérifier le fichier <code data-start="3764" data-end="3781">.env.production</code>, puis relancer <code data-start="3797" data-end="3812">npm run build</code> et <code data-start="3816" data-end="3828">pm2 reload</code></p></blockquote>
</td>
</tr>
<tr data-start="3831" data-end="4004">
<td data-start="3831" data-end="3869" data-col-size="md">
<blockquote><p>Application hors ligne après reboot</p></blockquote>
</td>
<td data-start="3869" data-end="3922" data-col-size="md">
<blockquote><p><code data-start="3871" data-end="3881">pm2 save</code> n’a pas été exécuté après <code data-start="3908" data-end="3921">pm2 startup</code></p></blockquote>
</td>
<td data-col-size="md" data-start="3922" data-end="4004">
<blockquote><p>Relancer <code data-start="3933" data-end="3954">pm2 startup systemd</code>, exécuter la commande affichée, puis <code data-start="3992" data-end="4002">pm2 save</code></p></blockquote>
</td>
</tr>
<tr data-start="4005" data-end="4150">
<td data-start="4005" data-end="4030" data-col-size="md">
<blockquote><p>Images Next.js cassées</p></blockquote>
</td>
<td data-col-size="md" data-start="4030" data-end="4083">
<blockquote><p>Domaine externe non autorisé dans <code data-start="4066" data-end="4082">next.config.js</code></p></blockquote>
</td>
<td data-col-size="md" data-start="4083" data-end="4150">
<blockquote><p>Ajouter le domaine dans <code data-start="4109" data-end="4132">images.remotePatterns</code>, puis rebuilder</p></blockquote>
</td>
</tr>
<tr data-start="4151" data-end="4321">
<td data-start="4151" data-end="4180" data-col-size="md">
<blockquote><p>Port <strong data-start="4158" data-end="4166">3000</strong> déjà utilisé</p></blockquote>
</td>
<td data-col-size="md" data-start="4180" data-end="4225">
<blockquote><p>Un autre processus écoute déjà sur le port</p></blockquote>
</td>
<td data-col-size="md" data-start="4225" data-end="4321">
<blockquote><p>Identifier le processus avec <code data-start="4256" data-end="4266">ss -tlnp</code>, puis changer le port ou arrêter le service concerné</p></blockquote>
</td>
</tr>
<tr data-start="4322" data-end="4478">
<td data-start="4322" data-end="4360" data-col-size="md">
<blockquote><p>Certificat SSL impossible à générer</p></blockquote>
</td>
<td data-col-size="md" data-start="4360" data-end="4404">
<blockquote><p>Le domaine ne pointe pas vers l’IP du VPS</p></blockquote>
</td>
<td data-col-size="md" data-start="4404" data-end="4478">
<blockquote><p>Vérifier l’enregistrement DNS de type <strong data-start="4444" data-end="4449">A</strong> et attendre la propagation</p></blockquote>
</td>
</tr>
<tr data-start="4479" data-end="4590">
<td data-start="4479" data-end="4495" data-col-size="md">
<blockquote><p>Page sans CSS</p></blockquote>
</td>
<td data-col-size="md" data-start="4495" data-end="4529">
<blockquote><p>Copie de <code data-start="4506" data-end="4520">.next/static</code> oubliée</p></blockquote>
</td>
<td data-col-size="md" data-start="4529" data-end="4590">
<blockquote><p>Copier le dossier statique, puis redémarrer l’application</p></blockquote>
</td>
</tr>
<tr data-start="4591" data-end="4782">
<td data-start="4591" data-end="4622" data-col-size="md">
<blockquote><p>Redirection HTTPS incorrecte</p></blockquote>
</td>
<td data-col-size="md" data-start="4622" data-end="4688">
<blockquote><p>Vhost Nginx mal modifié par Certbot ou conflit de configuration</p></blockquote>
</td>
<td data-col-size="md" data-start="4688" data-end="4782">
<blockquote><p>Vérifier <code data-start="4699" data-end="4734">/etc/nginx/sites-available/monapp</code>, tester avec <code data-start="4748" data-end="4758">nginx -t</code>, puis recharger Nginx</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="4784" data-end="4866">Pour diagnostiquer rapidement une erreur, commencez toujours par trois commandes :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 status
pm2 logs monapp-nextjs <span class="ͼ12">--lines</span> <span class="ͼy">50</span>
nginx <span class="ͼ12">-t</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4935" data-end="5102">Ces commandes permettent de savoir si le problème vient de <strong data-start="4994" data-end="5005">Next.js</strong>, de <strong data-start="5010" data-end="5017">PM2</strong> ou de <strong data-start="5024" data-end="5033">Nginx</strong>. Dans la majorité des cas, elles suffisent à orienter la correction.</p>
<p data-start="4935" data-end="5102"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="kgs582" data-start="5104" data-end="5123">Bonnes pratiques</h2>
<p data-start="5125" data-end="5381">Pour maintenir une <strong data-start="5144" data-end="5175">application Next.js sur VPS</strong> stable dans le temps, adoptez quelques bonnes pratiques dès le premier déploiement. Elles réduisent les risques d’interruption, facilitent les mises à jour et améliorent la sécurité de votre environnement.</p>
<p data-start="5383" data-end="5628">Ne lancez pas l’application manuellement avec une simple commande <code data-start="5449" data-end="5465">node server.js</code> dans un terminal SSH. En production, utilisez toujours <strong data-start="5521" data-end="5528">PM2</strong> pour profiter du redémarrage automatique, de la gestion des logs et de la supervision du processus.</p>
<p data-start="5630" data-end="5868">Utilisez également <code data-start="5649" data-end="5657">npm ci</code> plutôt que <code data-start="5669" data-end="5682">npm install</code> sur le serveur. Cette commande respecte précisément les versions définies dans <code data-start="5762" data-end="5781">package-lock.json</code>, ce qui limite les différences entre votre environnement local et votre <strong data-start="5854" data-end="5867">VPS Linux</strong>.</p>
<p data-start="5870" data-end="6079">Pensez aussi à versionner le fichier <code data-start="5907" data-end="5928">ecosystem.config.js</code> dans votre dépôt Git, sauf si vous y placez des informations sensibles. Cela permet de conserver une configuration cohérente entre vos environnements.</p>
<p data-start="6081" data-end="6155">Surveillez régulièrement la mémoire consommée par votre application avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 monit</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6180" data-end="6321">Si le processus dépasse souvent la limite prévue, ajustez <code data-start="6238" data-end="6258">max_memory_restart</code>, optimisez votre code ou envisagez une offre VPS plus adaptée.</p>
<p data-start="6323" data-end="6766">Avant chaque mise à jour importante, créez un <strong data-start="6369" data-end="6385">snapshot LWS</strong>. Pour les projets critiques, activez aussi les sauvegardes automatiques depuis le <strong data-start="6468" data-end="6485">LWS Panel KVM</strong>. Vous pouvez également consulter le guide dédié pour <a class="decorated-link" title="Docker sur VPS LWS : installer et déployer ses applications en 2026" href="https://tutoriels.lws.fr/vps/docker-vps-lws-deployer-ses-applications" data-start="6539" data-end="6661">déployer Next.js dans un container Docker sur VPS</a> si vous souhaitez isoler davantage votre environnement applicatif.</p>
<h2 data-section-id="vi5xqa" data-start="0" data-end="13">FAQ</h2>
<p data-start="15" data-end="240">Cette <strong data-start="21" data-end="28">FAQ</strong> répond aux questions fréquentes avant de <strong data-start="70" data-end="98">déployer Next.js sur VPS</strong>. Elle peut ensuite être reprise dans un balisage <strong data-start="148" data-end="167">FAQPage JSON-LD</strong> pour améliorer la compréhension de la page par les moteurs de recherche.</p>
<p data-section-id="5pq2ud" data-start="242" data-end="315"><strong>Quelle version de Node.js utiliser pour déployer Next.js 15 sur VPS ?</strong></p>
<p data-start="317" data-end="773">Pour <strong data-start="322" data-end="356">déployer Next.js 15 sur un VPS</strong>, il faut utiliser une version de <strong data-start="390" data-end="401">Node.js</strong> compatible avec votre version du framework. Lors de la sortie de Next.js 15, la version minimale requise de Node.js avait été relevée à <strong data-start="538" data-end="549">18.18.0</strong>. En production, il est toutefois préférable d’installer une version <strong data-start="618" data-end="625">LTS</strong> plus récente avec <code data-start="644" data-end="663">nvm install --lts</code>, afin de bénéficier d’un support stable et de mises à jour de sécurité.</p>
<p data-start="775" data-end="1058">Au moment de la vérification, la version <strong data-start="816" data-end="830">Latest LTS</strong> affichée par Node.js est <strong data-start="856" data-end="875">Node.js 24.16.0</strong>, tandis que Node.js 26 est la version Current. Pour un serveur de production, privilégiez donc la <strong data-start="974" data-end="989">version LTS</strong> plutôt que la version Current.</p>
<p data-section-id="5yw80e" data-start="1060" data-end="1141"><strong>Quelle est la différence entre next start et le mode standalone pour un VPS ?</strong></p>
<p data-start="1143" data-end="1389">La commande <code data-start="1155" data-end="1167">next start</code> permet de lancer une application <strong data-start="1201" data-end="1212">Next.js</strong> après un build classique. Elle fonctionne pour de nombreux projets, mais elle repose sur l’environnement complet du projet, avec ses dépendances installées dans <code data-start="1374" data-end="1388">node_modules</code>.</p>
<p data-start="1391" data-end="1775">Le mode <strong data-start="1399" data-end="1413">standalone</strong>, activé avec <code data-start="1427" data-end="1449">output: 'standalone'</code>, génère un dossier autonome contenant le serveur <code data-start="1499" data-end="1510">server.js</code> et uniquement les dépendances nécessaires à l’exécution. C’est une approche plus propre pour un <strong data-start="1607" data-end="1644">déploiement Next.js sur VPS Linux</strong>, car elle facilite l’exécution avec <strong data-start="1681" data-end="1688">PM2</strong>, réduit les fichiers nécessaires en production et rend le déploiement plus prévisible.</p>
<p data-start="1777" data-end="1933">Dans ce tutoriel, le mode standalone est recommandé, car il s’intègre très bien avec <strong data-start="1862" data-end="1873">Node.js</strong>, <strong data-start="1875" data-end="1882">PM2</strong>, <strong data-start="1884" data-end="1893">Nginx</strong> et un certificat <strong data-start="1911" data-end="1932">SSL Let’s Encrypt</strong>.</p>
<p data-section-id="z8kfpc" data-start="1935" data-end="2001"><strong>PM2 ou Docker pour héberger Next.js sur VPS : lequel choisir ?</strong></p>
<p data-start="2003" data-end="2300"><strong data-start="2003" data-end="2010">PM2</strong> et <strong data-start="2014" data-end="2024">Docker</strong> répondent à deux besoins différents. PM2 est idéal si vous voulez une méthode simple pour lancer une <strong data-start="2126" data-end="2163">application Next.js en production</strong>, gérer les logs, redémarrer le processus automatiquement et surveiller la consommation mémoire. C’est l’approche utilisée dans ce guide.</p>
<p data-start="2302" data-end="2596">Docker est plus adapté si vous souhaitez isoler complètement l’environnement applicatif, standardiser les déploiements entre plusieurs serveurs ou intégrer votre projet dans une architecture plus complexe avec plusieurs services. Il demande cependant une couche de configuration supplémentaire.</p>
<p data-start="2598" data-end="2905">Pour un premier <strong data-start="2614" data-end="2645">déploiement Next.js sur VPS</strong>, PM2 est souvent plus direct. Pour une infrastructure plus industrialisée, vous pouvez choisir de <a class="decorated-link" title="Docker sur VPS LWS : installer et déployer ses applications en 2026" href="https://tutoriels.lws.fr/vps/docker-vps-lws-deployer-ses-applications" data-start="2744" data-end="2866">déployer Next.js dans un container Docker sur VPS</a>.</p>
<p data-section-id="1kx5par" data-start="0" data-end="89"><strong>Comment mettre à jour une application Next.js en production sans coupure de service ?</strong></p>
<p data-start="91" data-end="423">Pour mettre à jour une <strong data-start="114" data-end="151">application Next.js en production</strong> avec le moins d’interruption possible, utilisez un workflow simple : récupérer le dernier code avec <code data-start="252" data-end="262">git pull</code>, réinstaller les dépendances avec <code data-start="297" data-end="305">npm ci</code>, relancer le build, recopier les fichiers statiques du mode <strong data-start="366" data-end="380">standalone</strong>, puis recharger le processus avec <strong data-start="415" data-end="422">PM2</strong>.</p>
<p data-start="425" data-end="454">La commande recommandée est :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>pm2 reload monapp-nextjs</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="494" data-end="844">Elle permet de recharger l’application plus proprement qu’un arrêt manuel. Avant une mise à jour importante, créez toujours un <strong data-start="621" data-end="637">snapshot LWS</strong> depuis le <strong data-start="648" data-end="665">LWS Panel KVM</strong> afin de pouvoir restaurer le serveur si le nouveau build provoque une erreur. Pour les changements critiques, testez d’abord le déploiement sur un environnement de préproduction.</p>
<p data-section-id="psovtw" data-start="846" data-end="910"><strong>Next.js sur VPS LWS : quelle taille de VPS KVM recommander ?</strong></p>
<p data-start="912" data-end="1322">La taille du <strong data-start="925" data-end="940">VPS KVM LWS</strong> dépend du poids de votre application, du trafic attendu et des traitements exécutés côté serveur. Pour une petite application <strong data-start="1067" data-end="1078">Next.js</strong>, un portfolio ou un site vitrine dynamique, une configuration modérée peut suffire. En revanche, une application SaaS, un back-office, un site e-commerce ou un projet avec beaucoup de rendu serveur demandera davantage de <strong data-start="1300" data-end="1307">RAM</strong> et de <strong data-start="1314" data-end="1321">CPU</strong>.</p>
<p data-start="1324" data-end="1372">Le point le plus sensible est souvent le build :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">npm</span> run build</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1401" data-end="1700">Cette commande peut consommer beaucoup de mémoire, surtout sur un projet volumineux. Si le build échoue par manque de RAM, vous pouvez temporairement augmenter la mémoire disponible pour Node.js avec <code data-start="1601" data-end="1641">NODE_OPTIONS=--max-old-space-size=2048</code>, optimiser le projet ou passer à une offre VPS supérieure.</p>
<p data-start="1702" data-end="2058">En production, privilégiez toujours une version <strong data-start="1750" data-end="1764">Active LTS</strong> ou <strong data-start="1768" data-end="1787">Maintenance LTS</strong> de Node.js, conformément aux recommandations officielles du projet Node.js. À la date du 17 juin 2026, Node.js affiche notamment <strong data-start="1917" data-end="1936">Node.js 24.16.0</strong> comme version LTS récente, tandis que Node.js 26 est indiqué comme version Current.</p>
<p data-section-id="m48hmp" data-start="2060" data-end="2133"><strong>Les variables d&rsquo;environnement .env sont-elles sécurisées sur un VPS ?</strong></p>
<p data-start="2135" data-end="2460">Les fichiers <code data-start="2148" data-end="2154">.env</code> peuvent être utilisés de manière sécurisée sur un <strong data-start="2205" data-end="2218">VPS Linux</strong>, à condition de respecter quelques règles. Ils ne doivent jamais être envoyés dans un dépôt Git public ou privé partagé sans précaution. Le fichier <code data-start="2367" data-end="2384">.env.production</code> doit être créé directement sur le serveur, avec des droits d’accès limités.</p>
<p data-start="2462" data-end="2516">Vous pouvez vérifier ou ajuster les permissions avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">chmod</span> <span class="ͼy">600</span> /var/www/monapp/.env.production</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2573" data-end="3181">Les secrets comme <code data-start="2591" data-end="2605">DATABASE_URL</code>, <code data-start="2607" data-end="2624">NEXTAUTH_SECRET</code>, les clés API privées ou les mots de passe SMTP ne doivent jamais être préfixés par <code data-start="2709" data-end="2723">NEXT_PUBLIC_</code>. Dans <strong data-start="2730" data-end="2741">Next.js</strong>, les variables commençant par <code data-start="2772" data-end="2786">NEXT_PUBLIC_</code> sont destinées au navigateur et peuvent donc être exposées côté client. Il faut les réserver aux valeurs réellement publiques, comme l’URL publique du site ou une clé front-end non sensible. Les exigences système de Next.js évoluant selon les versions, il est aussi recommandé de vérifier la documentation officielle avant chaque montée de version majeure.</p>
<h2 data-section-id="8dtpi" data-start="6013" data-end="6026">Conclusion</h2>
<p data-start="6028" data-end="6396">Déployer une <strong data-start="6041" data-end="6078">application Next.js sur VPS Linux</strong> demande plus de configuration qu’une plateforme managée, mais cette approche offre un contrôle complet sur l’infrastructure. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />Avec <strong data-start="6209" data-end="6220">Node.js</strong>, le mode <strong data-start="6230" data-end="6244">standalone</strong>, <strong data-start="6246" data-end="6253">PM2</strong>, <strong data-start="6255" data-end="6264">Nginx</strong> et <strong data-start="6268" data-end="6285">Let’s Encrypt</strong>, vous disposez d’un environnement solide pour héberger une application en production sur votre propre serveur. Cette méthode vous permet de gérer vos logs, vos processus, vos certificats, vos mises à jour et vos ressources serveur avec précision. En complément, le <strong data-start="6552" data-end="6569">LWS Panel KVM</strong> facilite la supervision du CPU, de la RAM, du disque et du trafic réseau.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Pour héberger votre projet dans un environnement flexible et administrable, vous pouvez <a title="choisir un VPS KVM LWS pour héberger votre application Next.js" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">choisir un VPS KVM LWS pour héberger votre application Next.js</a>.</p>
<p data-start="6028" data-end="6396"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<p data-start="6645" data-end="6830" data-is-last-node="" data-is-only-node=""><em>Vous avez rencontré une difficulté lors du déploiement de votre application Next.js sur VPS ? Partagez votre question ou votre retour d’expérience en commentaire : cela pourra aider d’autres développeurs à résoudre les mêmes problèmes.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/deployer-nextjs-sur-vps/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29478</post-id>	</item>
		<item>
		<title>Nginx reverse proxy sur VPS : configuration complète avec SSL et sécurité</title>
		<link>https://tutoriels.lws.fr/vps/nginx-reverse-proxy-vps</link>
					<comments>https://tutoriels.lws.fr/vps/nginx-reverse-proxy-vps#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Mon, 15 Jun 2026 12:23:59 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=29446</guid>

					<description><![CDATA[Vous avez déployé une application sur votre VPS Linux, par exemple une application Node.js sur le port 3000, une API Python sur le port 8000 ou un service Docker exposé sur un port local. Techniquement, l’application fonctionne. Mais la rendre accessible directement depuis Internet via http://votre-ip:3000 n’est ni sécurisé, ni pratique, ni professionnel.✨ Sans reverse &#8230; <a href="https://tutoriels.lws.fr/vps/nginx-reverse-proxy-vps" class="more-link">Continue reading <span class="screen-reader-text">Nginx reverse proxy sur VPS : configuration complète avec SSL et sécurité</span></a>]]></description>
										<content:encoded><![CDATA[<p data-start="204" data-end="563">Vous avez déployé une application sur votre VPS Linux, par exemple une application <strong>Node.js sur le port 3000</strong>, une API Python sur le port 8000 ou un service Docker exposé sur un port local. Techniquement, l’application fonctionne. Mais la rendre accessible directement depuis Internet via <code data-start="491" data-end="513">http://votre-ip:3000</code> n’est ni sécurisé, ni pratique, ni professionnel.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p data-start="565" data-end="834">Sans reverse proxy, chaque application expose son propre port, souvent sans certificat SSL, avec une configuration difficile à maintenir dès que plusieurs services cohabitent sur le même serveur. Nginx permet de résoudre ce problème en servant de point d’entrée unique.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a5.png" alt="💥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Dans ce tutoriel, vous allez apprendre à c<strong>onfigurer Nginx</strong> comme <strong>reverse proxy sur un VPS Linux</strong> afin d’exposer vos applications proprement, en HTTPS, avec une configuration claire et évolutive.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2 data-section-id="clqq33" data-start="1030" data-end="1054">Objectif</h2>
<p data-start="1056" data-end="1426"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’objectif de cet article est de vous guider pas à pas dans la mise en place d’un reverse proxy Nginx sur un VPS Linux, principalement sous Debian ou Ubuntu. Vous verrez comment installer Nginx, créer un premier fichier de configuration, rediriger un nom de domaine vers une application locale, puis sécuriser l’ensemble avec un c<strong>ertificat SSL Let’s Encrypt via Certbot</strong>.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f512.png" alt="🔒" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Nous verrons également comment ajouter des <strong>headers de sécurité</strong>, héberger plusieurs applications sur le même VPS, gérer certains cas avancés comme Docker ou WebSocket, puis diagnostiquer les erreurs les plus fréquentes. À la fin de ce guide, vous disposerez d’une <strong>configuration Nginx opérationnelle</strong>, capable de servir une ou plusieurs applications derrière un seul serveur, avec HTTPS forcé et une base de sécurité solide.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2 data-section-id="1akmar" data-start="1852" data-end="1912">Pourquoi un reverse proxy : ce que ça change concrètement</h2>
<p data-start="1914" data-end="2232">Un reverse proxy est un serveur placé entre les visiteurs et vos applications. Dans notre cas, Nginx reçoit les requêtes HTTP ou HTTPS venant d’Internet, puis les transmet à l’application correspondante sur le VPS. L’application peut donc continuer à tourner sur un port local, sans être directement exposée au public.</p>
<p data-start="2234" data-end="2295">Sans reverse proxy, l’architecture ressemble souvent à ceci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Internet → Port 3000 → Application Node.js en HTTP
Internet → Port 8000 → API Python en HTTP</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2403" data-end="2668">Cette configuration peut fonctionner pour un test rapide, mais elle devient vite problématique. Les ports applicatifs sont visibles depuis Internet, le HTTPS n’est pas centralisé, et chaque service doit gérer une partie de la sécurité ou de la configuration réseau.</p>
<p data-start="2670" data-end="2742">Avec Nginx comme reverse proxy, le schéma devient beaucoup plus propre :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Internet → Nginx port 443 HTTPS
              ├── app1.mondomaine.fr → localhost:3000
              └── app2.mondomaine.fr → localhost:8000</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2897" data-end="3167">Le visiteur accède uniquement à une adresse claire, par exemple <code data-start="2961" data-end="2989">https://app1.mondomaine.fr</code>. Nginx reçoit la requête sécurisée, puis la transmet en interne vers l’application qui écoute sur <code data-start="3088" data-end="3104">localhost:3000</code>. Le port applicatif n’a pas besoin d’être ouvert publiquement.</p>
<p data-start="3169" data-end="3238">Ce fonctionnement apporte plusieurs avantages importants pour un VPS.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="3240" data-end="4016">
<thead data-start="3240" data-end="3263">
<tr data-start="3240" data-end="3263">
<th class="last:pe-10" data-start="3240" data-end="3251" data-col-size="sm">Fonction</th>
<th class="last:pe-10" data-start="3251" data-end="3263" data-col-size="md">Bénéfice</th>
</tr>
</thead>
<tbody data-start="3274" data-end="4016">
<tr data-start="3274" data-end="3380">
<td data-start="3274" data-end="3292" data-col-size="sm">
<blockquote><p>SSL termination</p></blockquote>
</td>
<td data-col-size="md" data-start="3292" data-end="3380">
<blockquote><p>Nginx gère le HTTPS tandis que les applications backend peuvent rester en HTTP local</p></blockquote>
</td>
</tr>
<tr data-start="3381" data-end="3491">
<td data-start="3381" data-end="3402" data-col-size="sm">
<blockquote><p>Masquage des ports</p></blockquote>
</td>
<td data-start="3402" data-end="3491" data-col-size="md">
<blockquote><p>Les ports applicatifs comme 3000 ou 8000 ne sont pas directement exposés sur Internet</p></blockquote>
</td>
</tr>
<tr data-start="3492" data-end="3608">
<td data-start="3492" data-end="3509" data-col-size="sm">
<blockquote><p>Multi-domaines</p></blockquote>
</td>
<td data-col-size="md" data-start="3509" data-end="3608">
<blockquote><p>Plusieurs applications peuvent être hébergées sur le même VPS avec des sous-domaines différents</p></blockquote>
</td>
</tr>
<tr data-start="3609" data-end="3709">
<td data-start="3609" data-end="3631" data-col-size="sm">
<blockquote><p>Headers de sécurité</p></blockquote>
</td>
<td data-col-size="md" data-start="3631" data-end="3709">
<blockquote><p>Les protections HTTP peuvent être centralisées dans la configuration Nginx</p></blockquote>
</td>
</tr>
<tr data-start="3710" data-end="3816">
<td data-start="3710" data-end="3729" data-col-size="sm">
<blockquote><p>Compression gzip</p></blockquote>
</td>
<td data-col-size="md" data-start="3729" data-end="3816">
<blockquote><p>La compression peut être activée au niveau de Nginx pour améliorer les performances</p></blockquote>
</td>
</tr>
<tr data-start="3817" data-end="3906">
<td data-start="3817" data-end="3836" data-col-size="sm">
<blockquote><p>Logs centralisés</p></blockquote>
</td>
<td data-col-size="md" data-start="3836" data-end="3906">
<blockquote><p>Les accès et erreurs peuvent être suivis depuis les journaux Nginx</p></blockquote>
</td>
</tr>
<tr data-start="3907" data-end="4016">
<td data-start="3907" data-end="3924" data-col-size="sm">
<blockquote><p>Load balancing</p></blockquote>
</td>
<td data-col-size="md" data-start="3924" data-end="4016">
<blockquote><p>Nginx peut distribuer le trafic vers plusieurs instances dans des architectures avancées</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="4018" data-end="4361">Le <strong>rôle de Nginx</strong> est donc différent de celui d’un simple serveur web qui sert des fichiers HTML, CSS, images ou PHP. Dans cet article, nous l’utilisons comme reverse proxy : il reçoit les connexions entrantes, applique les règles de sécurité, gère le certificat SSL, puis transmet les requêtes vers une application déjà lancée en arrière-plan.</p>
<p data-start="4363" data-end="4694">Cette approche est particulièrement utile pour les applications modernes : Node.js, Express, Next.js, API Python Flask ou FastAPI, services Docker, outils d’automatisation, tableaux de bord internes ou applications temps réel. Elle permet de garder une infrastructure propre, plus facile à sécuriser et plus simple à faire évoluer.</p>
<h2 data-section-id="2gncjr" data-start="4696" data-end="4708">Pré-requis pour une bonne configuration Nginx reverse proxy VPS</h2>
<p data-start="4710" data-end="4975">Avant de commencer, vous devez disposer d’un VPS Linux avec un accès SSH administrateur. Les commandes de ce tutoriel sont pensées pour Debian 11/12 et Ubuntu 22.04/24.04, deux familles de distributions très utilisées pour héberger des applications web sur serveur.</p>
<p data-start="4977" data-end="5018">Vous aurez besoin des éléments suivants :</p>
<ul data-start="5020" data-end="5349">
<li data-section-id="3uzoyn" data-start="5020" data-end="5100">un VPS Linux avec accès <code data-start="5046" data-end="5052">root</code> ou un utilisateur disposant des droits <code data-start="5092" data-end="5098">sudo</code> ;</li>
<li data-section-id="of3p9t" data-start="5101" data-end="5181">un nom de domaine ou sous-domaine pointant vers l’adresse IP publique du VPS ;</li>
<li data-section-id="cbdpw6" data-start="5182" data-end="5261">une application déjà lancée sur un port local, par exemple <code data-start="5243" data-end="5259">127.0.0.1:3000</code> ;</li>
<li data-section-id="1tvyrnd" data-start="5262" data-end="5310">les ports 80 et 443 ouverts dans le pare-feu ;</li>
<li data-section-id="1qeksla" data-start="5311" data-end="5349">un accès au terminal SSH du serveur.</li>
</ul>
<p data-start="5351" data-end="5633">Le nom de domaine est indispensable si vous souhaitez obtenir un certificat SSL Let’s Encrypt avec Certbot. Par exemple, si vous voulez publier votre application sur <code data-start="5517" data-end="5536">app.mondomaine.fr</code>, ce sous-domaine doit déjà pointer vers l’adresse IP du VPS via un enregistrement DNS de type A.</p>
<p data-start="5635" data-end="5701">Vous pouvez vérifier la résolution DNS avec la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>dig <span class="ͼv">+</span>short app.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">La commande doit retourner l’<strong>adresse IP publique de votre VPS</strong>. Si elle ne retourne rien, ou si elle affiche une autre IP, Certbot ne pourra pas valider le domaine correctement.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5923" data-end="6153">La propagation DNS peut prendre jusqu’à 48 heures selon les cas, même si elle est généralement beaucoup plus rapide. Avant de demander un certificat SSL, prenez donc le temps de vérifier que le domaine pointe bien vers le serveur.</p>
<p data-start="6155" data-end="6326">Vous devez aussi vérifier que les ports 80 et 443 sont ouverts. Le port 80 sert au trafic HTTP et à la validation initiale Let’s Encrypt. Le port 443 sert au trafic HTTPS.</p>
<p data-start="6328" data-end="6376">Avec <code data-start="6333" data-end="6338">ufw</code>, vous pouvez ouvrir ces ports ainsi :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>ufw allow <span class="ͼy">80</span>/tcp
ufw allow <span class="ͼy">443</span>/tcp</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6426" data-end="6476">Avec <code data-start="6431" data-end="6441">iptables</code>, les commandes équivalentes sont :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-p</span> tcp <span class="ͼ12">--dport</span> <span class="ͼy">80</span> <span class="ͼ12">-j</span> ACCEPT
iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-p</span> tcp <span class="ͼ12">--dport</span> <span class="ͼy">443</span> <span class="ͼ12">-j</span> ACCEPT</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6584" data-end="6796">Enfin, assurez-vous que votre application backend fonctionne localement avant de configurer Nginx. Par exemple, si votre application Node.js écoute sur le port 3000, vous pouvez la tester depuis le serveur avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">curl</span> http://127.0.0.1:3000</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6838" data-end="7065">Si cette commande ne répond pas correctement, le problème ne vient pas encore de Nginx. Il faut d’abord corriger le lancement de l’application, son port d’écoute ou son service système avant de mettre en place le reverse proxy. Avant de continuer, apprenez à <span style="font-weight: 400;"><a title="VPS anti-DDoS : protection réseau et configuration Linux pas à pas" href="https://tutoriels.lws.fr/vps/vps-anti-ddos-protection-configuration">sécuriser votre VPS avant d&rsquo;exposer Nginx sur Internet</a>.</span></p>
<h2 data-section-id="149g9d1" data-start="80" data-end="98">Installer Nginx</h2>
<p data-start="100" data-end="310">La configuration se fait depuis le terminal SSH du VPS. Connectez-vous avec l’utilisateur <code data-start="190" data-end="196">root</code> ou avec un compte disposant des droits <code data-start="236" data-end="242">sudo</code>, puis commencez par mettre à jour la liste des paquets disponibles.</p>
<p data-start="312" data-end="378">Sur Debian ou Ubuntu, l’installation de Nginx se fait avec <code data-start="371" data-end="376">apt</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>apt update &amp;&amp; apt install nginx <span class="ͼ12">-y
</span></code></pre>
<p class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ12"><img class="aligncenter size-full wp-image-29452"  alt="Mettre à jour les paquets et installer Nginx sur un VPS KVM LWS" width="1013" height="789" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Mettre-a-jour-et-installer-Nginx.webp"></span></code></p>
<p>&nbsp;</p>
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl enable nginx</code> <code>systemctl <span class="ͼ10">start</span> nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="473" data-end="796">La commande <code data-start="485" data-end="497">apt update</code> met à jour l’index des paquets. La commande <code data-start="542" data-end="564">apt install nginx -y</code> installe Nginx sans demander de confirmation supplémentaire. Ensuite, <code data-start="635" data-end="659">systemctl enable nginx</code> active le démarrage automatique du service au lancement du serveur, tandis que <code data-start="739" data-end="762">systemctl start nginx</code> démarre immédiatement le service.</p>
<p data-start="798" data-end="853">Vous pouvez vérifier que Nginx est bien installé avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx <span class="ͼ12">-v</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="877" data-end="933"><img class="aligncenter size-full wp-image-29455"  alt="Vérifier la version de Nginx sur un VPS KVM LWS" width="1003" height="787" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Verifier-la-version-de-Nginx.webp"></p>
<p data-start="877" data-end="933">La commande retourne la version installée, par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx version: nginx/1.18.0</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="976" data-end="1012">Vérifiez ensuite l’état du service :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl status nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1050" data-end="1155"><img class="aligncenter size-full wp-image-29454"  alt="Vérifier le statut de Nginx sur le serveur VPS KVM LWS" width="1012" height="785" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Status-Active-du-serveur-Nginx.webp"></p>
<p data-start="1050" data-end="1155">Si tout est correct, le service doit apparaître comme actif, avec un statut proche de <code data-start="1136" data-end="1154">active (running)</code>. Vous pouvez aussi tester l’installation depuis un navigateur en saisissant l’adresse IP publique du VPS :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>http://IP_DU_VPS</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1294" data-end="1538">Si la page de bienvenue Nginx s’affiche, cela signifie que le serveur web répond correctement sur le port 80. Cette page n’est pas encore votre application : elle confirme simplement que Nginx est installé, démarré et joignable depuis Internet.</p>
<p data-start="1294" data-end="1538"><img class="aligncenter wp-image-29453 size-full"  alt="La page de bienvenue de Nginx après installation " width="1083" height="503" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Page-daccueil-de-nginx.webp"></p>
<p data-start="1540" data-end="1654">Avant de créer votre premier reverse proxy, il est utile de comprendre les principaux fichiers utilisés par Nginx.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="1656" data-end="2091">
<thead data-start="1656" data-end="1673">
<tr data-start="1656" data-end="1673">
<th class="last:pe-10" data-start="1656" data-end="1665" data-col-size="sm">Chemin</th>
<th class="last:pe-10" data-start="1665" data-end="1673" data-col-size="md">Rôle</th>
</tr>
</thead>
<tbody data-start="1684" data-end="2091">
<tr data-start="1684" data-end="1744">
<td data-start="1684" data-end="1710" data-col-size="sm">
<blockquote><p><code data-start="1686" data-end="1709">/etc/nginx/nginx.conf</code></p></blockquote>
</td>
<td data-start="1710" data-end="1744" data-col-size="md">
<blockquote><p>Configuration globale de Nginx</p></blockquote>
</td>
</tr>
<tr data-start="1745" data-end="1854">
<td data-start="1745" data-end="1777" data-col-size="sm">
<blockquote><p><code data-start="1747" data-end="1776">/etc/nginx/sites-available/</code></p></blockquote>
</td>
<td data-start="1777" data-end="1854" data-col-size="md">
<blockquote><p>Dossier contenant les configurations de sites ou applications disponibles</p></blockquote>
</td>
</tr>
<tr data-start="1855" data-end="1960">
<td data-start="1855" data-end="1885" data-col-size="sm">
<blockquote><p><code data-start="1857" data-end="1884">/etc/nginx/sites-enabled/</code></p></blockquote>
</td>
<td data-start="1885" data-end="1960" data-col-size="md">
<blockquote><p>Dossier contenant les liens symboliques vers les configurations actives</p></blockquote>
</td>
</tr>
<tr data-start="1961" data-end="2032">
<td data-start="1961" data-end="1991" data-col-size="sm">
<blockquote><p><code data-start="1963" data-end="1990">/var/log/nginx/access.log</code></p></blockquote>
</td>
<td data-start="1991" data-end="2032" data-col-size="md">
<blockquote><p>Journal des requêtes reçues par Nginx</p></blockquote>
</td>
</tr>
<tr data-start="2033" data-end="2091">
<td data-start="2033" data-end="2062" data-col-size="sm">
<blockquote><p><code data-start="2035" data-end="2061">/var/log/nginx/error.log</code></p></blockquote>
</td>
<td data-start="2062" data-end="2091" data-col-size="md">
<blockquote><p>Journal des erreurs Nginx</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="2093" data-end="2482">Dans la plupart des cas, il est préférable de ne pas modifier directement le fichier global <code data-start="2185" data-end="2208">/etc/nginx/nginx.conf</code>. Pour chaque application, créez plutôt un fichier dédié dans <code data-start="2270" data-end="2299">/etc/nginx/sites-available/</code>, puis activez-le avec un lien symbolique dans <code data-start="2346" data-end="2373">/etc/nginx/sites-enabled/</code>. Cette méthode permet de garder une configuration propre, lisible et facile à désactiver en cas de problème.</p>
<h2 data-section-id="1ul6tqv" data-start="2484" data-end="2529">Configurer le premier reverse proxy (HTTP)</h2>
<p data-start="2531" data-end="2809">Avant d’ajouter le SSL, il est recommandé de <strong>configurer d’abord le reverse proxy en HTTP</strong>. Cette étape permet de vérifier que Nginx transmet correctement les requêtes vers l’application locale. Une fois le routage validé, vous pourrez ajouter HTTPS plus sereinement avec Certbot.</p>
<p data-start="2811" data-end="2967">Dans cet exemple, nous partons du principe que votre application fonctionne sur le port <code data-start="2899" data-end="2905">3000</code> du VPS et qu’elle est accessible localement à cette adresse :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>http://127.0.0.1:3000</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3004" data-end="3076">Créez un nouveau fichier de configuration Nginx pour cette application :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /etc/nginx/sites-available/monapp</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3130" data-end="3248">Ajoutez ensuite la configuration suivante en remplaçant <code data-start="3186" data-end="3205">app.mondomaine.fr</code> par votre propre domaine ou sous-domaine :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>server {
    listen 80;
    server_name app.mondomaine.fr;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3653" data-end="3869">Ce bloc indique à Nginx d’écouter les requêtes HTTP arrivant sur le port 80 pour le sous-domaine <code data-start="3750" data-end="3769">app.mondomaine.fr</code>. Lorsqu’une requête arrive, Nginx la transmet à l’application locale via la directive <code data-start="3856" data-end="3868">proxy_pass</code>.</p>
<p data-start="3871" data-end="3922">Voici le rôle des principales directives utilisées :</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="3924" data-end="4616">
<thead data-start="3924" data-end="3944">
<tr data-start="3924" data-end="3944">
<th class="last:pe-10" data-start="3924" data-end="3936" data-col-size="sm">Directive</th>
<th class="last:pe-10" data-start="3936" data-end="3944" data-col-size="md">Rôle</th>
</tr>
</thead>
<tbody data-start="3955" data-end="4616">
<tr data-start="3955" data-end="4034">
<td data-start="3955" data-end="3969" data-col-size="sm">
<blockquote><p><code data-start="3957" data-end="3968">listen 80</code></p></blockquote>
</td>
<td data-start="3969" data-end="4034" data-col-size="md">
<blockquote><p>Indique que ce bloc répond aux connexions HTTP sur le port 80</p></blockquote>
</td>
</tr>
<tr data-start="4035" data-end="4098">
<td data-start="4035" data-end="4051" data-col-size="sm">
<blockquote><p><code data-start="4037" data-end="4050">server_name</code></p></blockquote>
</td>
<td data-start="4051" data-end="4098" data-col-size="md">
<blockquote><p>Définit le domaine ou sous-domaine concerné</p></blockquote>
</td>
</tr>
<tr data-start="4099" data-end="4166">
<td data-start="4099" data-end="4114" data-col-size="sm">
<blockquote><p><code data-start="4101" data-end="4113">location /</code></p></blockquote>
</td>
<td data-start="4114" data-end="4166" data-col-size="md">
<blockquote><p>Applique la règle à toutes les URL de ce domaine</p></blockquote>
</td>
</tr>
<tr data-start="4167" data-end="4232">
<td data-start="4167" data-end="4182" data-col-size="sm">
<blockquote><p><code data-start="4169" data-end="4181">proxy_pass</code></p></blockquote>
</td>
<td data-start="4182" data-end="4232" data-col-size="md">
<blockquote><p>Transmet la requête vers l’application backend</p></blockquote>
</td>
</tr>
<tr data-start="4233" data-end="4322">
<td data-start="4233" data-end="4260" data-col-size="sm">
<blockquote><p><code data-start="4235" data-end="4259">proxy_http_version 1.1</code></p></blockquote>
</td>
<td data-start="4260" data-end="4322" data-col-size="md">
<blockquote><p>Active HTTP/1.1, utile pour le keep-alive et les WebSocket</p></blockquote>
</td>
</tr>
<tr data-start="4323" data-end="4387">
<td data-start="4323" data-end="4332" data-col-size="sm">
<blockquote><p><code data-start="4325" data-end="4331">Host</code></p></blockquote>
</td>
<td data-start="4332" data-end="4387" data-col-size="md">
<blockquote><p>Transmet le nom de domaine original à l’application</p></blockquote>
</td>
</tr>
<tr data-start="4388" data-end="4446">
<td data-start="4388" data-end="4402" data-col-size="sm">
<blockquote><p><code data-start="4390" data-end="4401">X-Real-IP</code></p></blockquote>
</td>
<td data-start="4402" data-end="4446" data-col-size="md">
<blockquote><p>Transmet l’adresse IP réelle du visiteur</p></blockquote>
</td>
</tr>
<tr data-start="4447" data-end="4534">
<td data-start="4447" data-end="4467" data-col-size="sm">
<blockquote><p><code data-start="4449" data-end="4466">X-Forwarded-For</code></p></blockquote>
</td>
<td data-start="4467" data-end="4534" data-col-size="md">
<blockquote><p>Conserve la chaîne des adresses IP en cas de proxies successifs</p></blockquote>
</td>
</tr>
<tr data-start="4535" data-end="4616">
<td data-start="4535" data-end="4557" data-col-size="sm">
<blockquote><p><code data-start="4537" data-end="4556">X-Forwarded-Proto</code></p></blockquote>
</td>
<td data-start="4557" data-end="4616" data-col-size="md">
<blockquote><p>Indique si la requête d’origine utilisait HTTP ou HTTPS</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="4618" data-end="4936">Ces en-têtes sont importants. Sans eux, votre application peut voir toutes les requêtes comme venant de <code data-start="4722" data-end="4733">127.0.0.1</code>, ou ne pas savoir si l’utilisateur est arrivé via HTTP ou HTTPS. Certains frameworks utilisent aussi <code data-start="4835" data-end="4854">X-Forwarded-Proto</code> pour générer les bonnes URL, appliquer des redirections ou sécuriser les cookies.</p>
<p data-start="4938" data-end="5006">Une fois le fichier créé, activez le vhost avec un lien symbolique :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ln</span> <span class="ͼ12">-s</span> /etc/nginx/sites-available/monapp /etc/nginx/sites-enabled/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5087" data-end="5141">Avant de recharger Nginx, testez toujours la syntaxe :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx <span class="ͼ12">-t</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5165" data-end="5250">Si la configuration est correcte, vous devez obtenir un résultat proche de celui-ci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5397" data-end="5432">Vous pouvez alors recharger Nginx :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl reload nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5470" data-end="5664">Le rechargement applique la nouvelle configuration sans arrêter brutalement le service. C’est préférable à un redémarrage complet, surtout sur un serveur qui héberge déjà plusieurs applications.</p>
<p data-start="5666" data-end="5716">À ce stade, ouvrez votre navigateur et accédez à :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>http://app.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5756" data-end="5999">Si tout est correctement configuré, Nginx doit afficher le contenu servi par votre application locale. En cas d’erreur, vérifiez d’abord que l’application tourne réellement sur le port indiqué dans <code data-start="5954" data-end="5966">proxy_pass</code>, puis consultez les logs Nginx :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-f</span> /var/log/nginx/error.log</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6047" data-end="6255">Ne sautez pas l’étape <code data-start="6069" data-end="6079">nginx -t</code>. Une simple accolade manquante, un point-virgule oublié ou une directive mal placée peut empêcher Nginx de recharger sa <strong>configuration</strong> et rendre vos applications inaccessibles.</p>
<h2 data-section-id="1mzc73g" data-start="6257" data-end="6301">Ajouter SSL avec Let&rsquo;s Encrypt et Certbot</h2>
<p data-start="6303" data-end="6652">Votre reverse proxy fonctionne maintenant en HTTP. L’étape suivante consiste à ajouter un certificat SSL afin de rendre l’application accessible en HTTPS. Pour cela, nous allons utiliser Let’s Encrypt, une autorité de certification largement utilisée, et Certbot, l’outil qui automatise la demande, l’installation et le renouvellement du certificat.</p>
<p data-start="6654" data-end="6919">Avec le plugin Nginx, <strong>Certbot</strong> peut détecter votre configuration, générer le certificat, modifier le vhost et ajouter automatiquement la redirection de HTTP vers HTTPS. C’est la méthode la plus simple pour sécuriser rapidement une application exposée derrière Nginx.</p>
<p data-start="6921" data-end="7124">Avant de lancer la commande, vérifiez une dernière fois que le domaine pointe bien vers l’IP du VPS et que le port 80 est ouvert. Let’s Encrypt doit pouvoir joindre votre serveur pour valider le domaine.</p>
<h3 data-section-id="1bpiy2b" data-start="7126" data-end="7174">1. Installer Certbot avec le plugin Nginx</h3>
<p data-start="7176" data-end="7241">Installez Certbot et son plugin Nginx avec la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>apt install certbot python3-certbot-nginx <span class="ͼ12">-y</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7301" data-end="7509">Le paquet <code data-start="7311" data-end="7320">certbot</code> fournit l’outil principal de génération et de renouvellement des certificats. Le paquet <code data-start="7409" data-end="7432">python3-certbot-nginx</code> permet à Certbot de lire et modifier automatiquement la configuration Nginx.</p>
<p data-start="7511" data-end="7599">Une fois l’installation terminée, vous pouvez vérifier que Certbot est disponible avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot <span class="ͼ12">--version</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7632" data-end="7778">Si la commande retourne une version, l’outil est prêt. Vous pouvez alors passer à la demande du certificat SSL pour votre domaine ou sous-domaine.</p>
<h3 data-section-id="1r01qxa" data-start="0" data-end="61">2. Obtenir et configurer le certificat automatiquement</h3>
<p data-start="63" data-end="256">Une fois Certbot installé, vous pouvez demander un certificat SSL pour votre domaine. Dans notre exemple, l’application est accessible via <code data-start="202" data-end="221">app.mondomaine.fr</code>. La commande à exécuter est donc :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot <span class="ͼ12">--nginx</span> <span class="ͼ12">-d</span> app.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="308" data-end="384">Remplacez bien <code data-start="323" data-end="342">app.mondomaine.fr</code> par votre propre domaine ou sous-domaine.</p>
<p data-start="386" data-end="639">Certbot va alors effectuer plusieurs actions automatiquement. Il vérifie d’abord que le domaine pointe bien vers l’adresse IP de votre VPS. Cette étape est indispensable : si le DNS n’est pas correctement configuré, la génération du certificat échouera.</p>
<p data-start="641" data-end="1053">Ensuite, Certbot demande un certificat Let’s Encrypt pour le domaine indiqué. Il analyse aussi la configuration Nginx existante afin de trouver le bloc <code data-start="793" data-end="801">server</code> correspondant à <code data-start="818" data-end="837">app.mondomaine.fr</code>. Avec le plugin Nginx, il peut modifier directement ce fichier pour ajouter l’écoute HTTPS sur le port 443, déclarer les chemins vers les certificats SSL et configurer une redirection automatique de HTTP vers HTTPS.</p>
<p data-start="1055" data-end="1406">Pendant l’exécution, Certbot peut vous demander une adresse e-mail, puis vous proposer d’accepter les conditions d’utilisation de Let’s Encrypt. Selon la version utilisée, il peut aussi demander si vous souhaitez activer la redirection automatique vers HTTPS. Pour un site ou une application en production, cette redirection est fortement recommandée.</p>
<p data-start="1408" data-end="1496">À la fin de l’opération, votre application doit être accessible avec une URL sécurisée :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://app.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1537" data-end="1693">Dans le navigateur, vous devez voir le cadenas HTTPS à côté de l’adresse. Cela confirme que Nginx sert désormais l’application via un certificat SSL valide.</p>
<h3 data-section-id="18320fo" data-start="1695" data-end="1743">3. Vérifier le renouvellement automatique</h3>
<p data-start="1745" data-end="2030">Les certificats Let’s Encrypt ont une durée de validité limitée. Certbot configure généralement un mécanisme de renouvellement automatique via <code data-start="1888" data-end="1897">systemd</code> ou via une tâche planifiée. Il est toutefois important de vérifier que ce renouvellement fonctionne correctement dès l’installation.</p>
<p data-start="2032" data-end="2135">Pour simuler un renouvellement sans modifier les certificats existants, utilisez la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot renew <span class="ͼ12">--dry-run</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2174" data-end="2378">L’option <code data-start="2183" data-end="2194">--dry-run</code> lance un test complet de renouvellement. Elle permet de vérifier que Certbot peut contacter Let’s Encrypt, valider le domaine et recharger correctement la configuration si nécessaire.</p>
<p data-start="2380" data-end="2542">Si le test se termine sans erreur, le renouvellement automatique est correctement configuré. Vous pouvez aussi consulter la liste des certificats installés avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot certificates</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2578" data-end="2832">Cette commande affiche les domaines couverts, les chemins des certificats et leur date d’expiration. Elle est utile pour contrôler rapidement l’état de vos certificats SSL, surtout si vous hébergez plusieurs applications ou sous-domaines sur le même VPS.</p>
<p data-start="2834" data-end="3031">En cas d’erreur pendant le <code data-start="2861" data-end="2870">dry-run</code>, vérifiez en priorité que le <strong>domaine pointe toujours vers le VPS</strong>, que le port 80 reste ouvert et que la configuration Nginx ne contient pas d’erreur de syntaxe.</p>
<h3 data-section-id="19ph2zy" data-start="3033" data-end="3086">4. Configuration Nginx après Certbot (annotée)</h3>
<p data-start="3088" data-end="3249">Après l’exécution de Certbot, le fichier <code data-start="3129" data-end="3164">/etc/nginx/sites-available/monapp</code> est généralement modifié automatiquement. La configuration finale ressemble à ceci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>server {
    listen 80;
    server_name app.mondomaine.fr;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name app.mondomaine.fr;

    ssl_certificate     /etc/letsencrypt/live/app.mondomaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.mondomaine.fr/privkey.pem;

    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4026" data-end="4272">Le premier bloc <code data-start="4042" data-end="4050">server</code> écoute sur le port 80. Son seul rôle est de rediriger toutes les requêtes HTTP vers l’équivalent HTTPS. Ainsi, un visiteur qui saisit <code data-start="4185" data-end="4211">http://app.mondomaine.fr</code> est automatiquement envoyé vers <code data-start="4244" data-end="4271">https://app.mondomaine.fr</code>.</p>
<p data-start="4274" data-end="4518">Le second bloc <code data-start="4289" data-end="4297">server</code> écoute sur le port 443 avec l’option <code data-start="4335" data-end="4340">ssl</code>. C’est lui qui sert réellement l’application en HTTPS. Les directives <code data-start="4411" data-end="4428">ssl_certificate</code> et <code data-start="4432" data-end="4453">ssl_certificate_key</code> indiquent les chemins des certificats générés par Let’s Encrypt.</p>
<p data-start="4520" data-end="4614">Les lignes suivantes sont ajoutées pour appliquer les paramètres SSL recommandés par Certbot :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4726" data-end="4958">Le bloc <code data-start="4734" data-end="4746">location /</code> reste très proche de la configuration HTTP initiale. Nginx continue de transmettre les requêtes vers l’application locale sur <code data-start="4873" data-end="4889">127.0.0.1:3000</code>, mais l’utilisateur, lui, communique uniquement avec Nginx en HTTPS.</p>
<p data-start="4960" data-end="5029">Après toute modification manuelle, testez toujours la configuration :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx <span class="ͼ12">-t</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5053" data-end="5108">Puis rechargez Nginx uniquement si le test est valide :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl reload nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5146" data-end="5405"><div class="bborder blue">Pour <strong>mettre en pratique cette configuration</strong> dans de bonnes conditions, les <a class="decorated-link" title="VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" data-start="5221" data-end="5266" target="_blank" rel="noopener">VPS KVM LWS</a> offrent un accès root complet, des snapshots gratuits pour sécuriser vos manipulations, ainsi qu’un support technique 7j/7 basé en France. </div></p>
<h2 data-section-id="1iif3oq" data-start="0" data-end="34">Ajouter les headers de sécurité</h2>
<p data-start="36" data-end="401">Une fois le <strong>reverse proxy disponible en HTTPS</strong>, vous pouvez renforcer la sécurité côté navigateur grâce aux headers HTTP. Ces en-têtes sont envoyés par Nginx avec les réponses du serveur. Ils indiquent au navigateur comment se comporter face à certains risques : chargement en HTTP, intégration dans une iframe, détection MIME incorrecte ou transmission du référent.</p>
<p data-start="403" data-end="488">Les headers de sécurité s’ajoutent dans le bloc <code data-start="451" data-end="459">server</code> HTTPS de votre vhost Nginx :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>server {
    listen 443 ssl;
    server_name app.mondomaine.fr;

    ssl_certificate     /etc/letsencrypt/live/app.mondomaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.mondomaine.fr/privkey.pem;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options           DENY                                   always;
    add_header X-Content-Type-Options    nosniff                                always;
    add_header Referrer-Policy           "no-referrer-when-downgrade"           always;
    add_header X-XSS-Protection          "1; mode=block"                        always;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1495" data-end="1542">Voici le rôle des principaux headers utilisés :</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="1544" data-end="2018">
<thead data-start="1544" data-end="1567">
<tr data-start="1544" data-end="1567">
<th class="last:pe-10" data-start="1544" data-end="1553" data-col-size="sm">Header</th>
<th class="last:pe-10" data-start="1553" data-end="1567" data-col-size="md">Protection</th>
</tr>
</thead>
<tbody data-start="1578" data-end="2018">
<tr data-start="1578" data-end="1666">
<td data-start="1578" data-end="1608" data-col-size="sm">
<blockquote><p><code data-start="1580" data-end="1607">Strict-Transport-Security</code></p></blockquote>
</td>
<td data-start="1608" data-end="1666" data-col-size="md">
<blockquote><p>Force l’utilisation de HTTPS pendant une durée définie</p></blockquote>
</td>
</tr>
<tr data-start="1667" data-end="1746">
<td data-start="1667" data-end="1687" data-col-size="sm">
<blockquote><p><code data-start="1669" data-end="1686">X-Frame-Options</code></p></blockquote>
</td>
<td data-start="1687" data-end="1746" data-col-size="md">
<blockquote><p>Empêche ou limite l’intégration du site dans une iframe</p></blockquote>
</td>
</tr>
<tr data-start="1747" data-end="1848">
<td data-start="1747" data-end="1774" data-col-size="sm">
<blockquote><p><code data-start="1749" data-end="1773">X-Content-Type-Options</code></p></blockquote>
</td>
<td data-start="1774" data-end="1848" data-col-size="md">
<blockquote><p>Évite que le navigateur devine un type MIME différent de celui déclaré</p></blockquote>
</td>
</tr>
<tr data-start="1849" data-end="1934">
<td data-start="1849" data-end="1869" data-col-size="sm">
<blockquote><p><code data-start="1851" data-end="1868">Referrer-Policy</code></p></blockquote>
</td>
<td data-start="1869" data-end="1934" data-col-size="md">
<blockquote><p>Contrôle les informations transmises dans l’en-tête <code data-start="1923" data-end="1932">Referer</code></p></blockquote>
</td>
</tr>
<tr data-start="1935" data-end="2018">
<td data-start="1935" data-end="1956" data-col-size="sm">
<blockquote><p><code data-start="1937" data-end="1955">X-XSS-Protection</code></p></blockquote>
</td>
<td data-start="1956" data-end="2018" data-col-size="md">
<blockquote><p>Active une protection XSS sur certains anciens navigateurs</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="2020" data-end="2292">Le header le plus sensible est <code data-start="2051" data-end="2078">Strict-Transport-Security</code>, aussi appelé HSTS. Dans l’exemple ci-dessus, la directive <code data-start="2138" data-end="2156">max-age=31536000</code> demande au navigateur d’utiliser HTTPS pendant un an. L’option <code data-start="2220" data-end="2239">includeSubDomains</code> applique aussi cette règle à tous les sous-domaines.</p>
<p data-start="2294" data-end="2626">Soyez prudent avec cette option. Si certains sous-domaines de votre domaine fonctionnent encore uniquement en HTTP, ils pourraient devenir inaccessibles pour les navigateurs ayant reçu cette règle HSTS. Avant d’activer <code data-start="2513" data-end="2532">includeSubDomains</code>, vérifiez donc que l’ensemble de vos sous-domaines importants sont bien disponibles en HTTPS.</p>
<p data-start="2628" data-end="2691">Après avoir ajouté ces headers, testez la configuration Nginx :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx <span class="ͼ12">-t</span>
systemctl reload nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2738" data-end="2800">Vous pouvez ensuite vérifier les headers envoyés avec <code data-start="2792" data-end="2798">curl</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">curl</span> <span class="ͼ12">-I</span> https://app.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2849" data-end="3055">La réponse doit afficher les en-têtes configurés. Si ce n’est pas le cas, vérifiez que les directives <code data-start="2951" data-end="2963">add_header</code> sont placées dans le bon bloc <code data-start="2994" data-end="3002">server</code> et que Nginx a bien été rechargé après modification.</p>
<h2 data-section-id="1okqifh" data-start="3057" data-end="3107">Héberger plusieurs applications sur le même VPS</h2>
<p data-start="3109" data-end="3467">L’un des grands avantages d’un reverse proxy Nginx est de pouvoir héberger plusieurs applications sur le même VPS, chacune avec son propre domaine ou sous-domaine. Vous pouvez par exemple publier une application Node.js sur <code data-start="3333" data-end="3352">app.mondomaine.fr</code> et une API Python sur <code data-start="3375" data-end="3394">api.mondomaine.fr</code>, tout en utilisant le même serveur, la même adresse IP et le même Nginx.</p>
<p data-start="3469" data-end="3660">Le principe est simple : chaque application dispose de son propre fichier de configuration dans <code data-start="3565" data-end="3594">/etc/nginx/sites-available/</code>, puis chaque fichier est activé dans <code data-start="3632" data-end="3659">/etc/nginx/sites-enabled/</code>.</p>
<p data-start="3662" data-end="3740">Créons un second vhost pour une API qui tourne localement sur le port <code data-start="3732" data-end="3738">8000</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /etc/nginx/sites-available/monapideux</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3798" data-end="3833">Ajoutez la configuration suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>server {
    listen 80;
    server_name api.mondomaine.fr;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4238" data-end="4272">Activez ensuite ce nouveau vhost :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ln</span> <span class="ͼ12">-s</span> /etc/nginx/sites-available/monapideux /etc/nginx/sites-enabled/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4357" data-end="4382">Testez la configuration :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx <span class="ͼ12">-t</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4406" data-end="4497">Si le test est valide, vous pouvez demander un certificat SSL pour ce second sous-domaine :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot <span class="ͼ12">--nginx</span> <span class="ͼ12">-d</span> api.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4549" data-end="4585">Puis rechargez Nginx si nécessaire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl reload nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4623" data-end="4667">Vous obtenez alors une architecture claire :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>app.mondomaine.fr  → HTTPS → 127.0.0.1:3000
api.mondomaine.fr  → HTTPS → 127.0.0.1:8000</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4770" data-end="5025">Chaque application reste isolée sur son propre port local, tandis que les visiteurs accèdent uniquement aux sous-domaines publics en HTTPS. Cette organisation est plus simple à maintenir que l’ouverture directe de plusieurs ports applicatifs sur Internet.</p>
<p data-start="5027" data-end="5118">Pour vérifier les vhosts actifs, vous pouvez lister le contenu du dossier <code data-start="5101" data-end="5116">sites-enabled</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-l</span> /etc/nginx/sites-enabled/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5165" data-end="5267">Cette commande permet de voir rapidement quelles configurations sont actuellement activées dans Nginx.</p>
<p data-start="5165" data-end="5267"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="17b1ln9" data-start="5269" data-end="5283">Cas avancés</h2>
<p data-start="5285" data-end="5633">La configuration précédente couvre le cas le plus courant : une application locale exposée derrière <strong>Nginx avec HTTPS</strong>. Dans la pratique, vous pouvez aussi utiliser Nginx comme reverse proxy devant un container Docker, une application temps réel utilisant WebSocket ou plusieurs services accessibles depuis des chemins différents sur un même domaine.</p>
<p data-start="5635" data-end="5848">Les exemples suivants reprennent la même logique : Nginx reste le point d’entrée public, puis transmet les requêtes vers le service interne adapté. Ces cas demandent simplement quelques directives supplémentaires.</p>
<h3 data-section-id="1oa0grk" data-start="5850" data-end="5887">1. Reverse proxy devant Docker</h3>
<p data-start="5889" data-end="6078">Si votre application tourne dans un container Docker, vous pouvez aussi la publier derrière Nginx. Le cas le plus simple consiste à exposer le port du container sur l’adresse locale du VPS.</p>
<p data-start="6080" data-end="6186">Par exemple, si votre container écoute sur le port <code data-start="6131" data-end="6137">8080</code>, la configuration Nginx peut ressembler à ceci :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6497" data-end="6615">Dans ce cas, Docker publie le service sur le port <code data-start="6547" data-end="6553">8080</code> du VPS, et Nginx se charge de l’exposer proprement via HTTPS.</p>
<p data-start="6617" data-end="6781">Si le container n’est pas exposé sur <code data-start="6654" data-end="6665">localhost</code>, mais uniquement disponible sur un réseau Docker interne, vous pouvez cibler son adresse IP dans le réseau bridge :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>proxy_pass http://172.17.0.2:8080;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6832" data-end="7148">Cette méthode fonctionne, mais elle peut être moins pratique, car l’adresse IP d’un container peut changer après un redémarrage. Avec Docker Compose, la méthode recommandée consiste plutôt à créer un réseau partagé entre le service Nginx et l’application, puis à utiliser le nom du service Docker comme hôte interne.</p>
<p data-start="7150" data-end="7423">Dans tous les cas, évitez d’exposer inutilement les ports applicatifs sur Internet. L’idéal est de laisser Nginx recevoir le trafic public en 80/443, puis de limiter les communications backend au réseau local ou au réseau Docker privé.</p>
<h3 data-section-id="1thnitp" data-start="0" data-end="27">2. Support WebSocket</h3>
<p data-start="29" data-end="343">Certaines applications web utilisent <strong>WebSocket</strong> pour maintenir une connexion persistante entre le navigateur et le serveur. C’est le cas des applications temps réel, des interfaces de chat, de certains tableaux de bord, de Socket.IO, de Next.js, de n8n ou encore de services qui diffusent des événements en continu.</p>
<p data-start="345" data-end="615">Avec une configuration reverse proxy classique, les requêtes HTTP simples fonctionnent, mais les connexions WebSocket peuvent échouer ou se couper rapidement. Pour les prendre en charge correctement, il faut transmettre les en-têtes <code data-start="578" data-end="587">Upgrade</code> et <code data-start="591" data-end="603">Connection</code> au backend.</p>
<p data-start="617" data-end="673">Voici un exemple de configuration compatible WebSocket :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;

    proxy_set_header Upgrade    $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_read_timeout 86400;
}</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1107" data-end="1411">La directive <code data-start="1120" data-end="1144">proxy_http_version 1.1</code> est importante, car WebSocket repose sur une mise à niveau de la connexion HTTP. Les lignes <code data-start="1237" data-end="1278">proxy_set_header Upgrade $http_upgrade;</code> et <code data-start="1282" data-end="1322">proxy_set_header Connection "upgrade";</code> indiquent à Nginx de transmettre cette demande de mise à niveau à l’application backend.</p>
<p data-start="1413" data-end="1674">La directive <code data-start="1426" data-end="1452">proxy_read_timeout 86400</code> permet de conserver une connexion ouverte plus longtemps. Sans ce réglage, certaines connexions persistantes peuvent être interrompues après un délai trop court, ce qui provoque des déconnexions visibles côté utilisateur.</p>
<p data-start="1676" data-end="1847">Si votre application temps réel se déconnecte après quelques secondes ou quelques minutes, vérifiez donc en priorité la présence de ces directives dans le bloc <code data-start="1836" data-end="1846">location</code>.</p>
<h3 data-section-id="1u54sn6" data-start="1849" data-end="1898">3. Routage par chemin (path-based routing)</h3>
<p data-start="1900" data-end="2175">Jusqu’ici, chaque application utilise son propre sous-domaine : <code data-start="1964" data-end="1983">app.mondomaine.fr</code>, <code data-start="1985" data-end="2004">api.mondomaine.fr</code>, etc. Il existe une autre approche : le routage par chemin. Dans ce cas, plusieurs applications sont accessibles depuis le même domaine, mais avec des chemins différents.</p>
<p data-start="2177" data-end="2190">Par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://mondomaine.fr/app1/
https://mondomaine.fr/api/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2260" data-end="2467">Cette méthode peut être utile pour regrouper plusieurs services derrière un seul nom de domaine. Nginx utilise alors plusieurs blocs <code data-start="2393" data-end="2403">location</code> pour savoir vers quelle application transmettre chaque requête.</p>
<p data-start="2469" data-end="2504">Voici un exemple de configuration :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>server {
    listen 443 ssl;
    server_name mondomaine.fr;

    ssl_certificate     /etc/letsencrypt/live/mondomaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mondomaine.fr/privkey.pem;

    location /app1/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8000/;
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3398" data-end="3592">Dans cet exemple, les requêtes vers <code data-start="3434" data-end="3442">/app1/</code> sont envoyées vers l’application locale sur le port <code data-start="3495" data-end="3501">3000</code>, tandis que les requêtes vers <code data-start="3532" data-end="3539">/api/</code> sont transmises au service local sur le port <code data-start="3585" data-end="3591">8000</code>.</p>
<p data-start="3594" data-end="3946">Attention toutefois : le routage par chemin peut nécessiter une configuration spécifique côté application. Certaines applications supposent qu’elles sont servies depuis la racine du domaine, c’est-à-dire <code data-start="3798" data-end="3801">/</code>. Si vous les placez derrière <code data-start="3831" data-end="3839">/app1/</code>, les liens internes, les fichiers CSS, les scripts JavaScript ou les redirections peuvent mal fonctionner.</p>
<p data-start="3948" data-end="4040">Quand c’est possible, l’utilisation de sous-domaines reste souvent plus simple à maintenir :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>app.mondomaine.fr
api.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4091" data-end="4231">Le routage par chemin est pratique, mais il doit être testé avec soin, surtout pour les applications qui génèrent automatiquement leurs URL.</p>
<h2 data-section-id="12rt5lv" data-start="4233" data-end="4270">Vérification du bon fonctionnement</h2>
<p data-start="4272" data-end="4474">Après avoir configuré Nginx, le reverse proxy, le certificat SSL et les éventuels headers de sécurité, il est important de vérifier chaque point avant de considérer la mise en production comme terminée.</p>
<p data-start="4476" data-end="4518">Commencez par tester la syntaxe de Nginx :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx <span class="ͼ12">-t</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4542" data-end="4578">Le résultat attendu est le suivant :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4725" data-end="4779">Vérifiez ensuite que le service Nginx est bien actif :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl status nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4817" data-end="4917">Le statut doit indiquer <code data-start="4841" data-end="4859">active (running)</code>. Si Nginx n’est pas démarré, vous pouvez le lancer avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl <span class="ͼ10">start</span> nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4954" data-end="5005">Testez ensuite l’accès HTTPS depuis un navigateur :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://app.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5046" data-end="5146">La page de votre application doit s’afficher, avec un cadenas HTTPS visible dans la barre d’adresse.</p>
<p data-start="5148" data-end="5205">Vous pouvez aussi vérifier les headers HTTP avec <code data-start="5197" data-end="5203">curl</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">curl</span> <span class="ͼ12">-I</span> https://app.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5254" data-end="5421">Cette commande doit retourner une réponse contenant les informations du serveur, le statut HTTP, ainsi que les headers de sécurité ajoutés dans la configuration Nginx.</p>
<p data-start="5423" data-end="5470">Testez ensuite la redirection HTTP vers HTTPS :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">curl</span> <span class="ͼ12">-I</span> http://app.mondomaine.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5518" data-end="5621">La réponse doit indiquer une redirection permanente, généralement avec un code <code data-start="5597" data-end="5602">301</code>, vers l’URL HTTPS.</p>
<p data-start="5623" data-end="5666">Contrôlez également le renouvellement SSL :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot renew <span class="ͼ12">--dry-run</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5705" data-end="5826">Enfin, consultez les logs pour vérifier que Nginx reçoit bien les requêtes et qu’aucune erreur liée au proxy n’apparaît :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-f</span> /var/log/nginx/access.log
tail <span class="ͼ12">-f</span> /var/log/nginx/error.log</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5908" data-end="6060">Si les accès apparaissent dans <code data-start="5939" data-end="5951">access.log</code> et qu’aucune erreur critique ne remonte dans <code data-start="5997" data-end="6008">error.log</code>, votre reverse proxy est correctement opérationnel.</p>
<h2 data-section-id="1wbg0sh" data-start="6062" data-end="6101">Erreurs fréquentes et cas de blocage</h2>
<p data-start="6103" data-end="6411">Même avec une configuration correcte, certaines erreurs peuvent apparaître lors de la mise en place d’un reverse proxy Nginx. La plus connue est l’erreur <code data-start="6257" data-end="6274">502 Bad Gateway</code>. Elle signifie généralement que Nginx fonctionne, mais qu’il ne parvient pas à joindre l’application backend indiquée dans <code data-start="6398" data-end="6410">proxy_pass</code>.</p>
<p data-start="6413" data-end="6485">Voici les problèmes les plus fréquents et les vérifications à effectuer.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="6487" data-end="7750">
<thead data-start="6487" data-end="6525">
<tr data-start="6487" data-end="6525">
<th class="last:pe-10" data-start="6487" data-end="6496" data-col-size="md">Erreur</th>
<th class="last:pe-10" data-start="6496" data-end="6513" data-col-size="md">Cause probable</th>
<th class="last:pe-10" data-start="6513" data-end="6525" data-col-size="md">Solution</th>
</tr>
</thead>
<tbody data-start="6540" data-end="7750">
<tr data-start="6540" data-end="6707">
<td data-start="6540" data-end="6560" data-col-size="md">
<blockquote><p><code data-start="6542" data-end="6559">502 Bad Gateway</code></p></blockquote>
</td>
<td data-start="6560" data-end="6649" data-col-size="md">
<blockquote><p>L’application backend ne tourne pas ou le port indiqué dans <code data-start="6622" data-end="6634">proxy_pass</code> est incorrect</p></blockquote>
</td>
<td data-start="6649" data-end="6707" data-col-size="md">
<blockquote><p>Vérifier que l’application écoute bien avec <code data-start="6695" data-end="6705">ss -tlnp</code></p></blockquote>
</td>
</tr>
<tr data-start="6708" data-end="6866">
<td data-start="6708" data-end="6728" data-col-size="md">
<blockquote><p><code data-start="6710" data-end="6720">nginx -t</code> échoue</p></blockquote>
</td>
<td data-start="6728" data-end="6781" data-col-size="md">
<blockquote><p>Erreur de syntaxe dans un fichier de configuration</p></blockquote>
</td>
<td data-start="6781" data-end="6866" data-col-size="md">
<blockquote><p>Lire le message d’erreur : il indique généralement le fichier et la ligne fautive</p></blockquote>
</td>
</tr>
<tr data-start="6867" data-end="7023">
<td data-start="6867" data-end="6908" data-col-size="md">
<blockquote><p>Certbot échoue avec une erreur de port</p></blockquote>
</td>
<td data-start="6908" data-end="6954" data-col-size="md">
<blockquote><p>Le port 80 est déjà utilisé ou inaccessible</p></blockquote>
</td>
<td data-start="6954" data-end="7023" data-col-size="md">
<blockquote><p>Vérifier les services actifs avec <code data-start="6990" data-end="7000">ss -tlnp</code> et ouvrir le port 80</p></blockquote>
</td>
</tr>
<tr data-start="7024" data-end="7181">
<td data-start="7024" data-end="7056" data-col-size="md">
<blockquote><p>Certbot échoue à cause du DNS</p></blockquote>
</td>
<td data-start="7056" data-end="7102" data-col-size="md">
<blockquote><p>Le domaine ne pointe pas encore vers le VPS</p></blockquote>
</td>
<td data-start="7102" data-end="7181" data-col-size="md">
<blockquote><p>Vérifier avec <code data-start="7118" data-end="7148">dig +short app.mondomaine.fr</code> et attendre la propagation DNS</p></blockquote>
</td>
</tr>
<tr data-start="7182" data-end="7353">
<td data-start="7182" data-end="7227" data-col-size="md">
<blockquote><p>Les headers de sécurité n’apparaissent pas</p></blockquote>
</td>
<td data-start="7227" data-end="7289" data-col-size="md">
<blockquote><p>Les directives <code data-start="7244" data-end="7256">add_header</code> sont placées au mauvais endroit</p></blockquote>
</td>
<td data-start="7289" data-end="7353" data-col-size="md">
<blockquote><p>Les placer dans le bloc <code data-start="7315" data-end="7323">server</code> HTTPS, puis recharger Nginx</p></blockquote>
</td>
</tr>
<tr data-start="7354" data-end="7558">
<td data-start="7354" data-end="7401" data-col-size="md">
<blockquote><p>L’application voit toujours l’IP <code data-start="7389" data-end="7400">127.0.0.1</code></p></blockquote>
</td>
<td data-start="7401" data-end="7471" data-col-size="md">
<blockquote><p>Les headers proxy ne sont pas transmis ou pas lus par l’application</p></blockquote>
</td>
<td data-start="7471" data-end="7558" data-col-size="md">
<blockquote><p>Vérifier <code data-start="7482" data-end="7493">X-Real-IP</code> et configurer le framework backend pour lire les headers proxy</p></blockquote>
</td>
</tr>
<tr data-start="7559" data-end="7750">
<td data-start="7559" data-end="7596" data-col-size="md">
<blockquote><p>WebSocket se déconnecte rapidement</p></blockquote>
</td>
<td data-start="7596" data-end="7678" data-col-size="md">
<blockquote><p>Les headers <code data-start="7610" data-end="7619">Upgrade</code> et <code data-start="7623" data-end="7635">Connection</code> sont absents ou le timeout est trop court</p></blockquote>
</td>
<td data-start="7678" data-end="7750" data-col-size="md">
<blockquote><p>Ajouter la configuration WebSocket et augmenter <code data-start="7728" data-end="7748">proxy_read_timeout</code></p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="7752" data-end="7869">Pour diagnostiquer une erreur <code data-start="7782" data-end="7799">502 Bad Gateway</code>, commencez par vérifier que l’application backend répond localement :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">curl</span> http://127.0.0.1:3000</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7911" data-end="8087">Si cette commande échoue, le problème vient de l’application, pas de Nginx. Vérifiez alors le processus, le port d’écoute, les logs applicatifs ou le service <code data-start="8069" data-end="8078">systemd</code> associé.</p>
<p data-start="8089" data-end="8164">Vous pouvez aussi identifier les ports réellement ouverts sur le VPS avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>ss <span class="ͼ12">-tlnp</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="8188" data-end="8305">Cette commande permet de voir si une application écoute bien sur <code data-start="8253" data-end="8269">127.0.0.1:3000</code>, <code data-start="8271" data-end="8287">127.0.0.1:8000</code> ou un autre port.</p>
<p data-start="8307" data-end="8367">En cas d’erreur Nginx, consultez toujours le journal dédié :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-f</span> /var/log/nginx/error.log</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="8415" data-end="8679">Les messages y sont souvent explicites : port refusé, hôte introuvable, permission insuffisante, timeout ou erreur de configuration. Une lecture attentive du log permet généralement d’identifier rapidement la cause du blocage.</p>
<h2 data-section-id="kgs582" data-start="0" data-end="19">Bonnes pratiques</h2>
<p data-start="21" data-end="435">Avant toute modification importante sur un serveur en production, commencez par <a title="Sauvegarde automatique VPS : rsync, cron et snapshots" href="https://tutoriels.lws.fr/vps/sauvegarde-automatique-vps">sauvegarder votre VPS avant toute modification de configuration Nginx</a>. Sur un VPS KVM LWS, l’utilisation d’un snapshot permet de revenir rapidement à un état stable si une erreur de configuration rend Nginx inaccessible ou perturbe vos applications. C’est une précaution simple, mais très utile avant de modifier un vhost, d’ajouter SSL ou de revoir les règles de pare-feu.</p>
<p data-start="437" data-end="712">Il est aussi recommandé de séparer chaque application dans son propre fichier de configuration. Évitez de tout placer dans <code data-start="560" data-end="583">/etc/nginx/nginx.conf</code>. Ce fichier doit rester réservé à la <strong>configuration globale de Nginx</strong>. Pour vos applications, utilisez plutôt cette organisation :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/etc/nginx/sites-available/monapp
/etc/nginx/sites-available/api
/etc/nginx/sites-available/admin</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="825" data-end="940">Puis activez uniquement les configurations nécessaires avec des liens symboliques dans <code data-start="912" data-end="939">/etc/nginx/sites-enabled/</code>.</p>
<p data-start="942" data-end="1019">Pensez également à désactiver le vhost par défaut si vous ne l’utilisez pas :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">rm</span> /etc/nginx/sites-enabled/default
nginx <span class="ͼ12">-t</span>
systemctl reload nginx</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1102" data-end="1258">Cette action évite que la page de bienvenue Nginx reste accessible depuis l’adresse IP du VPS ou qu’un domaine non configuré tombe sur un contenu générique.</p>
<p data-start="1260" data-end="1343">Autre règle importante : testez toujours la configuration avant de recharger Nginx.</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nginx <span class="ͼ12">-t</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1367" data-end="1513">Si le test échoue, ne lancez pas <code data-start="1400" data-end="1424">systemctl reload nginx</code>. Lisez d’abord le message d’erreur, corrigez le fichier concerné, puis relancez le test.</p>
<p data-start="1515" data-end="1630">Vous pouvez aussi activer la compression gzip pour améliorer les performances sur les réponses texte, JSON ou CSS :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>gzip on;
gzip_types text/plain text/css application/json application/javascript application/xml;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1743" data-end="1874">Placez cette configuration dans le bloc <code data-start="1783" data-end="1791">server</code> ou dans la configuration globale si vous souhaitez l’appliquer à plusieurs vhosts.</p>
<p data-start="1876" data-end="1949">Surveillez régulièrement les logs, surtout après une mise en production :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-f</span> /var/log/nginx/access.log
tail <span class="ͼ12">-f</span> /var/log/nginx/error.log</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2031" data-end="2228">Le fichier <code data-start="2042" data-end="2054">access.log</code> permet de suivre les requêtes entrantes. Le fichier <code data-start="2107" data-end="2118">error.log</code> aide à identifier les erreurs de proxy, les timeouts, les problèmes de certificats ou les erreurs de syntaxe.</p>
<p data-start="2230" data-end="2293">Enfin, contrôlez périodiquement vos certificats Let’s Encrypt :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>certbot certificates</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2329" data-end="2725">Cette commande affiche les certificats installés, leurs domaines associés et leur date d’expiration. Pour limiter les risques, pensez aussi à sauvegarder votre VPS avant toute modification importante de <strong>configuration Nginx</strong>. Vous pouvez vous appuyer sur une stratégie de sauvegarde sur VPS et renforcer la sécurité de votre serveur, notamment avant d’exposer une nouvelle application sur Internet.</p>
<p data-start="2727" data-end="3038">Pour les profils avancés, un outil d’assistance au développement peut également aider à relire une configuration complexe. Par exemple, vous pouvez <a title="Claude Code sur VPS LWS : installation et premiers cas d&#039;usage 2026" href="https://tutoriels.lws.fr/intelligence-artificielle/installer-claude-code-vps-lws">analyser et optimiser votre configuration Nginx avec Claude Code</a> dans le cadre d’un workflow d’administration plus technique.</p>
<h2 data-section-id="vi5xqa" data-start="3040" data-end="3053">FAQ</h2>
<p data-start="3125" data-end="3195"><strong data-start="3125" data-end="3195">Qu’est-ce qu’un reverse proxy Nginx et à quoi ça sert sur un VPS ?</strong></p>
<p data-start="3197" data-end="3556">Un reverse proxy Nginx sert d’intermédiaire entre les visiteurs et les applications hébergées sur votre VPS. Il reçoit les requêtes en HTTP ou HTTPS, puis les transmet à une application locale, par exemple sur <code data-start="3407" data-end="3423">127.0.0.1:3000</code>. Cela permet de centraliser le SSL, de masquer les ports applicatifs et d’héberger plusieurs services derrière une seule adresse IP.</p>
<p data-start="3558" data-end="3646"><strong data-start="3558" data-end="3646">Quelle est la différence entre <code data-start="3591" data-end="3603">proxy_pass</code> et un serveur web classique avec Nginx ?</strong></p>
<p data-start="3648" data-end="3954">Avec un serveur web classique, Nginx sert directement des fichiers statiques ou transmet des fichiers PHP à un moteur comme PHP-FPM. Avec <code data-start="3786" data-end="3798">proxy_pass</code>, Nginx ne sert pas directement l’application : il relaie les requêtes vers un backend déjà lancé, comme une application Node.js, Python, Docker ou une API.</p>
<p data-start="3956" data-end="4021"><strong data-start="3956" data-end="4021">Comment héberger plusieurs sites sur le même VPS avec Nginx ?</strong></p>
<p data-start="4023" data-end="4324">Il suffit de créer un vhost par domaine ou sous-domaine dans <code data-start="4084" data-end="4113">/etc/nginx/sites-available/</code>, puis de l’activer dans <code data-start="4138" data-end="4165">/etc/nginx/sites-enabled/</code>. Chaque vhost peut rediriger vers un port local différent, par exemple <code data-start="4237" data-end="4256">app.mondomaine.fr</code> vers <code data-start="4262" data-end="4278">127.0.0.1:3000</code> et <code data-start="4282" data-end="4301">api.mondomaine.fr</code> vers <code data-start="4307" data-end="4323">127.0.0.1:8000</code>.</p>
<p data-start="4326" data-end="4407"><strong data-start="4326" data-end="4407">Le certificat Let’s Encrypt se renouvelle-t-il automatiquement avec Certbot ?</strong></p>
<p data-start="4409" data-end="4608">Oui, Certbot configure généralement un renouvellement automatique via <code data-start="4479" data-end="4488">systemd</code> ou une tâche planifiée. Il est conseillé de vérifier son bon fonctionnement avec la commande <code data-start="4582" data-end="4607">certbot renew --dry-run</code>.</p>
<p data-start="4610" data-end="4663"><strong data-start="4610" data-end="4663">Nginx reverse proxy fonctionne-t-il avec Docker ?</strong></p>
<p data-start="4665" data-end="4899">Oui. Nginx peut transmettre les requêtes vers un container Docker exposé sur un port local, par exemple <code data-start="4769" data-end="4785">127.0.0.1:8080</code>. Avec Docker Compose, il est aussi possible d’utiliser un réseau partagé entre Nginx et les services applicatifs.</p>
<p data-start="4901" data-end="4966"><strong data-start="4901" data-end="4966">Comment diagnostiquer une erreur 502 Bad Gateway avec Nginx ?</strong></p>
<p data-start="4968" data-end="5244">Une erreur <code data-start="4979" data-end="4996">502 Bad Gateway</code> signifie souvent que Nginx ne parvient pas à joindre l’application backend. Vérifiez d’abord que l’application tourne bien avec <code data-start="5125" data-end="5153">curl http://127.0.0.1:3000</code>, puis contrôlez les ports ouverts avec <code data-start="5193" data-end="5203">ss -tlnp</code> et consultez <code data-start="5217" data-end="5243">/var/log/nginx/error.log</code>.</p>
<p data-start="8060" data-end="8314"><div class="bborder blue">Vous cherchez un VPS Linux performant pour déployer vos applications derrière Nginx ? Découvrez les <a class="decorated-link" title="VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" data-start="8160" data-end="8205" target="_blank" rel="noopener">VPS KVM LWS</a> avec SSD NVMe, protection anti-DDoS incluse, accès root complet et datacenters français certifiés ISO 27001.</div></p>
<h2 data-section-id="8dtpi" data-start="8347" data-end="8360">Conclusion</h2>
<p data-start="8362" data-end="8701">Configurer Nginx comme <strong>reverse proxy sur un VPS Linux</strong> permet de publier une ou plusieurs applications de manière propre, sécurisée et évolutive. Au lieu d’exposer directement des ports applicatifs comme <code data-start="8565" data-end="8571">3000</code>, <code data-start="8573" data-end="8579">8000</code> ou <code data-start="8583" data-end="8589">8080</code>, vous centralisez les accès via Nginx, avec HTTPS, redirection automatique, headers de sécurité et logs dédiés.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Cette architecture convient aussi bien à une application Node.js qu’à une API Python, un container Docker ou plusieurs services hébergés sur le même VPS. En respectant les bonnes pratiques essentielles : test systématique avec <code data-start="8930" data-end="8940">nginx -t</code>, sauvegarde avant modification, vhosts séparés, surveillance des logs et vérification des certificats, vous disposez d’une base solide pour administrer vos applications web en production.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p data-start="8362" data-end="8701"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<p data-start="8703" data-end="9129" data-is-last-node="" data-is-only-node=""><em>Vous avez une question, une difficulté avec votre configuration Nginx ou une astuce à partager ? N’hésitez pas à laisser un commentaire sous cet article pour échanger avec la communauté LWS.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/nginx-reverse-proxy-vps/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29446</post-id>	</item>
		<item>
		<title>Sauvegarde automatique VPS : mettre en place rsync, cron et snapshots en 2026</title>
		<link>https://tutoriels.lws.fr/vps/sauvegarde-automatique-vps</link>
					<comments>https://tutoriels.lws.fr/vps/sauvegarde-automatique-vps#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 10:46:30 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=29414</guid>

					<description><![CDATA[Gérer un VPS en production sans stratégie de sauvegarde claire expose votre site, votre application ou votre base de données à un risque majeur : la perte de données. ⚡Une mauvaise commande SSH, une mise à jour système qui échoue, une suppression accidentelle ou une intrusion peuvent suffire à rendre un serveur inutilisable. 💥Beaucoup d’administrateurs &#8230; <a href="https://tutoriels.lws.fr/vps/sauvegarde-automatique-vps" class="more-link">Continue reading <span class="screen-reader-text">Sauvegarde automatique VPS : mettre en place rsync, cron et snapshots en 2026</span></a>]]></description>
										<content:encoded><![CDATA[<p data-start="17" data-end="918">Gérer un <strong data-start="26" data-end="47">VPS en production</strong> sans stratégie de sauvegarde claire expose votre site, votre application ou votre base de données à un risque majeur : la <strong data-start="170" data-end="190">perte de données</strong>. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />Une mauvaise commande SSH, une mise à jour système qui échoue, une suppression accidentelle ou une intrusion peuvent suffire à rendre un serveur inutilisable. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a5.png" alt="💥" class="wp-smiley" style="height: 1em; max-height: 1em;" />Beaucoup d’administrateurs pensent être protégés parce que leur hébergeur propose des sauvegardes, mais ils ne savent pas toujours <strong data-start="482" data-end="507">ce qui est sauvegardé</strong>, <strong data-start="509" data-end="531">à quelle fréquence</strong>, ni <strong data-start="536" data-end="568">comment restaurer rapidement</strong>.</p>
<p data-start="17" data-end="918">Pour sécuriser réellement un serveur Linux, il est préférable de combiner plusieurs niveaux de protection : les <strong data-start="682" data-end="710">sauvegardes automatiques</strong>, les <strong data-start="716" data-end="729">snapshots</strong> et une <strong data-start="737" data-end="769">sauvegarde rsync automatisée</strong> vers une destination distante. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />C’est cette approche complète que nous allons mettre en place dans ce tutoriel.</p>
<h2 data-section-id="clqq33" data-start="920" data-end="944">Objectif</h2>
<p data-start="946" data-end="1700"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’objectif de ce guide est de vous aider à mettre en place une <strong data-start="1009" data-end="1039">sauvegarde automatique VPS</strong> fiable, compréhensible et adaptée à un usage réel. Vous allez apprendre à sauvegarder des répertoires importants avec <strong data-start="1158" data-end="1167">rsync</strong>, à planifier l’exécution du script avec <strong data-start="1208" data-end="1216">cron</strong>, puis à compléter cette stratégie avec les <strong data-start="1260" data-end="1283">snapshots LWS Panel</strong>. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" />À la fin du tutoriel, vous disposerez d’un script fonctionnel, d’une tâche cron automatisée, d’une méthode pour exporter vos bases <strong data-start="1416" data-end="1433">MySQL/MariaDB</strong> et d’une vision claire de la différence entre une <strong data-start="1484" data-end="1507">sauvegarde distante</strong> et un <strong data-start="1514" data-end="1534">snapshot serveur</strong>.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> L’objectif n’est pas seulement de copier des fichiers, mais de construire une stratégie de restauration réaliste, testable et adaptée à un <strong data-start="1675" data-end="1699">VPS Debian ou Ubuntu</strong>.</p>
<h2 data-section-id="8h46jw" data-start="1702" data-end="1791">Les trois niveaux de protection d&rsquo;un VPS : ce qu&rsquo;il faut comprendre avant de commencer</h2>
<p data-start="1793" data-end="2254">Un <strong data-start="1796" data-end="1816">VPS bien protégé</strong> ne repose pas sur une seule méthode de sauvegarde. En pratique, il faut combiner plusieurs couches, car elles ne répondent pas au même besoin. Une sauvegarde automatique fournie par l’hébergeur permet de revenir à un état global du serveur. Un snapshot sert plutôt à figer le VPS avant une opération risquée. Une sauvegarde rsync, elle, permet de copier des fichiers ciblés vers une destination externe, avec une fréquence personnalisée.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><img class="aligncenter wp-image-29425 size-full"  alt="Sauvegardes automatiques VPS : Les trois niveaux de protection d'un VPS KVM LWS" width="1000" height="563" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Les-trois-niveaux-de-protection-dun-VPS.webp"></div>
</div>
<p data-start="2862" data-end="3212">Ces trois niveaux doivent être vus comme <strong data-start="2903" data-end="2922">complémentaires</strong>. Par exemple, avant une mise à jour système importante, un <strong data-start="2982" data-end="2994">snapshot</strong> permet de revenir rapidement en arrière si le serveur ne redémarre pas correctement. En revanche, pour conserver des fichiers sur plusieurs jours ou semaines, il faut prévoir une <strong data-start="3174" data-end="3197">sauvegarde distante</strong> avec rotation.</p>
<p data-start="3214" data-end="3612">Cette approche rejoint la règle de sauvegarde <strong data-start="3260" data-end="3269">3-2-1</strong>, recommandée comme bonne pratique de protection des données : conserver <strong data-start="3342" data-end="3354">3 copies</strong> des données, sur <strong data-start="3372" data-end="3397">2 supports différents</strong>, avec au moins <strong data-start="3413" data-end="3434">1 copie hors site</strong>. La CISA présente cette règle comme une base fiable pour protéger les fichiers importants, notamment en cas d’incident ou de compromission.</p>
<p data-start="3614" data-end="4001">Appliquée à un <strong data-start="3629" data-end="3642">VPS Linux</strong>, cette logique peut se traduire ainsi : vos données de production restent sur le serveur, les <strong data-start="3737" data-end="3769">sauvegardes automatiques LWS</strong> constituent un filet de sécurité côté infrastructure, et une copie <strong data-start="3837" data-end="3855">rsync distante</strong> ajoute une protection supplémentaire hors du VPS source. Il ne faut donc pas opposer ces outils, mais les organiser dans une stratégie cohérente.</p>
<h2 data-section-id="2477ua" data-start="4003" data-end="4081">Les sauvegardes automatiques LWS : ce qui est inclus et comment en profiter</h2>
<p><img class="aligncenter size-full wp-image-29424"  alt="Les sauvegardes automatiques LWS : ce qui est inclus et comment en profiter" width="1000" height="563" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Les-sauvegardes-automatiques-LWS-_ce-qui-est-inclus-et-comment-en-profiter.webp"></p>
<p data-start="4083" data-end="4447">Sur les offres VPS, LWS met à disposition des mécanismes de protection utiles pour limiter les risques de perte de données. La page des <strong data-start="4219" data-end="4239">serveurs VPS LWS</strong> mentionne des <strong data-start="4254" data-end="4305">sauvegardes complètes automatiques journalières</strong> du serveur sur un <strong data-start="4324" data-end="4340">NAS sécurisé</strong>, ainsi qu’un outil de <strong data-start="4363" data-end="4375">snapshot</strong> accessible pour les serveurs VPS.</p>
<p data-start="4449" data-end="4972">Pour les <strong data-start="4458" data-end="4473">VPS KVM LWS</strong>, les sauvegardes automatiques incluses sont réalisées <strong data-start="4556" data-end="4572">chaque matin</strong> et stockées sur un <strong data-start="4592" data-end="4605">NAS dédié</strong>. Ces sauvegardes peuvent être conservées après les <strong data-start="4684" data-end="4704">30 jours offerts</strong> pour <strong data-start="4710" data-end="4734">20 % du tarif du VPS</strong>. Il existe aussi des <strong data-start="4769" data-end="4791">snapshots gratuits</strong>, jusqu’à <strong data-start="4801" data-end="4829">3 instantanés simultanés</strong>, utiles pour figer l’état d’un VPS KVM avant un test, une mise à jour ou un changement de configuration.</p>
<p data-start="4974" data-end="5521">Concrètement, ces sauvegardes hébergeur sont précieuses parce qu’elles permettent de restaurer un serveur depuis l’interface LWS, sans avoir à reconstruire manuellement tout l’environnement. Elles sont particulièrement utiles en cas de suppression massive, d’erreur de configuration ou de problème système. En revanche, elles ne doivent pas remplacer votre propre <strong data-start="5338" data-end="5371">plan de sauvegarde applicatif</strong>. Pour un serveur critique, il reste recommandé d’ajouter une copie distante de vos fichiers, de vos exports SQL et de vos configurations importantes.</p>
<p data-start="5523" data-end="6230">Les <strong data-start="5527" data-end="5544">snapshots LWS</strong> répondent à un autre usage. LWS explique qu’un snapshot est une capture de l’état d’un serveur VPS à un instant donné, incluant les fichiers, les configurations et les données présentes au moment de sa création. Il précise aussi qu’un snapshot <strong data-start="5808" data-end="5842">ne remplace pas une sauvegarde</strong>, car il n’est pas conservé physiquement sur un NAS comme les sauvegardes disponibles dans l’espace client.</p>
<p data-start="5523" data-end="6230">La documentation indique également une limite de <strong data-start="5999" data-end="6023">10 snapshots maximum</strong>, une conservation de <strong data-start="6045" data-end="6066">48 heures maximum</strong>, et signale qu’en cas de <strong data-start="6092" data-end="6117">réinstallation du VPS</strong>, les snapshots existants sont supprimés et ne peuvent plus être restaurés.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="6232" data-end="6866">
<thead data-start="6232" data-end="6277">
<tr data-start="6232" data-end="6277">
<th class="last:pe-10" data-start="6232" data-end="6244" data-col-size="md">Situation</th>
<th class="last:pe-10" data-start="6244" data-end="6263" data-col-size="sm">Outil recommandé</th>
<th class="last:pe-10" data-start="6263" data-end="6277" data-col-size="md">Pourquoi ?</th>
</tr>
</thead>
<tbody data-start="6292" data-end="6866">
<tr data-start="6292" data-end="6402">
<td data-start="6292" data-end="6332" data-col-size="md">
<blockquote><p>Avant une mise à jour système risquée</p></blockquote>
</td>
<td data-col-size="sm" data-start="6332" data-end="6351">
<blockquote><p><strong data-start="6334" data-end="6350">Snapshot LWS</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="6351" data-end="6402">
<blockquote><p>Permet de revenir rapidement à l’état précédent</p></blockquote>
</td>
</tr>
<tr data-start="6403" data-end="6515">
<td data-start="6403" data-end="6453" data-col-size="md">
<blockquote><p>Avant une modification de configuration serveur</p></blockquote>
</td>
<td data-col-size="sm" data-start="6453" data-end="6472">
<blockquote><p><strong data-start="6455" data-end="6471">Snapshot LWS</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="6472" data-end="6515">
<blockquote><p>Utile pour tester sans repartir de zéro</p></blockquote>
</td>
</tr>
<tr data-start="6516" data-end="6629">
<td data-start="6516" data-end="6568" data-col-size="md">
<blockquote><p>Sauvegarde quotidienne des fichiers de production</p></blockquote>
</td>
<td data-col-size="sm" data-start="6568" data-end="6587">
<blockquote><p><strong data-start="6570" data-end="6586">rsync + cron</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="6587" data-end="6629">
<blockquote><p>Permet une copie ciblée et automatisée</p></blockquote>
</td>
</tr>
<tr data-start="6630" data-end="6755">
<td data-start="6630" data-end="6671" data-col-size="md">
<blockquote><p>Protection globale côté infrastructure</p></blockquote>
</td>
<td data-col-size="sm" data-start="6671" data-end="6706">
<blockquote><p><strong data-start="6673" data-end="6705">Sauvegardes automatiques LWS</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="6706" data-end="6755">
<blockquote><p>Filet de sécurité restaurable depuis le panel</p></blockquote>
</td>
</tr>
<tr data-start="6756" data-end="6866">
<td data-start="6756" data-end="6784" data-col-size="md">
<blockquote><p>Conservation longue durée</p></blockquote>
</td>
<td data-col-size="sm" data-start="6784" data-end="6824">
<blockquote><p><strong data-start="6786" data-end="6823">Sauvegarde distante avec rotation</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="6824" data-end="6866">
<blockquote><p>Plus adaptée qu’un snapshot temporaire</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="6868" data-end="7262">Le bon réflexe consiste donc à utiliser les <strong data-start="6912" data-end="6925">snapshots</strong> pour les opérations ponctuelles à risque, et les <strong data-start="6975" data-end="7003">sauvegardes automatiques</strong> comme sécurité d’infrastructure. Pour les données que vous devez maîtriser finement, comme les fichiers d’un site web, les exports de base de données ou les configurations personnalisées, la solution la plus souple reste une <strong data-start="7229" data-end="7261">sauvegarde rsync automatique</strong>.</p>
<p data-start="7264" data-end="7543">Pour accéder aux snapshots, rendez-vous dans la section « <strong data-start="7335" data-end="7380">Panel KVM &gt; Snapshots </strong>».</p>
<p data-start="7264" data-end="7543"><img class="aligncenter wp-image-29428 size-full"  alt="Snapshots" width="1182" height="896" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Snapshots.webp"></p>
<p data-start="7264" data-end="7543">Ensuite, cliquez sur le bouton « <strong data-start="7335" data-end="7380">Créer un snapshot </strong>».</p>
<p data-start="7264" data-end="7543"><img class="aligncenter wp-image-29422 size-full"  alt="Créer un snapshot sur VPS KVM LWS" width="1411" height="566" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Creer-un-snapshot.webp"></p>
<p data-start="7264" data-end="7543">Vous pouvez alors gérer les snapshots crées depuis la même page.</p>
<h2 data-section-id="2whzbt" data-start="0" data-end="39">Préparer l&rsquo;environnement : pré-requis</h2>
<p><img class="aligncenter size-full wp-image-29426"  alt="Préparer l'environnement : pré-requis" width="1000" height="563" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Preparer-lenvironnement_pre-requis.webp"></p>
<p data-start="41" data-end="460">Avant de créer votre <strong data-start="62" data-end="90">script de sauvegarde VPS</strong>, vous devez vérifier que l’environnement est prêt. Ce tutoriel s’adresse principalement à un <strong data-start="184" data-end="197">VPS Linux</strong> sous <strong data-start="203" data-end="219">Debian 11/12</strong> ou <strong data-start="223" data-end="245">Ubuntu 22.04/24.04</strong>, avec un accès <strong data-start="261" data-end="273">root SSH</strong> ou un utilisateur disposant des droits nécessaires. Les commandes peuvent aussi être adaptées à d’autres distributions Linux, mais les chemins de logs et certains paquets peuvent varier.</p>
<p data-start="462" data-end="647">Le premier outil indispensable est <strong data-start="497" data-end="506">rsync</strong>. Il est généralement présent sur de nombreuses distributions Linux, mais il est préférable de vérifier sa disponibilité avant de continuer :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>rsync <span class="ͼ12">--version</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Si la commande retourne un numéro de version, <strong data-start="724" data-end="733">rsync</strong> est bien installé. Dans le cas contraire, vous pouvez l’installer avec le gestionnaire de paquets de votre distribution. Sur Debian ou Ubuntu, utilisez :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>apt update
apt install rsync</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="931" data-end="1342">Vous devez ensuite disposer d’une <strong data-start="965" data-end="989">destination distante</strong> pour recevoir les sauvegardes. Il peut s’agir d’un second VPS, d’un serveur de stockage, d’un NAS accessible en SSH ou d’un espace compatible <strong data-start="1132" data-end="1144">SFTP/SCP</strong>. L’important est de ne pas stocker vos seules sauvegardes sur le même VPS que la source. Si le serveur est compromis, supprimé ou inaccessible, les sauvegardes locales risquent de l’être également.</p>
<p data-start="1344" data-end="1586">Pour automatiser la sauvegarde avec <strong data-start="1380" data-end="1388">cron</strong>, l’authentification entre le VPS source et la destination doit se faire par <strong data-start="1465" data-end="1476">clé SSH</strong>, sans mot de passe interactif. Vous pouvez générer une clé dédiée aux sauvegardes avec la commande suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>ssh-keygen <span class="ͼ12">-t</span> ed25519 <span class="ͼ12">-f</span> ~/.ssh/backup_key <span class="ͼ12">-N</span> <span class="ͼz">""</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1650" data-end="1818">Cette commande crée une paire de clés : une clé privée <code data-start="1705" data-end="1717">backup_key</code> et une clé publique <code data-start="1738" data-end="1754">backup_key.pub</code>. Copiez ensuite la clé publique sur le serveur de destination :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>ssh-copy-id <span class="ͼ12">-i</span> ~/.ssh/backup_key.pub user@serveur-destination</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Remplacez <strong data-start="1905" data-end="1913">user</strong> par l’utilisateur SSH distant et <strong data-start="1947" data-end="1970">serveur-destination</strong> par l’adresse IP ou le nom de domaine du serveur de sauvegarde. Une fois cette étape terminée, testez la connexion :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ssh</span> <span class="ͼ12">-i</span> ~/.ssh/backup_key user@serveur-destination</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Si la connexion fonctionne sans demande de mot de passe, votre environnement est prêt pour une <strong data-start="2247" data-end="2279">sauvegarde rsync automatique</strong>.</div>
<div><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h2 data-section-id="1tupudn" data-start="2320" data-end="2358">Créer un script de sauvegarde rsync</h2>
<p data-start="2360" data-end="2726"><strong data-start="2360" data-end="2369">rsync</strong> est un utilitaire de synchronisation très utilisé sous Linux. Il permet de copier des fichiers d’un serveur vers un autre en transférant uniquement les différences entre la source et la destination. Cette approche le rend particulièrement adapté à une <strong data-start="2622" data-end="2652">sauvegarde automatique VPS</strong>, car elle évite de recopier l’intégralité des données à chaque exécution.</p>
<p data-start="2728" data-end="3010">Dans ce tutoriel, nous allons créer un script qui sauvegarde des répertoires importants comme <strong data-start="2822" data-end="2834">/var/www</strong>, <strong data-start="2836" data-end="2844">/etc</strong> et <strong data-start="2848" data-end="2857">/home</strong> vers un serveur distant. Le script écrira également ses actions dans un fichier de log afin de vérifier facilement si la sauvegarde s’est bien déroulée.</p>
<h3 data-section-id="6w8p7j" data-start="3012" data-end="3062">1. Comprendre les options rsync essentielles</h3>
<p data-start="3064" data-end="3272">Avant d’écrire le script complet, il est utile de comprendre les principales options de <strong data-start="3152" data-end="3161">rsync</strong>. Elles déterminent la manière dont les fichiers sont copiés, compressés, supprimés ou exclus de la sauvegarde.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="3274" data-end="4080">
<thead data-start="3274" data-end="3300">
<tr data-start="3274" data-end="3300">
<th class="last:pe-10" data-start="3274" data-end="3283" data-col-size="sm">Option</th>
<th class="last:pe-10" data-start="3283" data-end="3300" data-col-size="lg">Signification</th>
</tr>
</thead>
<tbody data-start="3311" data-end="4080">
<tr data-start="3311" data-end="3441">
<td data-start="3311" data-end="3318" data-col-size="sm">
<blockquote><p><code data-start="3313" data-end="3317">-a</code></p></blockquote>
</td>
<td data-start="3318" data-end="3441" data-col-size="lg">
<blockquote><p>Active le <strong data-start="3330" data-end="3346">mode archive</strong>. Il conserve les permissions, les dates, les liens symboliques et la structure des fichiers.</p></blockquote>
</td>
</tr>
<tr data-start="3442" data-end="3544">
<td data-start="3442" data-end="3449" data-col-size="sm">
<blockquote><p><code data-start="3444" data-end="3448">-v</code></p></blockquote>
</td>
<td data-start="3449" data-end="3544" data-col-size="lg">
<blockquote><p>Active le mode <strong data-start="3466" data-end="3477">verbose</strong>, utile pour afficher les fichiers traités pendant la sauvegarde.</p></blockquote>
</td>
</tr>
<tr data-start="3545" data-end="3651">
<td data-start="3545" data-end="3552" data-col-size="sm">
<blockquote><p><code data-start="3547" data-end="3551">-z</code></p></blockquote>
</td>
<td data-start="3552" data-end="3651" data-col-size="lg">
<blockquote><p>Compresse les données pendant le transfert, ce qui peut réduire le volume envoyé sur le réseau.</p></blockquote>
</td>
</tr>
<tr data-start="3652" data-end="3770">
<td data-start="3652" data-end="3665" data-col-size="sm">
<blockquote><p><code data-start="3654" data-end="3664">--delete</code></p></blockquote>
</td>
<td data-start="3665" data-end="3770" data-col-size="lg">
<blockquote><p>Supprime sur la destination les fichiers qui n’existent plus sur la source. À utiliser avec prudence.</p></blockquote>
</td>
</tr>
<tr data-start="3771" data-end="3889">
<td data-start="3771" data-end="3785" data-col-size="sm">
<blockquote><p><code data-start="3773" data-end="3784">--exclude</code></p></blockquote>
</td>
<td data-start="3785" data-end="3889" data-col-size="lg">
<blockquote><p>Exclut certains fichiers ou dossiers, par exemple les caches, logs temporaires ou fichiers inutiles.</p></blockquote>
</td>
</tr>
<tr data-start="3890" data-end="3995">
<td data-start="3890" data-end="3924" data-col-size="sm">
<blockquote><p><code data-start="3892" data-end="3923">-e "ssh -i ~/.ssh/backup_key"</code></p></blockquote>
</td>
<td data-start="3924" data-end="3995" data-col-size="lg">
<blockquote><p>Force l’utilisation d’une <strong data-start="3952" data-end="3974">clé SSH spécifique</strong> pour le transfert.</p></blockquote>
</td>
</tr>
<tr data-start="3996" data-end="4080">
<td data-start="3996" data-end="4011" data-col-size="sm">
<blockquote><p><code data-start="3998" data-end="4010">--log-file</code></p></blockquote>
</td>
<td data-start="4011" data-end="4080" data-col-size="lg">
<blockquote><p>Permet d’enregistrer les opérations dans un fichier de log dédié.</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="4082" data-end="4439">L’option la plus sensible est <strong data-start="4112" data-end="4126"><code data-start="4114" data-end="4124">--delete</code></strong>. Elle garde la destination parfaitement synchronisée avec la source, mais peut aussi supprimer des fichiers sur le serveur distant si la source est mal définie. Avant une première exécution réelle, il est recommandé de tester la commande avec <strong data-start="4370" data-end="4385"><code data-start="4372" data-end="4383">--dry-run</code></strong>, qui simule la sauvegarde sans modifier les fichiers.</p>
<h3 data-section-id="lpcae3" data-start="4441" data-end="4478">2. Script de sauvegarde complet</h3>
<p data-start="4480" data-end="4614">Nous allons maintenant créer un script de sauvegarde dans le dossier <strong data-start="4549" data-end="4567">/root/scripts/</strong>. Si ce dossier n’existe pas encore, créez-le :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">mkdir</span> <span class="ͼ12">-p</span> /root/scripts</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4652" data-end="4706">Créez ensuite le fichier <strong data-start="4677" data-end="4704">/root/scripts/backup.sh</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4750" data-end="4794">Ajoutez le contenu suivant dans le fichier :</p>
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼu">#!/bin/bash</span>
<span class="ͼt"># ================================================</span>
<span class="ͼt"># Script de sauvegarde rsync — VPS LWS</span>
<span class="ͼt"># ================================================</span>

<span class="ͼt"># Configuration</span>
<span class="ͼ11">SOURCE_DIRS</span><span class="ͼv">=</span><span class="ͼz">"/var/www /etc /home"</span>          <span class="ͼt"># Répertoires à sauvegarder</span>
<span class="ͼ11">DEST_USER</span><span class="ͼv">=</span><span class="ͼz">"user"</span>                           <span class="ͼt"># Utilisateur SSH destination</span>
<span class="ͼ11">DEST_HOST</span><span class="ͼv">=</span><span class="ͼz">"serveur-destination.exemple.fr"</span> <span class="ͼt"># Serveur de destination</span>
<span class="ͼ11">DEST_PATH</span><span class="ͼv">=</span><span class="ͼz">"/mnt/backups/vps-</span>$(hostname)<span class="ͼz">"</span>   <span class="ͼt"># Chemin distant</span>
<span class="ͼ11">SSH_KEY</span><span class="ͼv">=</span><span class="ͼz">"/root/.ssh/backup_key"</span>            <span class="ͼt"># Clé SSH dédiée</span>
<span class="ͼ11">LOG_FILE</span><span class="ͼv">=</span><span class="ͼz">"/var/log/backup-rsync.log"</span>       <span class="ͼt"># Fichier de log</span>

<span class="ͼt"># Date pour les logs</span>
<span class="ͼ11">DATE</span><span class="ͼv">=</span>$(date +<span class="ͼz">"%Y-%m-%d %H:%M:%S"</span>)

<span class="ͼ10">echo</span> <span class="ͼz">"[</span><span class="ͼ11">$DATE</span><span class="ͼz">] Début de la sauvegarde"</span> &gt;&gt; <span class="ͼz">"</span><span class="ͼ11">$LOG_FILE</span><span class="ͼz">"</span>

<span class="ͼt"># Exécution rsync</span>
rsync <span class="ͼ12">-azv</span> \
  <span class="ͼ12">--delete</span> \
  <span class="ͼ12">--exclude</span><span class="ͼv">=</span><span class="ͼz">"*.log"</span> \
  <span class="ͼ12">--exclude</span><span class="ͼv">=</span><span class="ͼz">"*.tmp"</span> \
  <span class="ͼ12">--exclude</span><span class="ͼv">=</span><span class="ͼz">"/var/www/*/wp-content/cache/"</span> \
  <span class="ͼ12">--exclude</span><span class="ͼv">=</span><span class="ͼz">"/tmp/"</span> \
  <span class="ͼ12">-e</span> <span class="ͼz">"ssh -i </span><span class="ͼ11">$SSH_KEY</span><span class="ͼz"> -o StrictHostKeyChecking=no"</span> \
  <span class="ͼ11">$SOURCE_DIRS</span> \
  <span class="ͼz">"</span><span class="ͼ11">$DEST_USER</span><span class="ͼz">@</span><span class="ͼ11">$DEST_HOST</span><span class="ͼz">:</span><span class="ͼ11">$DEST_PATH</span><span class="ͼz">"</span> \
  &gt;&gt; <span class="ͼz">"</span><span class="ͼ11">$LOG_FILE</span><span class="ͼz">"</span> <span class="ͼy">2</span>&gt;&amp;1

<span class="ͼt"># Vérification du code de retour</span>
<span class="ͼv">if</span> [ <span class="ͼ11">$?</span> <span class="ͼ12">-eq</span> <span class="ͼy">0</span> ]; <span class="ͼv">then</span>
  <span class="ͼ10">echo</span> <span class="ͼz">"[</span><span class="ͼ11">$DATE</span><span class="ͼz">] Sauvegarde terminée avec succès"</span> &gt;&gt; <span class="ͼz">"</span><span class="ͼ11">$LOG_FILE</span><span class="ͼz">"</span>
<span class="ͼv">else</span>
  <span class="ͼ10">echo</span> <span class="ͼz">"[</span><span class="ͼ11">$DATE</span><span class="ͼz">] ERREUR — sauvegarde échouée (code </span><span class="ͼ11">$?</span><span class="ͼz">)"</span> &gt;&gt; <span class="ͼz">"</span><span class="ͼ11">$LOG_FILE</span><span class="ͼz">"</span>
<span class="ͼv">fi</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5966" data-end="6319">Ce script commence par définir les <strong data-start="6001" data-end="6030">répertoires à sauvegarder</strong>, l’utilisateur distant, le serveur de destination, le chemin de stockage, la <strong data-start="6108" data-end="6119">clé SSH</strong> et le fichier de log. La commande <strong data-start="6154" data-end="6163">rsync</strong> copie ensuite les données vers le serveur distant en excluant certains fichiers inutiles, comme les logs, les fichiers temporaires et les caches WordPress.</p>
<p data-start="6321" data-end="6628">Le chemin <strong data-start="6331" data-end="6343">/var/www</strong> contient généralement les fichiers des sites web. Le dossier <strong data-start="6405" data-end="6413">/etc</strong> regroupe de nombreuses configurations système importantes. Le dossier <strong data-start="6484" data-end="6493">/home</strong> peut contenir des fichiers utilisateurs, des scripts ou des données applicatives. Vous pouvez ajuster cette liste selon votre serveur.</p>
<p data-start="6630" data-end="6667">Rendez ensuite le script exécutable :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">chmod</span> <span class="ͼv">+</span>x /root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6715" data-end="6755">Lancez une première exécution manuelle :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6794" data-end="6828">Puis consultez le fichier de log :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-n</span> <span class="ͼy">50</span> /var/log/backup-rsync.log</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="6880" data-end="7026">Si le message <strong data-start="6894" data-end="6931">“Sauvegarde terminée avec succès”</strong> apparaît, votre script rsync est fonctionnel. Il pourra ensuite être automatisé avec <strong data-start="7017" data-end="7025">cron</strong>.</p>
<h3 data-section-id="15pfqqa" data-start="0" data-end="55">3. Sauvegarder une base de données MySQL/MariaDB</h3>
<p data-start="57" data-end="421"><strong data-start="57" data-end="66">rsync</strong> est très efficace pour copier des fichiers, mais il ne suffit pas toujours pour sauvegarder correctement une <strong data-start="176" data-end="212">base de données MySQL ou MariaDB</strong> en fonctionnement. Une base active peut écrire des données au moment de la copie. Pour obtenir une sauvegarde propre, il faut d’abord générer un <strong data-start="358" data-end="370">dump SQL</strong>, puis inclure ce fichier dans la sauvegarde rsync.</p>
<p data-start="423" data-end="473">Commencez par créer un dossier dédié aux exports :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">mkdir</span> <span class="ͼ12">-p</span> /root/db_backups</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="514" data-end="550">Créez ensuite un script spécifique :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /root/scripts/mysql_dump.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="598" data-end="626">Ajoutez le contenu suivant :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼu">#!/bin/bash</span>
<span class="ͼt"># ================================================</span>
<span class="ͼt"># Export MySQL/MariaDB — VPS LWS</span>
<span class="ͼt"># ================================================</span>

<span class="ͼ11">DB_USER</span><span class="ͼv">=</span><span class="ͼz">"root"</span>
<span class="ͼ11">DUMP_DIR</span><span class="ͼv">=</span><span class="ͼz">"/root/db_backups"</span>
<span class="ͼ11">DATE</span><span class="ͼv">=</span>$(date +%F)

<span class="ͼ10">mkdir</span> <span class="ͼ12">-p</span> <span class="ͼz">"</span><span class="ͼ11">$DUMP_DIR</span><span class="ͼz">"</span>

<span class="ͼt"># Exporter toutes les bases de données</span>
mysqldump <span class="ͼ12">--user</span><span class="ͼv">=</span><span class="ͼz">"</span><span class="ͼ11">$DB_USER</span><span class="ͼz">"</span> \
  <span class="ͼ12">--all-databases</span> \
  <span class="ͼ12">--single-transaction</span> \
  <span class="ͼ12">--routines</span> \
  <span class="ͼ12">--triggers</span> \
  &gt; <span class="ͼz">"</span><span class="ͼ11">$DUMP_DIR</span><span class="ͼz">/all_databases_</span><span class="ͼ11">$DATE</span><span class="ͼz">.sql"</span>

<span class="ͼt"># Compresser le dump SQL</span>
gzip <span class="ͼz">"</span><span class="ͼ11">$DUMP_DIR</span><span class="ͼz">/all_databases_</span><span class="ͼ11">$DATE</span><span class="ͼz">.sql"</span>

<span class="ͼt"># Supprimer les dumps de plus de 7 jours</span>
<span class="ͼ10">find</span> <span class="ͼz">"</span><span class="ͼ11">$DUMP_DIR</span><span class="ͼz">"</span> <span class="ͼ12">-name</span> <span class="ͼz">"*.sql.gz"</span> <span class="ͼ12">-mtime</span> <span class="ͼv">+</span><span class="ͼy">7</span> <span class="ͼ12">-delete</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1217" data-end="1246">Rendez le script exécutable :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">chmod</span> <span class="ͼv">+</span>x /root/scripts/mysql_dump.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1298" data-end="1327">Puis testez-le manuellement :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/root/scripts/mysql_dump.sh
<span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /root/db_backups</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1394" data-end="1774">L’option <strong data-start="1403" data-end="1429"><code data-start="1405" data-end="1427">--single-transaction</code></strong> est importante pour les bases utilisant le moteur <strong data-start="1480" data-end="1490">InnoDB</strong> : elle permet de réaliser un export cohérent sans bloquer inutilement les tables pendant toute la durée de la sauvegarde. Les options <strong data-start="1625" data-end="1641"><code data-start="1627" data-end="1639">--routines</code></strong> et <strong data-start="1645" data-end="1661"><code data-start="1647" data-end="1659">--triggers</code></strong> permettent d’inclure les procédures stockées et les déclencheurs, souvent oubliés dans les sauvegardes basiques.</p>
<p data-start="1776" data-end="1909">Pour éviter de stocker un <strong data-start="1802" data-end="1833">mot de passe MySQL en clair</strong> dans le script, il est préférable d’utiliser un fichier <strong data-start="1890" data-end="1907">/root/.my.cnf</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /root/.my.cnf</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1943" data-end="1964">Ajoutez par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>[client]
user=root
password=votre_mot_de_passe_mysql</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2031" data-end="2061">Sécurisez ensuite le fichier :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">chmod</span> <span class="ͼy">600</span> /root/.my.cnf</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2100" data-end="2402">Avec cette méthode, <strong data-start="2120" data-end="2133">mysqldump</strong> peut s’authentifier automatiquement sans exposer le mot de passe dans la commande ou dans l’historique du terminal. Le dossier <strong data-start="2261" data-end="2281">/root/db_backups</strong> pourra ensuite être ajouté aux répertoires sauvegardés par votre script <strong data-start="2354" data-end="2363">rsync</strong>.</p>
<h2 data-section-id="1ktd332" data-start="2404" data-end="2428">Automatiser avec cron</h2>
<p><img class="aligncenter size-full wp-image-29419"  alt="Automatiser avec cron" width="1000" height="563" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Automatiser-avec-cron.webp"></p>
<p data-start="2430" data-end="2748">Une fois le script de sauvegarde créé et testé manuellement, l’étape suivante consiste à l’exécuter automatiquement. Pour cela, Linux dispose d’un outil natif : <strong data-start="2591" data-end="2599">cron</strong>. Il permet de lancer une commande ou un script selon un calendrier précis, par exemple tous les jours à 3 h, toutes les 6 heures ou chaque dimanche.</p>
<p data-start="2750" data-end="3106">Dans le cadre d’une <strong data-start="2770" data-end="2800">sauvegarde automatique VPS</strong>, cron est particulièrement adapté : il fonctionne en arrière-plan, ne nécessite pas d’interface graphique et peut exécuter vos scripts avec les droits de l’utilisateur configuré. Ici, nous allons l’utiliser pour lancer l’export <strong data-start="3029" data-end="3046">MySQL/MariaDB</strong>, puis la synchronisation <strong data-start="3072" data-end="3081">rsync</strong> vers le serveur distant.</p>
<h3 data-section-id="bflxkt" data-start="3108" data-end="3137">1. Syntaxe cron rappel</h3>
<p data-start="3139" data-end="3248">Une ligne cron suit une syntaxe composée de <strong data-start="3183" data-end="3212">5 champs de planification</strong>, suivis de la commande à exécuter :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># ┌───────────── minute (0-59)</span>
<span class="ͼt"># │ ┌───────────── heure (0-23)</span>
<span class="ͼt"># │ │ ┌───────────── jour du mois (1-31)</span>
<span class="ͼt"># │ │ │ ┌───────────── mois (1-12)</span>
<span class="ͼt"># │ │ │ │ ┌───────────── jour de la semaine (0-7, 0 et 7 = dimanche)</span>
<span class="ͼt"># │ │ │ │ │</span>
<span class="ͼt"># * * * * * commande</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3504" data-end="3588">Par exemple, cette ligne signifie : exécuter le script tous les jours à <strong data-start="3576" data-end="3586">3 h 00</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼy">0</span> <span class="ͼy">3</span> * * * /root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Les chemins doivent toujours être <strong data-start="3671" data-end="3682">absolus</strong> dans une tâche cron. Évitez donc les commandes comme <code data-start="3736" data-end="3749">./backup.sh</code>, car cron n’exécute pas forcément les scripts depuis le dossier que vous imaginez. Pour limiter les erreurs, utilisez systématiquement des chemins complets comme <strong data-start="3912" data-end="3939">/root/scripts/backup.sh</strong> ou <strong data-start="3943" data-end="3961">/usr/bin/rsync</strong> si nécessaire.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h3 data-section-id="lbtln3" data-start="3978" data-end="4009">2. Ajouter la tâche cron</h3>
<p data-start="4011" data-end="4073">Pour modifier la crontab de l’utilisateur <strong data-start="4053" data-end="4061">root</strong>, utilisez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>crontab <span class="ͼ12">-e</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4099" data-end="4233">Ajoutez ensuite les lignes adaptées à votre stratégie de sauvegarde. Pour lancer une <strong data-start="4184" data-end="4216">sauvegarde rsync quotidienne</strong> à 3 h du matin :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># Sauvegarde rsync tous les jours à 3h00</span>
<span class="ͼy">0</span> <span class="ͼy">3</span> * * * /root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4323" data-end="4396">Pour une sauvegarde plus fréquente, par exemple toutes les <strong data-start="4382" data-end="4394">6 heures</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># Sauvegarde rsync toutes les 6 heures</span>
<span class="ͼy">0</span> */6 * * * /root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="4486" data-end="4702">Si votre VPS héberge une base <strong data-start="4516" data-end="4533">MySQL/MariaDB</strong>, il est préférable de générer le dump SQL avant de lancer rsync. Par exemple, vous pouvez exporter les bases à <strong data-start="4645" data-end="4655">2 h 30</strong>, puis synchroniser les fichiers à <strong data-start="4690" data-end="4700">3 h 00</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># Export MySQL tous les jours à 2h30</span>
<span class="ͼy">30</span> <span class="ͼy">2</span> * * * /root/scripts/mysql_dump.sh

<span class="ͼt"># Sauvegarde rsync tous les jours à 3h00</span>
<span class="ͼy">0</span> <span class="ͼy">3</span> * * * /root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Pour une sauvegarde hebdomadaire le dimanche à <strong data-start="4916" data-end="4926">2 h 00</strong> :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼt"># Sauvegarde hebdomadaire le dimanche à 2h00</span>
<span class="ͼy">0</span> <span class="ͼy">2</span> * * <span class="ͼy">0</span> /root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Vous pouvez aussi ajouter une adresse email en haut de la crontab afin de recevoir les sorties de cron, notamment en cas d’erreur :</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ11">MAILTO</span><span class="ͼv">=</span>votre@email.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5190" data-end="5484">Cette configuration est utile pour détecter rapidement une <strong data-start="5249" data-end="5271">sauvegarde échouée</strong>, un problème de connexion SSH ou un espace disque saturé sur le serveur distant. Une fois la crontab enregistrée, cron prendra automatiquement en compte les nouvelles tâches.</p>
<h3 data-section-id="1te0bg8" data-start="0" data-end="52">3. Vérifier que la tâche est bien enregistrée</h3>
<p data-start="54" data-end="287">Après avoir ajouté vos lignes dans <strong data-start="89" data-end="97">cron</strong>, il est important de vérifier qu’elles ont bien été enregistrées. Une erreur de sauvegarde peut simplement venir d’une crontab vide, mal sauvegardée ou modifiée avec le mauvais utilisateur.</p>
<p data-start="289" data-end="353">Pour lister les tâches cron de l’utilisateur courant, utilisez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>crontab <span class="ͼ12">-l</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="379" data-end="515">Si vous avez configuré les sauvegardes avec l’utilisateur <strong data-start="437" data-end="445">root</strong>, la commande doit afficher vos lignes de planification, par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼy">30</span> <span class="ͼy">2</span> * * * /root/scripts/mysql_dump.sh
<span class="ͼy">0</span> <span class="ͼy">3</span> * * * /root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="603" data-end="890">Vérifiez attentivement les <strong data-start="630" data-end="653">chemins des scripts</strong>, les <strong data-start="659" data-end="681">heures d’exécution</strong> et l’ordre des tâches. L’export <strong data-start="714" data-end="731">MySQL/MariaDB</strong> doit être lancé avant la sauvegarde <strong data-start="768" data-end="777">rsync</strong>, afin que le dump SQL récent soit bien copié vers la destination distante.</p>
<h3 data-section-id="1pngjfe" data-start="892" data-end="926">4. Surveiller les logs cron</h3>
<p data-start="928" data-end="1106">Une tâche cron peut être correctement enregistrée, mais échouer au moment de son exécution. Pour le vérifier, consultez les <strong data-start="1052" data-end="1068">logs système</strong> et le fichier de log de votre script.</p>
<p data-start="1108" data-end="1205">Sur <strong data-start="1112" data-end="1122">Debian</strong> ou <strong data-start="1126" data-end="1136">Ubuntu</strong>, les traces cron se trouvent généralement dans <strong data-start="1184" data-end="1203">/var/log/syslog</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">grep</span> CRON /var/log/syslog | tail <span class="ͼ12">-20</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1257" data-end="1324">Sur <strong data-start="1261" data-end="1271">CentOS</strong>, <strong data-start="1273" data-end="1288">Rocky Linux</strong> ou <strong data-start="1292" data-end="1305">AlmaLinux</strong>, utilisez plutôt :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">grep</span> CRON /var/log/cron | tail <span class="ͼ12">-20</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1374" data-end="1435">Vous pouvez aussi suivre directement le log du script rsync :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-f</span> /var/log/backup-rsync.log</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1484" data-end="1508">Le message attendu est :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Sauvegarde terminée avec succès</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1555" data-end="1984">Si vous voyez une erreur de type <strong data-start="1588" data-end="1609">Permission denied</strong>, <strong data-start="1611" data-end="1640">No such file or directory</strong> ou <strong data-start="1644" data-end="1668">Connection timed out</strong>, la tâche cron se lance bien, mais le script rencontre un problème d’accès, de chemin ou de connexion réseau. Une capture d’écran utile pour l’article pourrait montrer la sortie de <strong data-start="1850" data-end="1864">crontab -l</strong> avec les tâches configurées, puis un extrait du fichier <strong data-start="1921" data-end="1950">/var/log/backup-rsync.log</strong> indiquant une sauvegarde réussie.</p>
<p data-start="1555" data-end="1984"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="1jqhiw" data-start="1986" data-end="2026">Rotation et rétention des sauvegardes</h2>
<p><img class="aligncenter size-full wp-image-29427"  alt="Rotation et rétention des sauvegardes" width="1000" height="563" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Rotation-et-retention-des-sauvegardes.webp"></p>
<p data-start="2028" data-end="2422">Une <strong data-start="2032" data-end="2062">sauvegarde automatique VPS</strong> ne doit pas seulement copier les fichiers : elle doit aussi gérer leur durée de conservation. Sans stratégie de <strong data-start="2175" data-end="2187">rotation</strong>, les sauvegardes s’accumulent jour après jour et peuvent saturer l’espace disque du serveur distant. Lorsque le stockage est plein, les nouvelles sauvegardes échouent, parfois sans que l’administrateur s’en rende compte immédiatement.</p>
<p data-start="2424" data-end="2741">L’objectif est donc de définir une <strong data-start="2459" data-end="2479">rétention claire</strong> : combien de jours, semaines ou mois souhaitez-vous conserver vos données ? Pour un site web classique, une sauvegarde quotidienne sur 7 jours peut suffire. Pour un serveur plus critique, il peut être utile de conserver des versions hebdomadaires et mensuelles.</p>
<p data-start="2743" data-end="3047">La rétention doit être adaptée à trois critères : le <strong data-start="2796" data-end="2817">volume de données</strong>, la <strong data-start="2822" data-end="2853">fréquence des modifications</strong> et le <strong data-start="2860" data-end="2891">niveau de risque acceptable</strong>. Un site vitrine peu modifié n’a pas les mêmes besoins qu’une boutique WooCommerce, une application métier ou une plateforme avec de nombreux utilisateurs.</p>
<h3 data-section-id="4o0onx" data-start="3049" data-end="3093">1. Stratégie de rétention recommandée</h3>
<p data-start="3095" data-end="3273">Voici une base simple pour organiser la <strong data-start="3135" data-end="3164">rétention des sauvegardes</strong> sur un VPS. Elle peut être ajustée selon l’espace disponible sur la destination et l’importance des données.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="3275" data-end="3534">
<thead data-start="3275" data-end="3320">
<tr data-start="3275" data-end="3320">
<th class="last:pe-10" data-start="3275" data-end="3287" data-col-size="sm">Fréquence</th>
<th class="last:pe-10" data-start="3287" data-end="3299" data-col-size="sm">Rétention</th>
<th class="last:pe-10" data-start="3299" data-end="3320" data-col-size="sm">Commande possible</th>
</tr>
</thead>
<tbody data-start="3335" data-end="3534">
<tr data-start="3335" data-end="3399">
<td data-start="3335" data-end="3347" data-col-size="sm">
<blockquote><p>Quotidien</p></blockquote>
</td>
<td data-col-size="sm" data-start="3347" data-end="3361">
<blockquote><p><strong data-start="3349" data-end="3360">7 jours</strong></p></blockquote>
</td>
<td data-col-size="sm" data-start="3361" data-end="3399">
<blockquote><p><code data-start="3363" data-end="3397">find /backups/ -mtime +7 -delete</code></p></blockquote>
</td>
</tr>
<tr data-start="3400" data-end="3471">
<td data-start="3400" data-end="3415" data-col-size="sm">
<blockquote><p>Hebdomadaire</p></blockquote>
</td>
<td data-start="3415" data-end="3432" data-col-size="sm">
<blockquote><p><strong data-start="3417" data-end="3431">4 semaines</strong></p></blockquote>
</td>
<td data-col-size="sm" data-start="3432" data-end="3471">
<blockquote><p><code data-start="3434" data-end="3469">find /backups/ -mtime +28 -delete</code></p></blockquote>
</td>
</tr>
<tr data-start="3472" data-end="3534">
<td data-start="3472" data-end="3482" data-col-size="sm">
<blockquote><p>Mensuel</p></blockquote>
</td>
<td data-start="3482" data-end="3495" data-col-size="sm">
<blockquote><p><strong data-start="3484" data-end="3494">3 mois</strong></p></blockquote>
</td>
<td data-start="3495" data-end="3534" data-col-size="sm">
<blockquote><p><code data-start="3497" data-end="3532">find /backups/ -mtime +90 -delete</code></p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="3536" data-end="3655">La commande <strong data-start="3548" data-end="3556">find</strong> supprime les fichiers plus anciens que le nombre de jours indiqué avec <strong data-start="3628" data-end="3640"><code data-start="3630" data-end="3638">-mtime</code></strong>. Par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">find</span> /backups/ <span class="ͼ12">-mtime</span> <span class="ͼv">+</span><span class="ͼy">7</span> <span class="ͼ12">-delete</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3703" data-end="3908">Cette commande supprime les fichiers de plus de <strong data-start="3751" data-end="3762">7 jours</strong> dans le dossier <strong data-start="3779" data-end="3792">/backups/</strong>. Avant de l’utiliser en production, testez-la sans <strong data-start="3844" data-end="3857"><code data-start="3846" data-end="3855">-delete</code></strong> afin de voir les fichiers qui seraient concernés :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">find</span> /backups/ <span class="ͼ12">-mtime</span> <span class="ͼv">+</span><span class="ͼy">7</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3948" data-end="4252">Vous pouvez intégrer cette logique dans votre script de sauvegarde, mais avec prudence. Assurez-vous que le chemin indiqué correspond bien au dossier de sauvegarde distant, et non à un répertoire important du VPS source. Une erreur sur une commande de suppression peut provoquer une <strong data-start="4231" data-end="4251">perte de données</strong>.</p>
<p data-start="4254" data-end="4682">Pour plus de sécurité, vous pouvez aussi prévoir plusieurs niveaux : des sauvegardes quotidiennes courtes, quelques sauvegardes hebdomadaires, puis des archives mensuelles pour les données sensibles. Cette organisation évite d’avoir uniquement la dernière version disponible, ce qui peut être problématique si une corruption ou une intrusion est découverte plusieurs jours après l’incident.</p>
<h3 data-section-id="1ikgp97" data-start="0" data-end="43">2. Sauvegardes horodatées avec rsync</h3>
<p data-start="45" data-end="362">La méthode la plus simple avec <strong data-start="76" data-end="85">rsync</strong> consiste à synchroniser les fichiers vers un même dossier distant. Cette approche est efficace, mais elle conserve surtout l’état le plus récent. Pour disposer de plusieurs versions, vous pouvez créer des <strong data-start="291" data-end="317">sauvegardes horodatées</strong>, avec un dossier différent pour chaque date.</p>
<p data-start="364" data-end="377">Par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ11">DEST_PATH</span><span class="ͼv">=</span><span class="ͼz">"/mnt/backups/vps/</span>$(date +%F)<span class="ͼz">"</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="445" data-end="507">Avec cette variable, rsync crée un dossier daté, par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/mnt/backups/vps/2026-06-09</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="562" data-end="784">Cette méthode permet de revenir à une version précédente si un fichier a été supprimé ou modifié par erreur. Elle est particulièrement utile pour un <strong data-start="711" data-end="729">site WordPress</strong>, une application web ou un serveur qui change souvent.</p>
<p data-start="786" data-end="1022">Pour éviter de dupliquer tous les fichiers à chaque sauvegarde, vous pouvez utiliser l’option <strong data-start="880" data-end="897"><code data-start="882" data-end="895">--link-dest</code></strong>. Elle permet de créer des sauvegardes incrémentales en réutilisant les fichiers inchangés depuis une sauvegarde précédente :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>rsync <span class="ͼ12">-az</span> \
  <span class="ͼ12">--link-dest</span><span class="ͼv">=</span><span class="ͼz">"/mnt/backups/vps/latest"</span> \
  <span class="ͼ11">$SOURCE_DIRS</span> \
  <span class="ͼz">"</span><span class="ͼ11">$DEST_USER</span><span class="ͼz">@</span><span class="ͼ11">$DEST_HOST</span><span class="ͼz">:/mnt/backups/vps/</span>$(date +%F)<span class="ͼz">/"</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1176" data-end="1526">Cette approche demande une organisation plus rigoureuse côté destination, mais elle offre un bon compromis entre <strong data-start="1289" data-end="1319">historique de restauration</strong> et <strong data-start="1323" data-end="1358">optimisation de l’espace disque</strong>. Pour un VPS en production, elle peut compléter efficacement les <strong data-start="1424" data-end="1456">sauvegardes automatiques LWS</strong> et les <strong data-start="1464" data-end="1487">snapshots ponctuels</strong>. Par ailleurs, n&rsquo;hésitez pas à consulter notre tuto : comment <span style="font-weight: 400;"><a title="Sauvegarde GitLab sur VPS : créez une stratégie fiable" href="https://tutoriels.lws.fr/vps/sauvegarde-gitlab-sur-vps">mettre en place une sauvegarde rsync distante pour vos dépôts GitLab</a>.</span></p>
<p data-start="1176" data-end="1526"><img class="aligncenter wp-image-29423 size-full"  alt="Créer une sauvegarde du VPS KVM LWS" width="1360" height="808" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Creer-une-sauvegarde-du-VPS.webp"></p>
<h2 data-section-id="nr64se" data-start="1528" data-end="1565">Tester et vérifier ses sauvegardes</h2>
<p><img class="aligncenter size-full wp-image-29429"  alt="Tester et vérifier ses sauvegardes" width="1000" height="563" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Tester-et-verifier-ses-sauvegardes.webp"></p>
<p data-start="1567" data-end="1925">Une <strong data-start="1571" data-end="1596">sauvegarde non testée</strong> ne doit jamais être considérée comme fiable. Le script peut s’exécuter sans afficher d’erreur visible, mais copier des fichiers incomplets, ignorer une base de données ou échouer silencieusement à cause d’un problème de droits. La vérification est donc une étape essentielle de toute stratégie de <strong data-start="1894" data-end="1924">sauvegarde automatique VPS</strong>.</p>
<p data-start="1927" data-end="2006">Commencez par exécuter le script manuellement, avant de le confier à <strong data-start="1996" data-end="2004">cron</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>/root/scripts/backup.sh</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2057" data-end="2094">Consultez ensuite le fichier de log :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>tail <span class="ͼ12">-n</span> <span class="ͼy">50</span> /var/log/backup-rsync.log</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2158" data-end="2334">Vous devez y retrouver un message indiquant que la <strong data-start="2209" data-end="2248">sauvegarde est terminée avec succès</strong>. Vérifiez ensuite que les fichiers sont bien présents sur le serveur de destination :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ls</span> <span class="ͼ12">-lh</span> /mnt/backups/vps/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2386" data-end="2702">Pour aller plus loin, restaurez un fichier simple depuis la sauvegarde vers un dossier temporaire. Par exemple, copiez un fichier de test depuis la destination, puis comparez-le avec la version source. Cette vérification permet de confirmer que la sauvegarde n’est pas seulement présente, mais aussi <strong data-start="2686" data-end="2701">exploitable</strong>.</p>
<p data-start="2704" data-end="2786">Pour les bases <strong data-start="2719" data-end="2736">MySQL/MariaDB</strong>, vérifiez que le dump SQL compressé est lisible :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>gunzip <span class="ͼ12">-c</span> all_databases_YYYY-MM-DD.sql.gz | head <span class="ͼ12">-20</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2866" data-end="3038">Cette commande affiche les premières lignes du fichier SQL sans le décompresser définitivement. Si le fichier est corrompu, vide ou illisible, vous le verrez immédiatement.</p>
<p data-start="3040" data-end="3108">Contrôlez aussi la <strong data-start="3059" data-end="3085">taille des sauvegardes</strong> après quelques jours :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>du <span class="ͼ12">-sh</span> /mnt/backups/vps/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3160" data-end="3383">Cette commande permet d’anticiper une saturation du stockage distant. Une croissance anormale peut indiquer que certains dossiers inutiles sont sauvegardés, comme des caches, des fichiers temporaires ou des logs volumineux.</p>
<p data-start="3385" data-end="3452">Après la première exécution automatique, vérifiez les traces cron :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">grep</span> CRON /var/log/syslog | tail <span class="ͼ12">-20</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3516" data-end="3876">Les critères objectifs de réussite sont simples : le fichier <strong data-start="3577" data-end="3606">/var/log/backup-rsync.log</strong> affiche un succès, les fichiers distants ont un <strong data-start="3655" data-end="3675">timestamp récent</strong>, le dump SQL a une taille cohérente et une restauration de test fonctionne sans erreur. Ce dernier point est le plus important : savoir restaurer rapidement est aussi essentiel que savoir sauvegarder.</p>
<h2 data-section-id="1wbg0sh" data-start="3878" data-end="3917">Erreurs fréquentes et cas de blocage</h2>
<p data-start="3919" data-end="4197">Même avec un script bien préparé, certaines erreurs peuvent apparaître lors de la mise en place d’un <strong data-start="4020" data-end="4039">cron backup VPS</strong>. La plupart viennent d’un problème de droits, de chemin, de clé SSH ou de mauvaise compréhension du fonctionnement de rsync. Voici les cas les plus courants.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="4199" data-end="5594">
<thead data-start="4199" data-end="4237">
<tr data-start="4199" data-end="4237">
<th class="last:pe-10" data-start="4199" data-end="4208" data-col-size="md">Erreur</th>
<th class="last:pe-10" data-start="4208" data-end="4225" data-col-size="md">Cause probable</th>
<th class="last:pe-10" data-start="4225" data-end="4237" data-col-size="md">Solution</th>
</tr>
</thead>
<tbody data-start="4252" data-end="5594">
<tr data-start="4252" data-end="4487">
<td data-start="4252" data-end="4288" data-col-size="md">
<blockquote><p><strong data-start="4254" data-end="4287">Permission denied (publickey)</strong></p></blockquote>
</td>
<td data-start="4288" data-end="4387" data-col-size="md">
<blockquote><p>La clé SSH n’a pas été copiée sur la destination, ou le script utilise le mauvais chemin de clé.</p></blockquote>
</td>
<td data-col-size="md" data-start="4387" data-end="4487">
<blockquote><p>Vérifier <code data-start="4398" data-end="4411">ssh-copy-id</code>, tester la connexion SSH manuellement et confirmer la variable <code data-start="4475" data-end="4484">SSH_KEY</code>.</p></blockquote>
</td>
</tr>
<tr data-start="4488" data-end="4672">
<td data-start="4488" data-end="4533" data-col-size="md">
<blockquote><p><strong data-start="4490" data-end="4532">rsync tourne mais rien n’est transféré</strong></p></blockquote>
</td>
<td data-start="4533" data-end="4606" data-col-size="md">
<blockquote><p>Les répertoires sources sont vides, mal indiqués ou exclus par erreur.</p></blockquote>
</td>
<td data-col-size="md" data-start="4606" data-end="4672">
<blockquote><p>Tester avec <code data-start="4620" data-end="4631">--dry-run</code> et vérifier la variable <code data-start="4656" data-end="4669">SOURCE_DIRS</code>.</p></blockquote>
</td>
</tr>
<tr data-start="4673" data-end="4870">
<td data-start="4673" data-end="4725" data-col-size="md">
<blockquote><p><strong data-start="4675" data-end="4724">Des fichiers disparaissent sur la destination</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="4725" data-end="4791">
<blockquote><p>L’option <code data-start="4736" data-end="4746">--delete</code> supprime les fichiers absents de la source.</p></blockquote>
</td>
<td data-col-size="md" data-start="4791" data-end="4870">
<blockquote><p>Simuler la commande avec <code data-start="4818" data-end="4829">--dry-run</code> avant toute première exécution réelle.</p></blockquote>
</td>
</tr>
<tr data-start="4871" data-end="5041">
<td data-start="4871" data-end="4899" data-col-size="md">
<blockquote><p><strong data-start="4873" data-end="4898">Cron ne s’exécute pas</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="4899" data-end="4973">
<blockquote><p>Le script n’est pas exécutable ou la crontab utilise un chemin relatif.</p></blockquote>
</td>
<td data-col-size="md" data-start="4973" data-end="5041">
<blockquote><p>Appliquer <code data-start="4985" data-end="4995">chmod +x</code> et utiliser uniquement des chemins absolus.</p></blockquote>
</td>
</tr>
<tr data-start="5042" data-end="5233">
<td data-start="5042" data-end="5069" data-col-size="md">
<blockquote><p><strong data-start="5044" data-end="5068">Le dump MySQL échoue</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="5069" data-end="5151">
<blockquote><p>Mot de passe incorrect, droits insuffisants ou fichier <code data-start="5126" data-end="5135">.my.cnf</code> mal configuré.</p></blockquote>
</td>
<td data-col-size="md" data-start="5151" data-end="5233">
<blockquote><p>Tester <code data-start="5160" data-end="5171">mysqldump</code> manuellement et sécuriser <code data-start="5198" data-end="5213">/root/.my.cnf</code> avec <code data-start="5219" data-end="5230">chmod 600</code>.</p></blockquote>
</td>
</tr>
<tr data-start="5234" data-end="5415">
<td data-start="5234" data-end="5280" data-col-size="md">
<blockquote><p><strong data-start="5236" data-end="5279">Espace disque saturé sur la destination</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="5280" data-end="5334">
<blockquote><p>Aucune rotation des sauvegardes n’a été configurée.</p></blockquote>
</td>
<td data-col-size="md" data-start="5334" data-end="5415">
<blockquote><p>Ajouter une stratégie de rétention avec <code data-start="5376" data-end="5382">find</code> ou augmenter l’espace distant.</p></blockquote>
</td>
</tr>
<tr data-start="5416" data-end="5594">
<td data-start="5416" data-end="5451" data-col-size="md">
<blockquote><p><strong data-start="5418" data-end="5450">Snapshot LWS non restaurable</strong></p></blockquote>
</td>
<td data-col-size="md" data-start="5451" data-end="5508">
<blockquote><p>Le VPS a été réinstallé après la création du snapshot.</p></blockquote>
</td>
<td data-col-size="md" data-start="5508" data-end="5594">
<blockquote><p>Utiliser les sauvegardes disponibles dans le panel si elles sont encore présentes.</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="5596" data-end="5850">L’erreur la plus dangereuse reste une mauvaise utilisation de <strong data-start="5658" data-end="5672"><code data-start="5660" data-end="5670">--delete</code></strong>. Cette option est utile pour garder une destination propre, mais elle peut supprimer des fichiers valides si la source est mal définie. Pour un premier test, utilisez toujours :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>rsync <span class="ͼ12">-azv</span> <span class="ͼ12">--dry-run</span> <span class="ͼ10">source</span>/ destination/</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="5919" data-end="6091">Le mode <strong data-start="5927" data-end="5942"><code data-start="5929" data-end="5940">--dry-run</code></strong> affiche ce que rsync ferait, sans copier ni supprimer de fichiers. C’est une étape simple, mais très utile pour éviter une suppression involontaire.</p>
<p data-start="6093" data-end="6487">Autre point fréquent : cron n’utilise pas toujours le même environnement que votre session SSH. Une commande qui fonctionne manuellement peut échouer en tâche planifiée si elle dépend d’un chemin non défini, d’une variable d’environnement ou d’un binaire introuvable. Dans un script automatisé, privilégiez donc les <strong data-start="6409" data-end="6428">chemins absolus</strong>, les logs détaillés et les tests manuels avant activation.</p>
<h2 data-section-id="kgs582" data-start="6489" data-end="6508">Bonnes pratiques à suivre</h2>
<p><img class="aligncenter size-full wp-image-29420"  alt="Bonnes pratiques à suivre" width="1000" height="563" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Bonnes-pratiques-a-suivre.webp"></p>
<p data-start="6510" data-end="6727">Une bonne stratégie de <strong data-start="6533" data-end="6557">sauvegarde VPS Linux</strong> ne se limite pas à un script fonctionnel. Elle doit aussi tenir compte de la sécurité, de la fréquence des sauvegardes, de la restauration et du risque de compromission.</p>
<p data-start="6729" data-end="7105">La première règle est de ne jamais stocker vos seules sauvegardes sur le même VPS que la source. En cas de panne, de suppression accidentelle ou d’intrusion, vous pourriez perdre à la fois les données de production et les copies de secours. Une <strong data-start="6974" data-end="6997">sauvegarde distante</strong> vers un second serveur, un NAS ou un espace de stockage séparé apporte une protection beaucoup plus solide.</p>
<p data-start="7107" data-end="7361">Pour les données sensibles, pensez aussi au <strong data-start="7151" data-end="7166">chiffrement</strong> avant transfert. Par exemple, un dump SQL peut contenir des informations clients, des emails, des mots de passe hachés ou des données de commande. Vous pouvez chiffrer une archive avec <strong data-start="7352" data-end="7359">gpg</strong> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>gpg <span class="ͼ12">--symmetric</span> fichier.sql.gz</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7419" data-end="7558">Il est également recommandé de recevoir une alerte en cas d’échec. Avec cron, vous pouvez ajouter une adresse email en haut de la crontab :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ11">MAILTO</span><span class="ͼv">=</span>votre@email.fr</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="7607" data-end="7874">Documentez aussi votre <strong data-start="7630" data-end="7654">plan de restauration</strong>. Notez où se trouvent les sauvegardes, comment restaurer un fichier, comment réimporter un dump SQL et dans quel ordre redémarrer les services. Le jour d’un incident, cette documentation vous évitera de perdre du temps.</p>
<p data-start="7876" data-end="8299">Avant toute intervention majeure, comme une mise à jour système, une modification de configuration critique ou une migration, créez un <strong data-start="8011" data-end="8027">snapshot LWS</strong> depuis le panel. Pour un serveur de production, combinez ce snapshot avec une sauvegarde distante récente. Vous pouvez également <strong data-start="8157" data-end="8235">sécuriser votre VPS avant de mettre en place votre stratégie de sauvegarde</strong> en renforçant l’accès SSH, le pare-feu et les services exposés.</p>
<p data-start="8301" data-end="8791">Pour les utilisateurs avancés, il peut être intéressant d’<a title="automatiser l&#039;analyse de vos scripts de sauvegarde avec Claude Code" href="https://tutoriels.lws.fr/intelligence-artificielle/installer-claude-code-vps-lws">automatiser l’analyse de vos scripts de sauvegarde avec Claude Code</a>, notamment pour détecter des erreurs de logique, des chemins dangereux ou des variables mal définies. Enfin, pour un serveur critique, pensez à conserver les <strong data-start="8589" data-end="8621">sauvegardes automatiques LWS</strong> au-delà de la période incluse si votre offre le permet, afin de disposer d’un filet de sécurité supplémentaire côté infrastructure.</p>
<p data-start="8301" data-end="8791"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="kcftay" data-start="0" data-end="56">Vérification du bon fonctionnement : checklist finale</h2>
<p><img class="aligncenter size-full wp-image-29430"  alt="Vérification du bon fonctionnement : checklist finale" width="1000" height="563" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Verification-du-bon-fonctionnement-1.webp"></p>
<p data-start="58" data-end="342">Avant de considérer votre <strong data-start="84" data-end="114">sauvegarde automatique VPS</strong> comme opérationnelle, prenez le temps de valider chaque point de contrôle. Cette checklist permet de confirmer que le script fonctionne, que <strong data-start="256" data-end="264">cron</strong> l’exécute correctement et que vos données peuvent réellement être restaurées.</p>
<ul data-start="344" data-end="923">
<li data-section-id="195hhyq" data-start="344" data-end="405">Le <strong data-start="349" data-end="365">script rsync</strong> a été exécuté manuellement sans erreur.</li>
<li data-section-id="8i4xqv" data-start="406" data-end="464">La tâche cron est visible avec la commande <code data-start="451" data-end="463">crontab -l</code>.</li>
<li data-section-id="1gnkt3l" data-start="465" data-end="539">Le fichier <strong data-start="478" data-end="507">/var/log/backup-rsync.log</strong> indique une sauvegarde réussie.</li>
<li data-section-id="4uldjy" data-start="540" data-end="625">Les fichiers sauvegardés sont présents et lisibles sur la <strong data-start="600" data-end="624">destination distante</strong>.</li>
<li data-section-id="i3ipao" data-start="626" data-end="687">Le <strong data-start="631" data-end="653">dump MySQL/MariaDB</strong> est généré, compressé et lisible.</li>
<li data-section-id="q5m36b" data-start="688" data-end="743">Une restauration de test a été effectuée avec succès.</li>
<li data-section-id="j5chnr" data-start="744" data-end="795">La rotation des anciennes sauvegardes est active.</li>
<li data-section-id="mtgoq1" data-start="796" data-end="864">Un <strong data-start="801" data-end="823">snapshot LWS Panel</strong> a été créé avant une opération sensible.</li>
<li data-section-id="1ybkxln" data-start="865" data-end="923">Le plan de restauration est documenté et compréhensible.</li>
</ul>
<p data-start="925" data-end="1060">Cette vérification doit être répétée régulièrement, surtout après une migration, une mise à jour système ou une modification du script.</p>
<h2 data-section-id="vi5xqa" data-start="1062" data-end="1075">FAQ</h2>
<p data-section-id="1wfp3pt" data-start="1077" data-end="1155"><strong>Quelle est la différence entre un snapshot et une sauvegarde sur VPS LWS ?</strong></p>
<p data-start="1157" data-end="1631">Un <strong data-start="1160" data-end="1172">snapshot</strong> est une image temporaire de l’état du VPS à un instant précis. Il est utile avant une opération risquée, comme une mise à jour système ou une modification de configuration. Une <strong data-start="1350" data-end="1364">sauvegarde</strong>, elle, sert à conserver une copie exploitable des données pour une restauration ultérieure. Sur un VPS, les deux sont complémentaires : le snapshot facilite un retour rapide en arrière, tandis qu’une sauvegarde distante permet une meilleure protection dans le temps.</p>
<p data-section-id="1twx1gd" data-start="1633" data-end="1716"><strong>Les sauvegardes automatiques LWS sont-elles suffisantes pour protéger mon VPS ?</strong></p>
<p data-start="1718" data-end="2139">Les <strong data-start="1722" data-end="1754">sauvegardes automatiques LWS</strong> constituent un filet de sécurité important côté infrastructure, mais elles ne remplacent pas une stratégie complète. Pour un serveur de production, il est recommandé d’ajouter une <strong data-start="1935" data-end="1964">sauvegarde rsync distante</strong>, des exports <strong data-start="1978" data-end="1995">MySQL/MariaDB</strong> réguliers et des tests de restauration. Cela permet de mieux maîtriser les fichiers sauvegardés, la fréquence, la rétention et la restauration.</p>
<p data-section-id="11e4emq" data-start="2141" data-end="2200"><strong>Comment automatiser rsync sans entrer de mot de passe ?</strong></p>
<p data-start="2202" data-end="2570">Pour automatiser <strong data-start="2219" data-end="2228">rsync</strong> avec <strong data-start="2234" data-end="2242">cron</strong>, il faut configurer une <strong data-start="2267" data-end="2299">authentification SSH par clé</strong> entre le VPS source et le serveur de destination. Le script utilise ensuite cette clé privée pour se connecter sans mot de passe interactif. Cette méthode est indispensable pour exécuter une sauvegarde automatiquement, par exemple chaque nuit, sans intervention humaine.</p>
<p data-section-id="1dko4hv" data-start="2572" data-end="2643"><strong>Combien de temps sont conservées les sauvegardes automatiques LWS ?</strong></p>
<p data-start="2645" data-end="3013">La durée de conservation dépend de l’offre VPS et des options activées. D’après le brief, les sauvegardes automatiques des <strong data-start="2768" data-end="2783">VPS KVM LWS</strong> sont incluses pendant <strong data-start="2806" data-end="2818">30 jours</strong>, avec possibilité de renouvellement au-delà selon les conditions de l’offre. Ce point doit toujours être vérifié depuis la page de l’offre ou le <strong data-start="2964" data-end="2977">LWS Panel</strong>, car les modalités peuvent évoluer.</p>
<p data-section-id="12bbkt" data-start="3015" data-end="3102"><strong>Que se passe-t-il si mon VPS est compromis : les sauvegardes sont-elles protégées ?</strong></p>
<p data-start="3104" data-end="3464">Si les sauvegardes sont stockées uniquement sur le même VPS, elles peuvent être supprimées ou altérées en cas de compromission. C’est pourquoi il est essentiel de prévoir une <strong data-start="3279" data-end="3297">copie distante</strong>, idéalement sur un autre serveur ou un espace de stockage séparé. Pour les données sensibles, le <strong data-start="3395" data-end="3410">chiffrement</strong> avant transfert ajoute une protection supplémentaire.</p>
<p data-section-id="1gsp9r" data-start="3466" data-end="3520"><strong>rsync sauvegarde-t-il les bases de données MySQL ?</strong></p>
<p data-start="3522" data-end="3816"><strong data-start="3522" data-end="3531">rsync</strong> peut copier des fichiers, mais il ne garantit pas une sauvegarde cohérente d’une base <strong data-start="3618" data-end="3635">MySQL/MariaDB</strong> active. Il faut d’abord générer un <strong data-start="3671" data-end="3683">dump SQL</strong> avec <code data-start="3689" data-end="3700">mysqldump</code>, puis sauvegarder ce fichier avec rsync. Cette méthode permet d’obtenir une copie restaurable des bases de données.</p>
<h2 data-section-id="8dtpi" data-start="6482" data-end="6495">Conclusion</h2>
<p data-start="6497" data-end="7338" data-is-last-node="" data-is-only-node="">Mettre en place une <strong data-start="6517" data-end="6547">sauvegarde automatique VPS</strong> demande un peu de méthode, mais c’est l’une des meilleures protections contre la perte de données. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" />En combinant <strong data-start="6660" data-end="6669">rsync</strong>, <strong data-start="6671" data-end="6679">cron</strong>, les exports <strong data-start="6693" data-end="6710">MySQL/MariaDB</strong>, les <strong data-start="6716" data-end="6733">snapshots LWS</strong> et les sauvegardes automatiques de l’hébergeur, vous construisez une stratégie solide et réaliste. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />Le plus important n’est pas seulement de sauvegarder, mais de vérifier régulièrement que vos fichiers, vos bases et vos configurations peuvent être restaurés. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2611.png" alt="☑" class="wp-smiley" style="height: 1em; max-height: 1em;" />Pour un serveur en production, cette approche hybride permet de limiter les interruptions, de réagir plus vite en cas d’incident et de garder le contrôle sur vos données. Pour héberger vos projets avec un socle sécurisé, vous pouvez vous appuyer sur un <strong data-start="7245" data-end="7299">VPS KVM LWS avec sauvegardes automatiques incluses</strong>.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4af.png" alt="💯" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p data-start="6497" data-end="7338" data-is-last-node="" data-is-only-node=""><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<p data-start="6497" data-end="7338" data-is-last-node="" data-is-only-node=""><em>Avez-vous des questions, des ajouts ou des suggestions sur la facon de créer des sauvegardes automatiques sur votre VPS ? N&rsquo;hésitez pas à nous contacter depuis la section Commentaires. </em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/sauvegarde-automatique-vps/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29414</post-id>	</item>
		<item>
		<title>VPS pour DDoS : comment protéger son serveur contre les attaques en 2026</title>
		<link>https://tutoriels.lws.fr/vps/vps-pour-ddos-protection-configuration</link>
					<comments>https://tutoriels.lws.fr/vps/vps-pour-ddos-protection-configuration#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Mon, 08 Jun 2026 16:20:04 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=29371</guid>

					<description><![CDATA[Un VPS offre beaucoup de liberté, mais cette liberté implique aussi une responsabilité importante : protéger le serveur contre les attaques réseau et les tentatives d’intrusion. Lorsqu’un site devient lent, qu’un service ne répond plus ou qu’une alerte de sécurité est envoyée par l’hébergeur, il n’est pas toujours simple de savoir s’il s’agit d’une attaque &#8230; <a href="https://tutoriels.lws.fr/vps/vps-pour-ddos-protection-configuration" class="more-link">Continue reading <span class="screen-reader-text">VPS pour DDoS : comment protéger son serveur contre les attaques en 2026</span></a>]]></description>
										<content:encoded><![CDATA[<p data-start="225" data-end="640">Un VPS offre beaucoup de liberté, mais cette liberté implique aussi une responsabilité importante : <strong>protéger le serveur contre les attaques réseau</strong> et les <strong>tentatives d’intrusion</strong>. Lorsqu’un site devient lent, qu’un service ne répond plus ou qu’une alerte de sécurité est envoyée par l’hébergeur, il n’est pas toujours simple de savoir s’il s’agit d’une attaque DDoS, d’un brute-force SSH ou d’un simple pic de trafic.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> C’est précisément pour cette raison qu’il est essentiel de comprendre comment fonctionne la protection d’un VPS pour DDoS.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p data-start="225" data-end="640">Une partie de la défense dépend de l’infrastructure de l’hébergeur, notamment contre les attaques réseau massives. L’autre partie dépend de votre configuration système : SSH, pare-feu, Fail2ban, surveillance des logs et protection applicative. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />Pour un environnement plus encadré, vous pouvez aussi consulter notre guide pour <a class="decorated-link" title="Sécuriser cPanel contre les attaques : guide complet 2026" href="https://tutoriels.lws.fr/site-web/securiser-cpanel-contre-les-attaques" data-start="1091" data-end="1222">sécuriser votre environnement serveur contre les attaques</a>, notamment si vous utilisez cPanel.</p>
<h2 data-section-id="1fbt9uu" data-start="1260" data-end="1283">Objectif</h2>
<p data-start="1285" data-end="1606"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’objectif de ce tutoriel est de vous aider à mettre en place une c<strong>onfiguration défensive complète sur un VPS Debian ou Ubuntu</strong>. Vous allez comprendre ce qu’est une attaque DDoS, ce que l’hébergeur filtre côté réseau, puis ce que vous devez configurer côté serveur pour limiter les risques au niveau système et applicatif.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> À la fin de ce guide, vous saurez distinguer une protection anti-DDoS réseau d’une protection applicative. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" />Vous disposerez aussi d’une base concrète pour <strong>durcir SSH, configurer iptables, installer Fail2ban, surveiller les connexions suspectes</strong> et <strong>utiliser Cloudflare</strong> si votre VPS héberge un site web. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a5.png" alt="💥" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’idée n’est pas de promettre une protection absolue, car aucune configuration ne peut garantir cela. L’objectif est plutôt de réduire fortement la surface d’attaque et d’adopter une stratégie cohérente, combinant protection hébergeur et bonnes pratiques d’administration.</p>
<h2 data-section-id="1x817kv" data-start="2183" data-end="2251">Comprendre les attaques DDoS sur VPS : ce qui se passe réellement</h2>
<p data-start="2253" data-end="2824">Une attaque DDoS, pour <em data-start="2276" data-end="2307">Distributed Denial of Service</em>, consiste à rendre un serveur, un service ou une infrastructure indisponible en l’inondant de trafic ou de requêtes depuis de nombreuses sources. Sur un VPS, les effets peuvent être très visibles : bande passante saturée, charge CPU anormale, mémoire consommée rapidement, serveur web inaccessible ou connexions SSH instables. La documentation LWS rappelle qu’une attaque DDoS vise à rendre un service indisponible en surchargeant la bande passante ou les ressources du serveur.</p>
<p data-start="2826" data-end="3236">Le point important à comprendre est que toutes les attaques ne se produisent pas au même niveau. Certaines ciblent directement le réseau, avec un volume massif de paquets. D’autres ciblent les services applicatifs, comme SSH, Apache, Nginx, WordPress ou une API hébergée sur le VPS. C’est cette distinction qui permet de savoir ce que l’hébergeur peut bloquer en amont et ce que vous devez sécuriser vous-même.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="3238" data-end="3867">
<thead data-start="3238" data-end="3295">
<tr data-start="3238" data-end="3295">
<th class="last:pe-10" data-start="3238" data-end="3255" data-col-size="sm">Type d’attaque</th>
<th class="last:pe-10" data-start="3255" data-end="3264" data-col-size="sm">Couche</th>
<th class="last:pe-10" data-start="3264" data-end="3276" data-col-size="md">Mécanisme</th>
<th class="last:pe-10" data-start="3276" data-end="3295" data-col-size="md">Exemple concret</th>
</tr>
</thead>
<tbody data-start="3314" data-end="3867">
<tr data-start="3314" data-end="3406">
<td data-start="3314" data-end="3326" data-col-size="sm">
<blockquote><p>UDP Flood</p></blockquote>
</td>
<td data-start="3326" data-end="3341" data-col-size="sm">
<blockquote><p>L3/L4 réseau</p></blockquote>
</td>
<td data-start="3341" data-end="3371" data-col-size="md">
<blockquote><p>Envoi massif de paquets UDP</p></blockquote>
</td>
<td data-start="3371" data-end="3406" data-col-size="md">
<blockquote><p>Saturation de la bande passante</p></blockquote>
</td>
</tr>
<tr data-start="3407" data-end="3528">
<td data-start="3407" data-end="3419" data-col-size="sm">
<blockquote><p>SYN Flood</p></blockquote>
</td>
<td data-start="3419" data-end="3434" data-col-size="sm">
<blockquote><p>L4 transport</p></blockquote>
</td>
<td data-start="3434" data-end="3488" data-col-size="md">
<blockquote><p>Connexions TCP incomplètes envoyées en grand nombre</p></blockquote>
</td>
<td data-start="3488" data-end="3528" data-col-size="md">
<blockquote><p>Épuisement de la table de connexions</p></blockquote>
</td>
</tr>
<tr data-start="3529" data-end="3626">
<td data-start="3529" data-end="3542" data-col-size="sm">
<blockquote><p>ICMP Flood</p></blockquote>
</td>
<td data-start="3542" data-end="3554" data-col-size="sm">
<blockquote><p>L3 réseau</p></blockquote>
</td>
<td data-start="3554" data-end="3585" data-col-size="md">
<blockquote><p>Envoi massif de paquets ping</p></blockquote>
</td>
<td data-start="3585" data-end="3626" data-col-size="md">
<blockquote><p>Congestion réseau ou perte de réponse</p></blockquote>
</td>
</tr>
<tr data-start="3627" data-end="3746">
<td data-start="3627" data-end="3640" data-col-size="sm">
<blockquote><p>HTTP Flood</p></blockquote>
</td>
<td data-start="3640" data-end="3656" data-col-size="sm">
<blockquote><p>L7 applicatif</p></blockquote>
</td>
<td data-start="3656" data-end="3710" data-col-size="md">
<blockquote><p>Requêtes HTTP nombreuses mais apparemment légitimes</p></blockquote>
</td>
<td data-start="3710" data-end="3746" data-col-size="md">
<blockquote><p>Surcharge d’Apache, Nginx ou PHP</p></blockquote>
</td>
</tr>
<tr data-start="3747" data-end="3867">
<td data-start="3747" data-end="3765" data-col-size="sm">
<blockquote><p>Brute-force SSH</p></blockquote>
</td>
<td data-start="3765" data-end="3781" data-col-size="sm">
<blockquote><p>L7 applicatif</p></blockquote>
</td>
<td data-start="3781" data-end="3820" data-col-size="md">
<blockquote><p>Tentatives répétées de connexion SSH</p></blockquote>
</td>
<td data-start="3820" data-end="3867" data-col-size="md">
<blockquote><p>Risque d’intrusion et charge serveur accrue</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="3869" data-end="4245">Les attaques de couche réseau, comme les<strong> floods UDP, ICMP</strong> ou certains <strong>SYN Floods</strong>, doivent idéalement être filtrées avant d’atteindre le VPS. Si le trafic malveillant arrive directement jusqu’à votre interface réseau, votre serveur peut être saturé avant même que vos règles locales aient un effet suffisant. C’est le rôle d’une protection anti-DDoS opérée côté infrastructure.</p>
<p data-start="4247" data-end="4701">À l’inverse, les<strong> attaques applicatives</strong> sont plus difficiles à distinguer d’un trafic normal. Un HTTP Flood peut ressembler à une forte affluence de visiteurs. Un brute-force SSH peut prendre la forme de milliers de connexions échouées réparties sur plusieurs adresses IP. Dans ces cas, votre configuration locale devient indispensable : durcissement SSH, pare-feu, limitation des connexions, bannissement automatique des IP et analyse régulière des logs.</p>
<p data-start="4703" data-end="5053">Il faut donc retenir une idée simple : la protection DDoS d’un VPS repose sur deux niveaux complémentaires :</p>
<ul>
<li data-start="4703" data-end="5053">Le premier niveau est assuré par l’hébergeur, qui filtre les attaques réseau en amont,</li>
<li data-start="4703" data-end="5053">Le second niveau dépend de vous, administrateur du VPS, car vous contrôlez le système, les ports ouverts, les services installés et les règles de sécurité,</li>
</ul>
<h2 data-section-id="mphevb" data-start="5055" data-end="5132">La protection anti-DDoS réseau LWS : ce qui est inclus côté infrastructure</h2>
<p data-start="5134" data-end="5652">Sur les <a title="VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">VPS KVM LWS</a>, la protection anti-DDoS réseau est intégrée à l’infrastructure. Sur nos VPS KVM LWS, nous vous offrons un pare-feu physique, d’une protection Anti-DDoS qui analyse et filtre le trafic malveillant, ainsi que d’un réseau autonome pour renforcer la stabilité. Vous disposez aussi de l’accès root, des distributions disponibles comme Ubuntu et Debian, le monitoring des ressources, les sauvegardes quotidiennes et les snapshots gratuits.</p>
<p data-start="5654" data-end="6105">Cette protection intervient avant votre serveur. Son rôle est de limiter l’impact des attaques qui cherchent à saturer la bande passante ou à perturber les protocoles réseau. C’est un point important : un <strong>pare-feu local</strong> comme iptables reste utile, mais il ne remplace pas un filtrage en amont. Si une attaque volumétrique dépasse la capacité réseau disponible pour votre VPS, votre serveur peut devenir inaccessible même avec de bonnes règles système.</p>
<p data-start="6107" data-end="6581">Nos infrastructures incluent des dispositifs de sécurité comme un firewall physique de prévention d’attaque, un pare-feu de filtrage IP, un Web Application Firewall et une protection réseau DDoS sur ses services d’hébergement. Les centres de données sont situés en France, et nos datacenters sont certifiés ISO 27001, Tier 3/4, avec surveillance 24/7.</p>
<p data-start="6583" data-end="6752">Le fonctionnement du filtre anti-DDoS LWS suit un mécanisme progressif lorsqu’un trafic anormal est détecté. Voici les niveaux décrits dans la documentation d’aide LWS :</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="6754" data-end="7304">
<thead data-start="6754" data-end="6801">
<tr data-start="6754" data-end="6801">
<th class="last:pe-10" data-start="6754" data-end="6763" data-col-size="sm">Alerte</th>
<th class="last:pe-10" data-start="6763" data-end="6782" data-col-size="md">Action appliquée</th>
<th class="last:pe-10" data-start="6782" data-end="6801" data-col-size="md">Impact possible</th>
</tr>
</thead>
<tbody data-start="6816" data-end="7304">
<tr data-start="6816" data-end="6905">
<td data-start="6816" data-end="6830" data-col-size="sm">
<blockquote><p>1ère alerte</p></blockquote>
</td>
<td data-start="6830" data-end="6879" data-col-size="md">
<blockquote><p>Mise en surveillance des services pendant 24 h</p></blockquote>
</td>
<td data-start="6879" data-end="6905" data-col-size="md">
<blockquote><p>Aucun symptôme visible</p></blockquote>
</td>
</tr>
<tr data-start="6906" data-end="7004">
<td data-start="6906" data-end="6920" data-col-size="sm">
<blockquote><p>2ème alerte</p></blockquote>
</td>
<td data-start="6920" data-end="6963" data-col-size="md">
<blockquote><p>Blocage du trafic UDP pendant 10 minutes</p></blockquote>
</td>
<td data-start="6963" data-end="7004" data-col-size="md">
<blockquote><p>Problèmes possibles de résolution DNS</p></blockquote>
</td>
</tr>
<tr data-start="7005" data-end="7100">
<td data-start="7005" data-end="7019" data-col-size="sm">
<blockquote><p>3ème alerte</p></blockquote>
</td>
<td data-start="7019" data-end="7063" data-col-size="md">
<blockquote><p>Blocage du trafic ICMP pendant 10 minutes</p></blockquote>
</td>
<td data-start="7063" data-end="7100" data-col-size="md">
<blockquote><p>Le serveur ne répond plus au ping</p></blockquote>
</td>
</tr>
<tr data-start="7101" data-end="7208">
<td data-start="7101" data-end="7115" data-col-size="sm">
<blockquote><p>4ème alerte</p></blockquote>
</td>
<td data-start="7115" data-end="7158" data-col-size="md">
<blockquote><p>Blocage du trafic UDP pendant 10 minutes</p></blockquote>
</td>
<td data-start="7158" data-end="7208" data-col-size="md">
<blockquote><p>DNS fonctionnel, autres protocoles UDP bloqués</p></blockquote>
</td>
</tr>
<tr data-start="7209" data-end="7304">
<td data-start="7209" data-end="7223" data-col-size="sm">
<blockquote><p>5ème alerte</p></blockquote>
</td>
<td data-start="7223" data-end="7269" data-col-size="md">
<blockquote><p>Blocage du trafic entier pendant 10 minutes</p></blockquote>
</td>
<td data-start="7269" data-end="7304" data-col-size="md">
<blockquote><p>Serveur totalement inaccessible</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="7306" data-end="7713">Ce fonctionnement montre bien que la <strong>protection anti-DDoS</strong> peut agir fortement sur le trafic pour préserver l’infrastructure. En cas d’attaque importante, certaines restrictions temporaires peuvent donc être appliquées automatiquement. Ce comportement est normal : l’objectif est de contenir le <strong>trafic malveillant</strong> et d’éviter qu’il ne perturbe plus largement le service.</p>
<p data-start="7715" data-end="8044">En revanche, cette protection réseau ne dispense pas de sécuriser le VPS lui-même. Elle ne remplace pas la configuration SSH, ne choisit pas à votre place les ports ouverts, ne crée pas vos règles iptables et ne surveille pas automatiquement tous vos journaux applicatifs. Elle complète votre configuration, mais ne l’annule pas.</p>
<p data-start="8046" data-end="8317">C’est pour cette raison que la suite de notre guide se concentre sur la partie qui relève de l’administrateur : durcir SSH, limiter les connexions suspectes avec iptables, installer Fail2ban, protéger les sites web avec Cloudflare et mettre en place une surveillance régulière.</p>
<blockquote data-start="8319" data-end="8713">
<p data-start="8321" data-end="8713"><strong data-start="8321" data-end="8376">Besoin d’un VPS avec protection anti-DDoS incluse ?</strong><br data-start="8376" data-end="8379" />Les <strong data-start="8385" data-end="8400">VPS KVM LWS</strong> incluent une protection anti-DDoS réseau active dès la commande, sans configuration requise côté client. Ils proposent également un accès root complet, des datacenters français certifiés ISO 27001, des snapshots gratuits et un support 7j/7.<br data-start="8641" data-end="8644" /><a class="custom_btn cb_bg_green" href="https://www.lws.fr/vps-kvm.php" rel="noopener" target="_top" style="color: #000;">Voir les VPS KVM LWS</a></p>
</blockquote>
<h2 data-section-id="t53wlk" data-start="0" data-end="44">Sécuriser SSH : première ligne de défense</h2>
<p data-start="46" data-end="550">SSH est l’un des premiers services ciblés sur un VPS exposé à Internet. Même lorsqu’une<strong> attaque DDoS</strong> vise surtout à saturer le réseau, il est fréquent d’observer en parallèle des tentatives de brute-force sur le port SSH. Sécuriser cet accès est donc une étape prioritaire avant de <strong>configurer le pare-feu ou Fail2ban</strong>. L’objectif est simple : réduire les connexions inutiles, empêcher les attaques par mot de passe et limiter l’accès aux seuls utilisateurs autorisés.</p>
<h3 data-section-id="v9k0il" data-start="552" data-end="592">1. Changer le port SSH par défaut</h3>
<p data-start="594" data-end="887">Par défaut, SSH écoute sur le port <strong data-start="629" data-end="635">22</strong>. Ce port est constamment scanné par des bots qui recherchent des VPS mal configurés. Le changer ne suffit pas à sécuriser totalement le serveur, mais cela réduit fortement le bruit dans les logs et limite les tentatives automatiques les plus basiques.</p>
<p data-start="889" data-end="929">Ouvrez le fichier de configuration SSH :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /etc/ssh/sshd_config</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="970" data-end="1065">Recherchez la ligne liée au port SSH, puis remplacez-la par un port non standard, par exemple :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Port <span class="ͼy">2222</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1090" data-end="1338">Avant de <strong>redémarrer SSH</strong>, vérifiez que ce nouveau port sera bien autorisé dans votre pare-feu. C’est un point essentiel : si vous changez le port SSH sans l’ouvrir dans iptables ou dans votre pare-feu système, vous risquez de vous bloquer vous-même.</p>
<p data-start="1340" data-end="1375">Redémarrez ensuite le service SSH :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl <span class="ͼ10">restart</span> sshd</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Selon la distribution, le service peut aussi s’appeler <code data-start="1468" data-end="1473">ssh</code> :</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl <span class="ͼ10">restart</span> <span class="ͼ10">ssh</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Gardez toujours votre session SSH actuelle ouverte et testez une nouvelle connexion avant de la fermer :</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ssh</span> <span class="ͼ12">-p</span> <span class="ͼy">2222</span> votre_utilisateur@IP_DU_VPS</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h3 data-section-id="pl1kiz" data-start="1671" data-end="1749">2. Désactiver l&rsquo;authentification par mot de passe, activer les clés SSH</h3>
<p data-start="1751" data-end="2048">L’authentification par mot de passe est pratique, mais elle expose le VPS aux attaques brute-force. La meilleure pratique consiste à utiliser une clé SSH : l’utilisateur se connecte avec une clé privée stockée sur son ordinateur, tandis que le serveur connaît uniquement la clé publique autorisée.</p>
<p data-start="2050" data-end="2134">Sur votre ordinateur local, générez une paire de clés si vous n’en avez pas encore :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>ssh-keygen <span class="ͼ12">-t</span> ed25519 <span class="ͼ12">-C</span> <span class="ͼz">"votre_email@example.com"</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Copiez ensuite la clé publique sur le VPS :</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>ssh-copy-id <span class="ͼ12">-p</span> <span class="ͼy">2222</span> votre_utilisateur@IP_DU_VPS</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Testez immédiatement la connexion par clé :</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ssh</span> <span class="ͼ12">-p</span> <span class="ͼy">2222</span> votre_utilisateur@IP_DU_VPS</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2404" data-end="2470">Une fois la connexion par clé confirmée, modifiez le fichier SSH :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /etc/ssh/sshd_config</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2511" data-end="2555">Ajoutez ou ajustez les paramètres suivants :</p>
<pre data-start="2511" data-end="2555"><code>PasswordAuthentication no
PubkeyAuthentication <span class="ͼ10">yes</span>
PermitRootLogin prohibit-password</code></pre>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="">
<div class="">Ces directives signifient que les connexions par mot de passe sont désactivées, que les clés SSH sont autorisées, et que l’utilisateur <code data-start="2790" data-end="2796">root</code> ne peut plus se connecter avec un mot de passe. C’est une configuration plus sûre pour un VPS accessible publiquement.</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2917" data-end="2941">Redémarrez ensuite SSH :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl <span class="ͼ10">restart</span> sshd</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Puis ouvrez un second terminal pour vérifier que l’accès fonctionne toujours avant de fermer votre session active.</div>
</div>
</div>
</div>
</div>
</div>
<h3 data-section-id="x9xt8k" data-start="3095" data-end="3139">3. Limiter les utilisateurs autorisés</h3>
<p data-start="3141" data-end="3355">Même avec une clé SSH, il est recommandé de limiter explicitement les comptes autorisés à se connecter au VPS. Cette règle évite qu’un utilisateur système inutile ou mal configuré puisse devenir une porte d’entrée.</p>
<p data-start="3357" data-end="3428">Dans le fichier <code data-start="3373" data-end="3395">/etc/ssh/sshd_config</code>, ajoutez la directive suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>AllowUsers votre_utilisateur</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3472" data-end="3647">Remplacez <code data-start="3482" data-end="3501">votre_utilisateur</code> par le compte réellement utilisé pour administrer le VPS. Si plusieurs administrateurs doivent accéder au serveur, listez-les sur la même ligne :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>AllowUsers admin1 admin2</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3687" data-end="3918">Redémarrez ensuite SSH et testez l’accès depuis un nouveau terminal.</p>
<h2 data-section-id="a6m38z" data-start="0" data-end="63">Configurer iptables pour bloquer les attaques DDoS courantes</h2>
<p data-start="65" data-end="520">Après avoir sécurisé SSH, l’étape suivante consiste à configurer le pare-feu local du VPS. Sur Debian et Ubuntu, <code data-start="178" data-end="188">iptables</code> permet de filtrer le trafic entrant, de limiter certaines connexions et de bloquer des paquets suspects avant qu’ils n’atteignent vos services. Cette configuration ne remplace pas la protection anti-DDoS réseau de l’hébergeur, mais elle ajoute une couche de défense indispensable côté système.</p>
<p data-start="522" data-end="670">Avant toute modification, gardez votre session SSH ouverte et testez vos règles progressivement. Une erreur de pare-feu peut bloquer l’accès au VPS.</p>
<h3 data-section-id="1n6s0xr" data-start="672" data-end="719">1. Règles de base : politique par défaut</h3>
<p data-start="721" data-end="957">La première étape consiste à définir une politique claire : bloquer le trafic entrant par défaut, puis autoriser uniquement ce qui est nécessaire. Cette approche limite l’exposition du VPS et évite de laisser ouverts des ports inutiles.</p>
<p data-start="959" data-end="992">Voici une base de configuration :</p>
<pre data-start="959" data-end="992"><code><span class="ͼt"># Politique par défaut : tout bloquer sauf ce qui est explicitement autorisé</span>
iptables <span class="ͼ12">-P</span> INPUT DROP
iptables <span class="ͼ12">-P</span> FORWARD DROP
iptables <span class="ͼ12">-P</span> OUTPUT ACCEPT

<span class="ͼt"># Autoriser les connexions déjà établies ou liées</span>
iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-m</span> conntrack <span class="ͼ12">--ctstate</span> ESTABLISHED,RELATED <span class="ͼ12">-j</span> ACCEPT

<span class="ͼt"># Autoriser l’interface locale</span>
iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-i</span> lo <span class="ͼ12">-j</span> ACCEPT

<span class="ͼt"># Autoriser SSH sur le nouveau port</span>
iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-p</span> tcp <span class="ͼ12">--dport</span> <span class="ͼy">2222</span> <span class="ͼ12">-j</span> ACCEPT</code></pre>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="">
<div class="">Ces règles signifient que le VPS refuse par défaut les connexions entrantes non autorisées. Les connexions déjà établies restent acceptées, ce qui évite d’interrompre les échanges légitimes. L’interface locale <code data-start="1641" data-end="1645">lo</code> est également autorisée, car de nombreux services internes en dépendent.</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1720" data-end="1877">Si vous avez conservé le port SSH par défaut, remplacez <code data-start="1776" data-end="1782">2222</code> par <code data-start="1787" data-end="1791">22</code>. Si votre VPS héberge un site web, pensez aussi à autoriser les ports HTTP et HTTPS :</p>
<pre data-start="1720" data-end="1877"><code>iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-p</span> tcp <span class="ͼ12">--dport</span> <span class="ͼy">80</span> <span class="ͼ12">-j</span> ACCEPT
iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-p</span> tcp <span class="ͼ12">--dport</span> <span class="ͼy">443</span> <span class="ͼ12">-j</span> ACCEPT</code></pre>
<h3 data-section-id="19m6ivu" data-start="1985" data-end="2025">2. Protection contre le SYN Flood</h3>
<p data-start="2027" data-end="2277">Une attaque SYN Flood consiste à envoyer un grand nombre de demandes de connexion TCP incomplètes. Le serveur réserve alors des ressources pour des connexions qui ne se terminent jamais, ce qui peut ralentir ou rendre indisponibles certains services.</p>
<p data-start="2279" data-end="2364">Vous pouvez limiter le nombre de nouvelles connexions TCP SYN acceptées par seconde :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="">
<pre><code><span class="ͼt"># Limiter les nouvelles connexions TCP SYN</span>
iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-p</span> tcp <span class="ͼ12">--syn</span> <span class="ͼ12">-m</span> limit <span class="ͼ12">--limit</span> <span class="ͼy">1</span>/s <span class="ͼ12">--limit-burst</span> <span class="ͼy">3</span> <span class="ͼ12">-j</span> ACCEPT

<span class="ͼt"># Bloquer les paquets SYN excédentaires</span>
iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-p</span> tcp <span class="ͼ12">--syn</span> <span class="ͼ12">-j</span> DROP</code></pre>
</div>
</div>
</div>
</div>
</div>
<p data-start="2580" data-end="2847">La première règle accepte les nouvelles connexions à un rythme limité. L’option <code data-start="2660" data-end="2673">--limit 1/s</code> autorise une nouvelle connexion par seconde, tandis que <code data-start="2730" data-end="2747">--limit-burst 3</code> permet un petit pic temporaire. La seconde règle bloque les paquets SYN qui dépassent cette limite.</p>
<p data-start="2849" data-end="3113">Ces valeurs doivent être adaptées selon l’usage du VPS. Pour un petit site, elles peuvent suffire. Pour un site à fort trafic, une limite trop basse risque de bloquer des visiteurs légitimes. L’objectif est donc de réduire les abus sans pénaliser le trafic normal.</p>
<h3 data-section-id="wyre5e" data-start="3115" data-end="3154">3. Bloquer les paquets invalides</h3>
<p data-start="3156" data-end="3455">Certains paquets réseau ne correspondent à aucune connexion valide ou présentent un état incohérent. Ils peuvent être liés à des scans, à des erreurs réseau ou à des tentatives d’exploitation. Les bloquer permet de nettoyer une partie du trafic inutile avant qu’il ne sollicite davantage le serveur.</p>
<p data-start="3457" data-end="3484">Ajoutez la règle suivante :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-m</span> conntrack <span class="ͼ12">--ctstate</span> INVALID <span class="ͼ12">-j</span> DROP</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Cette commande utilise le module <code data-start="3589" data-end="3600">conntrack</code>, qui suit l’état des connexions réseau. Tout paquet identifié comme <code data-start="3669" data-end="3678">INVALID</code> est immédiatement rejeté. C’est une règle simple, peu intrusive, et généralement utile dans une configuration de base.</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3799" data-end="3932">Elle doit être placée avant les règles d’autorisation trop larges, afin que les paquets anormaux soient bloqués le plus tôt possible.</p>
<h3 data-section-id="o17ho4" data-start="0" data-end="60">4. Limiter le nombre de connexions simultanées par IP</h3>
<p data-start="62" data-end="375">Limiter le nombre de connexions simultanées par adresse IP permet de réduire l’impact de certains comportements abusifs. C’est particulièrement utile pour les services web exposés sur les ports <strong data-start="256" data-end="262">80</strong> et <strong data-start="266" data-end="273">443</strong>, car un même client ne devrait généralement pas ouvrir un nombre excessif de connexions en parallèle.</p>
<p data-start="377" data-end="414">Voici un exemple de règles iptables :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="">
<pre><code>iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-p</span> tcp <span class="ͼ12">--dport</span> <span class="ͼy">80</span> <span class="ͼ12">-m</span> connlimit <span class="ͼ12">--connlimit-above</span> <span class="ͼy">50</span> <span class="ͼ12">-j</span> REJECT
iptables <span class="ͼ12">-A</span> INPUT <span class="ͼ12">-p</span> tcp <span class="ͼ12">--dport</span> <span class="ͼy">443</span> <span class="ͼ12">-m</span> connlimit <span class="ͼ12">--connlimit-above</span> <span class="ͼy">50</span> <span class="ͼ12">-j</span> REJECT</code></pre>
</div>
</div>
</div>
</div>
</div>
<p data-start="590" data-end="771">Dans cet exemple, une même adresse IP ne peut pas dépasser <strong data-start="649" data-end="678">50 connexions simultanées</strong> vers le port HTTP ou HTTPS. Au-delà de cette limite, les nouvelles connexions sont rejetées.</p>
<p data-start="773" data-end="1084">Cette valeur doit être adaptée à votre usage réel. Pour un petit site vitrine, 50 connexions par IP est souvent large. Pour une application web, une API ou un site recevant beaucoup de trafic légitime depuis des réseaux partagés, il peut être nécessaire d’augmenter cette limite afin d’éviter les faux positifs.</p>
<p data-start="1086" data-end="1384">L’objectif n’est pas de bloquer tous les pics de trafic, mais de réduire les abus les plus évidents. Dans une stratégie de protection DDoS VPS, cette règle complète le filtrage réseau de l’hébergeur et les protections applicatives comme Cloudflare ou Fail2ban.</p>
<h3 data-section-id="12xust8" data-start="1386" data-end="1426">5. Rendre les règles persistantes</h3>
<p data-start="1428" data-end="1683">Les règles iptables ajoutées en ligne de commande sont actives immédiatement, mais elles peuvent être perdues après un redémarrage du VPS si elles ne sont pas sauvegardées. Pour éviter cela, installez le paquet <code data-start="1639" data-end="1660">iptables-persistent</code> sur Debian ou Ubuntu :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="">
<pre><code>apt update
apt install iptables-persistent <span class="ͼ12">-y</span></code></pre>
</div>
</div>
</div>
</div>
</div>
<p data-start="1744" data-end="1933">Pendant l’installation, le système peut vous demander si vous souhaitez enregistrer les règles IPv4 et IPv6 actuelles. Acceptez l’enregistrement si vos règles sont correctement configurées.</p>
<p data-start="1935" data-end="1997">Vous pouvez ensuite sauvegarder manuellement les règles avec :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>netfilter-persistent save</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Pour vérifier que les règles sont bien actives, utilisez :</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>iptables <span class="ͼ12">-L</span> <span class="ͼ12">-n</span> <span class="ͼ12">-v</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2129" data-end="2431">Cette commande affiche les chaînes iptables, les règles appliquées, les ports concernés et le nombre de paquets traités.</p>
<h2 data-section-id="1t49yjp" data-start="2433" data-end="2468">Installer et configurer Fail2ban</h2>
<p data-start="2470" data-end="2733">Une fois le pare-feu configuré, Fail2ban permet d’ajouter une protection dynamique. Contrairement à iptables, qui applique des règles fixes, Fail2ban surveille les journaux système et bannit automatiquement les adresses IP qui multiplient les tentatives échouées.</p>
<p data-start="2735" data-end="3033">C’est particulièrement utile contre les <strong>attaques brute-force SSH</strong>. Lorsqu’une adresse IP tente plusieurs connexions avec de mauvais identifiants, Fail2ban peut la bloquer temporairement. Il peut aussi surveiller certains services web comme Apache ou Nginx si les filtres correspondants sont activés.</p>
<p data-start="3035" data-end="3246">Fail2ban ne bloque pas une attaque DDoS volumétrique à lui seul. En revanche, il est très efficace pour limiter les attaques applicatives répétées, les scans agressifs et les tentatives d’intrusion automatisées.</p>
<h3 data-section-id="1hc7ffr" data-start="3248" data-end="3270">1. Installation</h3>
<p data-start="3272" data-end="3360">Sur un VPS Debian ou Ubuntu, l’installation de Fail2ban se fait directement avec <code data-start="3353" data-end="3358">apt</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>apt update &amp;&amp; apt install fail2ban <span class="ͼ12">-y</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3413" data-end="3461">Activez ensuite le service au démarrage du VPS :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl enable fail2ban</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3502" data-end="3528">Puis démarrez le service :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl <span class="ͼ10">start</span> fail2ban</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Vous pouvez vérifier son état avec :</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl status fail2ban</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3645" data-end="3923">Si le service est actif, vous pouvez passer à la configuration des règles de bannissement. Sur certaines images serveur, Fail2ban peut déjà être présent, mais il est préférable de vérifier son installation et sa configuration avant de considérer qu’il protège réellement le VPS.</p>
<h3 data-section-id="1o1bq18" data-start="0" data-end="40">2. Configuration de base pour SSH</h3>
<p data-start="42" data-end="334">La configuration personnalisée de Fail2ban doit se faire dans le fichier <code data-start="115" data-end="141">/etc/fail2ban/jail.local</code>. Il est déconseillé de modifier directement <code data-start="186" data-end="197">jail.conf</code>, car ce fichier peut être écrasé lors d’une mise à jour du paquet. Le fichier <code data-start="276" data-end="288">jail.local</code> permet de conserver vos réglages spécifiques.</p>
<p data-start="336" data-end="354">Créez le fichier :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>nano /etc/fail2ban/jail.local</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="399" data-end="451">Ajoutez ensuite une configuration de base pour SSH :</p>
<pre data-start="399" data-end="451"><code>[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 5

[sshd]
enabled  = true
port     = 2222
logpath  = /var/log/auth.log
maxretry = 3</code></pre>
<p data-start="601" data-end="890">Dans cet exemple, <code data-start="619" data-end="635">bantime = 3600</code> signifie qu’une adresse IP bannie le reste pendant une heure. Le paramètre <code data-start="711" data-end="727">findtime = 600</code> indique que Fail2ban observe les tentatives sur une période de dix minutes. Enfin, <code data-start="811" data-end="825">maxretry = 5</code> définit le nombre maximal d’échecs autorisés avant bannissement.</p>
<p data-start="892" data-end="1151">Dans le bloc <code data-start="905" data-end="913">[sshd]</code>, le port doit correspondre au port SSH réellement utilisé. Si vous avez suivi la section précédente et remplacé le port 22 par le port 2222, conservez donc cette valeur. Si votre SSH écoute encore sur le port 22, adaptez la ligne ainsi :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>port = 22</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1175" data-end="1236">Redémarrez ensuite Fail2ban pour appliquer la configuration :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl <span class="ͼ10">restart</span> fail2ban</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1278" data-end="1487">Cette configuration protège SSH contre les tentatives répétées de connexion échouée, ce qui réduit fortement les attaques automatisées visant les VPS exposés sur Internet.</p>
<h3 data-section-id="1gy4i0s" data-start="1489" data-end="1566">3. Ajouter la protection pour les services web (si Nginx/Apache actif)</h3>
<p data-start="1568" data-end="1854">Si votre VPS héberge un site web avec Nginx ou Apache, Fail2ban peut aussi surveiller certains journaux liés aux erreurs d’authentification. Cette protection est utile si vous avez des espaces protégés par mot de passe, des interfaces d’administration ou des applications web sensibles.</p>
<p data-start="1856" data-end="1915">Pour Nginx, ajoutez par exemple ce bloc dans <code data-start="1901" data-end="1913">jail.local</code> :</p>
<pre data-start="1856" data-end="1915"><code>[nginx-http-auth]
enabled = true
port    = http,https
logpath = /var/log/nginx/error.log</code></pre>
<p data-start="2018" data-end="2048">Pour Apache, ajoutez ce bloc :</p>
<pre data-start="2018" data-end="2048"><code>[apache-auth]
enabled = true
port    = http,https
logpath = /var/log/apache2/error.log</code></pre>
<p data-start="2149" data-end="2483">Ces règles ne remplacent pas une protection applicative complète, mais elles ajoutent une barrière contre les tentatives répétées d’authentification. Avant de les activer, vérifiez que les chemins de logs correspondent bien à votre installation. Sur certaines configurations personnalisées, les journaux peuvent être stockés ailleurs.</p>
<p data-start="2485" data-end="2530">Après modification, testez la configuration :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>fail2ban-client <span class="ͼ12">-t</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2564" data-end="2592">Puis redémarrez le service :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>systemctl <span class="ͼ10">restart</span> fail2ban</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h3 data-section-id="1akrhv5" data-start="2634" data-end="2671">4. Commandes de gestion utiles</h3>
<p data-start="2673" data-end="2834">Fail2ban dispose de plusieurs commandes pratiques pour contrôler son fonctionnement. La première permet de voir les protections actives, aussi appelées <em data-start="2825" data-end="2832">jails</em> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>fail2ban-client status</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2872" data-end="2927">Pour obtenir le détail de la protection SSH, utilisez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>fail2ban-client status sshd</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2970" data-end="3265">Cette commande affiche notamment le nombre d’échecs détectés, les adresses IP actuellement bannies et le fichier de log surveillé. En cas de faux positif, vous pouvez débannir manuellement une adresse IP :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>fail2ban-client unban X.X.X.X</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3386" data-end="3535">Remplacez <code data-start="3396" data-end="3405">X.X.X.X</code> par l’adresse IP concernée. Cette commande est utile si vous avez bloqué votre propre accès après plusieurs erreurs de connexion.</p>
<p data-start="3386" data-end="3535"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<h2 data-section-id="12ama10" data-start="3537" data-end="3620">Cloudflare comme bouclier applicatif (L7) pour les sites web hébergés sur le VPS</h2>
<p data-start="3622" data-end="4030">Lorsque votre VPS héberge un ou plusieurs sites web, la protection réseau de l’hébergeur et les règles iptables ne suffisent pas toujours à filtrer les attaques applicatives. Un HTTP Flood, par exemple, peut envoyer un grand nombre de requêtes qui ressemblent à des visites classiques. Le serveur web, PHP, la base de données ou WordPress peuvent alors être saturés même si la couche réseau reste disponible.</p>
<p data-start="4032" data-end="4337">Cloudflare peut jouer le rôle de bouclier applicatif en se plaçant entre les visiteurs et votre VPS. Le trafic web passe d’abord par Cloudflare, qui peut filtrer les bots, appliquer des règles WAF, limiter certaines requêtes et absorber une partie des attaques HTTP avant qu’elles n’atteignent le serveur.</p>
<p data-start="4339" data-end="4638">Cette approche est particulièrement intéressante pour un site WordPress, une boutique WooCommerce, une application web ou une API publique. Elle ne protège pas tous les services du VPS, comme SSH ou les ports personnalisés, mais elle renforce fortement la défense des sites exposés en HTTP et HTTPS.</p>
<p data-start="4640" data-end="4863">Pour aller plus loin sur ce point, vous pouvez consulter notre tutoriel dédié pour <a class="decorated-link" title="Comment configurer le CDN Cloudflare sur WordPress ?" href="https://tutoriels.lws.fr/wordpress/cdn-cloudflare-sur-wordpress" data-start="4723" data-end="4862">configurer Cloudflare pour protéger votre site WordPress hébergé sur VPS</a>.</p>
<h3 data-section-id="13g1wc3" data-start="0" data-end="70">1. Ajouter le domaine sur Cloudflare (compte gratuit suffisant)</h3>
<p data-start="72" data-end="371">Pour utiliser Cloudflare comme bouclier applicatif, vous devez d’abord ajouter le domaine de votre site dans votre compte Cloudflare. Le principe est simple : au lieu de laisser les visiteurs contacter directement l’adresse IP de votre VPS, vous faites passer le trafic web par le réseau Cloudflare.</p>
<p data-start="72" data-end="371"><img class="aligncenter wp-image-29379 size-full"  alt="Page d'accueil Cloudflare" width="1200" height="695" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Page-daccueil-Cloudflare.webp"></p>
<p data-start="373" data-end="713">Commencez par créer un compte sur Cloudflare, puis ajoutez votre nom de domaine.</p>
<p data-start="373" data-end="713"><img class="aligncenter size-full wp-image-29375"  alt="Connecter un domaine sur Cloudflare" width="1000" height="526" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Connecter-un-domaine.webp"></p>
<p data-start="373" data-end="713">Cloudflare analyse ensuite les enregistrements DNS existants et vous propose de nouveaux serveurs de noms.</p>
<p data-start="373" data-end="713">Si votre domaine est enregistré chez LWS, vous devrez remplacer les serveurs DNS actuels depuis votre espace client LWS par ceux fournis par Cloudflare.</p>
<p data-start="715" data-end="1002">Une fois la zone DNS active, vérifiez les enregistrements de type <strong data-start="781" data-end="786">A</strong> ou <strong data-start="790" data-end="798">AAAA</strong> qui pointent vers l’adresse IP du VPS. Pour que Cloudflare protège réellement le site, le proxy doit être activé sur ces enregistrements. Dans l’interface Cloudflare, cela correspond au <strong data-start="985" data-end="1001">nuage orange</strong>.</p>
<p data-start="1004" data-end="1235"><img class="aligncenter wp-image-29378 size-full"  alt="Activer le proxy sur Cloudflare " width="1102" height="727" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Les-enregistrements-DNS-Cloudflare.webp"></p>
<p data-start="1004" data-end="1235">Un enregistrement proxifié permet à Cloudflare de recevoir les <strong>requêtes HTTP/HTTPS</strong> avant votre VPS. À l’inverse, un enregistrement en <strong data-start="1138" data-end="1150">DNS only</strong> laisse apparaître l’IP réelle du serveur et ne bénéficie pas du filtrage applicatif.</p>
<h3 data-section-id="wm0ygp" data-start="1237" data-end="1301">2. Activer le mode « Under Attack » en cas d&rsquo;attaque active</h3>
<p data-start="1303" data-end="1664">En cas d’attaque HTTP Flood ou de trafic web anormal, Cloudflare propose un mode appelé <strong data-start="1391" data-end="1413">“I’m Under Attack”</strong>. Ce mode ajoute une vérification supplémentaire avant de laisser passer les visiteurs vers votre site. Les utilisateurs légitimes voient généralement une page de challenge temporaire, tandis qu’une partie des bots automatisés est bloquée ou ralentie.</p>
<p data-start="1303" data-end="1664"><img class="aligncenter wp-image-29377 size-full"  alt="Activer le mode &quot;I am under Attack&quot;" width="1200" height="814" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/I-am-under-Attack.webp"></p>
<p data-start="1666" data-end="2086">Ce mode peut être activé depuis le tableau de bord Cloudflare, dans les paramètres de sécurité du domaine. Il ne doit pas forcément rester actif en permanence, car il ajoute une étape visible pour les visiteurs. En revanche, il est utile lorsqu’un site hébergé sur le VPS devient soudainement lent, que les logs montrent un volume anormal de requêtes ou que l’utilisation CPU/RAM augmente fortement sans raison légitime.</p>
<p data-start="2088" data-end="2232">Pour un site e-commerce ou une application critique, activez ce mode avec prudence et surveillez le comportement des visiteurs après activation.</p>
<h3 data-section-id="1jxsz2y" data-start="2234" data-end="2282">2. Règles WAF recommandées (plan gratuit)</h3>
<p data-start="2284" data-end="2538">Le WAF, ou <strong data-start="2295" data-end="2323">Web Application Firewall</strong>, permet de filtrer des requêtes web suspectes avant qu’elles n’atteignent votre VPS. Il est particulièrement utile contre les attaques visant des failles connues, des URL sensibles ou des comportements automatisés.</p>
<p data-start="2540" data-end="2805">Pour un site WordPress, WooCommerce ou une application web classique, vous pouvez commencer par activer les règles de sécurité gérées disponibles dans Cloudflare. Elles permettent de bloquer une partie des attaques courantes sans écrire vous-même toutes les règles.</p>
<p data-start="2807" data-end="2951">Vous pouvez également créer des règles simples pour protéger les pages sensibles. Par exemple, il est pertinent de renforcer la protection sur :</p>
<ul data-start="2953" data-end="3061">
<li data-section-id="15fdird" data-start="2953" data-end="2968"><code data-start="2955" data-end="2966">/wp-admin</code> ;</li>
<li data-section-id="1tma8er" data-start="2969" data-end="2988"><code data-start="2971" data-end="2986">/wp-login.php</code> ;</li>
<li data-section-id="6prq73" data-start="2989" data-end="3001"><code data-start="2991" data-end="2999">/login</code> ;</li>
<li data-section-id="t1xagj" data-start="3002" data-end="3014"><code data-start="3004" data-end="3012">/admin</code> ;</li>
<li data-section-id="c7q88t" data-start="3015" data-end="3061">les pages d’authentification personnalisées;</li>
</ul>
<p data-start="3063" data-end="3332">Le rate limiting peut aussi être utile pour limiter le nombre de requêtes par IP sur certaines URL. L’objectif n’est pas de bloquer les visiteurs légitimes, mais d’éviter qu’une même adresse ou un même comportement automatisé sollicite trop fortement votre serveur web.</p>
<h3 data-section-id="dv8ty6" data-start="3334" data-end="3370">4. Masquer l&rsquo;IP réelle du VPS</h3>
<p data-start="3372" data-end="3724">Cloudflare protège efficacement un site web uniquement si l’attaquant ne peut pas joindre directement l’adresse IP réelle du VPS. Si cette IP est exposée dans un enregistrement DNS non proxifié, dans un ancien sous-domaine, dans une configuration mail ou dans un historique DNS, un attaquant peut contourner Cloudflare et cibler directement le serveur.</p>
<p data-start="3726" data-end="3982">Vérifiez donc que les enregistrements <strong data-start="3764" data-end="3769">A</strong> et <strong data-start="3773" data-end="3781">AAAA</strong> pointant vers le VPS sont bien proxifiés lorsque cela est possible. Évitez aussi de créer des sous-domaines comme <code data-start="3896" data-end="3916">direct.example.com</code> ou <code data-start="3920" data-end="3940">server.example.com</code> qui exposent directement l’IP du serveur.</p>
<p data-start="3984" data-end="4261">Pour renforcer cette protection, vous pouvez configurer votre serveur web afin qu’il n’accepte les connexions HTTP et HTTPS que depuis les plages IP Cloudflare. Ainsi, même si l’adresse IP du VPS est découverte, les requêtes directes vers Apache ou Nginx peuvent être bloquées.</p>
<h2 data-section-id="vz493l" data-start="0" data-end="38">Surveillance et détection proactive</h2>
<p data-start="40" data-end="311">Une bonne configuration de sécurité ne s’arrête pas à l’installation d’iptables, de Fail2ban ou de Cloudflare. Pour protéger efficacement un VPS contre les attaques DDoS et les comportements suspects, il faut aussi surveiller régulièrement ce qui se passe sur le serveur.</p>
<p data-start="313" data-end="740">La surveillance permet de repérer rapidement un pic de trafic, une hausse anormale du nombre de connexions, des tentatives SSH répétées ou une activité inhabituelle dans les logs web. Plus vous détectez tôt une anomalie, plus vous pouvez réagir vite : activer une règle Cloudflare, renforcer Fail2ban, ajuster iptables ou contacter le support de votre hébergeur si l’attaque semble réseau.</p>
<h3 data-section-id="1jgyka9" data-start="742" data-end="793">1. Surveiller le trafic réseau en temps réel</h3>
<p data-start="795" data-end="998">Pour savoir si votre VPS subit un trafic anormal, commencez par observer les connexions actives. La commande <code data-start="904" data-end="908">ss</code> permet d’afficher les connexions TCP/UDP, les ports en écoute et les processus associés :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>ss <span class="ͼ12">-tunapl</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1024" data-end="1086">Les options utilisées permettent d’obtenir une vue détaillée :</p>
<ul data-start="1088" data-end="1324">
<li data-section-id="1r6i36e" data-start="1088" data-end="1122"><code data-start="1090" data-end="1093">t</code> affiche les connexions TCP ;</li>
<li data-section-id="1cbvzzl" data-start="1123" data-end="1157"><code data-start="1125" data-end="1128">u</code> affiche les connexions UDP ;</li>
<li data-section-id="1bt6zqk" data-start="1158" data-end="1215"><code data-start="1160" data-end="1163">n</code> affiche les adresses et ports au format numérique ;</li>
<li data-section-id="1dpcla9" data-start="1216" data-end="1252"><code data-start="1218" data-end="1221">a</code> montre toutes les connexions ;</li>
<li data-section-id="3s46td" data-start="1253" data-end="1289"><code data-start="1255" data-end="1258">p</code> indique le processus associé ;</li>
<li data-section-id="1m10fiu" data-start="1290" data-end="1324"><code data-start="1292" data-end="1295">l</code> affiche les ports en écoute.</li>
</ul>
<p data-start="1326" data-end="1397">Vous pouvez aussi compter rapidement le nombre de connexions établies :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>netstat <span class="ͼ12">-an</span> | <span class="ͼ10">grep</span> ESTABLISHED | <span class="ͼ10">wc</span> <span class="ͼ12">-l</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1451" data-end="1587">Si ce nombre augmente fortement sans raison, cela peut indiquer un trafic anormal, une attaque applicative ou un service très sollicité.</p>
<p data-start="1589" data-end="1656">Pour visualiser le trafic par interface réseau, installez <code data-start="1647" data-end="1654">iftop</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>apt install iftop <span class="ͼ12">-y</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1692" data-end="1758">Puis lancez-le sur l’interface réseau principale, souvent <code data-start="1750" data-end="1756">eth0</code> :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>iftop <span class="ͼ12">-i</span> eth0</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Si votre interface porte un autre nom, identifiez-la avec :</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>ip a</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1866" data-end="2050"><code data-start="1866" data-end="1873">iftop</code> permet de voir quelles adresses échangent le plus de données avec votre VPS. C’est très utile pour repérer une IP ou un groupe d’IP qui consomme anormalement la bande passante.</p>
<h3 data-section-id="6w0mcm" data-start="2052" data-end="2089">2. Analyser les logs d&rsquo;attaque</h3>
<p data-start="2091" data-end="2303">Les logs sont indispensables pour comprendre ce qui se passe réellement sur un VPS. En cas de suspicion d’attaque, ils permettent d’identifier les services ciblés, les IP les plus actives et les erreurs répétées.</p>
<p data-start="2305" data-end="2379">Pour analyser les tentatives SSH échouées sur Debian ou Ubuntu, utilisez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">grep</span> <span class="ͼz">"Failed password"</span> /var/log/auth.log | <span class="ͼ10">awk</span> <span class="ͼz">'{print $11}'</span> | <span class="ͼ10">sort</span> | uniq <span class="ͼ12">-c</span> | <span class="ͼ10">sort</span> <span class="ͼ12">-rn</span> | head <span class="ͼ12">-20</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2494" data-end="2752">Cette commande extrait les adresses IP liées aux échecs de connexion SSH, les regroupe, les compte, puis affiche les plus fréquentes. Si une même IP apparaît des dizaines ou centaines de fois, elle doit être surveillée ou bannie automatiquement via Fail2ban.</p>
<p data-start="2754" data-end="2858">Pour les sites hébergés avec Nginx, vous pouvez afficher les IP les plus actives dans les logs d’accès :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">awk</span> <span class="ͼz">'{print $1}'</span> /var/log/nginx/access.log | <span class="ͼ10">sort</span> | uniq <span class="ͼ12">-c</span> | <span class="ͼ10">sort</span> <span class="ͼ12">-rn</span> | head <span class="ͼ12">-20</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2955" data-end="2987">Avec Apache, adaptez le chemin :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">awk</span> <span class="ͼz">'{print $1}'</span> /var/log/apache2/access.log | <span class="ͼ10">sort</span> | uniq <span class="ͼ12">-c</span> | <span class="ͼ10">sort</span> <span class="ͼ12">-rn</span> | head <span class="ͼ12">-20</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3086" data-end="3289">Ces commandes aident à repérer les comportements anormaux : une IP qui charge trop souvent une page de connexion, un bot qui explore toutes les URL du site ou un trafic massif vers une ressource précise.</p>
<p data-start="3291" data-end="3584">Il ne faut toutefois pas bannir une IP sans analyse. Certaines adresses peuvent appartenir à des <strong>proxys</strong>, des <strong>réseaux d’entreprise</strong>, des robots légitimes ou des services de supervision. Croisez toujours les informations avec l’heure, l’URL ciblée, le code HTTP retourné et le volume de requêtes.</p>
<h3 data-section-id="18wfqle" data-start="3586" data-end="3630">3. Monitoring depuis le Panel KVM LWS</h3>
<p data-start="3632" data-end="3888">En complément des commandes Linux, le Panel KVM LWS permet de suivre les ressources du VPS depuis une interface graphique. Cette supervision est utile pour repérer rapidement une hausse inhabituelle de la charge CPU, de la mémoire vive ou du trafic réseau.</p>
<p data-start="3632" data-end="3888"><img class="aligncenter wp-image-29376 size-full"  alt="Gestion de ressources VPS KVM" width="1200" height="812" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Gestion-de-ressources-VPS-KVM.webp"></p>
<p data-start="3890" data-end="4158">Un pic soudain de trafic peut être le premier signe visible d’une <strong>attaque DDoS</strong> ou d’un comportement applicatif anormal. Une montée brutale du CPU peut aussi indiquer un HTTP Flood, un script PHP saturé, une attaque sur WordPress ou une base de données trop sollicitée.</p>
<h2 data-section-id="12rt5lv" data-start="0" data-end="37">Vérification du bon fonctionnement</h2>
<p data-start="39" data-end="417">Une fois SSH, iptables, Fail2ban et Cloudflare configurés, il est essentiel de vérifier que chaque couche de protection fonctionne correctement. Cette étape évite deux problèmes fréquents : croire que le VPS est protégé alors qu’une règle n’est pas active, ou au contraire bloquer un accès légitime à cause d’une configuration trop stricte.</p>
<p data-start="419" data-end="521">Commencez par tester la connexion SSH depuis un nouveau terminal, sans fermer votre session actuelle :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code><span class="ͼ10">ssh</span> <span class="ͼ12">-p</span> <span class="ͼy">2222</span> votre_utilisateur@IP_DU_VPS</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class="">Si la connexion fonctionne avec la clé SSH, vous pouvez considérer que le durcissement SSH est opérationnel. Vérifiez ensuite que les règles iptables sont bien chargées :</div>
</div>
</div>
</div>
</div>
</div>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>iptables <span class="ͼ12">-L</span> <span class="ͼ12">-n</span> <span class="ͼ12">-v</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="779" data-end="1006">Contrôlez que les ports nécessaires sont autorisés, notamment SSH, HTTP et HTTPS si votre VPS héberge un site web. Vérifiez aussi que les règles de limitation et de blocage des paquets invalides apparaissent bien dans la liste.</p>
<p data-start="1008" data-end="1033">Testez ensuite Fail2ban :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="">
<pre><code>fail2ban-client status
fail2ban-client status sshd</code></pre>
</div>
</div>
</div>
</div>
</div>
<p data-start="1099" data-end="1285">Pour aller plus loin, vous pouvez simuler plusieurs connexions SSH échouées depuis une autre adresse IP, puis vérifier que Fail2ban bannit bien l’adresse après le nombre d’échecs défini.</p>
<p data-start="1287" data-end="1538">Si Cloudflare est actif, vérifiez dans la zone DNS que les enregistrements du site sont bien proxifiés avec le nuage orange. Enfin, consultez la supervision du Panel KVM LWS pour confirmer que le trafic réseau, la mémoire et le CPU sont bien visibles.</p>
<h2 data-section-id="1wbg0sh" data-start="1540" data-end="1579">VPS pour DDoS : erreurs fréquentes et cas de blocage</h2>
<p data-start="1581" data-end="1803">Même avec une bonne méthode, certaines erreurs peuvent rendre le VPS inaccessible ou empêcher une protection de fonctionner correctement. Le tableau suivant regroupe les cas les plus fréquents et les solutions à appliquer.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="1805" data-end="2827">
<thead data-start="1805" data-end="1843">
<tr data-start="1805" data-end="1843">
<th class="last:pe-10" data-start="1805" data-end="1814" data-col-size="md">Erreur</th>
<th class="last:pe-10" data-start="1814" data-end="1831" data-col-size="md">Cause probable</th>
<th class="last:pe-10" data-start="1831" data-end="1843" data-col-size="lg">Solution</th>
</tr>
</thead>
<tbody data-start="1858" data-end="2827">
<tr data-start="1858" data-end="2118">
<td data-start="1858" data-end="1912" data-col-size="md">
<blockquote><p>Se bloquer soi-même après le changement du port SSH</p></blockquote>
</td>
<td data-col-size="md" data-start="1912" data-end="1999">
<blockquote><p>Le nouveau port SSH n’a pas été ouvert dans iptables avant le redémarrage du service</p></blockquote>
</td>
<td data-col-size="lg" data-start="1999" data-end="2118">
<blockquote><p>Toujours tester <code data-start="2017" data-end="2058">ssh -p 2222 votre_utilisateur@IP_DU_VPS</code> dans un second terminal avant de fermer la session active</p></blockquote>
</td>
</tr>
<tr data-start="2119" data-end="2280">
<td data-start="2119" data-end="2153" data-col-size="md">
<blockquote><p>Fail2ban bannit votre propre IP</p></blockquote>
</td>
<td data-col-size="md" data-start="2153" data-end="2215">
<blockquote><p>Trop de tentatives échouées ou IP administrateur non exclue</p></blockquote>
</td>
<td data-col-size="lg" data-start="2215" data-end="2280">
<blockquote><p>Ajouter votre IP dans <code data-start="2239" data-end="2249">ignoreip</code> dans le fichier <code data-start="2266" data-end="2278">jail.local</code></p></blockquote>
</td>
</tr>
<tr data-start="2281" data-end="2461">
<td data-start="2281" data-end="2335" data-col-size="md">
<blockquote><p>Les règles iptables disparaissent après redémarrage</p></blockquote>
</td>
<td data-col-size="md" data-start="2335" data-end="2383">
<blockquote><p>Les règles n’ont pas été rendues persistantes</p></blockquote>
</td>
<td data-col-size="lg" data-start="2383" data-end="2461">
<blockquote><p>Installer <code data-start="2395" data-end="2416">iptables-persistent</code>, puis exécuter <code data-start="2432" data-end="2459">netfilter-persistent save</code></p></blockquote>
</td>
</tr>
<tr data-start="2462" data-end="2662">
<td data-start="2462" data-end="2503" data-col-size="md">
<blockquote><p>Cloudflare ne protège pas l’IP directe</p></blockquote>
</td>
<td data-col-size="md" data-start="2503" data-end="2584">
<blockquote><p>L’adresse IP réelle du VPS est exposée dans un enregistrement DNS non proxifié</p></blockquote>
</td>
<td data-col-size="lg" data-start="2584" data-end="2662">
<blockquote><p>Supprimer ou proxifier les enregistrements A/AAAA qui exposent l’IP du VPS</p></blockquote>
</td>
</tr>
<tr data-start="2663" data-end="2827">
<td data-start="2663" data-end="2689" data-col-size="md">
<blockquote><p>Fail2ban ne démarre pas</p></blockquote>
</td>
<td data-col-size="md" data-start="2689" data-end="2754">
<blockquote><p>Erreur de syntaxe dans <code data-start="2714" data-end="2726">jail.local</code> ou chemin de log incorrect</p></blockquote>
</td>
<td data-col-size="lg" data-start="2754" data-end="2827">
<blockquote><p>Tester la configuration avec <code data-start="2785" data-end="2805">fail2ban-client -t</code> avant de redémarrer</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="2829" data-end="3148">Pour éviter ces blocages, appliquez toujours les modifications dans cet ordre : ouvrir les ports nécessaires, tester l’accès, sauvegarder la configuration, puis seulement ensuite fermer les anciennes sessions. Sur un VPS en production, il est également recommandé de créer un snapshot avant toute modification sensible.</p>
<h2 data-section-id="ut5zuo" data-start="3150" data-end="3200">Bonnes pratiques : sécurité VPS au-delà du DDoS</h2>
<p data-start="3202" data-end="3463">La protection contre les attaques DDoS ne doit pas être isolée du reste de la sécurité serveur. Un VPS bien protégé repose aussi sur des mises à jour régulières, une gestion stricte des comptes utilisateurs, des sauvegardes fiables et une surveillance continue.</p>
<p data-start="3465" data-end="3508">Commencez par maintenir le système à jour :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>apt update &amp;&amp; apt upgrade <span class="ͼ12">-y</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3552" data-end="3794">Les mises à jour corrigent des failles de sécurité dans le noyau Linux, OpenSSH, Apache, Nginx, PHP, MariaDB et les autres paquets installés. Un serveur non maintenu devient rapidement vulnérable, même avec un pare-feu correctement configuré.</p>
<p data-start="3796" data-end="4028">Évitez aussi d’utiliser le compte <code data-start="3830" data-end="3836">root</code> pour les tâches courantes. Créez plutôt un utilisateur dédié avec des droits <code data-start="3914" data-end="3920">sudo</code>, puis limitez l’accès SSH à ce compte. Cela réduit les risques en cas d’erreur ou de tentative d’intrusion.</p>
<p data-start="4030" data-end="4254">Avant de modifier iptables, SSH, Fail2ban ou la configuration réseau, créez un snapshot depuis le Panel KVM LWS. Vous pourrez ainsi revenir plus facilement à un état stable si une règle bloque l’accès ou perturbe un service.</p>
<p data-start="4256" data-end="4512">Activez également les sauvegardes automatiques lorsque votre projet est important. Une attaque ne se limite pas toujours à une saturation réseau : elle peut aussi précéder une tentative d’intrusion, une suppression de fichiers ou une altération de données.</p>
<p data-start="4256" data-end="4512"><img class="aligncenter wp-image-29381 size-full"  alt="Sauvegardes du VPS KVM LWS" width="1200" height="754" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/06/Sauvegardes-du-VPS-KVM-LWS.webp"></p>
<p data-start="4514" data-end="4821">Enfin, surveillez régulièrement les logs et les alertes Fail2ban. Pour aller plus loin, vous pouvez aussi <a class="decorated-link" title="Claude Code sur VPS LWS : installation et premiers cas d&#039;usage 2026" href="https://tutoriels.lws.fr/intelligence-artificielle/installer-claude-code-vps-lws" data-start="4620" data-end="4784">analyser automatiquement la configuration sécurité de votre VPS avec Claude Code</a>, en complément d’un contrôle manuel.</p>
<h2 data-section-id="vi5xqa" data-start="4823" data-end="4836">FAQ</h2>
<p data-section-id="yyx0aq" data-start="4838" data-end="4896"><strong>Est-ce qu&rsquo;un VPS LWS inclut une protection anti-DDoS ?</strong></p>
<p data-start="4898" data-end="5099">Oui, les VPS KVM LWS incluent une protection anti-DDoS réseau côté infrastructure. Cette protection agit en amont du serveur pour filtrer une partie du trafic malveillant avant qu’il n’atteigne le VPS.</p>
<p data-section-id="1cdmp6b" data-start="5101" data-end="5153"><strong>Fail2ban protège-t-il contre les attaques DDoS ?</strong></p>
<p data-start="5155" data-end="5355">Fail2ban ne bloque pas une attaque DDoS volumétrique. En revanche, il est très utile contre les attaques applicatives répétées, comme le brute-force SSH ou certaines tentatives d’authentification web.</p>
<p data-section-id="18zm6jh" data-start="5357" data-end="5450"><strong>Quelle est la différence entre une protection DDoS réseau et une protection applicative ?</strong></p>
<p data-start="5452" data-end="5685">La protection réseau agit sur les couches L3/L4, par exemple contre les floods UDP, ICMP ou SYN. La protection applicative agit sur les couches supérieures, comme les requêtes HTTP, les connexions SSH ou les formulaires de connexion.</p>
<p data-section-id="ypcybx" data-start="5687" data-end="5757"><strong>Comment savoir si mon VPS est en train de subir une attaque DDoS ?</strong></p>
<p data-start="5759" data-end="6005">Surveillez les pics de trafic réseau, la hausse brutale du CPU, le nombre de connexions actives, les logs SSH et les logs web. Le Panel KVM LWS et les commandes comme <code data-start="5926" data-end="5930">ss</code>, <code data-start="5932" data-end="5939">iftop</code> ou <code data-start="5943" data-end="5967">fail2ban-client status</code> peuvent aider à confirmer l’anomalie.</p>
<p data-section-id="9lszl4" data-start="6007" data-end="6077"><strong>Cloudflare est-il suffisant pour protéger un VPS contre les DDoS ?</strong></p>
<p data-start="6079" data-end="6262">Cloudflare protège surtout les sites web exposés en HTTP/HTTPS. Il ne protège pas automatiquement SSH, les ports personnalisés ou les services accessibles directement par l’IP du VPS.</p>
<p data-section-id="t4q78p" data-start="6264" data-end="6339"><strong>Faut-il des compétences avancées pour configurer iptables et Fail2ban ?</strong></p>
<p data-start="6341" data-end="6565">Il faut être à l’aise avec SSH et la ligne de commande Linux, mais les configurations de base restent accessibles si vous appliquez les étapes avec prudence et testez chaque modification avant de fermer votre session active.</p>
<h2 data-section-id="8dtpi" data-start="0" data-end="13">Conclusion</h2>
<p data-start="15" data-end="510">Protéger un <strong>VPS contre les attaques DDoS</strong> demande une approche en plusieurs couches. La protection réseau de l’hébergeur joue un rôle essentiel pour filtrer les <strong>attaques volumétrique</strong>s en amont, mais elle doit être complétée par une configuration sérieuse côté serveur.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f989.png" alt="🦉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> En durcissant SSH, en appliquant des règles iptables adaptées, en installant Fail2ban, en surveillant les logs et en utilisant Cloudflare pour les sites web, vous réduisez fortement les risques d’indisponibilité et d’intrusion.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9db-200d-2642-fe0f.png" alt="🧛‍♂️" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Un bon VPS pour DDoS n’est donc pas seulement un serveur avec une protection réseau incluse. C’est aussi un environnement correctement administré, surveillé et maintenu à jour.</p>
<blockquote data-start="851" data-end="1174" data-is-last-node="" data-is-only-node="">
<p data-start="853" data-end="1174" data-is-last-node=""><strong data-start="853" data-end="900">Besoin d’un VPS sécurisé pour vos projets ?</strong><br data-start="900" data-end="903" />Pour héberger vos sites, applications ou services sur un VPS avec protection anti-DDoS incluse, accès root complet et infrastructure souveraine française, consultez les offres <strong data-start="1081" data-end="1096">VPS KVM LWS</strong>.<br data-start="1097" data-end="1100" data-is-only-node="" /><a class="custom_btn cb_bg_green" href="https://www.lws.fr/vps-kvm.php" rel="noopener" target="_top" style="color: #000;">Découvrir les VPS KVM LWS</a></p>
</blockquote>
<p data-start="853" data-end="1174" data-is-last-node=""><em>Prenez le temps de tester chaque règle, de vérifier vos accès et de créer des snapshots avant toute modification sensible. Et si vous avez des questions ou des ajouts sur la façon de lutter contre les attaques DDoS, écrivez-nous dans la section Commentaires.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/vps-pour-ddos-protection-configuration/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29371</post-id>	</item>
		<item>
		<title>Docker sur VPS LWS : guide complet pour installer, configurer et déployer ses applications</title>
		<link>https://tutoriels.lws.fr/vps/docker-vps-lws-deployer-ses-applications</link>
					<comments>https://tutoriels.lws.fr/vps/docker-vps-lws-deployer-ses-applications#respond</comments>
		
		<dc:creator><![CDATA[Joseph]]></dc:creator>
		<pubDate>Mon, 04 May 2026 14:36:27 +0000</pubDate>
				<category><![CDATA[VPS]]></category>
		<guid isPermaLink="false">https://tutoriels.lws.fr/?p=28863</guid>

					<description><![CDATA[Déployer une application sur un serveur peut vite devenir difficile : dépendances incompatibles, versions différentes entre l’environnement local et la production, ports mal configurés ou mises à jour risquées. C’est précisément ce que Docker permet de simplifier. Grâce aux conteneurs, chaque application embarque son environnement d’exécution et peut fonctionner de manière isolée, reproductible et prévisible.🎉 &#8230; <a href="https://tutoriels.lws.fr/vps/docker-vps-lws-deployer-ses-applications" class="more-link">Continue reading <span class="screen-reader-text">Docker sur VPS LWS : guide complet pour installer, configurer et déployer ses applications</span></a>]]></description>
										<content:encoded><![CDATA[<p data-start="88" data-end="500">Déployer une <strong>application</strong> sur un serveur peut vite devenir difficile : dépendances incompatibles, versions différentes entre l’environnement local et la production, ports mal configurés ou mises à jour risquées. C’est précisément ce que Docker permet de simplifier. Grâce aux conteneurs, chaque application embarque son environnement d’exécution et peut fonctionner de manière isolée, reproductible et prévisible.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Sur un <strong>VPS KVM LWS</strong>, Docker devient un excellent allié pour héberger plusieurs services sans complexifier l’administration du serveur. Vous pouvez déployer WordPress, Nextcloud, n8n, Uptime Kuma, une application Node.js, Python ou un agent IA, tout en gardant le contrôle complet de votre infrastructure.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p data-start="807" data-end="1161">En 2026, Docker reste un standard pour les développeurs, les administrateurs système et les projets self-hosted. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a5.png" alt="💥" class="wp-smiley" style="height: 1em; max-height: 1em;" />Ce guide vous accompagne pas à pas pour installer Docker sur un VPS LWS et déployer vos premières applications conteneurisées. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’approche convient particulièrement aux VPS disposant d’un accès root complet et d’une virtualisation KVM fiable.</p>
<h2 data-section-id="163g16u" data-start="1163" data-end="1188">Objectif</h2>
<p data-start="1190" data-end="1575"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" />L’objectif de ce tutoriel est de vous guider depuis un <strong>VPS Ubuntu vierge</strong> jusqu’à un environnement Docker opérationnel, prêt à héberger des applications réelles. Vous allez d’abord comprendre les notions essentielles : image, conteneur, volume, réseau et Docker Compose. Ensuite, vous installerez Docker Engine sur Ubuntu 22.04 LTS ou Ubuntu 24.04 LTS à partir du dépôt officiel Docker. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f62a.png" alt="😪" class="wp-smiley" style="height: 1em; max-height: 1em;" />Le guide vous montrera également comment lancer vos premiers conteneurs, puis comment déployer une application multi-services avec un fichier compose.yaml. L’exemple principal reposera sur un stack WordPress + MySQL, car il illustre clairement la communication entre services, la persistance des données et la configuration par variables d’environnement.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2611.png" alt="☑" class="wp-smiley" style="height: 1em; max-height: 1em;" /> À la fin de l’article, vous saurez <strong>installer Docker, lancer un service, gérer les logs, maintenir vos conteneurs et préparer un déploiement</strong> plus propre avec un reverse proxy HTTPS. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2 data-section-id="16d31ow" data-start="0" data-end="37">Pré-requis</h2>
<p data-start="39" data-end="307">Pour suivre ce tutoriel, vous devez disposer :</p>
<ul>
<li data-start="39" data-end="307">D’un VPS KVM LWS actif, idéalement installé avec Ubuntu 22.04 LTS ou Ubuntu 24.04 LTS. Ces versions sont adaptées à l’installation de Docker Engine depuis le dépôt officiel Docker et conviennent aux usages serveur courants.</li>
<li data-start="309" data-end="427">Un accès SSH root au VPS afin d’exécuter les commandes d’installation et de configuration :</li>
</ul>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">ssh root@IP_VPS
</pre>
<ul>
<li>Une fois connecté, vérifiez la version du noyau Linux :</li>
</ul>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">uname -r</pre>
<ul>
<li data-start="537" data-end="812">Docker nécessite un environnement Linux complet, ce qui rend la virtualisation KVM particulièrement adaptée. Contrairement à certains environnements mutualisés ou virtualisés de manière plus restrictive, KVM offre un meilleur contrôle du <strong>système</strong>, du <strong>kernel</strong> et des ressources.</li>
<li data-start="814" data-end="1067">Aucune installation préalable de Docker n’est requise. Le guide part d’un serveur propre. Un niveau intermédiaire en ligne de commande est recommandé : navigation dans les dossiers, édition de fichiers, lecture de logs et exécution de commandes simples.</li>
</ul>
<div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div>
<h2 data-section-id="yht7yc" data-start="1069" data-end="1114">Cadre technique et périmètre</h2>
<p data-start="1116" data-end="1414">Cet article couvre l’usage le plus courant de Docker sur un VPS : déployer et maintenir plusieurs applications sur un serveur Linux unique. Il s’adresse aux utilisateurs qui veulent héberger leurs services de manière plus propre, reproductible et isolée qu’avec une installation manuelle classique.</p>
<p data-start="1416" data-end="1906">Nous allons aborder les concepts fondamentaux de Docker :</p>
<ul>
<li data-start="1416" data-end="1906">image,</li>
<li data-start="1416" data-end="1906">conteneur,</li>
<li data-start="1416" data-end="1906">volume,</li>
<li data-start="1416" data-end="1906">réseau,</li>
<li data-start="1416" data-end="1906">fichier compose.yaml</li>
<li data-start="1416" data-end="1906">Docker Compose.</li>
</ul>
<p>Ensuite, nous verrons comment<strong> installer Docker Engine sur Ubuntu</strong>, lancer un premier conteneur, puis structurer un déploiement multi-services complet. Le cas pratique principal sera un stack WordPress + MySQL, suffisamment parlant pour comprendre la communication entre conteneurs, la persistance des données et la configuration par variables d’environnement.</p>
<p data-start="1908" data-end="2151">Le tutoriel inclut aussi la sécurisation de l’accès avec un reverse proxy, des exemples d’applications self-hostées, les commandes de maintenance, les vérifications après déploiement, les erreurs fréquentes et les bonnes pratiques de sécurité.</p>
<p data-start="2153" data-end="2493" data-is-last-node="" data-is-only-node="">En revanche, <strong>Kubernetes, Docker Swarm,</strong> les architectures multi-serveurs et la création avancée d’images personnalisées ne sont pas traités ici. Docker sur Windows ou macOS sort également du périmètre, car l’objectif est de travailler sur un VPS Linux LWS. Les interfaces graphiques comme Coolify seront plutôt abordées dans un guide séparé.</p>
<h2 data-section-id="1gzv8w8" data-start="0" data-end="47">Les concepts Docker essentiels</h2>
<p data-start="49" data-end="354">Avant d’installer Docker sur votre VPS LWS, il est utile de comprendre les éléments qui composent son fonctionnement. Docker repose sur une logique simple : au lieu d’installer directement une application et toutes ses dépendances sur le système, on l’exécute dans un environnement isolé appelé conteneur.</p>
<p data-start="49" data-end="354"><img class="aligncenter wp-image-28876"  alt="Les concepts Docker essentiels" width="1000" height="750" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/05/Schema-de-Docker-1024x768.png"></p>
<h3 data-start="356" data-end="836">Une image Docker</h3>
<p data-start="356" data-end="836">C&rsquo;est un modèle prêt à l’emploi. Elle contient tout ce dont une application a besoin pour fonctionner : système de base, dépendances, bibliothèques, runtime, fichiers applicatifs et configuration initiale. Par exemple, l’image <code data-start="602" data-end="616">nginx:latest</code> permet de lancer un serveur web Nginx, tandis que <code data-start="667" data-end="678">mysql:8.0</code> permet de démarrer une base de données MySQL.</p>
<p data-start="356" data-end="836">Une image ne change pas pendant son exécution : elle sert de base stable pour créer un ou plusieurs conteneurs.</p>
<h3 data-start="838" data-end="1140">Un <strong data-start="841" data-end="854">conteneur</strong></h3>
<p data-start="838" data-end="1140">C&rsquo;est une instance active d’une image. Si l’image est le modèle, le conteneur est le service qui tourne réellement sur le VPS. Il peut être démarré, arrêté, redémarré ou supprimé sans modifier l’image d’origine. Cette séparation rend les déploiements plus propres et plus reproductibles.</p>
<h3 data-start="1142" data-end="1521"><strong data-start="1142" data-end="1156">Docker Hub</strong></h3>
<p data-start="1142" data-end="1521">Il s&rsquo;agit d&rsquo;un registre public le plus utilisé pour récupérer des images officielles ou maintenues par des éditeurs. On y trouve des images pour WordPress, MySQL, Redis, PostgreSQL, Node.js, Python, Nginx, Nextcloud ou encore n8n. Pour un usage sérieux, il est recommandé de privilégier les images officielles, les éditeurs vérifiés et les projets maintenus régulièrement.</p>
<h3 data-start="1523" data-end="1888"><strong data-start="1523" data-end="1541">Docker Compose</strong></h3>
<p data-start="1523" data-end="1888">Il permet de gérer des applications composées de plusieurs conteneurs depuis un seul fichier, généralement nommé <code data-start="1652" data-end="1666">compose.yaml</code>. Au lieu de lancer manuellement chaque service avec une longue commande, vous déclarez les services, ports, volumes, réseaux et variables d’environnement dans un fichier YAML. Le lancement du projet se fait ensuite avec :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose up -d</pre>
<p data-start="1936" data-end="2053">En 2026, cette syntaxe avec espace est la syntaxe correcte à utiliser avec le plugin Compose intégré à la CLI Docker.</p>
<h3 data-start="2055" data-end="2371">Un <strong data-start="2058" data-end="2075">volume Docker</strong></h3>
<p data-start="2055" data-end="2371">Il sert à conserver les données au-delà du cycle de vie d’un conteneur. C’est indispensable pour les bases de données, les fichiers WordPress, les documents Nextcloud ou les configurations applicatives. Sans volume, supprimer un conteneur peut entraîner la perte des données stockées à l’intérieur.</p>
<p data-start="2373" data-end="2677">Nous distinguons généralement les volumes nommés, gérés par Docker, et les montages de dossiers du VPS. Les volumes nommés sont pratiques pour les bases de données. Les montages de dossiers sont utiles pour les fichiers de configuration que vous souhaitez consulter ou modifier directement depuis le serveur.</p>
<h3 data-start="2679" data-end="2906">Les <strong data-start="2690" data-end="2708">réseaux Docker</strong></h3>
<p data-start="2679" data-end="2906">Ils permettent aux conteneurs d’un même projet de communiquer entre eux. Dans un fichier Compose, WordPress peut joindre MySQL avec le nom du service <code data-start="2855" data-end="2859">db</code>, sans exposer la base de données publiquement.</p>
<h2 data-section-id="ocjzeh" data-start="3010" data-end="3058">Installer Docker sur le VPS LWS</h2>
<p data-start="3060" data-end="3469">La méthode recommandée consiste à installer Docker depuis le dépôt officiel Docker. Sur Ubuntu, certains paquets disponibles directement dans les dépôts de la distribution peuvent être moins récents.</p>
<p data-start="3060" data-end="3469">Pour un VPS destiné à héberger des applications en production, il est préférable d’utiliser la méthode officielle afin d’obtenir Docker Engine, le client Docker, containerd, Buildx et le plugin Docker Compose.</p>
<h3 data-start="3060" data-end="3469"><strong>Étape 1 — Mettre à jour le système</strong></h3>
<p data-start="3471" data-end="3524">Depuis votre espace d&rsquo;hébergement, accédez à la console.</p>
<p data-start="3471" data-end="3524"><img class="aligncenter size-full wp-image-28868"  alt="Accéder à la console VPS" width="1000" height="757" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/05/Acceder-a-la-console-VPS-KVM.png"></p>
<p data-start="3471" data-end="3524">Commencez par vous connecter à votre VPS LWS en SSH :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="pointer-events-none absolute inset-x-4 top-12 bottom-4">
<div class="pointer-events-none sticky z-40 shrink-0 z-1!">
<div class="sticky bg-token-border-light">
<pre class="EnlighterJSRAW" data-enlighter-language="generic">ssh root@IP_VPS</pre>
<p><img class="aligncenter size-full wp-image-28874"  alt="Terminal pour accéder au VPS" width="1000" height="837" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/05/Interface-du-terminal-web-du-VPS-KVM.png"></p>
<p>Une fois que vous êtes connecté, vous aurez une interface comme celle que vous voyez ci-dessous :</p>
<p><img class="aligncenter size-full wp-image-28877"  alt="VPS KVM Connecté " width="999" height="848" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/05/VPS-KVM-Connecte.png"></p>
<p>Mettez ensuite le système à jour :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">apt update &amp;&amp; apt upgrade -y</pre>
<p><img class="aligncenter size-full wp-image-28869"  alt="Exécuter la commande de la mise à jour du VPS KVM" width="1000" height="837" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/05/Commande-la-mise-a-jour-de-Docker.png"></p>
<p>Patientez pendant que le système exécute la mise à jour. Celle-ci peut prendre quelques minutes.</p>
<p><img class="aligncenter size-full wp-image-28873"  alt="Installation de la mise à jour du système Docker sur VPS KVM" width="999" height="853" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/05/Installation-de-la-mise-a-jour-du-systeme-Docker-sur-KVM.png"></p>
<h3><strong>Étape 2 — Installer les dépendances</strong></h3>
<p>Installez les dépendances nécessaires à l’ajout du dépôt Docker :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">apt install -y ca-certificates curl gnupg</pre>
<h3><strong>Étape 3 — Ajouter la clé GPG officielle Docker</strong></h3>
<p>Créez le dossier qui accueillera les clés utilisées par APT :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">install -m 0755 -d /etc/apt/keyrings</pre>
<p>Ajoutez la clé GPG officielle Docker :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  gpg --dearmor -o /etc/apt/keyrings/docker.gpg</pre>
<p>Appliquez les permissions nécessaires :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">chmod a+r /etc/apt/keyrings/docker.gpg</pre>
<h3><strong>Étape 4 — Ajouter le dépôt Docker</strong></h3>
<p>Ajoutez maintenant le dépôt Docker correspondant à votre version d’Ubuntu :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</pre>
<h3><strong>Étape 5 — Installer Docker Engine + Compose</strong></h3>
<p>Rechargez la liste des paquets :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">apt update</pre>
<p>Installez Docker Engine, ses composants principaux et le plugin Compose :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin</pre>
<h3><strong>Étape 6 — Vérifier l&rsquo;installation</strong></h3>
<p>Vérifiez ensuite que Docker est bien installé :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker --version</pre>
<p>Vous devez obtenir une sortie indiquant la version installée de Docker.</p>
<p><img class="aligncenter size-full wp-image-28875"  alt="Résultats de la version Docker installée sur VPS KVM" width="999" height="845" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/05/Resultats-de-la-version-Docker-installee-sur-VPS-KVM.png"></p>
<p>Vérifiez aussi Docker Compose :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose version</pre>
<p data-start="5063" data-end="5221">La commande doit afficher une version de <strong>Docker Compose v2</strong> ou supérieure. Si c’est le cas, le plugin Compose est correctement disponible depuis la CLI Docker.</p>
<p data-start="5063" data-end="5221"><img class="aligncenter size-full wp-image-28870"  alt="Docker compose version" width="999" height="831" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/05/Docker-compose-version.png"></p>
<h3 data-start="5063" data-end="5221"><strong>Étape 7 — Activer Docker au démarrage</strong></h3>
<p data-start="5223" data-end="5259">Activez Docker au démarrage du VPS :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">systemctl enable docker
systemctl start docker</pre>
<p>Vous pouvez contrôler l’état du service avec :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">systemctl status docker</pre>
<p data-start="5430" data-end="5500">Si le service est actif, Docker est prêt à être utilisé sur votre VPS.</p>
<p data-start="5502" data-end="5621">Pour éviter de manipuler Docker uniquement avec le compte root, vous pouvez créer un utilisateur dédié au déploiement :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">useradd -m -s /bin/bash deploys
usermod -aG docker deploys
su - deploys</pre>
<p data-start="5720" data-end="6000">Cet utilisateur pourra lancer les commandes Docker sans utiliser directement le compte root. Cette pratique améliore l’organisation du serveur, mais elle doit rester réservée à des utilisateurs de confiance, car l’accès au groupe Docker donne des droits importants sur la machine.</p>
<p data-start="6121" data-end="6173"><div class="alert_tips"><p class="title">Trucs et astuces</p><hr><p>Docker fonctionne idéalement sur un VPS avec virtualisation KVM, accès root complet et distribution Linux récente. Le <strong data-start="6293" data-end="6308">VPS KVM LWS</strong> fournit un environnement adapté pour installer Docker, gérer vos services en SSH, accéder à une console web depuis le Panel KVM et préparer vos interventions avec des snapshots.</p>
<p data-start="6121" data-end="6173"><a title="Voir les offres VPS KVM LWS" href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Voir les offres VPS KVM LWS</a></p>
<p data-start="6121" data-end="6173"></p></div></p>
<h2 data-section-id="1oxfy9p" data-start="0" data-end="41">Premiers pas avec Docker</h2>
<p data-start="43" data-end="316">Une fois Docker installé, commencez par lancer un conteneur de test. Docker fournit une image officielle appelée <code data-start="156" data-end="169">hello-world</code>, pensée pour vérifier que le moteur fonctionne correctement, que le VPS peut télécharger une image et qu’un conteneur peut s’exécuter sans erreur.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker run hello-world</pre>
<p data-start="354" data-end="584">Si l’installation est correcte, un message de confirmation s’affiche dans le terminal.</p>
<p data-start="354" data-end="584"><img class="aligncenter size-full wp-image-28872"  alt="Hello From Docker - tester Docker sur VPS KVM" width="999" height="846" / loading="lazy" decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2026/05/Hello-From-Docker-tester-Docker-sur-VPS-KVM.png"></p>
<p data-start="354" data-end="584">Ce test est simple, mais il valide toute la chaîne : client Docker, daemon Docker, accès réseau au registre d’images et exécution du conteneur.</p>
<p data-start="586" data-end="640">Les commandes de base à connaître sont les suivantes :</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="642" data-end="1226">
<thead data-start="642" data-end="663">
<tr data-start="642" data-end="663">
<th class="" data-start="642" data-end="651" data-col-size="sm">Action</th>
<th class="" data-start="651" data-end="663" data-col-size="sm">Commande</th>
</tr>
</thead>
<tbody data-start="674" data-end="1226">
<tr data-start="674" data-end="720">
<td data-start="674" data-end="696" data-col-size="sm">
<blockquote><p>Lancer un conteneur</p></blockquote>
</td>
<td data-col-size="sm" data-start="696" data-end="720">
<blockquote><p><code data-start="698" data-end="718">docker run [image]</code></p></blockquote>
</td>
</tr>
<tr data-start="721" data-end="773">
<td data-start="721" data-end="746" data-col-size="sm">
<blockquote><p>Lancer en arrière-plan</p></blockquote>
</td>
<td data-start="746" data-end="773" data-col-size="sm">
<blockquote><p><code data-start="748" data-end="771">docker run -d [image]</code></p></blockquote>
</td>
</tr>
<tr data-start="774" data-end="820">
<td data-start="774" data-end="805" data-col-size="sm">
<blockquote><p>Lister les conteneurs actifs</p></blockquote>
</td>
<td data-col-size="sm" data-start="805" data-end="820">
<blockquote><p><code data-start="807" data-end="818">docker ps</code></p></blockquote>
</td>
</tr>
<tr data-start="821" data-end="868">
<td data-start="821" data-end="850" data-col-size="sm">
<blockquote><p>Lister tous les conteneurs</p></blockquote>
</td>
<td data-col-size="sm" data-start="850" data-end="868">
<blockquote><p><code data-start="852" data-end="866">docker ps -a</code></p></blockquote>
</td>
</tr>
<tr data-start="869" data-end="921">
<td data-start="869" data-end="892" data-col-size="sm">
<blockquote><p>Arrêter un conteneur</p></blockquote>
</td>
<td data-col-size="sm" data-start="892" data-end="921">
<blockquote><p><code data-start="894" data-end="919">docker stop [nom_ou_id]</code></p></blockquote>
</td>
</tr>
<tr data-start="922" data-end="974">
<td data-start="922" data-end="947" data-col-size="sm">
<blockquote><p>Supprimer un conteneur</p></blockquote>
</td>
<td data-col-size="sm" data-start="947" data-end="974">
<blockquote><p><code data-start="949" data-end="972">docker rm [nom_ou_id]</code></p></blockquote>
</td>
</tr>
<tr data-start="975" data-end="1014">
<td data-start="975" data-end="995" data-col-size="sm">
<blockquote><p>Lister les images</p></blockquote>
</td>
<td data-col-size="sm" data-start="995" data-end="1014">
<blockquote><p><code data-start="997" data-end="1012">docker images</code></p></blockquote>
</td>
</tr>
<tr data-start="1015" data-end="1061">
<td data-start="1015" data-end="1037" data-col-size="sm">
<blockquote><p>Supprimer une image</p></blockquote>
</td>
<td data-start="1037" data-end="1061" data-col-size="sm">
<blockquote><p><code data-start="1039" data-end="1059">docker rmi [image]</code></p></blockquote>
</td>
</tr>
<tr data-start="1062" data-end="1107">
<td data-start="1062" data-end="1078" data-col-size="sm">
<blockquote><p>Voir les logs</p></blockquote>
</td>
<td data-start="1078" data-end="1107" data-col-size="sm">
<blockquote><p><code data-start="1080" data-end="1105">docker logs [nom_ou_id]</code></p></blockquote>
</td>
</tr>
<tr data-start="1108" data-end="1182">
<td data-start="1108" data-end="1150" data-col-size="sm">
<blockquote><p>Exécuter une commande dans un conteneur</p></blockquote>
</td>
<td data-start="1150" data-end="1182" data-col-size="sm">
<blockquote><p><code data-start="1152" data-end="1180">docker exec -it [nom] bash</code></p></blockquote>
</td>
</tr>
<tr data-start="1183" data-end="1226">
<td data-start="1183" data-end="1204" data-col-size="sm">
<blockquote><p>Lister les volumes</p></blockquote>
</td>
<td data-col-size="sm" data-start="1204" data-end="1226">
<blockquote><p><code data-start="1206" data-end="1224">docker volume ls</code></p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="1228" data-end="1382">Prenons un exemple concret avec Nginx. La commande suivante lance un serveur web dans un conteneur et expose son port 80 interne sur le port 8080 du VPS :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="pointer-events-none absolute inset-x-4 top-12 bottom-4">
<div class="pointer-events-none sticky z-40 shrink-0 z-1!">
<div class="sticky bg-token-border-light">
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker run -d \
  --name mon-nginx \
  -p 8080:80 \
  nginx:latest</pre>
<p>Vérifiez qu’il fonctionne :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker ps</pre>
<p>Ouvrez ensuite votre navigateur à l’adresse :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">http://IP_VPS:8080</pre>
<p>Vous devriez voir la page par défaut de Nginx. Cela signifie que le conteneur tourne correctement et que le port est bien accessible depuis l’extérieur. Pour arrêter puis supprimer ce test :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker stop mon-nginx
docker rm mon-nginx</pre>
<p data-start="1842" data-end="2108">Cette première manipulation montre l’intérêt de Docker : aucun paquet Nginx n’a été installé directement sur Ubuntu, mais le service a tout de même fonctionné en quelques secondes. Chaque application peut ainsi rester isolée, facile à supprimer et simple à relancer.</p>
<p data-start="2110" data-end="2372">En production, ce type de test permet aussi de vérifier rapidement le pare-feu, les règles réseau du VPS et la publication des ports. Si la page n’apparaît pas, contrôlez d’abord le port exposé, l’adresse IP utilisée et les éventuelles restrictions côté serveur.</p>
<h2 data-section-id="d6of33" data-start="2487" data-end="2547">Docker Compose : déployer WordPress + MySQL</h2>
<p data-start="2549" data-end="2969">Les commandes <code data-start="2563" data-end="2575">docker run</code> sont utiles pour tester un service isolé, mais elles deviennent vite difficiles à maintenir dès qu’une application dépend de plusieurs conteneurs. WordPress, par exemple, a besoin d’un serveur web PHP, d’une base de données MySQL, de volumes persistants et d’un réseau interne. Docker Compose permet de décrire tout cela dans un seul fichier YAML, lisible, réutilisable et facile à versionner.</p>
<h3 data-start="2549" data-end="2969"><strong>Étape 1 — Créer le dossier du projet</strong></h3>
<p data-start="2971" data-end="3013">Créez d’abord un dossier dédié au projet :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">mkdir -p /opt/wordpress-docker
cd /opt/wordpress-docker</pre>
<h3><strong>Étape 2 — Créer le fichier compose.yaml</strong></h3>
<p>Créez ensuite le fichier de configuration :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">nano compose.yaml</pre>
<p>Ajoutez le contenu suivant :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">services:
  db:
    image: mysql:8.0
    container_name: wordpress_db
    restart: always
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: mot_de_passe_fort_ici
      MYSQL_ROOT_PASSWORD: mot_de_passe_root_fort_ici
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    restart: always
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: mot_de_passe_fort_ici
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:</pre>
<p data-start="3901" data-end="4343">Dans ce fichier, deux services sont déclarés. Le service <code data-start="3958" data-end="3962">db</code> utilise l’image MySQL 8.0 et initialise une base appelée <code data-start="4020" data-end="4031">wordpress</code> avec un utilisateur dédié. Le volume <code data-start="4069" data-end="4078">db_data</code> conserve les données de la base, même si le conteneur est recréé.</p>
<p data-start="3901" data-end="4343">Le service <code data-start="4156" data-end="4167">wordpress</code> utilise l’image officielle WordPress, se connecte à MySQL grâce au nom de service <code data-start="4250" data-end="4254">db</code>, expose le site sur le port 8080 du VPS et stocke ses fichiers dans le volume <code data-start="4333" data-end="4342">wp_data</code>.</p>
<h3 data-start="3901" data-end="4343"><strong>Étape 3 — Lancer le stack</strong></h3>
<p data-start="4345" data-end="4373">Lancez maintenant le stack :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose up -d</pre>
<p data-start="4409" data-end="4674">Au premier lancement, Docker télécharge les images nécessaires, crée automatiquement le réseau du projet, initialise les volumes et démarre les conteneurs. L’option <code data-start="4574" data-end="4578">-d</code> exécute les services en arrière-plan, ce qui vous permet de récupérer la main dans le terminal.</p>
<h3 data-start="4676" data-end="4708"><strong>Étape 4 — Vérifier que tout tourne</strong></h3>
<p data-start="4676" data-end="4708">Vérifiez l’état du déploiement :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose ps</pre>
<p>Les services <code data-start="4754" data-end="4758">db</code> et <code data-start="4762" data-end="4773">wordpress</code> doivent apparaître comme actifs. Si un service ne démarre pas, consultez les logs :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose logs wordpress
docker compose logs db</pre>
<p>Vous pouvez également suivre les logs en temps réel :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose logs -f</pre>
<h3><strong>Étape 5 — Tester dans le navigateur</strong></h3>
<p>Ouvrez ensuite votre navigateur à l’adresse suivante :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">http://IP_VPS:8080</pre>
<p data-start="5104" data-end="5269">L’assistant d’installation WordPress doit s’afficher. Vous pourrez alors choisir la langue, créer l’utilisateur administrateur et finaliser la configuration du site.</p>
<p data-start="5271" data-end="5315">Les commandes Compose les plus utiles sont :</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="5317" data-end="5725">
<thead data-start="5317" data-end="5338">
<tr data-start="5317" data-end="5338">
<th class="" data-start="5317" data-end="5326" data-col-size="sm">Action</th>
<th class="" data-start="5326" data-end="5338" data-col-size="sm">Commande</th>
</tr>
</thead>
<tbody data-start="5349" data-end="5725">
<tr data-start="5349" data-end="5395">
<td data-start="5349" data-end="5369" data-col-size="sm">
<blockquote><p>Démarrer le stack</p></blockquote>
</td>
<td data-start="5369" data-end="5395" data-col-size="sm">
<blockquote><p><code data-start="5371" data-end="5393">docker compose up -d</code></p></blockquote>
</td>
</tr>
<tr data-start="5396" data-end="5440">
<td data-start="5396" data-end="5415" data-col-size="sm">
<blockquote><p>Arrêter le stack</p></blockquote>
</td>
<td data-col-size="sm" data-start="5415" data-end="5440">
<blockquote><p><code data-start="5417" data-end="5438">docker compose down</code></p></blockquote>
</td>
</tr>
<tr data-start="5441" data-end="5485">
<td data-start="5441" data-end="5457" data-col-size="sm">
<blockquote><p>Voir les logs</p></blockquote>
</td>
<td data-start="5457" data-end="5485" data-col-size="sm">
<blockquote><p><code data-start="5459" data-end="5483">docker compose logs -f</code></p></blockquote>
</td>
</tr>
<tr data-start="5486" data-end="5548">
<td data-start="5486" data-end="5510" data-col-size="sm">
<blockquote><p>Redémarrer un service</p></blockquote>
</td>
<td data-col-size="sm" data-start="5510" data-end="5548">
<blockquote><p><code data-start="5512" data-end="5546">docker compose restart [service]</code></p></blockquote>
</td>
</tr>
<tr data-start="5549" data-end="5609">
<td data-start="5549" data-end="5584" data-col-size="sm">
<blockquote><p>Télécharger les nouvelles images</p></blockquote>
</td>
<td data-col-size="sm" data-start="5584" data-end="5609">
<blockquote><p><code data-start="5586" data-end="5607">docker compose pull</code></p></blockquote>
</td>
</tr>
<tr data-start="5610" data-end="5661">
<td data-start="5610" data-end="5635" data-col-size="sm">
<blockquote><p>Recréer les conteneurs</p></blockquote>
</td>
<td data-start="5635" data-end="5661" data-col-size="sm">
<blockquote><p><code data-start="5637" data-end="5659">docker compose up -d</code></p></blockquote>
</td>
</tr>
<tr data-start="5662" data-end="5725">
<td data-start="5662" data-end="5697" data-col-size="sm">
<blockquote><p>Arrêter et supprimer les volumes</p></blockquote>
</td>
<td data-col-size="sm" data-start="5697" data-end="5725">
<blockquote><p><code data-start="5699" data-end="5723">docker compose down -v</code></p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="5727" data-end="6035">Soyez prudent avec <code data-start="5746" data-end="5770">docker compose down -v</code> : cette commande supprime aussi les volumes du projet. Dans le cas de WordPress, cela peut effacer la base MySQL et les fichiers du site. Pour un environnement de production, conservez toujours les volumes et effectuez une sauvegarde avant toute opération risquée.</p>
<p data-start="6037" data-end="6345">Cet exemple illustre la force de <strong>Docker Compose</strong> : toute l’architecture applicative est décrite dans un fichier unique. Vous pouvez relire la configuration, la déplacer sur un autre VPS, la sauvegarder dans un dépôt privé ou l’adapter pour ajouter un cache Redis, un reverse proxy ou un service de sauvegarde.</p>
<p data-start="6347" data-end="6785">Dans un contexte réel, remplacez toujours les mots de passe d’exemple par des valeurs longues et uniques. Évitez aussi de publier ce fichier dans un dépôt public, car il contient des secrets. Une amélioration courante consiste à <strong>placer les mots de passe</strong> dans un fichier <code data-start="6617" data-end="6623">.env</code>, puis à les appeler dans le fichier Compose avec la syntaxe <code data-start="6684" data-end="6697">${VARIABLE}</code>. Cette méthode facilite la maintenance et limite les risques d’exposition accidentelle.</p>
<p data-start="6787" data-end="7203" data-is-last-node="" data-is-only-node="">Vous pouvez également adapter le port publié. Si le port 8080 est déjà utilisé par une autre application, choisissez par exemple <code data-start="6916" data-end="6925">8081:80</code>. Le premier nombre correspond au port du VPS, le second au port interne du conteneur. Dans la suite de l’article, le reverse proxy permettra de masquer ce port technique derrière un vrai nom de domaine HTTPS, plus propre pour les visiteurs et pour l’administration quotidienne.</p>
<h2 data-section-id="1bvrb9h" data-start="0" data-end="75">Sécuriser l’accès : reverse proxy avec Nginx Proxy Manager</h2>
<p data-start="77" data-end="471">Un service Docker exposé sur un port comme 8080 fonctionne pour les tests, mais ce n’est pas idéal en production. Un visiteur ne doit pas retenir une adresse du type <code data-start="243" data-end="263">http://IP_VPS:8080</code>. Il doit accéder à votre application depuis un vrai nom de domaine, avec HTTPS activé. C’est le rôle d’un reverse proxy : recevoir les requêtes sur les ports 80 et 443, puis les transmettre au bon conteneur.</p>
<p data-start="473" data-end="731">Nginx Proxy Manager simplifie fortement cette étape. Il fournit une interface web pour créer des hôtes proxy, associer des sous-domaines à vos applications Docker et générer des certificats Let’s Encrypt sans écrire manuellement toute la configuration Nginx.</p>
<p data-start="733" data-end="765">Créez d’abord un dossier dédié :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager</pre>
<p>Créez ensuite le fichier <code data-start="879" data-end="893">compose.yaml</code> :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">nano compose.yaml</pre>
<p>Ajoutez la configuration suivante :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">services:
  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginx_proxy_manager
    restart: always
    ports:
      - "80:80"
      - "81:81"
      - "443:443"
    volumes:
      - npm_data:/data
      - npm_letsencrypt:/etc/letsencrypt

volumes:
  npm_data:
  npm_letsencrypt:</pre>
<p>Lancez le service :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose up -d</pre>
<p>L’interface d’administration est ensuite disponible depuis :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">http://IP_VPS:81</pre>
<p data-start="1472" data-end="1653">Lors de la première connexion, changez immédiatement les identifiants par défaut. L’interface d’administration ne doit jamais rester protégée par un mot de passe connu publiquement.</p>
<p data-start="1655" data-end="1965">Pour publier votre WordPress, créez un nouvel hôte proxy dans Nginx Proxy Manager. Indiquez par exemple <code data-start="1759" data-end="1784">wordpress.mondomaine.fr</code> comme nom de domaine, puis redirigez vers l’adresse IP du VPS et le port 8080. Dans l’onglet SSL, demandez un certificat Let’s Encrypt, activez Force SSL et, si disponible, HTTP/2.</p>
<p data-start="1967" data-end="2159">Avant cette étape, le sous-domaine doit pointer vers l’adresse IP du VPS dans la zone DNS du nom de domaine. Sans enregistrement DNS correct, Let’s Encrypt ne pourra pas valider le certificat.</p>
<p data-start="2161" data-end="2401">En production, l’idéal est de ne laisser ouverts publiquement que les ports nécessaires : 80, 443 et éventuellement 22 pour SSH. Les ports applicatifs comme 8080 doivent servir uniquement d’intermédiaire technique derrière le reverse proxy.</p>
<p data-start="2519" data-end="2860">Cette organisation facilite aussi l’ajout de nouvelles applications. Pour chaque service, vous créez simplement un sous-domaine, un proxy host et un certificat. Vous évitez ainsi de multiplier les ports visibles, tout en gardant une administration claire et centralisée de vos déploiements Docker sur le VPS LWS au quotidien plus facilement.</p>
<h2 data-section-id="1p774ko" data-start="2862" data-end="2928">Exemples d’applications self-hostées avec Docker</h2>
<p data-start="2930" data-end="3240">Une fois Docker installé, votre <strong>VPS LWS</strong> peut héberger de nombreux services self-hosted. Le principe reste presque toujours identique : un dossier par application, un fichier <code data-start="3104" data-end="3118">compose.yaml</code>, des volumes persistants pour les données, puis un reverse proxy pour exposer le service avec un nom de domaine et HTTPS.</p>
<p data-start="3242" data-end="3294">Voici quelques applications populaires à envisager :</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="3296" data-end="3870">
<thead data-start="3296" data-end="3360">
<tr data-start="3296" data-end="3360">
<th class="" data-start="3296" data-end="3310" data-col-size="sm">Application</th>
<th class="" data-start="3310" data-end="3318" data-col-size="sm">Usage</th>
<th class="" data-start="3318" data-end="3333" data-col-size="sm">Image Docker</th>
<th class="" data-start="3333" data-end="3360" data-col-size="sm">RAM minimale indicative</th>
</tr>
</thead>
<tbody data-start="3379" data-end="3870">
<tr data-start="3379" data-end="3451">
<td data-start="3379" data-end="3391" data-col-size="sm">
<blockquote><p>WordPress</p></blockquote>
</td>
<td data-start="3391" data-end="3406" data-col-size="sm">
<blockquote><p>Site web CMS</p></blockquote>
</td>
<td data-start="3406" data-end="3441" data-col-size="sm">
<blockquote><p><code data-start="3408" data-end="3426">wordpress:latest</code> + <code data-start="3429" data-end="3440">mysql:8.0</code></p></blockquote>
</td>
<td data-col-size="sm" data-start="3441" data-end="3451">
<blockquote><p>512 Mo</p></blockquote>
</td>
</tr>
<tr data-start="3452" data-end="3509">
<td data-start="3452" data-end="3464" data-col-size="sm">
<blockquote><p>Nextcloud</p></blockquote>
</td>
<td data-start="3464" data-end="3478" data-col-size="sm">
<blockquote><p>Cloud privé</p></blockquote>
</td>
<td data-start="3478" data-end="3499" data-col-size="sm">
<blockquote><p><code data-start="3480" data-end="3498">nextcloud:latest</code></p></blockquote>
</td>
<td data-start="3499" data-end="3509" data-col-size="sm">
<blockquote><p>512 Mo</p></blockquote>
</td>
</tr>
<tr data-start="3510" data-end="3557">
<td data-start="3510" data-end="3516" data-col-size="sm">
<blockquote><p><a title="Installer n8n sur VPS : guide complet 2026" href="https://tutoriels.lws.fr/vps/installer-n8n-vps">n8n</a></p></blockquote>
</td>
<td data-start="3516" data-end="3533" data-col-size="sm">
<blockquote><p>Automatisation</p></blockquote>
</td>
<td data-col-size="sm" data-start="3533" data-end="3547">
<blockquote><p><code data-start="3535" data-end="3546">n8nio/n8n</code></p></blockquote>
</td>
<td data-col-size="sm" data-start="3547" data-end="3557">
<blockquote><p>256 Mo</p></blockquote>
</td>
</tr>
<tr data-start="3558" data-end="3620">
<td data-start="3558" data-end="3572" data-col-size="sm">
<blockquote><p>Uptime Kuma</p></blockquote>
</td>
<td data-start="3572" data-end="3585" data-col-size="sm">
<blockquote><p>Monitoring</p></blockquote>
</td>
<td data-start="3585" data-end="3610" data-col-size="sm">
<blockquote><p><code data-start="3587" data-end="3609">louislam/uptime-kuma</code></p></blockquote>
</td>
<td data-start="3610" data-end="3620" data-col-size="sm">
<blockquote><p>128 Mo</p></blockquote>
</td>
</tr>
<tr data-start="3621" data-end="3684">
<td data-start="3621" data-end="3635" data-col-size="sm">
<blockquote><p>Vaultwarden</p></blockquote>
</td>
<td data-start="3635" data-end="3651" data-col-size="sm">
<blockquote><p>Mots de passe</p></blockquote>
</td>
<td data-start="3651" data-end="3674" data-col-size="sm">
<blockquote><p><code data-start="3653" data-end="3673">vaultwarden/server</code></p></blockquote>
</td>
<td data-start="3674" data-end="3684" data-col-size="sm">
<blockquote><p>256 Mo</p></blockquote>
</td>
</tr>
<tr data-start="3685" data-end="3749">
<td data-start="3685" data-end="3693" data-col-size="sm">
<blockquote><p>Ghost</p></blockquote>
</td>
<td data-start="3693" data-end="3708" data-col-size="sm">
<blockquote><p>Blog moderne</p></blockquote>
</td>
<td data-start="3708" data-end="3739" data-col-size="sm">
<blockquote><p><code data-start="3710" data-end="3724">ghost:latest</code> + <code data-start="3727" data-end="3738">mysql:8.0</code></p></blockquote>
</td>
<td data-start="3739" data-end="3749" data-col-size="sm">
<blockquote><p>512 Mo</p></blockquote>
</td>
</tr>
<tr data-start="3750" data-end="3803">
<td data-start="3750" data-end="3758" data-col-size="sm">
<blockquote><p>Gitea</p></blockquote>
</td>
<td data-start="3758" data-end="3777" data-col-size="sm">
<blockquote><p>Git auto-hébergé</p></blockquote>
</td>
<td data-start="3777" data-end="3793" data-col-size="sm">
<blockquote><p><code data-start="3779" data-end="3792">gitea/gitea</code></p></blockquote>
</td>
<td data-start="3793" data-end="3803" data-col-size="sm">
<blockquote><p>256 Mo</p></blockquote>
</td>
</tr>
<tr data-start="3804" data-end="3870">
<td data-start="3804" data-end="3816" data-col-size="sm">
<blockquote><p>Portainer</p></blockquote>
</td>
<td data-start="3816" data-end="3833" data-col-size="sm">
<blockquote><p>Gestion Docker</p></blockquote>
</td>
<td data-start="3833" data-end="3860" data-col-size="sm">
<blockquote><p><code data-start="3835" data-end="3859">portainer/portainer-ce</code></p></blockquote>
</td>
<td data-col-size="sm" data-start="3860" data-end="3870">
<blockquote><p>128 Mo</p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="3872" data-end="4235">Ces valeurs de mémoire sont indicatives. Elles varient selon le trafic, les extensions installées, la taille des bases de données et le nombre d’utilisateurs connectés. Pour un petit service interne, un VPS modeste suffit souvent. Pour un site public, un cloud personnel ou plusieurs applications simultanées, prévoyez davantage de RAM, de CPU et d’espace disque.</p>
<p data-start="4237" data-end="4544">Docker est particulièrement intéressant pour le <strong>self-hosting</strong>, car il permet de remplacer plusieurs abonnements SaaS par des services hébergés sur votre propre serveur. Vous gardez la maîtrise des données, vous choisissez les versions installées et vous pouvez sauvegarder l’ensemble de votre infrastructure.</p>
<p data-start="4237" data-end="4544"><div class="alert_more_info"><p class="title">Plus d'informations</p><hr><p><b>Pour aller plus loin sur LWS :</b><span style="font-weight: 400;"> Plutôt que de gérer Docker manuellement, vous pouvez <a title="VPS Coolify : déployer ses applications facilement" href="https://tutoriels.lws.fr/vps/tutoriel-vps-coolify">déployer vos applications Docker avec une interface graphique via Coolify</a>. Il </span><span style="font-weight: 400;">propose une interface graphique qui gère Docker Compose automatiquement, détecte la stack de l&rsquo;application, gère le SSL, et permet le déploiement depuis GitHub en push-to-deploy.</span></p></div></p>
<p data-start="4843" data-end="5054" data-is-last-node="" data-is-only-node="">Dans tous les cas, commencez par une application simple, validez les sauvegardes, puis ajoutez progressivement de nouveaux services. Cette méthode limite les erreurs et rend l’administration du VPS plus lisible.</p>
<h2 data-section-id="9im1iu" data-start="0" data-end="51">Gérer et maintenir ses conteneurs</h2>
<p data-start="53" data-end="394">Un déploiement Docker ne s’arrête pas au lancement des conteneurs. Pour garder un VPS stable, il faut prévoir les mises à jour, les sauvegardes, la surveillance des ressources et le nettoyage régulier de l’espace disque. Cette maintenance évite les interruptions de service et limite les mauvaises surprises lors d’une évolution applicative.</p>
<h3 data-start="53" data-end="394"><b>Mettre à jour une application</b></h3>
<p data-start="396" data-end="497">Pour mettre à jour une application gérée avec Docker Compose, placez-vous dans le dossier du projet :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">cd /opt/wordpress-docker</pre>
<p>Téléchargez les nouvelles images disponibles :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose pull</pre>
<p>Recréez ensuite les conteneurs avec les images mises à jour :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose up -d</pre>
<p data-start="751" data-end="966">Cette commande conserve les volumes déclarés, ce qui permet de mettre à jour l’application sans supprimer les données persistantes. Après une mise à jour, vérifiez toujours les logs et le bon fonctionnement du site.</p>
<p data-start="968" data-end="1016">Pour nettoyer les anciennes images inutilisées :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker image prune -f</pre>
<h3><b>Sauvegarder les données (volumes)</b></h3>
<p>Les sauvegardes sont indispensables. Pour sauvegarder une base MySQL WordPress, vous pouvez utiliser :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker exec wordpress_db mysqldump -u wp_user -p wordpress &gt; backup_$(date +%Y%m%d).sql</pre>
<p>Pour sauvegarder un volume complet :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">mkdir -p /backup

docker run --rm \
  -v wordpress-docker_wp_data:/source \
  -v /backup:/dest \
  alpine tar czf /dest/wp_data_$(date +%Y%m%d).tar.gz /source</pre>
<p data-start="1504" data-end="1652">Ces commandes peuvent ensuite être automatisées avec cron et un script Bash, afin de produire des sauvegardes régulières sans intervention manuelle.</p>
<h3 data-start="1654" data-end="1720"><b>Monitoring des ressources</b></h3>
<p data-start="1654" data-end="1720">Surveillez également les ressources utilisées par vos conteneurs :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker stats</pre>
<p>Cette commande affiche la consommation CPU, mémoire, réseau et disque en temps réel. Pour obtenir plus d’informations sur un conteneur précis :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker inspect wordpress_app</pre>
<h3><b>Nettoyage de l&rsquo;espace disque</b></h3>
<p>Enfin, contrôlez l’espace utilisé par Docker :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker system df</pre>
<p>Et supprimez les ressources inutilisées avec prudence :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker system prune -f</pre>
<p data-start="2154" data-end="2277">Avant tout nettoyage important, assurez-vous que vos volumes utiles existent toujours et que vos sauvegardes sont récentes.</p>
<p data-start="2154" data-end="2277"><div class="alert_related_readings"><p class="title">Lectures associées</p><hr><p><a title="Script Bash Linux : guide complet avec exemples 2026" href="https://tutoriels.lws.fr/vps/initiation-au-script-bash-linux-avec-exemples"><span style="font-weight: 400;">Script Bash Linux : guide complet avec exemples 2026</span></a></p></div></p>
<h2 data-section-id="1028r3h" data-start="2279" data-end="2331">Vérification du bon fonctionnement</h2>
<p data-start="2333" data-end="2521">Après chaque installation, mise à jour ou redémarrage du VPS, prenez quelques minutes pour vérifier que vos conteneurs fonctionnent correctement. Commencez par lister les services actifs :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker ps</pre>
<p>Les conteneurs attendus doivent apparaître avec un état <code data-start="2614" data-end="2618">Up</code>. Si un service manque ou redémarre en boucle, consultez immédiatement les logs :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose logs [service]</pre>
<p data-start="2756" data-end="3110">Vérifiez ensuite l’accès applicatif depuis un navigateur. Pour WordPress, testez d’abord l’adresse directe, par exemple <code data-start="2876" data-end="2896">http://IP_VPS:8080</code>, puis le nom de domaine HTTPS si vous utilisez Nginx Proxy Manager. Une application peut être active côté Docker mais inaccessible à cause d’un port fermé, d’un DNS mal configuré ou d’un certificat SSL non généré.</p>
<p data-start="3112" data-end="3141">Contrôlez aussi les volumes :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker volume ls</pre>
<p data-start="3185" data-end="3295">Les volumes du projet doivent être présents, notamment ceux de la base de données et des fichiers applicatifs. Testez enfin la politique de redémarrage. Redémarrez le VPS, reconnectez-vous en SSH, puis relancez :</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback">
<div class="pointer-events-none absolute inset-x-4 top-12 bottom-4">
<div class="sticky bg-token-border-light">
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker ps</pre>
<p>Si <code data-start="3438" data-end="3455">restart: always</code> ou <code data-start="3459" data-end="3484">restart: unless-stopped</code> est configuré, les services doivent revenir automatiquement. Terminez par un contrôle de l’espace disque :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker system df</pre>
<h2 data-section-id="1nkix62" data-start="0" data-end="36">Erreurs fréquentes à éviter lors du déploiement des applications avec Docker</h2>
<p data-start="38" data-end="253">Même avec une installation correcte, certaines erreurs reviennent souvent lors des premiers déploiements Docker. La plupart se résolvent rapidement si vous commencez par lire les logs et vérifier les ports utilisés.</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="255" data-end="1457">
<thead data-start="255" data-end="295">
<tr data-start="255" data-end="295">
<th class="" data-start="255" data-end="264" data-col-size="sm">Erreur</th>
<th class="" data-start="264" data-end="281" data-col-size="md">Cause probable</th>
<th class="" data-start="281" data-end="295" data-col-size="md">Résolution</th>
</tr>
</thead>
<tbody data-start="310" data-end="1457">
<tr data-start="310" data-end="505">
<td data-start="310" data-end="340" data-col-size="sm">
<blockquote><p><code data-start="312" data-end="339">docker: command not found</code></p></blockquote>
</td>
<td data-col-size="md" data-start="340" data-end="408">
<blockquote><p>Docker n’est pas installé ou la session ne trouve pas la commande</p></blockquote>
</td>
<td data-col-size="md" data-start="408" data-end="505">
<blockquote><p>Relancer l’installation depuis le dépôt officiel Docker, puis ouvrir une nouvelle session SSH</p></blockquote>
</td>
</tr>
<tr data-start="506" data-end="669">
<td data-start="506" data-end="542" data-col-size="sm">
<blockquote><p><code data-start="508" data-end="541">docker compose: unknown command</code></p></blockquote>
</td>
<td data-col-size="md" data-start="542" data-end="583">
<blockquote><p>Le plugin Compose n’est pas disponible</p></blockquote>
</td>
<td data-col-size="md" data-start="583" data-end="669">
<blockquote><p>Installer le plugin Compose de Docker, puis vérifier avec <code data-start="643" data-end="667">docker compose version</code></p></blockquote>
</td>
</tr>
<tr data-start="670" data-end="849">
<td data-start="670" data-end="697" data-col-size="sm">
<blockquote><p><code data-start="672" data-end="696">address already in use</code></p></blockquote>
</td>
<td data-col-size="md" data-start="697" data-end="753">
<blockquote><p>Le port demandé est déjà utilisé par un autre service</p></blockquote>
</td>
<td data-col-size="md" data-start="753" data-end="849">
<blockquote><p>Identifier le service avec <code data-start="782" data-end="792">ss -tlnp</code>, puis changer le port ou arrêter le processus concerné</p></blockquote>
</td>
</tr>
<tr data-start="850" data-end="992">
<td data-start="850" data-end="872" data-col-size="sm">
<blockquote><p><code data-start="852" data-end="871">permission denied</code></p></blockquote>
</td>
<td data-col-size="md" data-start="872" data-end="919">
<blockquote><p>L’utilisateur n’a pas les droits nécessaires</p></blockquote>
</td>
<td data-col-size="md" data-start="919" data-end="992">
<blockquote><p>Utiliser un compte autorisé ou ajouter l’utilisateur au groupe Docker</p></blockquote>
</td>
</tr>
<tr data-start="993" data-end="1155">
<td data-start="993" data-end="1032" data-col-size="sm">
<blockquote><p>Données perdues après arrêt du stack</p></blockquote>
</td>
<td data-col-size="md" data-start="1032" data-end="1074">
<blockquote><p>Aucun volume persistant n’était déclaré</p></blockquote>
</td>
<td data-col-size="md" data-start="1074" data-end="1155">
<blockquote><p>Déclarer des volumes nommés pour les bases de données et fichiers applicatifs</p></blockquote>
</td>
</tr>
<tr data-start="1156" data-end="1343">
<td data-start="1156" data-end="1192" data-col-size="sm">
<blockquote><p>Conteneur qui redémarre en boucle</p></blockquote>
</td>
<td data-col-size="md" data-start="1192" data-end="1261">
<blockquote><p>Variable incorrecte, erreur applicative ou dépendance indisponible</p></blockquote>
</td>
<td data-col-size="md" data-start="1261" data-end="1343">
<blockquote><p>Lire <code data-start="1268" data-end="1299">docker compose logs [service]</code>, corriger la configuration, puis relancer</p></blockquote>
</td>
</tr>
<tr data-start="1344" data-end="1457">
<td data-start="1344" data-end="1373" data-col-size="sm">
<blockquote><p>Limite Docker Hub atteinte</p></blockquote>
</td>
<td data-col-size="md" data-start="1373" data-end="1421">
<blockquote><p>Trop de téléchargements sans authentification</p></blockquote>
</td>
<td data-col-size="md" data-start="1421" data-end="1457">
<blockquote><p>Se connecter avec <code data-start="1441" data-end="1455">docker login</code></p></blockquote>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="1459" data-end="1494">Pour diagnostiquer un port occupé :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">ss -tlnp</pre>
<p>Pour consulter les logs d’un service :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker compose logs wordpress</pre>
<p>Pour vérifier tous les conteneurs, y compris ceux arrêtés :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker ps -a</pre>
<p data-start="1724" data-end="1812">Dans la majorité des cas, le message d’erreur indique directement l’origine du problème.</p>
<h2 data-section-id="1840bxx" data-start="1814" data-end="1860">Bonnes pratiques de sécurité</h2>
<p data-section-id="1840bxx" data-start="1814" data-end="1860">Docker simplifie le déploiement, mais il ne sécurise pas automatiquement votre VPS. Un conteneur reste un processus exécuté sur le serveur. Une image vulnérable, un mot de passe exposé ou un port ouvert inutilement peuvent créer un risque réel.</p>
<p data-start="2108" data-end="2350">La première règle consiste à ne jamais exposer le daemon Docker sur Internet. Par défaut, Docker communique via un socket local. Conservez ce fonctionnement, sauf besoin avancé parfaitement maîtrisé. N’activez pas d’accès distant non protégé.</p>
<p data-start="2352" data-end="2557">La deuxième règle concerne les secrets. Évitez d’inscrire les mots de passe directement dans <code data-start="2445" data-end="2459">compose.yaml</code>, surtout si le fichier est sauvegardé dans Git. Utilisez plutôt un fichier <code data-start="2535" data-end="2541">.env</code> non versionné :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=mot_de_passe_fort_ici
MYSQL_ROOT_PASSWORD=mot_de_passe_root_fort_ici</pre>
<p>Puis appelez les variables dans Compose :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">environment:
  MYSQL_DATABASE: ${MYSQL_DATABASE}
  MYSQL_USER: ${MYSQL_USER}
  MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}</pre>
<p data-start="2938" data-end="2990">Ajoutez ensuite <code data-start="2954" data-end="2960">.env</code> à votre fichier <code data-start="2977" data-end="2989">.gitignore</code>.</p>
<p data-start="2992" data-end="3192">La troisième règle est de limiter les ressources. Un conteneur mal configuré peut consommer trop de mémoire ou de CPU et ralentir tout le VPS. Vous pouvez définir des limites adaptées à vos services :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">services:
  app:
    image: nginx:latest
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: "0.50"</pre>
<p>La quatrième règle est d’utiliser une politique de redémarrage :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">restart: unless-stopped</pre>
<p>ou :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">restart: always</pre>
<p data-start="3513" data-end="3593">Cela permet aux services de revenir automatiquement après un redémarrage du VPS.</p>
<p data-start="3595" data-end="3905">Maintenez aussi Docker, Ubuntu et vos images à jour. Avant une mise à jour importante, effectuez une sauvegarde et, si possible, un snapshot du VPS. Privilégiez les images officielles, les éditeurs vérifiés et les versions documentées. Évitez les images inconnues sans dépôt clair ni historique de maintenance.</p>
<p data-start="3907" data-end="4205">Enfin, réduisez l’exposition réseau. En production, seuls les ports nécessaires doivent être ouverts : généralement 22 pour SSH, 80 pour HTTP et 443 pour HTTPS. Les ports applicatifs internes doivent idéalement passer par le reverse proxy, plutôt que d’être accessibles directement depuis Internet.</p>
<p data-start="4207" data-end="4230"><div class="alert_tips"><p class="title">Trucs et astuces</p><hr><p>Pour héberger vos applications Docker en France, le <strong data-start="4284" data-end="4299">VPS KVM LWS</strong> offre une virtualisation KVM, Ubuntu préinstallé, un accès root complet, des sauvegardes automatiques et un support 7j/7. C’est une base adaptée pour déployer WordPress, n8n, Nextcloud, Uptime Kuma ou vos propres applications web conteneurisées.</p>
<p data-start="4207" data-end="4230"><a title="Commander mon VPS KVM LWS." href="https://www.lws.fr/vps-kvm.php" target="_blank" rel="noopener">Commander mon VPS KVM LWS.</a></p>
<p data-start="4207" data-end="4230"></p></div></p>
<h2 data-section-id="1hu38uh" data-start="0" data-end="28">Conclusion</h2>
<p data-start="30" data-end="323">Docker est une solution puissante pour déployer des applications sur un VPS LWS de manière propre, reproductible et évolutive. En isolant chaque service dans un conteneur, vous réduisez les conflits de dépendances, facilitez les mises à jour et gardez une organisation claire de votre serveur.<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Dans ce guide, vous avez installé <strong>Docker Engine sur Ubuntu</strong>, vérifié Docker Compose, lancé un premier conteneur Nginx, puis déployé un stack WordPress + MySQL avec volumes persistants. Vous avez aussi vu comment préparer une mise en production plus sérieuse avec Nginx Proxy Manager, surveiller les ressources, sauvegarder les données et éviter les erreurs fréquentes. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a5.png" alt="💥" class="wp-smiley" style="height: 1em; max-height: 1em;" />Docker ne remplace pas les bonnes pratiques d’administration : sécurité, sauvegardes, mises à jour et supervision restent indispensables.</p>
<p data-start="30" data-end="323"><div class="wish_hosting"><div class="flex_element text_part"><p class="wish_title">Besoin d’un serveur VPS KVM performant et flexible ?</p><p class="wish_comment">Découvrez nos offres VPS KVM haut de gamme : des ressources garanties et un contrôle total pour vos projets.
Profitez d’un hébergement 100 % SSD, d’un accès root complet, le tout dans un datacenter en France.
Démarrez dès maintenant à partir de 4,99 €/mois !</p><p class="wish_btn"><a class="btn btn_wish" title="Découvrez nos VPS KVM" href="https://www.lws.fr/vps-kvm.php?utm_source=tutoriels&amp;utm_medium=internal&amp;utm_campaign=article&amp;utm_content=kvm" target="_blank" rel="noopener">Je choisis mon VPS KVM</a></p></div><div class="flex_element img_part"><img decoding="async" src="https://tutoriels.lws.fr/wp-content/uploads/2022/06/lws_icone_vps.png" /></div></div></p>
<p data-start="30" data-end="323"><em>Mais sur un VPS KVM LWS, il offre une base solide pour héberger vos sites, outils internes, applications métiers et services self-hosted en 2026. Vous avez des questions, des ajouts ou des suggestions ? Ecrivez-nous dans la section Commentaires.</em></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://tutoriels.lws.fr/vps/docker-vps-lws-deployer-ses-applications/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">28863</post-id>	</item>
	</channel>
</rss>
