הקמת מאגר Apt/Yum פרטי לחבילות פנימיות
כאשר לארגון שלך יש חבילות מותאמות אישית—builds מותאמים של nginx עם מודולים, סוכני ניטור פנימיים, ספריות מתוקנות—יש לחלק אותן בין שרתים. העתקה ידנית של .deb/.rpm דרך scp לא מתאימה לקנה מידה: גרסאות מתפצלות, עדכונים מוחמצים, ואין בקרת גרסאות מרכזית. מאגר פרטי פותר את זה: apt install internal-agent או dnf update nginx-custom נותן לכל שרת את הגרסה החתומה העדכנית ביותר.
אנחנו, כמהנדסי DevOps פעילים עם ניסיון של 10+ שנים, מקימים מאגרים כאלה במפתח מלא. המומחים המוסמכים שלנו (Kubernetes, AWS, Linux) מבטיחים יציבות ואבטחה—מחתימת GPG ועד פרסום אוטומטי ב-CI/CD. צרו קשר כדי להעריך את הפרויקט שלכם ביום אחד. במשך 5 שנים פרסנו יותר מ-50 מאגרים ללקוחות בפיננסים ובתקשורת.
למה להשתמש במאגר פרטי?
- ניהול גרסאות והחזרות: שמרו על היסטוריית גרסאות, חזרו בקלות אם מתעוררות בעיות.
- אבטחה: חתימת GPG מונעת החלפה; הגישה מוגבלת דרך RBAC.
- אוטומציה: CI/CD יכול לפרסם חבילות בכל tag, ו-Ansible יכול לעדכן שרתים.
- מדרגיות: המאגר יכול לרוץ על שרת ייעודי או בענן, ולשרת מאות מכונות.
איך להקים מאגר Apt עם Aptly?
aptly הוא כלי לניהול מאגרי Debian/Ubuntu. הוא יכול לחתום, לצלם snapshots, ולפרסם דרך HTTP. הפריסה אורכת 30 דקות.
apt install aptly gnupg
# Создаём GPG-ключ для подписи репозитория
gpg --batch --gen-key <<EOF
Key-Type: RSA
Key-Length: 4096
Name-Real: Internal Repo
Name-Email: [email protected]
Expire-Date: 0
%no-protection
EOF
gpg --export --armor [email protected] > /etc/apt/trusted.gpg.d/internal-repo.asc
aptly repo create -distribution=jammy -component=main internal
aptly repo add internal /path/to/package_1.0_amd64.deb
aptly publish repo internal filesystem:public:jammyשירות דרך Nginx:
server {
listen 80;
server_name repo.internal.example.com;
root /var/www/aptly/public;
autoindex on;
location / {
try_files $uri $uri/ =404;
}
}בצד הלקוח:
deb [signed-by=/etc/apt/trusted.gpg.d/internal-repo.asc] http://repo.internal.example.com jammy main
apt update && apt install internal-agent איך להקים מאגר YUM/DNF עם createrepo?
עבור RHEL/CentOS/AlmaLinux, השתמשו ב-apt install aptly gnupg # Создаём GPG-ключ для подписи репозитория gpg --batch --gen-key <<EOF Key-Type: RSA Key-Length: 4096 Name-Real: Internal Repo Name-Email: [email protected] Expire-Date: 0 %no-protection EOF gpg --export --armor [email protected] > /etc/apt/trusted.gpg.d/internal-repo.asc ליצירת מטא-דאטה מהירה:
dnf install createrepo_c gpg
mkdir -p /var/www/repos/el9/x86_64/Packages
cp internal-agent-1.0.x86_64.rpm /var/www/repos/el9/x86_64/Packages/
createrepo_c /var/www/repos/el9/x86_64/
createrepo_c --update /var/www/repos/el9/x86_64/ # при добавлении пакетовחתימה:
gpg --detach-sign --armor /var/www/repos/el9/x86_64/repodata/repomd.xml לקוח: aptly repo create -distribution=jammy -component=main internal aptly repo add internal /path/to/package_1.0_amd64.deb aptly publish repo internal filesystem:public:jammy :
[internal]
name=Internal Repository
baseurl=http://repo.internal.example.com/el9/x86_64/
enabled=1
gpgcheck=1
gpgkey=http://repo.internal.example.com/RPM-GPG-KEY-Internal מה לגבי Nexus Repository Manager כפתרון אוניברסלי?
אם אתם צריכים מאגר עם ממשק web, בקרת גישה, ותמיכה במספר פורמטים (apt, yum, Maven, npm, Docker), השתמשו ב-Nexus OSS. הריצו ב-Docker:
---
services:
nexus:
image: sonatype/nexus3:latest
ports:
- "8081:8081"
volumes:
- nexus-data:/nexus-data
environment:
INSTALL4J_ADD_VM_PARAMS: "-Xms2g -Xmx2g -XX:MaxDirectMemorySize=3g"
העלאת חבילה:
curl -u admin:password --upload-file package_1.0_amd64.deb \
"http://nexus.internal:8081/repository/apt-internal/" טבלת השוואת כלים
| קריטריון | Aptly | createrepo | Nexus OSS |
|---|---|---|---|
| פורמטים | Debian/Ubuntu | RHEL/CentOS | Apt, Yum, Maven, npm, Docker |
| ממשק web | לא | לא | כן |
| בקרת גישה | דרך Nginx | דרך Nginx | RBAC, LDAP, OIDC |
| תמיכה ב-snapshots | כן | לא | כן |
| אינטגרציית CI/CD | REST API | SCP/rsync | REST API |
עבור שתי הפצות (Ubuntu ו-CentOS), אפשר להריץ Aptly ו-createrepo על אותו שרת. אם אתם צריכים גמישות, Nexus הוא בחירה טובה יותר: הוא חוסך עד 60% מזמן הניהול.
איך להפוך את הפרסום לאוטומטי עם CI/CD?
הזרימה האידיאלית: CI/CD בונה את החבילה, חותם עליה, ומפרסם אותה למאגר. הלקוחות מקבלים עדכונים דרך server { listen 80; server_name repo.internal.example.com; root /var/www/aptly/public; autoindex on; location / { try_files $uri $uri/ =404; } } הסטנדרטי או Ansible.
דוגמה ל-GitLab CI:
---
publish:
stage: deploy
script:
- dpkg-buildpackage -us -uc -b
- curl -u ${NEXUS_USER}:${NEXUS_PASS} \
--upload-file ../internal-agent_*.deb \
"${NEXUS_URL}/repository/apt-internal/"
only:
- tags
אנחנו מקימים pipelines כאלה תוך 1–2 ימים. אפשר גם להפעיל playbooks של Ansible לעדכון חבילות בשרתים לאחר הפרסום.
מה כלול
- בדיקת תשתית ובחירת כלים.
- פריסת מאגר (Aptly/createrepo/Nexus) עם חתימת GPG.
- הגדרת Nginx או reverse proxy להפצה.
- חיבור שרתי יעד למאגר (דרך Ansible).
- Pipeline של CI/CD לפרסום אוטומטי.
- תיעוד והדרכת צוות (runbook).
- תמיכה עם אחריות ל-30 יום.
טעויות נפוצות בהקמת מאגר
- שכחת הוספת מפתח GPG בלקוחות → שגיאת GPG check failed.
- אי הפעלת autoindex ב-Nginx לרשימת חבילות.
- שימוש ב-
deb [signed-by=/etc/apt/trusted.gpg.d/internal-repo.asc] http://repo.internal.example.com jammy main apt update && apt install internal-agent— חור אבטחה. - אי יצירת snapshots לפני עדכונים → אי אפשרות לחזור לגרסאות קודמות.
לוחות זמנים ואיך להתחיל
| שלב | משך |
|---|---|
| מאגר פשוט (Aptly/createrepo) | 1–2 ימים |
| Nexus עם אינטגרציית CI/CD | 3–5 ימים |
| תיעוד והדרכה | +יום אחד |
התמחור הוא אישי—תלוי במספר ההפצות, השרתים, ומורכבות האוטומציה. נבדוק את הפרויקט שלכם ביום אחד. קבלו ייעוץ על ידי יצירת קשר איתנו.
אבטחה וזמינות
מאגר חבילות פנימי הוא תשתית קריטית: אם הוא נופל, createrepo_c על מאות שרתים נכשל. אנחנו מקימים ניטור זמינות דרך Prometheus blackbox exporter ומראה גיבוי לסבילות לתקלות.
חתימת GPG היא חובה: לקוחות מאמתים את החתימה הדיגיטלית לפני התקנה, ומונעים החלפת חבילות גם אם התעבורה נפגעת. סיבוב מפתחות GPG מתוזמן ואוטומטי דרך Ansible.
צרו קשר—נבדוק את הפרויקט שלכם ביום אחד ונציע את הפתרון הטוב ביותר לתשתית שלכם.







