.venv рядом с приложением, фиксируют зависимости в requirements-файле или lock-файле и запускают сервис через абсолютный путь к Python или Gunicorn внутри этого окружения.
Как управлять зависимостями Python в виртуальном окружении на сервере?
Подробный ответ
Зачем нужно virtualenv
Виртуальное окружение изолирует Python-пакеты приложения. Это позволяет разным проектам использовать разные версии библиотек и не изменять системные пакеты Python через sudo pip.
Создание окружения
cd /srv/my-app
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pipПосле активации python и pip указывают на интерпретатор и пакеты из .venv. Выйти из окружения можно командой deactivate.
Установка фиксированных зависимостей
.venv/bin/python -m pip install --requirement requirements.txt
.venv/bin/python -m pip freeze > requirements.txtДля production важна воспроизводимость: лучше фиксировать версии зависимостей или использовать lock-файл инструмента управления зависимостями. Это снижает риск, что новый деплой установит неожиданную несовместимую версию библиотеки.
Обновление зависимостей
Зависимости не стоит обновлять прямо на production-сервере без проверки. Правильнее обновить их в development, прогнать тесты, собрать артефакт или image в CI и деплоить уже проверенную версию.
.venv/bin/python -m pip list --outdated
.venv/bin/python -m pip checkИспользование в systemd
Systemd не требует активации virtualenv через source. Нужно указывать полный путь к команде из окружения.
[Service]
WorkingDirectory=/srv/my-app
ExecStart=/srv/my-app/.venv/bin/gunicorn config.wsgi:application --bind 127.0.0.1:8000
EnvironmentFile=/etc/my-app/my-app.envПрактические правила
не использовать
sudo pip installдля зависимостей проекта;использовать
python -m pip, чтобы pip соответствовал нужному Python;не коммитить сам каталог
.venvв Git;проверять зависимости через тесты и vulnerability scan до деплоя;
создавать новое окружение или обновлять его контролируемым deploy-скриптом.
Как ответить на собеседовании
На сервере я создаю отдельное .venv для приложения и ставлю пакеты через .venv/bin/python -m pip install -r requirements.txt. Версии зависимостей фиксирую в requirements или lock-файле. В systemd указываю полный путь к Gunicorn или Python внутри virtualenv и не использую sudo pip для зависимостей приложения.
Оцени свой прогресс