دليل النشر

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

انشر على VPS Cloud →

الأتمتة11 دقيقة قراءة

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

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

ما الذي تغيّر في تسعير ‏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

01

إنشاء ملف ‏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 في الواجهة.

02

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

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

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

03

ضبط ‏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.

04

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

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

05

نشر ‏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.

06

دفع ‏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

01

استبدال صورة ‏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.

02

استخدام ‏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
03

استرداد رمز ‏runner في ‏Forgejo

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

04

‏ضع 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 أو بريد إلكتروني. الدعم بـ العربية والفرنسية والإنجليزية.