Author : Romain RICHER

Gérer les archives sous UNIX/LINUX : tar, gzip et compagnie

Sous Unix et Linux, archiver et compresser sont deux opérations distinctes, assurées par des outils différents. tar rassemble des fichiers en un seul, gzip réduit la taille d’un fichier. C’est leur combinaison qui produit les fameux .tar.gz, et c’est aussi la source de la plupart des confusions.

Ce guide sépare d’abord les deux notions, puis détaille la création et l’extraction d’archives, les formats de compression et leurs compromis, la consultation sans extraction, les exclusions, et les pièges qui font perdre du temps — chemins absolus, écrasement silencieux, archives corrompues. Tous les exemples sont réutilisables tels quels.

Archiver n’est pas compresser

La distinction est ancienne et reste structurante. tar signifie tape archive : il a été conçu pour écrire plusieurs fichiers à la suite sur une bande magnétique, en conservant leurs noms, leurs droits et leur arborescence. Il ne réduit rien ; une archive tar est même légèrement plus grosse que la somme de son contenu.

La compression est le travail d’un autre programme — gzip, bzip2, xz, zstd — qui prend un fichier et en produit une version plus petite. Historiquement, on enchaînait donc les deux :

tar -cf sauvegarde.tar dossier/
gzip sauvegarde.tar

Ce qui donnait sauvegarde.tar.gz. Les versions modernes de tar savent appeler le compresseur elles-mêmes, ce qui évite l’étape intermédiaire — mais la logique reste la même, et le nom du fichier le raconte encore.

Créer une archive

Les trois options à retenir se combinent presque toujours de la même façon :

  • -c : créer (create) ;
  • -f : suivi du nom du fichier d’archive ;
  • -v : afficher la liste des fichiers traités (verbose), facultatif mais rassurant.
tar -cvf archive.tar dossier/

Pour compresser au passage, ajoutez la lettre du format. -z pour gzip, -j pour bzip2, -J pour xz :

tar -czvf archive.tar.gz dossier/
tar -cjvf archive.tar.bz2 dossier/
tar -cJvf archive.tar.xz dossier/

Une habitude qui évite des surprises : nommez l’archive d’après ce qu’elle contient et la date du jour.

tar -czvf site-$(date +%Y%m%d).tar.gz /var/www/site/

Extraire une archive

L’option -x remplace -c. Le reste ne change pas :

tar -xzvf archive.tar.gz

Les versions récentes détectent seules le format de compression, ce qui rend -z et -j superflus à l’extraction. Un simple tar -xvf archive.tar.gz fonctionne donc dans la plupart des cas. Les garder ne coûte rien et reste compatible avec les systèmes anciens.

Par défaut, l’extraction se fait dans le répertoire courant. Pour choisir la destination, utilisez -C :

tar -xzvf archive.tar.gz -C /tmp/restauration/

Le dossier de destination doit exister au préalable : tar ne le crée pas.

Regarder sans extraire

C’est le réflexe à prendre avant toute extraction, et il évite l’essentiel des accidents. L’option -t liste le contenu sans rien écrire sur le disque :

tar -tzvf archive.tar.gz

Vous voyez alors si l’archive contient un dossier racine ou une série de fichiers en vrac — la différence entre une extraction propre et deux cents fichiers éparpillés dans votre répertoire courant.

Sur une archive volumineuse, combinez avec head pour ne voir que le début :

tar -tzf archive.tar.gz | head -20

Et pour retrouver un fichier précis dans une archive de plusieurs milliers d’entrées, passez par grep — la démarche est détaillée dans notre article sur la commande grep :

tar -tzf archive.tar.gz | grep config

Extraire un seul fichier

Inutile de tout décompresser pour récupérer un fichier de configuration. Indiquez son chemin exact, tel qu’il apparaît dans la liste :

tar -xzvf archive.tar.gz dossier/config/app.conf

Le chemin doit correspondre au caractère près à ce que montre -t. C’est la raison pour laquelle on liste avant d’extraire : un ./ en tête suffit à faire échouer la commande sans message explicite.

Exclure des fichiers

Une sauvegarde de site n’a aucune raison d’embarquer les caches, les journaux ou les dépendances réinstallables. L’option --exclude se répète autant de fois que nécessaire :

tar -czvf site.tar.gz /var/www/site/ \
  --exclude='*.log' \
  --exclude='cache/*' \
  --exclude='node_modules'

Un détail qui coûte du temps à qui l’ignore : --exclude doit être écrit avant le chemin source sur les versions anciennes de tar. Sur les versions récentes l’ordre est libre, mais placer les exclusions en premier reste l’habitude sûre.

Si la liste s’allonge, mettez-la dans un fichier :

tar -czvf site.tar.gz /var/www/site/ --exclude-from=exclusions.txt

Choisir son format de compression

Les quatre formats courants offrent des compromis différents entre taille obtenue et temps de calcul.

Format Option Compression Vitesse Usage typique
gzip -z correcte rapide le choix par défaut
bzip2 -j bonne lente archives peu relues
xz -J excellente très lente distribution de logiciels
zstd --zstd bonne très rapide sauvegardes fréquentes

En pratique, gzip reste le choix raisonnable pour un usage quotidien : il est présent partout, et son écart de taille avec xz ne justifie rarement le temps de calcul supplémentaire. Xz se justifie quand l’archive sera téléchargée des milliers de fois — chaque octet économisé l’est autant de fois.

Zstd mérite d’être connu : à taux de compression comparable à gzip, il est plusieurs fois plus rapide. Sur un serveur qui sauvegarde toutes les nuits, la différence se mesure en minutes.

Compresser un fichier seul

Hors archive, gzip s’emploie directement. Attention à un comportement qui surprend : il remplace le fichier d’origine.

gzip rapport.txt

Vous obtenez rapport.txt.gz, et rapport.txt a disparu. Pour conserver l’original, utilisez -k :

gzip -k rapport.txt

La décompression suit la même logique :

gunzip rapport.txt.gz
gzip -d rapport.txt.gz

Et pour lire un fichier compressé sans le décompresser — très utile sur des journaux archivés — les variantes en z font le travail :

zcat journal.log.gz
zless journal.log.gz
zgrep "erreur" journal.log.gz

Chemins absolus : le piège classique

Si vous créez une archive avec un chemin absolu, tar affiche un avertissement et retire le / initial :

tar -czvf site.tar.gz /var/www/site/
# tar: Suppression de « / » au début des noms des membres

Ce comportement est une protection délibérée. Sans lui, extraire l’archive écraserait /var/www/site/ sur la machine de destination, quel que soit le répertoire courant — avec les dégâts qu’on imagine si la destination n’était pas celle attendue.

La bonne pratique consiste donc à se placer dans le dossier parent et à archiver un chemin relatif :

cd /var/www
tar -czvf /tmp/site.tar.gz site/

L’archive contient alors site/…, et son extraction se fait là où on le décide.

Vérifier une archive

Une archive corrompue ne se signale qu’au moment de la restauration, c’est-à-dire au pire moment. Le test coûte quelques secondes :

gzip -t archive.tar.gz && echo "archive saine"
tar -tzf archive.tar.gz > /dev/null && echo "contenu lisible"

La première commande vérifie l’intégrité de la compression, la seconde que l’archive se parcourt entièrement. Les deux ensemble donnent une confiance raisonnable.

Sur une sauvegarde importante, une empreinte enregistrée à côté de l’archive permet de détecter une altération ultérieure :

sha256sum site.tar.gz > site.tar.gz.sha256
sha256sum -c site.tar.gz.sha256

Archiver vers une autre machine

tar peut écrire sur la sortie standard, ce qui permet d’envoyer une archive directement par SSH sans fichier intermédiaire. Le tiret remplace le nom de fichier :

tar -czf - /var/www/site/ | ssh utilisateur@serveur "cat > /sauvegardes/site.tar.gz"

La construction inverse restaure à distance :

ssh utilisateur@serveur "cat /sauvegardes/site.tar.gz" | tar -xzf - -C /var/www/

C’est commode quand le disque local n’a pas la place d’héberger l’archive. Pour les transferts réguliers, rsync est généralement plus adapté, et l’authentification par clé évite d’avoir à saisir un mot de passe : voyez notre article sur les clés SSH et le transfert de fichiers.

Et les fichiers .zip ?

Le format zip existe aussi sous Unix, et reste le plus sûr pour échanger avec des postes Windows. Il compresse chaque fichier séparément, ce qui le rend moins efficace qu’un .tar.gz sur de nombreux petits fichiers, mais permet d’en extraire un sans lire l’ensemble.

zip -r archive.zip dossier/
unzip archive.zip
unzip -l archive.zip
unzip archive.zip -d /tmp/destination/

Les commandes zip et unzip ne sont pas toujours installées par défaut sur les distributions minimales ; un which unzip le dira avant de chercher longtemps.

En résumé

  • archiver et compresser sont deux choses : tar rassemble, gzip réduit ;
  • créer avec -czvf, extraire avec -xzvf, lister avec -tzvf — et toujours lister avant d’extraire ;
  • extraire ailleurs avec -C, exclure avec --exclude, placé avant le chemin source par prudence ;
  • gzip pour l’usage courant, xz pour ce qui sera beaucoup téléchargé, zstd pour les sauvegardes fréquentes ;
  • gzip seul supprime l’original : -k pour le conserver ;
  • archiver depuis le dossier parent en chemin relatif, jamais en absolu ;
  • vérifier avec gzip -t avant d’avoir besoin de la restauration.

Ces commandes prennent tout leur sens combinées à d’autres : find pour sélectionner ce qu’on archive, cron pour l’automatiser, ssh pour l’envoyer ailleurs. C’est cette composition qui fait la force de la ligne de commande Unix.

Docker, c’est quoi ? Comprendre les conteneurs simplement

« Pourtant, ça marche sur ma machine ! » Cette phrase, tout développeur l’a prononcée un jour, dépité, en découvrant que son application refuse de fonctionner sur l’ordinateur d’un collègue ou sur le serveur de production. C’est précisément ce problème que Docker est venu résoudre. Devenu en quelques années un incontournable du développement moderne, Docker repose sur une idée simple mais puissante : le « conteneur ». Cet article vous explique ce qu’est Docker, le problème qu’il résout, et comment il fonctionne — sans jargon inutile.

Les informations reflètent la situation en 2026. Les concepts présentés (conteneur, image, Dockerfile) sont stables ; seules les versions et certains détails techniques évoluent.

Le problème que Docker résout

Un logiciel ne fonctionne jamais tout seul : il a besoin d’un environnement précis — une certaine version d’un langage, des bibliothèques, des outils système, des réglages de configuration. Or cet environnement diffère d’un ordinateur à l’autre. Résultat : une application qui tourne parfaitement sur le poste du développeur peut planter ailleurs, simplement parce qu’une version diffère ou qu’une bibliothèque manque. C’est le fameux « ça marche sur ma machine », source de frustrations sans fin.

Traditionnellement, il fallait réinstaller et reconfigurer manuellement tout cet environnement sur chaque machine cible, une opération fastidieuse et source d’erreurs. Docker propose une autre approche : empaqueter l’application avec tout son environnement dans une unité standardisée qui fonctionnera à l’identique partout.

L’analogie du conteneur maritime

Le nom « Docker » et son logo (une baleine portant des conteneurs) ne sont pas un hasard. L’idée s’inspire directement des conteneurs de transport maritime. Avant leur invention, charger un bateau était un casse-tête : chaque marchandise avait sa forme, sa taille, ses contraintes. Le conteneur standardisé a tout changé : peu importe ce qu’il y a à l’intérieur (des voitures, des fruits, des meubles), la boîte a toujours les mêmes dimensions et peut être manipulée par n’importe quel port, grue ou camion dans le monde.

Docker applique ce principe au logiciel. Un conteneur informatique emballe une application et tout ce dont elle a besoin dans une « boîte » standardisée. Peu importe ce qu’il y a dedans, cette boîte se manipule et s’exécute de la même façon partout : sur le portable du développeur, sur un serveur de test, ou en production dans le cloud. Fini les mauvaises surprises liées à l’environnement.

Qu’est-ce que Docker, concrètement ?

Docker est une plateforme de conteneurisation : un outil qui permet d’empaqueter un logiciel avec ses dépendances dans un conteneur, puis d’exécuter ce conteneur sur n’importe quelle machine équipée de Docker. L’application dispose, à l’intérieur du conteneur, de tout ce qu’il lui faut pour fonctionner — et elle s’exécute de manière isolée, sans interférer avec le reste du système ni avec les autres conteneurs.

Cette combinaison — empaquetage standardisé + isolation + portabilité — est ce qui a rendu Docker si populaire. On peut ainsi faire tourner plusieurs applications aux besoins différents sur un même serveur, chacune dans son conteneur, sans qu’elles se marchent sur les pieds.

Conteneur ou machine virtuelle ?

On compare souvent Docker aux machines virtuelles (VM), car les deux servent à isoler des environnements. Mais leur fonctionnement diffère profondément, et c’est un point clé pour comprendre l’intérêt de Docker.

Une machine virtuelle simule un ordinateur complet : elle embarque son propre système d’exploitation entier, par-dessus celui de la machine hôte. C’est puissant, mais lourd : chaque VM pèse plusieurs gigaoctets et met souvent plusieurs minutes à démarrer.

Un conteneur Docker, lui, ne réembarque pas tout un système d’exploitation : il partage le noyau de la machine hôte, et n’emporte que ce qui est propre à l’application. Résultat : il est bien plus léger (quelques mégaoctets à quelques centaines) et démarre en quelques secondes. Là où un serveur ne ferait tourner que quelques VM, il peut héberger des dizaines de conteneurs. Cette légèreté est la grande force de Docker. À noter en contrepartie : l’isolation d’un conteneur est un peu moins étanche que celle d’une VM, puisque le noyau est partagé — d’où l’importance des bonnes pratiques de sécurité.

Les concepts essentiels : image, conteneur, Dockerfile

Trois notions reviennent sans cesse quand on parle de Docker. Une bonne analogie est celle de la cuisine :

  • L’image est la recette : un modèle figé (en lecture seule) qui contient tout le nécessaire pour faire tourner l’application — le code, les bibliothèques, les dépendances. Une image est immuable : pour la modifier, on en construit une nouvelle version.
  • Le conteneur est le plat cuisiné à partir de la recette : une instance de l’image en cours d’exécution. À partir d’une même image, on peut lancer autant de conteneurs identiques qu’on veut. Le conteneur, lui, est éphémère : on le lance, l’arrête, le supprime facilement.
  • Le Dockerfile est la liste des instructions pour préparer la recette : un simple fichier texte qui décrit, étape par étape, comment construire l’image.

Un Dockerfile ressemble à ceci (exemple simple pour une application Python) :

FROM python:3.12-slim        # on part d'une image de base
WORKDIR /app                 # dossier de travail dans le conteneur
COPY . .                     # on copie les fichiers de l'application
RUN pip install flask        # on installe les dépendances
CMD ["python", "app.py"]     # commande lancée au démarrage

Chaque ligne ajoute une « couche » à l’image. À partir de ce fichier, Docker construit une image réutilisable, qui produira toujours le même environnement.

Où sont stockées les images ? Le registre

Les images Docker se partagent via des registres (registries). Le plus connu est Docker Hub, une bibliothèque publique où l’on trouve des milliers d’images officielles prêtes à l’emploi : un serveur web, une base de données, un langage de programmation… Plutôt que de tout construire soi-même, on part souvent d’une image existante qu’on personnalise. Les entreprises utilisent aussi des registres privés pour héberger leurs propres images de façon sécurisée.

Quelques commandes pour rendre concret

Sans entrer dans un tutoriel complet, voici les commandes emblématiques qui rythment l’usage quotidien de Docker :

docker build -t mon-app .    # construire une image à partir d'un Dockerfile
docker run -d mon-app        # lancer un conteneur à partir de l'image
docker ps                    # lister les conteneurs en cours d'exécution
docker images                # lister les images disponibles localement
docker stop mon-conteneur    # arrêter un conteneur
docker rm mon-conteneur      # supprimer un conteneur

On construit une image (build), on la lance (run), on surveille (ps), on arrête et on nettoie. Ce cycle simple suffit pour démarrer.

À quoi ça sert au quotidien ?

Docker s’est imposé dans de nombreux contextes :

  • Fiabiliser les environnements : garantir que l’application se comporte de façon identique du poste du développeur jusqu’à la production.
  • Les architectures « microservices » : découper une grosse application en petits services indépendants, chacun dans son conteneur.
  • L’intégration continue : dans les chaînes de tests et de déploiement automatisés, où l’on a besoin d’environnements reproductibles à la demande.
  • Tester rapidement un outil : lancer une base de données ou un logiciel en une commande, sans l’installer durablement sur sa machine.

Docker est aussi la porte d’entrée vers des technologies plus avancées d’« orchestration » (comme Kubernetes), qui gèrent des centaines de conteneurs répartis sur de nombreuses machines. Mais tout commence par la maîtrise du conteneur.

En résumé

  • Docker résout le problème du « ça marche sur ma machine » en empaquetant l’application avec son environnement.
  • Un conteneur est une boîte standardisée, légère et isolée, qui s’exécute à l’identique partout.
  • Contrairement à une machine virtuelle, un conteneur partage le noyau de l’hôte : il est bien plus léger et démarre en secondes.
  • Trois notions clés : l’image (la recette), le conteneur (le plat), le Dockerfile (les instructions).
  • Les images se partagent via des registres comme Docker Hub, et quelques commandes suffisent pour démarrer.

Docker a transformé la façon de construire et de déployer les logiciels, en apportant une portabilité et une fiabilité qui manquaient cruellement auparavant. Que vous soyez développeur débutant ou simplement curieux de comprendre un mot que vous entendez partout, retenez l’essentiel : Docker, c’est l’art de mettre une application dans une boîte standardisée qui fonctionne partout de la même façon. Un principe simple, aux conséquences considérables.

Les commandes Git essentielles : clone, commit, push, merge…

Une fois compris ce qu’est Git et le versionning, reste à le manier au quotidien. Bonne nouvelle : quelques commandes suffisent pour 90 % du travail courant. Ce guide passe en revue les commandes Git essentielles, dans l’ordre logique d’un projet — de sa création à la collaboration —, avec des exemples concrets.

Configurer Git (une seule fois)

Avant tout, on indique son identité, qui apparaîtra dans l’historique des modifications :

git config --global user.name "Votre Nom"
git config --global user.email "vous@exemple.com"

L’option --global applique ce réglage à tous vos projets. À faire une fois sur une nouvelle machine.

Démarrer un projet : init et clone

Deux façons de commencer. Soit on crée un dépôt dans un dossier existant :

git init

Soit on récupère un projet existant depuis un serveur distant (GitHub, GitLab…) :

git clone https://github.com/utilisateur/projet.git

git clone télécharge tout le projet et son historique complet, et configure automatiquement le lien vers le dépôt distant.

Le cycle de base : status, add, commit

C’est le cœur du travail quotidien, un cycle qu’on répète sans cesse. D’abord, voir où on en est :

git status

Cette commande affiche les fichiers modifiés, ajoutés ou supprimés. C’est le réflexe à avoir en permanence. Ensuite, on sélectionne les modifications à enregistrer avec git add :

git add fichier.txt      # un fichier précis
git add .                # tous les fichiers modifiés

Cette étape place les changements dans la « zone de préparation » (staging). Enfin, on enregistre ces changements dans l’historique avec un message descriptif :

git commit -m "Ajout de la page de contact"

Le message doit être clair et concis : il explique quoi et pourquoi. Un bon historique de commits est précieux pour comprendre l’évolution d’un projet.

Consulter l’historique : log et diff

Pour parcourir les commits passés :

git log            # historique complet
git log --oneline  # version condensée, un commit par ligne

Et pour voir précisément ce qui a changé dans les fichiers, avant de les valider :

git diff

git diff montre les différences ligne par ligne entre votre travail en cours et le dernier commit — indispensable pour relire ses modifications avant de les enregistrer.

Travailler avec un dépôt distant : push et pull

Ces deux commandes synchronisent votre travail avec le serveur (GitHub, GitLab…). Envoyer vos commits locaux vers le distant :

git push

Récupérer les modifications des autres depuis le distant :

git pull

Le réflexe collaboratif : faire un git pull avant de commencer à travailler (pour partir de la dernière version), et un git push après avoir validé ses commits (pour partager son travail).

Les branches : branch, checkout, merge

Les branches permettent de développer en parallèle sans toucher à la version principale. Créer une branche et s’y déplacer :

git branch ma-fonctionnalite     # créer la branche
git checkout ma-fonctionnalite   # s'y déplacer

Les versions récentes de Git proposent un raccourci qui fait les deux d’un coup :

git switch -c ma-fonctionnalite

Une fois le travail terminé sur la branche, on revient sur la principale et on fusionne :

git checkout main
git merge ma-fonctionnalite

Git réunit alors les modifications de la branche dans la principale. Si deux personnes ont modifié les mêmes lignes, Git signale un conflit à résoudre manuellement — un cas courant en équipe, qu’il ne faut pas craindre.

Corriger : annuler des modifications

Git offre plusieurs filets de sécurité. Annuler les modifications non encore validées d’un fichier (revenir au dernier commit) :

git checkout -- fichier.txt

Retirer un fichier de la zone de préparation (annuler un git add) :

git reset fichier.txt

Ces commandes sont à manier avec attention : elles peuvent supprimer du travail non enregistré. En cas de doute, un git status et un git diff préalables permettent de vérifier ce qu’on s’apprête à annuler.

Récapitulatif des commandes

Commande Rôle
git clone Récupérer un projet distant
git status Voir l’état des fichiers
git add Préparer des modifications
git commit Enregistrer un instantané
git push Envoyer vers le distant
git pull Récupérer depuis le distant
git branch Gérer les branches
git merge Fusionner une branche

En résumé

Le quotidien avec Git tient dans un cycle simple : git status pour voir, git add pour préparer, git commit pour enregistrer, puis git push et git pull pour se synchroniser avec l’équipe. Les branches (branch, checkout, merge) permettent de travailler en parallèle. Ces quelques commandes couvrent l’essentiel du travail ; les maîtriser, c’est gagner en autonomie sur tout projet de code. Pour comprendre les concepts derrière ces commandes, revenez à notre article Git et GitLab expliqués.

Versionning : Git et GitLab expliqués simplement

Dès qu’on travaille sur du code — seul ou en équipe — une question se pose vite : comment suivre les modifications, revenir en arrière en cas d’erreur, et travailler à plusieurs sans s’écraser mutuellement ? La réponse tient en un mot : le versionning (ou gestion de versions). Et l’outil qui domine le domaine s’appelle Git. Ce guide explique ce qu’est le versionning, comment Git fonctionne dans les grandes lignes, et ce que viennent faire GitLab et GitHub par-dessus.

Qu’est-ce que le versionning ?

Le versionning consiste à enregistrer l’historique des modifications d’un ensemble de fichiers au fil du temps. Chaque fois qu’on sauvegarde une étape, on crée une « version » à laquelle on pourra toujours revenir. Concrètement, cela apporte trois choses essentielles :

  • Un historique complet : qui a changé quoi, quand, et pourquoi.
  • La possibilité de revenir en arrière : annuler une modification qui a cassé quelque chose, retrouver une version qui fonctionnait.
  • Le travail collaboratif : plusieurs personnes modifient les mêmes fichiers, et l’outil fusionne les changements intelligemment.

Sans versionning, on se retrouve vite avec des fichiers nommés projet_final.zip, projet_final_v2.zip, projet_vraiment_final.zip — une méthode fragile et ingérable à plusieurs. Git résout exactement ce problème.

Git, un système distribué

Créé en 2005 par Linus Torvalds (le créateur de Linux), Git est aujourd’hui le standard du versionning. Sa particularité est d’être distribué : chaque développeur possède sur sa machine une copie complète du projet et de tout son historique, pas seulement la dernière version.

Cela a des conséquences pratiques majeures : on peut travailler hors ligne, consulter tout l’historique sans connexion, et le projet n’est pas perdu si un serveur central tombe (chaque copie est une sauvegarde complète). C’est ce qui distingue Git des anciens systèmes centralisés comme SVN.

Les notions clés de Git

Quelques concepts reviennent sans cesse. En comprendre le principe suffit pour saisir la logique de Git :

Notion Rôle
Dépôt (repository) Le projet versionné, avec tout son historique
Commit Un « instantané » enregistré : une version datée et commentée
Branche (branch) Une ligne de travail parallèle, pour développer sans toucher au reste
Fusion (merge) Réunir le travail d’une branche dans une autre
Dépôt distant (remote) Une copie partagée du projet, hébergée sur un serveur

Le commit est le cœur du système : à chaque étape importante, on « fige » l’état du projet avec un message décrivant le changement. L’ensemble des commits forme l’historique, qu’on peut parcourir, comparer ou restaurer.

Les branches : travailler en parallèle

La force de Git tient beaucoup à ses branches. Une branche permet de développer une nouvelle fonctionnalité (ou corriger un bug) à l’écart de la version principale, sans risquer de la casser. Une fois le travail terminé et testé, on fusionne la branche dans la principale.

Ce mécanisme rend le travail à plusieurs fluide : chacun développe sur sa branche, et les contributions sont réunies proprement. C’est aussi ce qui permet de mener plusieurs chantiers en parallèle sur un même projet.

Git, GitHub, GitLab : quelle différence ?

C’est la confusion la plus fréquente. Distinguons clairement :

  • Git est le logiciel de versionning, qui tourne sur votre machine. Il fonctionne parfaitement tout seul, en local.
  • GitHub et GitLab sont des plateformes en ligne qui hébergent des dépôts Git et ajoutent des services autour : interface web, gestion des droits, suivi des tâches, revue de code, automatisation…

Autrement dit, Git est le moteur ; GitHub et GitLab sont des services bâtis dessus. On peut utiliser Git sans eux, mais ils facilitent grandement le travail d’équipe et le partage. GitHub est le plus connu (surtout pour l’open source) ; GitLab se distingue par ses fonctionnalités d’intégration continue et la possibilité de l’héberger soi-même — un atout en entreprise.

À quoi servent ces plateformes ?

Au-delà de l’hébergement, GitLab et GitHub apportent des outils devenus essentiels :

  • La revue de code (merge/pull requests) : proposer des changements, les faire relire et commenter avant de les intégrer.
  • Le suivi des tâches et bugs (issues).
  • L’intégration continue (CI/CD) : lancer automatiquement des tests et des déploiements à chaque modification.

Ces fonctions transforment un simple outil de versionning en véritable plateforme de collaboration autour du code.

En résumé

Le versionning enregistre l’historique d’un projet et permet de revenir en arrière et de travailler à plusieurs sans conflit. Git en est l’outil de référence : distribué (chacun a une copie complète), organisé autour des commits et des branches. GitHub et GitLab sont des plateformes qui hébergent des dépôts Git et ajoutent revue de code, suivi des tâches et automatisation. Comprendre cette architecture est la première étape ; la suivante est de manier les commandes Git au quotidien, que nous détaillerons dans un article dédié. Nous consacrerons un article dédié aux commandes Git essentielles (clone, commit, push, branch, merge…) pour passer à la pratique.

Sauver un processus lancé au premier plan avant une coupure

Vous avez lancé une compilation, un import ou une installation qui va durer deux heures. Vous l’avez lancée au premier plan, sans y penser. Et vous réalisez que si votre connexion tombe — ou simplement si vous fermez le terminal — tout s’arrête en plein milieu.

La bonne nouvelle, c’est que la situation se rattrape sans interrompre le traitement. Trois touches et deux commandes suffisent. Encore faut-il savoir dans quelle fenêtre les taper, et comment vérifier ensuite que le sauvetage a réussi.

Pourquoi la déconnexion tue le processus

Quand la connexion SSH se rompt, le démon sshd ferme le pseudo-terminal associé — pts/2, par exemple. Le shell rattaché à ce terminal reçoit alors le signal SIGHUP, abréviation de hang up, hérité de l’époque où l’on raccrochait un modem.

Ce shell ne meurt pas seul : il propage le signal à tous ses jobs. Toute l’arborescence descend avec lui, y compris le processus qui compilait depuis une heure et demie.

C’est pour cela qu’un traitement long ne doit jamais rester attaché à une session interactive. Et c’est aussi pour cela que la parade consiste à couper ce lien de parenté, sans toucher au processus lui-même.

Savoir si un processus est au premier plan

C’est le point que la plupart des documentations passent sous silence, et c’est pourtant le seul diagnostic fiable. Il tient dans un caractère.

ps -fu monuser

Regardez la colonne STAT. Un processus du groupe de premier plan porte un + à la fin de son état :

STAT Signification
S+ en attente, au premier plan — vulnérable au SIGHUP
S en attente, en arrière-plan — détaché du terminal
R+ en cours d’exécution, au premier plan
R en cours d’exécution, en arrière-plan
T arrêté — suspendu, ne progresse plus
D en attente d’entrée-sortie, non interruptible

Le + est donc votre voyant d’alerte. Tant qu’il est là, la déconnexion emporte le processus ; une fois disparu, le traitement survit.

L’arborescence rend la lecture plus simple encore :

ps -fu monuser --forest

Vous voyez alors la chaîne complète — le shell, le script qu’il a lancé, les sous-shells, et le binaire qui travaille réellement. Si le shell parent porte le +, tous ses descendants aussi.

Le sauvetage en trois gestes

Une contrainte d’abord : il faut agir dans la fenêtre où tourne le job. Depuis un autre terminal, vous ne pouvez pas intervenir sur les jobs d’un shell qui n’est pas le vôtre — la table des jobs appartient à chaque shell.

Si vous avez ouvert une seconde session pour surveiller, revenez dans la première.

Ctrl+Z        # suspend le job sans le tuer
bg            # le relance immédiatement en arrière-plan
disown        # le retire de la table des jobs du shell
jobs          # ne doit plus rien afficher

Ctrl+Z envoie un SIGTSTP : le processus est mis en pause, pas interrompu. Son état passe à T.

bg envoie un SIGCONT et le reprend, cette fois en arrière-plan. La pause n’aura duré que le temps de taper la commande.

disown est l’étape décisive : elle retire le job de la table du shell. Celui-ci ne lui enverra donc plus de SIGHUP à sa mort.

Enchaînez les trois sans traîner, pour que la suspension reste de l’ordre de quelques secondes. Sur une compilation, cette pause est sans conséquence : rien n’est perdu, le travail reprend exactement là où il s’était arrêté.

Vérifier que le sauvetage a fonctionné

Deux contrôles, et ils ne disent pas la même chose.

ps -fu monuser --forest | grep -E "mon_script|mon_binaire"

Le + doit avoir disparu des processus du job. Vous verrez S là où il y avait S+. En revanche, le shell de la fenêtre, lui, reste en S+ : c’est normal, c’est lui qui est désormais au premier plan.

Aucun processus ne doit être en état T. Un T résiduel signifie que le bg n’a pas pris, et que le traitement est suspendu — il ne progresse plus, ce qui est pire que le problème initial.

Le second contrôle est le seul qui prouve vraiment quelque chose : regardez le journal applicatif.

tail -5 /chemin/vers/le/journal.log
sleep 60
tail -5 /chemin/vers/le/journal.log

Si le compteur a avancé entre les deux, le traitement tourne. C’est la seule certitude ; l’état dans ps ne dit pas qu’il progresse, seulement qu’il n’est pas bloqué.

Après reconnexion, les processus seront toujours là, mais leur parent sera devenu le PID 1 — le shell d’origine ayant disparu. La colonne TTY affichera souvent encore l’ancien terminal, ou un point d’interrogation. Les deux sont normaux.

Deux limites que disown ne lève pas

disown protège du SIGHUP. Il ne détache pas le processus du terminal, et cela a deux conséquences.

Les écritures vers le terminal échouent. Une fois la fenêtre fermée, tout ce que le processus écrit directement sur sa sortie standard ou d’erreur produit une erreur d’entrée-sortie. En pratique, ce n’est pas gênant : un tee continue d’écrire dans ses fichiers, et les journaux restent complets. Le risque n’existe que pour un script qui testerait le code retour d’un affichage — cas rare, mais il existe.

Toute saisie interactive bloque le traitement. Si le script demande une confirmation ou un mot de passe en cours de route, il tentera de lire le terminal depuis l’arrière-plan et recevra un SIGTTIN. Il passera alors en état T, et attendra indéfiniment.

ps -o pid,stat,cmd -p 12345

C’est le contrôle à faire si le journal cesse d’avancer. Avant de détacher un traitement, demandez-vous donc s’il peut réclamer quoi que ce soit à mi-parcours.

Les autres sessions de la fenêtre

Un détail qu’on oublie : le SIGHUP frappe toutes les sessions ouvertes, pas seulement celle qui vous inquiète.

Une session sqlplus, psql ou mysql restée ouverte dans un autre onglet sera tuée elle aussi. Si une transaction y est en cours, elle sera annulée — ou pire, laissera des verrous le temps que le serveur détecte la rupture.

Avant de vous déconnecter, validez ou quittez proprement ce qui traîne.

Bien lancer, la prochaine fois

Le sauvetage est une rustine. Trois méthodes évitent d’en arriver là, par ordre croissant de confort.

nohup et l’esperluette — le minimum vital :

nohup ./traitement-long.sh > /chemin/sortie.log 2>&1 &

Le processus ignore le SIGHUP et toutes ses sorties partent dans un fichier. Notez la redirection des deux flux : sans 2>&1, les erreurs se perdraient.

setsid va plus loin en créant une nouvelle session, détachée du terminal dès le départ :

setsid ./traitement-long.sh > /chemin/sortie.log 2>&1 < /dev/null &

La redirection de l’entrée depuis /dev/null évite le blocage en cas de lecture inattendue.

tmux ou screen — la bonne méthode pour tout traitement long administré à distance :

tmux new -s installation
# lancez votre traitement normalement
# Ctrl+B puis D pour vous détacher
tmux attach -t installation   # pour revenir, depuis n'importe où

La différence est de nature : avec nohup, vous perdez la main sur le processus et ne pouvez plus que lire ses journaux. Avec tmux, vous retrouvez la session exactement telle que vous l’avez laissée, affichage compris, et vous pouvez interagir de nouveau.

Sur une opération de plusieurs heures menée depuis un poste distant, c’est la différence entre une coupure sans conséquence et une matinée perdue.

Et si le processus est déjà orphelin ?

Dernier cas : la connexion est tombée avant que vous n’ayez pu faire quoi que ce soit, mais le processus a survécu — parce qu’il avait été lancé avec nohup, ou parce que le shell n’a pas propagé le signal.

Vous ne pouvez plus l’attacher à votre nouvelle session avec les outils standards. L’utilitaire reptyr, s’il est installé, sait le faire :

reptyr 12345

Il est rarement présent sur un serveur de production, et son usage suppose des droits suffisants. Sans lui, il ne reste qu’à suivre les journaux — ce qui suffit dans la plupart des cas.

En résumé

  • la déconnexion envoie un SIGHUP au shell, qui le propage à toute son arborescence ;
  • le + dans la colonne STAT signale un processus au premier plan, donc vulnérable ;
  • le sauvetage tient en trois gestes : Ctrl+Z, bg, disown ;
  • il doit se faire depuis la fenêtre où tourne le job, la table des jobs étant propre à chaque shell ;
  • la suspension de Ctrl+Z est sans danger : le travail reprend là où il s’était arrêté ;
  • vérifiez que le + a disparu, qu’aucun processus n’est en T, et surtout que le journal avance ;
  • disown ne protège pas d’une saisie interactive en cours de route, qui bloquerait le traitement ;
  • pensez aux autres sessions de la fenêtre : une transaction ouverte sera annulée ;
  • la prochaine fois : nohup au minimum, tmux de préférence.

Un réflexe à prendre avant toute opération longue : se demander, dix secondes avant de valider, ce qui se passera si la connexion tombe. La réponse décide du mode de lancement, et elle coûte bien moins cher que le sauvetage.

Comment fonctionne le Wi-Fi ? Ondes radio, fréquences et sécurité expliquées

On l’utilise tous les jours sans y penser : le Wi-Fi nous connecte à internet sans le moindre câble. Mais comment des données — une page web, une vidéo, un message — voyagent-elles « dans l’air » entre votre box et votre téléphone ? Derrière cette magie apparente se cachent des ondes radio et quelques principes assez simples. Ce guide explique le fonctionnement du Wi-Fi, sans jargon inutile.

Le Wi-Fi, ce sont des ondes radio

Le principe fondamental : le Wi-Fi transmet les données par ondes radio, exactement comme la radio FM ou un téléphone portable, mais sur des fréquences différentes. Votre box (le « point d’accès ») et vos appareils contiennent chacun un petit émetteur-récepteur radio. Pour envoyer une donnée, l’appareil la convertit en un signal radio ; à l’autre bout, le récepteur reconvertit ce signal en donnée. C’est une conversation permanente, dans les deux sens, à la vitesse de la lumière.

Le mot « Wi-Fi » lui-même ne veut rien dire de technique : c’est une marque commerciale. Le vrai nom de la technologie est la norme IEEE 802.11, déclinée en versions successives (802.11n, 802.11ac, 802.11ax…) de plus en plus rapides.

Les fréquences : 2,4 GHz et 5 GHz

Le Wi-Fi utilise principalement deux bandes de fréquences, et comprendre leur différence explique beaucoup de choses au quotidien :

Bande Portée Débit Encombrement
2,4 GHz Grande (traverse mieux les murs) Plus lent Encombrée (partagée avec micro-ondes, Bluetooth…)
5 GHz Plus courte Plus rapide Moins encombrée

C’est un compromis physique : les basses fréquences (2,4 GHz) portent plus loin et traversent mieux les obstacles, mais transportent moins de données. Les hautes fréquences (5 GHz) sont plus rapides mais s’atténuent vite. D’où le conseil courant : la 5 GHz pour un appareil proche de la box, la 2,4 GHz pour un appareil éloigné ou derrière plusieurs murs. Les box récentes gèrent les deux et basculent automatiquement.

Les canaux : éviter les embouteillages

Chaque bande est découpée en canaux, comme des voies sur une autoroute. Si votre box et celle du voisin utilisent le même canal, leurs signaux se gênent — d’où des ralentissements. C’est particulièrement vrai en 2,4 GHz, qui compte peu de canaux réellement distincts. Les box modernes choisissent automatiquement le canal le moins encombré, mais en cas de lenteur dans un immeuble dense, changer manuellement de canal peut aider.

Du signal à la page web

Comment une donnée voyage-t-elle concrètement ? En simplifiant le trajet :

  • Votre box est reliée à internet par un câble (fibre, ADSL…) venant de votre fournisseur d’accès.
  • La box diffuse un réseau Wi-Fi : elle émet un signal radio portant un nom (le SSID, celui que vous voyez dans la liste des réseaux).
  • Votre appareil s’y connecte après authentification (le mot de passe), et une conversation radio s’établit.
  • Quand vous ouvrez une page, votre appareil envoie la demande par radio à la box, qui la transmet par câble à internet, reçoit la réponse, et vous la renvoie par radio.

Le Wi-Fi n’est donc que le dernier maillon sans fil entre vos appareils et la box : au-delà, internet circule par câbles.


Le trajet des données : de l’appareil à internet via la box Wi-Fi
L’appareil communique avec la box par ondes radio Wi-Fi, et la box est reliée à internet par un câble.


Appareil
ordi, téléphone

Box (point d’accès)
émetteur Wi-Fi

Internet
fournisseur d’accès Wi-Fi (ondes radio)
câble (fibre, ADSL)
Le Wi-Fi relie l’appareil à la box par ondes radio ; la box relie à internet par câble.

La sécurité : pourquoi le mot de passe compte

Puisque le signal se propage dans l’air, n’importe qui à portée pourrait théoriquement l’intercepter. C’est pourquoi le Wi-Fi chiffre les données échangées. Le standard actuel est WPA3 (ou WPA2, encore très répandu) : sans le mot de passe, le signal capté est illisible. C’est aussi pourquoi il faut éviter les vieux protocoles comme WEP, dépassés et facilement cassés, et se méfier des réseaux Wi-Fi publics non protégés.

Améliorer sa couverture

La portée du Wi-Fi dépend de la distance et des obstacles (murs épais, métal, miroirs). Pour une grande surface, plusieurs solutions existent : un répéteur qui capte et réémet le signal, ou un système mesh (plusieurs bornes qui forment un réseau unique et homogène). Bien placer sa box — en hauteur, dégagée, centrale — améliore déjà nettement les choses.

En résumé

Le Wi-Fi transmet les données par ondes radio entre vos appareils et votre box, sur deux bandes de fréquences (2,4 GHz pour la portée, 5 GHz pour la vitesse), découpées en canaux pour limiter les interférences. La box fait le pont entre ce réseau sans fil et internet, qui lui circule par câble ; et le chiffrement (WPA2/WPA3) protège vos échanges. Comprendre ces principes aide à mieux placer sa box, choisir la bonne bande, et diagnostiquer les soucis. À ce sujet, voyez notre guide pour résoudre les problèmes de connexion internet et Wi-Fi.

Intégrer une IA dans son site web : technique, coûts et quotas

Ajouter une IA à un site web tient en quelques dizaines de lignes de code. Ce qui prend du temps, c’est tout le reste : empêcher que votre clé d’accès se retrouve dans le navigateur d’un visiteur, comprendre ce que vous allez réellement payer, et éviter qu’un robot ne vous facture cinq cents euros en une nuit.

Cet article couvre la mise en œuvre technique, le calcul du coût réel avec les tarifs de septembre 2026, les quotas des différents fournisseurs et les pièges qui font exploser une facture.

Les tarifs cités ont été relevés le 28 septembre 2026. Ils changent souvent : OpenAI a baissé les siens fin juillet, Anthropic a sorti un nouveau modèle moins cher le 22 septembre. Vérifiez-les sur les pages officielles avant de bâtir un budget.

Trois façons d’intégrer, une seule à retenir

Techniquement, trois architectures sont possibles. Une seule est défendable.

L’appel depuis le navigateur. Votre JavaScript contacte directement l’API du fournisseur. C’est le plus simple à écrire, et c’est une faute grave : votre clé est alors visible par n’importe qui ouvrant les outils de développement. Quelqu’un la récupère, l’utilise pour ses propres besoins, et vous payez. Des robots parcourent le web à la recherche de ces clés.

L’appel depuis votre serveur. Le navigateur interroge votre site, votre site interroge l’IA, la réponse redescend. La clé ne quitte jamais le serveur. C’est l’architecture normale, et celle que couvre le reste de cet article.

L’agent autonome. L’IA appelle elle-même des fonctions que vous exposez — consulter une base, envoyer un courriel. Puissant, nettement plus complexe, et à réserver à un second temps.

La règle tient en une phrase : votre clé d’API ne doit jamais atteindre le navigateur. Ni dans le JavaScript, ni dans le HTML, ni dans une variable de configuration côté client.

Ce que vous achetez réellement : des tokens

Les fournisseurs facturent au token, pas à la requête ni au caractère.

Un token représente environ trois quarts d’un mot en anglais, un peu moins en français — comptez plutôt deux tokens pour trois mots. Un article de mille mots pèse donc environ 1 400 tokens.

Deux compteurs distincts, et c’est là que les budgets dérapent :

  • les tokens d’entrée, tout ce que vous envoyez — instruction système, historique de conversation, documents joints, question de l’utilisateur ;
  • les tokens de sortie, ce que le modèle répond.

La sortie coûte environ cinq fois l’entrée chez tous les fournisseurs. Mais c’est presque toujours l’entrée qui domine la facture, parce qu’on renvoie à chaque requête un contexte qui grossit : l’instruction système, les documents de référence, et tout l’historique de la conversation.

Un agent conversationnel au dixième échange renvoie les neuf précédents. Le coût d’une conversation croît donc de façon quadratique, pas linéaire.

Les tarifs en septembre 2026

Prix en dollars par million de tokens, entrée et sortie.

Fournisseur Modèle Entrée Sortie
Mistral Ministral 3 3B 0,10 $ 0,10 $
Small 4 0,15 $ 0,60 $
Large 3 0,50 $ 1,50 $
OpenAI GPT-5.6 Luna 0,20 $ 1,20 $
GPT-5.6 Terra 2,00 $ 12,00 $
GPT-5.6 Sol 4,00 $ 20,00 $
Anthropic Claude Haiku 4.5 1,00 $ 5,00 $
Claude Sonnet 5 2,00 $ 10,00 $
Claude Opus 5.5 4,00 $ 20,00 $

Trois observations sur ce tableau.

L’écart entre le moins cher et le plus cher va de un à quarante en entrée. Le choix du modèle est de loin le premier levier sur votre facture — bien avant toute optimisation de code.

Mistral est sensiblement moins cher, et héberge en Europe, ce qui simplifie la conformité au RGPD. Ses modèles légers conviennent parfaitement à de la classification, de l’extraction ou de la reformulation.

Ces prix bougent vite. Le tarif de GPT-5.6 Sol est promotionnel et annoncé jusqu’à fin novembre. Anthropic a sorti Opus 5.5 le 22 septembre, 20 % moins cher que le modèle qu’il remplace. Ne construisez pas un budget sur un chiffre mémorisé.

Calculer ce que ça va vous coûter

Prenons un cas concret : une aide à la rédaction sur un site, 500 utilisations par mois. Chaque appel envoie 1 500 tokens — instruction, contexte, demande — et produit 400 tokens.

Modèle Entrée (750 k) Sortie (200 k) Total mensuel
Mistral Small 4 0,11 $ 0,12 $ 0,23 $
GPT-5.6 Luna 0,15 $ 0,24 $ 0,39 $
Claude Haiku 4.5 0,75 $ 1,00 $ 1,75 $
Claude Sonnet 5 1,50 $ 2,00 $ 3,50 $
Claude Opus 5.5 3,00 $ 4,00 $ 7,00 $

À cette échelle, tous les modèles sont abordables et le choix se fait sur la qualité, pas sur le prix. Multipliez le trafic par cent et l’arbitrage s’inverse : 700 dollars mensuels contre 23.

La méthode est toujours la même. Comptez les tokens d’un appel type, multipliez par le volume attendu, et faites le calcul pour deux ou trois modèles. Les fournisseurs proposent tous un compteur de tokens ; à défaut, divisez le nombre de caractères par trois pour une estimation française acceptable.

Quatre leviers pour diviser la facture

Le cache d’invite. Si vos appels partagent un préfixe constant — instruction système, documentation, catalogue — les fournisseurs facturent sa relecture à 10 % du prix normal, parfois moins. Sur un agent conversationnel dont 80 % de l’entrée est un contexte fixe, l’économie dépasse la moitié de la facture. C’est le levier le plus rentable, et il demande seulement de placer la partie stable en tête de l’invite.

Le traitement par lots. Pour ce qui n’est pas interactif — résumés nocturnes, enrichissement de catalogue, traduction en masse — les API de lot appliquent 50 % de remise en échange d’un délai pouvant aller jusqu’à 24 heures.

Le bon modèle pour chaque tâche. Rien n’oblige à tout traiter avec le même. Classer un message, extraire une date, corriger une tournure : un modèle léger suffit. Réservez le modèle haut de gamme aux tâches qui l’exigent. Un aiguillage simple sur la longueur ou le type de demande fait souvent chuter la facture de 70 %.

Le plafond de sortie. Fixez systématiquement une limite au nombre de tokens produits. Sans elle, une question mal formulée peut déclencher une réponse de plusieurs milliers de tokens — facturée au tarif fort.

Quotas et limites de débit

Tous les fournisseurs plafonnent le débit, généralement selon deux compteurs simultanés : requêtes par minute et tokens par minute. Le second est souvent le plus contraignant.

Ces limites montent par paliers, en fonction de votre ancienneté et de vos dépenses cumulées. Un compte neuf démarre bas, ce qui suffit à un site modeste mais pas à une mise en production soudaine — pensez-y avant un lancement.

Le dépassement se manifeste par une erreur HTTP 429. Votre code doit la traiter, et la bonne réponse n’est pas de réessayer immédiatement : cela aggrave la saturation.

  • Réessai avec recul exponentiel : attendre 1 seconde, puis 2, puis 4, avec trois tentatives au maximum ;
  • lire l’en-tête Retry-After quand le fournisseur le renvoie, plutôt que de deviner ;
  • prévoir un repli : message d’attente, mise en file, ou bascule vers un modèle moins chargé.

Ce qui vous concerne plus encore qu’un quota fournisseur, c’est votre propre limitation. Une fonction d’IA ouverte sans restriction sur un site public est une invitation : un script peut lancer des milliers d’appels en une nuit, à vos frais. Trois protections, toutes indispensables :

  • un plafond par utilisateur et par jour, stocké côté serveur ;
  • un plafond global sur le site, qui coupe la fonction au-delà d’un seuil ;
  • une alerte de dépense configurée chez le fournisseur, avec coupure automatique.

La dernière est celle qu’on oublie, et c’est la seule qui fonctionne quand les deux autres ont été contournées.

Les spécifications qui comptent vraiment

Le délai d’attente. Une génération longue peut dépasser trente secondes. Le délai par défaut de la plupart des bibliothèques HTTP est trop court : prévoyez soixante secondes côté serveur, et assurez-vous que votre hébergement le permet — certaines configurations mutualisées coupent avant.

Le streaming. Recevoir la réponse mot à mot plutôt que d’attendre la fin change complètement la perception. Une attente de vingt secondes paraît interminable ; le même délai avec un texte qui s’écrit progressivement passe inaperçu. Le surcoût de mise en œuvre est modeste et le gain est réel.

L’idempotence. Si un utilisateur clique deux fois, envoyez-vous deux requêtes facturées ? Désactivez le bouton pendant le traitement, et côté serveur, utilisez une clé d’idempotence quand le fournisseur la propose.

La journalisation. Enregistrez pour chaque appel le modèle, les tokens consommés en entrée et en sortie, et la durée. Sans ces données, vous découvrirez le problème sur la facture, un mois plus tard, sans savoir d’où il vient.

La gestion d’erreur. Une API distante tombe, ralentit, refuse. Votre site doit continuer de fonctionner : la fonction d’IA est un supplément, pas un point de passage obligé.

RGPD : ce qu’il faut regarder

Dès que les données envoyées concernent une personne identifiable, vous devenez responsable d’un transfert.

Trois points à vérifier avant de choisir un fournisseur.

Où sont traitées les données. Mistral héberge en Europe. OpenAI et Anthropic proposent des options de résidence des données, à vérifier selon l’offre souscrite. Un traitement hors de l’Union suppose des garanties appropriées.

Ce qu’il advient des données envoyées. Les principaux fournisseurs s’engagent à ne pas réutiliser les données d’API pour entraîner leurs modèles, contrairement à leurs interfaces grand public. C’est une différence majeure, et elle justifie de passer par l’API plutôt que de laisser vos équipes coller des documents dans une interface publique.

Ce que vous devez déclarer. Le recours à un sous-traitant doit figurer dans votre registre des traitements et votre politique de confidentialité. Et si vos utilisateurs saisissent du texte libre, ils peuvent y mettre n’importe quoi : prévenez-les que leur saisie est transmise à un service tiers.

Une précaution simple élimine l’essentiel du risque : n’envoyez que ce qui est nécessaire. Un identifiant client plutôt qu’un nom, un extrait plutôt qu’un dossier complet.

Les coûts qu’on oublie

Le prix des tokens n’est qu’une partie de la note.

  • Le développement : une intégration soignée, avec gestion d’erreur, limitation et journalisation, représente plusieurs jours, pas quelques heures ;
  • les essais : la mise au point d’une invite consomme des centaines d’appels, parfois sur le modèle le plus cher ;
  • la maintenance : les modèles sont retirés. Celui que vous intégrez aujourd’hui sera obsolète dans un an, et le remplaçant ne se comportera pas exactement pareil ;
  • le change : les tarifs sont en dollars, votre facture aussi. Un euro faible renchérit tout.

Sur un petit projet, le développement coûte souvent cent fois les tokens de la première année. Cela déplace la question : le bon arbitrage n’est pas de choisir le modèle le moins cher, mais de vérifier que la fonctionnalité mérite d’exister.

Un cas concret : l’assistant de Sportwhen

Pour sortir de la théorie, voici comment nous avons procédé sur Sportwhen, une plateforme de mise en relation sportive, dont l’assistant conversationnel tourne en production depuis le 27 septembre 2026.

Le choix du modèle. Mistral Small, en paiement à l’usage. Trois raisons : l’hébergement européen, qui simplifie la conformité ; un tarif d’entrée à 0,15 $ le million de tokens, soit le tiers du modèle léger le moins cher de la concurrence ; et une qualité largement suffisante pour répondre à des questions sur un catalogue de terrains et de moniteurs. Le modèle haut de gamme n’aurait rien apporté sur cette tâche, pour dix fois le prix.

Le piège de la passerelle. L’application a été construite avec un outil de développement assisté qui propose sa propre passerelle vers les modèles d’IA. C’est commode en développement : aucune clé à gérer, cela fonctionne immédiatement.

C’est aussi un enfermement. Cette passerelle facture selon les règles de la plateforme, pas selon celles du fournisseur, et l’application ne fonctionne plus si on la quitte. Le passage en production s’est donc fait avec un appel direct à l’API Mistral, depuis notre propre serveur, avec notre propre clé et notre propre facture.

La leçon vaut au-delà de ce cas : une passerelle intégrée à un outil de développement rend service pendant la construction et devient un coût subi ensuite. Prévoyez la sortie dès le départ — concrètement, isolez l’appel à l’IA dans une seule fonction de votre code, pour n’avoir qu’un endroit à modifier.

Deux environnements, deux comptes. Le développement continue de passer par la passerelle, la production par l’API directe. Cette séparation a un mérite inattendu : les essais de mise au point, qui consomment beaucoup, ne polluent pas la facture de production, et l’on mesure le coût réel du service sans le bruit du développement.

Par où commencer

Un ordre qui évite les mauvaises surprises.

  • Définissez une tâche précise. « Mettre de l’IA sur le site » n’est pas un projet ; « proposer trois titres à partir d’un article » en est un ;
  • testez l’invite à la main dans l’interface du fournisseur avant d’écrire une ligne de code — vous saurez en dix minutes si le résultat vaut l’effort ;
  • commencez par un modèle léger. Vous monterez en gamme si la qualité ne suffit pas ; l’inverse n’arrive jamais ;
  • posez vos plafonds dès le premier jour, pas après le premier incident ;
  • mesurez avant d’optimiser. La journalisation des tokens dira où part l’argent, et ce sera rarement là où vous pensiez.

En résumé

  • la clé d’API ne va jamais dans le navigateur : l’appel passe par votre serveur, sans exception ;
  • on paie des tokens, entrée et sortie séparément — et c’est l’entrée qui domine, parce que le contexte se renvoie à chaque appel ;
  • l’écart de prix entre modèles va de un à quarante : le choix du modèle prime sur toute optimisation ;
  • cache d’invite et traitement par lots divisent la facture sans toucher à la qualité ;
  • plafonnez toujours les tokens de sortie ;
  • traitez les erreurs 429 avec un recul exponentiel, jamais par un réessai immédiat ;
  • posez une limite par utilisateur, une limite globale et une alerte de dépense avant la mise en ligne ;
  • le streaming transforme la perception de l’attente pour un coût de développement modeste ;
  • n’envoyez que les données nécessaires, et déclarez le sous-traitant ;
  • le développement coûte généralement bien plus que les tokens.

Les tarifs de cet article seront périmés d’ici quelques mois — trois des neuf modèles cités ont changé de prix ou sont apparus depuis juillet. La méthode de calcul, elle, restera valable : comptez vos tokens, multipliez par votre volume, et posez vos plafonds avant d’ouvrir la fonction au public.

SEO et traduction multilingue : réussir un site multilingue sans pénalité

Traduire son site pour toucher une audience internationale est une excellente idée — mais mal fait, le multilingue peut nuire au référencement plutôt que l’améliorer. Contenu dupliqué, mauvaises balises, URLs mal structurées : les pièges sont nombreux. Ce guide explique comment rendre un site multilingue sans pénaliser son SEO, et même en le renforçant sur chaque marché visé.

Pourquoi le multilingue est un sujet SEO à part entière

Quand un site existe en plusieurs langues, Google doit comprendre trois choses : que ces versions existent, qu’elles sont équivalentes (pas du contenu dupliqué), et à qui montrer chaque version. Si ces signaux manquent, le moteur peut afficher la mauvaise langue à un visiteur, ou considérer les traductions comme de la duplication. Bien configuré, au contraire, chaque version se positionne sur son marché linguistique.

Choisir une structure d’URL

La première décision est celle de la structure des adresses. Trois approches existent :

Structure Exemple Remarque
Sous-répertoire site.com/en/ Le plus simple, recommandé dans la plupart des cas
Sous-domaine en.site.com Sépare davantage, gestion plus lourde
Domaine dédié site.co.uk Fort signal géographique, mais coûteux (un domaine par pays)

Pour la majorité des sites, le sous-répertoire (/en/, /es/…) est le meilleur compromis : il concentre l’autorité SEO sur un seul domaine, tout en séparant clairement les langues. Évitez à tout prix de traduire « à la volée » sans URL distincte : sans adresse propre, une version traduite ne peut pas être indexée.

La balise hreflang : le pilier du SEO multilingue

C’est l’élément technique central. La balise hreflang indique à Google quelle version correspond à quelle langue (et éventuellement quel pays). Placée dans l’en-tête de chaque page, elle relie les versions entre elles :

<link rel="alternate" hreflang="fr" href="https://site.com/page" />
<link rel="alternate" hreflang="en" href="https://site.com/en/page" />
<link rel="alternate" hreflang="es" href="https://site.com/es/page" />

Chaque page doit lister toutes les versions, y compris elle-même. Grâce à ces balises, Google comprend que ces pages sont des traductions équivalentes (donc pas du contenu dupliqué) et sert la bonne langue à chaque internaute selon ses réglages. On ajoute souvent une valeur x-default pour désigner la version par défaut, montrée quand aucune langue ne correspond.

Traduire, pas dupliquer

Le contenu dupliqué est le grand risque du multilingue — mais entre deux langues différentes, il n’y a pas de duplication : un texte en français et sa version anglaise sont deux contenus distincts pour Google. La duplication devient un problème dans deux cas :

  • Traduction automatique de mauvaise qualité : un contenu traduit à la machine, truffé d’erreurs, est jugé « de faible valeur » par Google et peut pénaliser le site. Mieux vaut une traduction humaine ou révisée.
  • Même langue pour plusieurs pays : un site en français pour la France et la Belgique peut créer de la quasi-duplication. C’est là que hreflang avec le code pays (fr-FR, fr-BE) prend tout son sens.

Ne pas oublier de traduire… tout

Une erreur fréquente : traduire le texte visible, mais oublier les éléments SEO invisibles. Pour chaque version linguistique, pensez à traduire :

  • La balise title et la meta-description — elles s’affichent dans les résultats de recherche de chaque langue ;
  • Les URL elles-mêmes si possible (un slug dans la langue cible est plus parlant) ;
  • Les textes alternatifs des images (attribut alt) ;
  • Le maillage interne : les liens d’une page anglaise doivent pointer vers les autres pages anglaises, pas revenir au français.

Indiquer la langue de la page

Un détail technique simple mais important : l’attribut lang de la balise <html> doit refléter la langue de la page (<html lang="en"> pour une page anglaise). Il aide les moteurs, les lecteurs d’écran et les navigateurs à traiter correctement le contenu.

Soumettre les versions à Google

Enfin, facilitez le travail du moteur : un sitemap qui liste toutes les versions linguistiques (avec leurs annotations hreflang) aide Google à découvrir et associer les traductions. Déclarez votre site dans la Search Console et surveillez le rapport « International » pour repérer d’éventuelles erreurs hreflang.

En résumé

Un site multilingue bien référencé repose sur quelques piliers : une structure d’URL claire (le sous-répertoire dans la plupart des cas), des balises hreflang correctes reliant les versions, une traduction de qualité (contenu et éléments SEO : title, meta, alt, URL), et une soumission propre via le sitemap et la Search Console. Fait correctement, le multilingue ne divise pas votre référencement : il vous ouvre un nouveau marché sur chacune de ses langues. Pour les aspects techniques d’un site, voyez aussi nos articles sur les permaliens WordPress et les codes HTTP.

Les contraintes d’intégrité en base de données (PRIMARY KEY, FOREIGN KEY, CHECK)

Une base de données ne sert à rien si ses données sont fausses ou incohérentes : un employé rattaché à un service qui n’existe pas, deux clients avec le même identifiant, un âge négatif… Pour éviter ces situations, les SGBD offrent des contraintes d’intégrité : des règles déclarées une fois, que la base fait respecter automatiquement à chaque insertion ou modification. Ce guide présente les principales, avec leur syntaxe et leur rôle.

À quoi servent les contraintes ?

Une contrainte est une règle de validité attachée à une table ou une colonne. Dès qu’une opération (INSERT, UPDATE) violerait cette règle, la base la refuse et renvoie une erreur. L’intérêt est double : les données restent fiables quoi qu’il arrive, et la règle est centralisée dans la base plutôt que répétée dans chaque programme qui y accède. On distingue cinq grands types de contraintes.

NOT NULL : interdire les valeurs vides

La contrainte NOT NULL impose qu’une colonne soit toujours renseignée. Elle empêche d’enregistrer une ligne où cette valeur manque :

CREATE TABLE employes (
    id      NUMBER,
    nom     VARCHAR2(50) NOT NULL,
    salaire NUMBER
);

Ici, un employé sans nom sera refusé : la colonne est obligatoire. Le salaire, en revanche, peut rester vide (NULL). C’est la contrainte la plus simple, à poser sur toute donnée réellement indispensable.

UNIQUE : interdire les doublons

La contrainte UNIQUE garantit qu’une valeur n’apparaît qu’une seule fois dans la colonne. Idéale pour un email, un numéro de série, un code :

CREATE TABLE employes (
    id    NUMBER,
    email VARCHAR2(100) UNIQUE
);

Tenter d’insérer un second employé avec un email déjà présent déclenchera une erreur. À noter : UNIQUE autorise en général plusieurs valeurs NULL (l’absence de valeur n’est pas un « doublon »).

PRIMARY KEY : la clé primaire

La clé primaire identifie de façon unique chaque ligne d’une table. C’est en réalité la combinaison de NOT NULL et UNIQUE : la valeur doit être présente et unique. Chaque table ne peut avoir qu’une seule clé primaire.

CREATE TABLE employes (
    id      NUMBER PRIMARY KEY,
    nom     VARCHAR2(50) NOT NULL,
    salaire NUMBER
);

La colonne id devient l’identifiant fiable de chaque employé : jamais vide, jamais dupliqué. C’est sur cette clé que s’appuient les relations entre tables — et elle bénéficie automatiquement d’un index qui accélère les recherches.

FOREIGN KEY : la clé étrangère (intégrité référentielle)

C’est la contrainte la plus puissante. Une clé étrangère garantit qu’une valeur existe bien dans une autre table. Elle empêche par exemple de rattacher un employé à un service inexistant :

CREATE TABLE employes (
    id         NUMBER PRIMARY KEY,
    nom        VARCHAR2(50) NOT NULL,
    id_service NUMBER,
    FOREIGN KEY (id_service) REFERENCES services(id_service)
);

Désormais, tout id_service saisi dans employes doit exister dans la table services. C’est ce qu’on appelle l’intégrité référentielle : elle maintient la cohérence des liens entre tables. Cette contrainte régit aussi les suppressions : que se passe-t-il si l’on supprime un service auquel des employés sont rattachés ? On le précise avec des options comme ON DELETE CASCADE (supprimer aussi les employés) ou ON DELETE SET NULL (détacher les employés). Par défaut, la suppression est refusée tant que des employés y sont liés.

CHECK : imposer une condition

La contrainte CHECK vérifie qu’une valeur respecte une condition personnalisée. Parfaite pour interdire les valeurs absurdes :

CREATE TABLE employes (
    id      NUMBER PRIMARY KEY,
    nom     VARCHAR2(50) NOT NULL,
    salaire NUMBER CHECK (salaire > 0)
);

Ici, un salaire nul ou négatif sera refusé. On peut exprimer des conditions variées : CHECK (age BETWEEN 16 AND 70), CHECK (statut IN ('actif','inactif')), etc. C’est un garde-fou métier très utile pour bloquer les saisies incohérentes à la source.

Nommer ses contraintes

On peut donner un nom explicite à une contrainte, ce qui rend les messages d’erreur plus clairs et facilite sa modification ultérieure :

CONSTRAINT chk_salaire_positif CHECK (salaire > 0)

Lorsqu’une insertion viole cette règle, l’erreur mentionne chk_salaire_positif — bien plus parlant qu’un nom généré automatiquement. C’est une bonne pratique dès qu’une table dépasse le stade du prototype.

Récapitulatif

Contrainte Garantit que…
NOT NULL la colonne est toujours renseignée
UNIQUE la valeur n’apparaît qu’une fois
PRIMARY KEY chaque ligne a un identifiant unique et non vide
FOREIGN KEY la valeur existe dans une autre table
CHECK la valeur respecte une condition

En résumé

Les contraintes d’intégrité déplacent la responsabilité de la validité des données du programme vers la base : une fois déclarées, elles sont respectées quoi qu’il arrive. NOT NULL impose la présence, UNIQUE évite les doublons, PRIMARY KEY identifie chaque ligne, FOREIGN KEY maintient la cohérence entre tables, et CHECK filtre les valeurs invalides. Bien pensées dès la conception, elles évitent quantité de bugs et garantissent des données propres sur le long terme. Pour compléter, voyez notre article sur les index SQL et les requêtes SQL essentielles.

La méthode Merise expliquée : MCD, MLD, MPD et cardinalités

Avant d’écrire la moindre requête SQL, il faut concevoir sa base de données : quelles tables, quelles colonnes, quels liens ? En France, la méthode de référence pour cette étape s’appelle Merise. Née dans les années 1970-80, elle reste largement enseignée et utilisée pour modéliser un système d’information de façon rigoureuse. Ce guide en présente les principes et les modèles clés, sans jargon inutile.

Qu’est-ce que Merise ?

Merise est une méthode d’analyse et de conception des systèmes d’information. Son idée centrale : séparer clairement les données (ce qu’on stocke) et les traitements (ce qu’on en fait), et progresser par niveaux d’abstraction — du plus conceptuel (le « quoi ») au plus technique (le « comment »). Pour la conception d’une base de données, on retient surtout la partie « données », structurée en trois modèles successifs : conceptuel, logique, puis physique.

Le MCD : modèle conceptuel de données

Le MCD est le cœur de Merise. Il décrit les données de façon abstraite, indépendamment de toute technologie, à travers deux notions :

  • Les entités : les « objets » du monde réel qu’on veut représenter (un Client, un Produit, une Commande). Chaque entité possède des propriétés (le client a un nom, une adresse…) et un identifiant qui la distingue.
  • Les associations : les liens entre entités (un Client passe une Commande). Une association peut elle aussi porter des propriétés.

On représente tout cela par un schéma : des rectangles pour les entités, des ovales ou losanges pour les associations qui les relient. C’est une vue métier, compréhensible même par un non-informaticien.


Modèle conceptuel de données Merise : entités Client et Commande reliées par l’association Passe
L’entité Client (cardinalité 0,n) est reliée par l’association Passe à l’entité Commande (cardinalité 1,1).




Client
id_client
nom
adresse



Commande
id_commande
date
montant

Passe 0,n
1,1
Un modèle conceptuel de données (MCD) : les entités Client et Commande, reliées par l’association « Passe », avec leurs cardinalités.

Les cardinalités

Élément essentiel du MCD, les cardinalités précisent « combien de fois » une entité participe à une association. Elles s’écrivent sous la forme minimum, maximum à chaque extrémité du lien :

Cardinalité Signification
0,1 au minimum aucune fois, au maximum une fois
1,1 exactement une fois
0,n de zéro à plusieurs fois
1,n d’une à plusieurs fois

Par exemple, entre Client et Commande : un client peut passer de 0 à n commandes (0,n), mais une commande appartient à exactement un client (1,1). Ces cardinalités déterminent la nature de la relation — c’est ce qui, plus tard, dictera la structure des tables.

Le MLD : modèle logique de données

Le MLD traduit le MCD en structure de tables, en appliquant des règles de passage systématiques. Les principales :

  • Chaque entité devient une table, ses propriétés deviennent des colonnes, son identifiant devient la clé primaire.
  • Une association de type « un à plusieurs » (comme Client–Commande) se traduit en ajoutant une clé étrangère : la table Commande reçoit l’identifiant du client.
  • Une association « plusieurs à plusieurs » (par exemple Commande–Produit) devient une table à part entière, qui contient les clés des deux entités reliées.

À ce stade, on obtient un schéma relationnel : des tables, des colonnes, des clés primaires et étrangères — la charpente exacte de la future base.

Le MPD : modèle physique de données

Le MPD est la dernière étape : la traduction du MLD dans un SGBD précis (Oracle, MySQL, PostgreSQL…). On y ajoute les détails techniques : les types de données exacts de chaque colonne, les index, les contraintes, et finalement le code CREATE TABLE qui crée réellement la base. C’est le point de jonction entre la conception Merise et le SQL.

Merise en pratique aujourd’hui

Merise a été conçue avant l’ère des méthodes agiles, et sa version complète (avec toute la partie traitements) peut sembler lourde pour de petits projets. Mais sa partie « données » — MCD, cardinalités, passage au relationnel — reste d’une grande utilité, et c’est un socle enseigné dans toutes les formations françaises en informatique. Dans le monde anglo-saxon, on utilise plutôt le formalisme entité-association (E-A) ou UML, très proches dans l’esprit : les concepts d’entité, de relation et de cardinalité s’y retrouvent.

En résumé

Merise structure la conception d’une base en trois modèles : le MCD décrit les données de façon abstraite (entités, associations, cardinalités), le MLD les traduit en tables et clés, et le MPD les implémente dans un SGBD concret. Cette progression du conceptuel au physique évite de se lancer tête baissée dans la création de tables et garantit une base cohérente et bien pensée. Une fois le modèle établi, place à la mise en œuvre : les contraintes d’intégrité et les requêtes SQL.