Ubuntu 24.04 zawiera Pythona 3.12, ale instalowanie pakietów zwykłym pip kończy się teraz błędem „externally-managed-environment”. Rozwiązaniem jest izolowanie każdego projektu w osobnym środowisku wirtualnym. Ten poradnik pokazuje, jak przygotować VPS Linux Infrawire, poprawnie zarządzać zależnościami i utrzymać aplikację jako usługę systemd.
📋 Wymagania wstępne
- Serwer VPS z Ubuntu 24.04 lub Debian 12 i dostępem SSH jako root (adres IP i hasło roota znajdziesz w panelu klienta)
- Projekt w Pythonie lub prosty skrypt do testów
- Podstawowa znajomość wiersza poleceń
1. Instalacja Pythona 3, pip i venv
Python 3 jest zwykle zainstalowany, ale pip i moduł venv to osobne pakiety.
Bashapt update apt install -y python3 python3-pip python3-venv python3-dev build-essential python3 --version pip3 --version
2. Skąd błąd PEP 668
Uruchomienie pip install requests jako root na Ubuntu 24.04 lub Debian 12 wyświetla:
TEXTerror: externally-managed-environment
To zabezpieczenie (PEP 668) chroni przed nadpisaniem plików zarządzanych przez apt i uszkodzeniem narzędzi systemowych. Nie omijaj go opcją --break-system-packages. Skorzystaj z jednej z trzech czystych metod poniżej.
3. Tworzenie środowiska wirtualnego
Środowisko wirtualne to prywatna kopia Pythona i pip dla jednego projektu.
Bashmkdir -p /opt/myapp && cd /opt/myapp python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install requests flask gunicorn
Monit zaczyna się teraz od (venv). Opuścisz środowisko poleceniem deactivate.
4. Zarządzanie zależnościami przez requirements.txt
Zamroź dokładne wersje, aby móc odtworzyć projekt identycznie na innym serwerze.
Bashpip freeze > requirements.txt # Na świeżej maszynie python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
5. Narzędzia wiersza poleceń z pipx
Dla samodzielnych narzędzi (httpie, yt-dlp, black...) pipx tworzy każdemu własne ukryte środowisko wirtualne i udostępnia polecenie globalnie.
Bashapt install -y pipx pipx ensurepath pipx install httpie
Otwórz potem nową powłokę, aby załadować zaktualizowany PATH. Dla biblioteki, która ma pakiet Debiana, dobrym wyborem jest też apt install python3-requests.
6. Uruchomienie aplikacji jako usługi systemd
Utwórz dedykowanego użytkownika bez uprawnień, a następnie jednostkę, która startuje interpreter ze środowiska wirtualnego (tu Gunicorn obsługujący obiekt Flask o nazwie app w pliku app.py).
Bashuseradd --system --home /opt/myapp --shell /usr/sbin/nologin myapp chown -R myapp:myapp /opt/myapp
Utwórz plik /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
Umieść przed portem 8000 reverse proxy, np. nginx, aby udostępnić aplikację w Internecie.
✅ Weryfikacja
Bashwhich python # po aktywacji musi wskazywać na /opt/myapp/venv pip list systemctl status myapp --no-pager journalctl -u myapp -n 50 --no-pager curl -I http://127.0.0.1:8000
🔧 Rozwiązywanie problemów
The virtual environment was not created successfully because ensurepip is not available : brakuje pakietu venv. Zainstaluj go poleceniem apt install python3-venv (lub python3.12-venv) i powtórz komendę.
status=203/EXEC w systemd : ścieżka w ExecStart jest błędna albo plik nie jest wykonywalny dla użytkownika usługi. Sprawdź ls -l /opt/myapp/venv/bin/gunicorn oraz uprawnienia ustawione wcześniej.
ModuleNotFoundError tylko pod systemd : usługa używa systemowego Pythona zamiast środowiska wirtualnego. W ExecStart zawsze wywołuj /opt/myapp/venv/bin/python lub plik z venv/bin.
pip: command not found : użyj python3 -m pip albo najpierw aktywuj środowisko wirtualne.
🎉 Twoje projekty w Pythonie są teraz odizolowane, powtarzalne i działają jako niezawodna usługa!