اسم | وصف |
---|---|
إصدار | 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 |
نصيحة
تواصل في المناقشات ، أو الدردشة معنا على Zulip
Pypiserver هو خادم متوافق مع PYPI الأدنى لـ PIP أو EASY_INSTALL . يعتمد على الزجاجة ويقدم حزم من الدلائل العادية. يمكن تحميل العجلات والبيضاء والبيض ومواقف PGP المصاحبة إما باستخدام PIP أو setuptools أو الخيوط أو pypi-uploader أو ببساطة يتم نسخها مع SCP .
ملحوظة
البرنامج الرسمي الذي يعمل على تشغيل PYPI هو مستودع. ومع ذلك ، من المتخصص إلى حد ما أن يكون برنامج Pypi.org الخاص ، ولا ينبغي استخدامه في سياقات أخرى. على وجه الخصوص ، لا يدعم رسميًا استخدام فهرس الحزمة المخصصة من قبل المستخدمين الذين يرغبون في خدمة الحزم الخاصة بهم.
يقوم Pypiserver بتنفيذ نفس واجهات PYPI ، مما يتيح أدوات عبوات Python القياسية مثل PIP و Twine للتفاعل معها كفهرس الحزمة تمامًا كما هو الحال مع PYPI ، مع تسهيل الحصول على خادم فهرس التشغيل.
جدول المحتويات
يعمل Pypiserver مع Python 3.6+ و Pypy3.
قد لا تزال إصدارات Python الأقدم تعمل ، لكن لم يتم اختبارها.
لإصدارات Python القديمة ، استخدم سلسلة Pypiserver-1.x . لاحظ أن هذه ليست مدعومة رسميًا ، ولن تتلقى إبعادات Bughfixes أو ميزات جديدة.
نصيحة
تعمل الأوامر أدناه على نظام تشغيل يشبه UNIX مع قذيفة POSIX. تتوسع الحرف "~" إلى الدليل الرئيسي للمستخدم.
إذا كنت تستخدم Windows ، فسيتعين عليك استخدام "نظرائهم Windows". وينطبق الشيء نفسه بالنسبة لبقية هذه الوثائق.
تثبيت Pypiserver مع هذا الأمر
pip install pypiserver # Or: pypiserver[passlib,cache]
mkdir ~ /packages # Copy packages into this directory.
[! نصيحة] انظر أيضًا طرق التثبيت البديلة
انسخ بعض الحزم في مجلد ~/packages الخاص بك ثم احصل
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 لطباعة رسالة استخدام مفصلة
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 -H -H في خط CMD لطباعة استخدام مفصل
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 ، وحثك على إلحاق خيار المضيف . يمكنك أيضًا تضمين هذا الخيار بشكل دائم في ملفات التكوين أو متغيرات البيئة.
للحصول على أمر EASE_INSTALL ، يمكنك تعيين التكوين التالي في ~/.pydistutils.cfg
[easy_install]
index_url = http://localhost:8080/simple/
بدلاً من نسخ الحزم مباشرة إلى مجلد الخادم (IE مع SCP ) ، يمكنك استخدام أدوات Python للمهمة ، على سبيل المثال إعداد Python Setup.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 . يمكن تمرير أي إرجاع قابل للاتصال من خلال تكوين 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-Project الذي ترغب في تحميله ، قم بإصدار هذا الأمر:
python setup.py sdist upload -r local
لتجنب تخزين كلمات المرور الخاصة بك على القرص ، في نص واضح ، يمكنك إما:
استخدم أمر السجل setuptools مع خيار -r ، من هذا القبيل
python setup.py sdist register -r local upload -r local
استخدم مكتبة خيوط ، والتي تكسر الإجراء في خطوتين. بالإضافة إلى ذلك ، فإنه يدعم التوقيع على ملفاتك باستخدام signatures PGP وتحميل ملفات .asc التي تم إنشاؤها إلى Pypiserver ::
twine upload -r local --sign -identity user_name ./foo-1.zip
بدءًا من الإصدار 1.2.5 ، سيتم بناء صور Docker الرسمية لكل دفعة إلى main
، أو كل إصدار Dev ، أو Alpha ، أو Beta ، وكل إصدار نهائي. سيكون الإصدار الكامل الأخير متاحًا دائمًا ضمن العلامة الأخيرة ، وسيكون الفرع 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. يتم توفير مثال composefile على أنه docker-compose.yaml
عند تجربة الأساليب أدناه ، استخدم أولاً الأمر التالي للتحقق مما إذا كانت الإصدارات السابقة من Pypiserver موجودة بالفعل ، و (اختياريًا) قم بإلغاء تثبيتها ::
# VERSION-CHECK: Fails if not installed.
pypi-server --version
# UNINSTALL: Invoke again until it fails.
pip uninstall pypiserver
في حال كان الإصدار الأخير في PYPI عبارة عن خيار ما قبل الإصدار ، يجب عليك استخدام خيار PIP . ولتحديث التثبيت الحالي ، يُمزجه --ignore-installed
pip install pypiserver --pre -I
يمكنك حتى تثبيت أحدث Pypiserver مباشرة من Github مع الأمر التالي ، على افتراض أنك قمت بتثبيت Git على مسارك
pip install git+git://github.com/pypiserver/pypiserver.git
يحتوي أمر PYPI-Server على أمر التحديث الذي يبحث عن تحديثات الحزم المتاحة. يقوم بمسح دليل الحزمة للحزم وعمليات البحث على 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. تعني النقطة (.) أن الحزمة محدثة ، "U" تعني أنه يمكن تحديث الحزمة وأن "E" تعني قائمة الإصدارات على PYPI فارغة. بعد ذلك ، يعرض سطر أوامر PIP يمكن استخدامه لتحديث حزمة واحدة. إما نسخ ولصق ذلك أو تشغيل تحديث pypi -server -x من أجل تنفيذ تلك الأوامر حقًا. تحتاج إلى تثبيت PIP لذلك للعمل ولكن.
سيسمح تحديد خيار إضافي -U أيضًا بتنزيل Alpha و Beta و Performs. بدون هذا الخيار ، لن يتم النظر في هذه الإصدارات.
مهم
افتراضيًا ، يقوم Pypiserver بمسح دليل الحزم بأكمله في كل مرة يحدث فيها طلب HTTP الوارد. هذه ليست مشكلة لعدد صغير من الحزم ، ولكنها تسبب تباطؤًا ملحوظًا عند تقديم آلاف الحزم.
إذا واجهت هذه المشكلة ، فيمكن الحصول على سرعات كبيرة من خلال تمكين وظائف التخزين المؤقت للدليل Pypiserver. الشرط الوحيد هو تثبيت حزمة الجانز ، أو يمكن تثبيتها أثناء تثبيت Pypiserver ، من خلال تحديد خيار الإضافات ذاكرة التخزين المؤقت ::
pip install pypiserver[cache]
يمكن الحصول على سرعات إضافية باستخدام وظائف التخزين المؤقت الخاصة بخادم الويب الخاص بك. على سبيل المثال ، إذا كنت تستخدم nginx
كبوكسي عكسي كما هو موضح أدناه في Behind a reverse proxy
، فيمكنك تمكين التخزين المؤقت بسهولة. على سبيل المثال ، للسماح لـ Nginx بتخزين ذاكرة التخزين المؤقت حتى 10 جيجابت من البيانات لمدة تصل إلى ساعة واحدة ::
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 ، تمكن تثبيت Pypiserver في العالم الحقيقي من دعم أكثر من 1000 تنزيل/دقيقة في ذروة تحميل.
هناك مجموعة متنوعة من الخيارات للتعامل مع البدء الآلي لـ Pypiserver عند بدء تشغيل النظام. اثنان من الأكثر شيوعا هما SystemD والمشرف على أنظمة 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 في دليل النظام/النظام الخاص بك إدارة عملية pypiserver مع systemctl ، على سبيل المثال SystemCTL بدء pypiserver .
يمكن العثور على مزيد من المعلومات المفيدة حول SystemD على https://www.digitalocean.com/community/tutorials/how-to-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 unsip إلى موقع مطلوب مثل ملفات البرنامج. قرر ما إذا كنت ستستخدم 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 ، من بين أمور أخرى ، لصق ، كرز ، ملتوية و wsgiref (جزء من بيثون) ؛ يمكنك تحديدها باستخدام علامة -خادم .
يمكنك عرض جميع خوادم 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 كما هو موضح في وثائق الزجاجة.
ملحوظة
إذا اخترت بدلاً من ذلك الذهاب مع 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' )
ملحوظة
لأسباب أمنية ، لاحظ أن التوجيه الدليلي يمنح الوصول إلى دليل يحمل البرنامج النصي لبدء 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"]) '
يسمح Paste بتشغيل تطبيقات 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-corm.yml لمزيد من المعلومات.
من أجل تمكين رواد المصادقة المخصصة أو لاستخدام WSGI-Servers غير مدعوم من قبل الزجاجة خارج الصندوق ، كنت بحاجة إلى إطلاق Pypiserver عبر API الخاص بها.
نقطة الدخول الرئيسية لتكوين Pypiserver هي وظيفة Pypiserver: App (). تقوم هذه الوظيفة بإرجاع تطبيق WSGI-app الداخلي الذي ترسله إلى أي خادم WSGI الذي تريده.
للحصول على جميع الكلمات الرئيسية Pypiserver: App () وتفسيراتها ، اقرأ وظيفة Pypiserver: Default_Config ()
أخيرًا ، لإطلاق النار على خادم WSGI مع التطبيق المكون ، استدعاء الزجاجة: تشغيل (التطبيق ، المضيف ، المنفذ ، الخادم) . لاحظ أن Pypiserver يشحن بنسخه الخاصة من الزجاجة ؛ لاستخدامه ، استيراده على هذا النحو: من زجاجة استيراد Pypiserver
وظيفة Auther الرئيسية لـ Pypiserver: App () ربما تم تعيين وظيفة API فقط. يمكن أن يكون هذا قابلاً للاستدعاء يعيد منطقية عند تمرير اسم المستخدم وكلمة المرور لطلب معين.
على سبيل المثال ، لمصادقة المستخدمين بناءً على ملف /etc /passwd ضمن UNIX ، يمكنك تفويض هذه القرارات إلى مكتبة Python-Pam من خلال اتباع هذه الخطوات:
تأكد من تثبيت وحدة Python-Pam
pip install python-pam
قم بإنشاء صرف بيثون على طول هذه الخطوط
$ 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 للأجهزة المدمجة تثبيت الحزم باستخدام الوحدة النمطية upip.py. تستخدم الوحدة النمطية JSON-endpoint لاسترداد معلومات الحزمة. يتم دعم نقطة النهاية هذه من قبل Pypiserver .
يمكن اختباره مع منفذ Micropython UNIX
cd micropython
ports/unix/micropython -m tools.upip install -i http://my-server:8080 -p /tmp/mymodules micropython-foobar
تثبيت الحزم من REPL لجهاز مضمن يعمل بهذه الطريقة:
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 نقطة نهاية صحية افتراضية في /Health . يعود دائمًا 200 موافق إذا كانت الخدمة ترتفع. خلاف ذلك ، فهذا يعني أن الخدمة لا تستجيب.
بالإضافة إلى ذلك ، يتيح Pypiserver للمستخدمين تخصيص نقطة النهاية الصحية. يُسمح بالأحرف الأبجدية الرقمية والواصلات والرقابات الأمامية والرسومات السفلية ويجب ألا تتداخل نقطة النهاية مع أي طرق موجودة. أمثلة صالحة: /HealthZ ، /Health /Live-1 ، /API_Health ، /Action /Health
قم بتشغيل Pypiserver مع -حجة-Health-Endpoint :
pypi-server run --health-endpoint /action/health
import pypiserver
from pypiserver import bottle
app = pypiserver . app ( root = "./packages" , health_endpoint = "/action/health" )
bottle . run ( app = app , host = "0.0.0.0" , port = 8080 , server = "auto" )
جرب Curl http: // localhost: 8080/Action/Health
لإنشاء نسخة من المستودع ، استخدم
git clone https://github.com/pypiserver/pypiserver.git
cd pypiserver
لتلقي أي تغييرات لاحقة ، في استخدام المجلد أعلاه:
git pull
مهم
Pypiserver لا ينفذ واجهة برمجة التطبيقات الكاملة كما هو موضح في PYPI. ينفذ ما يكفي فقط لجعل easy_install ، وتثبيت PIP ، والبحث أعمال.
القيود التالية معروفة:
يرجى استخدام Github's Bugtracker لأخطاء أخرى تجدها.
هناك الكثير من المشاريع الأخرى ، والتي تتيح لك تشغيل خادم PYPI الخاص بك. إذا كان Pypiserver لا يعمل من أجلك ، فإن ما يلي من بين أكثر البدائل شعبية:
Devpi-server: خادم تخزين مؤشر سريع موثوق به ، جزء من خادم فهرس Pypi الشامل على غرار Github وأداة التعبئة التعويضية. (الإصدار: 2.1.4 ، تاريخ الوصول: 8/3/2015)
تحقق من هذا السؤال: كيف أتعامل مع pypi الخاص بي
كانت هذه المشاريع ذات يوم بدائل لـ Pypiserver ولكنها الآن إما غير محفوظة أو مؤرشفة.
PIP2PI أداة CMD-Line بسيطة تقوم بإنشاء مجلد محلي متوافق مع PYPI من متطلبات PIP
Flask-pypi-proxy وكيل لـ PYPI والذي يتيح أيضًا تحميل الحزم المخصصة.
على الرغم من عدم وجود بدائل مباشرة لاستخدام Pypiserver كخادم فهرس ، فإن ما يلي هو قائمة بمشاريع البرامج ذات الصلة التي قد ترغب في التعرف عليها:
PYPI-UPLOADER: أداة سطر الأوامر لتحميل الحزم إلى Pypiserver الخاص بك من PYPI دون الحاجة إلى تخزينها محليًا أولاً.
خيوط: أداة سطر الأوامر للتفاعل مع PYPI أو Pypiserver .
المستودع: البرنامج الذي يشغل PYPI نفسه. لا يُقصد منه عمومًا أن يديره المستخدمون النهائيون.
يحتوي Pypiserver على نسخة من الزجاجة متوفرة بموجب ترخيص MIT ، ويتم توزيع الجزء المتبقي بموجب ترخيص ZLIB/LIBPNG. انظر ملف الترخيص .