لماذا الانتقال من GitHub إلى منصة استضافة ذاتية
يبقى GitHub المرجع الرئيسي، لكن ثلاثة اتجاهات تقاطعت في 2026 لتجعل الانتقال واقعاً لا مجرد فكرة.
أولاً: الانقطاعات. وثَّق موقع githubstatus.com عدة حوادث أثّرت في عمليات Git وActions في أغسطس 2026. وصل خيط Hacker News « Alternatives to GitHub » إلى 472 نقطة و299 تعليقاً في 2026-08-17، دليلٌ على أن السؤال لم يعد نظرياً.
ثانياً: تكلفة دقائق CI. GitHub Actions مجاني حتى حصة شهرية معينة على المستودعات العامة، لكن أي فريق يتجاوز هذه الحصة في المستودعات الخاصة يدفع بالدقيقة. التفاصيل متاحة على github.com/pricing.
ثالثاً: السيادة على الكود. تُفضِّل بعض الفِرق أن يكون الوصول الوحيد إلى مستوداتها عبر صلاحية root على خادمها الخاص، لا عبر رمز SaaS قابل للإلغاء في أي وقت.
ما يقدمه Gitea المستضاف ذاتياً على أرض الواقع
- الحفاظ على السجل الكامل: يستهلك استيراد Gitea أرشيف tar.gz من GitHub — الإيداعات والفروع والعلامات سليمة.
- نقل المشكلات والتسميات: تنقل نقطة النهاية
POST /api/v1/repos/migrateالمشكلاتِ والمراحلَ والتسمياتِ في مرور واحد. - مشغِّل CI أصلي: يفهم gitea-runner صيغة سير عمل GitHub Actions — تعمل معظم خطوط الأنابيب دون إعادة كتابة.
- تكلفة يمكن التنبؤ بها: يكفي خادم VPS بمعالج افتراضي واحد و1 GB لفريق صغير؛ البرنامج مفتوح المصدر.
- Webhooks متوافقة: تعرض Gitea الأحداث ذاتها مثل GitHub — تبقى تكاملات الأطراف الثالثة مرتبطة دون تعديل.
- رمز API محلي: تُدار الصلاحيات في واجهتك الخاصة، لا عند طرف ثالث.
المتطلبات الأساسية
قبل البدء، اجمع العناصر التالية.
جانب GitHub: رمز وصول شخصي (Settings → Developer settings → Personal access tokens) بصلاحيتَي repo وread:org.
جانب Gitea: نسخة Gitea مثبَّتة مسبقاً ورمز مشرف (gitea-admin → Settings → Applications → Generate Token). دوِّن عنوان قاعدتك https://git.your-domain.com.
الجهاز المحلي: git الإصدار 2.x وcurl وjq مثبَّتة. خصِّص ذاكرة وصول عشوائي لا تقل عن 1 GB على خادم VPS.
الهجرة خطوة بخطوة
إنشاء المنظمة في Gitea
في واجهة Gitea، اذهب إلى + → New Organization واختر اسماً مطابقاً لمنظمتك في GitHub.
أو عبر واجهة البرمجة:
curl -s -X POST https://git.your-domain.com/api/v1/orgs \
-H "Authorization: token YOUR_GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d '{"username":"my-org","visibility":"private"}'استعراض مستودعات GitHub وتصديرها
curl -s -H "Authorization: token YOUR_GITHUB_TOKEN" \
"https://api.github.com/orgs/MY_ORG/repos?per_page=100&page=1" \
| jq -r '.[].name' > repos.txtاستيراد كل مستودع عبر واجهة Gitea البرمجية
while IFS= read -r REPO; do
curl -s -X POST https://git.your-domain.com/api/v1/repos/migrate \
-H "Authorization: token YOUR_GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"clone_addr\": \"https://github.com/MY_ORG/$REPO\", \"auth_token\": \"YOUR_GITHUB_TOKEN\", \"uid\": 2, \"repo_name\": \"$REPO\", \"issues\": true, \"labels\": true, \"milestones\": true, \"mirror\": false}"
done < repos.txtتحديث عناوين الاستضافة المحلية
git remote set-url origin https://git.your-domain.com/my-org/my-repo.gitأو عبر SSH:
git remote set-url origin [email protected]:my-org/my-repo.gitتحقق بـ git remote -v، ثم اختبر بـ git fetch.
تحديث Webhooks
في Gitea، لكل مستودع: Settings → Webhooks → Add Webhook. الصق عنوان URL لخدمة CI أو الطرف الثالث، مستبدلاً github.com بـ git.your-domain.com.
نقل خط أنابيب CI إلى gitea-runner
wget -O gitea-runner https://dl.gitea.com/act_runner/latest/act_runner-latest-linux-amd64
chmod +x gitea-runner
./gitea-runner register --no-interactive \
--instance https://git.your-domain.com \
--token YOUR_RUNNER_TOKEN \
--name vps-runner \
--labels ubuntu-latest:docker://node:20-bullseye
./gitea-runner daemon &أعد تسمية .github/workflows/ إلى .gitea/workflows/ للاستخدام المسار الأصلي لـ Gitea.
التحقق بعد الهجرة
بعد اكتمال الهجرة، تحقق من ثلاث نقاط قبل إلغاء الوصول إلى GitHub.
الاستنساخ عبر SSH: يجب أن يُتمَّ git clone [email protected]:my-org/my-repo.git دون طلب كلمة مرور.
Webhooks النشطة: في كل مستودع، افتح Settings → Webhooks وانقر Test Delivery. الكود 200 يؤكد أن CI تستقبل الأحداث.
السجل سليم: يجب أن يعرض git log --oneline -10 الإيداعاتِ العشر الأخيرة بالترتيب نفسه الموجود في GitHub.
إن كنت تنقل عشرات المستودعات، شغّل استدعاءات curl للاستيراد بصورة متوازية باستخدام xargs -P 4 لتقليص وقت الانتظار الإجمالي إلى ربعه. تتعامل Gitea مع الاستيرادات المتزامنة دون فقدان بيانات.
الأخطاء الشائعة وحلولها
إليك الحالات الثلاث الأكثر تكراراً أثناء الهجرة.
SSH: `Permission denied (publickey)`
العَرَض: يفشل git clone [email protected]:… بخطأ Permission denied (publickey).
التحقق: في Gitea، Settings → SSH / GPG Keys — يجب أن يظهر المفتاح العام الذي تستخدمه. أضفه إن لم يكن موجوداً.
Remote: `fatal: repository not found`
العَرَض: يُعيد git fetch رسالة fatal: repository not found.
التشخيص: git remote -v — تأكد أن العنوان يشير إلى نسخة Gitea لا إلى github.com.
Webhooks صامتة بعد الهجرة
العَرَض: لا يُشغِّل git push أي بناء في خدمة CI.
التشخيص: في Gitea، Settings → Webhooks → last delivery: يعرض حقل «Response» كود HTTP الذي أعادته خدمة CI. 404 يعني مسار غير موجود؛ 401 يعني سر HMAC غير صحيح.
استضافة Gitea على خادم VPS من ServOrbit
تعمل Gitea بكفاءة على خادم VPS بـ معالج افتراضي واحد و1 GB ذاكرة لفريق صغير. انشر قالب Gitea من Marketplace، اختر نظام التشغيل وحجم خادم VPS، وستحصل على نسخة مُعدَّة في دقائق. خطط VPS تبدأ من {{vps.start.price}}.