内网python 仓库_使用 pypiserver 快速搭建内网离线 pypi 仓库实践

前言

本文介绍了如何快速搭建一个 pypiserver,通过自建 pypiserver,我们可以解决网络环境不好,或者离线无法安装 python 包的问题。如果结合最新的 GitLab CI/CD 和 pipenv 我相信各位还可以玩出更多的花样。

pypiserver - minimal PyPI server for use with pip/easy_install

更新记录

2018 年 04 月 12 日 - 初稿

扩展阅读

pypiserver 简介

pypiserver is a minimal PyPI compatible server for pip or easy_install. It is based on bottle and serves packages from regular directories. Wheels, bdists, eggs and accompanying PGP-signatures can be uploaded either with pip, setuptools, twine, pypi-uploader, or simply copied with scp.

pypiserver 服务端配置

如果你的 Linux 环境缺少 Python 2.7 可以参考我的文章直接离线升级至最新版本

pypiserver > 1.2.x works with python 2.7 and 3.3+ or pypy. Older python-versions may still work, but they are not tested. For legacy python versions, use pypiserver-1.1.x series.

# 替换 pip 为阿里云,感概豆瓣的时代已经过去

tee ~/.pip/pip.conf <

[global]

index-url = https://mirrors.aliyun.com/pypi/simple/

[install]

trusted-host= mirrors.aliyun.com

EOF

# 直接在线安装 pypiserver

pip install pypiserver

# 离线下载 pypiserver

mkdir /tmp/pypiserver

pip install -d /tmp/pypiserver/ pypiserver

# Copy packages into this directory.

mkdir ~/packages

# Copy some packages into your ~/packages folder and then get your pypiserver up and running:

pypi-server -p 8080 ~/packages &

pypiserver 客户端配置

## Download and Install hosted packages.

pip install --extra-index-url http://localhost:8080/simple/ ...

# or

pip install --extra-index-url http://localhost:8080

## Search hosted packages

pip search --index http://localhost:8080 ...

# 个人推荐的配置

tee ~/.pip/pip.conf <

[global]

index-url = http://172.28.70.126/simple

extra-index-url = https://mirrors.aliyun.com/pypi/simple/

[install]

trusted-host = 172.28.70.126

EOF

pypiserver 进阶配置

pypiserver Running as a systemd service

Adjusting the paths and adding this file as pypiserver.service into your systemd/system directory will allow management of the pypiserver process with systemctl, e.g. systemctl start pypiserver.

# 安装需要的包

yum install nginx -y

pip install passlib pypiserver gunicorn

# 创建 pypiserver 服务方便服务启停管理

tee /usr/lib/systemd/system/pypiserver.service <

[Unit]

Description=gunicorn daemon

After=network.target

[Service]

PIDFile=/run/pypiserver.pid

ExecStart=/usr/local/bin/gunicorn -w16 \

--pid /run/pypiserver.pid \

-b :10012 \

'pypiserver:app(root="/var/www/pypi")'

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s TERM $MAINPID

[Install]

WantedBy=multi-user.target

EOF

# Warning: pypiserver.service changed on disk. Run 'systemctl daemon-reload' to reload units.

systemctl daemon-reload

# 启动 pypiserver 服务

systemctl enable pypiserver.service

systemctl start pypiserver.service

systemctl status pypiserver.service

# 停止 pypiserver 服务

systemctl disable pypiserver.service

systemctl stop pypiserver.service

systemctl status pypiserver.service

[[email protected] run]# systemctl status pypiserver.service

● pypiserver.service - gunicorn daemon

Loaded: loaded (/usr/lib/systemd/system/pypiserver.service; disabled; vendor preset: disabled)

Active: active (running) since Fri 2018-04-13 15:14:08 CST; 859ms ago

Main PID: 22524 (gunicorn)

CGroup: /system.slice/pypiserver.service

├─22524 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22530 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22531 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22532 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22533 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22534 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22535 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22536 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22537 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22538 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

├─22539 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

└─22540 /usr/local/bin/python /usr/local/bin/gunicorn -w16 --pid /run/pypiserver.pid -b :10012 pypiserver:app(root="/var/www/pypi")

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22531] [INFO] Booting worker with pid: 22531

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22532] [INFO] Booting worker with pid: 22532

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22533] [INFO] Booting worker with pid: 22533

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22534] [INFO] Booting worker with pid: 22534

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22535] [INFO] Booting worker with pid: 22535

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22536] [INFO] Booting worker with pid: 22536

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22537] [INFO] Booting worker with pid: 22537

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22538] [INFO] Booting worker with pid: 22538

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22539] [INFO] Booting worker with pid: 22539

Apr 13 15:14:08 centos7 gunicorn[22524]: [2018-04-13 15:14:08 +0000] [22540] [INFO] Booting worker with pid: 22540

[[email protected] run]# netstat -tnlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd

tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1517/dnsmasq

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 977/sshd

tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 978/cupsd

tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1383/master

tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 19378/sshd: [email protected]

tcp 0 0 0.0.0.0:10012 0.0.0.0:* LISTEN 22524/python

tcp6 0 0 :::111 :::* LISTEN 1/systemd

tcp6 0 0 :::22 :::* LISTEN 977/sshd

tcp6 0 0 ::1:631 :::* LISTEN 978/cupsd

tcp6 0 0 ::1:25 :::* LISTEN 1383/master

tcp6 0 0 ::1:6011 :::* LISTEN 19378/sshd: [email protected]

# 检查 pypiserver 服务

cd /var/www/pypi

# 向仓库中添加 python package

[[email protected] pypi]# pip download pypiserver

Collecting pypiserver

Downloading https://mirrors.aliyun.com/pypi/packages/d7/78/5772432dad2b9e754ab92f4d301fa507069b9decc8c943c1b18c2043ff4f/pypiserver-1.2.1-py2.py3-none-any.whl (83kB)

100% |████████████████████████████████| 92kB 643kB/s

Saved ./pypiserver-1.2.1-py2.py3-none-any.whl

Successfully downloaded pypiserver

[[email protected] pypi]# ll

total 84

-rw-r--r-- 1 root root 83529 Apr 13 14:55 pypiserver-1.2.1-py2.py3-none-any.whl

# 搜索刚才下载的 package

[[email protected] pypi]# pip search -i http://127.0.0.1:10012 pypiserver

pypiserver (1.2.1) - 1.2.1

INSTALLED: 1.2.1 (latest)

# 配置 nginx 做反向代理

tee /etc/nginx/conf.d/pypi.conf <

upstream pypiserver {

server 127.0.0.1:10012;

}

server {

listen 10087;

# disable any limits to avoid HTTP 413 for large package uploads

client_max_body_size 0;

location / {

proxy_pass http://pypiserver/;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# When setting up pypiserver behind other proxy, such as an Nginx instance, remove the below line if the proxy already has similar settings.

proxy_set_header X-Forwarded-Proto $scheme;

proxy_buffering off;

proxy_request_buffering off;

}

location /packages/ {

alias /var/www/pypi; # static file

}

}

EOF

# 启动 nginx

systemctl enable nginx

systemctl start nginx

systemctl status nginx

# 检查 nginx 服务

pip search -i http://172.28.79.126:10087 pypiserver

pypiserver (1.2.1) - 1.2.1

INSTALLED: 1.2.1 (latest)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能和自主系统在美军联合职能中的应用

来源&#xff1a;知远战略与防务研究所【知远导读】随着人工智能/自主系统技术的快速发展及其在军事领域的持续应用&#xff0c;智能化、无人化日渐成为未来战争的发展方向。美国作为世界军事发展潮流的引领者&#xff0c;正在积极探索人工智能/自主系统与联合部队作战职能的融…

oracle磁带的使用期限,rman删除磁带库过期备份问题

RMAN> show all;使用目标数据库控制文件替代恢复目录db_unique_name 为 ORCL 的数据库的 RMAN 配置参数为:CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # defaultCONFIGURE BACKUP OPTIMIZATION ON;CONFIGURE DEFAULT DEVICE TYPE TO DISK; # defaultCONFIGURE CONTROLFIL…

(转载)spring配置hibernate 事务。

Spring和Hibernate整合后&#xff0c;通过Hibernate API进行数据库操作时发现每次都要opensession&#xff0c;close&#xff0c;beginTransaction&#xff0c;commit&#xff0c;这些都是重复的工作&#xff0c;我们可以把事务管理部分交给spring框架完成。 配置事务&#xff…

oracle怎么把整形,【用bbed工具对Oracle进行微整形】

CUUG ORACLE大师网络免费课程——将个人姓名、电话发送到SIGNUPCUUG.COM即可报名CUUG新增“即时同步互动远程授课”&#xff0c;足不出户学ORACLE!详情见&#xff1a;HTTP://ORACLE.CUUG.COM/DBA1.HTML2013韩国小姐选美比赛佳丽样貌神似&#xff0c;难以分辨&#xff0c;无论是…

这篇长达165页的论文,用一个里程碑式的证明同时解决了量子物理学和理论数学的难题...

来源&#xff1a;机器之心计算机科学、数学、物理学&#xff0c;这三个学科各自的一些重大难题在近日发布的一篇标题简洁的论文《MIP*RE》中同时得到了解答。在该论文中&#xff0c;五位计算机科学家为可通过计算方式验证的知识确立了一个新的边界。基于此&#xff0c;他们又为…

mysql timestamp 不走索引_面试 - 要不简单聊一下你对MySQL索引的理解?

MySQL索引&#xff1f;这玩意儿还能简单聊&#xff1f;明显是在挖坑&#xff0c;幸好老夫早有准备&#xff0c;切听我一一道来。 一、索引是什么?索引是帮助MySQL高效获取数据的数据结构。二、索引能干什么?索引非常关键&#xff0c;尤其是当表中的数据量越来越大时&#xff…

redis 类型、方法

之前使用redis&#xff0c;现在对所有redis方法做一个总结&#xff1b; string类型 形式&#xff1a;key>value; 说明&#xff1a;最简单的类型&#xff1b;一个key对应一个value&#xff0c;value保存的类型是二进制安全的&#xff0c;string可以包含任何数据&#xff0c;比…

亚马逊首家“无人超市”系统存在bug?!开业当天,记者中途换装成功骗过摄像头...

来源&#xff1a;大数据文摘2018年&#xff0c;亚马逊推出了无人便利店Amazon Go&#xff0c;本着“无需排队、拿完就走”的理念在当时掀起了一番热潮。两年后&#xff0c;亚马逊“无人购物”升级&#xff0c;又在西雅图开设了“Plus版无人超市”Amazon Go Grocery&#xff08;…

oracle的一些常使用命令,Oracle 经常使用命令小结

项目自动化建构工具gradle 入门3——生一个exe的helloWorld前两次呢,我们能够用一个外部的jar 来实现输出helloWorld.但问题是我每次都要用java -jar 来执行,这样我们自己玩还可以,让用户玩就不好了.所以我们生成一个exe给他们吧.这次我们仍 ...LGLCalender &lpar;价格日历…

创新是低情商的人做的

评语&#xff1a;这时一个有趣的思考&#xff0c;不算是正式的研究&#xff0c;但可以算是有价值的科学火花&#xff0c;创新本身或许就是得罪人的事情&#xff0c;或者要推翻别人的观点&#xff0c;引起他人不高兴&#xff0c;或者他人有不同意见&#xff0c;要争论和辩解&…

【12.23】转行小白历险记-算法02

不会算法的小白不是好小白&#xff0c;可恶还有什么可以难倒我这个美女的&#xff0c;不做花瓶第二天&#xff01; 一、螺旋矩阵 59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 1.核心思路&#xff1a;确定循环的路线&#xff0c;左闭右开循环&#xff0c;思路简…

MySQL 5.7.18 解压版安装

原文链接&#xff1a;https://my.oschina.net/u/3474266/blog/895696 我在安装免安装版的5.7.18的时候出现了问题&#xff0c;正好找到这个&#xff0c;十分感激 今天下载安装了MySQL Community Edition 5.7.18压缩版&#xff0c;过程中遇到了一些坑&#xff0c;特地写个博客记…

订单失效怎么做的_?糟了,刚发货的订单竟然被取消掉了?我该怎么办!

“叮叮&#xff01;您的Newegg国际商城有新订单啦&#xff0c;请及时查看&#xff01;”又来新订单了&#xff0c;赶紧打包发货&#xff01;可是三天后……“尊敬的商家您好&#xff0c;您的订单超过72 小时未发货&#xff0c;系统已经自动取消该订单”。什么&#xff1f;订单被…

oracle segment extent block,Oracle的基础问题segment extent block

l extent和segment的关系每个extent 的Oracle block 的数目是由extent的巨细/DB_BLOCK_SIZE 确定的,extent 巨细是由建立或修改segment 的SQL 语句中storage子句中的initial, next, pctincrease等参数确定。每个segment中的extent的数目是一个动态扩展的值, 最大值由建立或修改…

6G概念及愿景白皮书

来源&#xff1a;中国指挥与控制学会“本白皮书将从6G愿景、6G应用场景、6G网络性能指标、6G潜在关键技术、国际组织和各国6G研究进展等方面展开讨论&#xff0c;并提出加快推进我国6G研发的相关建议。”编写 | 赛迪智库无线电管理研究所 执笔 | 彭健 孙美玉 滕学强目录一、前言…

git编译安装与常见问题解决

1. 先去官网下载一个安装包 &#xff0c;假设目录/APP/ido2. cd /APP/ido3. tar -zxvf git-2.7.2.tar.gz4. 安装依赖yum -y install gcc openssl openssl-devel curl curl-devel unzip perl perl-devel expat expat-devel zlib zlib-devel asciidoc xmlto gettext-devel openss…

如何判断python固定文件存在吗_Python判断文件和文件夹是否存在的方法

这篇文章主要介绍了Python判断文件和文件夹是否存在的方法,本文还讲解了判断是否为文件或者目录的方法、os.path.lexist的作用、FTP中判断文件或目录是否存在等内容,需要的朋友可以参考下一、python判断文件和文件夹是否存在、创建文件夹代码如下:>>> import os>&g…

oracle rman和数据泵,使用RMAN或数据泵初始化OGG目标库

OGG 10引入新token变量LOGCSN&#xff0c;对应于oracle的scn&#xff0c;对此replicat可以指定开始csnStart replicat atcsn | aftercsn准备阶段同步前需确保源库的事务都已提交&#xff0c;应反复检查gv$transaction&#xff1b;对于无法终止的事务&#xff0c;从其起始时间执…

哺乳动物亚种在物种进化中至关重要

查尔斯达尔文的《物种起源》一书来源&#xff1a;科技日报 图片来源&#xff1a;物理学家组织网据物理学家组织网18日报道&#xff0c;查尔斯达尔文逝世约140年后&#xff0c;其进化论的一个理论终获证实&#xff01;英国剑桥大学科学家在18日出版的《英国皇家学会学报B卷》上撰…

window挂载到linux服务器上,在windows 7操作系统下设置挂载Linux服务器

在Windows 7操作系统下增加了很多有用的功能&#xff0c;只是默认没有开启而已&#xff0c;今天简述下一个Windows 7下的NFS功能&#xff0c;通过这个功能&#xff0c;可以让Windows 7共享Linux下面的磁盘分区或者目录数据&#xff0c;这个功能原理只能通过samba或者ftp来实现&…