Name | Beschreibung |
---|---|
Version | 2.2.0 |
Datum: | 2024-09-15 |
Quelle | https://github.com/pypiserver/pypiserver |
Pypi | https://pypi.org/project/pypiserver/ |
Tests | https://github.com/pypiserver/pypiserver/actions |
Betreuer | @ankostis , @mplanchard , @dee-me-tree-or-love , @pawamoy , jemand neu? Wir sind offen für neue Betreuer! #397 |
Lizenz | ZLIB/libpng + Mit |
Gemeinschaft | https://pypiserver.zulipchat.com |
Tipp
Greifen Sie in Diskussionen oder unterhalten Sie sich mit uns auf Zulip
Pypiserver ist ein minimaler PYPI -kompatibler Server für PIP oder Easy_install . Es basiert auf Flaschen und serviert Pakete aus regulären Verzeichnissen. Räder, Bdisten, Eier und begleitende PGP-Signaturen können entweder mit PIP , Setuptools , Twine , PYPI-UPLoader hochgeladen oder einfach mit SCP kopiert werden.
Notiz
Die offizielle Software, die PYPI betreibt, ist Lagerhaus. Warehouse ist jedoch ziemlich spezialisiert auf die eigene Software von PYPI.org und sollte nicht in anderen Kontexten verwendet werden. Insbesondere unterstützt es nicht offiziell, als benutzerdefinierte Paketindex von Benutzern verwendet zu werden, die ihre eigenen Pakete bedienen möchten.
Pypiserver implementiert dieselben Schnittstellen wie PYPI, sodass die Standard -Python -Verpackungs -Tools wie PIP und Twine als Paketindex wie bei PYPI mit ihm interagieren können, und gleichzeitig das Erhalten eines laufenden Indexservers erleichtert.
Inhaltsverzeichnis
Pypiserver arbeitet mit Python 3.6+ und Pypy3.
Ältere Python -Versionen funktionieren möglicherweise noch, aber sie werden nicht getestet.
Verwenden Sie für Legacy Python-Versionen die Pypiserver-1.x -Serie. Beachten Sie, dass diese nicht offiziell unterstützt werden und keine Fehler oder neue Funktionen erhalten.
Tipp
Die folgenden Befehle arbeiten an einem Unix-ähnlichen Betriebssystem mit einer POSIX-Shell. Das '~' -Scharakter erweitert das Heimverzeichnis des Benutzers.
Wenn Sie Windows verwenden, müssen Sie ihre "Windows -Gegenstücke" verwenden. Gleiches gilt für den Rest dieser Dokumentation.
Installieren Sie Pypiserver mit diesem Befehl
pip install pypiserver # Or: pypiserver[passlib,cache]
mkdir ~ /packages # Copy packages into this directory.
[! Tipp] Siehe auch alternative Installationsmethoden
Kopieren Sie einige Pakete in Ihren Ordner ~/paketes und lassen Sie Ihren Pypiserver in Betrieb genommen
pypi-server run -p 8080 ~ /packages & # Will listen to all IPs.
Geben Sie dies vom Client -Computer ein
# 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.
[! Tipp] Siehe auch clientseitige Konfigurationen zur Vermeidung einer mühsamen Tippen.
Geben Sie pypi-server -h in die cmd-line ein, um eine detaillierte Nutzungsnachricht zu drucken
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
Geben Sie PYPI-Server Run -h in die CMD-Linie ein, um eine detaillierte Verwendung zu drucken
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.
Weitere Details zum PYPI-Server-Update
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.
Die PYPI -URL in der Befehlszeile ist immer umständlich. Da Pypiserver PIP/easy_install in den pypi.org -Index umleitet, wenn es kein angefordertes Paket hat, ist es eine gute Idee, sie so zu konfigurieren, dass Sie immer Ihren lokalen PYPI -Index verwenden.
Für PIP -Befehl kann dies erfolgen
export PIP_EXTRA_INDEX_URL=http://localhost:8080/simple/
oder durch Hinzufügen der folgenden Zeilen zu ~/.pip/pip.conf
[global]
extra-index-url = http://localhost:8080/simple/
Notiz
Wenn Sie Pypiserver auf einer Remote-URL ohne HTTPS installiert haben, erhalten Sie eine "nicht vertrauenswürdige" Warnung von PIP und fordern Sie auf, die Option „Trusted-Host“ anzuhängen. Sie können diese Option auch dauerhaft in Ihre Konfigurationsdaten oder Umgebungsvariablen einbeziehen.
Für den Befehl Easy_install können Sie die folgende Konfiguration in ~/.pydistutils.cfg festlegen
[easy_install]
index_url = http://localhost:8080/simple/
Anstatt Pakete direkt in den Ordner des Servers (dh mit SCP ) zu kopieren, verwenden Sie möglicherweise Python -Tools für die Aufgabe, z. B. Python Setup.py Upload . In diesem Fall ist Pypiserver für die Authentifizierung der Upload-Requests verantwortlich.
Notiz
Wir empfehlen dringend, Ihre Uploads Passwort zu schützen !
Es ist möglich, die Authentifizierung für Uploads zu deaktivieren (z. B. in Intranets). Um faule Sicherheitsentscheidungen zu vermeiden, lesen Sie die Hilfe für -P- und -a -Optionen.
Stellen Sie zunächst sicher, dass das Passlib -Modul installiert ist (beachten Sie, dass PASSLIB> = 1.6 erforderlich ist), das für die Parsen der von der Option -p -Passwords -Option -p -Option -Passwords angegebenen Apache -Htpasswd -Datei benötigt wird (siehe nächste Schritte)
pip install passlib
Erstellen Sie die Apache -HTPasswd -Datei mit mindestens einem Benutzer/Passwort -Paar mit diesem Befehl (Sie werden für ein Kennwort aufgefordert).
htpasswd -sc htpasswd.txt < some_username >
Tipp
Lesen Sie diese Frage zum Ausführen von htpasswd
CMD unter Windows oder wenn Sie falsche Passwörter haben, die Sie nicht interessieren, weil sie für einen internen Service (was immer noch "schlecht" aus Sicherheitsgründen ist ...). Sie können diese Öffentlichkeit verwenden Service
Tipp
Wenn Sie über die API auf Pypiserver zugreifen, sind alternative Authentifizierungsmethoden über das Auther -Konfigurationsflag verfügbar. Jeder Callable, der einen Booleschen zurückgibt, kann an die Pypiserver -Konfiguration weitergegeben werden, um eine benutzerdefinierte Authentifizierung bereitzustellen. Zum Beispiel, um pypiserver zu authentifizieren zu konfigurieren, mit dem Python-PAM zu authentifizieren
import pam
pypiserver.default_config(auther=pam.authenticate)
Weitere Informationen finden Sie Using Ad-hoc authentication providers
.
Sie müssen den Server nur einmal mit der Option -P neu starten (Benutzer-/Passwortpaare können später im laufenden Fliegen hinzugefügt oder aktualisiert werden).
./pypi-server run -p 8080 -P htpasswd.txt ~ /packages &
Bearbeiten oder erstellen Sie eine ~/.pypirc- Datei mit einem ähnlichen Inhalt auf die Client-Seite:
[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 >
Aus dem Verzeichnis des Python-Project, den Sie hochladen möchten, geben Sie diesen Befehl aus:
python setup.py sdist upload -r local
Um zu vermeiden, dass Sie Ihre Passwörter auf der Festplatte speichern, können Sie in klarem Text: entweder:
Verwenden Sie den Befehl Register setuptools mit der Option -r wie diese
python setup.py sdist register -r local upload -r local
Verwenden Sie die Twine Library, die das Verfahren in zwei Schritten durchbricht. Darüber hinaus unterstützt es die Unterzeichnung Ihrer Dateien mit PGP-Signaturen und das Hochladen der generierten .C- Dateien auf pypiserver ::
twine upload -r local --sign -identity user_name ./foo-1.zip
Beginnend mit Version 1.2.5 werden offizielle Docker -Bilder für jeden Push zu main
, jede Dev-, Alpha- oder Beta -Version und jede endgültige Veröffentlichung erstellt. Die jüngste vollständige Version wird immer unter dem Tag der Tag der Tag verfügbar sein, und die aktuelle main
wird immer unter dem Tag instabil erhältlich sein.
Sie können immer überprüfen, welche Tags derzeit in unserem Docker -Repo verfügbar sind.
Um die neueste Veröffentlichung von Pypiserver mit Docker auszuführen, einfach
docker run pypiserver/pypiserver:latest run
Dadurch wird Pypiserver -Servierpakete aus dem Verzeichnis /data /paket im Container im Container geführt und auf dem Containerport 8080 anhören.
Der Container nimmt alle gleichen Argumente wie die normale ausführbare PYPI -Server -Datei mit Ausnahme des internen Containerports ( -P ), der immer 8080 beträgt.
Natürlich ist es nicht so interessant, nur einen Container zu laufen. So machten Sie Port 80 auf dem Host zu Port 8080 im Container :: ::
docker run -p 80:8080 pypiserver/pypiserver:latest run
Sie können jetzt in einem Webbrowser auf Ihren Pypiserver bei Localhost: 80 zugreifen.
Pakete aus einem Verzeichnis auf dem Host, z. ~/Pakete
docker run -p 80:8080 -v ~ /packages:/data/packages pypiserver/pypiserver:latest run
Authentifizierung gegen eine lokale .htpasswd -Datei ::
docker run -p 80:8080 -v ~ /.htpasswd:/data/.htpasswd pypiserver/pypiserver:latest run -P .htpasswd packages
Sie können auch angeben, dass Pypiserver als Docker -Dienst mit einem ComposeFile ausgeführt wird. Ein Beispiel ComposeFile wird als docker-compose.yaml
bereitgestellt
Wenn Sie die folgenden Methoden ausprobieren, verwenden Sie zunächst den folgenden Befehl, um zu überprüfen, ob frühere Versionen von Pypiserver bereits vorhanden sind, und (optional) nicht deinstallieren ::
# VERSION-CHECK: Fails if not installed.
pypi-server --version
# UNINSTALL: Invoke again until it fails.
pip uninstall pypiserver
Für den Fall, dass die neueste Version in PYPI eine Vorveröffentlichung ist, müssen Sie die Option Pips - PRE verwenden. Und um eine vorhandene Installation zu aktualisieren, kombinieren Sie sie mit --ignore-installed
pip install pypiserver --pre -I
Sie können sogar den neuesten Pypiserver direkt aus GitHub mit dem folgenden Befehl installieren, vorausgesetzt, Sie haben Git auf Ihrem Pfad installiert
pip install git+git://github.com/pypiserver/pypiserver.git
Der Befehl pypi-server enthält den Befehl Update , der nach Updates der verfügbaren Pakete sucht. Es scannt das Paketverzeichnis nach verfügbaren Paketen und Suche auf pypi.org nach Updates. Ohne weitere Optionen wird das PYPI-Server-Update nur eine Liste von Befehlen ausdrucken, die ausgeführt werden müssen, um die neueste Version jedes Pakets zu erhalten. Ausgabe sieht aus wie:
$ ./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
Es druckt zunächst für jedes Paket ein einzelnes Zeichen nach der Überprüfung der verfügbaren Versionen auf PYPI. Ein Punkt (.) Bedeutet, dass das Paket auf dem neuesten Stand ist, 'u' bedeutet, dass das Paket aktualisiert werden kann und 'e' bedeutet, dass die Liste der Veröffentlichungen auf PYPI leer ist. Danach wird eine PIP -Befehlszeile angezeigt, mit der ein Paket aktualisiert werden kann. Entweder kopieren und fügen Sie das ein oder führen Sie PYPI -Server -Update -x aus, um diese Befehle wirklich auszuführen. Sie müssen jedoch PIP installieren, damit dies funktioniert.
Wenn Sie eine zusätzliche Option angeben , können Alpha-, Beta- und Release -Kandidaten auch heruntergeladen werden. Ohne diese Option werden diese Veröffentlichungen nicht berücksichtigt.
Wichtig
Standardmäßig scannt PYPISERVER das gesamte Verzeichnis des Pakets jedes Mal, wenn eine eingehende HTTP -Anforderung auftritt. Dies ist kein Problem für eine kleine Anzahl von Paketen, verursacht jedoch bemerkenswerte Verlangsamungen beim Servieren von Tausenden von Paketen.
Wenn Sie auf dieses Problem stoßen, können erhebliche Beschleunigungen erreicht werden, indem das Verzeichnis von Pypiserver -Verzeichnis -Caching -Funktionalität aktiviert wird. Die einzige Anforderung besteht darin, das Watchdog -Paket zu installieren, oder es kann während der Pypiserver -Installation installiert werden, indem die Option Cache Extras angegeben wird ::
pip install pypiserver[cache]
Zusätzliche Beschleunigungen können mit der integrierten Caching -Funktionalität Ihres Webservers erhalten werden. Wenn Sie beispielsweise nginx
als Reverse-Proxy verwenden, wie unten in Behind a reverse proxy
beschrieben, können Sie das Caching leicht aktivieren. Zum Beispiel, damit Nginx bis zu 1 Stunde bis zu 10 Gigabyte Daten für bis zu 10 Gigabyte Cache Cache ermöglicht hat ::
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 ;
}
}
Tipp
Die Verwendung von Webserver -Caching ist besonders hilfreich, wenn Sie ein hohes Anfragevolumen haben. Unter Verwendung von Nginx Caching konnte eine reale Pypiserver-Installation bei Spitzenlast problemlos über 1000 Paket-Downloads/min unterstützen.
Es gibt eine Vielzahl von Optionen für den Umgang mit dem automatisierten Start von Pypiserver beim Systemstart. Zwei der häufigsten sind Systemd und Supervisor für Linux -Systeme. Für Windows -Dienste mit Skripten ist ohne ein Drittanbieter -Tool wie NSSM keine leichte Aufgabe.
Systemd ist standardmäßig auf den meisten modernen Linux -Systemen installiert, und als solche ist es eine hervorragende Option, um den Pypiserver -Prozess zu verwalten. Eine Beispiel -Konfigurationsdatei für Systemd finden Sie unten
[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
Das Anpassen der Pfade und das Hinzufügen dieser Datei als pypiserver.service in Ihr SystemD/System -Verzeichnis ermöglicht die Verwaltung des Pypiserver -Prozesses mit SystemCTL , EG SystemCTL Start Pypiserver .
Weitere nützliche Informationen zu Systemd finden Sie unter https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-Systemd-services-and-units
Supervisor hat den Vorteil, ein reines Python-Paket zu sein, und bietet als solche eine hervorragende plattformübergreifende Unterstützung für das Prozessmanagement. Eine Beispielkonfigurationsdatei für Supervisor ist unten angegeben
[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
Von dort aus kann der Prozess über Supervisford mit Supervisorctl verwaltet werden.
Für Windows Download NSSM von https://nssm.cc unzip -unzip an einen gewünschten Ort wie Programmdateien. Entscheiden Sie, ob Sie win32
oder win64
verwenden möchten, und fügen Sie diesen exe
zum PATH
hinzu.
Erstellen Sie einen start_pypiserver.bat
pypi-server run -p 8080 C: P ath T o P ackages &
Tipp
Testen Sie die Batch -Datei, indem Sie sie zuerst ausführen, bevor Sie den Dienst erstellen. Stellen Sie sicher, dass Sie auf die Server remote zugreifen und Pakete installieren können. Wenn Sie können, fahren Sie fort, wenn Sie nicht beheben, bis Sie können. Dadurch wird sichergestellt, dass Sie wissen, dass der Server funktioniert, bevor NSSM in den Mix hinzugefügt wird.
Aus der Eingabeaufforderung
nssm install pypiserver
Dieser Befehl startet eine NSSM -GUI -Anwendung
Path: C: P ath T o s tart_pypiserver.bat
Startup directory: Auto generates when selecting path
Service name: pypiserver
Es gibt mehr Registerkarten, aber das ist das grundlegende Setup. Wenn der Dienst mit bestimmten Anmeldeinformationen ausgeführt werden muss, stellen Sie sicher, dass Sie diese Anmeldeinformationen auf der Registerkarte Anmeldung eingeben.
Starten Sie den Service
nssm start pypiserver
Tipp
Andere nützliche Befehle
nssm --help
nssm stop < servicename >
nssm restart < servicename >
nssm status < servicename >
Ausführliche Informationen finden Sie unter https://nssm.cccccc
Der Flaschen -Webserver, der unter anderem viele WSGI-Server unterstützt, Paste , Cherrypy , Twisted und WSGiref (Teil von Python); Sie wählen sie mit dem Flag -Server -Flag aus.
Sie können alle unterstützten WSGI -Server mit dem folgenden interaktiven Code anzeigen
>> > 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' ]
Wenn keiner der oben genannten Server Ihren Anforderungen entspricht, rufen Sie nur die Methode pypiserver: app () auf, die die interne WSGI-App zurückgibt, ohne einen Server zu starten-Sie können sie dann an einen beliebenden WSGI-Server senden. Lesen Sie auch die Verwendung des API -Abschnitts.
Einige Beispiele finden Sie unten - Sie finden möglicherweise weitere Details auf der Flaschenstelle.
Um Ihren Apache2 mit Pypiserver zu verwenden, verwenden Sie es, Mod_wsgi zu verwenden, wie in der Dokumentation der Flasche erläutert.
Notiz
Wenn Sie stattdessen für Mod_Proxy entscheiden, stellen Sie fest, dass Sie Probleme mit dem Präfix-Pfad begegnen können (siehe #155).
Passen Sie die folgende Apache -Konfiguration an und platzieren Sie entweder in einen Bereich der obersten Ebene oder in einigen <VirtualHost>
(beigetragen von 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 >
oder wenn Sie ältere Apache <2.4 verwenden, ersetzen Sie den letzten Teil damit ::
< Directory /yoursite/wsgi >
Order deny,allow
Allow from all
< /Directory >
Erstellen Sie dann die Datei /yourSite/cfg/pypiserverver.wsgi und stellen Sie sicher
import pypiserver
conf = pypiserver . default_config (
root = "/yoursite/packages" ,
password_file = "/yoursite/htpasswd" , )
application = pypiserver . app ( ** conf )
[! Tipp] Wenn Sie Pypiserver in einem Virtualenv installiert haben
import site site . addsitedir ( '/yoursite/venv/lib/pythonX.X/site-packages' )
Notiz
Beachten Sie aus Sicherheitsgründen, dass die Verzeichnisrichtlinie den Zugang zu einem Verzeichnis gewährt, das allein das WSGI- Startskript mit dem Start-up-Skript enthält. nichts anderes.
Notiz
Konfigurieren Sie die Anweisung, die die WSGI -Konfiguration enthält, um SSL zu verwenden.
Der folgende Befehl verwendet Gunicorn, um Pypiserver zu starten
gunicorn -w4 ' pypiserver:app(root="/home/ralf/packages") '
oder bei Verwendung mehrerer Wurzeln
gunicorn -w4 ' pypiserver:app(root=["/home/ralf/packages", "/home/ralf/experimental"]) '
Durch die Paste können mehrere WSGI -Anwendungen unter verschiedenen URL -Pfaden ausgeführt werden. Daher ist es möglich, verschiedene Pakete auf verschiedenen Pfaden zu servieren.
Das folgende Beispiel Paste.ini kann verwendet werden, um stabile und instabile Pakete auf verschiedenen Pfaden zu servieren
[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 = -
Notiz
Sie müssen weitere Abhängigkeiten installieren, damit dies funktioniert, wie ::
pip install paste pastedeploy gunicorn pypiserver
Der Server kann dann mit beginnen
gunicorn_paster paste.ini
Sie können Pypiserver auch hinter einem Reverse -Proxy ausführen.
Erweitern Sie Ihre Nginx -Konfiguration
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 ;
}
}
Ab PYPIERVERVER 1.3 können Sie auch den X-Forwarded-Host
Header in Ihrer Reverse-Proxy-Konfiguration verwenden, um das Ändern der Basis-URL zu ermöglichen. Zum Beispiel, wenn Sie Pypiserver auf Ihrem Server unter einem bestimmten Pfad hosten möchten
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 ;
}
}
Die Verwendung eines Reverse -Proxy ist die bevorzugte Methode, um Pypiserver hinter HTTPS zu bringen. Zum Beispiel, um Pypiserver hinter HTTPS auf Port 443 mit automatischer HTTP -Umleitung unter Verwendung von nginx
zu setzen
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 ;
}
}
Tipp
Weitere Informationen finden Sie in den HTTPS -Dokumenten von NGINX.
Wenn Sie Ihre Zertifikate auf dem neuesten Stand erhalten und auf dem neuesten Stand halten, kann dies mit Certbot und LetSencrypt vereinfacht werden.
Es ist auch möglich, Traefik zu verwenden, um Pypiserver hinter HTTPS auf Port 443 zu setzen, wobei die automatische HTTP -Umleitung mit Docker Compose regelt wird. Weitere Informationen finden Sie im Beispiel für docer-compose.yml.
Um die AD-hoc-Authentifizierungsanbieter zu ermöglichen oder WSGI-Server zu verwenden, die nicht von Flaschen -Out-of-the-Box unterstützt werden, mussten Sie Pypiserver über seine API starten.
Der Haupteingangspunkt für die Konfiguration von Pypiserver ist die Funktion pypiserver: app (). Diese Funktion gibt die interne WSGI-App zurück, die Sie dann an einen beliebigen WSGI-Server senden, den Sie mögen.
So lesen Sie die Funktion PYPISERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERVERV.
Um einen WSGI-Server mit der konfigurierten App aufzurüsten, rufen Sie die Flasche: Run (App, Host, Port, Server) auf. Beachten Sie, dass Pypiserver mit einer eigenen Kopie der Flasche versandt; Um es zu verwenden, importieren Sie es so: aus der Pypiserver -Importflasche
Das Auther -Schlüsselwort von pypiserver: app () kann möglicherweise nur mit der API festgelegt werden. Dies kann jeder Anruf sein, der einen Booleschen zurückgibt, wenn er den Benutzernamen und das Passwort für eine bestimmte Anfrage übergeben hat.
Zum Beispiel können Sie diese Entscheidungen an die Python-PAM-Bibliothek delegieren, um Benutzer auf der Grundlage der Datei /etc /passwd unter UNIX zu authentifizieren, indem Sie diese Schritte befolgen:
Stellen Sie sicher, dass das Python-PAM -Modul installiert ist
pip install python-pam
Erstellen Sie ein Python-Skript in diesem Sinne
$ 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]
Rufen Sie das Python-Skript zum Start-up- Pypiserver auf
python pypiserver-start.py
Notiz
Das Python-PAM-Modul erfordert Lesezugriff auf /etc /Shadow- Datei. Sie können den Benutzer hinzufügen, unter dem Pypiserver in die Schattengruppe rennt, mit einem Befehl wie folgt: sudo usermod -a -g Shadow Pypy -Benutzer .
Der Micropython -Interpreter für eingebettete Geräte kann Pakete mit dem Modul upip.py installieren. Das Modul verwendet einen speziellen JSON-Endpunkt, um Paketinformationen abzurufen. Dieser Endpunkt wird von Pypiserver unterstützt.
Es kann mit dem UNIX -Port von Micropython getestet werden
cd micropython
ports/unix/micropython -m tools.upip install -i http://my-server:8080 -p /tmp/mymodules micropython-foobar
Die Installation von Paketen aus der Reply eines eingebetteten Geräts funktioniert auf diese Weise:
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" )
Weitere Informationen zu Micropython-Packaging finden Sie hier: https://docs.micropython.org/en/latest/reference/packages.html
Pypiserver bietet einen Standard -Gesundheitsendpunkt bei /Gesundheit . Es gibt immer 200 OK zurück, wenn der Service abgelaufen ist. Andernfalls bedeutet dies, dass der Dienst nicht reagiert.
Darüber hinaus ermöglicht PYPISERVERVERVERVERVERVERSCHLUSS den Gesundheitsendpunkt. Alphanumerische Zeichen, Bindestriche, Vorwärts -Schrägstriche und Unterstriche sind zulässig, und der Endpunkt sollte sich nicht mit vorhandenen Routen überlappen. Gültige Beispiele: /Healthz , /Health /Live-1 , /api_health , /action /Health
Führen Sie Pypiserver mit --Health-Endpoint -Argument aus:
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" )
Versuchen Sie es mit Curl http: // localhost: 8080/action/Health
Verwenden Sie, um eine Kopie des Repositorys zu erstellen
git clone https://github.com/pypiserver/pypiserver.git
cd pypiserver
Um spätere Änderungen zu erhalten, verwenden Sie im obigen Ordner:
git pull
Wichtig
Pypiserver implementiert die vollständige API nicht wie auf PYPI. Es implementiert gerade genug, um Easy_install , PIP -Installation und Sucharbeiten zu machen.
Die folgenden Einschränkungen sind bekannt:
Bitte verwenden Sie Githubs Bugtracker für andere Fehler, die Sie finden.
Es gibt viele andere Projekte, mit denen Sie Ihren eigenen PYPI -Server ausführen können. Wenn Pypiserver nicht für Sie funktioniert, gehören Folgendes zu den beliebtesten Alternativen:
DevPI-Server: Ein zuverlässiger schneller PYPI.org-Caching-Server, Teil des umfassenden PYPI-Indexservers im GitHub-Stil und dem Meta-Tool im Verpackung. (Version: 2.1.4, Zugriffsdatum: 03.08.2015)
Überprüfen Sie diese Frage: So rollen ich mein eigenes PYPI
Diese Projekte waren einst Alternativen zu Pypiserver, sind aber jetzt entweder nicht gehört oder archiviert.
PIP2PI Ein einfaches CMD-Line-Tool, das einen pypi-kompatiblen lokalen Ordner aus PIP-Anforderungen erstellt
Flask-Pypi-Proxy Ein Proxy für PYPI, mit dem auch benutzerdefinierte Pakete hochgeladen werden können.
Obwohl keine direkten Alternativen für Pypiservers Verwendung als Indexserver sind, finden Sie eine Liste der verwandten Softwareprojekte, mit denen Sie sich möglicherweise vertraut machen möchten:
PYPI-UPLADER: Ein Befehlszeilen-Dienstprogramm zum Hochladen von Paketen von PYPI von PYPI, ohne sie zuerst lokal speichern zu müssen.
Twine: Ein Befehlszeilendienstprogramm für die Interaktion mit PYPI oder PYPISERVER .
Lagerhaus: Die Software, die Pypi selbst versorgt. Es ist im Allgemeinen nicht von Endbenutzern gedacht.
Pypiserver enthält eine Kopie der Flasche, die unter der MIT -Lizenz erhältlich ist, und der verbleibende Teil wird unter der ZLIB/libpng -Lizenz verteilt. Siehe die lizenz.txtdatei .