ما الذي تغيّر في تسعير 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
إنشاء ملف 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 في الواجهة.
تشغيل Gitea وإكمال الإعداد الأولي
شغّل الحاوية ثم افتح http://<your-ip>:3000 في متصفح. يطلب منك معالج التثبيت نوع قاعدة البيانات (SQLite كافٍ لـ forge صغيرة) واسم الخادم والرابط الخارجي. أدخل رابط HTTPS الذي ستضبطه (https://git.your-domain.com) — يُكتب في الإعداد ويُستخدم كأساس لروابط clone وwebhooks.
أنشئ حساب المسؤول من هذا المعالج.
ضبط 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.
إنشاء رمز runner في Gitea
سجّل الدخول إلى نسخة Gitea الخاصة بك كمسؤول. انتقل إلى إدارة الموقع ← Runners ← إنشاء runner. انسخ الرمز المعروض — سيُستخدم في الخطوة التالية لتسجيل act_runner.
نشر 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.
دفع 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
استبدال صورة 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.
استخدام 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استرداد رمز runner في Forgejo
الإجراء مطابق لـ Gitea: إدارة الموقع ← Runners ← إنشاء Runner. الرمز للاستخدام مرة واحدة — دوّنه قبل إغلاق الصفحة.
ضع 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.