הקמת רישום PyPI פרטי (devpi) עבור צוותי Python
כאשר צוות Python גדל ומספר הספריות הפנימיות — כלי עזר, SDK ל-APIs, כלים אנליטיים — גדל, יש צורך לאחסן ולהפיץ אותם באופן מרכזי דרך pip install. העתקת קבצי .whl דרך הרשת או אחסונם במאגר היא דרך ישירה לכאוס בגרסאות ותלויות. רישום PyPI פרטי פותר בעיה זו: בלעדיו, כל בניית CI/CD חדשה עלולה לקבל גרסאות תלויות שאינן תואמות, וזמן הבנייה גדל עקב הורדות חוזרות.
אנו מתקינים את devpi — שרת Python קל משקל התואם ל-PyPI. בניגוד ל-Nexus הכבד (הדורש 4+ GB RAM ו-JVM), devpi פועל על 256 MB RAM ומעבד אחד. הוא לא רק מאחסן את החבילות שלך אלא גם שומר במטמון חבילות ציבוריות, מה שמאיץ את ה-CI וחוסך בתעבורה. להלן כיצד זה עובד בפועל.
כיצד devpi מאיץ CI/CD
דמיין שצינור ה-CI שלך מוריד את pandas, requests ו-scikit-learn מ-pypi.org בכל בנייה. זה לוקח דקות ותלוי ברוחב פס חיצוני. עם devpi, חבילות נשלפות מ-PyPI בפעם הראשונה, ולאחר מכן מוגשות מהמטמון המקומי. עבור צוות של 50 מפתחים, חיסכון בזמן בנייה יכול להגיע ל-70%, ועלויות התעבורה יכולות לרדת בעד 200$ לחודש (ב-$0.12/GB). בעת קנה מידה ל-100+ מפתחים, החיסכון החודשי הממוצע נע בין 300$ ל-500$.
אנו משתמשים ב-devpi בקונטיינר Docker עם נפח קבוע למטמון.
קובץ docker-compose.yml מוכן לשימוש להתחלה מהירה
---
services:
devpi:
image: muccg/devpi:latest
container_name: devpi
ports:
- "3141:3141"
volumes:
- devpi-data:/data
environment:
- DEVPI_SERVERDIR=/data
command: devpi-server --host 0.0.0.0 --port 3141 --serverdir /data
restart: unless-stopped
volumes:
devpi-data:לאחר ההפעלה, אתחל את השרת וצור אינדקס עם upstream ל-PyPI:
devpi use http://devpi.company.ru:3141
devpi login root --password=""
devpi user -m root password=SecureRootPass
devpi user -c deploy password=DeployPass
devpi login deploy
devpi index -c company/prod bases=root/pypi volatile=False
devpi use company/prodהפרמטר services: devpi: image: muccg/devpi:latest container_name: devpi ports: - "3141:3141" volumes: - devpi-data:/data environment: - DEVPI_SERVERDIR=/data command: devpi-server --host 0.0.0.0 --port 3141 --serverdir /data restart: unless-stopped volumes: devpi-data: מונע מחיקה של חבילות שהועלו — קריטי לבנייה ניתנת לשחזור.
פרסום חבילות פנימיות
לפרסום, אנו משתמשים ב-devpi use http://devpi.company.ru:3141 devpi login root --password="" devpi user -m root password=SecureRootPass devpi user -c deploy password=DeployPass devpi login deploy devpi index -c company/prod bases=root/pypi volatile=False devpi use company/prod . דוגמה לתצורת חבילה:
[project]
name = "company-utils"
version = "1.2.0"
description = "Internal utilities"
[build-system]
requires = ["setuptools>=68", "wheel"]
build-backend = "setuptools.backends.legacy:build"פקודות בנייה והעלאה:
python -m build
twine upload --repository-url http://devpi.company.ru:3141/company/prod/ --username deploy --password ${DEVPI_PASSWORD} dist/*
ב-GitLab CI זה נראה כך:
---
publish-pypi:
image: python:3.12-slim
script:
- pip install build twine
- python -m build
- twine upload --repository-url ${DEVPI_URL}/company/prod/ --username deploy --password ${DEVPI_PASSWORD} dist/*
only:
- tags
למה devpi עדיף על Nexus עבור צוותי Python
Devpi נפרס פי 3 מהר יותר מ-Nexus וצורך פי 6 פחות זיכרון. השוואה:
| קריטריון | Devpi | Nexus |
|---|---|---|
| גודל ומורכבות | יישום Python קל משקל | Java כבד (דורש JVM) |
| פורמטים נתמכים | PyPI בלבד | Maven, npm, Docker, PyPI וכו'. |
| מטמון | מובנה, עם דה-דופליקציה | כן, אבל אחסון משותף |
| זמן פריסה | 1–2 שעות (Docker) | 3–5 שעות (עם כוונון) |
| צריכת משאבים | 256 MB RAM, 1 CPU | 4+ GB RAM, 2+ CPU |
עבור צוות Python טהור, devpi מנצח בפשטות ובמשאבים. לפי תיעוד devpi ומשוב משתמשים.
מה כלול בהתקנת devpi סוהר
- התקנת devpi ב-Docker או על שרת פיזי עם אחסון קבוע.
- הגדרת SSL דרך nginx (HTTPS הוא חובה בסביבה ארגונית). אנו משתמשים ב-Let's Encrypt.
- יצירת אינדקסים: אינדקס ייצור עם מטמון PyPI ואינדקס פיתוח לבדיקות.
- יצירת
volatile=Falseעבור מפתחים (Linux/macOS/Windows). - תבניות צינור CI (GitLab CI / GitHub Actions) לפרסום חבילות.
- טעינה מוקדמת של חבילות פופולריות למטמון עבור סביבות מבודדות.
- תיעוד והדרכה לצוות (1–2 שעות).
- תמיכה לאחר הפריסה: ניטור בריאות, גיבוי, עדכוני גרסאות.
תוצאות אופייניות לאחר הפריסה:
| מדד | לפני הפריסה | אחרי הפריסה |
|---|---|---|
| זמן התקנת חבילה ב-CI | 2–5 דקות | 10–30 שניות |
| צריכת תעבורה | 5–10 GB/חודש | 1–2 GB/חודש |
| יכולת שחזור בנייה | 90% | 99.9% |
| זמן פרסום חבילות | 30 דקות | 5 דקות |
תהליך העבודה
- ניתוח: ביקורת על חבילות קיימות, דרישות אינדקס, מדיניות גרסאות.
- עיצוב: סכמת אינדקס, מודל תפקידים, מירור.
- פריסה: הגדרת שרת, SSL, פרוקסי הפוך (nginx).
- אינטגרציה: חיבור CI/CD, הגדרת pip, בדיקות.
- מסירה: הוראות, אישורי גישה, הדרכה.
לוחות זמנים ותמחור
מוערך: 1 עד 3 ימים לפריסה בסיסית. התמחור מחושב באופן אישי לפי מורכבות התשתית ו-SLA נדרש. קבל ייעוץ להערכה מדויקת לפרויקט שלך — אנו נבחר את התצורה המתאימה לתשתית שלך.
ניסיון מעשי
לאורך השנים, פרסנו devpi עבור 20+ חברות — מסטארטאפים עם צוות אחד ועד ארגונים עם מאות מפתחים. אנו מבטיחים פעילות יציבה: זמן MTTR לתקלות אינו עולה על שעתיים. אנו משתמשים בגישת GitOps לניהול תצורה ובדיקות אוטומטיות בפרסום. הפחתת עלויות תשתית CI/CD ב-20–30% היא תוצאה אופיינית.
הזמן התקנה של רישום PyPI פרטי — חסל את הכאוס בחבילות Python וקבל מערכת אמינה שחוסכת שעות פיתוח בכל יום. צור קשר כדי לדון בפרטי הפרויקט שלך.







