النشر8 دقيقة قراءة

تثبيت GitLab CE على VPS: دليل شامل

تستضيف GitHub وBitbucket مستودعاتك، لكنهما يفرضان قواعدهما: دقائق CI محدودة، ملكية غامضة للكود، وأسعار ترتفع مع نمو الفريق. يجمع GitLab CE (النسخة المجتمعية، رخصة MIT/EE Core) على خادم واحد منصةً git كاملة، ومحرك CI/CD بلا حصص دقائق مفروضة، وسجل Docker خاصاً، ووثائق wiki — دون اشتراك SaaS. يرشدك هذا الدليل إلى تثبيته في أقل من ثلاثين دقيقة على VPS باستخدام Docker Compose، وضبط SMTP، وتوصيل Runner، وتجنب الأخطاء الشائعة: إعداد GITLAB_OMNIBUS_CONFIG بشكل خاطئ، وانتهاء صلاحية SSL لغياب ACME، وRunner غير مسجّل.

لماذا GitLab CE بدلًا من GitHub أو Bitbucket

GitHub وBitbucket خدمتان مُدارتان: عمليتان في البداية، لكن نموذج أسعارهما يتطور مع حجم الفريق، ودقائق CI محدودة في الخطط المجانية، وشفرتك مستضافة على بنية تحتية تابعة لجهة خارجية. يعكس GitLab CE هذه المعادلة: تنشر المنصة على VPS الخاص بك، وتحتفظ بالتحكم الكامل في الكود والبيانات، وCI/CD مدمجة دون حصص دقائق مفروضة من طرف ثالث. للوكالات والفرق التي تتعامل مع بيانات حساسة أو تفوتر العملاء، هذا التحكم غير قابل للتفاوض في أغلب الأحيان. GitLab CE هو اليوم أحد أكثر منصات git self-hosted انتشارًا: قاعدة كوده مفتوحة المصدر، ونواته حرة، وعشر سنوات من الوجود جعلت مجتمعه المساهم نشطاً.

ما يتضمنه GitLab CE افتراضيًا

  • منصة git كاملة: مستودعات خاصة وعامة، طلبات دمج، مراجعة الكود، حماية الفروع وCODEOWNERS.
  • CI/CD مدمجة بلا حد مفروض للدقائق: pipelines بصيغة YAML (.gitlab-ci.yml)، environments، deploy tokens والـartifacts.
  • سجل Docker خاص مستضاف على نطاقك: docker pull git.yourdomain.com/group/image:tag دون حساب Docker Hub.
  • Wiki وصفحات لكل مشروع ومجموعة، مع عرض Markdown كامل.
  • تتبع المشكلات والمراحل: لوحة kanban، تسميات، تكرارات ومخطط burndown مضمّنة.
  • Runners متوازية: سجّل أي عدد من الـrunners على بنيتك التحتية أو عمال CI.
  • Webhooks لإشعار أداة خارجية (Slack، PagerDuty، خادم النشر) عند كل push أو merge.
  • RBAC دقيق بخمسة مستويات وصول (Guest، Reporter، Developer، Maintainer، Owner) ودعم اختياري لـLDAP/SAML.

المتطلبات الأساسية قبل البدء

GitLab CE كثيف الاستهلاك للذاكرة — وهذا من أبرز عيوبه مقارنةً بـForgejo أو Gitea. خطّط لـ4 غيغابايت RAM كحد أدنى للاستخدام الخفيف (أقل من عشرة مستخدمين نشطين)؛ يُوصى بـ8 غيغابايت بمجرد إضافة runners على الجهاز نفسه أو تفعيل سجل Docker. تحت 4 غيغابايت، يتنافس Puma وSidekiq على الذاكرة ويستجيب GitLab بـ502 تحت الحمل. للتخزين، خصص 20 غيغابايت على الأقل للتثبيت والمستودعات الأولية — خطط لـ50 غيغابايت إن كنت ستخزّن صور Docker في السجل. تحتاج أيضًا إلى: اسم نطاق يشير إلى IP الـVPS (مثلاً ‎git.yourdomain.com‎) لكي تُصدر Let's Encrypt شهادة TLS؛ وفتح المنافذ 80 و443 و22 في جدار الحماية (المنفذ 22 يستخدمه GitLab لدفع SSH — إن كان daemon SSH النظام يستمع على 22 أيضًا، انقله إلى منفذ آخر)؛ وتثبيت Docker Engine وإضافة Compose v2 (docker compose version يجب أن يعيد v2.x).

من التثبيت إلى أول مشروع

01

إنشاء هيكل المجلدات

أنشئ مجلدًا مخصصًا والمجلدات الثلاثة الدائمة التي يستخدمها GitLab: mkdir -p /opt/gitlab/{config,logs,data}. ستُوصل هذه المجلدات داخل الحاوية؛ دونها تختفي الإعدادات والمستودعات عند كل docker compose down.

02

كتابة ملف docker-compose.yml

أنشئ /opt/gitlab/docker-compose.yml. يُركّز مفتاح GITLAB_OMNIBUS_CONFIG كل الإعدادات الخاصة بنسختك — استبدل git.yourdomain.com بنطاقك الفعلي. عرّف خدمة gitlab بالصورة gitlab/gitlab-ce:17.2.1-ce.0، restart: unless-stopped، اسم المضيف، متغيرات البيئة (بما فيها GITLAB_OMNIBUS_CONFIG)، المنافذ 80 و443 و22، الـvolumes الثلاثة، shm_size: 256m وenv_file: ‎.env. ملاحظة مهمة: تُحدد قيمة external_url ما إذا كان GitLab يولّد URLs بـhttp:// أو https://، وما إذا كانت Let's Encrypt تُحاوَل — يجب أن تتطابق تمامًا مع نطاق قابل للحل من الإنترنت.

03

ضبط GITLAB_OMNIBUS_CONFIG

داخل GITLAB_OMNIBUS_CONFIG، عرّف على الأقل: external_url 'https://git.yourdomain.com'؛ letsencrypt['enable'] = true مع letsencrypt['contact_emails']؛ معاملات SMTP — gitlab_rails['smtp_enable'] = true، العنوان، المنفذ 587، اسم المستخدم، gitlab_rails['smtp_password'] = ENV['GITLAB_SMTP_PASSWORD']، المصادقة login، smtp_enable_starttls_auto = true، gitlab_email_from؛ وإن فعّلت السجل: registry_external_url 'https://registry.yourdomain.com'. يجب أن تكون جميع هذه الأسطر داخل كتلة GITLAB_OMNIBUS_CONFIG وليست متغيرات بيئة منفصلة — مفتاح خارج الكتلة يُهمَل في صمت.

04

إنشاء ملف ‎.env للأسرار

أنشئ /opt/gitlab/‎.env وقيّد صلاحياته: touch /opt/gitlab/‎.env && chmod 600 /opt/gitlab/‎.env. أضف متغيراتك الحساسة — كحد أدنى GITLAB_SMTP_PASSWORD=كلمة_مرور_smtp. لا تضع كلمة مرور بنص صريح في ملف Compose. أضف ‎.env إلى ‎.gitignore إن كنت تضع الإعدادات تحت التحكم بالإصدارات.

05

تشغيل GitLab والانتظار حتى اكتمال الإعداد

أطلق الـstack: docker compose -f /opt/gitlab/docker-compose.yml up -d. أول تشغيل يستغرق وقتًا: يُهيئ GitLab قاعدة البيانات ويُعدّ Nginx وPuma. انتظر نحو 5 دقائق قبل الوصول إلى واجهة الويب. تابع التقدم بـdocker compose -f /opt/gitlab/docker-compose.yml logs -f gitlab وانتظر رسالة gitlab Reconfigured!.

06

استرداد كلمة مرور root الأولية

عند أول تهيئة، يولّد GitLab كلمة مرور مؤقتة لحساب root. استرجعها بـ: docker exec -it gitlab-gitlab-1 grep 'Password:' /etc/gitlab/initial_root_password. يُحذف هذا الملف تلقائيًا بعد 24 ساعة — دوّن كلمة المرور فورًا.

07

تسجيل الدخول وتغيير كلمة المرور وتعطيل التسجيل المفتوح

افتح https://git.yourdomain.com في متصفحك. سجّل دخولك بـroot وكلمة المرور التي استرجعتها. انتقل إلى User Settings → Password وحدد كلمة مرور جديدة. أنشئ أول مستخدم لا يمتلك صلاحية root: Admin Area → Users → New User. للاستخدام الداخلي، عطّل التسجيل العام: Admin Area → Settings → General → Sign-up restrictions → أزل تحديد 'Sign-up enabled'.

08

تسجيل GitLab Runner

تتطلب pipelines CI/CD runner واحدًا على الأقل. ثبّت gitlab-runner على الـVPS أو جهاز مخصص. استرجع رمز التسجيل من Admin Area → Runners (مشترك) أو Settings → CI/CD → Runners في مشروعك. سجّل الـrunner: gitlab-runner register --url https://git.yourdomain.com --registration-token YOUR_TOKEN --executor docker --docker-image alpine:latest. بعد التسجيل يظهر الـrunner باللون الأخضر وتستطيع pipelines ‎.gitlab-ci.yml التنفيذ.

09

التحقق من إرسال البريد الإلكتروني

اختبر SMTP من وحدة تحكم Rails: docker exec -it gitlab-gitlab-1 gitlab-rails console ثم اكتب Notify.test_email('[email protected]', 'Test GitLab', 'Hello').deliver_now. إن لم يصل البريد، تحقق من وجود مفاتيح smtp_* داخل GITLAB_OMNIBUS_CONFIG وراجع السجلات: docker exec -it gitlab-gitlab-1 tail -f /var/log/gitlab/gitlab-rails/production.log.

النسخ الاحتياطي التلقائي. يتضمن GitLab أمر نسخ احتياطي كامل: docker exec -t gitlab-gitlab-1 gitlab-backup create. جدوله في crontab -e بالسطر 0 3 * * * docker exec -t gitlab-gitlab-1 gitlab-backup create CRON=1. تُنشأ الأرشيفات في /var/opt/gitlab/backups ومُختومة بالتوقيت. زامن هذا المجلد مع تخزين خارجي (S3، rclone) — النسخة المحلية وحدها ليست نسخةً احتياطية.

استكشاف الأخطاء: أكثر ثلاث مشكلات شيوعًا

502 Bad Gateway عند الإقلاع. يستغرق GitLab نحو 5 دقائق ليصبح جاهزًا. إن استمر الـ502، تحقق من بدء Puma: docker exec gitlab-gitlab-1 gitlab-ctl status puma. نقص الذاكرة هو السبب الأكثر شيوعًا — تأكد من توفر 4 غيغابايت على الأقل. SMTP لا يعمل. تحقق أولًا: هل كتلة gitlab_rails['smtp_*'] داخل GITLAB_OMNIBUS_CONFIG وليست متغير بيئة منفصل؟ مسافة بادئة خاطئة أو مفتاح خارج الكتلة يُهمَل في صمت — اختبر من وحدة تحكم Rails (الخطوة 9). Runner غير متصل. إن ظهر رماديًا أو offline، تحقق من وصوله إلى نسختك: gitlab-runner verify --url https://git.yourdomain.com. شهادة TLS موقّعة ذاتيًا أو نطاق غير قابل للحل من جهاز الـrunner هما السببان المعتادان. تحقق أيضًا من مستوى الرمز المستخدم في التسجيل (instance، group أو project).

GitLab CE أو Forgejo أو Gitea: كيف تختار

المعيارGitLab CEForgejo / Gitea
الرخصةMIT / EE CoreMIT
ذاكرة الخمول300–600 ميغابايت (Puma + Sidekiq)30–50 ميغابايت
CI/CD أصيلةنعم (`.gitlab-ci.yml`، runners)Forgejo: نعم عبر Woodpecker CI؛ Gitea: لا يوجد
سجل Docker مدمجنعمForgejo: نعم؛ Gitea: غير أصيل
Wiki لكل مشروعنعمنعم
LDAP / SAMLنعم (CE)Forgejo: نعم؛ Gitea: LDAP نعم، SAML لا
منحنى التعلممرتفع (واجهة غنية)منخفض إلى متوسط
الأنسب لـفرق 5+ تحتاج CI وسجل Docker وRBACفرق خفيفة، منصة بسيطة، بصمة RAM منخفضة

متى تختار GitLab CE ومتى تختار Forgejo

GitLab CE هو الاختيار الصحيح إن احتاج فريقك إلى CI/CD قوية مدمجة مباشرةً في المنصة، وسجل Docker خاص على نطاقك، وpipelines نشر مع environments، أو إدارة مشاريع بمشكلات ومراحل ولوحة kanban دون أداة خارجية. بصمته الذاكرية (4–8 غيغابايت) هي ثمن هذا الثراء الوظيفي. Forgejo أو Gitea هما الخيار حين تكون الذاكرة القيد الرئيسي، وحين المنصة هي الحاجة الوحيدة (دون CI مدمجة) وتشغّل CI بأداة خارجية. على VPS بـ2 غيغابايت، GitLab CE غير قابل للتطبيق؛ Forgejo يعمل بـ256 ميغابايت. على VPS بـ8 غيغابايت مخصص لفريق تطوير، يوفر GitLab CE بيئة كاملة تضعها GitHub على منصتها SaaS — تحت سيطرتك ودون اشتراك شهري بحسب عدد المستخدمين.

VPS جاهز لـGitLab CE

يحتاج GitLab CE إلى VPS بذاكرة 4 إلى 8 غيغابايت وقرص سخي وعنوان IP مخصص. تأتي VPS ServOrbit مزوّدة بـDebian 12 أو Ubuntu 24.04 وصلاحية root فورية — ما يكفي لإطلاق منصتك خلال ثلاثين دقيقة.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو راسل فريقنا — الدعم بـ العربية والفرنسية والإنجليزية.