nome | descrição |
---|---|
Versão | 2.2.0 |
Data: | 2024-09-15 |
Fonte | https://github.com/pypiserver/pypiserver |
Pypi | https://pypi.org/project/pypiserver/ |
Testes | https://github.com/pypiserver/pypiserver/actions |
Mantenedores | @ankostis , @mplanchard , @dee-me-tree-or-love , @pawamoy , alguém novo? Estamos abertos para novos mantenedores! #397 |
Licença | zlib/libpng + mit |
Comunidade | https://pypiserver.zulipchat.com |
Dica
Alcance em discussões ou converse conosco no zulip
O Pypiserver é um servidor compatível com Pypi mínimo para pip ou easy_install . É baseado em garrafas e serve pacotes de diretórios regulares. Rodas, BDists, ovos e assinaturas de PGP que acompanham podem ser carregadas com PIP , SetupTools , barbante , pypi-uploader ou simplesmente copiado com SCP .
Observação
O software oficial alimentando o Pypi é o armazém. No entanto, o armazém é bastante especializado para ser o próprio software do Pypi.org e não deve ser usado em outros contextos. Em particular, ele não suporta oficialmente ser usado como um índice de embalagem personalizado por usuários que desejam servir seus próprios pacotes.
O Pypiserver implementa as mesmas interfaces que o Pypi, permitindo que ferramentas padrão de embalagem Python, como PIP e Twine, interajam com ele como um índice de embalagem, exatamente como fariam com o PYPI, tornando muito mais fácil obter um servidor de índice em execução.
Índice
O Pypiserver trabalha com Python 3.6+ e Pypy3.
As versões mais antigas do Python ainda podem funcionar, mas não são testadas.
Para versões Legacy Python, use a série Pypiserver-1.x . Observe que estes não são oficialmente suportados e não receberão bugs ou novos recursos.
Dica
Os comandos abaixo funcionam em um sistema operacional do tipo UNIX com um shell POSIX. O caractere '~' se expande para o diretório inicial do usuário.
Se você estiver usando o Windows, você terá que usar os "contrapartes do Windows". O mesmo vale para o restante desta documentação.
Instale o Pypiserver com este comando
pip install pypiserver # Or: pypiserver[passlib,cache]
mkdir ~ /packages # Copy packages into this directory.
[! Tip] Veja também métodos alternativos de instalação
Copie alguns pacotes na sua pasta ~/pacotes e depois coloque seu Pypiserver em funcionamento
pypi-server run -p 8080 ~ /packages & # Will listen to all IPs.
Do computador cliente, digite isso
# 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 ...
# Note that pip search does not currently work with the /simple/ endpoint.
[! Tip] Veja também configurações do lado do cliente para evitar a digitação tediosa.
Digite Pypi-Server -H na linha CMD para imprimir uma mensagem de uso detalhada
usage: pypi-server [-h] [-v] [--log-file FILE] [--log-stream STREAM]
[--log-frmt FORMAT] [--hash-algo HASH_ALGO]
[--backend {auto,simple-dir,cached-dir}] [--version]
{run,update} ...
start PyPI compatible package server serving packages from PACKAGES_DIRECTORY. If PACKAGES_DIRECTORY is not given on the command line, it uses the default ~/packages. pypiserver scans this directory recursively for packages. It skips packages and directories starting with a dot. Multiple package directories may be specified.
positional arguments:
{run,update}
run Run pypiserver, serving packages from
PACKAGES_DIRECTORY
update Handle updates of packages managed by pypiserver. By
default, a pip command to update the packages is
printed to stdout for introspection or pipelining. See
the `-x` option for updating packages directly.
optional arguments:
-h, --help show this help message and exit
-v, --verbose Enable verbose logging; repeat for more verbosity.
--log-file FILE Write logging info into this FILE, as well as to
stdout or stderr, if configured.
--log-stream STREAM Log messages to the specified STREAM. Valid values are
stdout, stderr, and none
--log-frmt FORMAT The logging format-string. (see `logging.LogRecord`
class from standard python library)
--hash-algo HASH_ALGO
Any `hashlib` available algorithm to use for
generating fragments on package links. Can be disabled
with one of (0, no, off, false).
--backend {auto,simple-dir,cached-dir}
A backend implementation. Keep the default 'auto' to
automatically determine whether to activate caching or
not
--version show program's version number and exit
Visit https://github.com/pypiserver/pypiserver for more information
Digite Pypi-Server Run -h na linha CMD para imprimir um uso detalhado
usage: pypi-server run [-h] [-v] [--log-file FILE] [--log-stream STREAM]
[--log-frmt FORMAT] [--hash-algo HASH_ALGO]
[--backend {auto,simple-dir,cached-dir}] [--version]
[-p PORT] [-i HOST] [-a AUTHENTICATE]
[-P PASSWORD_FILE] [--disable-fallback]
[--fallback-url FALLBACK_URL]
[--health-endpoint HEALTH_ENDPOINT] [--server METHOD]
[-o] [--welcome HTML_FILE] [--cache-control AGE]
[--log-req-frmt FORMAT] [--log-res-frmt FORMAT]
[--log-err-frmt FORMAT]
[package_directory [package_directory ...]]
positional arguments:
package_directory The directory from which to serve packages.
optional arguments:
-h, --help show this help message and exit
-v, --verbose Enable verbose logging; repeat for more verbosity.
--log-file FILE Write logging info into this FILE, as well as to
stdout or stderr, if configured.
--log-stream STREAM Log messages to the specified STREAM. Valid values are
stdout, stderr, and none
--log-frmt FORMAT The logging format-string. (see `logging.LogRecord`
class from standard python library)
--hash-algo HASH_ALGO
Any `hashlib` available algorithm to use for
generating fragments on package links. Can be disabled
with one of (0, no, off, false).
--backend {auto,simple-dir,cached-dir}
A backend implementation. Keep the default 'auto' to
automatically determine whether to activate caching or
not
--version show program's version number and exit
-p PORT, --port PORT Listen on port PORT (default: 8080)
-i HOST, -H HOST, --interface HOST, --host HOST
Listen on interface INTERFACE (default: 0.0.0.0)
-a AUTHENTICATE, --authenticate AUTHENTICATE
Comma-separated list of (case-insensitive) actions to
authenticate (options: download, list, update;
default: update).
Any actions not specified are not authenticated, so
to authenticate downloads and updates, but allow
unauthenticated viewing of the package list, you would
use:
pypi-server -a 'download, update' -P
./my_passwords.htaccess
To disable authentication, use:
pypi-server -a . -P .
See the `-P` option for configuring users and
passwords.
Note that when uploads are not protected, the
`register` command is not necessary, but `~/.pypirc`
still needs username and password fields, even if
bogus.
-P PASSWORD_FILE, --passwords PASSWORD_FILE
Use an apache htpasswd file PASSWORD_FILE to set
usernames and passwords for authentication.
To allow unauthorized access, use:
pypi-server -a . -P .
--disable-fallback Disable the default redirect to PyPI for packages not
found in the local index.
--fallback-url FALLBACK_URL
Redirect to FALLBACK_URL for packages not found in the
local index.
--health-endpoint HEALTH_ENDPOINT
Configure a custom liveness endpoint. It always
returns 200 Ok if the service is up. Otherwise, it
means that the service is not responsive.
--server METHOD Use METHOD to run the server. Valid values include
paste, cherrypy, twisted, gunicorn, gevent, wsgiref,
and auto. The default is to use "auto", which chooses
one of paste, cherrypy, twisted, or wsgiref.
-o, --overwrite Allow overwriting existing package files during
upload.
--welcome HTML_FILE Use the contents of HTML_FILE as a custom welcome
message on the home page.
--cache-control AGE Add "Cache-Control: max-age=AGE" header to package
downloads. Pip 6+ requires this for caching.AGE is
specified in seconds.
--log-req-frmt FORMAT
A format-string selecting Http-Request properties to
log; set to '%s' to see them all.
--log-res-frmt FORMAT
A format-string selecting Http-Response properties to
log; set to '%s' to see them all.
--log-err-frmt FORMAT
A format-string selecting Http-Error properties to
log; set to '%s' to see them all.
Mais detalhes sobre a atualização do Pypi-Server
usage: pypi-server update [-h] [-v] [--log-file FILE] [--log-stream STREAM]
[--log-frmt FORMAT] [--hash-algo HASH_ALGO]
[--backend {auto,simple-dir,cached-dir}] [--version]
[-x] [-d DOWNLOAD_DIRECTORY] [-u]
[--blacklist-file IGNORELIST_FILE]
[package_directory [package_directory ...]]
positional arguments:
package_directory The directory from which to serve packages.
optional arguments:
-h, --help show this help message and exit
-v, --verbose Enable verbose logging; repeat for more verbosity.
--log-file FILE Write logging info into this FILE, as well as to
stdout or stderr, if configured.
--log-stream STREAM Log messages to the specified STREAM. Valid values are
stdout, stderr, and none
--log-frmt FORMAT The logging format-string. (see `logging.LogRecord`
class from standard python library)
--hash-algo HASH_ALGO
Any `hashlib` available algorithm to use for
generating fragments on package links. Can be disabled
with one of (0, no, off, false).
--backend {auto,simple-dir,cached-dir}
A backend implementation. Keep the default 'auto' to
automatically determine whether to activate caching or
not
--version show program's version number and exit
-x, --execute Execute the pip commands rather than printing to
stdout
-d DOWNLOAD_DIRECTORY, --download-directory DOWNLOAD_DIRECTORY
Specify a directory where packages updates will be
downloaded. The default behavior is to use the
directory which contains the package being updated.
-u, --allow-unstable Allow updating to unstable versions (alpha, beta, rc,
dev, etc.)
--blacklist-file IGNORELIST_FILE, --ignorelist-file IGNORELIST_FILE
Don't update packages listed in this file (one package
name per line, without versions, '#' comments
honored). This can be useful if you upload private
packages into pypiserver, but also keep a mirror of
public packages that you regularly update. Attempting
to pull an update of a private package from `pypi.org`
might pose a security risk - e.g. a malicious user
might publish a higher version of the private package,
containing arbitrary code.
Sempre especificar o URL do PYPI na linha de comando é um pouco pesado. Como o Pypiserver redireciona o PIP/easy_install para o índice Pypi.org se ele não tiver um pacote solicitado, é uma boa ideia configurá -los para sempre usar o índice PyPI local.
Para o comando pip , isso pode ser feito definindo a variável de ambiente pip_extra_index_url no seu .bashr/.profile/.zshrc
export PIP_EXTRA_INDEX_URL=http://localhost:8080/simple/
ou adicionando as seguintes linhas a ~/.pip/pip.conf
[global]
extra-index-url = http://localhost:8080/simple/
Observação
Se você instalou o Pypiserver em um URL remoto sem HTTPS, receberá um aviso "não confiável" da PIP , pedindo que você acabe com a opção --conflito-host . Você também pode incluir esta opção permanentemente em seus arquivos de configuração ou variáveis de ambiente.
Para o comando easy_install , você pode definir a seguinte configuração em ~/.pydistutils.cfg
[easy_install]
index_url = http://localhost:8080/simple/
Em vez de copiar pacotes diretamente para a pasta do servidor (ou seja, com SCP ), você pode usar as ferramentas Python para a tarefa, por exemplo, python setup.py upload . Nesse caso, o Pypiserver é responsável por autenticar as solicitações de upload.
Observação
Aconselhamos fortemente a senha de proteger seus uploads!
É possível desativar a autenticação para uploads (por exemplo, em intranets). Para evitar decisões de segurança preguiçosas, leia a ajuda para opções -p e -a .
Primeiro, verifique se você tem o módulo Passlib instalado (observe que é necessário passlib> = 1.6 ), necessário para analisar o arquivo Apache htpasswd especificado pela opção -p , - -passwords (consulte as próximas etapas)
pip install passlib
Crie o arquivo Apache Htpasswd com pelo menos um par de usuário/senha com este comando (você será solicitado a uma senha)
htpasswd -sc htpasswd.txt < some_username >
Dica
Leia essa pergunta para executar htpasswd
cmd no Windows ou se você tiver senhas falsas que não se importa porque elas são para um serviço interno (que ainda é "ruim", de uma perspectiva de segurança ...) Você pode usar este público serviço
Dica
Ao acessar o Pypiserver por meio da API, métodos de autenticação alternativos estão disponíveis no sinalizador de configuração de autmer . Qualquer retorno chamável de um booleano pode ser passado para a configuração do Pypiserver para fornecer autenticação personalizada. Por exemplo, para configurar o Pypiserver para autenticar usando o python-pam
import pam
pypiserver.default_config(auther=pam.authenticate)
Consulte Using Ad-hoc authentication providers
para obter mais informações.
Você precisa reiniciar o servidor com a opção -p apenas uma vez (mas os pares de usuário/senha podem ser adicionados posteriormente ou atualizados na mosca)
./pypi-server run -p 8080 -P htpasswd.txt ~ /packages &
No lado do cliente, edite ou crie um arquivo ~/.pypirc com um conteúdo semelhante:
[distutils]
index-servers =
pypi
local
[pypi]
username: < your_pypi_username >
password: < your_pypi_passwd >
[local]
repository: http://localhost:8080
username: < some_username >
password: < some_passwd >
Então, de dentro do diretório do Projeto Python que você deseja fazer upload, emitir este comando:
python setup.py sdist upload -r local
Para evitar armazenar senhas no disco, em texto claro, você pode:
Use o comando do Register setEptupols com a opção -r , como essa
python setup.py sdist register -r local upload -r local
Use Biblioteca Twine , que quebra o procedimento em duas etapas. Além disso, ele suporta assinar seus arquivos com assinaturas PGP e fazer upload dos arquivos .asc gerados para Pypiserver ::
twine upload -r local --sign -identity user_name ./foo-1.zip
Começando com a versão 1.2.5, as imagens oficiais do Docker serão construídas para cada push to main
, cada dev, alfa ou versão beta e cada versão final. A versão completa mais recente estará sempre disponível sob a tag mais recente , e a filial main
atual estará sempre disponível sob a tag instável .
Você sempre pode verificar para ver quais tags estão disponíveis atualmente em nosso repositório do Docker .
Para executar o lançamento mais recente do Pypiserver com o Docker, simplesmente
docker run pypiserver/pypiserver:latest run
Isso inicia os pacotes de servir Pypiserver no diretório /Data /Packages dentro do contêiner, ouvindo a porta 8080 do contêiner.
O contêiner leva os mesmos argumentos que o executável normal do Pypi -Server , com exceção da porta interna do contêiner ( -P ), que sempre será 8080.
Obviamente, apenas administrar um contêiner não é tão interessante. Para mapear a porta 80 no host da porta 8080 no contêiner ::
docker run -p 80:8080 pypiserver/pypiserver:latest run
Agora você pode acessar seu Pypiserver no localhost: 80 em um navegador da web.
Para servir pacotes de um diretório no host, por exemplo ,/pacotes
docker run -p 80:8080 -v ~ /packages:/data/packages pypiserver/pypiserver:latest run
Para se autenticar contra um arquivo .htpasswd local ::
docker run -p 80:8080 -v ~ /.htpasswd:/data/.htpasswd pypiserver/pypiserver:latest run -P .htpasswd packages
Você também pode especificar o Pypiserver para ser executado como um serviço do Docker usando um ComposeFile. Um exemplo de composição é fornecido como docker-compose.yaml
Ao tentar os métodos abaixo, primeiro use o comando a seguir para verificar se as versões anteriores do Pypiserver já existem e (opcionalmente) desinstalá -las ::
# VERSION-CHECK: Fails if not installed.
pypi-server --version
# UNINSTALL: Invoke again until it fails.
pip uninstall pypiserver
Caso a versão mais recente do Pypi seja um pré-lançamento, você deve usar a opção PiP do PIP . E para atualizar uma instalação existente, combine-a com --ignore-installed
pip install pypiserver --pre -I
Você pode até instalar o Pypiserver mais recente diretamente do GitHub com o seguinte comando, supondo que você tenha instalado no seu caminho
pip install git+git://github.com/pypiserver/pypiserver.git
O comando Pypi-Server possui o comando de atualização que procura atualizações dos pacotes disponíveis. Ele digitaliza o diretório de pacotes em busca de pacotes disponíveis e pesquisas no Pypi.org em busca de atualizações. Sem opções adicionais, a atualização do Pypi-Server apenas imprimirá uma lista de comandos que devem ser executados para obter a versão mais recente de cada pacote. A saída se parece:
$ ./pypi-server update
checking 106 packages for newer version
.........u.e...........e..u.............
.....e..............................e...
..........................
no releases found on pypi for PyXML, Pymacs, mercurial, setuptools
# update raven from 1.4.3 to 1.4.4
pip -q install --no-deps --extra-index-url https://pypi.org/simple/ -d /home/ralf/packages/mirror raven==1.4.4
# update greenlet from 0.3.3 to 0.3.4
pip -q install --no-deps --extra-index-url https://pypi.org/simple/ -d /home/ralf/packages/mirror greenlet==0.3.4
Primeiro, ele imprime para cada pacote um único caractere depois de verificar as versões disponíveis no Pypi. Um ponto (.) Significa que o pacote está atualizado, 'u' significa que o pacote pode ser atualizado e 'e' significa que a lista de lançamentos no Pypi está vazia. Depois disso, mostra uma linha de comando PIP que pode ser usada para atualizar um pacote único. Copie e cole isso ou execute o Pypi -Server Update -x para realmente executar esses comandos. Você precisa ter o PIP instalado para que isso funcione.
A especificação de uma opção -u adicional também permitirá que os candidatos alfa, beta e liberem os candidatos a serem baixados. Sem essa opção, esses lançamentos não serão considerados.
Importante
Por padrão, o Pypiserver verifica o diretório inteiro de pacotes sempre que ocorre uma solicitação HTTP recebida. Isso não é um problema para um pequeno número de pacotes, mas causa desaceleração visível ao servir milhares de pacotes.
Se você se deparar com esse problema, acelerações significativas podem ser obtidas, permitindo a funcionalidade de cache de diretório do Pypiserver. O único requisito é instalar o pacote Watchdog , ou ele pode ser instalado durante a instalação do Pypiserver , especificando a opção Cache Extras ::
pip install pypiserver[cache]
Speedups adicionais podem ser obtidas usando a funcionalidade de cache incorporada do seu servidor da web. Por exemplo, se você estiver usando nginx
como um proxi reverso, conforme descrito abaixo em Behind a reverse proxy
, poderá facilmente ativar o cache. Por exemplo, para permitir que o Nginx cache até 10 gigabytes de dados por até 1 hora ::
proxy_cache_path /data/nginx/cache
levels=1:2
keys_zone=pypiserver_cache:10m
max_size=10g
inactive=60m
use_temp_path=off ;
server {
# ...
location / {
proxy_cache pypiserver_cache ;
proxy_pass http://localhost:8080 ;
}
}
Dica
O uso do cache do servidor da web é especialmente útil se você tiver alto volume de solicitação. Usando o NGINX Caching, uma instalação do Pypiserver do mundo real conseguiu suportar facilmente mais de 1000 downloads de pacotes/min no pico de carga.
Há uma variedade de opções para lidar com o início automatizado do Pypiserver na inicialização do sistema. Dois dos mais comuns são o SystemD e o supervisor dos sistemas Linux. Para o Windows, a criação de serviços com scripts não é uma tarefa fácil sem uma ferramenta de terceiros, como o NSSM .
O SystemD é instalado por padrão na maioria dos sistemas Linux modernos e, como tal, é uma excelente opção para gerenciar o processo Pypiserver. Um exemplo de arquivo de configuração para Systemd pode ser visto abaixo
[Unit]
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=www-data
Group=www-data
ExecStart=/usr/local/bin/pypi-server run -p 8080 -a update,download --log-file /var/log/pypiserver.log -P /etc/nginx/.htpasswd /var/www/pypi
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
Ajustar os caminhos e adicionar esse arquivo como Pypiserver.service no diretório Systemd/System permitirá o gerenciamento do processo Pypiserver com o SystemCTL , por exemplo, SystemCtl Start Pypiserver .
Informações mais úteis sobre o Systemd podem ser encontradas em https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units
O supervisor tem o benefício de ser um pacote Python puro e, como tal, fornece excelente suporte cruzado para gerenciamento de processos. Um exemplo de arquivo de configuração para supervisor é dado abaixo
[program:pypi]
command=/home/pypi/pypi-venv/bin/pypi-server run -p 7001 -P /home/pypi/.htpasswd /home/pypi/packages
directory=/home/pypi
user=pypi
autostart=true
autorestart=true
stderr_logfile=/var/log/pypiserver.err.log
stdout_logfile=/var/log/pypiserver.out.log
A partir daí, o processo pode ser gerenciado via supervisor de supervisor .
Para o Windows Download NSSM de https://nssm.cc Unzip para um local desejado, como arquivos de programas. Decida se você vai usar win32
ou win64
e adicione esse exe
ao PATH
do meio ambiente.
Crie um start_pypiserver.bat
pypi-server run -p 8080 C: P ath T o P ackages &
Dica
Teste o arquivo em lote executando -o primeiro antes de criar o serviço. Verifique se você pode acessar o servidor remotamente e instalar pacotes. Se puder, prossiga, se não estiver solucionando problemas até que possa. Isso garantirá que você saiba que o servidor funciona, antes de adicionar o NSSM ao mix.
Do prompt de comando
nssm install pypiserver
Este comando lançará um aplicativo NSSM GUI
Path: C: P ath T o s tart_pypiserver.bat
Startup directory: Auto generates when selecting path
Service name: pypiserver
Existem mais guias, mas essa é a configuração básica. Se o serviço precisar estar em execução com determinadas credenciais de login, digite essas credenciais na guia Logon.
Inicie o serviço
nssm start pypiserver
Dica
Outros comandos úteis
nssm --help
nssm stop < servicename >
nssm restart < servicename >
nssm status < servicename >
Para obter informações detalhadas, visite https://nssm.cc
O servidor da Web Bottle , que suporta muitos servidores WSGI, entre outros, pasta , cereja , torcida e WSGiref (parte do Python); Você os seleciona usando o sinalizador - -servidor .
Você pode visualizar todos os servidores WSGI suportados usando o seguinte código interativo
>> > from pypiserver import bottle
>> > list ( bottle . server_names . keys ())
[ 'cgi' , 'gunicorn' , 'cherrypy' , 'eventlet' , 'tornado' , 'geventSocketIO' ,
'rocket' , 'diesel' , 'twisted' , 'wsgiref' , 'fapws3' , 'bjoern' , 'gevent' ,
'meinheld' , 'auto' , 'aiohttp' , 'flup' , 'gae' , 'paste' , 'waitress' ]
Se nenhum dos servidores acima corresponder às suas necessidades, invocar apenas o método Pypiserver: app () que retorna o WSGI-App interno sem iniciar um servidor-você poderá enviá-lo para qualquer servidor WSGI que desejar. Leia também a utilização da seção da API.
Alguns exemplos são apresentados abaixo - você pode encontrar mais detalhes no site da garrafa.
Para usar o seu Apache2 com o Pypiserver , prefira utilizar o MOD_WSGI, conforme explicado na documentação do Bottle.
Observação
Se você optar por ir com o MOD_Proxy , lembre-se de que você pode sofrer problemas com o prefixo (consulte #155).
Adapte e coloque a seguinte configuração do Apache no escopo de nível superior ou dentro de algum <VirtualHost>
(contribuído por Thomas Waldmann):
WSGIScriptAlias / /yoursite/wsgi/pypiserver-wsgi.py
WSGIDaemonProcess pypisrv user=pypisrv group=pypisrv umask=0007
processes=1 threads=5 maximum-requests=500
display-name=wsgi-pypisrv inactivity-timeout=300
WSGIProcessGroup pypisrv
WSGIPassAuthorization On # Required for authentication (https://github.com/pypiserver/pypiserver/issues/288)
< Directory /yoursite/wsgi >
Require all granted
< /Directory >
Ou, se estiver usando o Apache mais antigo <2.4 , substitua a última parte por este ::
< Directory /yoursite/wsgi >
Order deny,allow
Allow from all
< /Directory >
Em seguida, crie o arquivo /yoursite/cfg/pypiserver.wsgi e verifique se o usuário e o grupo da diretiva WSGIDAEMONPROCESS ( Pypisrv: Pypisrv no exemplo) têm a permissão de leitura
import pypiserver
conf = pypiserver . default_config (
root = "/yoursite/packages" ,
password_file = "/yoursite/htpasswd" , )
application = pypiserver . app ( ** conf )
[! TIP] Se você instalou o Pypiserver em um VirtualEnv, siga as instruções de Mod_wsgi e prenda o código Python acima com o seguinte
import site site . addsitedir ( '/yoursite/venv/lib/pythonX.X/site-packages' )
Observação
Por razões de segurança, observe que a diretiva do diretório concede acesso a um diretório que mantém o script de inicialização do WSGI sozinho; nada mais.
Observação
Para ativar o suporte HTTPS no Apache, configure a diretiva que contém a configuração do WSGI para usar o SSL.
O comando a seguir usa Gunicorn para iniciar o Pypiserver
gunicorn -w4 ' pypiserver:app(root="/home/ralf/packages") '
ou ao usar várias raízes
gunicorn -w4 ' pypiserver:app(root=["/home/ralf/packages", "/home/ralf/experimental"]) '
A pasta permite executar vários aplicativos WSGI sob diferentes caminhos de URL. Portanto, é possível servir diferentes conjuntos de pacotes em diferentes caminhos.
O exemplo a seguir paste.ini pode ser usado para servir pacotes estáveis e instáveis em diferentes caminhos
[composite:main]
use = egg:Paste#urlmap
/unstable/ = unstable
/ = stable
[app:stable]
use = egg:pypiserver#main
root = ~ /stable-packages
[app:unstable]
use = egg:pypiserver#main
root = ~ /stable-packages
~ /unstable-packages
[server:main]
use = egg:gunicorn#main
host = 0.0.0.0
port = 9000
workers = 5
accesslog = -
Observação
Você precisa instalar mais algumas dependências para que isso funcione, como ::
pip install paste pastedeploy gunicorn pypiserver
O servidor pode então começar com
gunicorn_paster paste.ini
Você também pode executar o Pypiserver por um proxy reverso.
Estenda sua configuração nginx
upstream pypi {
server pypiserver.example.com:12345 fail_timeout=0 ;
}
server {
server_name myproxy.example.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 ;
}
}
A partir do Pypiserver 1.3, você também pode usar o cabeçalho X-Forwarded-Host
em sua configuração de proxy reversa para permitir a alteração do URL base. Por exemplo, se você deseja hospedar o Pypiserver sob um caminho específico em seu servidor
upstream pypi {
server localhost:8000 ;
}
server {
location /pypi/ {
proxy_set_header X-Forwarded-Host $host : $server_port /pypi ;
proxy_set_header X-Forwarded-Proto $scheme ;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
proxy_set_header X-Real-IP $remote_addr ;
proxy_pass http://pypi ;
}
}
Usando um proxy reverso é a maneira preferida de deixar o Pypiserver atrás do HTTPS. Por exemplo, para colocar o Pypiserver atrás do HTTPS na porta 443, com redirecionamento automático de HTTP, usando nginx
upstream pypi {
server localhost:8000 ;
}
server {
listen 80 default_server ;
server_name _ ;
return 301 https:// $host$request_uri ;
}
server {
listen 443 ssl ;
server_name pypiserver.example.com ;
ssl_certificate /etc/star.example.com.crt ;
ssl_certificate_key /etc/star.example.com.key ;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 ;
ssl_ciphers HIGH: ! aNULL: ! MD5 ;
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 ;
}
}
Dica
Consulte os documentos HTTPs da Nginx para obter mais detalhes.
Obter e manter seus certificados atualizados pode ser simplificado usando, por exemplo, usando o CERTBOT e o LetSencrypt.
Também é possível usar o Traefik para colocar o Pypiserver atrás do HTTPS na porta 443, com redirecionamento automático de HTTP usando o Docker Compose. Consulte o exemplo fornecido do Docker-Compose.yml para obter mais informações.
Para ativar os provitores de autenticação ad-hoc ou usar os servidores WSGI não suportados pela garrafa pronta para uso, você precisava iniciar o Pypiserver por meio de sua API.
O ponto de entrada principal para configurar o Pypiserver é a função Pypiserver: app (). Esta função retorna o WSGI-App interno que você envia para qualquer WSGI-Server que desejar.
Para obter todas as palavras -chave Pypiserver: app () e suas explicações, leia a função Pypiserver: default_config ()
Finalmente, para iniciar um WSGI-Server com o aplicativo configurado, invocar o frasco: executar (aplicativo, host, porta, servidor) . Observe que o Pypiserver envia com sua própria cópia do Bottle ; Para usá -lo, importe -o assim: do Pypiserver Import Bottle
A função Auther -Keyword of Pypiserver: app () talvez seja definida apenas usando a API. Isso pode ser qualquer chamável que retorne um booleano quando aprovado no nome de usuário e na senha para uma determinada solicitação.
Por exemplo, para autenticar usuários com base no arquivo /etc /passwd no UNIX, você pode delegar essas decisões à biblioteca Python-PAM seguindo estas etapas:
Verifique se o módulo Python-Pam está instalado
pip install python-pam
Crie um script python nesse sentido
$ cat > pypiserver-start.py
import pypiserver
from pypiserver import bottle
import pam
app = pypiserver.app(root= ' ./packages ' , auther=pam.authenticate)
bottle.run(app=app, host= ' 0.0.0.0 ' , port=80, server= ' auto ' )
[Ctrl+ D]
Invoque o Python-Script para iniciar o Pypiserver
python pypiserver-start.py
Observação
O módulo Python-Pam, requer acesso de leitura ao arquivo /etc /sombra ; Você pode adicionar o usuário sob o qual o Pypiserver é executado no grupo de sombras , com um comando como este: sudo userMod -a -g Shadow Pypy -User .
O intérprete Micropython para dispositivos incorporados pode instalar pacotes com o módulo upip.py. O módulo usa um JSON-Endpoint especializado para recuperar informações do pacote. Este terminal é suportado pelo Pypiserver .
Pode ser testado com a porta Unix de Micropython
cd micropython
ports/unix/micropython -m tools.upip install -i http://my-server:8080 -p /tmp/mymodules micropython-foobar
A instalação de pacotes a partir da REPT de um dispositivo incorporado funciona dessa maneira:
import network
import upip
sta_if = network . WLAN ( network . STA_IF )
sta_if . active ( True )
sta_if . connect ( '<your ESSID>' , '<your password>' )
upip . index_urls = [ "http://my-server:8080" ]
upip . install ( "micropython-foobar" )
Informações adicionais sobre o Micropython-Packaging podem ser encontradas aqui: https://docs.micropython.org/en/latest/reference/packages.html
O Pypiserver fornece um terminal de saúde padrão em /saúde . Ele sempre retorna 200 ok se o serviço estiver em alta. Caso contrário, isso significa que o serviço não é responsivo.
Além disso, o Pypiserver permite que os usuários personalizem o terminal de saúde. São permitidos caracteres alfanuméricos, hífens, barras para frente e sublinhos e o terminal não deve se sobrepor a nenhuma rotas existentes. Exemplos válidos: /Healthz , /Health /Live-1 , /API_Health , /Action /Health
Execute o Pypiserver com-Argumento de Health-Endpoint :
pypi-server run --health-endpoint /action/health
import pypiserver
from pypiserver import bottle
app = pypiserver . app ( root = "./packages" , health_endpoint = "/action/health" )
bottle . run ( app = app , host = "0.0.0.0" , port = 8080 , server = "auto" )
Tente Curl http: // localhost: 8080/ação/saúde
Para criar uma cópia do repositório, use
git clone https://github.com/pypiserver/pypiserver.git
cd pypiserver
Para receber quaisquer alterações posteriores, na pasta acima, use:
git pull
Importante
O Pypiserver não implementa a API completa, como visto no Pypi. Ele implementa apenas o suficiente para fazer easy_install , instalar o PIP e pesquisar .
As seguintes limitações são conhecidas:
Por favor, use o Bugtracker do Github para outros bugs que você encontra.
Existem muitos outros projetos, que permitem executar seu próprio servidor Pypi. Se o Pypiserver não funcionar para você, o seguinte está entre as alternativas mais populares:
Devpi-Server: um servidor de cache rápido do Pypi.org confiável, parte do servidor de índice PyPI do estilo Github e a meta de embalagem do estilo Github. (Versão: 2.1.4, Data de Acesso: 03/08/2015)
Verifique isso tão pergunta: como rolar meu próprio Pypi
Esses projetos já foram alternativas ao Pypiserver, mas agora não são mantidos ou arquivados.
PIP2PI Uma ferramenta simples de linha CMD que constrói uma pasta local compatível com PYPI com requisitos de PIP
Flask-Pypi-Proxy Um proxy para Pypi que também permite o upload de pacotes personalizados.
Embora não sejam alternativas diretas para o uso de Pypiserver como um servidor de índice, a seguir é uma lista de projetos de software relacionados com os quais você pode se familiarizar:
Pypi-Uploader: Um utilitário de linha de comando para fazer upload de pacotes para o seu Pypiserver da Pypi sem precisar armazená-los localmente primeiro.
Twine: um utilitário de linha de comando para interagir com Pypi ou Pypiserver .
armazém: o software que alimenta o próprio Pypi. Geralmente, não se destina a ser administrado por usuários finais.
O Pypiserver contém uma cópia do frasco disponível sob a licença do MIT, e a parte restante é distribuída sob a licença ZLIB/LIBPNG. Consulte o arquivo License.txt .