[{"data":1,"prerenderedAt":209},["ShallowReactive",2],{"seo-verification":3,"blog-تثبيت-gitlab-ce-على-vps-دليل-شامل-ma-ar":6,"promo-bar-likely":208},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-تثبيت-gitlab-ce-على-vps-دليل-شامل-ma-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":151,"ctaBody":152,"ctaButton":153,"ctaUrl":154,"relatedPosts":155},235,"تثبيت-gitlab-ce-على-vps-دليل-شامل",{"fr":12,"en":13,"ar":10,"es":14},"installer-gitlab-ce-vps","install-gitlab-ce-on-a-vps-complete-guide","instalar-gitlab-ce-en-un-vps-guia-completa","تثبيت GitLab CE على VPS: دليل شامل","انشر GitLab CE على VPS باستخدام Docker Compose. يغطي CVE-2026-90970 (CVSS 9.9): ثغرة RCE في AI Gateway وإصداراتها وأوامر التحديث.",18,7,false,"2026-08-07T00:00:00+00:00","2026-10-20T23:18:07+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},3,"النشر","deploiement","bg-success\u002F10 text-success",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Finstaller-gitlab-ce-vps-poster.svg","تستضيف GitHub وBitbucket مستودعاتك، لكنهما يفرضان قواعدهما: دقائق CI محدودة، ملكية غامضة للكود، وأسعار ترتفع مع نمو الفريق. يجمع GitLab CE (النسخة المجتمعية، رخصة MIT\u002FEE Core) على خادم واحد منصةً git كاملة، ومحرك CI\u002FCD بلا حصص دقائق مفروضة، وسجل Docker خاصاً، ووثائق wiki — دون اشتراك SaaS. يرشدك هذا الدليل إلى تثبيته في أقل من ثلاثين دقيقة على VPS باستخدام Docker Compose، وضبط SMTP، وتوصيل Runner، وتجنب الأخطاء الشائعة: إعداد GITLAB_OMNIBUS_CONFIG بشكل خاطئ، وانتهاء صلاحية SSL لغياب ACME، وRunner غير مسجّل.",[34,38,50,53,84,87,90,93,96,99,102,105,107,110,148],{"type":35,"title":36,"body":37},"h2","لماذا GitLab CE بدلًا من GitHub أو Bitbucket","GitHub وBitbucket خدمتان مُدارتان: عمليتان في البداية، لكن نموذج أسعارهما يتطور مع حجم الفريق، ودقائق CI محدودة في الخطط المجانية، وشفرتك مستضافة على بنية تحتية تابعة لجهة خارجية. يعكس GitLab CE هذه المعادلة: تنشر المنصة على VPS الخاص بك، وتحتفظ بالتحكم الكامل في الكود والبيانات، وCI\u002FCD مدمجة دون حصص دقائق مفروضة من طرف ثالث. للوكالات والفرق التي تتعامل مع بيانات حساسة أو تفوتر العملاء، هذا التحكم غير قابل للتفاوض في أغلب الأحيان. GitLab CE هو اليوم أحد أكثر منصات git self-hosted انتشارًا: قاعدة كوده مفتوحة المصدر، ونواته حرة، وعشر سنوات من الوجود جعلت مجتمعه المساهم نشطاً.",{"type":39,"title":40,"items":41},"ul","ما يتضمنه GitLab CE افتراضيًا",[42,43,44,45,46,47,48,49],"**منصة git كاملة**: مستودعات خاصة وعامة، طلبات دمج، مراجعة الكود، حماية الفروع وCODEOWNERS.","**CI\u002FCD مدمجة** بلا حد مفروض للدقائق: pipelines بصيغة YAML (`‎.gitlab-ci‎.yml`)، environments، deploy tokens والـartifacts.","**سجل Docker خاص** مستضاف على نطاقك: `docker pull git‎.yourdomain‎.com\u002Fgroup\u002Fimage:tag` دون حساب Docker Hub.","**Wiki وصفحات** لكل مشروع ومجموعة، مع عرض Markdown كامل.","**تتبع المشكلات والمراحل**: لوحة kanban، تسميات، تكرارات ومخطط burndown مضمّنة.","**Runners متوازية**: سجّل أي عدد من الـrunners على بنيتك التحتية أو عمال CI.","**Webhooks** لإشعار أداة خارجية (Slack، PagerDuty، خادم النشر) عند كل push أو merge.","**RBAC دقيق** بخمسة مستويات وصول (Guest، Reporter، Developer، Maintainer، Owner) ودعم اختياري لـLDAP\u002FSAML.",{"type":35,"title":51,"body":52},"المتطلبات الأساسية قبل البدء","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 في جدار الحماية؛ وتثبيت Docker Engine وإضافة Compose v2.",{"type":54,"title":55,"steps":56},"steps","من التثبيت إلى أول مشروع",[57,60,63,66,69,72,75,78,81],{"title":58,"body":59},"إنشاء هيكل المجلدات","أنشئ مجلدًا مخصصًا والمجلدات الثلاثة الدائمة التي يستخدمها GitLab: `mkdir -p \u002Fopt\u002Fgitlab\u002F{config,logs,data}`. ستُوصل هذه المجلدات داخل الحاوية؛ دونها تختفي الإعدادات والمستودعات عند كل `docker compose down`.",{"title":61,"body":62},"كتابة ملف docker-compose‎.yml","أنشئ `\u002Fopt\u002Fgitlab\u002Fdocker-compose‎.yml`. يُركّز مفتاح `GITLAB_OMNIBUS_CONFIG` كل الإعدادات الخاصة بنسختك — استبدل `git‎.yourdomain‎.com` بنطاقك الفعلي. عرّف خدمة gitlab بالصورة `gitlab\u002Fgitlab-ce:17.2.1-ce.0`، `restart: unless-stopped`، اسم المضيف، متغيرات البيئة، المنافذ 80 و443 و22، الـvolumes الثلاثة، `shm_size: 256m` و`env_file: ‎.env`.",{"title":64,"body":65},"ضبط GITLAB_OMNIBUS_CONFIG","داخل `GITLAB_OMNIBUS_CONFIG`، عرّف على الأقل: `external_url 'https:\u002F\u002Fgit‎.yourdomain‎.com'`؛ `letsencrypt['enable'] = true`؛ معاملات SMTP — `gitlab_rails['smtp_enable'] = true`، العنوان، المنفذ 587، اسم المستخدم، كلمة المرور من ENV، المصادقة `login`، `smtp_enable_starttls_auto = true`. يجب أن تكون جميع الأسطر **داخل** كتلة `GITLAB_OMNIBUS_CONFIG`.",{"title":67,"body":68},"إنشاء ملف ‎.env للأسرار","أنشئ `\u002Fopt\u002Fgitlab\u002F‎.env` وقيّد صلاحياته: `touch \u002Fopt\u002Fgitlab\u002F‎.env && chmod 600 \u002Fopt\u002Fgitlab\u002F‎.env`. أضف متغيراتك الحساسة — كحد أدنى `GITLAB_SMTP_PASSWORD=كلمة_مرور_smtp`.",{"title":70,"body":71},"تشغيل GitLab والانتظار حتى اكتمال الإعداد","أطلق الـstack: `docker compose -f \u002Fopt\u002Fgitlab\u002Fdocker-compose‎.yml up -d`. **انتظر نحو 5 دقائق** قبل الوصول إلى واجهة الويب. تابع التقدم بـ`docker compose -f \u002Fopt\u002Fgitlab\u002Fdocker-compose‎.yml logs -f gitlab` وانتظر رسالة `gitlab Reconfigured!`.",{"title":73,"body":74},"استرداد كلمة مرور root الأولية","استرجع كلمة المرور بـ: `docker exec -it gitlab-gitlab-1 grep 'Password:' \u002Fetc\u002Fgitlab\u002Finitial_root_password`. يُحذف هذا الملف **تلقائيًا بعد 24 ساعة** — دوّن كلمة المرور فورًا.",{"title":76,"body":77},"تسجيل الدخول وتغيير كلمة المرور وتعطيل التسجيل المفتوح","افتح `https:\u002F\u002Fgit‎.yourdomain‎.com`. سجّل دخولك بـ`root`. غيّر كلمة المرور من **User Settings → Password**. عطّل التسجيل العام: **Admin Area → Settings → General → Sign-up restrictions**.",{"title":79,"body":80},"تسجيل GitLab Runner","ثبّت `gitlab-runner` واسترجع رمز التسجيل من **Admin Area → Runners**. سجّل الـrunner: `gitlab-runner register --url https:\u002F\u002Fgit‎.yourdomain‎.com --registration-token YOUR_TOKEN --executor docker --docker-image alpine:latest`.",{"title":82,"body":83},"التحقق من إرسال البريد الإلكتروني","اختبر SMTP من وحدة تحكم Rails: `docker exec -it gitlab-gitlab-1 gitlab-rails console` ثم `Notify‎.test_email('your@email‎.com', 'Test GitLab', 'Hello')‎.deliver_now`.",{"type":85,"body":86},"tip","**النسخ الاحتياطي التلقائي.** يتضمن 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`. زامن مجلد النسخ مع تخزين خارجي (S3، rclone) — النسخة المحلية وحدها ليست نسخةً احتياطية.",{"type":35,"title":88,"body":89},"إعداد runner Docker وكتابة أول pipeline CI\u002FCD","يُعدّ منفّذ Docker الخيار الموصى به لمعظم المشاريع: يعمل كل job في حاوية معزولة. بعد تسجيل الـrunner، يحتوي ملف `\u002Fetc\u002Fgitlab-runner\u002Fconfig‎.toml` على كتلة `[runners‎.docker]`. أضف `volumes = [\"\u002Fcache\"]` للاحتفاظ بالـcache بين الـbuilds، و`pull_policy = [\"if-not-present\"]` لتجنب سحب الصورة في كل job.\n\nمثال pipeline أساسي بـ`‎.gitlab-ci‎.yml`:\n\n```yaml\nstages:\n  - test\n  - build\n  - deploy\n\nvariables:\n  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA\n\ntest:unit:\n  stage: test\n  image: node:20-alpine\n  cache:\n    key: $CI_COMMIT_REF_SLUG\n    paths:\n      - node_modules\u002F\n  script:\n    - npm ci\n    - npm test\n  only:\n    - merge_requests\n    - main\n\nbuild:image:\n  stage: build\n  image: docker:26\n  services:\n    - docker:26-dind\n  before_script:\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n  script:\n    - docker build -t $DOCKER_IMAGE .\n    - docker push $DOCKER_IMAGE\n  only:\n    - main\n\ndeploy:prod:\n  stage: deploy\n  image: alpine:latest\n  before_script:\n    - apk add --no-cache openssh-client\n    - eval $(ssh-agent -s)\n    - echo \"$SSH_PRIVATE_KEY\" | ssh-add -\n  script:\n    - ssh -o StrictHostKeyChecking=no user@yourserver‎.com \"docker pull $DOCKER_IMAGE && docker compose up -d\"\n  only:\n    - main\n  when: manual\n```\n\nتُحقن المتغيرات `CI_REGISTRY_USER` و`CI_REGISTRY_PASSWORD` و`CI_REGISTRY` **تلقائيًا** من GitLab CE. أما `SSH_PRIVATE_KEY` فتُعرَّف في **Settings → CI\u002FCD → Variables** مع تفعيل **Masked**. job النشر `deploy:prod` مضبوط على `when: manual` — لا يُطلق تلقائيًا.",{"type":35,"title":91,"body":92},"ضبط إشعارات SMTP بالتفصيل","يُرسل GitLab بريدًا إلكترونيًا عند كل merge request أو ذكر أو pipeline مكتمل أو تنبيه أمني. إعداد SMTP غائب أو خاطئ يقطع هذه الإشعارات في صمت.\n\nالكتلة الكاملة في `GITLAB_OMNIBUS_CONFIG` لخادم SMTP مصادَق بـSTARTTLS على المنفذ 587:\n\n```ruby\ngitlab_rails['smtp_enable'] = true\ngitlab_rails['smtp_address'] = 'smtp‎.yourdomain‎.com'\ngitlab_rails['smtp_port'] = 587\ngitlab_rails['smtp_user_name'] = 'gitlab@yourdomain‎.com'\ngitlab_rails['smtp_password'] = ENV['GITLAB_SMTP_PASSWORD']\ngitlab_rails['smtp_authentication'] = 'login'\ngitlab_rails['smtp_enable_starttls_auto'] = true\ngitlab_rails['gitlab_email_from'] = 'gitlab@yourdomain‎.com'\ngitlab_rails['gitlab_email_reply_to'] = 'noreply@yourdomain‎.com'\n```\n\nإن كان المُرحِّل يشترط TLS مباشر (المنفذ 465)، استبدل `smtp_enable_starttls_auto = true` بـ`smtp_tls = true`. المفاتيح خارج كتلة omnibus تُهمَل في صمت — اختبر دائمًا بـ`Notify‎.test_email(…)‎.deliver_now` من وحدة تحكم Rails.",{"type":35,"title":94,"body":95},"النسخ الاحتياطي واستعادة GitLab","ينشئ الأمر `docker exec -t gitlab-gitlab-1 gitlab-backup create` أرشيف tar كاملًا يضم المستودعات وقاعدة بيانات PostgreSQL والـartifacts. **تنبيه**: لا يشمل الأرشيف ملفَّي `\u002Fetc\u002Fgitlab\u002Fgitlab‎.rb` و`\u002Fetc\u002Fgitlab\u002Fgitlab-secrets‎.json` — احتفظ بهما بشكل منفصل:\n\n```bash\ntar czf \u002Fopt\u002Fgitlab\u002Fconfig-secrets-$(date +%Y%m%d)‎.tar‎.gz \\\n  \u002Fopt\u002Fgitlab\u002Fconfig\u002Fgitlab‎.rb \\\n  \u002Fopt\u002Fgitlab\u002Fconfig\u002Fgitlab-secrets‎.json\n```\n\n**الاستعادة** — ثلاث خطوات بالترتيب: ثبّت نفس الإصدار الذي أنتج النسخة؛ انسخ الأرشيف إلى `\u002Fopt\u002Fgitlab\u002Fdata\u002Fbackups\u002F`؛ ثم:\n\n```bash\ndocker exec -it gitlab-gitlab-1 gitlab-ctl stop puma\ndocker exec -it gitlab-gitlab-1 gitlab-ctl stop sidekiq\ndocker exec -it gitlab-gitlab-1 gitlab-backup restore BACKUP=\u003Ctimestamp>_\u003Cversion>\ndocker exec -it gitlab-gitlab-1 gitlab-ctl restart\ndocker exec -it gitlab-gitlab-1 gitlab-rake gitlab:check SANITIZE=true\n```\n\nجدول النسخ الاحتياطي الكامل ليلًا وزامنه مع تخزين خارجي.",{"type":35,"title":97,"body":98},"استكشاف الأخطاء: أكثر ثلاث مشكلات شيوعًا","**502 Bad Gateway عند الإقلاع.** يستغرق GitLab نحو 5 دقائق ليصبح جاهزًا. إن استمر الـ502، تحقق من بدء Puma: `docker exec gitlab-gitlab-1 gitlab-ctl status puma`. نقص الذاكرة هو السبب الأكثر شيوعًا. **SMTP لا يعمل.** تحقق أولًا: هل كتلة `gitlab_rails['smtp_*']` داخل `GITLAB_OMNIBUS_CONFIG`؟ مفتاح خارج الكتلة يُهمَل في صمت. **Runner غير متصل.** تحقق بـ`gitlab-runner verify --url https:\u002F\u002Fgit‎.yourdomain‎.com`. شهادة TLS موقّعة ذاتيًا أو نطاق غير قابل للحل هما السببان المعتادان.",{"type":35,"title":100,"body":101},"استكشاف متقدم: Sidekiq متوقف وPuma timeout وOOM على Gitaly","**Sidekiq queue stuck.** تحقق من الحالة:\n\n```bash\ndocker exec gitlab-gitlab-1 gitlab-ctl status sidekiq\ndocker exec gitlab-gitlab-1 gitlab-rake gitlab:sidekiq:check\n```\n\nلتفريغ قائمة انتظار بعينها: `docker exec -it gitlab-gitlab-1 gitlab-rails console -e production` ثم `Sidekiq::Queue‎.new('mailers')‎.clear`. لإعادة تشغيله دون فقدان الـjobs المعلّقة: `docker exec gitlab-gitlab-1 gitlab-ctl restart sidekiq`.\n\n**Puma timeout.** أضف في `GITLAB_OMNIBUS_CONFIG`: `puma['worker_timeout'] = 90` (الافتراضي 60 ثانية). إن استمرت الـtimeouts، السبب في الغالب نقص RAM أو عدد workers غير ملائم.\n\n**OOM على Gitaly.** تحقق بـ`dmesg | grep -i kill`. قلّل الـcache: `gitaly['configuration']['git']['catfile_cache_size'] = 5` (الافتراضي 100).\n\n**حاوية تخرج فور الإقلاع.** راجع السجلات: `docker compose logs gitlab | tail -50`. الأسباب الشائعة: تعارض المنفذ 22، volume غير قابل للكتابة، أو صيغة Ruby خاطئة في `GITLAB_OMNIBUS_CONFIG`.",{"type":35,"title":103,"body":104},"الأمان: CVE-2026-90970 وتحديث حرج","في 2 أكتوبر 2026، كشف GitLab عن **CVE-2026-90970**، وهي ثغرة أمنية خطيرة (CVSS 9.9) تصيب مكوّن **AI Gateway** في عمليات النشر الذاتي. الثغرة هي حقن قوالب من جانب الخادم (SSTI) في قوالب التدفق المخصصة: يستطيع مستخدم مصادق يمتلك صلاحية الوصول إلى منصة Duo Agent تقديم تهيئة تدفق مُعدَّة خصيصاً للإفلات من البيئة المعزولة و**تنفيذ أوامر عشوائية على المضيف**.\n\n**ما المتأثر.** فقط النسخ ذاتية الاستضافة التي تنشر مكوّن AI Gateway. تم تصحيح GitLab.com والنسخ المُدارة تلقائياً. لا يُعدّ الاستغلال سهلاً (يتطلب صلاحية Duo Agent Platform) ولم تُرصد أي هجمات فعلية وقت الإفصاح.\n\n**الإصدارات المتأثرة والإصدارات المصحَّحة.**\n\n| الفرع | آخر إصدار متأثر | الإصدار المصحَّح |\n|---|---|---|\n| 19.4.x | 19.4.0 | **19.4.1** |\n| 19.3.x | 19.3.1 | **19.3.2** |\n| 18.1.6 – 19.2.x | 19.2.3 | **19.2.4** |\n\n**تحديث AI Gateway عبر Docker.**\n\n```bash\n# إيقاف الحاوية الحالية وحذفها\ndocker stop gitlab-ai-gateway && docker rm gitlab-ai-gateway\n\n# سحب الصورة المصحَّحة (استبدل الوسم بفرعك)\ndocker pull registry.gitlab.com\u002Fgitlab-org\u002Fmodelops\u002Fapigw\u002Fself-hosted-v19.4.1-ee\n# أو: self-hosted-v19.3.2-ee \u002F self-hosted-v19.2.4-ee\n\n# إعادة التشغيل بنفس متغيرات البيئة\ndocker run -d --name gitlab-ai-gateway \\\n  --restart unless-stopped \\\n  [خياراتك المعتادة] \\\n  registry.gitlab.com\u002Fgitlab-org\u002Fmodelops\u002Fapigw\u002Fself-hosted-v19.4.1-ee\n\n# التحقق من الإصدار المنشور\ndocker ps --format '{{.Image}}' | grep ai-gateway\n```\n\n**التحديث عبر Helm \u002F Kubernetes.** حدِّث `image.tag` في قيم Helm إلى الإصدار المصحَّح، واضبط `imagePullPolicy: Always`، ثم شغِّل `helm upgrade`.\n\nللتحقق بعد التحديث من أن الحاوية تعمل على الصورة المصحَّحة: `docker inspect \u003Ccontainer> --format '{{.Config.Image}}'`.",{"type":85,"body":106},"**تعطيل AI Gateway إذا كنت لا تستخدمه.** إذا كانت نسخة GitLab CE لديك لا تستخدم ميزات Duo (الإكمال التلقائي بالذكاء الاصطناعي، الدردشة)، يمكنك ببساطة إيقاف AI Gateway وإزالته من ملف `docker-compose.yml`. المكوّن غير المنشور لا يمكن استغلاله. تحقق من أن أي pipeline لا يعتمد على AI Gateway API قبل إزالته.",{"type":35,"title":108,"body":109},"تحسين استخدام RAM: الـswap وعمال Puma","**تقليل عمال Puma.** في `GITLAB_OMNIBUS_CONFIG`:\n\n```ruby\npuma['worker_processes'] = 2\npuma['min_threads'] = 1\npuma['max_threads'] = 4\n```\n\nكل عامل Puma يستهلك 200 إلى 300 ميغابايت. عاملان يكفيان لأقل من خمسة عشر مستخدمًا نشطًا.\n\n**إضافة swap.** على VPS بلا swap:\n\n```bash\nfallocate -l 4G \u002Fswapfile\nchmod 600 \u002Fswapfile\nmkswap \u002Fswapfile\nswapon \u002Fswapfile\necho '\u002Fswapfile none swap sw 0 0' >> \u002Fetc\u002Ffstab\n```\n\n**توصيات RAM وCPU حسب حجم الفريق**\n\n| حجم الفريق | RAM موصى بها | vCPU | ملاحظات |\n|---|---|---|---|\n| 1–5 مطورين | 4 غيغابايت | 2 | Runners على الجهاز ذاته ممكنة مع swap |\n| 5–15 مطورًا | 8 غيغابايت | 4 | Runner مخصص منصوح به فوق 8 pipelines\u002Fيوم |\n| 15–30 مطورًا | 16 غيغابايت | 8 | سجل Docker نشط، Gitaly تحت الحمل |\n| 30+ مطورًا | 32 غيغابايت+ | 16+ | فصل Gitaly وSidekiq على أجهزة مخصصة |",{"type":111,"title":112,"headers":113,"rows":117},"comparison","GitLab CE أو Forgejo أو Gitea: كيف تختار",[114,115,116],"المعيار","GitLab CE","Forgejo \u002F Gitea",[118,122,126,130,134,136,140,144],[119,120,121],"الرخصة","MIT \u002F EE Core","MIT",[123,124,125],"ذاكرة الخمول","300–600 ميغابايت (Puma + Sidekiq)","30–50 ميغابايت",[127,128,129],"CI\u002FCD أصيلة","نعم (`‎.gitlab-ci‎.yml`، runners)","Forgejo: نعم عبر Woodpecker CI؛ Gitea: لا يوجد",[131,132,133],"سجل Docker مدمج","نعم","Forgejo: نعم؛ Gitea: غير أصيل",[135,132,132],"Wiki لكل مشروع",[137,138,139],"LDAP \u002F SAML","نعم (CE)","Forgejo: نعم؛ Gitea: LDAP نعم، SAML لا",[141,142,143],"منحنى التعلم","مرتفع (واجهة غنية)","منخفض إلى متوسط",[145,146,147],"الأنسب لـ","فرق 5+ تحتاج CI وسجل Docker وRBAC","فرق خفيفة، منصة بسيطة، بصمة RAM منخفضة",{"type":35,"title":149,"body":150},"متى تختار GitLab CE ومتى تختار Forgejo","GitLab CE هو الاختيار الصحيح إن احتاج فريقك إلى CI\u002FCD قوية مدمجة مباشرةً في المنصة، وسجل Docker خاص على نطاقك، وpipelines نشر مع environments، أو إدارة مشاريع بمشكلات ومراحل ولوحة kanban دون أداة خارجية. بصمته الذاكرية (4–8 غيغابايت) هي ثمن هذا الثراء الوظيفي. Forgejo أو Gitea هما الخيار حين تكون الذاكرة القيد الرئيسي، وحين المنصة هي الحاجة الوحيدة (دون CI مدمجة). على VPS بـ2 غيغابايت، GitLab CE غير قابل للتطبيق؛ Forgejo يعمل بـ256 ميغابايت. على VPS بـ8 غيغابايت مخصص لفريق تطوير، يوفر GitLab CE بيئة كاملة تضعها GitHub على منصتها SaaS — تحت سيطرتك ودون اشتراك شهري بحسب عدد المستخدمين.","VPS جاهز لـGitLab CE","يحتاج GitLab CE إلى VPS بذاكرة 4 إلى 8 غيغابايت وقرص سخي وعنوان IP مخصص. تأتي VPS ServOrbit مزوّدة بنظام التشغيل الذي تختاره (Ubuntu 24.04 LTS أو Ubuntu 22.04 LTS أو Debian 12) وصلاحية root فورية — ما يكفي لإطلاق منصتك خلال ثلاثين دقيقة.","اطّلع على VPS ServOrbit","\u002Fsolutions\u002Fdeveloppeurs",[156,176,192],{"id":157,"slug":158,"slugs":159,"title":163,"excerpt":164,"readTime":165,"views":166,"isPinned":19,"noindex":19,"publishedAt":167,"updatedAt":168,"category":169,"categories":173,"featuredImage":29,"bgImage":30,"posterImage":175,"relatedSolution":29},212,"woodpecker-ci-وforgejo-خط-أنابيب-cicd-على-خادم-vps",{"fr":160,"en":161,"ar":158,"es":162},"woodpecker-ci-pipeline-vps-forgejo","woodpecker-ci-and-forgejo-cicd-pipeline-on-a-vps","woodpecker-ci-forgejo-pipeline-cicd-vps","Woodpecker CI وForgejo: خط أنابيب CI\u002FCD على خادم VPS","نشر Woodpecker CI v3 مع Forgejo على خادم VPS: إعداد Docker Compose، تكوين YAML، الأسرار، أجهزة التشغيل متعددة المعماريات واستكشاف أخطاء OAuth.",12,2,"2026-08-02T00:00:00+00:00","2026-11-08T01:13:13+00:00",{"id":166,"name":170,"slug":171,"color":172,"icon":171},"الأتمتة","automatisation","bg-brand-action\u002F10 text-brand-action",[174],{"id":166,"name":170,"slug":171,"color":172,"icon":171},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":177,"slug":178,"slugs":179,"title":183,"excerpt":184,"readTime":165,"views":185,"isPinned":19,"noindex":19,"publishedAt":186,"updatedAt":187,"category":188,"categories":189,"featuredImage":29,"bgImage":30,"posterImage":191,"relatedSolution":29},229,"docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط",{"fr":180,"en":181,"ar":178,"es":182},"docker-compose-production-checklist","docker-compose-in-production-10-point-checklist","checklist-docker-compose-en-produccion","Docker Compose في الإنتاج: قائمة التحقق من 10 نقاط","‏قائمة تحقق ‎Docker Compose‎ للإنتاج: 10 إعدادات، فحوصات صحية، أسرار، تراجع، استكشاف الأخطاء، والانتقال من ‎docker-compose v1‎ إلى ‎docker compose‎ على ‎Ubuntu 26.04‎.",1,"2026-08-06T00:00:00+00:00","2026-10-23T13:27:09+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[190],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",{"id":193,"slug":194,"slugs":195,"title":199,"excerpt":200,"readTime":201,"views":166,"isPinned":19,"noindex":19,"publishedAt":202,"updatedAt":203,"category":204,"categories":205,"featuredImage":29,"bgImage":30,"posterImage":207,"relatedSolution":29},207,"k3s-كوبيرنيتيس-خفيف-على-vps-الخاص-بك",{"fr":196,"en":197,"ar":194,"es":198},"k3s-kubernetes-leger-vps","k3s-lightweight-kubernetes-on-your-vps","k3s-kubernetes-ligero-en-un-vps","K3s: كوبيرنيتيس خفيف على VPS الخاص بك","شغّل كتلة كوبيرنيتيس معتمدة من CNCF على VPS متواضع باستخدام K3s، توزيعة Rancher\u002FSUSE التي لا تتجاوز 60 ميغابايت.",4,"2026-08-01T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[206],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fk3s-kubernetes-leger-vps-poster.svg",true,1794270266619]