nombre | descripción |
---|---|
Versión | 2.2.0 |
Fecha: | 2024-09-15 |
Fuente | https://github.com/pypiserver/pypiserver |
Pypi | https://pypi.org/project/pypiserver/ |
Pruebas | https://github.com/pypiserver/pypiserver/actions |
Mantenedores | @ankostis , @mplanchard , @dee-me-tree-or-love , @pawamoy , ¿alguien nuevo? ¡Estamos abiertos para nuevos mantenedores! #397 |
Licencia | zlib/libpng + MIT |
Comunidad | https://pypiserver.zulipchat.com |
Consejo
Comuníquese con discusiones o chatee con nosotros en Zulip
Pypiserver es un servidor compatible con PYPI mínimo para PIP o Easy_install . Se basa en la botella y sirve paquetes de directorios regulares. Las ruedas, bdists, huevos y firmas de PGP que lo acompañan se pueden cargar con pip , setuppools , hilo , pypi-sploader o simplemente copiar con scp .
Nota
El software oficial que impulsa Pypi es almacén. Sin embargo, Warehouse está bastante especializado para ser el propio software de Pypi.org , y no debe usarse en otros contextos. En particular, no admite oficialmente ser utilizado como un índice de paquetes personalizado por los usuarios que desean servir sus propios paquetes.
Pypiserver implementa las mismas interfaces que PYPI, lo que permite que las herramientas estándar de empaque de Python, como PIP y Twine , interactúen como un índice de paquetes tal como lo harían con Pypi, al tiempo que hace que sea mucho más fácil obtener un servidor de índice en ejecución.
Tabla de contenido
Pypiserver funciona con Python 3.6+ y Pypy3.
Las versiones más antiguas de Python aún pueden funcionar, pero no se prueban.
Para las versiones Legacy Python, use la serie Pypiserver-1.x . Tenga en cuenta que estos no son compatibles oficialmente, y no recibirán correcciones de errores o nuevas funciones.
Consejo
Los comandos a continuación funcionan en un sistema operativo similar a UNIX con un shell Posix. El personaje '~' se expande al directorio de inicio del usuario.
Si está usando Windows, tendrá que usar sus "contrapartes de Windows". Lo mismo es cierto para el resto de esta documentación.
Instalar pypiserver con este comando
pip install pypiserver # Or: pypiserver[passlib,cache]
mkdir ~ /packages # Copy packages into this directory.
[! Tip] Ver también Métodos de instalación alternativos
Copie algunos paquetes en su carpeta ~/paquetes y luego ponga su pypiserver en funcionamiento
pypi-server run -p 8080 ~ /packages & # Will listen to all IPs.
Desde la computadora del cliente, escriba esto
# 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.
[
Ingrese pypi-server -h en la línea CMD para imprimir un mensaje de uso detallado
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
Ingrese Pypi-Server Run -h en la línea CMD para imprimir un uso detallado
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.
Más detalles sobre la actualización de 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.
Siempre especificar la URL PYPI en la línea de comando es un poco engorroso. Dado que Pypiserver redirige PIP/Easy_install al índice pypi.org si no tiene un paquete solicitado, es una buena idea configurarlos para usar siempre su índice PYPI local.
Para el comando PIP , esto se puede hacer configurando la variable de entorno PIP_EXTRA_INDEX_URL en su .bashr/.profile/.zshrc
export PIP_EXTRA_INDEX_URL=http://localhost:8080/simple/
o agregando las siguientes líneas a ~/.pip/pip.conf
[global]
extra-index-url = http://localhost:8080/simple/
Nota
Si ha instalado Pypiserver en una URL remota sin HTTPS, recibirá una advertencia "no confiable" de PIP , lo que le insta a agregar la opción -Host-Host . También puede incluir esta opción permanentemente en sus archivos de configuración o variables de entorno.
Para el comando fácil_install puede establecer la siguiente configuración en ~/.pydistutils.cfg
[easy_install]
index_url = http://localhost:8080/simple/
En lugar de copiar paquetes directamente a la carpeta del servidor (es decir, con SCP ), puede usar las herramientas de Python para la tarea, por ejemplo, Python Setup.py Supiead . En ese caso, Pypiserver es responsable de autenticar las solicitudes de carga.
Nota
¡Aconsejamos encarecidamente proteger sus cargas!
Es posible deshabilitar la autenticación de cargas (por ejemplo, en las intranets). Para evitar decisiones de seguridad perezosas, lea la ayuda para las opciones -P y -A .
Primero asegúrese de tener el módulo PassLib instalado (tenga en cuenta que se requiere PassLib> = 1.6 ), que es necesario para analizar el archivo Apache Htpasswd especificado por la opción -p , -Passwords (ver los siguientes pasos)
pip install passlib
Cree el archivo apache htpasswd con al menos un par de usuarios/contraseñas con este comando (se le solicitará una contraseña)
htpasswd -sc htpasswd.txt < some_username >
Consejo
Lea esto, así que la pregunta para ejecutar htpasswd
cmd en Windows o si tiene contraseñas falsas que no le importa porque son para un servicio interno (que sigue siendo "malo", desde una perspectiva de seguridad ...), puede usar este público servicio
Consejo
Al acceder a Pypiserver a través de la API, los métodos de autenticación alternativos están disponibles a través del indicador de configuración Auther . Cualquier que devuelva un booleano se puede pasar a la configuración de Pypiserver para proporcionar autenticación personalizada. Por ejemplo, para configurar pypiserver para autenticarse usando el python-pam
import pam
pypiserver.default_config(auther=pam.authenticate)
Consulte Using Ad-hoc authentication providers
para obtener más información.
Debe reiniciar el servidor con la opción -p solo una vez (pero los pares de usuario/contraseña se pueden agregar o actualizar en la marcha)
./pypi-server run -p 8080 -P htpasswd.txt ~ /packages &
En el lado del cliente, edite o cree un archivo ~/.pypirc con un contenido similar:
[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 >
Luego, desde dentro del directorio del proyecto Python que desea cargar, emita este comando:
python setup.py sdist upload -r local
Para evitar almacenar sus contraseñas en el disco, en texto claro, puede:
Use el comando de registro setupTools con la opción -r , así
python setup.py sdist register -r local upload -r local
Use la biblioteca de hilo , que rompe el procedimiento en dos pasos. Además, admite firmar sus archivos con firmas PGP y cargar los archivos .asc generados a Pypiserver ::
twine upload -r local --sign -identity user_name ./foo-1.zip
Comenzando con la versión 1.2.5, se construirán imágenes oficiales de Docker para cada empuje a main
, cada lanzamiento de Dev, alfa o beta, y cada versión final. El lanzamiento completo más reciente siempre estará disponible en la última etiqueta, y la rama main
actual siempre estará disponible en la etiqueta inestable .
Siempre puede verificar para ver qué etiquetas están actualmente disponibles en nuestro Docker Repo .
Para ejecutar el lanzamiento más reciente de Pypiserver con Docker, simplemente
docker run pypiserver/pypiserver:latest run
Esto inicia los paquetes de servir Pypiserver desde el directorio /Data /Packages dentro del contenedor, escuchando en el puerto del contenedor 8080.
El contenedor toma los mismos argumentos que el ejecutable normal de Pypi -Server , con la excepción del puerto de contenedor interno ( -P ), que siempre será de 8080.
Por supuesto, simplemente ejecutar un contenedor no es tan interesante. Para mapear el puerto 80 en el host al puerto 8080 en el contenedor ::
docker run -p 80:8080 pypiserver/pypiserver:latest run
Ahora puede acceder a su Pypiserver en Localhost: 80 en un navegador web.
Para servir paquetes de un directorio en el host, por ejemplo , paquetes
docker run -p 80:8080 -v ~ /packages:/data/packages pypiserver/pypiserver:latest run
Para autenticarse contra un archivo .htpasswd local ::
docker run -p 80:8080 -v ~ /.htpasswd:/data/.htpasswd pypiserver/pypiserver:latest run -P .htpasswd packages
También puede especificar que Pypiserver se ejecute como un servicio Docker utilizando un ComposeFile. Se proporciona un ejemplo de composefile como docker-compose.yaml
Al probar los métodos a continuación, primero use el siguiente comando para verificar si ya existen versiones anteriores de Pypiserver , y (opcionalmente) desinstalarlos ::
# VERSION-CHECK: Fails if not installed.
pypi-server --version
# UNINSTALL: Invoke again until it fails.
pip uninstall pypiserver
En caso de que la última versión en PYPI sea un lanzamiento previo, debe utilizar la opción de PIP 's -pre . Y para actualizar una instalación existente combinarla con --ignore-installed
pip install pypiserver --pre -I
Incluso puede instalar el último pypiserver directamente desde GitHub con el siguiente comando, suponiendo que haya instalado Git en su ruta
pip install git+git://github.com/pypiserver/pypiserver.git
El comando pypi-server tiene el comando de actualización que busca actualizaciones de los paquetes disponibles. Escanea el directorio de paquetes para paquetes y búsquedas disponibles en pypi.org para actualizaciones. Sin más opciones, la actualización de Pypi-Server solo imprimirá una lista de comandos que deben ejecutarse para obtener la última versión de cada paquete. La salida 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
Primero imprime para cada paquete un solo personaje después de verificar las versiones disponibles en PYPI. Un punto (.) Significa que el paquete está actualizado, 'u' significa que el paquete se puede actualizar y 'e' significa que la lista de versiones en pypi está vacía. Después de eso, muestra una línea de comandos PIP que se puede usar para actualizar un paquete único. Copie y pegue eso o ejecute Pypi -Server Update -x para ejecutar realmente esos comandos. Sin embargo, debe tener instalado PIP para que eso funcione.
Especificar una opción adicional -U también permitirá descargar los candidatos alfa, beta y liberación. Sin esta opción, estos lanzamientos no se considerarán.
Importante
Por defecto, Pypiserver escanea todo el directorio de paquetes cada vez que se produce una solicitud HTTP entrante. Esto no es un problema para un pequeño número de paquetes, pero causa desaceleraciones notables al servir miles de paquetes.
Si se encuentra con este problema, se pueden obtener aceleras significativas al habilitar la funcionalidad de almacenamiento en caché del directorio de Pypiserver. El único requisito es instalar el paquete Watchdog , o se puede instalar durante la instalación de Pypiserver , especificando la opción de extras de caché ::
pip install pypiserver[cache]
Se pueden obtener aceleras adicionales utilizando la funcionalidad de almacenamiento de almacenamiento integral de su servidor web. Por ejemplo, si está utilizando nginx
como un proxy inverso como se describe a continuación en Behind a reverse proxy
, puede habilitar fácilmente el almacenamiento en caché. Por ejemplo, para permitir que Nginx almacene hasta 10 gigabytes de datos por hasta 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 ;
}
}
Consejo
Usar el almacenamiento en caché de servidor web es especialmente útil si tiene un alto volumen de solicitud. Usando el almacenamiento en caché de Nginx, una instalación de Pypiserver del mundo real pudo admitir fácilmente más de 1000 descargas de paquetes/min en carga máxima.
Hay una variedad de opciones para manejar el inicio automatizado de Pypiserver al inicio del sistema. Dos de los más comunes son Systemd y supervisor para sistemas Linux. Para Windows, crear servicios con scripts no es una tarea fácil sin una herramienta de terceros como NSSM .
Systemd se instala de forma predeterminada en la mayoría de los sistemas Linux modernos y, como tal, es una excelente opción para administrar el proceso de Pypiserver. Un archivo de configuración de ejemplo para Systemd se puede ver a continuación
[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 las rutas y agregar este archivo como pypiserver.service en su directorio SystemD/System permitirá la administración del proceso de Pypiserver con SystemCTL , por ejemplo, SystemCTL Start Pypiserver .
Se puede encontrar información más útil sobre Systemd en https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units
Supervisor tiene el beneficio de ser un paquete de Python puro y, como tal, proporciona un excelente soporte multiplataforma para la gestión de procesos. A continuación se da un archivo de configuración de ejemplo para Supervisor
[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 de ahí, el proceso se puede administrar a través de Supervisord utilizando SupervisorCTL .
Para Windows, descargue NSSM desde https://nssm.cc Unzip a una ubicación deseada, como archivos de programa. Decida si va a usar win32
o win64
, y agregue ese exe
a PATH
de entorno.
Crear un inicio_pypiserver.bat
pypi-server run -p 8080 C: P ath T o P ackages &
Consejo
Pruebe el archivo por lotes ejecutándolo primero antes de crear el servicio. Asegúrese de poder acceder al servidor de forma remota e instalar paquetes. Si puede, continúe, si no soluciona problemas hasta que pueda. Esto asegurará que sepa que el servidor funciona, antes de agregar NSSM a la mezcla.
Desde el símbolo del sistema
nssm install pypiserver
Este comando lanzará una aplicación NSSM GUI
Path: C: P ath T o s tart_pypiserver.bat
Startup directory: Auto generates when selecting path
Service name: pypiserver
Hay más pestañas, pero esa es la configuración básica. Si el servicio debe ejecutarse con ciertas credenciales de inicio de sesión, asegúrese de ingresar esas credenciales en la pestaña de inicio de sesión.
Iniciar el servicio
nssm start pypiserver
Consejo
Otros comandos útiles
nssm --help
nssm stop < servicename >
nssm restart < servicename >
nssm status < servicename >
Para obtener información detallada, visite https://nssm.cc
El servidor web de la botella que admite muchos servidores WSGI, entre otros, pasta , cherrypy , torcido y wsgiref (parte de Python); Los selecciona usando la bandera --server .
Puede ver todos los servidores WSGI compatibles utilizando el siguiente código interactivo
>> > 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' ]
Si ninguno de los servidores anteriores coincide con sus necesidades, invoque solo el método Pypiserver: App () que devuelve el WSGI-APP interno sin iniciar un servidor; luego puede enviarlo a cualquier servidor WSGI que desee. Lea también la utilización de la sección API.
A continuación se presentan algunos ejemplos: puede encontrar más detalles en el sitio de la botella.
Para usar su Apache2 con Pypiserver , prefiera utilizar MOD_WSGI como se explica en la documentación de Bottle.
Nota
Si elige en su lugar ir con MOD_PROXY , considere que puede toparse con problemas con el prefijo-Path (ver #155).
Adapte y coloque la siguiente configuración de Apache , ya sea en el alcance de nivel superior, o dentro de algunos <VirtualHost>
(contribuido 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 >
o si usa apache más antiguo <2.4 , sustituya la última parte con esto ::
< Directory /yoursite/wsgi >
Order deny,allow
Allow from all
< /Directory >
Luego cree el archivo /yoursite/cfg/pypiserver.wsgi y asegúrese de que el usuario y el grupo de la Directiva WSGidaemonProcess ( pypisrv: pypisrv en el ejemplo) tengan el permiso de lectura en ella
import pypiserver
conf = pypiserver . default_config (
root = "/yoursite/packages" ,
password_file = "/yoursite/htpasswd" , )
application = pypiserver . app ( ** conf )
[! Consejo] Si ha instalado Pypiserver en un VirtualEnv, siga las instrucciones de Mod_wsgi y prependa el código de Python anterior con lo siguiente
import site site . addsitedir ( '/yoursite/venv/lib/pythonX.X/site-packages' )
Nota
Por razones de seguridad, observe que la Directiva del Directorio otorga acceso a un directorio que contiene el script de inicio de WSGI , solo; nada más.
Nota
Para habilitar el soporte HTTPS en Apache, configure la directiva que contiene la configuración WSGI para usar SSL.
El siguiente comando usa Gunicorn para iniciar Pypiserver
gunicorn -w4 ' pypiserver:app(root="/home/ralf/packages") '
o cuando se usa múltiples raíces
gunicorn -w4 ' pypiserver:app(root=["/home/ralf/packages", "/home/ralf/experimental"]) '
Paste permite ejecutar múltiples aplicaciones WSGI en diferentes rutas de URL. Por lo tanto, es posible servir diferentes conjuntos de paquetes en diferentes rutas.
El siguiente ejemplo Paste.ini podría usarse para servir paquetes estables e inestables en diferentes rutas
[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 = -
Nota
Debe instalar más dependencias para que esto funcione, como ::
pip install paste pastedeploy gunicorn pypiserver
El servidor puede comenzar con
gunicorn_paster paste.ini
También puede ejecutar Pypiserver detrás de un proxy inverso.
Extienda su configuración de 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 de Pypiserver 1.3, también puede usar el encabezado X-Forwarded-Host
en su configuración de proxy inversa para habilitar el cambio de URL base. Por ejemplo, si desea alojar pypiserver en una ruta particular en su 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 ;
}
}
El uso de un proxy inverso es la forma preferida de obtener Pypiserver detrás de HTTPS. Por ejemplo, para colocar a Pypiserver detrás de HTTPS en el puerto 443, con redirección automática de HTTP, utilizando 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 ;
}
}
Consejo
Consulte los documentos HTTPS de Nginx para obtener más detalles.
Obtener y mantener sus certificados actualizados se puede simplificar utilizando, por ejemplo, usando CERTBOT y LetsEnsencrypt.
También es posible usar Traefik para poner Pypiserver detrás de HTTPS en el puerto 443, con la redirección automática HTTP usando Docker Compose. Consulte el ejemplo de Docker-Compose.yml proporcionado para obtener más información.
Para habilitar los proveedores de autenticación ad-hoc o utilizar los servidores WSGI no compatibles con la botella fuera de la caja, necesitaba lanzar Pypiserver a través de su API.
El punto de entrada principal para configurar Pypiserver es la función Pypiserver: App (). Esta función devuelve el WSGI-App interno que usted luego envía a cualquier servidor WSGI que desee.
Para obtener todas las palabras clave pypiserver: app () y sus explicaciones, lea la función pypiserver: default_config ()
Finalmente, para activar un servidor WSGI con la aplicación configurada, invoca la función Ejecutar (aplicación, host, puerto, servidor) . Tenga en cuenta que Pypiserver se envía con su propia copia de Bottle ; Para usarlo, importarlo así: desde la botella de importación de Pypiserver
La palabra clave Auther de la función Pypiserver: App () tal vez solo se establece usando la API. Esto puede ser invocado que devuelva un booleano cuando se apruebe el nombre de usuario y la contraseña para una solicitud dada.
Por ejemplo, para autenticar a los usuarios basados en el archivo /etc /passwd en UNIX, puede delegar tales decisiones a la biblioteca Python-Pam siguiendo estos pasos:
Asegúrese de que esté instalado el módulo Python-Pam
pip install python-pam
Crea un script de pitón en este 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]
Invoca el Script Python a Start-Up Pypiserver
python pypiserver-start.py
Nota
El módulo Python-Pam, requiere acceso de lectura al archivo /etc /shadow ; Puede agregar el usuario bajo el cual Pypiserver se ejecuta en el grupo de sombras , con un comando como este: sudo usermod -a -g shadow pypy -user .
El intérprete de Micrypthon para dispositivos incrustados puede instalar paquetes con el módulo upip.py. El módulo utiliza un JSON-endpoint especializado para recuperar la información del paquete. Este punto final es compatible con Pypiserver .
Se puede probar con el puerto Unix de Micrypthon
cd micropython
ports/unix/micropython -m tools.upip install -i http://my-server:8080 -p /tmp/mymodules micropython-foobar
La instalación de paquetes desde la replicación de un dispositivo integrado funciona de esta manera:
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" )
Se puede encontrar más información sobre el empaque de micrypthon aquí: https://docs.micropython.org/en/latest/reference/packages.html
Pypiserver proporciona un punto final de salud predeterminado en /salud . Siempre devuelve 200 OK si el servicio está activo. De lo contrario, significa que el servicio no responde.
Además, Pypiserver permite a los usuarios personalizar el punto final de salud. Se permiten caracteres alfanuméricos, guiones, cortes de avance y subrayos y el punto final no debe superponerse con ninguna ruta existente. Ejemplos válidos: /Healthz , /Health /Live-1 , /API_Health , /Action /Health
Ejecute Pypiserver con --HEALTH-ENDPOINT argumento:
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" )
Prueba curl http: // localhost: 8080/action/salud
Para crear una copia del repositorio, use
git clone https://github.com/pypiserver/pypiserver.git
cd pypiserver
Para recibir cualquier cambio posterior, en la carpeta anterior, uso:
git pull
Importante
Pypiserver no implementa la API completa como se ve en Pypi. Implementa lo suficiente para hacer que Easy_install , instalación y trabajo de búsqueda .
Se conocen las siguientes limitaciones:
Utilice el bugtracker de GitHub para otros errores que encuentre.
Hay muchos otros proyectos que le permiten ejecutar su propio servidor PYPI. Si Pypiserver no funciona para usted, las siguientes se encuentran entre las alternativas más populares:
Devpi-server: un servidor de almacenamiento en caché PYPI.org rápido confiable, parte del servidor de índice PYPI de estilo GitHub integral y la herramienta Meta de embalaje. (Versión: 2.1.4, Fecha de acceso: 8/3/2015)
Verifique esto, así que la pregunta: cómo rodar mi propio pypi
Estos proyectos alguna vez fueron alternativas a Pypiserver, pero ahora están sin demoras o archivados.
PIP2PI Una herramienta de línea CMD simple que construye una carpeta local compatible con PYPI a partir de los requisitos de PIP
Flask-Pypi-Proxy Un proxy para PYPI que también permite cargar paquetes personalizados.
Aunque no son alternativas directas para el uso de Pypiserver como servidor de índice, la siguiente es una lista de proyectos de software relacionados con los que puede familiarizarse:
Pypi-Sploader: una utilidad de línea de comandos para cargar paquetes a su Pypiserver desde Pypi sin tener que almacenarlos localmente primero.
Twine: una utilidad de línea de comandos para interactuar con Pypi o Pypiserver .
Almacén: el software que impulsa a Pypi en sí. Generalmente no pretende ser ejecutado por usuarios finales.
Pypiserver contiene una copia de la botella que está disponible bajo la licencia MIT, y la parte restante se distribuye bajo la licencia ZLIB/libpng. Vea el archivo License.txt .