nom | description |
---|---|
Version | 2.2.0 |
Date: | 2024-09-15 |
Source | https://github.com/pypiserver/pypiserver |
PYPI | https://pypi.org/project/pypiserver/ |
Tests | https://github.com/pypiserver/pypiserver/actions |
Maintient | @ankostis , @mplanchard , @dee-me-tree-or-love , @pawamoy , quelqu'un de nouveau? Nous sommes ouverts pour les nouveaux mainteneurs! # 397 |
Licence | zlib / libpng + mit |
Communauté | https://pypiserver.zulipchat.com |
Conseil
Tendre la main dans les discussions ou discuter avec nous sur Zulip
Pypiserver est un serveur compatible PYPI minimal pour PIP ou Easy_install . Il est basé sur la bouteille et sert des forfaits à partir de répertoires réguliers. Les roues, les BDistes, les œufs et les signatures PGP qui l'accompagnent peuvent être téléchargés soit avec PIP , Setuptools , Twine , PYPI-uploader , soit simplement copiés avec SCP .
Note
Le logiciel officiel alimentant PYPI est un entrepôt. Cependant, l'entrepôt est assez spécialisé pour être le propre logiciel de PYPI.org et ne doit pas être utilisé dans d'autres contextes. En particulier, il ne supporte pas officiellement d'être utilisé comme un index de package personnalisé par les utilisateurs souhaitant servir leurs propres packages.
Pypiserver implémente les mêmes interfaces que PYPI, permettant à des outils d'emballage Python standard tels que PIP et Twine d'interagir avec lui en tant qu'index de package comme ils le feraient avec PYPI, tout en facilitant l'obtention d'un serveur d'index en cours d'exécution.
Table des matières
Pypiserver travaille avec Python 3.6+ et PyPy3.
Les versions Python plus anciennes peuvent encore fonctionner, mais elles ne sont pas testées.
Pour les versions Legacy Python, utilisez la série Pypiserver-1.x . Notez que ceux-ci ne sont pas officiellement pris en charge et ne recevront pas de bugfixs ou de nouvelles fonctionnalités.
Conseil
Les commandes ci-dessous fonctionnent sur un système d'exploitation de type Unix avec un shell POSIX. Le caractère '~' s'étend au répertoire personnel de l'utilisateur.
Si vous utilisez Windows, vous devrez utiliser leurs "homologues Windows". Il en va de même pour le reste de cette documentation.
Installez Pypiserver avec cette commande
pip install pypiserver # Or: pypiserver[passlib,cache]
mkdir ~ /packages # Copy packages into this directory.
[! Astuce] Voir aussi des méthodes d'installation alternatives
Copiez certains packages dans votre dossier ~ / packages , puis obtenez votre pypiserver opérationnel
pypi-server run -p 8080 ~ /packages & # Will listen to all IPs.
À partir de l'ordinateur client, saisissez ceci
# 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.
[! Astuce] Voir aussi les configurations côté client pour éviter la frappe fastidieuse.
Entrez PYPI-Server -H dans la ligne CMD pour imprimer un message d'utilisation détaillé
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
Entrez PYPI-Server Run -H dans la ligne CMD pour imprimer une utilisation détaillée
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.
Plus de détails sur la mise à jour 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.
La spécification toujours de l'URL PYPI sur la ligne de commande est un peu lourde. Étant donné que Pypiserver redirige PIP / Easy_install vers l'index PYPI.org s'il n'a pas de package demandé, c'est une bonne idée de les configurer pour toujours utiliser votre index PYPI local.
Pour la commande PIP , cela peut être fait en définissant la variable d'environnement pip_extra_index_url dans votre .bashr / .profile / .zshrc
export PIP_EXTRA_INDEX_URL=http://localhost:8080/simple/
ou en ajoutant les lignes suivantes à ~ / .pip / pip.conf
[global]
extra-index-url = http://localhost:8080/simple/
Note
Si vous avez installé Pypiserver sur une URL distante sans HTTPS, vous recevrez un avertissement "non fiable" de PIP , vous exhortant à ajouter l'option - trust-host . Vous pouvez également inclure cette option en permanence dans vos fichiers de configuration ou vos variables d'environnement.
Pour la commande easy_install, vous pouvez définir la configuration suivante dans ~ / .pyDistUtils.cfg
[easy_install]
index_url = http://localhost:8080/simple/
Au lieu de copier des packages directement dans le dossier du serveur (c'est-à-dire avec SCP ), vous pouvez utiliser des outils Python pour la tâche, par exemple Python setup.py upload . Dans ce cas, Pypiserver est responsable de l'authentification des requis de téléchargement.
Note
Nous conseillons fortement de protéger vos téléchargements!
Il est possible de désactiver l'authentification pour les téléchargements (par exemple dans les intranets). Pour éviter les décisions de sécurité paresseuses, lisez l'aide pour les options -p et -a .
Assurez-vous d'abord que le module PassLib est installé (notez que PASSLIB> = 1.6 est requis), qui est nécessaire pour analyser le fichier Apache htpasswd spécifié par l'option -p , --words de pass (voir les étapes suivantes)
pip install passlib
Créez le fichier apache htpasswd avec au moins une paire utilisateur / mot de passe avec cette commande (vous serez invité à un mot de passe)
htpasswd -sc htpasswd.txt < some_username >
Conseil
Lisez cette question pour exécuter htpasswd
CMD sous Windows ou si vous avez de faux mots de passe que vous ne vous souciez pas parce qu'ils sont pour un service interne (qui est toujours "mauvais", du point de vue de la sécurité ...) Vous pouvez utiliser ce public service
Conseil
Lorsque vous accédez à Pypiserver via l'API, des méthodes d'authentification alternatives sont disponibles via l'indicateur de configuration Authers . Tout renversement appelant un booléen peut être transmis à la configuration de Pypiserver afin de fournir une authentification personnalisée. Par exemple, pour configurer Pypiserver pour s'authentifier à l'aide du python-pam
import pam
pypiserver.default_config(auther=pam.authenticate)
Veuillez consulter Using Ad-hoc authentication providers
pour plus d'informations.
Vous devez redémarrer le serveur avec l'option -p une seule fois (mais les paires utilisateur / mot de passe peuvent ensuite être ajoutées ou mises à jour à la volée)
./pypi-server run -p 8080 -P htpasswd.txt ~ /packages &
Sur côté client, modifiez ou créez un fichier ~ / .pypirc avec un contenu similaire:
[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 >
Ensuite, à l'intérieur du répertoire du Python-Project que vous souhaitez télécharger, émettez cette commande:
python setup.py sdist upload -r local
Pour éviter de stocker vos mots de passe sur le disque, en texte clair, vous pouvez soit:
Utilisez la commande de registre setuptools avec l'option -r , comme celle-là
python setup.py sdist register -r local upload -r local
Utilisez la bibliothèque Twine , qui brise la procédure en deux étapes. De plus, il prend en charge la signature de vos fichiers avec des signatures PGP et le téléchargement des fichiers .asc générés sur Pypiserver ::
twine upload -r local --sign -identity user_name ./foo-1.zip
À partir de la version 1.2.5, des images Docker officielles seront construites pour chaque main
de push, chaque version de développement, alpha ou bêta, et chaque version finale. La version complète la plus récente sera toujours disponible sous le tag le plus tard , et la branche main
actuelle sera toujours disponible sous la balise instable .
Vous pouvez toujours vérifier quelles balises sont actuellement disponibles dans notre dépôt docker .
Pour exécuter la sortie la plus récente de Pypiserver avec Docker, simplement
docker run pypiserver/pypiserver:latest run
Cela démarre les packages de service Pypiserver à partir du répertoire / packages Data / Packages à l'intérieur du conteneur, en écoutant sur le port de conteneur 8080.
Le conteneur prend tous les mêmes arguments que l'exécutable normal PYPI-Server , à l'exception du port de conteneur interne ( -P ), qui sera toujours 8080.
Bien sûr, le simple fait de faire fonctionner un conteneur n'est pas si intéressant. Pour mapper le port 80 sur l'hôte du port 8080 sur le conteneur ::
docker run -p 80:8080 pypiserver/pypiserver:latest run
Vous pouvez désormais accéder à votre Pypiserver chez LocalHost: 80 dans un navigateur Web.
Pour servir les forfaits d'un répertoire sur l'hôte, par exemple / packages
docker run -p 80:8080 -v ~ /packages:/data/packages pypiserver/pypiserver:latest run
Pour s'authentifier contre un fichier .htpasswd local ::
docker run -p 80:8080 -v ~ /.htpasswd:/data/.htpasswd pypiserver/pypiserver:latest run -P .htpasswd packages
Vous pouvez également spécifier Pypiserver pour s'exécuter en tant que service Docker à l'aide d'un composé. Un exemple de composition compose est fourni comme docker-compose.yaml
Lorsque vous essayez les méthodes ci-dessous, utilisez d'abord la commande suivante pour vérifier si les versions précédentes de Pypiserver existent déjà, et (éventuellement) les désinstaller ::
# VERSION-CHECK: Fails if not installed.
pypi-server --version
# UNINSTALL: Invoke again until it fails.
pip uninstall pypiserver
Dans le cas où la dernière version de PYPI est une pré-libération, vous devez utiliser l'option PIP - PRE . Et pour mettre à jour une installation existante, combinez-le avec --ignore-installed
pip install pypiserver --pre -I
Vous pouvez même installer le dernier pypiserver directement à partir de GitHub avec la commande suivante, en supposant que Git soit installé sur votre chemin
pip install git+git://github.com/pypiserver/pypiserver.git
La commande PYPI-Server propose la commande de mise à jour qui recherche les mises à jour des packages disponibles. Il analyse le répertoire des packages pour les packages et les recherches disponibles sur PYPI.org pour les mises à jour. Sans d'autres options, PYPI-Server Update imprimera simplement une liste de commandes qui doivent être exécutées afin d'obtenir la dernière version de chaque package. La sortie ressemble à:
$ ./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
Il imprime d'abord pour chaque package un seul caractère après avoir vérifié les versions disponibles sur PYPI. Un point (.) Signifie que le package est à jour, «u» signifie que le package peut être mis à jour et «e» signifie que la liste des versions sur PYPI est vide. Après cela, il affiche une ligne de commande PIP qui peut être utilisée pour mettre à jour un package One. Copiez et collez cela ou exécutez PYPI-Server Update -X afin d'exécuter vraiment ces commandes. Vous devez cependant avoir installé PIP pour que cela fonctionne.
La spécification d'une option -U supplémentaire permettra également au téléchargement des candidats alpha, bêta et version. Sans cette option, ces versions ne seront pas prises en compte.
Important
Par défaut, Pypiserver analyse l'ensemble du répertoire Packages chaque fois qu'une demande HTTP entrante se produit. Ce n'est pas un problème pour un petit nombre de forfaits, mais provoque un ralentissement notable lors du service de milliers de packages.
Si vous rencontrez ce problème, des accélérations importantes peuvent être acquises en permettant aux fonctionnalités de mise en cache du répertoire de Pypiserver. La seule exigence consiste à installer le package de surveillance , ou il peut être installé lors de l'installation de Pypiserver , en spécifiant l'option Cache Extras ::
pip install pypiserver[cache]
Des accélérations supplémentaires peuvent être obtenues en utilisant la fonctionnalité de mise en cache intégrée de votre serveur Web. Par exemple, si vous utilisez nginx
comme proxy inversé comme décrit ci-dessous dans Behind a reverse proxy
, vous pouvez facilement activer la mise en cache. Par exemple, pour permettre à Nginx de se cacher jusqu'à 10 gigaoctets de données jusqu'à 1 heure ::
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 ;
}
}
Conseil
L'utilisation de la mise en cache du serveur Web est particulièrement utile si vous avez un volume de demande élevé. En utilisant la mise en cache Nginx, une installation de pypiserver réel a pu facilement prendre en charge plus de 1000 téléchargements de packages / min à la charge de pointe.
Il existe une variété d'options pour gérer le démarrage automatisé de Pypiserver lors du démarrage du système. Deux des plus courants sont Systemd et Superviseur pour les systèmes Linux. Pour les services de création de Windows avec des scripts, ce n'est pas une tâche facile sans un outil tiers tel que NSSM .
SystemD est installé par défaut sur la plupart des systèmes Linux modernes et en tant que tel, c'est une excellente option pour gérer le processus Pypiserver. Un exemple de fichier de configuration pour systemd peut être vu ci-dessous
[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
L'ajustement des chemins et l'ajout de ce fichier en tant que Pypiserver.Service dans votre répertoire SystemD / System permettra la gestion du processus Pypiserver avec SystemCTL , par exemple SystemCTL Start Pypiserver .
Des informations plus utiles sur Systemd peuvent être trouvées sur https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units
Le superviseur a l'avantage d'être un package pur python et en tant que tel, il offre un excellent support multiplateforme pour la gestion des processus. Un exemple de fichier de configuration pour le superviseur est donné ci-dessous
[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
De là, le processus peut être géré via SuperVisord à l'aide de SuperVisorctL .
Pour Windows, téléchargez NSSM depuis https://nssm.cc dézip à un emplacement souhaité tel que les fichiers de programme. Décidez si vous allez utiliser win32
ou win64
et ajoutez cet exe
au PATH
de l'environnement.
Créer un start_pypiserver.bat
pypi-server run -p 8080 C: P ath T o P ackages &
Conseil
Testez le fichier batch en l'exécutant d'abord avant de créer le service. Assurez-vous que vous pouvez accéder au serveur à distance et installer des packages. Si vous le pouvez, procédez, sinon dépanner jusqu'à ce que vous le puissiez. Cela garantira que vous savez que le serveur fonctionne, avant d'ajouter NSSM dans le mélange.
De l'invite de commande
nssm install pypiserver
Cette commande lancera une application GUI NSSM
Path: C: P ath T o s tart_pypiserver.bat
Startup directory: Auto generates when selecting path
Service name: pypiserver
Il y a plus d'onglets, mais c'est la configuration de base. Si le service doit être exécuté avec des informations d'identification de connexion, assurez-vous de saisir ces informations d'identification dans l'onglet de connexion.
Démarrer le service
nssm start pypiserver
Conseil
Autres commandes utiles
nssm --help
nssm stop < servicename >
nssm restart < servicename >
nssm status < servicename >
Pour des informations détaillées, veuillez visiter https://nssm.cc
Le serveur Web Bottle qui prend en charge de nombreux serveurs WSGI, entre autres, coller , cerisier , torsadé et wsgiref (partie de Python); Vous les sélectionnez à l'aide de l'indicateur - serveur .
Vous pouvez afficher tous les serveurs WSGI pris en charge en utilisant le code interactif suivant
>> > 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 aucun des serveurs ci-dessus ne correspond à vos besoins, invoquez uniquement la méthode pypiserver: app () qui renvoie le WSGI-App interne sans démarrer un serveur - vous pouvez ensuite l'envoyer à n'importe quel serveur WSGI que vous aimez. Lisez également l'utilisation de la section API.
Quelques exemples sont donnés ci-dessous - vous pouvez trouver plus de détails sur le site de la bouteille.
Pour utiliser votre Apache2 avec Pypiserver , préférez utiliser MOD_WSGI comme expliqué dans la documentation de Bottle.
Note
Si vous choisissez plutôt pour aller avec mod_proxy , pensez que vous pouvez vous heurter à des problèmes avec le préfixe-chemin (voir # 155).
Adaptez et placez la configuration d'Apache suivante soit dans la portée de niveau supérieur, soit dans certains <VirtualHost>
(contribué par 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 si vous utilisez une plus ancienne Apache <2,4 , remplacez la dernière partie avec ceci ::
< Directory /yoursite/wsgi >
Order deny,allow
Allow from all
< /Directory >
Créez ensuite le fichier /yoursite/cfg/pypiserver.wsgi et assurez-vous que l' utilisateur et le groupe de la directive WSGidaEmProcess ( PYPISRV: PYPISRV dans l'exemple) ont l'autorisation de lecture dessus
import pypiserver
conf = pypiserver . default_config (
root = "/yoursite/packages" ,
password_file = "/yoursite/htpasswd" , )
application = pypiserver . app ( ** conf )
[! Astuce] Si vous avez installé Pypiserver dans un VirtualEnv, suivez les instructions de MOD_WSGI et appliquez le code Python ci-dessus avec les suivants
import site site . addsitedir ( '/yoursite/venv/lib/pythonX.X/site-packages' )
Note
Pour des raisons de sécurité, notez que le répertoire répertorié accorde l'accès à un répertoire détenant le script de démarrage WSGI , seul; rien d'autre.
Note
Pour activer la prise en charge HTTPS sur Apache, configurez la directive qui contient la configuration WSGI pour utiliser SSL.
La commande suivante utilise Gunicorn pour démarrer Pypiserver
gunicorn -w4 ' pypiserver:app(root="/home/ralf/packages") '
ou lorsque vous utilisez plusieurs racines
gunicorn -w4 ' pypiserver:app(root=["/home/ralf/packages", "/home/ralf/experimental"]) '
La pâte permet d'exécuter plusieurs applications WSGI sous différents chemins d'URL. Par conséquent, il est possible de servir différents ensembles de packages sur différents chemins.
L'exemple de paste.ini suivant pourrait être utilisé pour servir des packages stables et instables sur différents chemins
[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 = -
Note
Vous devez installer d'autres dépendances pour que cela fonctionne, comme ::
pip install paste pastedeploy gunicorn pypiserver
Le serveur peut alors commencer par
gunicorn_paster paste.ini
Vous pouvez également exécuter Pypiserver derrière un proxy inversé.
Étendre votre configuration 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 ;
}
}
À partir de Pypiserver 1.3, vous pouvez également utiliser l'en-tête X-Forwarded-Host
dans votre configuration proxy inverse pour permettre la modification de l'URL de base. Par exemple, si vous souhaitez héberger Pypiserver sous un chemin particulier sur votre serveur
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 ;
}
}
L'utilisation d'un proxy inversé est le moyen préféré d'obtenir un pypiserver derrière HTTPS. Par exemple, pour mettre Pypiserver derrière HTTPS sur le port 443, avec une redirection HTTP automatique, en utilisant 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 ;
}
}
Conseil
Veuillez consulter les documents HTTPS de Nginx pour plus de détails.
Obtenir et garder vos certificats à jour peut être simplifié en utilisant, par exemple, à l'aide de CERTBOT et LETSENCYPT.
Il est également possible d'utiliser Trafik pour mettre Pypiserver derrière HTTPS sur le port 443, avec une redirection HTTP automatique à l'aide de Docker Compose. Veuillez consulter l'exemple docker-compose.yml fourni pour plus d'informations.
Afin d'activer les fournisseurs d'authentification ad-hoc ou d'utiliser des serveurs WSGI non pris en charge par la bouteille , vous deviez lancer Pypiserver via son API.
Le point d'entrée principal pour la configuration de Pypiserver est la fonction Pypiserver: app (). Cette fonction renvoie le WSGI-app interne que vous envoyez ensuite à n'importe quel serveur wsgi que vous aimez.
Pour obtenir tous les mots clés pypiserver: app () et leurs explications, lisez la fonction pypiserver: default_config ()
Enfin, pour infiler un serveur WSGI avec l'application configurée, invoquez la fonction Bottle: Exécuter (application, hôte, port, serveur) . Notez que Pypiserver est expédié avec sa propre copie de Bottle ; Pour l'utiliser, importez-le comme ça: à partir de la bouteille d'importation Pypiserver
Le mot-clé Authers de la fonction Pypiserver: app () peut-être définir uniquement à l'aide de l'API. Cela peut être n'importe quel appelable qui renvoie un booléen lorsqu'il est passé le nom d'utilisateur et le mot de passe pour une demande donnée.
Par exemple, pour authentifier les utilisateurs en fonction du fichier / etc / passwd sous Unix, vous pouvez déléguer de telles décisions à la bibliothèque Python-PAM en suivant ces étapes:
Assurez-vous que le module Python-PAM est installé
pip install python-pam
Créer un Script Python dans ce sens
$ 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]
Invoquez le Script Python au start-up Pypiserver
python pypiserver-start.py
Note
Le module Python-PAM nécessite un accès en lecture au fichier / etc / shadow ; Vous pouvez ajouter l'utilisateur sous lequel Pypiserver se déroule dans le groupe Shadow , avec une commande comme celle-ci: Sudo Usermod -a -g Shadow PyPy-User .
L'interprète Micropython pour les périphériques intégrés peut installer des packages avec le module upip.py. Le module utilise un point d'emboutrage JSON spécialisé pour récupérer les informations du package. Ce point de terminaison est pris en charge par Pypiserver .
Il peut être testé avec le port Unix de Micropython
cd micropython
ports/unix/micropython -m tools.upip install -i http://my-server:8080 -p /tmp/mymodules micropython-foobar
L'installation de packages à partir du remplacement d'un appareil intégré fonctionne de cette manière:
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" )
De plus amples informations sur le micropopython-packaging peuvent être trouvées ici: https://docs.micropython.org/en/latest/reference/packages.html
Pypiserver fournit un point de terminaison de santé par défaut au / santé . Il renvoie toujours 200 ok si le service est en place. Sinon, cela signifie que le service n'est pas réactif.
De plus, Pypiserver permet aux utilisateurs de personnaliser le point de terminaison de la santé. Les caractères alphanumériques, les traits de tir, les barres obliques et les soulignements sont autorisés et le point de terminaison ne devrait pas se chevaucher avec des itinéraires existants. Exemples valides: / Healthz , / Health / Live-1 , / api_Health , / Action / Health
Exécutez un pypiserver avec un argument de la santé-end :
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" )
Essayez Curl http: // localhost: 8080 / Action / Health
Pour créer une copie du référentiel, utilisez
git clone https://github.com/pypiserver/pypiserver.git
cd pypiserver
Pour recevoir des modifications ultérieures, dans l'utilisation du dossier ci-dessus:
git pull
Important
Pypiserver n'implémente pas l'API complète comme on le voit sur PYPI. Il implémente juste assez pour faire des travaux Easy_install , PIP d'installation et de recherche .
Les limitations suivantes sont connues:
Veuillez utiliser Bugtracker de GitHub pour d'autres bugs que vous trouvez.
Il existe de nombreux autres projets, qui vous permettent d'exécuter votre propre serveur PYPI. Si Pypiserver ne fonctionne pas pour vous, les éléments suivants sont parmi les alternatives les plus populaires:
DevPI-Server: un serveur de mise en cache Fast PYPI.org rapide fiable, une partie du serveur d'index PYPI de style GitHub complet et de l'outil de méta de l'emballage. (Version: 2.1.4, date d'accès: 8/3/2015)
Vérifiez ceci donc la question: comment rouler mon propre PYPI
Ces projets étaient autrefois des alternatives à Pypiserver, mais sont désormais non entretenus ou archivés.
pip2pi Un outil de ligne CMD simple qui construit un dossier local compatible PYPI à partir des exigences PIP
FLASK-PYPI-PROXY Un proxy pour PYPI qui permet également de télécharger des packages personnalisés.
Bien que ce ne soit pas des alternatives directes pour l'utilisation de Pypiserver comme serveur d'index, ce qui suit est une liste de projets logiciels connexes que vous souhaiterez peut-être familiariser:
PYPI-Uploader: une utilitaire de ligne de commande pour télécharger des packages sur votre Pypiserver à partir de PYPI sans avoir à les stocker localement en premier.
Twine: une utilité en ligne de commande pour interagir avec PYPI ou Pypiserver .
Entrepôt: le logiciel qui alimente PYPI lui-même. Il n'est généralement pas destiné à être géré par les utilisateurs finaux.
Pypiserver contient une copie de la bouteille disponible sous la licence MIT, et la partie restante est distribuée sous la licence ZLIB / LIBPNG. Voir le fichier licence.txt .