ชื่อ | คำอธิบาย |
---|---|
รุ่น | 2.2.0 |
วันที่: | 2024-09-15 |
แหล่งที่มา | https://github.com/pypiserver/pypiserver |
Pypi | https://pypi.org/project/pypiserver/ |
การทดสอบ | https://github.com/pypiserver/pypiserver/actions |
ผู้ดูแล | @ankostis , @mplanchard , @dee-me-tree-or-love , @pawamoy , มีคนใหม่? เราเปิดให้บริการสำหรับผู้ดูแลใหม่! #397 |
ใบอนุญาต | zlib/libpng + mit |
ชุมชน | https://pypiserver.zulipchat.com |
เคล็ดลับ
เอื้อม
Pypiserver เป็นเซิร์ฟเวอร์ที่เข้ากันได้กับ PYPI น้อยที่สุดสำหรับ PIP หรือ Easy_install มันขึ้นอยู่กับขวดและให้บริการแพ็คเกจจากไดเรกทอรีปกติ ล้อ, bdists, ไข่และการลงนาม PGP สามารถอัปโหลดได้ทั้งด้วย pip , setuptools , เส้นใหญ่ , pypi-uploader หรือเพียงแค่คัดลอกด้วย SCP
บันทึก
ซอฟต์แวร์อย่างเป็นทางการ PYPI คือคลังสินค้า อย่างไรก็ตามคลังสินค้ามีความเชี่ยวชาญเป็นพอสมควรที่จะเป็นซอฟต์แวร์ของ PYPI.org และไม่ควรใช้ในบริบทอื่น ๆ โดยเฉพาะอย่างยิ่งมันไม่สนับสนุนอย่างเป็นทางการที่ใช้เป็นดัชนีแพ็คเกจที่กำหนดเองโดยผู้ใช้ที่ต้องการให้บริการแพ็คเกจของตนเอง
Pypiserver ใช้อินเทอร์เฟซเดียวกันกับ PYPI ช่วยให้เครื่องมือบรรจุภัณฑ์ Python มาตรฐานเช่น PIP และ Twine เพื่อโต้ตอบกับดัชนีแพ็คเกจเช่นเดียวกับ PYPI ในขณะที่ทำให้ง่ายต่อการรับเซิร์ฟเวอร์ดัชนี
สารบัญ
Pypiserver ทำงานร่วมกับ Python 3.6+ และ Pypy3
รุ่น Python รุ่นเก่าอาจยังทำงานได้ แต่ยังไม่ได้ทดสอบ
สำหรับรุ่น Python แบบดั้งเดิมใช้ Series pypiserver-1.x โปรดทราบว่าสิ่งเหล่านี้ไม่ได้รับการสนับสนุนอย่างเป็นทางการและจะไม่ได้รับข้อผิดพลาดหรือคุณสมบัติใหม่
เคล็ดลับ
คำสั่งด้านล่างทำงานบนระบบปฏิบัติการแบบ UNIX ที่มีเชลล์ Posix อักขระ '~' ขยายไปยังไดเรกทอรีโฮมเมดของผู้ใช้
หากคุณใช้ Windows คุณจะต้องใช้ "Windows Counterparts" เช่นเดียวกันสำหรับส่วนที่เหลือของเอกสารนี้
ติดตั้ง pypiserver ด้วยคำสั่งนี้
pip install pypiserver # Or: pypiserver[passlib,cache]
mkdir ~ /packages # Copy packages into this directory.
[! เคล็ดลับ] ดูวิธีการติดตั้งทางเลือก
คัดลอกแพ็คเกจลงในโฟลเดอร์ ~/แพ็คเกจ ของคุณจากนั้นรับ Pypiserver ของคุณและทำงาน
pypi-server run -p 8080 ~ /packages & # Will listen to all IPs.
จากคอมพิวเตอร์ไคลเอนต์พิมพ์สิ่งนี้
# 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.
[! เคล็ดลับ] ดูการกำหนดค่าฝั่งไคลเอ็นต์เพื่อหลีกเลี่ยงการพิมพ์ที่น่าเบื่อ
ป้อน pypi-server -h ใน cmd-line เพื่อพิมพ์ข้อความการใช้อย่างละเอียด
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
ป้อน pypi-server run -h ใน cmd-line เพื่อพิมพ์การใช้อย่างละเอียด
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.
รายละเอียดเพิ่มเติมเกี่ยวกับ การอัปเดต 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.
การระบุ URL PYPI บนบรรทัดคำสั่งมักจะยุ่งยากเล็กน้อย เนื่องจาก Pypiserver เปลี่ยนเส้นทาง PIP/EASY_INSTALL ไปยังดัชนี pypi.org หากไม่มีแพ็คเกจที่ร้องขอจึงเป็นความคิดที่ดีที่จะกำหนดค่าให้ใช้ดัชนี PYPI ในเครื่องของคุณเสมอ
สำหรับคำสั่ง PIP สิ่งนี้สามารถทำได้โดยการตั้งค่าตัวแปรสภาพแวดล้อม pip_extra_index_url ใน . bashr/.profile/.zshrc ของคุณ
export PIP_EXTRA_INDEX_URL=http://localhost:8080/simple/
หรือโดยการเพิ่มบรรทัดต่อไปนี้เป็น ~/.pip/pip.conf
[global]
extra-index-url = http://localhost:8080/simple/
บันทึก
หากคุณติดตั้ง pypiserver บน URL ระยะไกลโดยไม่ต้อง HTTPS คุณจะได้รับคำเตือน "ไม่น่าเชื่อถือ" จาก PIP กระตุ้นให้คุณต่อท้ายตัวเลือก -โฮสต์ที่น่าเชื่อถือ นอกจากนี้คุณยังสามารถรวมตัวเลือกนี้อย่างถาวรในตัวแปรการกำหนดค่าไฟล์หรือสภาพแวดล้อมของคุณ
สำหรับคำสั่ง easy_install คุณสามารถตั้งค่าการกำหนดค่าต่อไปนี้ใน ~/.pydistutils.cfg
[easy_install]
index_url = http://localhost:8080/simple/
แทนที่จะคัดลอกแพ็คเกจโดยตรงไปยังโฟลเดอร์ของเซิร์ฟเวอร์ (เช่นกับ SCP ) คุณสามารถใช้เครื่องมือ Python สำหรับงานเช่น การตั้งค่า Python.py อัปโหลด ในกรณีนั้น Pypiserver มีหน้าที่รับผิดชอบในการตรวจสอบสิทธิ์การอัพโหลด
บันทึก
เราขอแนะนำอย่างยิ่งใน การปกป้องการอัปโหลดของคุณด้วยรหัสผ่าน !
เป็นไปได้ที่จะปิดใช้งานการตรวจสอบสิทธิ์สำหรับการอัปโหลด (เช่นในอินทราเน็ต) เพื่อหลีกเลี่ยงการตัดสินใจด้านความปลอดภัยที่ขี้เกียจอ่านความช่วยเหลือสำหรับตัวเลือก -P และ -A
ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณติดตั้งโมดูล passlib (โปรดทราบว่าต้องใช้ passlib> = 1.6 ) ซึ่งจำเป็นสำหรับการแยกวิเคราะห์ไฟล์ Apache HTPasswd ที่ระบุโดยตัวเลือก -p , -passwords (ดูขั้นตอนถัดไป)
pip install passlib
สร้างไฟล์ Apache HTPasswd ด้วยคู่ผู้ใช้/รหัสผ่านอย่างน้อยหนึ่งคู่ด้วยคำสั่งนี้ (คุณจะได้รับแจ้งให้เป็นรหัสผ่าน)
htpasswd -sc htpasswd.txt < some_username >
เคล็ดลับ
อ่านคำถามนี้สำหรับการรัน htpasswd
CMD ภายใต้ Windows หรือถ้าคุณมีรหัสผ่านปลอมที่คุณไม่สนใจเพราะเป็นบริการภายใน (ซึ่งยังคง "ไม่ดี" จากมุมมองด้านความปลอดภัย ... ) คุณอาจใช้สาธารณะนี้ บริการ
เคล็ดลับ
เมื่อเข้าถึง Pypiserver ผ่าน API วิธีการตรวจสอบความถูกต้องทางเลือกจะพร้อมใช้งานผ่าน Auther Config Flag การเรียกคืนบูลีนใด ๆ สามารถส่งผ่านไปยังการกำหนดค่า pypiserver เพื่อให้การตรวจสอบความถูกต้องที่กำหนดเอง ตัวอย่างเช่นในการกำหนดค่า pypiserver เพื่อตรวจสอบสิทธิ์โดยใช้ python-pam
import pam
pypiserver.default_config(auther=pam.authenticate)
โปรดดู Using Ad-hoc authentication providers
สำหรับข้อมูลเพิ่มเติม
คุณต้องรีสตาร์ทเซิร์ฟเวอร์ด้วยตัวเลือก -p เพียงครั้งเดียว (แต่สามารถเพิ่มหรือเพิ่มคู่ของผู้ใช้/รหัสผ่านในภายหลังได้ทันที)
./pypi-server run -p 8080 -P htpasswd.txt ~ /packages &
ในฝั่งไคลเอ็นต์แก้ไขหรือสร้างไฟล์ ~/.pypirc ที่มีเนื้อหาที่คล้ายกัน:
[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 >
จากภายในไดเรกทอรีของโครงการ Python ที่คุณต้องการอัปโหลดออกคำสั่งนี้:
python setup.py sdist upload -r local
เพื่อหลีกเลี่ยงการจัดเก็บรหัสผ่านของคุณบนดิสก์ในข้อความที่ชัดเจนคุณอาจ:
ใช้คำสั่ง register setuptools ของตัวเลือก -r เช่นนั้น
python setup.py sdist register -r local upload -r local
ใช้ไลบรารี Twine ซึ่งแบ่งขั้นตอนในสองขั้นตอน นอกจากนี้ยังรองรับการลงนามไฟล์ของคุณด้วย PGP-signatures และอัปโหลดไฟล์ . asc ที่สร้างขึ้นไปยัง Pypiserver ::
twine upload -r local --sign -identity user_name ./foo-1.zip
เริ่มต้นด้วยเวอร์ชัน 1.2.5 ภาพ Docker อย่างเป็นทางการจะถูกสร้างขึ้นสำหรับการกดแต่ละครั้งไปยัง main
, DEV แต่ละตัว, Alpha, หรือ Beta Release และการเปิดตัวครั้งสุดท้าย การเปิดตัวเต็มรูปแบบล่าสุดจะพร้อมใช้งานภายใต้แท็ก ล่าสุด และสาขา main
ปัจจุบันจะพร้อมใช้งานภายใต้แท็ก ไม่เสถียร
คุณสามารถตรวจสอบดูว่ามีแท็กใดบ้างที่มีอยู่ในปัจจุบันที่ Docker Repo ของเรา
เพื่อเรียกใช้การเปิด ตัว Pypiserver ล่าสุดกับ Docker เพียงแค่
docker run pypiserver/pypiserver:latest run
สิ่งนี้เริ่มต้นแพ็คเกจ Pypiserver ที่ให้บริการจากไดเรกทอรี /Data /Packages ภายในคอนเทนเนอร์โดยฟังบนพอร์ตคอนเทนเนอร์ 8080
คอนเทนเนอร์ใช้อาร์กิวเมนต์เดียวกันทั้งหมดกับการทำงานของ PYPI -Server ปกติยกเว้นพอร์ตคอนเทนเนอร์ภายใน ( -P ) ซึ่งจะเป็น 8080 เสมอ
แน่นอนเพียงแค่ใช้คอนเทนเนอร์ไม่น่าสนใจ ในการแมปพอร์ต 80 บนโฮสต์ไปยังพอร์ต 8080 บนคอนเทนเนอร์ ::
docker run -p 80:8080 pypiserver/pypiserver:latest run
ตอนนี้คุณสามารถเข้าถึง pypiserver ของคุณได้ที่ LocalHost: 80 ในเว็บเบราว์เซอร์
เพื่อให้บริการแพ็คเกจจากไดเรกทอรีบนโฮสต์เช่น ~/แพ็คเกจ
docker run -p 80:8080 -v ~ /packages:/data/packages pypiserver/pypiserver:latest run
เพื่อตรวจสอบสิทธิ์กับไฟล์ . htpasswd ในพื้นที่ ::
docker run -p 80:8080 -v ~ /.htpasswd:/data/.htpasswd pypiserver/pypiserver:latest run -P .htpasswd packages
นอกจากนี้คุณยังสามารถระบุ pypiserver เพื่อทำงานเป็นบริการ Docker โดยใช้ ComposeFile ตัวอย่าง Pomposefile มีให้เป็น docker-compose.yaml
เมื่อลองใช้วิธีการด้านล่างก่อนอื่นให้ใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่า Pypiserver เวอร์ชันก่อนหน้ามีอยู่แล้วหรือไม่และถอนการติดตั้งพวกเขาหรือไม่ ::
# VERSION-CHECK: Fails if not installed.
pypi-server --version
# UNINSTALL: Invoke again until it fails.
pip uninstall pypiserver
ในกรณีที่เวอร์ชันล่าสุดใน PYPI เป็นการเปิดตัวก่อนคุณต้องใช้ตัวเลือก -PIP ของ PIP และเพื่ออัปเดตการติดตั้งที่มีอยู่รวมเข้ากับ --ignore-installed
pip install pypiserver --pre -I
คุณสามารถติดตั้ง pypiserver ล่าสุดได้โดยตรงจาก GitHub ด้วยคำสั่งต่อไปนี้โดยสมมติว่าคุณติดตั้ง Git บน เส้นทาง ของคุณ
pip install git+git://github.com/pypiserver/pypiserver.git
คำสั่ง PYPI-Server มีคำสั่ง UPDATE ที่ค้นหาการอัปเดตของแพ็คเกจที่มีอยู่ มันสแกนไดเรกทอรีแพ็คเกจสำหรับแพ็คเกจที่มีอยู่และค้นหาบน pypi.org สำหรับการอัปเดต หากไม่มีตัวเลือกเพิ่มเติม การอัปเดต PYPI-Server จะพิมพ์รายการคำสั่งที่ต้องเรียกใช้เพื่อให้ได้เวอร์ชันล่าสุดของแต่ละแพ็คเกจ ผลลัพธ์ดูเหมือนว่า:
$ ./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
มันพิมพ์ครั้งแรกสำหรับแต่ละแพ็คเกจอักขระตัวเดียวหลังจากตรวจสอบเวอร์ชันที่มีอยู่ใน PYPI DOT (.) หมายถึงแพ็คเกจที่ทันสมัย 'U' หมายความว่าแพ็คเกจสามารถอัปเดตได้และ 'E' หมายถึงรายการของการเผยแพร่บน PYPI นั้นว่างเปล่า หลังจากนั้นมันจะแสดงบรรทัดคำสั่ง PIP ซึ่งสามารถใช้ในการอัปเดตแพ็คเกจเดียว ทั้งคัดลอกและวางหรือเรียกใช้ การอัปเดต PYPI -Server -x เพื่อดำเนินการคำสั่งเหล่านั้นจริงๆ คุณต้องติดตั้ง PIP เพื่อให้ทำงานได้
การระบุตัวเลือก -U เพิ่มเติมจะอนุญาตให้ดาวน์โหลดผู้สมัครอัลฟ่าเบต้าและปล่อย หากไม่มีตัวเลือกนี้การเผยแพร่เหล่านี้จะไม่ได้รับการพิจารณา
สำคัญ
โดยค่าเริ่มต้น Pypiserver จะสแกนไดเรกทอรีแพ็คเกจทั้งหมดทุกครั้งที่มีการร้องขอ HTTP ที่เข้ามา นี่ไม่ใช่ปัญหาสำหรับแพ็คเกจจำนวนน้อย แต่ทำให้เกิดการช้าลงอย่างเห็นได้ชัดเมื่อให้บริการแพ็คเกจนับพัน
หากคุณพบปัญหานี้การเร่งความเร็วที่สำคัญสามารถได้รับจากการเปิดใช้งานฟังก์ชั่นการแคชไดเรกทอรีของ Pypiserver ข้อกำหนดเพียงอย่างเดียวคือการติดตั้งแพ็คเกจ Watchdog หรือสามารถติดตั้งได้ในระหว่างการติดตั้ง Pypiserver โดยระบุตัวเลือก Cache Extras ::
pip install pypiserver[cache]
การเร่งความเร็วเพิ่มเติมสามารถรับได้โดยใช้ฟังก์ชันการแคชในตัวของเว็บเซิร์ฟเวอร์ของคุณ ตัวอย่างเช่นหากคุณใช้ nginx
เป็น reverse-proxy ตามที่อธิบายไว้ด้านล่างใน Behind a reverse proxy
คุณสามารถเปิดใช้งานการแคชได้อย่างง่ายดาย ตัวอย่างเช่นเพื่อให้ Nginx สามารถแคชข้อมูลได้สูงสุด 10 กิกะไบต์นานถึง 1 ชั่วโมง ::
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 ;
}
}
เคล็ดลับ
การใช้การแคชเว็บเซิร์ฟเวอร์นั้นมีประโยชน์อย่างยิ่งหากคุณมีปริมาณการร้องขอสูง การใช้ Nginx Caching การติดตั้ง Pypiserver ในโลกแห่งความเป็นจริงสามารถรองรับการดาวน์โหลดแพ็คเกจได้มากกว่า 1,000 ครั้ง/นาทีที่จุดสูงสุด
มีตัวเลือกที่หลากหลายสำหรับการจัดการการเริ่มต้นของ Pypiserver โดยอัตโนมัติเมื่อเริ่มต้นระบบ สองที่พบมากที่สุดคือ SystemD และ Supervisor สำหรับระบบ Linux สำหรับ Windows การสร้างบริการที่มีสคริปต์ไม่ใช่เรื่องง่ายหากไม่มีเครื่องมือของบุคคลที่สามเช่น NSSM
SystemD ได้รับการติดตั้งโดยค่าเริ่มต้นในระบบ Linux ที่ทันสมัยส่วนใหญ่และเป็นตัวเลือกที่ยอดเยี่ยมสำหรับการจัดการกระบวนการ Pypiserver ตัวอย่างไฟล์กำหนดค่าสำหรับ SystemD สามารถดูได้ด้านล่าง
[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
การปรับเส้นทางและการเพิ่มไฟล์นี้เป็น pypiserver.service ลงในไดเรกทอรี SystemD/System ของคุณจะช่วยให้การจัดการกระบวนการ pypiserver ด้วย SystemCTL , เช่น SystemCTL Start Pypiserver
ข้อมูลที่เป็นประโยชน์เพิ่มเติมเกี่ยวกับ SystemD สามารถดูได้ที่ https://www.digitalocean.com/community/tutorials/how-to-use-use-systemctl-to-manage-systemd-services-and-units
หัวหน้างานมีประโยชน์ในการเป็นแพ็คเกจ Python บริสุทธิ์และเป็นเช่นนี้ให้การสนับสนุนข้ามแพลตฟอร์มที่ยอดเยี่ยมสำหรับการจัดการกระบวนการ ไฟล์การกำหนดค่าตัวอย่างสำหรับ หัวหน้างาน ได้รับด้านล่าง
[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
จากนั้นกระบวนการสามารถจัดการได้ผ่าน supervisord โดยใช้ supervisorctl
สำหรับ Windows ดาวน์โหลด NSSM จาก https://nssm.cc unzip ไปยังตำแหน่งที่ต้องการเช่นไฟล์โปรแกรม ตัดสินใจว่าคุณจะใช้ win32
หรือ win64
และเพิ่ม exe
นั้นลงใน PATH
สภาพแวดล้อม
สร้าง start_pypiserver.bat
pypi-server run -p 8080 C: P ath T o P ackages &
เคล็ดลับ
ทดสอบไฟล์แบตช์โดยเรียกใช้ก่อนที่จะสร้างบริการ ตรวจสอบให้แน่ใจว่าคุณสามารถเข้าถึงเซิร์ฟเวอร์จากระยะไกลและติดตั้งแพ็คเกจ หากทำได้ให้ดำเนินการต่อหากไม่แก้ไขปัญหาจนกว่าคุณจะทำได้ สิ่งนี้จะช่วยให้คุณรู้ว่าเซิร์ฟเวอร์ใช้งานได้ก่อนที่จะเพิ่ม NSSM ลงในส่วนผสม
จากพรอมต์คำสั่ง
nssm install pypiserver
คำสั่งนี้จะเปิดแอปพลิเคชัน NSSM GUI
Path: C: P ath T o s tart_pypiserver.bat
Startup directory: Auto generates when selecting path
Service name: pypiserver
มีแท็บเพิ่มเติม แต่นั่นคือการตั้งค่าพื้นฐาน หากบริการจำเป็นต้องทำงานด้วยข้อมูลรับรองการเข้าสู่ระบบบางอย่างตรวจสอบให้แน่ใจว่าคุณป้อนข้อมูลรับรองเหล่านั้นในแท็บการเข้าสู่ระบบ
เริ่มบริการ
nssm start pypiserver
เคล็ดลับ
คำสั่งที่มีประโยชน์อื่น ๆ
nssm --help
nssm stop < servicename >
nssm restart < servicename >
nssm status < servicename >
สำหรับข้อมูลโดยละเอียดกรุณาเยี่ยมชม https://nssm.cc
เว็บเซิร์ฟเวอร์ ขวด ซึ่งรองรับ WSGI-Servers จำนวนมากรวมถึง Paste , Cherrypy , Twisted และ Wsgiref (ส่วนหนึ่งของ Python); คุณเลือกพวกเขาโดยใช้ธง -เซิร์ฟเวอร์
คุณสามารถดูเซิร์ฟเวอร์ WSGI ที่รองรับทั้งหมดโดยใช้รหัสการโต้ตอบต่อไปนี้
>> > 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' ]
หากไม่มีเซิร์ฟเวอร์ข้างต้นตรงกับความต้องการของคุณให้เรียกใช้เมธอด Pypiserver: App () ที่ส่งคืน WSGI-APP ภายในโดยไม่ต้องเริ่มต้นเซิร์ฟเวอร์-คุณอาจส่งไปยังเซิร์ฟเวอร์ WSGI ใด ๆ ที่คุณชอบ อ่านยังใช้ส่วน API
ตัวอย่างบางส่วนได้รับด้านล่าง - คุณอาจพบรายละเอียดเพิ่มเติมในไซต์ขวด
ในการใช้ Apache2 ของคุณกับ Pypiserver โปรดใช้ Mod_wsgi ตามที่อธิบายไว้ในเอกสารของ Bottle
บันทึก
หากคุณเลือกที่จะไปกับ mod_proxy แทนที่จะโปรดทราบว่าคุณอาจชนกับปัญหาเกี่ยวกับคำนำหน้า (ดู #155)
ปรับตัวและวางการกำหนดค่า Apache ต่อไปนี้ลงในขอบเขตระดับบนสุดหรือภายใน <VirtualHost>
(สนับสนุนโดย 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 >
หรือหากใช้ Apache ที่เก่ากว่า <2.4 ให้แทนที่ส่วนสุดท้ายด้วย ::
< Directory /yoursite/wsgi >
Order deny,allow
Allow from all
< /Directory >
จากนั้นสร้างไฟล์ /yoursite/cfg/pypiserver.wsgi และตรวจสอบให้แน่ใจว่า ผู้ใช้ และ กลุ่ม ของคำสั่ง wsgidaemonprocess ( pypisrv: pypisrv ในตัวอย่าง) ได้รับอนุญาตอ่านอยู่
import pypiserver
conf = pypiserver . default_config (
root = "/yoursite/packages" ,
password_file = "/yoursite/htpasswd" , )
application = pypiserver . app ( ** conf )
[! เคล็ดลับ] หากคุณติดตั้ง pypiserver ใน virtualenv ให้ทำตามคำแนะนำของ mod_wsgi และเตรียมรหัส Python ไว้ข้างต้นด้วยสิ่งต่อไปนี้
import site site . addsitedir ( '/yoursite/venv/lib/pythonX.X/site-packages' )
บันทึก
ด้วยเหตุผลด้านความปลอดภัยโปรดสังเกตว่า Directory Directive ให้การเข้าถึงไดเรกทอรีที่ถือสคริปต์เริ่มต้น WSGI เพียงอย่างเดียว ไม่มีอะไรอื่น
บันทึก
ในการเปิดใช้งานการสนับสนุน HTTPS บน Apache ให้กำหนดค่าคำสั่งที่มีการกำหนดค่า WSGI เพื่อใช้ SSL
คำสั่งต่อไปนี้ใช้ gunicorn เพื่อเริ่ม pypiserver
gunicorn -w4 ' pypiserver:app(root="/home/ralf/packages") '
หรือเมื่อใช้หลายราก
gunicorn -w4 ' pypiserver:app(root=["/home/ralf/packages", "/home/ralf/experimental"]) '
วางช่วยให้สามารถใช้แอปพลิเคชัน WSGI หลายรายการภายใต้เส้นทาง URL ที่แตกต่างกัน ดังนั้นจึงเป็นไปได้ที่จะให้บริการชุดแพ็คเกจที่แตกต่างกันบนเส้นทางที่แตกต่างกัน
ตัวอย่างต่อไปนี้ paste.ini สามารถใช้เพื่อให้บริการแพ็คเกจที่มั่นคงและไม่เสถียรบนเส้นทางที่แตกต่างกัน
[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 = -
บันทึก
คุณต้องติดตั้งการพึ่งพาเพิ่มเติมเพื่อให้สิ่งนี้ใช้งานได้เช่น ::
pip install paste pastedeploy gunicorn pypiserver
เซิร์ฟเวอร์สามารถเริ่มต้นได้ด้วย
gunicorn_paster paste.ini
คุณสามารถเรียกใช้ pypiserver หลังพร็อกซีย้อนกลับได้เช่นกัน
ขยายการกำหนดค่า 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 ;
}
}
ในฐานะของ Pypiserver 1.3 คุณสามารถใช้ส่วนหัว X-Forwarded-Host
ในการกำหนดค่าพร็อกซีย้อนกลับของคุณเพื่อเปิดใช้งานการเปลี่ยน URL พื้นฐาน ตัวอย่างเช่นหากคุณต้องการโฮสต์ pypiserver ภายใต้เส้นทางเฉพาะบนเซิร์ฟเวอร์ของคุณ
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 ;
}
}
การใช้พร็อกซีย้อนกลับเป็นวิธีที่ต้องการในการรับ pypiserver หลัง HTTPS ตัวอย่างเช่นการวาง pypiserver หลัง HTTPS บนพอร์ต 443 พร้อมการเปลี่ยนเส้นทาง HTTP อัตโนมัติโดยใช้ 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 ;
}
}
เคล็ดลับ
โปรดดูเอกสาร HTTPS ของ Nginx สำหรับรายละเอียดเพิ่มเติม
การรับและการรักษาใบรับรองของคุณจะง่ายขึ้นโดยใช้ตัวอย่างเช่นการใช้ CertBot และ LetsEncrypt
นอกจากนี้ยังเป็นไปได้ที่จะใช้ Traefik เพื่อวาง pypiserver ไว้หลัง HTTPS บนพอร์ต 443 ด้วยการเปลี่ยนเส้นทาง HTTP อัตโนมัติโดยใช้ Docker Compose โปรดดูตัวอย่าง Docker-compose.yml ที่ให้ไว้สำหรับข้อมูลเพิ่มเติม
เพื่อให้สามารถเปิดใช้งานการรับรองความถูกต้องของ Ad-Hoc หรือใช้ WSGI-Servers ที่ไม่ได้รับการสนับสนุนโดย ขวด นอกกรอบคุณจำเป็นต้องเปิดตัว Pypiserver ผ่าน API
จุดเริ่มต้นหลักสำหรับการกำหนดค่า pypiserver คือฟังก์ชัน pypiserver: app () ฟังก์ชั่นนี้ส่งคืน WSGI-APP ภายในที่คุณจากนั้นส่งไปยังเซิร์ฟเวอร์ WSGI ใด ๆ ที่คุณชอบ
หากต้องการรับ pypiserver ทั้งหมด: แอป () คำหลักและคำอธิบายของพวกเขาอ่านฟังก์ชัน pypiserver: default_config ()
ในที่สุดเพื่อดับเพลิง WSGI-Server ด้วยแอพที่กำหนดค่าให้เรียกใช้ ขวด: เรียกใช้ (แอพ, โฮสต์, พอร์ต, เซิร์ฟเวอร์) ฟังก์ชั่น โปรดทราบว่า Pypiserver ส่งมอบ ขวดขวด ของตัวเอง หากต้องการใช้ให้นำเข้าเช่นนั้น: จากขวดนำเข้า pypiserver
คำหลัก Auther ของ Pypiserver: App () ฟังก์ชั่นอาจตั้งค่าโดยใช้ API เท่านั้น นี่อาจเป็นสิ่งที่เรียกได้ว่าส่งคืนบูลีนเมื่อผ่าน ชื่อผู้ใช้ และ รหัสผ่าน สำหรับคำขอที่กำหนด
ตัวอย่างเช่นในการตรวจสอบสิทธิ์ผู้ใช้ตามไฟล์ /etc /passwd ภายใต้ UNIX คุณอาจมอบหมายการตัดสินใจดังกล่าวไปยังไลบรารี Python-Pam โดยทำตามขั้นตอนเหล่านี้:
ตรวจสอบให้แน่ใจว่ามีการติดตั้งโมดูล Python-Pam
pip install python-pam
สร้าง Python-script ตามบรรทัดเหล่านี้
$ 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]
เรียกใช้ Python-script เพื่อเริ่มต้น pypiserver
python pypiserver-start.py
บันทึก
โมดูล Python-PAM ต้องใช้ การอ่าน ไฟล์ /etc /Shadow ; คุณสามารถเพิ่มผู้ใช้ภายใต้ Pypiserver ที่วิ่งเข้าไปในกลุ่ม เงา ด้วยคำสั่งเช่นนี้: sudo usermod -a -g shadow pypy -user
Micropython Interpreter สำหรับอุปกรณ์ฝังตัวสามารถติดตั้งแพ็คเกจด้วยโมดูล UPIP.py โมดูลใช้จุดสิ้นสุด JSON พิเศษเพื่อดึงข้อมูลแพ็คเกจ จุดสิ้นสุดนี้ได้รับการสนับสนุนโดย Pypiserver
สามารถทดสอบได้ด้วยพอร์ต unix ของ micropython
cd micropython
ports/unix/micropython -m tools.upip install -i http://my-server:8080 -p /tmp/mymodules micropython-foobar
การติดตั้งแพ็คเกจจากการเติมของอุปกรณ์ฝังตัวในวิธีนี้:
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" )
ข้อมูลเพิ่มเติมเกี่ยวกับ micropython-packaging สามารถดูได้ที่นี่: https://docs.micropython.org/en/latest/reference/packages.html
Pypiserver ให้จุดสิ้นสุดสุขภาพเริ่มต้นที่ /สุขภาพ มันจะส่งคืน 200 ตกลง ถ้าบริการขึ้น มิฉะนั้นหมายความว่าบริการไม่ตอบสนอง
นอกจากนี้ Pypiserver ยังช่วยให้ผู้ใช้สามารถปรับแต่งจุดสิ้นสุดด้านสุขภาพ อนุญาตให้ใช้ตัวอักษรและตัวเลข, ยัติภังค์, slashes ไปข้างหน้าและขีดล่างได้รับอนุญาตและจุดสิ้นสุดไม่ควรทับซ้อนกับเส้นทางที่มีอยู่ ตัวอย่างที่ถูกต้อง: /Healthz , /Health /Live-1 , /API_Health , /Action /Health
เรียกใช้ pypiserver ด้วย -อาร์กิวเมนต์ end-endpoint :
pypi-server run --health-endpoint /action/health
import pypiserver
from pypiserver import bottle
app = pypiserver . app ( root = "./packages" , health_endpoint = "/action/health" )
bottle . run ( app = app , host = "0.0.0.0" , port = 8080 , server = "auto" )
ลอง Curl http: // localhost: 8080/action/สุขภาพ
หากต้องการสร้างสำเนาของที่เก็บให้ใช้
git clone https://github.com/pypiserver/pypiserver.git
cd pypiserver
หากต้องการรับการเปลี่ยนแปลงในภายหลังในการใช้โฟลเดอร์ด้านบน:
git pull
สำคัญ
Pypiserver ไม่ได้ใช้ API เต็มรูปแบบตามที่เห็นใน PYPI มันใช้งานได้เพียงพอที่จะทำให้ Easy_install ติดตั้ง PIP และ ค้นหา งาน
ข้อ จำกัด ต่อไปนี้เป็นที่รู้จัก:
โปรดใช้ BugTracker ของ GitHub สำหรับข้อบกพร่องอื่น ๆ ที่คุณพบ
มีโครงการอื่น ๆ อีกมากมายที่อนุญาตให้คุณเรียกใช้เซิร์ฟเวอร์ PYPI ของคุณเอง หาก pypiserver ไม่ได้ผลสำหรับคุณต่อไปนี้เป็นหนึ่งในทางเลือกที่ได้รับความนิยมมากที่สุด:
DevPi-Server: เซิร์ฟเวอร์แคช Pypi.org ที่รวดเร็วที่เชื่อถือได้ซึ่งเป็นส่วนหนึ่งของเซิร์ฟเวอร์ดัชนี PYPI แบบ GitHub ที่ครอบคลุมและเครื่องมือเมตาบรรจุภัณฑ์ (เวอร์ชัน: 2.1.4, วันที่เข้าถึง: 8/3/2015)
ตรวจสอบคำถามนี้: วิธีการม้วน pypi ของฉันเอง
โครงการเหล่านี้เคยเป็นทางเลือกให้กับ Pypiserver แต่ตอนนี้ไม่ได้รับการดูแลหรือเก็บถาวร
pip2pi เครื่องมือ CMD-line ง่าย ๆ ที่สร้างโฟลเดอร์ท้องถิ่นที่เข้ากันได้กับ PYPI จากข้อกำหนด PIP
Flask-Pypi-Proxy A Proxy สำหรับ PYPI ที่ช่วยให้สามารถอัปโหลดแพ็คเกจที่กำหนดเองได้
แม้ว่าจะไม่ใช่ทางเลือกโดยตรงสำหรับการใช้งานของ Pypiserver เป็นเซิร์ฟเวอร์ดัชนี แต่ต่อไปนี้เป็นรายการของโครงการซอฟต์แวร์ที่เกี่ยวข้องที่คุณอาจต้องการทำความคุ้นเคยกับ:
Pypi-Uploader: ยูทิลิตี้บรรทัดคำสั่งเพื่ออัปโหลดแพ็คเกจไปยัง Pypiserver ของคุณจาก PYPI โดยไม่ต้องเก็บไว้ในพื้นที่ก่อน
Twine: ยูทิลิตี้บรรทัดคำสั่งสำหรับการโต้ตอบกับ PYPI หรือ Pypiserver
คลังสินค้า: ซอฟต์แวร์ที่ให้อำนาจ PYPI เอง โดยทั่วไปไม่ได้ตั้งใจจะดำเนินการโดยผู้ใช้ปลายทาง
Pypiserver มีสำเนาขวดซึ่งมีอยู่ภายใต้ใบอนุญาต MIT และส่วนที่เหลือจะถูกแจกจ่ายภายใต้ใบอนุญาต ZLIB/LIBPNG ดูไฟล์ licence.txt