لماذا تستضيف منصة Git ذاتيًا على VPS
منصة Git المستضافة ذاتيًا تُبقي ملكيتك الفكرية بعيدًا عن المنصات العامة وتزيل أي حد تعسّفي على عدد المستودعات الخاصة أو المتعاونين أو دقائق CI. على VPS، تتحكّم في موقع البيانات والنسخ الاحتياطي والتكامل مع خط الإنتاج الداخلي الخاص بك. Gitea (وفرعه Forgejo) مكتوب بلغة Go: ثنائي (binary) واحد، إقلاع فوري، بصمة ذاكرة ضئيلة، مثالي لـ VPS متواضع. أما GitLab CE فهو حزمة متكاملة (المشكلات وCI/CD وسجل Docker وسجل الحزم وويكي والبيئات) لكنه يستهلك ذاكرة (RAM) أكبر بكثير. يعتمد الخيار على حاجتك: Git نظيف وسريع، أو منصة DevOps متكاملة في منتج واحد.
فوائد منصة مستضافة ذاتيًا
- مستودعات خاصة غير محدودة من دون اشتراك لكل مقعد
- CI/CD تحت سيطرتك، مع مُشغِّلاتك الخاصة على VPS
- الأسرار والرموز (tokens) مخزَّنة لديك، خارج أي منصة طرف ثالث
- سجل صور Docker والحزم مدمج، قريب من عمليات نشرك
- الامتثال وتوطين البيانات في المغرب تحت السيطرة
- مع Gitea: ثنائي واحد، ونسخ احتياطي بنسخ مجلد وقاعدة بيانات
المتطلبات حسب المنصة المختارة
Gitea اقتصادي: يكفي 1 vCPU و1 غيغابايت من الذاكرة لفريق صغير، و2 غيغابايت مع قاعدة البيانات وبضعة مُشغِّلات. أما GitLab CE فأكثر نهمًا بكثير: استهدف 4 غيغابايت من الذاكرة كحد أدنى (يُوصى بـ 8 غيغابايت في الاستخدام الفعلي مع CI)، و4 vCPU وقرصًا سريعًا، لأن الحزمة تتضمّن PostgreSQL وRedis وSidekiq وGitaly. في كلتا الحالتين تحتاج إلى Docker وCompose، ونطاق فرعي (git.yourdomain.com)، وبروكسي عكسي لأجل TLS، ويُفضَّل نطاق فرعي ثانٍ إذا فعّلت سجل Docker. خصّص وحدة تخزين مخصصة للمستودعات واستراتيجية للنسخ الاحتياطي.
نشر Gitea (أو GitLab) على VPS باستخدام Docker
إنشاء وحدات التخزين والشبكة
جهّز mkdir -p /srv/gitea/{data,db} وشبكة Docker مخصصة docker network create forge. يسهّل الفصل بين data وdb النسخ الاحتياطي المستقل للشيفرة ولقاعدة البيانات.
تعريف ملف docker-compose.yml
بالنسبة إلى Gitea، عرِّف خدمة gitea/gitea إضافةً إلى postgres، وركِّب وحدات التخزين، واكشف منفذ HTTP 3000 ومنفذ SSH الخاص بـ Git 2222 محليًا. أما بالنسبة إلى GitLab، فاستخدم gitlab/gitlab-ce مع المتغير GITLAB_OMNIBUS_CONFIG لتعيين external_url.
التشغيل وإنهاء التثبيت
نفِّذ docker compose up -d. يعرض Gitea معالج تثبيت عند أول اتصال (أدخِل نوع قاعدة البيانات والنطاق)؛ أما GitLab فيستغرق عدة دقائق للتهيئة، فاحصل على كلمة مرور root المُولَّدة من السجلات (logs).
ضبط البروكسي العكسي وSSL
وجِّه git.yourdomain.com إلى منفذ HTTP الخاص بالمنصة باستخدام Caddy أو Nginx للحصول على شهادة Let's Encrypt. احرص على تمرير X-Forwarded-Proto الصحيح كي تكون روابط الاستنساخ عبر HTTPS صحيحة.
تفعيل SSH الخاص بـ Git
اربط منفذ SSH الخاص بالحاوية بمنفذ على الـ VPS (مثل 2222) واضبط مفاتيحك. عيِّن SSH_DOMAIN كي تكون أوامر git clone التي تقترحها الواجهة دقيقة.
توصيل CI/CD
سجِّل مُشغِّلًا (runner): إما Gitea Actions (متوافق مع صياغة GitHub Actions) أو GitLab Runner عبر Docker. حُدّ من موارده واعزله في حاويته الخاصة كي لا تُسقط مهمة ثقيلة المنصة.
| المعيار | Gitea | GitLab CE |
|---|---|---|
| الحد الأدنى المُوصى به من الذاكرة | 1 إلى 2 غيغابايت | 4 إلى 8 غيغابايت |
| البنية | ثنائي Go واحد | حزمة متعددة الخدمات (omnibus) |
| زمن الإقلاع | شبه فوري | عدة دقائق |
| CI/CD مدمج | Gitea Actions (بأسلوب GitHub) | GitLab CI/CD، متكامل جدًا |
| سجل Docker / الحزم | مُضمَّن وخفيف | مُضمَّن وغني |
| إدارة المشاريع (المشكلات، اللوحات) | أساسية | متقدمة (epics حسب الإصدار) |
| سهولة النسخ الاحتياطي | مجلد + تفريغ SQL | إجراء omnibus مخصص |
| مثالي لـ | VPS متواضع، فريق صغير/متوسط | منصة DevOps متكاملة |
في GitLab، تجنّب الـ OOM-kill على VPS صغير بتقليل التزامن: اضبط puma['worker_processes'] على 2 وsidekiq['max_concurrency'] على 10 في إعدادات omnibus. وإذا ظلّت الذاكرة مشكلة، فانظر إلى Forgejo (فرع مجتمعي من Gitea) الذي يحافظ على الخفّة مع تغطية 90% من احتياجات الفريق، بما في ذلك السجل وActions.