Разворачиваем приватный 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 с той же страницы.