Python: установка пакетов в изолированной среде без интернета

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Python-разработчики, работающие в корпоративной среде с ограниченным доступом к интернету
  • DevOps-специалисты, ответственные за управление зависимостями в изолированных системах
  • IT-менеджеры и системные администраторы, занимающиеся настройкой и поддержкой локальных репозиториев пакетов

    Мир корпоративной разработки Python полон ограничений и "красных зон" — закрытые сети, запрет на внешние подключения, строгие политики безопасности. Установка необходимых пакетов превращается в настоящий квест, когда доступа к PyPI просто нет. Что делать, если ваш requirements.txt есть, а интернета — нет? Как подготовить локальное хранилище пакетов для надёжных развёртываний? Разбираемся в деталях управления зависимостями Python в условиях изоляции и корпоративных ограничений. 🔒🐍

Если вы регулярно сталкиваетесь с задачами управления Python-зависимостями в сложных средах, возможно, вам пора глубже погрузиться в профессиональную разработку. Обучение Python-разработке от Skypro — это практические навыки работы с реальными проектами, включая профессиональный DevOps, управление зависимостями и создание отказоустойчивых приложений. Всего за 9 месяцев вы станете специалистом, способным решать самые сложные задачи Python-разработки.

Основные способы установки пакетов из requirements.txt

Файл requirements.txt — краеугольный камень управления зависимостями в Python-проектах. Он содержит список необходимых пакетов, часто с указанием конкретных версий, что обеспечивает стабильность и воспроизводимость среды разработки или продакшена.

Стандартный подход к установке зависимостей предельно прост:

pip install -r requirements.txt

Однако эта команда предполагает наличие доступа к PyPI — официальному репозиторию пакетов Python. В корпоративных или изолированных средах такая роскошь доступна не всегда.

Рассмотрим основные способы установки пакетов из requirements.txt с учётом различных сценариев доступности интернета:

Сценарий Команда Примечания
Полный доступ к интернету pip install -r requirements.txt Стандартный вариант, пакеты загружаются напрямую с PyPI
Ограниченный доступ (корпоративный прокси) pip install --proxy=http://proxy:port -r requirements.txt Установка через корпоративный прокси-сервер
Локальный каталог с пакетами pip install --no-index --find-links=./packages -r requirements.txt Использование предварительно загруженных пакетов из локального каталога
Локальный PyPI-сервер pip install -i http://local-pypi-server/simple -r requirements.txt Установка из локального зеркала PyPI
Полная офлайн-среда pip install --no-index --find-links=./wheels -r requirements.txt Требует предварительной подготовки всех wheel-файлов

Важно понимать, что в некоторых случаях вам может понадобиться не только локальный requirements.txt, но и локальные копии самих пакетов. Это особенно актуально для полностью изолированных сред.

Александр Петров, DevOps-инженер

Недавно столкнулся с задачей развертывания Python-приложения на изолированных серверах атомной станции. Никакого доступа к интернету, даже через прокси. Первая попытка была наивной — просто скопировал код и requirements.txt, запустил pip install и... ничего. Pip пытался достучаться до PyPI и терпел неудачу.

Решение оказалось не таким очевидным. Сначала на машине с интернетом я скачал все необходимые пакеты вместе с зависимостями: pip download -r requirements.txt -d ./packages.

Затем перенёс эту директорию на целевые серверы вместе с кодом проекта. И уже там использовал команду: pip install --no-index --find-links=./packages -r requirements.txt

Это сработало идеально! Теперь у нас есть автоматизированный процесс для обновления пакетов. Каждую неделю мы обновляем локальное хранилище на "чистой" машине и доставляем его на изолированные серверы.

Дополнительно стоит отметить несколько полезных флагов pip при установке из requirements.txt:

  • --upgrade или -U — обновление уже установленных пакетов до версий, указанных в requirements.txt
  • --ignore-installed — игнорировать уже установленные пакеты и переустановить их
  • --no-deps — не устанавливать зависимости пакетов (опасно, используйте с осторожностью)
  • --require-hashes — проверять хеши пакетов для обеспечения безопасности
Пошаговый план для смены профессии

Параметры pip install для работы с локальными источниками

При работе в ограниченной среде критически важно уметь гибко настраивать pip для использования локальных источников пакетов. Умелое использование параметров pip позволяет решить большинство проблем с установкой в изолированной среде. 🛠️

Ключевые параметры pip для работы с локальными источниками:

  • --no-index — запрещает pip обращаться к внешним индексам пакетов (включая PyPI)
  • --find-links PATH или -f PATH — указывает директорию или URL, где искать пакеты
  • --index-url URL или -i URL — задаёт альтернативный индекс пакетов вместо PyPI
  • --extra-index-url URL — добавляет дополнительный индекс пакетов (используется вместе с основным)
  • --trusted-host HOST — помечает хост как доверенный (обходит проверки SSL)

Рассмотрим несколько практических примеров использования этих параметров:

  1. Установка пакетов исключительно из локального каталога:
pip install --no-index --find-links=./downloaded_packages -r requirements.txt

  1. Использование локального зеркала PyPI с отключенной проверкой SSL:
pip install --index-url http://local-pypi-mirror/simple --trusted-host local-pypi-mirror -r requirements.txt

  1. Комбинирование локального каталога и индекса:
pip install --index-url http://local-pypi/simple --find-links=./fallback_packages -r requirements.txt

  1. Указание нескольких локальных директорий для поиска пакетов:
pip install --no-index --find-links=./packages1 --find-links=./packages2 -r requirements.txt

Ирина Соколова, Lead Python-разработчик

В нашем банке доступ к внешнему интернету есть только у одного сервера в DMZ-зоне, а остальные серверы разработки находятся в закрытом контуре. Однажды нам нужно было срочно обновить библиотеки для ML-проекта — около 50 пакетов с сотнями зависимостей.

Сначала казалось, что задача трудновыполнима. Мы попробовали вручную выкачать все пакеты, но быстро запутались в зависимостях. Тогда я разработала двухэтапный подход:

На сервере с доступом в интернет создала pip.conf с настройкой для сохранения всех скачиваемых пакетов:

[global]
download-cache = /path/to/pip/cache

Затем выполнила:

pip download -r requirements.txt -d ./project_packages

Это скачало все пакеты с зависимостями. После перенесла каталог на целевой сервер и установила:

pip install --no-index --find-links=./project_packages -r requirements.txt

Теперь этот процесс у нас полностью автоматизирован с помощью Jenkins-пайплайна, который еженедельно обновляет локальное хранилище пакетов и раздает их по всем серверам разработки.

Важный нюанс: параметр --find-links не заменяет полностью индекс пакетов. Если вы хотите полностью исключить обращение к PyPI или другим внешним источникам, всегда комбинируйте его с флагом --no-index.

Параметр Требует интернета Применение Совместимость
--no-index Нет Полностью изолированные среды Требует --find-links
--find-links Нет Локальные директории с пакетами Работает с и без --no-index
--index-url Да (локальная сеть) Корпоративные PyPI-зеркала Заменяет стандартный PyPI
--extra-index-url Да (локальная сеть) Дополнительные источники пакетов Дополняет основной индекс
--trusted-host Зависит от хоста Локальные HTTP-серверы без SSL Часто используется с --index-url

Создание локального каталога пакетов для offline-установки

Для полностью изолированных сред критически важно уметь создавать локальное хранилище пакетов Python. Это позволяет устанавливать зависимости даже при полном отсутствии доступа к внешним репозиториям. 📦

Процесс создания локального каталога пакетов обычно выполняется на машине с доступом в интернет, а затем результат переносится в изолированную среду. Рассмотрим поэтапно этот процесс:

Шаг 1: Подготовка среды для скачивания пакетов Создайте директорию для хранения пакетов:

mkdir -p ./python_packages

Шаг 2: Скачивание пакетов с зависимостями Для скачивания всех пакетов, указанных в requirements.txt, вместе с их зависимостями используйте команду:

pip download -r requirements.txt -d ./python_packages

Это скачает все необходимые wheel-файлы и исходные архивы пакетов.

Шаг 3: Опционально: скачивание конкретной версии Python Если вам также нужно установить Python в изолированной среде, скачайте официальные установщики или исходный код с сайта python.org.

Шаг 4: Перенос пакетов в изолированную среду Скопируйте директорию ./python_packages в целевую изолированную среду с помощью физических носителей, защищенной сети или других доступных средств.

Шаг 5: Установка пакетов в изолированной среде В изолированной среде выполните команду:

pip install --no-index --find-links=./python_packages -r requirements.txt

Важно учитывать несколько нюансов при создании локального каталога пакетов:

  • Для платформозависимых пакетов (например, с компилируемым C-кодом) необходимо скачивать wheel-файлы, совместимые с целевой платформой
  • Если вы используете разные версии Python в исходной и целевой среде, убедитесь, что скачиваете совместимые пакеты
  • Для некоторых пакетов может потребоваться дополнительное скачивание системных зависимостей

Для более сложных случаев можно использовать специализированные инструменты:

  • pip-tools — для более точного разрешения зависимостей
  • conda-pack — если вы используете Anaconda/Miniconda
  • pipenv — для проектов, использующих Pipenv для управления зависимостями
  • poetry — для экспорта зависимостей из проектов Poetry

Дополнительно можно оптимизировать процесс, используя кэширование пакетов:

pip download --cache-dir=./pip_cache -r requirements.txt -d ./python_packages

Это создаст локальный кэш, который можно использовать при последующих скачиваниях, что особенно полезно при регулярных обновлениях пакетов.

Настройка pip для использования локальных репозиториев

Вместо разовой передачи отдельных пакетов, более масштабное решение — настройка локального зеркала PyPI или частного репозитория пакетов. Это идеальный подход для команд разработки в корпоративных средах. 🏢

Настройка pip для работы с локальными репозиториями может быть выполнена несколькими способами:

  1. Использование конфигурационных файлов pip
  2. Настройка через переменные окружения
  3. Использование командной строки с сохранением параметров

Рассмотрим каждый из этих подходов подробнее:

1. Конфигурационные файлы pip Создайте или отредактируйте файл pip.conf (Linux/macOS) или pip.ini (Windows):

Для Linux/macOS: ~/.config/pip/pip.conf или ~/.pip/pip.conf Для Windows: %APPDATA%\pip\pip.ini или %USERPROFILE%\pip\pip.ini

Добавьте следующие настройки:

[global]
index-url = http://local-pypi-server/simple
trusted-host = local-pypi-server
no-index = false
find-links = /path/to/local/packages

Этот файл конфигурации указывает pip использовать локальный PyPI-сервер вместо официального репозитория и дополнительно искать пакеты в указанной директории.

2. Переменные окружения Вы можете задать конфигурацию pip через переменные окружения:

Linux/macOS:

export PIP_INDEX_URL=http://local-pypi-server/simple
export PIP_TRUSTED_HOST=local-pypi-server
export PIP_FIND_LINKS=/path/to/local/packages

Windows:

set PIP_INDEX_URL=http://local-pypi-server/simple
set PIP_TRUSTED_HOST=local-pypi-server
set PIP_FIND_LINKS=C:\path\to\local\packages

3. Создание алиаса или скрипта Для частого использования удобно создать алиас или скрипт:

Linux/macOS:

alias pip_local='pip install --index-url http://local-pypi-server/simple --trusted-host local-pypi-server'
# Использование: pip_local -r requirements.txt

Windows (batch-файл pip_local.bat):

@echo off
pip install --index-url http://local-pypi-server/simple --trusted-host local-pypi-server %*

Для корпоративных сред можно создать локальный PyPI-сервер, используя одно из следующих решений:

  • PyPI-Server — простое и легкое решение для локального зеркала
  • Devpi — продвинутый инструмент с поддержкой кэширования и репликации
  • Artifactory — корпоративное решение для хранения артефактов, включая Python-пакеты
  • Nexus Repository — мощная система управления артефактами с поддержкой PyPI
  • Gitlab Package Registry — интеграция с системой контроля версий

Пример настройки простого PyPI-сервера с помощью pypi-server:

  1. Установите pypi-server:
pip install pypiserver

  1. Создайте директорию для пакетов:
mkdir -p /path/to/packages

  1. Скачайте пакеты в эту директорию:
pip download -r requirements.txt -d /path/to/packages

  1. Запустите сервер:
pypi-server -p 8080 /path/to/packages

  1. Настройте pip на использование этого сервера:
pip install --index-url http://localhost:8080/simple --trusted-host localhost -r requirements.txt

Автоматизация установки пакетов в изолированных средах

Ручная настройка установки пакетов приемлема для разовых операций, но в масштабируемых средах необходима автоматизация. Правильно настроенная автоматизация экономит время, снижает количество ошибок и обеспечивает воспроизводимость среды. 🤖

Рассмотрим несколько подходов к автоматизации установки Python-пакетов в изолированных средах:

  1. Скрипты для подготовки и передачи пакетов
  2. Использование Docker для изолированных сред
  3. Интеграция с системами CI/CD
  4. Автоматическое обновление локальных репозиториев

1. Автоматизация с помощью скриптов Создайте скрипт для автоматической загрузки и подготовки пакетов:

#!/bin/bash

# Определение переменных
REQUIREMENTS_FILE="requirements.txt"
PACKAGES_DIR="./python_packages"
TARGET_ENV="production"

# Создание директории для пакетов
mkdir -p $PACKAGES_DIR

# Загрузка пакетов
echo "Downloading packages to $PACKAGES_DIR..."
pip download -r $REQUIREMENTS_FILE -d $PACKAGES_DIR

# Архивирование пакетов для передачи
echo "Creating archive for transfer..."
tar -czvf ${TARGET_ENV}_python_packages.tar.gz $PACKAGES_DIR

echo "Package archive ready for transfer!"

И соответствующий скрипт для установки на изолированном сервере:

#!/bin/bash

# Определение переменных
ARCHIVE_NAME="production_python_packages.tar.gz"
PACKAGES_DIR="./python_packages"
REQUIREMENTS_FILE="requirements.txt"

# Распаковка архива
echo "Extracting packages..."
tar -xzvf $ARCHIVE_NAME

# Установка пакетов
echo "Installing packages from local directory..."
pip install --no-index --find-links=$PACKAGES_DIR -r $REQUIREMENTS_FILE

echo "Installation complete!"

2. Docker для изолированных сред Создайте многоэтапный Dockerfile для подготовки и использования локальных пакетов:

# Первый этап: загрузка пакетов
FROM python:3.9 AS builder

WORKDIR /build
COPY requirements.txt .

RUN mkdir -p ./packages && \
pip download -r requirements.txt -d ./packages

# Второй этап: создание изолированного образа
FROM python:3.9-slim

WORKDIR /app
COPY --from=builder /build/packages ./packages
COPY requirements.txt .
COPY app/ ./app/

RUN pip install --no-index --find-links=./packages -r requirements.txt && \
rm -rf ./packages

CMD ["python", "app/main.py"]

3. Интеграция с CI/CD Пример конфигурации GitLab CI для автоматизации подготовки пакетов:

stages:
- prepare_packages
- deploy

prepare_packages:
stage: prepare_packages
image: python:3.9
script:
- mkdir -p ./python_packages
- pip download -r requirements.txt -d ./python_packages
artifacts:
paths:
- ./python_packages
expire_in: 1 week

deploy_to_isolated:
stage: deploy
image: python:3.9-slim
script:
- pip install --no-index --find-links=./python_packages -r requirements.txt
- python deploy.py
dependencies:
- prepare_packages

4. Автоматическое обновление локальных репозиториев Для корпоративных сред можно настроить автоматическое обновление локального PyPI-зеркала:

Инструмент Команда обновления Преимущества Недостатки
bandersnatch bandersnatch mirror Полное зеркало PyPI, инкрементальные обновления Требует значительного дискового пространства
devpi devpi index update Кэширование пакетов по требованию, репликация Более сложная настройка
Artifactory/Nexus Через веб-интерфейс или API Корпоративного уровня, интеграция с другими типами пакетов Платные решения, требуют администрирования
Скрипт с pip download pip download -r requirements.txt -d ./repo Простота, скачиваются только нужные пакеты Требует обновления requirements.txt

Пример crontab для автоматического обновления локального репозитория:

# Обновление локального репозитория пакетов каждый понедельник в 3:00
0 3 * * 1 /path/to/update_packages_repo.sh >> /var/log/update_pypi.log 2>&1

С содержимым скрипта update_packages_repo.sh:

#!/bin/bash

# Путь к директории с requirements-файлами проектов
REQUIREMENTS_DIR="/path/to/requirements_collection"
# Директория локального репозитория
PACKAGES_DIR="/path/to/pypi_local_repo"

# Создание временного объединенного файла requirements
TMP_REQUIREMENTS=$(mktemp)

# Объединение всех requirements.txt файлов
find "$REQUIREMENTS_DIR" -name "requirements*.txt" -exec cat {} \; > "$TMP_REQUIREMENTS"

# Скачивание пакетов
pip download -r "$TMP_REQUIREMENTS" -d "$PACKAGES_DIR"

# Обновление локального PyPI-сервера (если используется)
systemctl restart pyi-server

# Очистка
rm "$TMP_REQUIREMENTS"

echo "Local PyPI repository updated at $(date)"

Данный подход особенно полезен для организаций с несколькими изолированными средами, где централизованное управление пакетами критически важно для обеспечения безопасности и стабильности.

Управление Python-зависимостями в изолированных средах — это не только техническая необходимость, но и вопрос безопасности вашей инфраструктуры. Овладев методами локальной установки пакетов, вы получаете полный контроль над кодовой базой проекта, избавляетесь от рисков недоступности внешних источников и защищаете свои системы от потенциальных угроз из публичных репозиториев. Будь то корпоративная сеть с ограничениями, высокозащищенная среда или полностью офлайн-инфраструктура — теперь у вас есть все инструменты для эффективного управления Python-зависимостями в любых условиях.

Загрузка...