Pull to refresh

Деплой python-проекта на linux-сервере в изолированном сегменте сети

Level of difficultyEasy
Reading time6 min
Views6.7K

Предварительно замечу, что возможными решениями проблемы являются следующие варианты:

  • настройка прокси репозитория 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
Volume in drive C is OSDisk
Volume Serial Number is 1ED5-1624

Directory of C:\work\OUVP\dwl

07/27/2023 03:51 PM <DIR> .
07/27/2023 03:51 PM <DIR> ..
07/27/2023 03:51 PM 158,334 certifi-2023.7.22-py3-none-any.whl
07/27/2023 03:51 PM 96,919 charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl
07/27/2023 03:51 PM 97,909 click-8.1.6-py3-none-any.whl
07/27/2023 03:51 PM 25,335 colorama-0.4.6-py2.py3-none-any.whl
07/27/2023 03:51 PM 840,896 future-0.18.3.tar.gz
07/27/2023 03:51 PM 61,538 idna-3.4-py3-none-any.whl
07/27/2023 03:51 PM 1,896,631 netaddr-0.8.0-py2.py3-none-any.whl
07/27/2023 03:51 PM 395,526 netrnd_parser-1.0.428-py3-none-any.whl
07/27/2023 03:51 PM 197,477 orjson-3.8.0-cp310-none-win_amd64.whl
07/27/2023 03:51 PM 2,119,253 pydantic-1.9.0-cp310-cp310-win_amd64.whl
07/27/2023 03:51 PM 19,482 python_dotenv-1.0.0-py3-none-any.whl
07/27/2023 03:51 PM 62,574 requests-2.31.0-py3-none-any.whl
07/27/2023 03:51 PM 11,053 six-1.16.0-py2.py3-none-any.whl
07/27/2023 03:51 PM 44,712 textfsm-1.1.2-py2.py3-none-any.whl
07/27/2023 03:51 PM 45,861 typer-0.9.0-py3-none-any.whl
07/27/2023 03:51 PM 27,736 typing_extensions-4.5.0-py3-none-any.whl
07/27/2023 03:51 PM 143,106 urllib3-1.26.16-py2.py3-none-any.whl
07/27/2023 03:51 PM 64,545 wheel-0.40.0-py3-none-any.whl
18 File(s) 6,308,887 bytes
2 Dir(s) 20,226,334,720 bytes free

Необходимо скачать .whl файлы с сайта PyPI.

Результаты замены пакетов:

C:\work\OUVP\dwl>dir
Volume in drive C is OSDisk
Volume Serial Number is 1ED5-1624

Directory of C:\work\OUVP\dwl

07/27/2023 04:12 PM <DIR> .
07/27/2023 04:12 PM <DIR> ..
07/27/2023 03:51 PM 158,334 certifi-2023.7.22-py3-none-any.whl
07/27/2023 04:10 PM 201,819 charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
07/27/2023 03:51 PM 97,909 click-8.1.6-py3-none-any.whl
07/27/2023 03:51 PM 25,335 colorama-0.4.6-py2.py3-none-any.whl
07/27/2023 03:51 PM 840,896 future-0.18.3.tar.gz
07/27/2023 03:51 PM 61,538 idna-3.4-py3-none-any.whl
07/27/2023 03:51 PM 1,896,631 netaddr-0.8.0-py2.py3-none-any.whl
07/27/2023 03:51 PM 395,526 netrnd_parser-1.0.428-py3-none-any.whl
07/27/2023 04:10 PM 270,377 orjson-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
07/27/2023 04:11 PM 12,263,905 pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
07/27/2023 03:51 PM 19,482 python_dotenv-1.0.0-py3-none-any.whl
07/27/2023 03:51 PM 62,574 requests-2.31.0-py3-none-any.whl
07/27/2023 03:51 PM 11,053 six-1.16.0-py2.py3-none-any.whl
07/27/2023 03:51 PM 44,712 textfsm-1.1.2-py2.py3-none-any.whl
07/27/2023 03:51 PM 45,861 typer-0.9.0-py3-none-any.whl
07/27/2023 03:51 PM 27,736 typing_extensions-4.5.0-py3-none-any.whl
07/27/2023 03:51 PM 143,106 urllib3-1.26.16-py2.py3-none-any.whl
07/27/2023 03:51 PM 64,545 wheel-0.40.0-py3-none-any.whl
18 File(s) 16,631,339 bytes
2 Dir(s) 20,188,315,648 bytes free

Далее необходимо собрать архив.

Перенос архива на 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 за полезные комментарии.

Tags:
Hubs:
Total votes 6: ↑2 and ↓40
Comments42

Articles