pypi-server部署

前言

pypi-server是pip源的一款搭建方案,支持私有pip源分发和上传。官方文档见地址

安装

直接使用pip install pypiserver即可,但需注意pypi-server要求python3.6+。因此若仍然使用2.7的版本,则需先升级到3.下面以升级到3.7.3为例讲述,可跳过。

1
2
3
4
5
6
7
8
9
10
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
tar -xzvf Python-3.7.3.tgz
cd Python-3.7.3
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel libffi-devel#3.7依赖
./configure --prefix=/usr/local/python3#安装到local目录
make && make altinstall#编译
rm /usr/bin/python
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python
vi /usr/bin/yum,将#!/usr/bin/python 改为 #!/usr/bin/python2
vi /usr/libexec/urlgrabber-ext-down,将#!/usr/bin/python 改为 #!/usr/bin/python2

同时升级pip

1
2
3
4
5
vim ~/.bashrc
export PATH=/usr/local/python3/bin/:$PATH #添加环境变量,后续pip及其install的package才能生效
python -m pip install --upgrade pip
rm /usr/bin/pip
sudo ln -s /usr/local/python3/bin/pip /usr/bin/pip

添加密码授权

服务端

1
2
pip install passlib
htpasswd -sc htpasswd.txt <some_username>

填写用户名及密码,密码在客户端进行pip包上传和下载时需要。

客户端

1
2
3
4
5
6
7
8
9
10
vim ~/.pypirc

[distutils]
index-servers =
as

[as]
repository: https://pypi.svinvy.com
username:xxx
password:xxx

填写htpasswd创建时的账户及密码

后台常驻

pypi-server常驻方案官方推荐systemd和supervisor,supervisor不支持python3,这里采用systemd方案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cd /etc/systemd/system
vim pypi.service
#添加如下配置
Description=A minimal PyPI server for use with pip/easy_install.
After=network.target

[Service]
Type=simple
# systemd requires absolute path here too.
PIDFile=/var/run/pypiserver.pid
User=xxx

ExecStart=/usr/local/python3/bin/pypi-server -p 8000 --log-file /var/log/pypiserver.log -P /path/to/htpasswd.txt /path/to/store/packages
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Restart=always

WorkingDirectory=/var/www/pypi

TimeoutStartSec=3
RestartSec=5

[Install]
WantedBy=multi-user.target

启动服务

1
2
systemctl start pypi
systemctl status pypi#查看服务状态是否正常

若启动失败使用journalctl -u,shift+g跳转到日志末尾查看具体日志.

主要是设定好监听端口,如这里单独8000,以及packages存储目录。

使用nginx作反向代理

监听80端口重定向到443,在443配置里转发到pypi-server的8000端口(其它端口同理)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
upstream pypi {
server localhost:8000;
}

server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
server_name pypi.svinvy.com;

location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://pypi;
}

ssl_certificate /xxx;
ssl_certificate_key /xxx;
}

这里重新启用了一个二级域名pypi.svinvy.com,同样需添加域名解析+ssl证书更新。

pip包上传

pip包可使用setup tool或twine上传,这里以twine为例.若无安装twine,则先安装

1
pip install twine

创建pip包,主要是LICENSE、init.py、pyprobject.toml以及readme.md等几个文件不可缺失,在__init__.py将package内模块导出。参考目录如下

  • PYTHON
    • asmodule
      • dist
      • init.py
      • LICENSE
      • xxx.py
      • pyproject.toml
      • readme.md

build pip包,注意需使用-m,限定起始路径。最后输出dist目录。

1
2
cd path/to/your/pip/sources code
python -m build

上传

1
twine upload dist/*

若绕过了”添加密码授权”操作,则这里会报403