הקמת רישום PyPI פרטי (devpi) לצוותי Python

כשמספר הספריות הפנימיות ב-Python גדל, אחסון והפצתן דרך pip הופכים לכאוס של גרסאות ותלויות. אנחנו מקימים רישום PyPI פרטי מבוסס devpi—שרת קל ומהיר שמרכז את החבילות שלכם ומאחסן במטמון חבילות ציבוריות, ומאיץ בניות CI/CD. הצוות שלנו מספק פרויקטים סוהר, מהפריסה ועד לתמיכה, ומבטיח פעילות יציבה וסקלביליות ככל שהעסק שלכם גדל.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

הקמת רישום 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 דקות

תהליך העבודה

  1. ניתוח: ביקורת על חבילות קיימות, דרישות אינדקס, מדיניות גרסאות.
  2. עיצוב: סכמת אינדקס, מודל תפקידים, מירור.
  3. פריסה: הגדרת שרת, SSL, פרוקסי הפוך (nginx).
  4. אינטגרציה: חיבור CI/CD, הגדרת pip, בדיקות.
  5. מסירה: הוראות, אישורי גישה, הדרכה.

לוחות זמנים ותמחור

מוערך: 1 עד 3 ימים לפריסה בסיסית. התמחור מחושב באופן אישי לפי מורכבות התשתית ו-SLA נדרש. קבל ייעוץ להערכה מדויקת לפרויקט שלך — אנו נבחר את התצורה המתאימה לתשתית שלך.

ניסיון מעשי

לאורך השנים, פרסנו devpi עבור 20+ חברות — מסטארטאפים עם צוות אחד ועד ארגונים עם מאות מפתחים. אנו מבטיחים פעילות יציבה: זמן MTTR לתקלות אינו עולה על שעתיים. אנו משתמשים בגישת GitOps לניהול תצורה ובדיקות אוטומטיות בפרסום. הפחתת עלויות תשתית CI/CD ב-20–30% היא תוצאה אופיינית.

הזמן התקנה של רישום PyPI פרטי — חסל את הכאוס בחבילות Python וקבל מערכת אמינה שחוסכת שעות פיתוח בכל יום. צור קשר כדי לדון בפרטי הפרויקט שלך.