[{"data":1,"prerenderedAt":202},["ShallowReactive",2],{"seo-verification":3,"blog-python-3-10-fin-de-vie-migrer-applications-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-python-3-10-fin-de-vie-migrer-applications-vps-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":30,"intro":33,"sections":34,"ctaTitle":147,"ctaBody":148,"ctaButton":149,"ctaUrl":150,"relatedPosts":151},558,"python-3-10-fin-de-vie-migrer-applications-vps",{"fr":10,"en":12,"ar":13,"es":14},"python-3-10-end-of-life-migrate-vps-applications","نهاية-دعم-python-3-10-ترقية-تطبيقات-vps","python-3-10-fin-de-vida-migrar-aplicaciones-vps","Python 3.10 en fin de vie : migrer vos applications sur VPS","Python 3.10 n'est plus supporté depuis octobre 2026. Montez vos applications vers 3.12 sur un VPS : venv parallèle, tests, bascule et retour arrière.",9,0,false,"2026-11-01T00:00:00+00:00","2026-11-01T14:14:31+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},4,"Développement","developpement","bg-warning\u002F10 text-warning","dev",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fpython-3-10-fin-de-vie-migrer-applications-vps-poster.svg","Python 3.10 a atteint sa fin de vie en octobre 2026 : plus aucun correctif de sécurité n'est publié pour cette branche. Votre application Django ou FastAPI répond pourtant toujours, et rien ne signale que l'interpréteur est figé. Le risque s'accumule en silence, et la migration paraît plus lourde à chaque mois de retard. Voici une méthode qui ne touche pas à l'existant : un second environnement Python 3.12 à côté du premier, des dépendances verrouillées et testées, puis une bascule réversible en une ligne.",[35,39,48,80,83,86,89,114,117,120,129,132,140,144],{"type":36,"title":37,"body":38},"h2","Ce que change la fin de vie de Python 3.10","Le guide du développeur Python publie le calendrier de chaque branche. Python 3.10, sortie en octobre 2021, y figure en fin de vie depuis le 1er octobre 2026. Concrètement, la branche ne reçoit plus de correctif, pas même de sécurité : une faille découverte dans l'interpréteur ou dans sa bibliothèque standard restera ouverte.\n\nVotre code continue de tourner et vos tests passent, ce qui rend la situation trompeuse. La fin de vie ne casse rien le jour même. Elle retire le filet pour tous les jours suivants, tandis que les distributions, les images de base et les bibliothèques tierces s'en désintéressent peu à peu.",{"type":40,"title":41,"items":42},"ul","Ce que coûte un interpréteur figé",[43,44,45,46,47],"**Failles sans correctif** — toute vulnérabilité de l'interpréteur publiée après la fin de vie reste ouverte sur la branche 3.10 ; seule une montée de version la referme.","**Dépendances qui décrochent** — les bibliothèques relèvent tôt ou tard leur version minimale de Python ; une installation neuve finit par résoudre d'anciennes versions, ou par échouer.","**Images de base figées** — une image de conteneur construite sur la branche 3.10 repose sur un interpréteur sans correctif amont, et vos analyses de vulnérabilités le signalent à chaque build.","**Audits qui coincent** — un interpréteur hors support est une ligne rouge dans les revues de sécurité et les questionnaires fournisseurs de vos clients.","**Migration subie** — de 3.10 à 3.12, l'écart couvre deux versions mineures ; plus vous attendez, plus la liste des ruptures s'allonge, et un chantier planifié coûte moins qu'une urgence après incident.",{"type":49,"title":50,"headers":51,"rows":55},"comparison","Calendrier de support des branches Python",[52,53,54],"Version","Fin de support","Lecture pour votre VPS",[56,60,64,68,72,76],[57,58,59],"3.9","octobre 2025","Hors support depuis plus d'un an : à quitter sans attendre",[61,62,63],"3.10","octobre 2026","Hors support depuis le 1er octobre : plus aucun correctif",[65,66,67],"3.11","octobre 2027","Palier minimal : il règle le problème du jour, pas celui de l'an prochain",[69,70,71],"3.12","octobre 2028","Cible recommandée : deux ans de marge et un écosystème installé",[73,74,75],"3.13","octobre 2029","Supportée plus longtemps encore ; à adopter une fois vos dépendances validées",[77,78,79],"3.14","octobre 2030","Branche la plus récente de ce tableau, dont la fin de support est la plus lointaine",{"type":36,"title":81,"body":82},"Quelle version cible choisir","Python 3.12 est la cible que nous recommandons pour une application existante : sa fin de support est planifiée en octobre 2028, soit deux ans de marge, et les frameworks courants la prennent en charge. Python 3.11 est un palier minimal, qui vous ramène devant la même migration en octobre 2027.\n\nPython 3.13 est supportée plus longtemps encore, jusqu'en octobre 2029. Nous ne la jugeons pas inadaptée : elle suppose seulement que chacune de vos dépendances publie ses paquets pour cette version, ce qui se vérifie dans votre environnement de test. Rappel du guide officiel : les dates des branches encore actives sont planifiées et peuvent être ajustées, seules celles de 3.9 et 3.10 sont acquises. Relisez la page avant de figer votre calendrier.",{"type":36,"title":84,"body":85},"Savoir quel interpréteur sert vraiment la production","`python3 --version` dans votre shell ne dit pas quel interpréteur sert l'application. Le service peut lancer un environnement virtuel créé il y a des années, un Python compilé à la main, ou une image figée dans un `FROM python:3.10`.\n\nRecensez chaque source : la ligne `ExecStart` de l'unité systemd (`systemctl cat monapp`), le résultat de `\u002Fsrv\u002Fmonapp\u002Fvenv\u002Fbin\u002Fpython --version`, un `grep -rn \"FROM python\" .` sur vos Dockerfiles, le champ `requires-python` de `pyproject.toml` et la version utilisée par votre CI. Notez aussi les workers et les tâches planifiées : ils ont souvent leur propre environnement et restent sur l'ancien interpréteur longtemps après le site.",{"type":36,"title":87,"body":88},"Prérequis avant de commencer","Cette migration ne demande pas de machine particulière, mais un accès complet au serveur et de la place pour deux environnements en parallèle : le second occupe autant de disque que le premier, plus un cache de compilation si une dépendance n'a pas de paquet précompilé.\n\nIl vous faut un fichier de dépendances verrouillé avec des versions exactes, une suite de tests exécutable hors production, une sauvegarde récente de la base de données et l'accès root pour installer, si vos dépendances compilées l'exigent, un compilateur et les en-têtes de développement. Une première passe sur un VPS de test, même éphémère, vaut mieux qu'un essai sur le serveur de production.",{"type":90,"title":91,"steps":92},"steps","Migrer sans interrompre le service",[93,96,99,102,105,108,111],{"title":94,"body":95},"Figer l'existant","Depuis l'environnement actuel, exportez les versions exactes : `\u002Fsrv\u002Fmonapp\u002Fvenv\u002Fbin\u002Fpip freeze > requirements.lock.txt`. Ce fichier décrit précisément ce qui tourne aujourd'hui ; il est votre point de retour. Versionnez-le avant de continuer.",{"title":97,"body":98},"Installer Python 3.12 sans toucher au système","`uv python install 3.12` télécharge un interpréteur 3.12 géré par uv, sans remplacer le `python3` de la distribution dont dépendent ses propres outils. Si vous préférez les paquets de votre distribution, installez la branche 3.12 depuis un dépôt qui la fournit et utilisez `python3.12 -m venv`.",{"title":100,"body":101},"Créer le second environnement à côté du premier","`uv venv --python 3.12 \u002Fsrv\u002Fmonapp\u002Fvenv312` crée l'environnement neuf ; sans uv, `python3.12 -m venv \u002Fsrv\u002Fmonapp\u002Fvenv312` fait le même travail. L'ancien continue de servir le trafic : rien n'est modifié. Un environnement virtuel ne se déplace pas, c'est pourquoi le nouveau porte un autre nom.",{"title":103,"body":104},"Réinstaller depuis le fichier verrouillé","`VIRTUAL_ENV=\u002Fsrv\u002Fmonapp\u002Fvenv312 uv pip sync requirements.lock.txt` installe exactement les versions listées. Avec pip : `\u002Fsrv\u002Fmonapp\u002Fvenv312\u002Fbin\u002Fpip install -r requirements.lock.txt`. Si une version figée n'existe pas pour 3.12 ou refuse de se compiler, l'installation s'arrête ici : c'est le but, vous découvrez la rupture avant la production. Notez chaque paquet à relever.",{"title":106,"body":107},"Rejouer la suite de tests","Lancez les tests avec le nouvel interpréteur : `\u002Fsrv\u002Fmonapp\u002Fvenv312\u002Fbin\u002Fpython -m pytest`, ou `\u002Fsrv\u002Fmonapp\u002Fvenv312\u002Fbin\u002Fpython manage.py test` pour Django, précédé de `manage.py check`. Lisez le résumé des avertissements de dépréciation : ils annoncent les ruptures de la version suivante. Les tests doivent passer avec les deux interpréteurs avant de continuer.",{"title":109,"body":110},"Monter uniquement ce qui a cassé","Relevez les paquets en cause, montez-les un par un, puis régénérez le fichier verrouillé depuis le nouvel environnement : `\u002Fsrv\u002Fmonapp\u002Fvenv312\u002Fbin\u002Fpip freeze > requirements.312.txt`. Gardez les deux listes, une par interpréteur, le temps de la bascule.",{"title":112,"body":113},"Démarrer l'application en parallèle sur un port local","Lancez-la avec le nouvel environnement sur un port libre, par exemple `\u002Fsrv\u002Fmonapp\u002Fvenv312\u002Fbin\u002Fgunicorn monapp.wsgi --bind 127.0.0.1:8001` (ou `uvicorn` pour FastAPI). Envoyez-y des requêtes réelles avec `curl` : page d'accueil, connexion, une écriture en base. Le trafic public reste sur l'ancien processus ; seul un résultat identique justifie de passer à la bascule.",{"type":36,"title":115,"body":116},"Basculer et revenir en arrière en une ligne","La bascule ne doit modifier qu'un chemin. Faites pointer l'unité systemd sur un lien plutôt que sur l'environnement : `ExecStart=\u002Fsrv\u002Fmonapp\u002Fvenv-actif\u002Fbin\u002Fgunicorn monapp.wsgi --bind 127.0.0.1:8000`. Créez d'abord le lien vers l'état actuel avec `ln -sfn \u002Fsrv\u002Fmonapp\u002Fvenv \u002Fsrv\u002Fmonapp\u002Fvenv-actif`, puis `systemctl daemon-reload` et un redémarrage qui ne change rien.\n\nLa bascule vers 3.12 devient alors `ln -sfn \u002Fsrv\u002Fmonapp\u002Fvenv312 \u002Fsrv\u002Fmonapp\u002Fvenv-actif && systemctl restart monapp`, et le retour arrière est la même ligne avec l'ancien chemin. Pour une application en conteneur, le levier est l'image de base : passez de `FROM python:3.10-slim` à `FROM python:3.12-slim`, reconstruisez avec `docker compose up -d --build` et revenez en arrière en rétablissant la ligne précédente.\n\nDans les deux cas, gardez l'ancien environnement ou l'ancienne image quelques jours, et suivez les journaux avec `journalctl -u monapp -f` pendant la première heure.",{"type":36,"title":118,"body":119},"Les points de casse à contrôler","Entre 3.10 et 3.12, la rupture vient rarement de votre code et presque toujours de ce qui l'entoure. Trois familles reviennent : les modules retirés de la bibliothèque standard, les dépendances compilées et la version minimale de vos frameworks. Les notes de version de Python 3.12 listent ce qui disparaît ; lisez-les avec votre fichier verrouillé ouvert à côté.",{"type":40,"title":121,"items":122},"Liste de contrôle avant la bascule",[123,124,125,126,127,128],"**Modules retirés** — Python 3.12 supprime `distutils`, `asynchat`, `asyncore` et `imp` ; `grep -rnE \"distutils|asyncore|asynchat|import imp\" .` repère vos usages directs, la liste de vos dépendances révèle les indirects.","**setuptools n'est plus préinstallé** — les environnements créés par `venv` ne l'embarquent plus en 3.12 ; un paquet qui importe `pkg_resources` sans le déclarer échoue tant que vous n'avez pas fait `pip install setuptools`.","**Paquets précompilés** — les dépendances compilées (pilotes de base de données, traitement d'image, cryptographie) doivent publier un paquet pour 3.12 ; `pip install --only-binary=:all: -r requirements.lock.txt` échoue vite au lieu de lancer une compilation.","**Versions minimales des frameworks** — Django 4.2 ne prend en charge Python 3.12 qu'à partir de la 4.2.8, et Django 5.0 et les suivantes l'acceptent ; pour FastAPI, relisez les classifiers Python de la version exacte que vous épinglez.","**Avertissements de dépréciation** — `datetime.utcnow()` et `datetime.utcfromtimestamp()` sont dépréciées en 3.12 ; remplacez-les par `datetime.now(datetime.UTC)` et `datetime.fromtimestamp(ts, datetime.UTC)`.","**Bibliothèques système partagées** — l'environnement parallèle isole les paquets Python, pas les bibliothèques de l'OS (client PostgreSQL, par exemple) : notez-les, une mise à jour du système peut les changer sous vos pieds.",{"type":36,"title":130,"body":131},"Dépannage : les erreurs qui reviennent","Ces messages apparaissent dès la première exécution des tests sous Python 3.12. Chacun a une cause connue et un remède court.",{"type":40,"title":133,"items":134},"Message observé et remède",[135,136,137,138,139],"**ModuleNotFoundError: No module named 'distutils'** — le module a quitté la bibliothèque standard. Installez `setuptools` dans l'environnement, qui continue d'en fournir une version, puis montez la dépendance fautive.","**ModuleNotFoundError: No module named 'imp'** — `imp` est retiré, `importlib` le remplace. Si l'import vient d'un paquet tiers, montez ce paquet vers une version qui ne l'utilise plus.","**ModuleNotFoundError: No module named 'pkg_resources'** — setuptools n'est plus installé d'office dans les environnements venv de 3.12. `pip install setuptools` rétablit le module en attendant que le paquet fautif s'en passe.","**DeprecationWarning: datetime.datetime.utcnow() is deprecated** — ce n'est pas une erreur mais un signal : remplacez l'appel par un objet conscient du fuseau horaire.","**Failed building wheel for \u003Cpaquet>** — ce paquet n'a pas de version précompilée pour 3.12 et pip tente de le compiler. Montez-le, ou installez compilateur et en-têtes de développement si la montée est impossible.",{"type":141,"title":142,"body":143},"tip","Épingler la cible, pas seulement migrer","Profitez de la migration pour fixer l'interpréteur au lieu de le subir : `requires-python = \">=3.12\"` dans `pyproject.toml`, un tag d'image précis plutôt que `python:3`, et la version de Python dans la matrice de votre CI. Ajoutez 3.13 à cette matrice en simple observation : vous saurez à l'avance si la prochaine montée sera simple.",{"type":36,"title":145,"body":146},"Faire de la montée de version un geste habituel","Une branche de Python arrive en fin de vie chaque année, en octobre. La méthode décrite ici (environnement parallèle, fichier verrouillé, tests, bascule réversible) ne dépend d'aucune version précise : elle se rejoue telle quelle pour 3.11 en octobre 2027 et pour 3.12 en octobre 2028, d'après le calendrier actuel.\n\nSi votre application n'est pas encore sur un serveur dont vous maîtrisez l'interpréteur, notre guide de déploiement de Django sur un VPS couvre le premier déploiement. Les guides sur la fin de vie de Node.js et de PHP suivent la même logique pour les autres runtimes d'un parc.","Un serveur où tester la version suivante avant de basculer","Un VPS avec accès root permet de monter un second environnement Python à côté du premier, de valider les tests, puis de basculer. Le choix de l'OS est libre et la capacité se monte à la verticale ; l'option administration VPS prend le relais si vous ne voulez pas tenir le serveur vous-même.","Comparer les VPS","\u002Fvps-cloud",[152,169,185],{"id":153,"slug":154,"slugs":155,"title":159,"excerpt":160,"readTime":161,"views":162,"isPinned":19,"publishedAt":163,"updatedAt":164,"category":165,"categories":166,"featuredImage":30,"bgImage":31,"posterImage":168,"relatedSolution":30},223,"nodejs-20-fin-de-vie-migrer-vps",{"fr":154,"en":156,"ar":157,"es":158},"nodejs-20-end-of-life-migrating-your-vps","نهاية-دعم-nodejs-20-ترحيل-خادم-vps","nodejs-20-fin-de-vida-migrar-vps","Node.js 20 en fin de vie : migrer votre VPS","Node.js 20 n'a plus de correctif de sécurité depuis le 30 avril 2026. Auditer vos serveurs et migrer vers Node.js 24 sans casser la production.",5,2,"2026-08-05T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[167],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fnodejs-20-fin-de-vie-migrer-vps-poster.svg",{"id":170,"slug":171,"slugs":172,"title":176,"excerpt":177,"readTime":178,"views":179,"isPinned":19,"publishedAt":180,"updatedAt":164,"category":181,"categories":182,"featuredImage":30,"bgImage":31,"posterImage":184,"relatedSolution":30},206,"php-82-fin-de-vie-checklist-migration",{"fr":171,"en":173,"ar":174,"es":175},"php-82-end-of-life-planning-your-migration","نهاية-دعم-php-82-دليل-الترحيل","php-82-fin-de-vida-planificar-la-migracion","PHP 8.2 fin de vie : checklist de migration","PHP 8.2 atteint son EOL le 31 décembre 2026. Inventaire, tableau comparatif, checklist de migration et dépannage pour passer à PHP 8.3 ou 8.4 sans interruption.",11,7,"2026-08-01T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[183],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fphp-82-fin-de-vie-checklist-migration-poster.svg",{"id":186,"slug":187,"slugs":188,"title":192,"excerpt":193,"readTime":194,"views":179,"isPinned":19,"publishedAt":195,"updatedAt":164,"category":196,"categories":197,"featuredImage":30,"bgImage":31,"posterImage":199,"relatedSolution":200},44,"deployer-django-vps",{"fr":187,"en":189,"ar":190,"es":191},"deploy-a-django-application-on-a-vps","نشر-تطبيق-django-على-vps","desplegar-una-aplicacion-django-en-un-vps","Déployer une application Django sur un VPS","Déployez Django sur un VPS : Gunicorn, Nginx, PostgreSQL, Docker et SSL. Guide complet pour développeurs Python qui veulent self-héberger.",3,"2026-05-07T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[198],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-django-vps-poster.svg",{"categorySlug":25,"appSlug":201},"django",1793542911700]