3141 是什么
3141 是 Python 私有包索引工具 devpi 的默认端口:devpi-server 对外提供索引服务,内网 pip 通过它拉取依赖,同时它还能镜像上游 PyPI,在离线或受限网络中承担依赖分发。访问 http://host:3141 可以看到索引列表,其中常见的是作为公共源镜像使用的路径。
私有源的风险集中在上传通道
私有源的价值是可控与可缓存,风险同样集中在这里:如果允许匿名上传,供应链投毒只需要一个脚本,就能把与知名库同名的伪造包推到内网索引上,其他主机安装时静默中招。因此上传通道必须有账号与索引级权限隔离。
基本信息
| 服务 | devpi-server |
|---|---|
| 协议 | TCP 3141 |
| 用途 | 内网 PyPI 镜像与私有包托管 |
| 鉴权 | 用户与索引级权限,需显式配置 |
| 安全等级 | 仅内网研发网段 |
典型使用场景
- 为离线或受限网络提供依赖源,缓存上游包以减少外网依赖
- 托管企业内部的私有 Python 包,供构建与部署环境安装
- 排查依赖安装失败时确认索引地址与镜像同步状态
- 统一依赖来源,避免不同机器装到不一致的版本
- 资产核查时确认私有源是否对非研发网段开放
服务与索引检查
服务与索引检查
ss -lntp | grep 3141 # 确认监听地址
curl -s http://127.0.0.1:3141/ | head -c 200 # 查看索引首页
pip config list # 确认客户端实际使用的索引地址客户端与权限配置
客户端与权限配置
# ~/.pip/pip.conf 或 /etc/pip.conf
# [global]
# index-url = http://devpi.internal:3141/root/pypi/+simple/
# trusted-host = devpi.internal
# devpi 侧:创建独立上传账号与私有索引
# devpi user -c ci password=<口令>
# devpi index -c private bases=root/pypi常见路径含义
| 路径 | 含义 | 说明 |
|---|---|---|
| root/pypi | 上游镜像索引 | 代理公共源并缓存 |
| root/<索引名> | 私有索引 | 存放企业内部包 |
| +simple/ | 简单索引接口 | 包管理工具默认访问的路径 |
上传权限必须收敛到专用账号:允许匿名或研发共用一个账号上传,等于把依赖供应链交给所有能连到 3141 的主机,投毒后很难在安装日志里发现。
与构建缓存的关系
私有索引常与构建机或持续集成环境的本地缓存配合:命中缓存直接复用已下载的包,未命中才回源拉取并写入索引。缓存目录被清理或索引不可达时,构建会集体变慢甚至失败,排查时要先区分是哪一侧出了问题。
运维建议:给索引服务配置磁盘用量告警,定期核对上游镜像的同步状态;升级前先备份索引数据目录,恢复时只需把目录放回原位,不必重新下载全部依赖。