لماذا هذا السؤال ملحّ في 2026؟
نُشرت CVE-2026-59774 في الثاني من أغسطس 2026. تطال نسخ Gitea من 1.22.1 إلى 1.27.0 — درجة CVSS تبلغ 9.8 (حرجة). يتمثّل الناقل في توجيه #+INCLUDE ضمن محرّك عرض Org-mode، إذ يتيح لمهاجم غير مصادَق قراءة ملفات اعتباطية يصل إليها حساب خدمة Gitea، بما فيها app.ini والرموز الداخلية. ويُفضي كشف INTERNAL_TOKEN إلى حقن Git hook وتنفيذ تعليمات برمجية عن بُعد. الإصلاح متوفر في النسخة 1.27.1. إن كانت نسختك أقدم ولا تُعزَل عن الشبكة العامة، فالترقيع هو الخطوة الأولى. والثانية هي تحديد ما إذا كنت ستبقى على Gitea أم تُسرِّع هجرةً كنت تؤجّلها. أما Forgejo — الذي يُصدر تصحيحاته الأمنية باستقلالية عن Gitea Ltd. — فقد أصلح الثغرة نفسها في عرض Org-mode ضمن النسختين v16.0.2 وv15.0.6 المنشورتين في 30 يوليو 2026، أي قبل النشرة الأمنية لـ Gitea.
ما الذي تغيّر منذ 2024 وما أثره على هذا الاختيار
- Forgejo فرعٌ صارم منذ مطلع 2024 — انفصلت قاعدة الكود عن Gitea؛ لا يزال المشروعان يتشاركان معظم أساسياتهما، لكنّ مسارَي التطوير باتا يتباعدان بوضوح
- حوكمة مجتمعية في Forgejo — تُدار بواسطة جمعية غير ربحية دون اتفاقيات مساهمة مع شركة أم؛ إصلاحات الأمان تصدر باستقلالية
- Forgejo Actions في الإنتاج — صياغة قريبة من GitHub Actions مثل Gitea Actions (ينبّه Forgejo إلى أن سير عمل GitHub يحتاج غالبًا إلى تعديلات طفيفة)، تُنفَّذ عبر مشغّلات Docker؛ ويبقى Woodpecker CI بديلًا يتكامل مع Forgejo، فيما لا يوفّر Codeberg تشغيل Actions المستضاف إلا بشكل محدود
- Forgejo v16.0 في يوليو 2026 — تعليقات مراجعة متعددة الأسطر (تحديد نطاق الأسطر في الفرق، خيوط نقاش inline)، مصادقة JWT خارجية للـ API (تتيح لأنظمة خارجية المصادقة دون رمز دائم)، تصليب SSRF لميرورينغ Git (تُطبَّق قواعد
[migrations]في كل العمليات ولم يعد Git يتبع إعادة التوجيه)، تقليص استهلاك النطاق الترددي للصور الرمزية؛ فرع غير LTS لم يعد مدعومًا منذ 29 أكتوبر 2026، وتستمر ميزاته في Forgejo v17.0 (أكتوبر 2026) - Forgejo v15.0 في أبريل 2026 — سير عمل مُبسَّط لتسجيل المشغّل عبر الواجهة، رموز مقيّدة بالمستودع، الإصدار المئة من Forgejo
- GitLab CE شاملة لكن ثقيلة — تتضمّن النسخة المجتمعية CI/CD ومسجّل الحاويات وفحص الأمان والصفحات؛ الثمن: 8 جيجابايت كحد أدنى للذاكرة، و16 جيجابايت موصى به
- الترتيب الذي يتّضح في 2026: Forgejo للتثبيت الجديد، Gitea إن كنت تستخدمها بنسخة مُرقَّعة، GitLab CE إن احتجت إلى منصة DevOps متكاملة في تثبيت واحد
المتطلبات الأساسية حسب خيارك
كتب Forgejo وGitea بلغة Go ويُشحَنان كملف ثنائي واحد ثابت. تعمل نسخة متواضعة (حتى عشرين مستودعاً، بضعة مشغّلات CI) بشكل مريح على 1 نواة و1 جيجابايت من الذاكرة؛ أما نسخة الفريق (مشغّلات CI نشطة، LFS، سجل الحزم) فتفضّل نواتين و2 إلى 4 جيجابايت. GitLab CE في مستوى آخر تمامًا: تحدّد وثائقه الحد الأدنى بـ 8 جيجابايت من الذاكرة وتوصي بـ 16 جيجابايت، مع تشغيل Postgres وRedis وGitaly وSidekiq في آنٍ واحد. وتنصّ على 8 أنوية افتراضية و40 جيجابايت على الأقل من تخزين SSD للتطبيق، تُضاف إليها مساحة مستودعاتك. للأدوات الثلاثة، ستحتاج إلى نطاق يشير إلى VPS الخاص بك، والمنافذ 22 (SSH Git) و80 و443 مفتوحة، وبروكسي عكسي (Nginx أو Caddy) لـHTTPS.
Forgejo مقابل Gitea مقابل GitLab CE — جدول مقارنة 2026
مرّر الجدول أفقيًا
| المعيار | Forgejo / Gitea | GitLab CE |
|---|---|---|
| الحد الأدنى للذاكرة | لا حد أدنى رسميًا (1 جيجابايت لفريق صغير) | 8 جيجابايت (16 جيجابايت موصى به) |
| صيغة التوزيع | ملف ثنائي واحد أو صورة Docker | Omnibus (متعدد العمليات) أو Helm chart |
| CI/CD الأصلية | Forgejo Actions / Gitea Actions (صياغة GitHub Actions) | GitLab CI/CD المدمجة، مشغّلات مشتركة أو مخصصة |
| الحوكمة | Forgejo: جمعية غير ربحية (Codeberg) · Gitea: Gitea Ltd. | GitLab Inc. (مفتوح المصدر الجوهري، CE مجاني) |
| سجل الحاويات | نعم (حزم + سجل حاويات) | نعم، أكثر اكتمالاً |
| الفيدرالية / ActivityPub | Forgejo: تجريبية، معطّلة افتراضيًا · Gitea: غير مخطط لها | لا |
| إصلاحات الأمان المستقلة | Forgejo: نعم (ثغرة Org-mode أُصلحت في v16.0.2، يوليو 2026) · Gitea: عبر Gitea Ltd. | عبر GitLab Inc. |
| مستجدات v16 (يوليو 2026) | Forgejo: مراجعات متعددة الأسطر، JWT خارجي، تعزيز حماية SSRF · Gitea: تصحيح 1.27.1 فقط | غير ذات صلة |
| الهجرة من Gitea | Forgejo: نقل مباشر لقاعدة البيانات حتى Gitea 1.22، وبعدها هجرة كل مستودع على حدة · GitLab: أداة استيراد Gitea | استيراد جزئي (مستودعات، إشكاليات، طلبات دمج) |
| مثالي لـ | فرق من 1 إلى 50 مطوراً، VPS متواضع، CI خفيفة | مؤسسة تريد كل شيء في تثبيت واحد، ميزانية بنية تحتية متاحة |
الهجرة من Gitea إلى Forgejo: ما هي فعلاً؟
كثيراً ما تُوصف الهجرة من Gitea إلى Forgejo بأنها «أمر واحد» — وهذا صحيح في الحالة البسيطة. لكن ذلك يصحّ حتى Gitea 1.22 فقط: يوضّح Forgejo أن Gitea 1.22 هي آخر نسخة يمكن نقلها بشفافية. منذ Gitea 1.23 تباعدت مخططات قواعد البيانات، والطريق الرسمي هو هجرة المستودعات واحدًا تلو الآخر بأداة الهجرة المدمجة في Forgejo. بالنسبة إلى نسخة 1.22.x أو أقدم، تتلخّص العملية في إيقاف حاوية Gitea، وتوجيه نفس وحدة تخزين البيانات إلى حاوية Forgejo، ثم التشغيل. يكتشف Forgejo المخطط الموجود ويُطبّق ترحيلاته الخاصة. بضعة نقاط للتحقق قبل البدء: احتفظ بنسخة احتياطية من app.ini وقاعدة البيانات، لاحظ نسخة Gitea الحالية (يمرّ النقل أولًا عبر Forgejo v10.0 ثم إلى نسخة أحدث)، وراجع سير عمل CI الخاص بك (صياغتا Forgejo Actions وGitea Actions متقاربتان، فاختبرهما على مستودع قبل التحويل). الهجرة في الاتجاه الآخر — نحو GitLab CE — أطول: يوفر GitLab أداة استيراد من Gitea (مستودعات، إشكاليات، طلبات دمج، معالم، تسميات)، لكن يجب إعادة كتابة خطوط أنابيب CI بصياغة GitLab CI.
نشر Forgejo على VPS باستخدام Docker وNginx
تجهيز خادم VPS
حدّث النظام وثبّت Docker وDocker Compose:
apt update && apt install -y docker.io docker-compose-plugin. افتح المنافذ الضرورية:ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw allow 2222/tcp(2222 لـ SSH Git إذا كنت لا تريد كشف منفذ 22 للنظام). تنبيه: المنافذ التي ينشرها Docker تتجاوز قواعد ufw، فلا تنشر إلا ما يلزم (الخطوة التالية).إنشاء المجلدات وملف Compose
أنشئ مجلدًا مخصصًا:
mkdir -p /opt/forgejo && cd /opt/forgejo. ثم أنشئ ملفcompose.ymlيتضمن خدمةforgejoتشير إلى الصورةcodeberg.org/forgejo/forgejo:17(وسم الإصدار الرئيسي كما في التوثيق الرسمي)، مع وحدة تخزين دائمة لـ/data، والمنافذ127.0.0.1:3000:3000(HTTP، لا يصل إليه إلا Nginx) و2222:22(SSH)، ومتغيرات بيئة أساسية (FORGEJO__server__DOMAIN=git.your-domain.com،FORGEJO__server__SSH_PORT=2222).تشغيل Forgejo
شغّل الخدمة:
docker compose up -d. تحقق من تشغيل الحاوية بـdocker compose ps، وراجع السجلات بـdocker compose logs -f forgejo. المنفذ 3000 لا يستمع إلا على الجهاز نفسه: تحقق بـcurl -I http://127.0.0.1:3000، ولا تُكمل معالج التثبيت إلا بعد تفعيل HTTPS (الخطوة 6)، كي لا يُكمله أحد قبلك.ضبط Nginx كوكيل عكسي HTTPS
ثبّت Nginx وCertbot:
apt install -y nginx python3-certbot-nginx. أنشئ مضيفًا افتراضيًا لـgit.your-domain.comيُوجّه الطلبات إلىhttp://localhost:3000مع الترويسات القياسية (proxy_set_header Host $host،proxy_set_header X-Real-IP $remote_addr،proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for،proxy_set_header X-Forwarded-Proto $scheme).الحصول على شهادة TLS
نفّذ
certbot --nginx -d git.your-domain.com. يقوم Certbot بضبط إعادة التوجيه HTTP→HTTPS وجدولة التجديد التلقائي. تحقق بـcurl -I https://git.your-domain.comمن أن رمز الاستجابة هو200.إتمام التثبيت عبر الواجهة الويب
افتح
https://git.your-domain.comفي متصفحك. يطلب معالج التثبيت نوع قاعدة البيانات (SQLite للبداية، PostgreSQL للإنتاج)، ورابط النسخة، وإعدادات SSH. أنشئ حساب المسؤول، ثم أوقف التسجيل العام إذا كانت النسخة خاصة (FORGEJO__service__DISABLE_REGISTRATION=trueفيcompose.yml).تفعيل عامل CI (اختياري)
قدّمت Forgejo v15.0 (أبريل 2026) سير عمل مبسّطًا لتسجيل العامل عبر الواجهة الويب. انتقل إلى إدارة الموقع ← Actions ← Runners، انقر إنشاء عامل وانسخ أمر التسجيل. شغّل العامل في حاوية ثانية إلى جانب خدمة
docker:dindتُنفّذ المهام، كما في مثال Compose في التوثيق الرسمي (الصورةdata.forgejo.org/forgejo/runner:13، والأمرforgejo-runner daemon --config runner-config.yml). تجنّب تركيب/var/run/docker.sock: سيحصل سير العمل على ما يعادل صلاحية root على الخادم.التحقق من الأمان الأساسي (تحديث v16)
شدّد Forgejo v16.0 حماية SSRF لنسخ Git المرآتية: أصبحت إعدادات
[migrations](ALLOWED_DOMAINSوBLOCKED_DOMAINSوALLOW_LOCALNETWORKS) تُطبَّق على كل عمليات الهجرة والنسخ المرآتي، ولم يعد Git يتبع إعادة توجيه HTTP. يبقىFORGEJO__migrations__ALLOW_LOCALNETWORKSمعطَّلًا افتراضيًا: إذا احتجت إلى عكس مستودعات داخلية على الشبكة المحلية، فأعلنها فيFORGEJO__migrations__ALLOWED_DOMAINSبدل فتح الشبكة المحلية كلها، وقيّم الأثر. اتركFORGEJO__server__LOCAL_ROOT_URLعلى قيمته الافتراضية (العنوان المحلي الذي تبلغ به العمليات الداخلية خدمة الويب)، إلا إذا كان SSH يعمل على جهاز آخر. للنسخ المُهاجَرة من Gitea المتأثرة بـ CVE-2026-59774: أعِد توليدINTERNAL_TOKEN(forgejo generate secret INTERNAL_TOKEN)، ثم أعِد توليد رموز الوصول الشخصية للمستخدمين. لا تستبدلSECRET_KEYباستخفاف: فهو يشفّر أسرار 2FA من بين أمور أخرى، ولن يتمكن المفتاح الجديد من فكّ تشفيرها.
لمنصة Gitea متأثرة بـ CVE-2026-59774 (النسخ من 1.22.1 إلى 1.27.0): الترقية إلى Gitea 1.27.1 أو نسخة لاحقة تُصلح الثغرة، وهي أول ما يجب فعله. ولا تكون الهجرة إلى Forgejo اختصارًا إلا انطلاقًا من Gitea 1.22.x، آخر نسخة ينقل Forgejo قاعدة بياناتها؛ أما منذ Gitea 1.23 فرقّع Gitea أولًا، ثم هاجر مستودعًا تلو الآخر إن اخترت Forgejo. بالهجرة إلى Forgejo v16.0+، تستفيد أيضًا من تصليب SSRF للنسخ المرآتي، وتعليقات المراجعة متعددة الأسطر، والمصادقة JWT الخارجية — ميزات غير متاحة في Gitea 1.27.1. في جميع الحالات، بعد أي تعرّض مشتبه به، أعِد توليد INTERNAL_TOKEN، ودوِّر رموز الوصول الشخصية لمستخدميك وأسرار OAuth، ولا تغيّر SECRET_KEY إلا وأنت تعلم أن أسرار 2FA المشفّرة بالمفتاح القديم ستصبح غير مقروءة.
استكشاف الأخطاء: أخطاء التثبيت الشائعة
تغطي الأخطاء أدناه الحالات الأكثر شيوعاً عند النشر الأول أو الهجرة.
الأخطاء الشائعة وحلولها
-
level=fatal msg="Failed to initialize ORM engine" error="Error 1071: Specified key was too long"(MySQL/MariaDB) — تجميع قاعدة البيانات ليس utf8mb4: أنشئ قاعدة البيانات بـCHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ثم أعد التشغيل -
Failed to initialize SSH: ssh: no key found— مفتاح مضيف SSH فارغ أو غير مقروء: تحقق من أن وحدة التخزين/dataمُركَّبة وأنها مملوكة لـ UID/GID المعلنين في Compose (1000:1000 افتراضيًا)، ثم احذف ملف المفتاح الفارغ وأعِد تشغيل الحاوية ليُعاد إنشاؤه؛ أماforgejo admin regenerate keysفلا يعيد توليد سوى ملفauthorized_keys -
x509: certificate signed by unknown authority على خطافات الويب الصادرة — نسختك تستدعي خدمة داخلية بشهادة موقّعة ذاتياً؛ أضف FORGEJO__webhook__SKIP_TLS_VERIFY=true في بيئة التطوير فقط، أو ركِّب شهادة CA في الحاوية عبر SSL_CERT_FILE -
Error response from daemon: conflict: unable to delete image عند التحديث — أوقف الحاوية أولاً (docker compose down)، احذف الصورة (docker image rm codeberg.org/forgejo/forgejo)، ثم أعد السحب (docker compose pull) قبل إعادة التشغيل - مشغّلات CI عالقة على
waiting for available runner بعد التسجيل — تحقق من أن المشغّل يستطيع الوصول إلى نسخة Forgejo:curl -s https://git.your-domain.com/api/v1/version من حاوية المشغّل يجب أن يُعيد JSON يحتوي النسخة؛ إن لم يُحَل اسم النطاق من الحاوية، أضف إدخال extra_hosts في Compose أو استخدم عنوان IP لـVPS - رفض ميرورينغ المستودع بعد الهجرة إلى v16 — يطبّق Forgejo v16.0 إعدادات
[migrations]بصرامة، معFORGEJO__migrations__ALLOW_LOCALNETWORKS=falseافتراضيًا: قد يُرفض ميرور نحو عنوان في الشبكة المحلية أو يمرّ عبر إعادة توجيه HTTP؛ إن كان ميرورك يستهدف GitLab أو Gitea داخليًا، فأعلن نطاقه فيFORGEJO__migrations__ALLOWED_DOMAINSبدل فتح الشبكة المحلية كلها
أيّ أداة تختار حسب وضعك؟
للتثبيت الجديد في 2026: Forgejo هو الخيار الافتراضي الذي نوصي به. تجمع الحوكمة المجتمعية، وإصلاحات الأمان المستقلة عن Gitea Ltd. (كما يتجلّى في ثغرة Org-mode ضمن CVE-2026-59774، التي أصلحها Forgejo منذ 30 يوليو 2026)، والتوافق مع الأدوات الموجودة (مشغّلات، خطافات ويب، رموز)، ونفس بصمة الذاكرة كـGitea — كل هذه العوامل لصالح Forgejo دون مقايضات تُذكر لمشروع جديد. مع Forgejo v16.0، تسدّ تعليقات المراجعة متعددة الأسطر والمصادقة JWT الخارجية فجوتين وظيفيتين كانتا أحياناً تُبرّران اختيار GitLab CE. إن كنت تشغّل نسخة Gitea محدّثة (1.27.1+) وتلبّي احتياجاتك، فالهجرة ليست ملحّة — لكن في المرة القادمة التي تفكر فيها بتحديث رئيسي، قيِّم Forgejo في تلك اللحظة، علمًا أن الانتقال منذ Gitea 1.23 يتم مستودعًا تلو الآخر. يُفرض GitLab CE عندما يحتاج فريقك إلى سلسلة DevOps بأكملها في تثبيت واحد — فحص الأمان، الصفحات، بيئات النشر، سجل الحاويات — وتملك البنية التحتية لتشغيله بشكل مريح. على VPS متواضع، إنه ليس الأداة المناسبة.