إنشاء مستودعات حزم خاصة (Private Repositories) لإدارة برمجياتك داخل المؤسسة


يا هلا بالزملاء! اليوم بنتكلم عن موضوع مهم جداً لأي مؤسسة عندها أنظمة Linux وتحتاج تدير برمجياتها بطريقة منظمة وآمنة: المستودعات الخاصة (Private Repositories).

ليش نحتاج مستودع خاص أصلاً؟

تخيل إنك بتنزل حزم (packages) مخصصة لشركتك، أو نسخ معينة من برامج مفتوحة المصدر، أو حتى بتثبت تحديثات وتحزمها بنفسك عشان تضمن الثبات والأمان في بيئتك. الاعتماد على المستودعات العامة ممكن يكون فيه تحديات:

  • الأمان: التحكم الكامل في وش اللي يدخل شبكتك.
  • التحكم بالإصدارات: تثبيت إصدارات معينة وثابتة من البرامج.
  • البرمجيات الداخلية: توزيع تطبيقاتك الخاصة بسهولة.
  • سرعة التنزيل: الحزم تكون عندك محلياً أسرع بكثير.
  • الاعتمادية: ما تعتمد على توفر الإنترنت أو المستودعات الخارجية.

المتطلبات الأساسية

قبل ما نبدأ، نحتاج كم حاجة:

  • سيرفر Linux: بيستضيف المستودع (Ubuntu/Debian لأمثلة APT، CentOS/RHEL لأمثلة YUM/DNF).
  • مساحة تخزين كافية: للحزم اللي بتخزنها.
  • خادم ويب: Apache أو Nginx عشان يقدرون الكلاينت يوصلون للحزم عبر HTTP/HTTPS.
  • مفتاح GPG: لتوقيع المستودع (خاصة في APT) لزيادة الأمان.

إنشاء مستودع APT خاص (لـ Debian/Ubuntu)

هنا بنستخدم أداة اسمها reprepro، وهي أداة قوية وسهلة لإدارة مستودعات APT.

1. تثبيت reprepro وخادم الويب

على سيرفر المستودع:

sudo apt update
sudo apt install reprepro apache2 gnupg

أو nginx بدل apache2 لو تفضل.

2. إعداد بنية المستودع

بنحط المستودع في مجلد معين، مثلاً /var/www/html/myrepo عشان يكون متاح عبر الويب.

sudo mkdir -p /var/www/html/myrepo
cd /var/www/html/myrepo
mkdir conf db pool dists project

3. إنشاء مفتاح GPG

هذا المفتاح بيستخدم لتوقيع الحزم والمستودع، وهو أساسي للأمان.

gpg --full-gen-key

اتبع التعليمات. لما يطلب منك نوع المفتاح، اختار (1) RSA and RSA. حجم المفتاح 4096 بت. مدة الصلاحية ما لا نهاية (0). الاسم والبريد الإلكتروني حط اللي يناسب شركتك. احفظ الـ passphrase في مكان آمن.

بعد ما تخلص، اعرض المفاتيح عشان تاخذ الـ Key ID:

gpg --list-keys

بيكون شيء زي pub rsa4096 2023-10-27 [SC] <YOUR_KEY_ID>/XXXXXXXXXXXXXXXX. الـ XXXXXXXXXXXXXXXX هو الـ Key ID.

4. إعداد ملف conf/distributions

هذا الملف يحدد خصائص المستودع (اسم التوزيع، المكونات، المفتاح المستخدم).

sudo nano conf/distributions

الصق هذا المحتوى (مع استبدال YOUR_KEY_ID بالـ Key ID حقك):

Origin: MyCompany
Label: MyCompany Private Repository
Suite: stable
Codename: mycompany-repo
Architectures: amd64 i386 all
Components: main
Description: MyCompany Private APT Repository
SignWith: YOUR_KEY_ID
DebIndices: Packages Release . .gz .bz2
DscIndices: Sources Release . .gz .bz2
Contents: . .gz .bz2

ملاحظة: Codename هو اللي بيستخدمه الكلاينت في sources.list. Architectures تحدد أنواع المعالجات المدعومة. Components هي أقسام المستودع (زي main، contrib).

5. إضافة الحزم للمستودع

افترض عندك حزمة اسمها my-app_1.0.0_amd64.deb.

reprepro --ask-passphrase -Vb . includedeb mycompany-repo my-app_1.0.0_amd64.deb

بيطلب منك الـ passphrase حق مفتاح GPG. بعد ما تضاف الحزمة، reprepro بيحدث ملفات الميتا داتا (Packages.gz, Release, إلخ) وبيوقعها.

نصيحة: عشان ما تضطر تكتب الـ passphrase كل مرة، تقدر تستخدم gpg-agent أو تمرر المفتاح بشكل آلي (لكن هذا يقلل من الأمان).

6. إعداد خادم الويب (Apache كمثال)

تأكد إن مجلد المستودع متاح للوصول عبر الويب. Apache عادةً يخدم من /var/www/html، فالمسار /myrepo بيكون جاهز.

لو حابب تسوي Virtual Host خاص أو تحكم في الوصول، تقدر تعدل إعدادات Apache:

sudo nano /etc/apache2/sites-available/myrepo.conf

الصق هذا المحتوى (مع تعديل ServerName):

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName repo.mycompany.com
    DocumentRoot /var/www/html/myrepo

    <Directory /var/www/html/myrepo>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

ثم فعل الموقع وأعد تشغيل Apache:

sudo a2ensite myrepo.conf
sudo systemctl restart apache2

7. إعداد الكلاينت (أجهزة المستخدمين)

على كل جهاز Linux يحتاج يوصل للمستودع:

أ. استيراد مفتاح GPG العام:

أول شي، لازم تصدر المفتاح العام من سيرفر المستودع:

gpg --export -a YOUR_KEY_ID > mycompany_repo.key

وانقل الملف mycompany_repo.key إلى أجهزة الكلاينت، ثم استورده:

sudo apt-key add mycompany_repo.key
# أو الطريقة الحديثة (مفضلة):
# sudo install -m 0755 -d /etc/apt/keyrings
# sudo gpg --dearmor -o /etc/apt/keyrings/mycompany_repo.gpg mycompany_repo.key

ب. إضافة المستودع لـ sources.list:

sudo nano /etc/apt/sources.list.d/mycompany.list

الصق هذا السطر (استبدل repo.mycompany.com بعنوان سيرفرك، و mycompany-repo بالـ Codename حقك):

deb [signed-by=/etc/apt/keyrings/mycompany_repo.gpg] http://repo.mycompany.com/myrepo mycompany-repo main
# لو استخدمت الطريقة القديمة لـ apt-key:
# deb http://repo.mycompany.com/myrepo mycompany-repo main

ثم حدث قائمة الحزم وحاول تثبت حزمتك:

sudo apt update
sudo apt install my-app

وبكذا تكون أنشأت مستودع APT خاص بنجاح!

إنشاء مستودع YUM/DNF خاص (لـ CentOS/RHEL/Fedora)

هنا بنستخدم أداة اسمها createrepo_c، وهي سهلة جداً لإدارة مستودعات RPM.

1. تثبيت createrepo_c وخادم الويب

على سيرفر المستودع:

sudo dnf install createrepo_c httpd
# أو yum install createrepo_c httpd في الإصدارات القديمة
sudo systemctl enable --now httpd

تأكد إن الـ firewall يسمح بالوصول لمنفذ HTTP (80):

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

2. إعداد بنية المستودع

بنحط المستودع في مجلد معين، مثلاً /var/www/html/myrepo.

sudo mkdir -p /var/www/html/myrepo/centos/8/x86_64/
cd /var/www/html/myrepo/centos/8/x86_64/

ملاحظة: تقدر تنظم المجلدات زي ما تحب، لكن هذي طريقة شائعة (نظام التشغيل/الإصدار/المعمارية).

3. إضافة الحزم للمستودع وإنشاء الميتا داتا

افترض عندك حزمة RPM اسمها my-app-1.0.0-1.el8.x86_64.rpm.

sudo cp /path/to/my-app-1.0.0-1.el8.x86_64.rpm .
sudo createrepo_c .

الأمر createrepo_c . بينشئ مجلد repodata داخله ملفات الميتا داتا اللي يحتاجها YUM/DNF. كل ما أضفت حزم جديدة، ارجع شغل الأمر createrepo_c --update . عشان تحدث الميتا داتا.

4. إعداد خادم الويب (Apache)

مثل ما سوينا في APT، تأكد إن مجلد المستودع متاح للوصول عبر الويب. Apache في CentOS/RHEL يخدم من /var/www/html افتراضياً.

لو حاب تتحكم في الوصول أكثر، تقدر تعدل ملف الكونفج الخاص بـ Apache. عادةً يكون في /etc/httpd/conf.d/.

sudo nano /etc/httpd/conf.d/myrepo.conf

الصق هذا المحتوى (مع تعديل ServerName):

<VirtualHost *:80>
    ServerName repo.mycompany.com
    DocumentRoot /var/www/html/myrepo

    <Directory /var/www/html/myrepo>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    ErrorLog /var/log/httpd/myrepo_error.log
    CustomLog /var/log/httpd/myrepo_access.log combined
</VirtualHost>

ثم أعد تشغيل Apache:

sudo systemctl restart httpd

5. إعداد الكلاينت (أجهزة المستخدمين)

على كل جهاز Linux يحتاج يوصل للمستودع (CentOS/RHEL/Fedora):

إنشئ ملف .repo جديد في /etc/yum.repos.d/.

sudo nano /etc/yum.repos.d/mycompany.repo

الصق هذا المحتوى (استبدل repo.mycompany.com بعنوان سيرفرك والمسار centos/8/x86_64 بالمسار الصحيح لمستودعك):

[mycompany-repo]
name=MyCompany Private Repository for CentOS $releasever - $basearch
baseurl=http://repo.mycompany.com/myrepo/centos/$releasever/$basearch/
enabled=1
gpgcheck=0
# لو تبغى gpgcheck=1، لازم تنشئ مفتاح GPG وتوقع الحزم والمستودع، وتوزع المفتاح العام على الكلاينت.
# gpgkey=http://repo.mycompany.com/myrepo/RPM-GPG-KEY-mycompany

ملاحظة: gpgcheck=0 يعني ما فيه توقيع GPG. للأمان في بيئة إنتاج، يفضل دائماً استخدام gpgcheck=1 وتوقيع الحزم والمستودع، وتوزيع المفتاح العام على الكلاينت. عملية توقيع حزم RPM تحتاج rpm --addsign ومفتاح RPM GPG.

ثم امسح الكاش وحاول تثبت حزمتك:

sudo dnf clean all
sudo dnf makecache
sudo dnf install my-app

مبروك، صار عندك مستودع YUM/DNF خاص!

نصائح إضافية وأفضل الممارسات

  • HTTPS: دائماً استخدم HTTPS لتأمين الاتصال بين الكلاينت والمستودع، خاصة لو كان المستودع متاح خارج الشبكة الداخلية.
  • التحكم في الوصول: استخدم مصادقة HTTP (مثل htpasswd في Apache) أو جدران الحماية (firewalls) لتقييد الوصول للمستودع فقط للأجهزة المصرح لها.
  • النسخ الاحتياطي: سوي نسخ احتياطية دورية لمجلد المستودع ومفاتيح GPG.
  • التحديث المستمر: حافظ على تحديث أدوات المستودع (reprepro, createrepo_c) ونظام التشغيل الخاص بسيرفر المستودع.
  • التوقيع الرقمي: لا تتجاهل أهمية توقيع الحزم والمستودع بمفاتيح GPG لضمان أن الحزم لم يتم التلاعب بها.
  • أتمتة: فكر في أتمتة عملية إضافة الحزم وتحديث الميتا داتا باستخدام سكربتات بسيطة.

أتمنى يكون الشرح واضح ومفيد. الآن صار عندك القدرة تتحكم في برمجياتك داخل مؤسستك بكل أمان وفعالية. بالتوفيق!