В Ubuntu 24.04 поставляется Python 3.12, но установка пакетов обычным pip теперь завершается ошибкой «externally-managed-environment». Решение — изолировать каждый проект в виртуальном окружении. В руководстве показано, как подготовить VPS Linux Infrawire, правильно управлять зависимостями и держать приложение запущенным как службу systemd.
📋 Требования
- VPS с Ubuntu 24.04 или Debian 12 и доступом по SSH под root (IP-адрес и пароль root есть в вашем личном кабинете)
- Python-проект или простой скрипт для проверки
- Базовые навыки работы в командной строке
1. Установка Python 3, pip и venv
Python 3 обычно уже установлен, но pip и модуль venv — отдельные пакеты.
Bashapt update apt install -y python3 python3-pip python3-venv python3-dev build-essential python3 --version pip3 --version
2. Что означает ошибка PEP 668
Если выполнить pip install requests под root в Ubuntu 24.04 или Debian 12, появится:
TEXTerror: externally-managed-environment
Эта защита (PEP 668) не даёт pip перезаписывать файлы, которыми управляет apt, и ломать системные утилиты. Не обходите её через --break-system-packages. Используйте один из трёх чистых способов ниже.
3. Создание виртуального окружения
Виртуальное окружение — это отдельная копия Python и pip для одного проекта.
Bashmkdir -p /opt/myapp && cd /opt/myapp python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install requests flask gunicorn
Приглашение теперь начинается с (venv). Выйти из окружения можно командой deactivate.
4. Управление зависимостями через requirements.txt
Зафиксируйте точные версии, чтобы проект можно было один в один воссоздать на другом сервере.
Bashpip freeze > requirements.txt # На чистой машине python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
5. Установка консольных утилит через pipx
Для самостоятельных утилит (httpie, yt-dlp, black...) pipx выделяет каждой собственное скрытое виртуальное окружение и делает команду доступной глобально.
Bashapt install -y pipx pipx ensurepath pipx install httpie
После этого откройте новую сессию, чтобы загрузился обновлённый PATH. Для библиотеки, у которой есть пакет Debian, подходит и apt install python3-requests.
6. Запуск приложения как службы systemd
Создайте отдельного непривилегированного пользователя, затем юнит, который запускает интерпретатор из виртуального окружения (здесь Gunicorn обслуживает объект Flask с именем app из app.py).
Bashuseradd --system --home /opt/myapp --shell /usr/sbin/nologin myapp chown -R myapp:myapp /opt/myapp
Создайте файл /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
Поставьте перед портом 8000 обратный прокси, например nginx, чтобы открыть приложение в интернете.
✅ Проверка
Bashwhich python # при активном окружении должен указывать внутрь /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
🔧 Устранение неполадок
The virtual environment was not created successfully because ensurepip is not available : не установлен пакет venv. Поставьте его командой apt install python3-venv (или python3.12-venv) и повторите команду.
status=203/EXEC в systemd : путь в ExecStart неверен либо файл недоступен для запуска пользователю службы. Проверьте ls -l /opt/myapp/venv/bin/gunicorn и права, заданные ранее.
ModuleNotFoundError только под systemd : служба использует системный Python вместо виртуального окружения. Всегда указывайте в ExecStart /opt/myapp/venv/bin/python или файл из venv/bin.
pip: command not found : используйте python3 -m pip или сначала активируйте виртуальное окружение.
🎉 Ваши Python-проекты теперь изолированы, воспроизводимы и работают как надёжная служба!