Ubuntu 24.04 fournit Python 3.12, mais installer des paquets avec un simple pip échoue désormais avec l'erreur « externally-managed-environment ». La solution consiste à isoler chaque projet dans un environnement virtuel. Ce guide montre comment préparer votre VPS Linux Infrawire, gérer proprement les dépendances et maintenir une application active comme service systemd.
📋 Prérequis
- Un VPS sous Ubuntu 24.04 ou Debian 12 avec accès SSH root (IP et mot de passe root dans votre espace client)
- Un projet Python ou un simple script pour tester
- Des notions de base en ligne de commande
1. Installer Python 3, pip et venv
Python 3 est généralement préinstallé, mais pip et le module venv sont des paquets distincts.
Bashapt update apt install -y python3 python3-pip python3-venv python3-dev build-essential python3 --version pip3 --version
2. Comprendre l'erreur PEP 668
Lancer pip install requests en root sur Ubuntu 24.04 ou Debian 12 affiche :
TEXTerror: externally-managed-environment
Cette protection (PEP 668) empêche pip d'écraser des fichiers gérés par apt et de casser les outils système. Ne la contournez pas avec --break-system-packages. Utilisez l'une des trois options propres ci-dessous.
3. Créer un environnement virtuel
Un environnement virtuel est une copie privée de Python et de pip dédiée à un projet.
Bashmkdir -p /opt/myapp && cd /opt/myapp python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install requests flask gunicorn
L'invite commence maintenant par (venv). Quittez l'environnement avec deactivate.
4. Gérer les dépendances avec requirements.txt
Figez les versions exactes pour pouvoir reconstruire le projet à l'identique sur un autre serveur.
Bashpip freeze > requirements.txt # Sur une machine neuve python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
5. Installer des outils en ligne de commande avec pipx
Pour les outils autonomes (httpie, yt-dlp, black...), pipx donne à chacun son propre environnement virtuel caché et expose la commande globalement.
Bashapt install -y pipx pipx ensurepath pipx install httpie
Ouvrez ensuite un nouveau shell pour charger le PATH mis à jour. Pour une bibliothèque disponible en paquet Debian, apt install python3-requests est aussi un choix valable.
6. Lancer l'application comme service systemd
Créez un utilisateur dédié sans privilèges, puis une unité qui démarre l'interpréteur de l'environnement virtuel (ici Gunicorn servant un objet Flask nommé app dans app.py).
Bashuseradd --system --home /opt/myapp --shell /usr/sbin/nologin myapp chown -R myapp:myapp /opt/myapp
Créez /etc/systemd/system/myapp.service :
INI1[Unit] 2Description=My Python application 3After=network.target 4 5[Service] 6User=myapp 7WorkingDirectory=/opt/myapp 8ExecStart=/opt/myapp/venv/bin/gunicorn --bind 127.0.0.1:8000 app:app 9Restart=on-failure 10RestartSec=5 11 12[Install] 13WantedBy=multi-user.target
Bashsystemctl daemon-reload systemctl enable --now myapp
Placez un reverse proxy comme nginx devant le port 8000 pour l'exposer sur Internet.
✅ Vérifier
Bashwhich python # doit pointer dans /opt/myapp/venv une fois activé pip list systemctl status myapp --no-pager journalctl -u myapp -n 50 --no-pager curl -I http://127.0.0.1:8000
🔧 Dépannage
The virtual environment was not created successfully because ensurepip is not available : le paquet venv manque. Installez-le avec apt install python3-venv (ou python3.12-venv) et relancez la commande.
status=203/EXEC dans systemd : le chemin de ExecStart est faux ou le fichier n'est pas exécutable par l'utilisateur du service. Vérifiez avec ls -l /opt/myapp/venv/bin/gunicorn et les droits définis plus haut.
ModuleNotFoundError uniquement sous systemd : le service utilise le Python du système au lieu de l'environnement virtuel. Appelez toujours /opt/myapp/venv/bin/python ou le binaire de venv/bin dans ExecStart.
pip: command not found : utilisez python3 -m pip ou activez d'abord l'environnement virtuel.
🎉 Vos projets Python sont maintenant isolés, reproductibles et exécutés comme un service fiable !