
Предварительно замечу, что возможными решениями проблемы являются следующие варианты:
настройка прокси репозитория PyPI в изолированном сегменте сети;
сборка всего python-проекта в docker image;
сборка всего python-проекта в один бинарный пакет.
Как подметил sshikov в комментариях:
Широко известный Nexus в бесплатной версии умеет работать прокси репозиторием PyPI. При этом вокруг него можно строить решение, которое будет контролировать безопасность устанавливаемых модулей.
Для сборки бинарных пакетов предлагаю ознакомиться со статьей Компиляция Python.
Но если все указанные выше варианты вам не подходят, то данная статья вам будет полезна.
Статья простая и нацелена на новичков, олдов прошу не возмущаться)
Задача
Необходимо выполнить деплой python-проекта со всеми его зависимостями из локального Git (Bitbucket) на сервер в изолированном сегменте сети.
Проблема заключается в том, что на сервере для python-проекта невозможно подтянуть зависимости простой командой «pip install», так как доступа к каталогам пакетов типа PyPI просто нет - решение этой проблемы и описано в данной статье.
Вводные данные по серверу:
нет доступа в глобальный интернет;
нет доступа к Python Package Index и другим индексам;
есть доступ к локальному RHEL-репозиторию;
есть доступ к локальному Git;
Python и Git уже установлены на сервере.
В нашем распоряжении:
vm на Linux или Windows в открытом сегменте сети с доступом в интернет
ну и собственно сам сервер в изолированном сегменте
* данные между сервером и vm передавать можно
Файл requirements.txt
Если в вашем Python-проекте нет файла requirements, то его необходимо будет создать.
Файл requirements.txt представляет собой текстовый файл, используемый в Python-проектах для указания списка зависимостей и их версий.
Каждая строка в этом файле представляет одну зависимость и имеет формат имя_пакета==версия
, где имя_пакета
— это название библиотеки или пакета Python, а версия
— это желаемая версия этой зависимости.
Этот файл часто используется с инструментами управления пакетами, такими как pip, для автоматической установки и управления зависимостями проекта.
Файл requirements.txt в демонстрационном проекте:
netrnd-parser==1.0.428
pydantic[dotenv]
typer
requests
typing_extensions==4.5.0
urllib3==1.26.16
wheel==0.40.0
Клонирование проекта на offline-сервер
Отключим проверку SSL Сертификатов в git (опционально):
git config --global http.sslVerify false
Выполним клонирование git-репозитория проекта в домашний каталог сервера:
git clone https://company.ru/scm/nec/prefix_check.git
Cloning into 'prefix_check'...
Username: ********
Password: ********
После успешного клонирования в домашнем каталоге должна появиться директория с проектом:
ls -l
drwxrwxr-x. 5 smirnov-nk smirnov-nk 181 Jul 25 17:06 prefix_check
Подготовка архива с wheel-пакетами согласно requirements на online VM
Вариант с Linux VM
Важно чтобы на vm и сервере были установлены одинаковые версии python, в ином случае придется скачивать все пакеты с их зависимостями в ручном режиме.
Выполним клонирование репозитория:
git config --global http.sslVerify false
git clone https://company.ru/scm/nec/prefix_check.git
Создадим папку и, с помощью pip, скачаем туда все зависимости проекта согласно файлу requirements:
mkdir dwl
cd dwl
pip3.10 download -r ~/prefix_check/requirements.txt
описание опций
-r, --requirement <file>: Install from the given requirements file. This option can be used multiple times.
Соберем архим:
tar -czvf dwl.tar.gz ./*
Вариант с Windows VM
Важно чтобы на vm и сервере были установлены одинаковые версии python, в ином случае придется скачивать все пакеты с их зависимостями в ручном режиме.
Выполним клонирование репозитория:
git config --global http.sslVerify false
git clone https://stash.sigma.sbrf.ru/scm/nec/prefix_check.git
Создадим папку и, с помощью pip, скачаем туда все зависимости проекта согласно файлу requirements:
mkdir dwl
cd dwl
pip download -r ..\prefix_check\requirements.txt
Перечеркнутые пакеты предназначены для установки в Windows - их необходимо в ручном режиме заменить на пакеты для Linux:
C:\work\OUVP\dwl>dir Directory of C:\work\OUVP\dwl 07/27/2023 03:51 PM <DIR> . |
Необходимо скачать .whl файлы с сайта PyPI.
Результаты замены пакетов:
C:\work\OUVP\dwl>dir Directory of C:\work\OUVP\dwl 07/27/2023 04:12 PM <DIR> . |
Далее необходимо собрать архив.
Перенос архива на offline-сервер и установка зависимостей python-проекта
Распакуем перенесенный архив:
tar -xvf dwl.tar.gz ИЛИ unzip dwl.zip
Выполним установку зависимостей проекта согласно файлу requirements:
pip3.10 install -r ~/prefix_check/requirements.txt --no-index --find-links=~/dwl
описание опций
-r, --requirement <file>: Install from the given requirements file. This option can be used multiple times.
--no-index: Ignore package index (only looking at --find-links URLs instead).
-f, --find-links <url>: If a URL or path to an html file, then parse for links to archives such as sdist (.tar.gz) or wheel (.whl) files. If a local path or file:// URL that’s a directory, then look for archives in the directory listing. Links to VCS project URLs are not supported.
Все готово, теперь можно запускать проект в работу.
Другой вариант решения задачи для Linux VM c помощью виртуального окружения предложил в комментариях DaneSoul:
Можно использовать встроенную в Python функцию виртуального окружения:
На локальной машине создаем виртуальное окружение для проекта и устанавливаем пакеты в директорию .venv:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtКопируем .venv в директорию проекта на сервер, активируем там виртуальную среду, которая подключит модули и работаем.
Тут главное, под такой же системой локально устанавливать, чтобы пути совпали.
Или можно на сервере создать пустое виртуальное окружение с папкой, в ней будет ссылка на корректный серверный python:
python3 -m venv .venv
И уже сами модули с локального окружения скопировать туда.
Также спасибо kt97679, iig, hssergey за полезные комментарии.