لماذا تختار Forgejo لمخزن Git المستضاف ذاتياً
وُلدت Forgejo عام 2022 كنسخة مجتمعية من Gitea، دافعها مخاوف حول حوكمة المشروع الأصلي. تطويرها مجتمعي بالكامل، مرخصة بـGPLv3+ منذ الإصدار v9.0 (أغسطس 2024؛ وبـMIT قبل ذلك)، ولا تعتمد على أي شركة تجارية. للفرق التي تريد السيطرة الكاملة على شيفراتها ومسارات CI/CD والحزم دون الاعتماد على GitHub أو GitLab أو Bitbucket، تُعد Forgejo من أخف الخيارات المتاحة. واجهتها مألوفة لكل مطور استخدم GitHub، والترحيل من Gitea سلس، والتوافق مع GitHub Actions يُخفض عتبة الانتقال.
فوائد ملموسة لـForgejo المستضافة ذاتياً
- سيادة كاملة: شيفرتك لا تغادر بنيتك التحتية أبداً
- متوافقة مع GitHub Actions عبر Forgejo Actions — أعد استخدام سيناريوهاتك الحالية
- بصمة ذاكرة منخفضة: يكفي خادم VPS صغير لفريق صغير
- سجل حزم مدمج: npm، PyPI، Maven، Helm، حاويات OCI
- لا حدود على عدد المستودعات الخاصة أو المتعاونين
- اتحاد ActivityPub قيد التطوير — تشغيل بيني مستقبلي مع منصات أخرى
- مفتوحة المصدر، قابلة للتدقيق، بلا مفاجآت في التسعير
- تحديثات تحت سيطرتك: أنت من يقرر وقت الترقية
المتطلبات المادية والبرمجية بأرقام حقيقية
حدد موارد خادم VPS وفق حجم فريقك الفعلي قبل نشر Forgejo. لـ1–5 مطورين مع عشرات المستودعات، يكفي 1 نواة و1 غيغابايت ذاكرة. لـ5–20 مطوراً مع CI/CD نشطة، خطط بـ2 نواة و2 غيغابايت. لما يزيد على 20 مطوراً أو لمستودعات ضخمة، 4 نوى و4 غيغابايت تضمن أداءً سلساً. للتخزين، احسب حجم مستودعاتك مضافاً إليه 20% هامش للحزم والنسخ الاحتياطية.
على صعيد الشبكة، يجب فتح ثلاثة منافذ في جدار الحماية: المنفذ 80 لـHTTP (التحقق من Let's Encrypt)، المنفذ 443 لـHTTPS (حركة الويب)، والمنفذ 2222 لـSSH Git (تفادياً للتعارض مع SSH الإداري على المنفذ 22). برمجياً تحتاج Docker Engine إصدار ≥ 24، وDocker Compose الإصدار 2، واسم نطاق يشير إلى خادمك.
نشر Forgejo باستخدام Docker وSSL
تحضير البيئة
أنشئ المجلدات التي ستحتفظ بالبيانات خارج الحاوية:
mkdir -p /opt/forgejo/{data,config,db} chown -R 1000:1000 /opt/forgejoأنشئ ملف
/opt/forgejo/.envبقيمك الخاصة:FORGEJO_DOMAIN=git.نطاقك.com FORGEJO_SSH_PORT=2222أضف إليه كلمة مرور مولَّدة لقاعدة البيانات، لا كلمة مرور مثال أبدًا، ثم احمِ الملف:
echo "POSTGRES_PASSWORD=$(openssl rand -hex 32)" >> /opt/forgejo/.env chmod 600 /opt/forgejo/.envإنشاء ملف docker-compose.yml
services: forgejo: image: codeberg.org/forgejo/forgejo:17 restart: unless-stopped environment: - USER_UID=1000 - USER_GID=1000 - FORGEJO__database__DB_TYPE=postgres - FORGEJO__database__HOST=db:5432 - FORGEJO__database__NAME=forgejo - FORGEJO__database__USER=forgejo - FORGEJO__database__PASSWD=${POSTGRES_PASSWORD} volumes: - /opt/forgejo/data:/data ports: - "127.0.0.1:3000:3000" - "${FORGEJO_SSH_PORT:-2222}:22" depends_on: - db db: image: postgres:16-alpine restart: unless-stopped environment: - POSTGRES_DB=forgejo - POSTGRES_USER=forgejo - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} volumes: - /opt/forgejo/db:/var/lib/postgresql/dataتشغيل الخدمات
cd /opt/forgejo docker compose up -d docker compose logs -f forgejoانتظر حتى تُظهر السجلات أن خادم الويب يستمع على المنفذ 3000. تُنفذ Forgejo عمليات ترحيل قاعدة البيانات تلقائياً عند الإطلاق الأول.
إعداد البروكسي العكسي وSSL مع Caddy
Caddy هو الخيار الأبسط للحصول على شهادة Let's Encrypt تلقائية. ثبّته ثم أنشئ ملف
/etc/caddy/Caddyfile:git.نطاقك.com { reverse_proxy localhost:3000 }شغّل Caddy:
systemctl enable --now caddy. تُصدر شهادة TLS وتُجدَّد تلقائياً. إذا فضّلت nginx، استخدم كتلةproxy_pass http://127.0.0.1:3000;مع Certbot.إتمام إعداد المنصة
افتح
https://git.نطاقك.comفي متصفحك. يظهر معالج الإعداد مرة واحدة فقط. أدخل النطاق وعنوان SSH (ssh://git.نطاقك.com:2222) وبريد المدير، وأوقف التسجيل العام من هذه الشاشة إذا كانت منصتك خاصة. بعد إرسال المعالج، يُقفل الإعداد في ملف/opt/forgejo/data/gitea/conf/app.ini.تثبيت runner لـForgejo Actions
ينفّذ الـrunner شيفرة سيناريوهاتك: ثبّته على جهاز مخصص إن أمكن. في *إدارة الموقع → Actions → Runners* (
/admin/actions/runners)، انقر على *إنشاء runner جديد*: تعرض Forgejo معرّفًا UUID ورمزًا سريًا. ولّد ملف الإعداد (docker run --rm data.forgejo.org/forgejo/runner:13 forgejo-runner generate-config > data/runner-config.yml)، وانسخ عنوان المنصة والمعرّف والرمز في القسمserver.connections، وصرّح بالبطاقات (مثلubuntu-latest:docker://node:20) في القسمrunner. ثم انشر الـrunner مع خادم Docker خاص به (docker-in-docker) بدل تركيب/var/run/docker.sockالخاص بالمضيف، الذي يمنح كل مهمة صلاحيات root على الخادم:services: docker-in-docker: image: docker:dind privileged: true command: ["dockerd", "-H", "tcp://0.0.0.0:2375", "--tls=false"] restart: unless-stopped runner: image: data.forgejo.org/forgejo/runner:13 depends_on: - docker-in-docker environment: DOCKER_HOST: tcp://docker-in-docker:2375 user: "1001:1001" volumes: - ./data:/data command: forgejo-runner daemon --config runner-config.yml restart: unless-stoppedيبقى المنفذ 2375 لخادم docker-in-docker على الشبكة الداخلية لـCompose: لا تنشره أبدًا. يظهر الـrunner في الواجهة فور اتصاله. تحدد كل بطاقة وضع التنفيذ: docker:// (حاوية، موصى به)، وlxc:// (حاوية LXC)، وhost (مباشرة على الجهاز دون أي عزل: يُحصر في المهام الموثوقة).
كتابة أول سيناريوهات Forgejo Actions
التوافق مع صياغة GitHub Actions واسع. أنشئ ملف .forgejo/workflows/ci.yml في جذر مستودعك:
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: تشغيل الاختبارات
run: |
npm ci
npm testتتوافق بطاقات runs-on مع البطاقات المعلنة عند تسجيل الـrunner. يمكنك تعريف عدة runners بمختلف البطاقات (مثل arm64، gpu، high-memory) واستهداف البيئة المناسبة لكل مهمة. تعمل الحزم والذاكرة المؤقتة مع الـactions الرسمية ذاتها المستخدمة على GitHub.
أمان ما بعد التثبيت: الإعدادات الأساسية
منصة Forgejo الحديثة التثبيت تعمل لكنها غير مُصلَّبة. إليك الست نقاط الواجبة المعالجة قبل فتحها لفريقك.
تعطيل التسجيل العام. إن لم تفعل ذلك في المعالج، أضف FORGEJO__service__DISABLE_REGISTRATION=true إلى متغيرات بيئة الحاوية (أو DISABLE_REGISTRATION = true في القسم [service] من app.ini): عندها لا يستطيع إنشاء الحسابات إلا المدير. لا ينبغي لأحد إنشاء حساب بدون دعوة على منصة داخلية.
تفعيل المصادقة الثنائية 2FA للمديرين. يجب على كل حساب مدير تفعيل 2FA من *الإعدادات → الأمان*. لفرضها، اضبط GLOBAL_TWO_FACTOR_REQUIREMENT في القسم [security] من app.ini (admin للمديرين، all لجميع المستخدمين). أما REQUIRE_SIGNIN_VIEW فيفرض تسجيل الدخول لتصفح المنصة فقط.
SSH بالمفاتيح فقط. عطّل المصادقة بكلمة المرور في /etc/ssh/sshd_config على الخادم المضيف (PasswordAuthentication no). لـSSH Git على المنفذ 2222، تقبل Forgejo المفاتيح العامة المسجلة في ملفات تعريف المستخدمين فقط — وهذا سلوكها الافتراضي.
أسرار webhooks. عند إنشاء كل webhook، امْلأ دائماً حقل *السر*. توقّع Forgejo الحمولة بـHMAC-SHA256؛ على متلقيك التحقق من هذا التوقيع قبل معالجة الحدث.
الحزم الخاصة. إذا استخدمت السجل المدمج للحزم، تذكّر أن الحزمة ترث رؤية مالكها: انشرها تحت مؤسسة أو حساب خاص لحصرها في أعضائه. يجب أن تمتلك الرموز المستخدمة للنشر نطاقًا أدنى (write:package فقط).
جدار الحماية. أغلق كل المنافذ عدا 80 و443 و2222. يجب ألا يُكشف المنفذ 3000 (Forgejo الداخلي) مباشرة؛ يستهلكه البروكسي العكسي عبر الحلقة المحلية فقط، ولهذا ينشره ملف compose على 127.0.0.1:3000. المنفذ الذي ينشره Docker يتجاوز قواعد ufw: وحده هذا الربط بـ127.0.0.1 يُبقيه بعيدًا عن الإنترنت.
تحديث Forgejo دون انقطاع
إجراء تحديث Docker بسيط ولا يتطلب سوى ثوانٍ من الانقطاع.
cd /opt/forgejo
# 1. سحب الصورة الجديدة
docker compose pull forgejo
# 2. نسخ احتياطي لقاعدة البيانات قبل أي ترحيل
docker compose exec db pg_dump -U forgejo forgejo > backup-$(date +%Y%m%d).sql
# 3. إعادة تشغيل الخدمة
docker compose up -d forgejo
# 4. التحقق من عمليات ترحيل المخطط
docker compose logs forgejo | grep -i migratتُنفذ Forgejo عمليات الترحيل تلقائياً عند الإطلاق. تحقق من أن السجلات لا تُظهر أي خطأ في الترحيل. عند حدوث خطأ في الترحيل، استعد النسخة الاحتياطية وأبلغ عن المشكلة على متتبع Forgejo. الوسم 17 لا يتبع إلا إصدارات 17.x: للانتقال إلى الإصدار الرئيسي التالي، غيّر الوسم في ملف compose بعد نسخة احتياطية كاملة، واقرأ ملاحظات الإصدار دائمًا قبل القفز بين الإصدارات الرئيسية. ترفض Forgejo الإقلاع على قاعدة بيانات أحدث منها: التراجع يمر باستعادة النسخة الاحتياطية.
الترحيل من Gitea في خمس دقائق
Forgejo نسخة مباشرة من Gitea: الترقية من Gitea مدعومة حتى الإصدار 1.22 ضمنًا، مرورًا أولًا بـForgejo v10.0.x. للترحيل، أوقف Gitea، انسخ مجلد بياناتها إلى /opt/forgejo/data، استبدل الصورة بـcodeberg.org/forgejo/forgejo:10 في ملف docker-compose وأعد التشغيل، ثم ارتقِ إلى الإصدار الحالي. تكتشف Forgejo مخطط Gitea تلقائياً وتُطبق عمليات الترحيل الخاصة بها. تُحفظ مستودعاتك ومستخدموك ومفاتيح SSH والـwebhooks والإشكاليات بالكامل. إصدارات Gitea اللاحقة لـ1.22 لا يغطيها دليل الترقية الرسمي لـForgejo: لا تحاول الانتقال المباشر.
استكشاف الأخطاء: المشكلات الأكثر شيوعاً
رفض اتصال SSH على المنفذ 2222. تحقق أولاً من أن Docker ينشر المنفذ (docker compose ps → عمود Ports). ثم اختبر من العميل: ssh -p 2222 git@git.نطاقك.com. إذا كانت الإجابة PTY allocation request failed، الاتصال يعمل — Forgejo ترد بـHi <user>! You've successfully authenticated. إذا حصلت على Connection refused، جدار الحماية يحجب المنفذ: ufw allow 2222/tcp.
Runner يظهر غير متصل في الواجهة. يتصل الـrunner بـForgejo عبر HTTPS صادر. تحقق من أن حاوية الـrunner تستطيع الوصول إلى git.نطاقك.com. شهادة موقّعة ذاتياً تستلزم تثبيت مرجع مصادقتك في الحاوية. أعد تشغيل الـrunner بعد إصلاح الاتصال: docker compose restart runner.
رفض push بواسطة hook. قد ترفض Forgejo دفعة إذا كانت قاعدة حماية فرع نشطة (مراجعة مطلوبة، اختبارات CI إلزامية) أو تجاوز ملف حد الحجم. تحتوي رسالة خطأ git على التفاصيل. للملفات الكبيرة (> 100 ميغابايت)، استخدم Git LFS: تدعم Forgejo بروتوكول LFS أصلاً.
واجهة بطيئة بعد أشهر. شغّل جامع مهملات Git من لوحة الإدارة: *إدارة الموقع → لوحة التحكم → عمليات الصيانة*، مهمة جمع المهملات للمستودعات. للأتمتة، فعّل المهمة المجدولة [cron.git_gc_repos] في app.ini (ENABLED = true؛ تعمل كل 72 ساعة افتراضيًا).
اتحاد ActivityPub: ما تبنيه Forgejo
تطوّر Forgejo الاتحاد بين المنصات عبر ForgeFed، وهو امتداد لبروتوكول ActivityPub (البروتوكول ذاته الذي يستخدمه Mastodon). لا يزال تجريبيًا ومعطّلًا افتراضيًا ([federation] ENABLED = false): لم تُطوَّر بعد أدوات الإشراف والتحكم في الوصول، وينبّه المشروع إلى أن تغييرًا غير متوافق قد «يحرق» نطاق المنصة لأي اتحاد مستقبلي. لا تفعّله على منصة إنتاج. الاتحاد الكامل — التفريع عبر النسخ وطلبات السحب بين المنصات — قيد التقييس ضمن مجموعة عمل ForgeFed. ستتيح هذه التطورات مستقبلاً المساهمة دون إنشاء حساب على كل نسخة.
Forgejo مقابل Gitea مقابل GitLab CE: اختر منصتك
مرّر الجدول أفقيًا
| المعيار | Forgejo | Gitea | GitLab CE |
|---|---|---|---|
| الحوكمة | مجتمعية (Codeberg e.V.) | تجارية (CommitGo) | تجارية (GitLab Inc) |
| الحد الأدنى من الذاكرة | منخفضة (VPS صغير) | منخفضة (VPS صغير) | 8 غيغابايت (16 موصى بها) |
| توافق GitHub Actions | نعم (Forgejo Actions) | نعم (Gitea Actions) | لا (GitLab CI بصياغة خاصة) |
| سجل الحزم | نعم (متعدد الأشكال) | نعم | نعم |
| اتحاد ActivityPub | قيد التطوير (ForgeFed) | لا | لا |
| الترحيل من GitHub | نعم (مرايا + استيراد) | نعم | نعم |
| واجهة الإدارة | بسيطة ومدمجة | بسيطة ومدمجة | كاملة لكن ثقيلة |
| الرخصة | GPLv3+ (منذ v9.0) | MIT | MIT (CE) / EE (مدفوع) |
| وتيرة الإصدارات | فصلية (+ LTS) | عدة إصدارات سنويًا | شهرية |