لماذا هذا السؤال ملحّ في 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 أم تُسرِّع هجرةً كنت تؤجّلها.
ما الذي تغيّر منذ 2024 وما أثره على هذا الاختيار
- Forgejo فرعٌ صارم منذ مطلع 2024 — انفصلت قاعدة الكود عن Gitea؛ لا يزال المشروعان يتشاركان معظم أساسياتهما، لكنّ مسارَي التطوير باتا يتباعدان بوضوح
- حوكمة مجتمعية في Forgejo — تُدار بواسطة جمعية غير ربحية دون اتفاقيات مساهمة مع شركة أم؛ إصلاحات الأمان تصدر باستقلالية
- Forgejo Actions في الإنتاج — نفس صياغة Gitea Actions (متوافقة مع GitHub Actions)، تدعم Woodpecker CI ومشغّلات Docker، منشورة في Codeberg منذ 2024
- Forgejo v16.0 في يوليو 2026 — تعليقات مراجعة متعددة الأسطر، مصادقة JWT خارجية للـ API، تصليب SSRF، تقليص استهلاك النطاق الترددي للصور الرمزية
- GitLab CE شاملة لكن ثقيلة — تتضمّن النسخة المجتمعية CI/CD ومسجّل الحاويات وفحص الأمان والصفحات؛ الثمن: 4 جيجابايت كحد أدنى للذاكرة، 8 جيجابايت موصى به
- خمسة مقارنات مستقلة نُشرت في 2026 تتقارب نحو الترتيب ذاته: Forgejo للتثبيت الجديد، Gitea إن كنت تستخدمها بنسخة مُرقَّعة، GitLab CE إن احتجت إلى منصة DevOps متكاملة في تثبيت واحد
المتطلبات الأساسية حسب خيارك
مكتوبان بلغة Go ويُشحنان كملف ثنائي منفرد. تعمل نسخة متواضعة (حتى عشرين مستودعاً ومشغّلات CI قليلة) بسهولة على 1 vCPU و1 GB من الذاكرة؛ أما نسخة الفريق (مشغّلات CI نشطة، LFS، سجلّ الحزم) فتفضّل 2 vCPU و2 إلى 4 GB. GitLab CE في فئة مختلفة: 4 GB حدٌّ أدنى مطلق للبدء، 8 GB للاستخدام المريح، مع تشغيل Postgres وRedis وGitaly وSidekiq في الوقت ذاته. خصّص على الأقل 4 vCPU و50 GB من التخزين SSD. للأدوات الثلاثة تحتاج نطاقاً مُوجَّهاً إلى IP الخادم، مع فتح المنافذ 22 (SSH Git) و80 و443، وخادم وكيل عكسي (Nginx أو Caddy) للـ HTTPS.
Forgejo مقابل Gitea مقابل GitLab CE — جدول المقارنة 2026
| المعيار | Forgejo / Gitea | GitLab CE |
|---|---|---|
| الحد الأدنى للذاكرة | 512 MB – 1 GB | 4 GB (8 GB موصى به) |
| صيغة التوزيع | ملف ثنائي منفرد أو صورة Docker | Omnibus (متعدد العمليات) أو Helm chart |
| CI/CD الأصلي | Forgejo Actions / Gitea Actions (صياغة GitHub Actions) | GitLab CI/CD، مشغّلات مشتركة أو مخصصة |
| الحوكمة | Forgejo: جمعية غير ربحية (Codeberg) · Gitea: Gitea Ltd. | GitLab Inc. (open-core، CE مجاني) |
| سجلّ الحاويات | نعم (حزم + container registry) | نعم، أكثر اكتمالاً |
| الاتحاد / ActivityPub | Forgejo: beta اختياري · Gitea: غير مُخطَّط | لا |
| الهجرة من Gitea | Forgejo: نفس مخطط قاعدة البيانات، أمر واحد · GitLab: أداة استيراد عبر API | استيراد جزئي (مستودعات، issues، PRs) |
| الأنسب لـ | فِرق من 1 إلى 50 مطوراً، VPS متواضع، CI خفيفة | مؤسسة تريد كل شيء في تثبيت واحد، ميزانية بنية تحتية متاحة |
الهجرة من Gitea إلى Forgejo: ما يعنيه ذلك فعلاً
كثيراً ما توصف هجرة Gitea → Forgejo بأنها «أمر واحد» — وهذا صحيح في الحالة البسيطة. كلا المشروعين تشاركا مخطط قاعدة البيانات ذاته منذ البداية، ويحافظ Forgejo على التوافق العكسي. تتلخّص العملية في إيقاف حاوية Gitea، وتوجيه حجم البيانات ذاته نحو حاوية Forgejo، ثم التشغيل. يكتشف Forgejo المخطط الموجود ويطبّق هجراته الخاصة. بعض ما يجب التحقق منه أولاً: نسِّخ احتياطياً ملف app.ini وقاعدة البيانات، لاحظ نسخة Gitea الحالية (الهجرة مُختبَرة من النسخ الحديثة — قد تتطلّب نسخة قديمة جداً تحديثاً وسيطاً)، وتأكّد من أن مشغّلات CI تستخدم الصياغة ذاتها (Forgejo Actions وGitea Actions متوافقتان). الهجرة في الاتجاه المعاكس — نحو GitLab CE — أطول: تتيح GitLab أداة استيراد عبر API (المستودعات، issues، merge requests، labels)، لكن خطوط أنابيب 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-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.
التحقق من الأمان الأساسي
تأكّد من أن FORGEJO__server__LOCAL_ROOT_URL لا يشير إلى IP داخلي مكشوف (ناقل SSRF). منذ Forgejo v16.0، تصليب SSRF مفعَّل افتراضياً لمزامنة Git — راجع FORGEJO__migrations__ALLOW_LOCALNETWORKS في إعداداتك إن احتجت إلى مزامنة مستودعات داخلية.
لنسخة Gitea متأثرة بـ CVE-2026-59774 (النسخ 1.22.1 إلى 1.27.0): الهجرة إلى Forgejo والترقية إلى Gitea 1.27.1 كلتاهما تُصلحان الثغرة. إن قرّرت البقاء على Gitea، طبِّق الرقعة فوراً. وإن كنت تفكّر في Forgejo منذ فترة، تحلّ الهجرة المشكلتين معاً: رقِّع بالهجرة بدلاً من الترقية ثم الهجرة لاحقاً. في كل الأحوال، ألغِ صلاحية 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 في الـ webhooks الصادرة — نسختك تستدعي خدمة داخلية بشهادة موقَّعة ذاتياً؛ أضف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 مباشرة
أيّ أداة تختار حسب وضعك
للتثبيت الجديد في 2026: Forgejo هو الاختيار الافتراضي في جميع المقارنات المستقلة تقريباً المنشورة هذا العام. تجمع الحوكمة المجتمعية، وإصلاحات الأمان المستقلة عن Gitea Ltd.، والتوافق مع الأدوات الموجودة (مشغّلات، webhooks، رموز)، والبصمة الذاكرية المماثلة لـ Gitea — جميعها الحجج دون مقايضات تُذكر لمشروع جديد. إن كنت تشغّل نسخة Gitea محدَّثة (1.27.1+) وتفي باحتياجاتك، فالهجرة ليست ملحّة — لكن المرة القادمة التي تُفكّر فيها بترقية رئيسية، قيِّم Forgejo آنذاك. GitLab CE هو الخيار الصحيح حين تحتاج فريقُك إلى سلسلة DevOps كاملة في تثبيت واحد — فحص الأمان، الصفحات، بيئات النشر، مقاييس DORA — وتتوفر البنية التحتية اللازمة. على VPS متواضع، ليست الأداة المناسبة. للتعمق أكثر: دليلنا المفصّل لتثبيت Forgejo، وإعداد خط أنابيب CI مع Woodpecker، ومقالة تصليب خادم Linux الأولي تُكمل هذه المقارنة.