لماذا هذا السؤال ملحّ في 2026؟
نُشرت CVE-2026-59774 في الرابع من أغسطس 2026. تطال نسخ Gitea من 1.22.1 إلى 1.27.0 — درجة CVSS تبلغ 9.9 (حرجة). يتمثّل الناقل في توجيه #+INCLUDE ضمن محرّك عرض Org-mode، إذ يتيح لمهاجم غير مصادَق قراءة ملفات اعتباطية يصل إليها حساب خدمة Gitea، بما فيها app.ini والرموز الداخلية. ويُفضي كشف INTERNAL_TOKEN إلى حقن Git hook وتنفيذ تعليمات برمجية عن بُعد. الإصلاح متوفر في النسخة 1.27.1. إن كانت نسختك أقدم ولا تُعزَل عن الشبكة العامة، فالترقيع هو الخطوة الأولى. والثانية هي تحديد ما إذا كنت ستبقى على Gitea أم تُسرِّع هجرةً كنت تؤجّلها. نشر Forgejo — الذي يُصدر تصحيحاته الأمنية باستقلالية عن Gitea Ltd. — تصحيحه الخاص في اليوم ذاته عبر فرعه الأمني.
ما الذي تغيّر منذ 2024 وما أثره على هذا الاختيار
- Forgejo فرعٌ صارم منذ مطلع 2024 — انفصلت قاعدة الكود عن Gitea؛ لا يزال المشروعان يتشاركان معظم أساسياتهما، لكنّ مسارَي التطوير باتا يتباعدان بوضوح
- حوكمة مجتمعية في Forgejo — تُدار بواسطة جمعية غير ربحية دون اتفاقيات مساهمة مع شركة أم؛ إصلاحات الأمان تصدر باستقلالية
- Forgejo Actions في الإنتاج — نفس صياغة Gitea Actions (متوافقة مع GitHub Actions)، تدعم Woodpecker CI ومشغّلات Docker، منشورة في Codeberg منذ 2024
- Forgejo v16.0 في يوليو 2026 — تعليقات مراجعة متعددة الأسطر (تحديد نطاق الأسطر في الفرق، خيوط نقاش inline)، مصادقة JWT خارجية للـ API (تتيح تكامل SSO دون رمز دائم)، تصليب SSRF مفعّل افتراضياً لميرورينغ Git، تقليص استهلاك النطاق الترددي للصور الرمزية
- Forgejo v15.0 في أبريل 2026 — سير عمل مُبسَّط لتسجيل المشغّل عبر الواجهة، رموز مقيّدة بالمستودع، الإصدار المئة من Forgejo
- GitLab CE شاملة لكن ثقيلة — تتضمّن النسخة المجتمعية CI/CD ومسجّل الحاويات وفحص الأمان والصفحات؛ الثمن: 4 جيجابايت كحد أدنى للذاكرة، 8 جيجابايت موصى به
- خمسة مقارنات مستقلة نُشرت في 2026 تتقارب نحو الترتيب ذاته: Forgejo للتثبيت الجديد، Gitea إن كنت تستخدمها بنسخة مُرقَّعة، GitLab CE إن احتجت إلى منصة DevOps متكاملة في تثبيت واحد
المتطلبات الأساسية حسب خيارك
كتب Forgejo وGitea بلغة Go ويُشحَنان كملف ثنائي واحد ثابت. تعمل نسخة متواضعة (حتى عشرين مستودعاً، بضعة مشغّلات CI) بشكل مريح على 1 نواة و1 جيجابايت من الذاكرة؛ أما نسخة الفريق (مشغّلات CI نشطة، LFS، سجل الحزم) فتفضّل نواتين و2 إلى 4 جيجابايت. GitLab CE في مستوى آخر تماماً: 4 جيجابايت هو الحد الأدنى المطلق للتشغيل، و8 جيجابايت للاستخدام المريح، مع تشغيل Postgres وRedis وGitaly وSidekiq في آنٍ واحد. خطّط لأربعة أنوية على الأقل و50 جيجابايت من تخزين SSD. للأدوات الثلاثة، ستحتاج إلى نطاق يشير إلى VPS الخاص بك، والمنافذ 22 (SSH Git) و80 و443 مفتوحة، وبروكسي عكسي (Nginx أو Caddy) لـHTTPS.
Forgejo مقابل Gitea مقابل GitLab CE — جدول مقارنة 2026
مرّر الجدول أفقيًا
| المعيار | Forgejo / Gitea | GitLab CE |
|---|---|---|
| الحد الأدنى للذاكرة | 512 ميجابايت – 1 جيجابايت | 4 جيجابايت (8 جيجابايت موصى به) |
| صيغة التوزيع | ملف ثنائي واحد أو صورة 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: نعم (CVE-2026-59774 في اليوم صفر) · Gitea: عبر Gitea Ltd. | عبر GitLab Inc. |
| مستجدات v16 (يوليو 2026) | Forgejo: مراجعات متعددة الأسطر، JWT خارجي، SSRF افتراضياً · Gitea: تصحيح 1.27.1 فقط | غير ذات صلة |
| الهجرة من Gitea | Forgejo: نفس مخطط قاعدة البيانات، أمر واحد · GitLab: أداة استيراد API أو migrator | استيراد جزئي (مستودعات، إشكاليات، طلبات دمج) |
| مثالي لـ | فرق من 1 إلى 50 مطوراً، VPS متواضع، CI خفيفة | مؤسسة تريد كل شيء في تثبيت واحد، ميزانية بنية تحتية متاحة |
الهجرة من Gitea إلى Forgejo: ما هي فعلاً؟
كثيراً ما تُوصف الهجرة من Gitea إلى Forgejo بأنها «أمر واحد» — وهذا صحيح في الحالة البسيطة. تشترك الأداتان في نفس مخطط قاعدة البيانات منذ البداية، ويحافظ Forgejo على التوافق مع الإصدارات السابقة. تتلخّص العملية في إيقاف حاوية Gitea، وتوجيه نفس وحدة تخزين البيانات إلى حاوية Forgejo، ثم التشغيل. يكتشف Forgejo المخطط الموجود ويُطبّق ترحيلاته الخاصة. بضعة نقاط للتحقق قبل البدء: احتفظ بنسخة احتياطية من app.ini وقاعدة البيانات، لاحظ نسخة Gitea الحالية (الهجرة مختبرة من النسخ الحديثة — قد تحتاج نسخة قديمة جداً إلى تحديث وسيط)، وتحقق من أن مشغّلات CI الخاصة بك تستخدم الصياغة ذاتها (Forgejo Actions وGitea Actions متوافقتان). الهجرة في الاتجاه الآخر — نحو GitLab CE — أطول: يوفر GitLab أداة استيراد عبر API (مستودعات، إشكاليات، طلبات دمج، تسميات)، لكن يجب إعادة كتابة خطوط أنابيب 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 للنظام).إنشاء المجلدات وملف Compose
أنشئ مجلدًا مخصصًا:
mkdir -p /opt/forgejo && cd /opt/forgejo. ثم أنشئ ملفcompose.ymlيتضمن خدمةforgejoتشير إلى الصورةcodeberg.org/forgejo/forgejo:latest، مع وحدة تخزين دائمة لـ/data، والمنافذ3000:3000(HTTP) و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. تتوفر واجهة التثبيت علىhttp://<ip-du-vps>:3000.ضبط 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 run -d --name forgejo-runner -v /var/run/docker.sock:/var/run/docker.sock codeberg.org/forgejo/runner:latest daemon --config config.yml.التحقق من الأمان الأساسي (تحديث v16)
منذ Forgejo v16.0، يكون تصلّب SSRF نشطًا بشكل افتراضي لنسخ Git المرآتية —
FORGEJO__migrations__ALLOW_LOCALNETWORKSمعطَّل افتراضيًا. إذا احتجت إلى عكس مستودعات داخلية، فعّله صراحةً وقيّم الأثر. تحقق أيضًا من أنFORGEJO__server__LOCAL_ROOT_URLلا يشير إلى عنوان IP داخلي مكشوف. للنسخ المُهاجَرة من Gitea المتأثرة بـ CVE-2026-59774: أبطِلINTERNAL_TOKENوSECRET_KEYفيapp.ini، ثم أعِد توليد رموز الوصول الشخصية للمستخدمين.
لمنصة Gitea متأثرة بـCVE-2026-59774 (النسخ من 1.22.1 إلى 1.27.0): الهجرة إلى Forgejo والترقية إلى Gitea 1.27.1 كلاهما يُصلّحان الثغرة. إن اخترت البقاء على Gitea، طبّق التصحيح فوراً. إن كنت تفكر في Forgejo منذ فترة، فالهجرة تحلّ المشكلتين في عملية واحدة. بالهجرة إلى Forgejo v16.0+، تستفيد أيضاً من تصليب SSRF افتراضياً، وتعليقات المراجعة متعددة الأسطر، والمصادقة JWT الخارجية — ميزات غير متاحة في Gitea 1.27.1. في جميع الحالات، أبطل صلاحية INTERNAL_TOKEN وSECRET_KEY في app.ini بعد أي تعرّض مشتبه به، ودوِّر رموز الوصول الشخصية لمستخدميك.
استكشاف الأخطاء: أخطاء التثبيت الشائعة
تغطي الأخطاء أدناه الحالات الأكثر شيوعاً عند النشر الأول أو الهجرة.
الأخطاء الشائعة وحلولها
-
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— يبحث Forgejo عن مفاتيح SSH في /data/gitea/.ssh؛ إن لم تكن وحدة التخزين مُركَّبة أو كانت الأذونات غير صحيحة، شغِّل docker compose exec forgejo forgejo admin regenerate 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 افتراضياً الميرورينغ نحو عناوين الشبكة المحلية (
FORGEJO__migrations__ALLOW_LOCALNETWORKS=false)؛ إن كان ميرورك يستهدف GitLab أو Gitea داخلياً، فعِّل الخيار صراحةً وقيِّده بقائمة بيضاء من IP
أيّ أداة تختار حسب وضعك؟
للتثبيت الجديد في 2026: Forgejo هو الخيار الافتراضي في جميع المقارنات المستقلة تقريباً المنشورة هذا العام. تجمع الحوكمة المجتمعية، وإصلاحات الأمان المستقلة عن Gitea Ltd. (كما يتجلّى في الاستجابة لـCVE-2026-59774 في يوم النشر)، والتوافق مع الأدوات الموجودة (مشغّلات، خطافات ويب، رموز)، ونفس بصمة الذاكرة كـGitea — كل هذه العوامل لصالح Forgejo دون مقايضات تُذكر لمشروع جديد. مع Forgejo v16.0، تسدّ تعليقات المراجعة متعددة الأسطر والمصادقة JWT الخارجية فجوتين وظيفيتين كانتا أحياناً تُبرّران اختيار GitLab CE. إن كنت تشغّل نسخة Gitea محدّثة (1.27.1+) وتلبّي احتياجاتك، فالهجرة ليست ملحّة — لكن في المرة القادمة التي تفكر فيها بتحديث رئيسي، قيِّم Forgejo في تلك اللحظة. يُفرض GitLab CE عندما يحتاج فريقك إلى سلسلة DevOps بأكملها في تثبيت واحد — فحص الأمان، الصفحات، بيئات النشر، مقاييس DORA — وتملك البنية التحتية لتشغيله بشكل مريح. على VPS متواضع، إنه ليس الأداة المناسبة.