развернуть
Время от времени, я пишу небольшие утилиты, библиотеки и приложения на 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 с той же страницы.
https://the-bosha.ru/2016/03/21/razvorachivaem-lokalnyiy-pypi-s-localshop/