دليل النشر

‏Gitea وForgejo: بديل ‏GitHub Actions المدفوع على ‏VPS

انشر على VPS Cloud ←

دليل عملي

‏Gitea وForgejo: بديل ‏GitHub Actions المدفوع على ‏VPS

الأتمتة11 دقيقةً للقراءةعدد الخطوات: 10

‏منذ 1 مارس 2026، باتت دقائق ‏CI على المستودعات الخاصة في ‏GitHub تُفوتر بالاستهلاك. للفرق التي تُشغّل ‏pipelines متتالية — اختبارات، ‏lint، بناء ‏Docker، نشر — قد تتجاوز الفاتورة الشهرية ميزانية الاستضافة ذاتها. يتيح لك ‏Gitea و‏Forgejo استعادة السيطرة: نفس صياغة ‏YAML، نفس منطق ‏runner، بدون تكلفة إضافية للدقيقة. يقارن هذا الدليل الخيارين ويشرح التثبيت خطوة بخطوة على ‏VPS.

المحتويات· ما الذي تغيّر في تسعير ‏GitHub Actions1/13
  1. 01ما الذي تغيّر في تسعير ‏GitHub Actions
  2. 02لماذا تنقل ‏CI/CD إلى ‏forge مستضافة ذاتياً
  3. 03المتطلبات المسبقة
  4. 04‏Gitea Actions مقابل ‏Forgejo Actions مقابل ‏Woodpecker CI
  5. 05‏الخيار الأول: Gitea مع act_runner
  6. 06تثبيت ‏Gitea و‏runner
  7. 07‏الخيار الثاني: Forgejo مع act_runner
  8. 08اختلافات التثبيت مقارنة بـ ‏Gitea
  9. 09‏توافق YAML مع GitHub Actions
  10. 10المزايا المقارنة لـ ‏runner المستضاف ذاتياً
  11. 11تصليب التثبيت
  12. 12استكشاف الأخطاء — الأخطاء الشائعة
  13. 13استعادة السيطرة على ‏CI/CD الخاص بك

ما الذي تغيّر في تسعير ‏GitHub Actions

‏حتى مطلع عام 2026، كانت المستودعات الخاصة على ‏GitHub تستفيد من حصة شهرية من الدقائق المدرجة حسب الخطة المشتركة. تطوّر هذا النموذج: منذ 1 مارس 2026، خفّض ‏GitHub الحصص المدرجة وعمّم الفوترة بالدقيقة على ‏runners لينكس المستضافة على خطط دون ‏GitHub Team و‏GitHub Enterprise.

‏أما ‏runners المستضافة ذاتياً (‏self-hosted)، فلم تكن تُفوتَر من قِبل ‏GitHub قط — فهي تستهلك مواردك الخاصة. وهذا بالضبط ما تستغله ‏Gitea Actions و‏Forgejo Actions: باستضافة ‏forge الخاص بك على ‏VPS، تُشغّل ‏pipelines على ‏runner تتحكم فيه، دون عداد ‏GitHub.

‏الحجة لا تقتصر على التكلفة. بيانات مستودعاتك الخاصة لا تعود تمر عبر بنية ‏GitHub التحتية. تعمل ‏pipelines في بيئة الشبكة التي تختارها — مفيد إذا كان نشرك يستهدف شبكة خاصة أو ‏cluster داخلي. وتبقى ‏forge متاحة حتى في حالة انقطاع خارجي أو تغيير في السياسة.

لماذا تنقل ‏CI/CD إلى ‏forge مستضافة ذاتياً

  • ‏التكلفة المتغيرة تُلغى — يعمل ‏runner على ‏VPS الخاص بك؛ كل دقيقة ‏CI هي مورد مدفوع مسبقاً، لا سطر فوترة إضافي.
  • ‏سرية ‏pipelines — الكود المصدري وأسرار البيئة ونتائج البناء لا تغادر بنيتك التحتية.
  • ‏توافق ‏YAML — يتبع .gitea/workflows/ci.yml نفس صياغة .github/workflows/ci.yml؛ نقل ‏pipeline موجود لا يتطلب في أغلب الأحيان سوى نقل ملف.
  • ‏تحكم كامل في صور ‏runner — اختر إصدارات ‏PHP و‏Node و‏Python و‏Docker بدون الاعتماد على كتالوج ‏GitHub.
  • ‏‏forge خفيفة — يعمل ‏Gitea بـ 200 إلى 300 ميغابايت من الذاكرة العشوائية للمستودعات؛ يستهلك act_runner نحو 50 ميغابايت لكل مهمة؛ ‏VPS بجيغابايت واحد كافٍ لفريق صغير.
  • ‏استقلالية الخدمة — تستمر ‏pipelines في العمل بغض النظر عن توافر المنصة الأصلية أو سياستها التسعيرية.
  • ‏إدارة موحدة للوصول — الصلاحيات والفِرق و‏webhooks تعيش على نسختك الخاصة دون تفويض الوصول لطرف ثالث.
  • ‏نتائج البناء تحت سيطرتك — التنفيذات وصور ‏Docker وتقارير التغطية مخزّنة حيث تقرر.

المتطلبات المسبقة

‏قبل تثبيت ‏Gitea أو ‏Forgejo، تحقق من استيفاء ‏VPS الخاص بك للمتطلبات التالية.

‏الذاكرة العشوائية: 1 جيغابايت كحد أدنى لـ ‏forge صغيرة (حتى 5 مطورين، ‏pipelines بسيطة). خطط لـ 2 جيغابايت إذا فعّلت عدة ‏runners بالتوازي أو إذا كانت مهامك تبني صور ‏Docker.

‏المعالج: ‏vCPU واحد كافٍ لـ ‏forge ذاتها؛ مهام ‏CI تستهلك ما تخصصه لها عبر إعداد ‏runner.

‏التخزين: 20 جيغابايت للبدء — تنمو مستودعات ‏Git ونتائج ‏pipeline بسرعة حسب نشاطك.

‏المنفذ العام: المنفذ 22 (‏Git SSH) أو منفذ بديل، والمنفذ 443 (‏HTTPS). يُستخدم المنفذ 3000 داخلياً من قِبل ‏Gitea/‏Forgejo ولا يجب كشفه مباشرة.

‏اسم النطاق: يُنصح بشدة بنطاق فرعي مخصص (git.your-domain.com) — تعتمد ‏webhooks و‏SSH keys وعناوين ‏clone على اسم ثابت.

‏Docker: يُنشر ‏Gitea و‏Forgejo بسهولة عبر ‏Docker Compose، مما يبسط التحديثات وعزل العمليات.

‏Gitea Actions مقابل ‏Forgejo Actions مقابل ‏Woodpecker CI

مرّر الجدول أفقيًا

المعيار‏Gitea Actions‏Forgejo Actions‏Woodpecker CI
الأصل‏fork من ‏Gogs، ~47,000 نجمة على ‏GitHub، رخصة ‏MIT‏hard-fork من ‏Gitea منذ ديسمبر 2022، تديره ‏Codeberg، رخصة ‏AGPL-3.0‏CI خارجية، مفتوحة المصدر، تعمل مع ‏Gitea/‏Forgejo/‏GitHub
‏Runner‏act_runner (نفس الثنائي)‏act_runner (نفس الثنائي، نسخة ‏Forgejo)‏Woodpecker agent مخصص (‏woodpecker-agent)
صياغة ‏workflowمتوافق مع `.github/workflows/*.yml`متوافق مع `.github/workflows/*.yml`صياغة ‏YAML خاصة، غير متوافقة مع ‏GitHub Actions
جهد الهجرةنقل ملف ‏YAML إلى `.gitea/workflows/`نقل ملف ‏YAML إلى `.gitea/workflows/`إعادة كتابة ‏workflows بصياغة ‏Woodpecker
الحوكمةشركة تجارية (‏Gitea Ltd)مجموعة مساهمين مستقلين (‏Codeberg e.V.)مجتمع، بدون كيان تجاري
استهلاك ذاكرة ‏forge‏~200-300 ميغابايت للمستودعات‏~200-300 ميغابايت للمستودعاتيتطلب أيضاً ‏forge (‏Gitea/‏Forgejo) بالإضافة إليه
التحديثاتإصدارات متكررة، قناة مستقرة متاحةإصدارات متوافقة مع ‏Gitea + تصحيحات خاصةدورة إصدار مستقلة
حالة الاستخدام الرئيسية‏forge خفيفة مع ‏CI متكاملة، هجرة من ‏GitHub‏forge خفيفة، ‏CI متكاملة، تفضيل للحوكمة المستقلة‏CI مستقلة متقدمة، ‏pipelines متعددة المراحل المعقدة

‏الخيار الأول: Gitea مع act_runner

‏Gitea هو ‏fork من ‏Gogs يتلقى صيانة نشطة منذ عام 2016، ويبلغ حالياً نحو 47,000 نجمة على ‏GitHub تحت رخصة ‏MIT. يدمج منذ الإصدار 1.19 محرك ‏Actions متوافق مع صياغة ‏GitHub Actions، يُشغَّل بواسطة act_runner.

تثبيت ‏Gitea و‏runner

  1. إنشاء ملف ‏Docker Compose

    ‏أنشئ دليل عمل وملف docker-compose.yml:

    services:
      gitea:
        image: gitea/gitea:latest
        container_name: gitea
        environment:
          - USER_UID=1000
          - USER_GID=1000
          - GITEA__actions__ENABLED=true
        volumes:
          - ./gitea-data:/data
          - /etc/timezone:/etc/timezone:ro
          - /etc/localtime:/etc/localtime:ro
        ports:
          - "3000:3000"
          - "222:22"
        restart: unless-stopped

    ‏فعّل GITEA__actions__ENABLED=true منذ البداية — بدون هذا المتغير، لن تظهر علامة تبويب ‏Actions في الواجهة.

  2. تشغيل ‏Gitea وإكمال الإعداد الأولي

    ‏شغّل الحاوية ثم افتح http://<your-ip>:3000 في متصفح. يطلب منك معالج التثبيت نوع قاعدة البيانات (‏SQLite كافٍ لـ ‏forge صغيرة) واسم الخادم والرابط الخارجي. أدخل رابط ‏HTTPS الذي ستضبطه (https://git.your-domain.com) — يُكتب في الإعداد ويُستخدم كأساس لروابط ‏clone و‏webhooks.

    ‏أنشئ حساب المسؤول من هذا المعالج.

  3. ضبط ‏reverse proxy و‏TLS

    ‏ضع ‏Gitea خلف ‏nginx مع شهادة ‏Let's Encrypt. مثال على كتلة server:

    server {
        listen 443 ssl;
        server_name git.your-domain.com;
        ssl_certificate /etc/letsencrypt/live/git.your-domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/git.your-domain.com/privkey.pem;
        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

    ‏احصل على الشهادة باستخدام certbot certonly --nginx -d git.your-domain.com ثم أعد تحميل ‏nginx.

  4. إنشاء رمز ‏runner في ‏Gitea

    ‏سجّل الدخول إلى نسخة ‏Gitea الخاصة بك كمسؤول. انتقل إلى إدارة الموقع ← ‏Runners ← إنشاء ‏runner. انسخ الرمز المعروض — سيُستخدم في الخطوة التالية لتسجيل act_runner.

  5. نشر ‏act_runner

    ‏أضف خدمة act_runner إلى docker-compose.yml:

      act_runner:
        image: gitea/act_runner:latest
        container_name: act_runner
        environment:
          - GITEA_INSTANCE_URL=https://git.your-domain.com
          - GITEA_RUNNER_REGISTRATION_TOKEN=<your-token>
          - GITEA_RUNNER_NAME=vps-runner
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - ./runner-data:/data
        restart: unless-stopped
        depends_on:
          - gitea

    ‏أعد التشغيل باستخدام docker compose up -d. يظهر ‏runner في واجهة ‏Gitea ضمن إدارة الموقع ← Runners بحالة Idle.

  6. دفع ‏workflow اختباري

    ‏في أحد مستودعات ‏Gitea الخاصة بك، أنشئ الملف .gitea/workflows/ci.yml:

    name: CI
    on: [push]
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
          - name: Check
            run: echo "Pipeline active on Gitea Actions"

    ‏ادفع ‏commit. يظهر المهمة في علامة تبويب Actions بالمستودع وتنفّذ على ‏runner VPS الخاص بك.

‏الخيار الثاني: Forgejo مع act_runner

‏Forgejo هو ‏hard-fork من ‏Gitea انطلق في ديسمبر 2022 من مجتمع ‏Codeberg، موزّع تحت رخصة ‏AGPL-3.0. يشارك نفس صياغة ‏workflow ونفس ثنائي act_runner، مع حوكمة مجتمعية ودورة تصحيحات مستقلة. للفرق الحساسة لأسئلة الحوكمة أو الترخيص، ‏Forgejo هو البديل المباشر لـ ‏Gitea — تجربة المستخدم وتوافق ‏YAML متطابقان.

اختلافات التثبيت مقارنة بـ ‏Gitea

  1. استبدال صورة ‏Docker

    ‏في docker-compose.yml، استبدل صورة ‏Gitea بصورة ‏Forgejo الرسمية:

    services:
      forgejo:
        image: codeberg.org/forgejo/forgejo:latest
        container_name: forgejo
        environment:
          - USER_UID=1000
          - USER_GID=1000
          - FORGEJO__actions__ENABLED=true
        volumes:
          - ./forgejo-data:/data
        ports:
          - "3000:3000"
          - "222:22"
        restart: unless-stopped

    ‏يتغير بادئة متغير البيئة من GITEA__ إلى FORGEJO__ للإعدادات الخاصة بـ ‏Forgejo.

  2. استخدام ‏runner الخاص بـ ‏Forgejo

    ‏تحتفظ ‏Forgejo بنسختها الخاصة من act_runner. استخدم الصورة المنشورة على ‏registry الخاص بـ ‏Codeberg:

      act_runner:
        image: code.forgejo.org/forgejo/runner:latest
        container_name: forgejo_runner
        environment:
          - FORGEJO_INSTANCE_URL=https://git.your-domain.com
          - FORGEJO_RUNNER_REGISTRATION_TOKEN=<your-token>
          - FORGEJO_RUNNER_NAME=vps-runner
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - ./runner-data:/data
        restart: unless-stopped
  3. استرداد رمز ‏runner في ‏Forgejo

    ‏الإجراء مطابق لـ ‏Gitea: إدارة الموقع ← Runners ← إنشاء Runner. الرمز للاستخدام مرة واحدة — دوّنه قبل إغلاق الصفحة.

  4. ‏ضع workflows في `.gitea/workflows/`

    ‏تقرأ ‏Forgejo ملفات ‏workflow من نفس الدليل المستخدم في ‏Gitea: .gitea/workflows/. يعمل ‏workflow مكتوب لـ ‏GitHub Actions أو ‏Gitea Actions دون تعديل. قيد واحد: الإجراء actions/checkout@v4 وأقاربه يُحلّ عبر ذاكرة التخزين المؤقت للإجراءات في نسختك — يُنزّلها التشغيل الأول، وتُعاد استخدامها في التشغيلات التالية.

‏توافق YAML مع GitHub Actions

‏أبرز نقطة توافق كثيراً ما تُقلَّل من شأنها: .gitea/workflows/ci.yml و.github/workflows/ci.yml يتشاركان نفس القواعد النحوية. أحداث التشغيل (push, pull_request, schedule) والمهام والخطوات والمصفوفات وشروط if: تعمل بالطريقة ذاتها.

‏نموذج ‏workflow شائع على ‏GitHub:

name: Tests
on:
  push:
    branches: [main, dev]
  pull_request:

jobs:
  phpunit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.4'
      - run: composer install --no-interaction
      - run: vendor/bin/phpunit

‏هذا الملف، منقول إلى .gitea/workflows/ci.yml، يعمل كما هو على ‏Gitea Actions أو ‏Forgejo Actions. إجراءات ‏marketplace الخاصة بـ ‏GitHub (actions/checkout, shivammathur/setup-php, إلخ) تُنزّل من ‏GitHub في أول تشغيل وتُخزَّن محلياً في ذاكرة مؤقتة.

‏قيد معروف: بعض الإجراءات الخاصة أو المرتبطة بـ ‏GitHub (‏OIDC، ‏CodeQL، ‏Dependabot) لا يوجد لها مكافئ مباشر ويجب استبدالها ببدائل مفتوحة المصدر أو نصوص ‏shell.

المزايا المقارنة لـ ‏runner المستضاف ذاتياً

  • ‏تكلفة ثابتة وقابلة للتنبؤ — لا تدفع سوى ‏VPS، بغض النظر عن تكرار ‏pipelines.
  • ‏السرية — الكود المصدري ومتغيرات البيئة ونتائج البناء لا تمر عبر خدمة طرف ثالث.
  • ‏تخصيص ‏runner — ثبّت التبعيات النظامية والأدوات الخاصة بمكدسك أو صور ‏Docker الخاصة مباشرة على ‏runner.
  • ‏الوصول إلى الشبكة الداخلية — يمكن لمهمة الوصول إلى قاعدة بيانات تجريبية أو ‏registry Docker خاص على شبكتك دون كشف عام.
  • ‏نشر بدون عبور شبكي خارجي — ‏يعمل الـ‏runner في نفس مركز البيانات الذي يضم خادمك المستهدف؛ تُنسخ ملفات البناء محلياً دون المرور بخوادم GitHub.
  • ‏الأرشفة تحت سيطرتك — سجلات ‏pipeline ونتائجها تُحفظ طالما تقرر، دون حد تفرضه المنصة.

تصليب التثبيت

‏يكشف ‏runner المستضاف ذاتياً بنيتك التحتية إذا كان إعداده متساهلاً. ثلاث نقاط تحقق قبل وضع نسختك في الإنتاج.

‏أولاً: لا تكشف واجهة إدارة ‏Gitea/‏Forgejo على الإنترنت. ضعها خلف ‏reverse proxy مع تفعيل المصادقة الثنائية، وإن أمكن تقييد بالـ ‏IP أو ‏VPN للوصول الإداري.

‏ثانياً: رمز ‏runner للاستخدام مرة واحدة ويجب أن يظل سرياً. بمجرد تسجيل ‏runner، لم يعد للرمز قيمة — لكن إن سرّب قبل التسجيل، يمكن لطرف ثالث إنشاء ‏runner ضار على نسختك.

‏ثالثاً: عزل ‏runner في شبكة ‏Docker مخصصة، منفصلة عن ‏forge. يجب ألا تتمكن مهمة مخترقة من الوصول إلى حاوية ‏Gitea/‏Forgejo عبر شبكة ‏Docker الداخلية. أعلن شبكتين في docker-compose.yml ومنح ‏runner فقط الوصول للإنترنت وما تحتاجه ‏pipelines.

استكشاف الأخطاء — الأخطاء الشائعة

‏يبقى ‏runner بحالة 'Offline' بعد التشغيل. تحقق من أن GITEA_INSTANCE_URL (أو FORGEJO_INSTANCE_URL) يشير إلى رابط ‏HTTPS العام لـ ‏forge، لا إلى localhost أو ‏IP داخلي. يتصل ‏runner من خارج الحاوية.

‏علامة تبويب ‏Actions لا تظهر في الواجهة. يجب أن يكون المتغير GITEA__actions__ENABLED=true (أو FORGEJO__actions__ENABLED=true) موجوداً عند بدء تشغيل الحاوية. إعادة التشغيل البسيطة دون هذا المتغير لا تكفي — أوقف الحاوية، أضف المتغير، ثم أعد التشغيل باستخدام docker compose up -d.

‏الإجراء actions/checkout@v4 يفشل بخطأ في الاستبيان. تحاول ‏Gitea و‏Forgejo تنزيل الإجراءات من ‏GitHub في التشغيل الأول. إذا لم يستطع ‏VPS الوصول إلى github.com، فضّل ‏mirror محلي للإجراءات في قسم [actions] من app.ini باستخدام المفتاح DEFAULT_ACTIONS_URL.

‏المهمة تبدأ ثم تتوقف فوراً برمز 'exit code 137'. هذا إشارة ‏OOM (نفاد الذاكرة) من النواة. تحمّل صورة ‏runner (ubuntu-latest) عدة أدوات في الذاكرة. زد ‏RAM المتاحة على ‏VPS أو قلل التوازي (max_parallel_jobs في إعداد ‏runner) لتفادي تشغيل مهام متعددة في آنٍ واحد على مضيف غير كافٍ.

استعادة السيطرة على ‏CI/CD الخاص بك

‏يقدم ‏Gitea و‏Forgejo نفس مستوى التوافق مع ‏workflows الحالية لـ ‏GitHub Actions، مع ملامح حوكمة مختلفة — ‏MIT لـ ‏Gitea، و‏AGPL-3.0 ومجموعة مستقلة لـ ‏Forgejo. في كلتا الحالتين، يُثبَّت act_runner في دقائق على ‏VPS قياسي، وتُنقل ‏pipelines دون إعادة كتابة.

‏إذا كنت تستخدم بالفعل قالب ‏VPS الخاص بـ ‏Gitea على ‏ServOrbit، يمكن لـ ‏runner العمل على نفس النسخة أو ‏VPS مخصص حسب حمل ‏pipelines. الدليل التفصيلي لتثبيت ‏Gitea متاح في الخطوة التالية — يغطي خيارات التخزين وإعداد ‏SMTP والنسخ الاحتياطي التلقائي.

‏لنشر ‏Gitea على ‏VPS في دقائق، اطلع على دليلنا: استضافة ‏Gitea على ‏VPS.

‏انشر ‏forge Git الخاص بك على VPS

‏Gitea متاح كقالب ‏VPS على ‏ServOrbit. نسختك جاهزة للعمل في دقائق، مع ‏Docker و‏nginx وشهادة ‏TLS مُهيَّأة مسبقاً. أضف `act_runner` وستعمل ‏pipelines على بنيتك التحتية من الساعة الأولى.

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

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

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة