Деплой python-проект на linux-сервере с ограниченным доступом в интернет

af04c430f60d35a1bde4a93e3e224621.jpg

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

Задача

Необходимо выполнить деплой python-проекта со всеми его зависимостями из локального Git (Bitbucket) на сервер во внутреннем сегменте компании с ограниченным доступом в интернет.

Вводные данные по серверу:

  • нет доступа в глобальный интернет;

  • нет доступа к Python Package Index и другим индексам;

  • есть доступ к локальному RHEL-репозиторию;

  • есть доступ к локальному Git;

  • Python и Git уже установлены на сервере.

В нашем распоряжении:

* данные между сервером и pc/vm передавать можно

Клонирование проекта на 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

Подготовка архива с установочными файлами согласно requirements на online pc/vm

Вариант с Linux

Важно чтобы на pc/vm и сервере были установлены одинаковые OC и версии python,  в ином случае придется скачивать все пакеты с их зависимостями в ручном режиме.

Выполним клонирование репозитория:

git config --global http.sslVerify false
git clone https://company.ru/scm/nec/prefix_check.git

Создадим папку и скачаем туда все зависимости проекта согласно файлу requirements:

mkdir dwl
cd dwl
pip3.10 download -r ~/prefix_check/requirements.txt

-r,  --requirement 

Install from the given requirements file. This option can be used multiple times.

Соберем архим:

tar -czvf dwl.tar.gz ./*

Вариант с Windows

Важно чтобы на pc/vm и сервере были установлены одинаковые версии python, в ином случае придется скачивать все пакеты с их зависимостями в ручном режиме.

Выполним клонирование репозитория:

git config --global http.sslVerify false
git clone https://stash.sigma.sbrf.ru/scm/nec/prefix_check.git

Создадим папку и скачаем туда все зависимости проекта согласно файлу 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

.
07/27/2023 03:51 PM
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

.
07/27/2023 04:12 PM
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 

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 

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.

Все готово, теперь можно запускать проект в работу.

© Habrahabr.ru