Разворачиваем приватный pypi репозиторий с localshop

Время от времени, я пишу небольшие утилиты, библиотеки и приложения на python для себя, и не всегда я готов делится этими утилитами и библиотеками, но хотелось бы иметь возможность их удобно устанавливать, и желательно привычным pip в virtualenv. Для этого я довольно давно организовал себе локальный, приватный pypi сервер. Реализаций локальный pypi серверов довольно много, и я перепробовал их все. Большинство из них откровенно неработающие, другие безбожно глючат и падают от малейшего чиха. В конечном итоге для себя я выбрал localshop. В этом небольшом посте я расскажу как настроить локальный, приватный pypi репозиторий на localshop.

Для любителей docker: да, есть ardeois/docker-localshop. Можете поставить его сразу из docker hub, но мне docker не всегда подходит.

Ставим всё необходимое:

sudo apt-get install python-virtualenv python-dev nginx supervisor zlib1g-dev build-essential

На серверах я по прежнему использую исключительно Debian Stable, поэтому название пакетов актуально для данного дистрибутива. Для других название может быть иным.

Из под обычного пользователя создаём виртуальное окружение и активируем его:

cd /home/$USER
virtualenv localshop
cd localshop
source bin/activate
pip install localshop
localshop migrate

Настроим supervisor для запуска localshop. Создадим /etc/supervisor/conf.d/localshop.conf:

[program:localshop]
command=/home/$USER/localshop/bin/python /home/$USER/localshop/bin/gunicorn localshop.wsgi --bind 0.0.0.0:8001 --workers 2
directory=/home/$USER/localshop/
user=$USER
autostart=true
autorestart=true
redirect_stderr=true

[program:localshop-celery]
command=/home/$USER/localshop/bin/python /home/$USER/localshop/bin/localshop celery worker -B -E
directory=/home/$USER/localshop/
user=$USER
autostart=true
autorestart=true
redirect_stderr=true

Выше $USER нужно заменить на имя пользователя, под которым Вы развернули virtualenv с localshop.

Запустим:

sudo supervisorctl reread
sudo supervisorctl start localshop
sudo supervisorctl start localshop-celery

Теперь настроим nginx. Создадим /etc/nginx/sites-available/localshop:

upstream localshop {
    server 127.0.0.1:8001 fail_timeout=0;
}

server {
    listen 80;
    server_name .localshop.yourdomain.com;
    index index.html index.htm index.php;

    access_log off;

    location = /favicon.ico {
        allow all;
        log_not_found off;
        access_log off;
    }

    location /assets/ {
       alias /home/$USER/localshop/lib/python2.7/site-packages/localshop/static/;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        add_header Pragma "no-cache";
        proxy_pass http://localshop;
    }

}

В листинге выше $USER так же нужно заменить на пользователя в директории которого разместили виртуальную среду с localshop.
Активируем конфигурацию nginx:

sudo ln -s /etc/nginx/sites-available/localshop /etc/nginx/sites-enabled/
nginx -t
# Если ок, то перезапускаем чтобы применить
systemctl restart nginx

Скажем systemd запускать supervisor и nginx при старте системы:

sudo systemctl enable supervisor
sudo systemctl enable nginx

После этого заходим по адресу, по которому разместили localshop. В нашем примере - это http://localshop.yourdomain.com. Перед нам откроется главная страница localshop:

Далее в верхнем меню выбираем Permissions, затем CIDRs и нажимаем Create. На странице добавления необходимо добавить IP-Адрес, или сеть из которой будет доступна возможность добавлять пакеты. В моём случае это сеть 192.168.1.0/24. Обращаю внимание, что добавлять необходимо в CIDR нотации. Например, /24 в CIDR нотации - это маска 255.255.255.0. Подробнее можно почитать, например, на википедии.

После добавления:

В localshop в отличии от многих других приватных pypi можно каждому пользователю давать разные ключи для доступа, и при надобности отключить пользователя. Добавим один ключ. Для этого так же в меню выбираем Permissions, затем Credentials и нажимаем Create. Localshop автоматически сгенерирует ключ:

Пользователи имеющие доступ к самому localshop создаются отдельно. Для кого-то это может показаться неудобным, для себя же я нашёл это весьма удобным решением.

Теперь необходимо настроить pip таким образом, чтобы он позволял использовать наш приватный pypi вместе с основным.
Откроем файл ~/.pypirc расположенный в домашней директории пользователя, из под которого планируется использовать localshop, и приведем к примерно такому виду:

[distutils]
index-servers =
    pypi
    localshop

[pypi]
# Реквизиты от основого pypi сервера
username:testuser
password:testpassword

[localshop]
# Реквизиты для доступа к приватному localshop pypi серверу
username: 762a796df8dc4441910fd74d5ffb03e3
password: 7fcf080c3c0040a8a5b57c3fb39d12d5
repository: http://localshop.yourdomain.com/simple

Пользователя и пароль для localshop находятся на странице Credentials. Там же можно добавить ключ, если на ранних шагах не добавили.
Теперь можно скачивать и закачивать пакеты через наш приватный сервер:

pip install -i http://localshop.yourdomain.com/simple/ localshop

Но чтобы каждый раз не указывать его, можно назначить его используемым по-умолчанию. Для этого в домашней директории откройте файл: ~/.pip/pip.conf (создайте если его нет), и добавьте следующее:

[global]
index-url = http://:@localshop.yourdomain.com/simple

Где access_key - это Access Key со страницы Credentials, secret_key - secret key с той же страницы.


Понравилась статья? Поделись с друзьями!




Комментарии на этом сайте требуют включенного Javascript в вашем браузере. Вероятно, ваш браузер не поддерживает Javascript, или он был отключен по каким-то причинам. Если вы хотите прокомментировать пост, или просто почитать комментарии, то пожалуйста, включите Javascript или попробуйте открыть эту страницу другим браузером.