الانتقال إلى المحتوى

اربط خادمك بمستودع على GitHub أو GitLab أو Gitea أو Forgejo وانشر تلقائيًا عند كل push أو إصدار أو وسم، مع المسارات المحمية وإعادة التشغيل وفحوص CI والتراجع بنقرة واحدة.

يربط تبويب Git Deploy في Portal خادمك بمستودع Git على GitHub أو GitLab أو Gitea أو Forgejo. تُنسخ ملفاته إلى خادمك تلقائيًا — عند كل push، أو عند نشر إصدار (release)، أو عند دفع وسم (tag)، أو بنقرة زر. وإن أردت، يُوقَف خادمك بشكل نظيف قبل النشر ويُعاد تشغيله بعده.

باختصار: ادفع كودك، وبعد ثوانٍ قليلة يعمل على خادمك. لا مزيد من الرفع عبر SFTP، ولا فك ملفات ZIP في مدير الملفات، ولا إعادة تشغيل منسية.

ما ستتعلمه

  • كيف تربط مستودعًا، عبر تطبيق Daki Git Deploy على GitHub أو عبر توكن وصول
  • متى يعمل النشر وكيف تشغّله بنفسك
  • كيف تحافظ على العوالم وقواعد البيانات وملفات .env بأمان باستخدام المسارات المحمية
  • كيف تعمل إعادة التشغيل وسجل النشر والتراجع والحالة في مستودعك
  • كيف تمنح فريقك الصلاحيات المناسبة

لمن هذه الميزة

  • مطورو بوتات Discord وتطبيقات Node.js أو Python أو Java الذين يعيش كودهم بالفعل على GitHub أو GitLab.
  • شبكات Minecraft وفرق خوادم الألعاب التي تحتفظ بالإضافات أو الإعدادات أو الـ datapacks في مستودع، وتريد أن تُطبَّق التغييرات بطريقة قابلة للتتبع.
  • الفرق: يعمل عدة أشخاص في المستودع، والخادم محدّث دائمًا، وصلاحيات المستخدمين الفرعيين تحدد بدقة من يستطيع النشر.
  • المشاريع القائمة على الإصدارات: لا يصل إلى الخادم إلا الإصدارات المنشورة (مثل ملف .jar جاهز من إصدار)، لا كل عمل قيد التطوير.

قبل أن تبدأ

  • خادم في Portal يعرض تبويب Git Deploy. يظهر في شريط تنقل الخادم ضمن Essentials، مباشرةً بعد Files افتراضيًا.
  • مستودع على GitHub (github.com) أو GitLab (gitlab.com أو نسختك الخاصة، مع المجموعات الفرعية مثل group/subgroup/project) أو Gitea أو Forgejo (مثل Codeberg أو نسختك الخاصة). المستودعات العامة والخاصة تعمل كلاهما.

يحدد Daki لكل نوع خادم (egg) ما إذا كان التبويب يظهر. إذا لم ترَ Git Deploy، فهو غير مفعّل لنوع خادمك.

يستخدم هذا الدليل التسميات الإنجليزية لتبويب Git Deploy. يتوفر التبويب بـ 19 لغة ويتبع اللغة التي اخترتها في Portal — الأزرار في المكان نفسه في كل اللغات.


الطريقة الأسرع: الاتصال عبر Daki Git Deploy، تطبيق GitHub الرسمي من Daki Hosting. تسجّل الدخول إلى GitHub وتختار مستودعاتك — دون الحاجة إلى توكن أو webhook.

  1. افتح تبويب Git Deploy

    في Portal، افتح خادمك وانتقل إلى تبويب Git Deploy. ضمن Git service، اختر GitHub.

  2. اتصل بـ GitHub

    في مربع GitHub access، انقر Connect with GitHub. سجّل الدخول إلى GitHub ووافق على التطبيق.

    في المرة الأولى، ينقلك GitHub مباشرةً بعد ذلك إلى اختيار المستودعات التي يُسمح للتطبيق بالوصول إليها (All repositories أو المستودعات المحددة فقط) — خطوة واحدة بدلًا من خطوتين. بعدها تعود إلى Portal، ويُظهر مربع GitHub access العبارة Connected via Daki Git Deploy as متبوعةً باسمك على GitHub. ويؤكد مربع Webhook أنه لا شيء يحتاج إلى إعداد: تصل عمليات push والإصدارات عبر التطبيق تلقائيًا.

  3. اختر مستودعك وفرعك

    انقر Choose from my repositories واختر مستودعك — أو الصق رابطه على الويب أو رابط الاستنساخ، أو اكتب المسار. انقر Load branches واختر الفرع الذي تريد نشره. اترك الحقل فارغًا لاستخدام الفرع الافتراضي للمستودع.

  4. اختر متى وكيف تنشر

    ضمن When to deploy، اختر وضعًا (مثل Every push). ثم حدّد مجلد الهدف، والمسارات المحمية وسلوك إعادة التشغيل.

  5. احفظ

    انقر Save settings في الشريط أسفل الصفحة. هذا كل شيء: يعرض رأس التبويب Automatic deploys on، ويُنشر دفعك التالي تلقائيًا. للنشر فورًا، انقر Deploy now في الأعلى على اليمين.

  • السماح بمستودع آخر: يفتح Choose repositories on GitHub اختيار المستودعات على GitHub مرة أخرى، حيث تختار المستودعات التي يُسمح لـ Daki Git Deploy بالوصول إليها.
  • إزالة الاتصال: انقر Disconnect. عندها لا ينشر الخادم من المستودعات الخاصة بعد الآن.

لا تحتاج أبدًا إلى تجديد أي شيء. في كل نشر، تجلب Portal مفتاحًا جديدًا قصير الصلاحية من GitHub (صالحًا لمدة ساعة واحدة) لا يصل إلا إلى مستودع خادمك الواحد. يحدث ذلك في الخلفية.


البدء السريع بتوكن الوصول

لـ GitLab وGitea وForgejo — وGitHub إن فضّلت ذلك — تحفظ توكن وصول شخصيًا. المستودعات العامة تعمل دون أي توكن على الإطلاق.

  1. اختر خدمة Git

    افتح خادمك ← Git Deploy واختر Git service. لنسختك الخاصة من GitLab أو Gitea أو Forgejo، أدخل عنوان URL للخادم (مثل https://codeberg.org أو https://git.example.com). بالنسبة إلى gitlab.com، اتركه فارغًا.

  2. أدخل المستودع

    أدخل المستودع كمسار (owner/name)، أو ببساطة الصق رابطه على الويب أو رابط الاستنساخ (clone). بالنسبة إلى مستودع عام، هذا كل ما تحتاجه — دون توكن، يعرض مربع الوصول No token – public repositories only.

  3. احفظ توكنًا للمستودعات الخاصة

    مع GitHub، انقر أولًا على Use an own access token instead في مربع GitHub access. ثم أنشئ توكنًا لدى مزوّد Git — رابط Create a token on … في Portal يأخذك مباشرةً إلى الصفحة الصحيحة — واحفظه ضمن Personal access token. تتحقق Portal من التوكن فورًا. انظر صلاحيات التوكن للحقوق التي يحتاجها.

  4. اختر إعداداتك واحفظ

    اختر متى تنشر، ومجلد الهدف، والمسارات المحمية، وسلوك إعادة التشغيل، ثم انقر Save settings.

  5. أضف الـ webhook

    يعرض مربع Webhook Payload URL وSecret، ولكل منهما زر نسخ. أضفهما إلى مستودعك كما هو موضح في إعداد الـ Webhook. تحت المربع، يعرض Last delivery ما إذا كان الـ webhook يصل.

  6. فعّل النشر التلقائي

    فعّل Automatic deploys active.

صلاحيات التوكن

المزوّدنوع التوكنالحقوق اللازمة للنشرمطلوب أيضًا للحالة في مستودعك
GitHubتوكن دقيق الصلاحيات، لهذا المستودع فقطContents: Read-only (ولـ Wait for CI checks أيضًا Actions: Read-only)Commit statuses وDeployments: Read and write
GitLabتوكن وصول شخصي أو للمشروع أو للمجموعةread_api + read_repositoryapi بدلًا من read_api، والدور Developer
Gitea / ForgejoSettings → Applicationsrepository: Read, user: Readrepository: Read and Write

إذا كانت صلاحية الكتابة للحالة فقط مفقودة، يظل خادمك يُنشر — ويعرض سجل النشر ملاحظة بذلك.

إعداد الـ Webhook

في مستودعك، انتقل إلى Settings → Webhooks → Add webhook:

  1. الصق Payload URL وSecret من Portal.
  2. اضبط نوع المحتوى على application/json.
  3. ضمن الأحداث، اختر Just the push event. في وضع الإصدارات، اختر Releases بدلًا من ذلك.

لا يستطيع مزوّد Git الوصول إلى Portal، مثلًا لأن نسخة Gitea الخاصة بك تعمل في شبكتك المنزلية؟ اختر فاصلًا زمنيًا تحت Also check … for updates بدلًا من ذلك (مثلًا Also check Gitea for updates). أول فحص ينشر الحالة الحالية مرة واحدة.


متى يعمل النشر

ضمن When to deploy، اختر واحدًا من أربعة أوضاع:

الوضعما الذي يُنشر
Manualفقط عندما ينقر أحدهم Deploy now.
Every pushكل push إلى الفرع المختار.
Releasesفقط عند نشر إصدار. انشر إما الكود المصدري للإصدار أو ملف إصدار (مثل *.jar) — ويمكن حفظه باسم ثابت (مثل server.jar) واستخراجه اختياريًا إذا كان .zip. يمكن تضمين الإصدارات التجريبية (pre-releases) أو استبعادها.
Tagsعند دفع وسم يطابق نمطًا، مثل v*.

المحفّزات (Triggers)

  • Webhook: يُبلغ مزوّد Git عن التغييرات فورًا، ويبدأ النشر خلال ثوانٍ. مع تطبيق GitHub يحدث هذا تلقائيًا، دون webhook خاص بك.
  • فحوص التحديث (polling): اختيارية، للحالات التي لا يستطيع فيها مزوّد Git الوصول إلى Portal. فواصل من 5 دقائق إلى يوم واحد.
  • Deploy now: في أي وقت، بنقرة زر. في وضع الإصدارات يمكنك اختيار إصدار محدد.
  • تخطّي دفع: ضع [skip deploy] في رسالة الـ commit فلا يُنشر ذلك الدفع. تعمل [deploy skip] و[no deploy] أيضًا.

انتظار فحوص CI

عند تفعيل Wait for CI checks (فقط في وضع Every push)، لا يُنشر الـ commit إلا بعد أن يصبح CI أخضر — تُدعم GitHub Actions وGitLab CI وGitea/Forgejo Actions. إذا فشل CI، يُتخطى النشر.


شرح جميع الإعدادات

القسمالإعدادما الذي يفعله
المستودعGit serviceGitHub أو GitLab أو Gitea أو Forgejo
المستودعServer URLفقط للنسخ المستضافة ذاتيًا؛ يجب أن تكون متاحة من الإنترنت
المستودعRepositoryowner/name أو رابط؛ Choose from my repositories يعرض قائمة
المستودعBranchفارغ = الفرع الافتراضي؛ Load branches يعرض قائمة
متى تنشرManual / Every push / Releases / Tagsانظر متى يعمل النشر
متى تنشرWait for CI checksفقط مع Every push
متى تنشرInclude pre-releases، What to deploy (Source code / Release file)، Save as، Extract .zip files instead of uploading themفقط مع Releases
متى تنشرTag patternفقط مع Tags، مثل v*؛ فارغ = كل وسم
متى تنشرAlso check … for updates (يُسمّى باسم خدمة Git لديك، مثلًا Also check GitHub for updates)الاستطلاع: Never (webhook only)، 5/10/15/30 دقيقة، 1/3/6/12/24 ساعة
متى تنشرAutomatic deploys activeالإيقاف يوقف الـ webhook والاستطلاع؛ Deploy now يبقى يعمل
متى تنشرShow deploys in the repositoryالحالة على الـ commit، انظر الحالة في مستودعك
الملفاتFolder in the repositoryنشر مجلد فرعي فقط، مثل dist؛ فارغ = كل شيء
الملفاتTarget folder on the serverوجهة الملفات؛ / = المجلد الرئيسي لخادمك
الملفاتProtected pathsقاعدة واحدة في كل سطر، انظر المسارات المحمية
الملفاتRemove files that were deleted from the repositoryتنظيف اختياري، انظر أدناه
إعادة التشغيلRestart if running / Always start / Do not restartانظر سلوك إعادة التشغيل
إعادة التشغيلIf the server does not stopإنهاء فوري، أو بعد 5 ث، 10 ث (الافتراضي: Kill after 10 seconds)، 15 ث، 30 ث، دقيقة، دقيقتان أو 5 دقائق

لا تسري التغييرات إلا بعد النقر على Save settings. وطالما هناك تغييرات غير محفوظة، يعرض شريط في الأسفل Discard وSave settings، ويكون Deploy now مقفلًا.

Remove files that were deleted from the repository يحذف فقط الملفات التي كتبها نشر سابق بنفسه — لا يمس أبدًا المسارات المحمية ولا الملفات التي أنشأتها بنفسك. تبقى المجلدات الفارغة في مكانها.


المسارات المحمية

الملفات والمجلدات الموجودة ضمن Protected paths لا تُستبدل ولا تُحذف أبدًا بالنشر. إن لم تكن موجودة بعد، تُنشأ مرة واحدة. مثالية لعوالم الألعاب وقواعد البيانات وكلمات المرور.

اكتب قاعدة واحدة في كل سطر، نسبةً إلى مجلد الهدف. تُتجاهل الأسطر الفارغة والأسطر التي تبدأ بـ #. ولا يطابق * أبدًا عبر /.

القاعدةتحمي
world/كل مجلد اسمه world، على أي عمق
/world/فقط world المباشر داخل مجلد الهدف
*.dbكل ملف ينتهي بـ .db، في أي مكان
.envكل ملف اسمه .env، في أي مكان
/config.ymlفقط config.yml المباشر داخل مجلد الهدف
plugins/*/config.ymlconfig.yml في كل مجلد فرعي مباشر داخل plugins

أمثلة شائعة:

Text
world/
world_nether/
world_the_end/
plugins/*/config.yml
whitelist.json
ops.json
banned-*.json

سلوك إعادة التشغيل

الخيارما الذي يحدث
Restart if runningيُوقف الخادم قبل كتابة الملفات ثم يُعاد تشغيله بعدها. الخادم المطفأ يبقى مطفأً.
Always startكما أعلاه، ويُشغَّل الخادم المطفأ بعد النشر.
Do not restartتُستبدل الملفات والخادم يبقى يعمل.

If the server does not stop: بعض البرامج، وتطبيقات Node.js على وجه الخصوص، تتجاهل إشارة الإيقاف. عندها يُنهى الخادم بعد الوقت الذي تختاره (فورًا، أو من 5 ثوانٍ حتى 5 دقائق؛ Kill after 10 seconds افتراضيًا) حتى لا يتعطل النشر. الإنهاء الفوري هو الأسرع، لكنه لا يمنح الخادم وقتًا للحفظ.

شبكتا أمان: إذا لم ينطفئ الخادم أبدًا، لا تتغير أي ملفات. إذا فشل النشر بعد إيقاف الخادم، يُعاد تشغيل الخادم.


ماذا يحدث أثناء النشر

  1. محفّز (push أو إصدار أو وسم أو فحص تحديث أو زر) ينشئ عملية نشر.
  2. إذا كان Wait for CI checks مفعّلًا، ينتظر فحوص CI الخضراء (Waiting).
  3. تنزّل Portal الأرشيف من مزوّد Git. بيانات اعتمادك لا تغادر Portal أبدًا ولا تصل إلى خادمك.
  4. يُجهَّز الأرشيف: المجلد المختار فقط، مع تصفية المسارات المحمية، وإزالة المحتوى غير الآمن مثل الروابط الرمزية (symbolic links).
  5. حسب إعداداتك، يُوقف الخادم (ويُنهى بعد الوقت المختار إذا لزم الأمر).
  6. تُكتب الملفات إلى مجلد الهدف؛ ويمكن حذف الملفات المحذوفة اختياريًا.
  7. حسب إعداداتك، يُعاد تشغيل الخادم.
  8. تظهر النتيجة والسجل الكامل في السجل — وإن كان مفعّلًا، كحالة على الـ commit.

يستغرق النشر عادةً 10–40 ثانية، إضافةً إلى الوقت الذي يحتاجه خادمك للتوقف.


السجل والسجلات والتراجع

تعرض قائمة Deployments في أسفل التبويب كل عملية نشر مع حالتها والفرع والـ commit (مثل main @ 75cd0a1) ورقمها ومحفّزها والشخص الذي بدأها والوقت ورسالة الـ commit. ويعرض رأس التبويب موعد آخر نشر للخادم.

الحالةالمعنى
Waitingينتظر فحوص CI
Scheduledفي الطابور، يبدأ قريبًا
Runningالنشر قيد التنفيذ
Deployedانتهى بنجاح
Failedحدث خطأ — السجل يوضح السبب
Skippedلم يُنشر، مثلًا لأن CI فشل أو أن الـ commit يحتوي [skip deploy]
Cancelledأُلغي قبل أن يبدأ
  • السجل: لكل نشر سجل حي يتحدّث أثناء تنفيذه. Hide log يغلقه مجددًا.
  • التراجع بنقرة واحدة: انقر Deploy again على نشر سابق لإعادة نشر تلك الحالة مرة أخرى.
  • الإلغاء: يمكن إلغاء عمليات النشر المنتظرة أو المجدولة.

تستطيع عدة خوادم النشر في الوقت نفسه، لكن كل خادم ينفذ عملية نشر واحدة فقط في كل مرة. المحفّز الجديد يستبدل عملية نشر أقدم لا تزال تنتظر.


الحالة في مستودعك

مع تفعيل Show deploys in the repository، يعرض الـ commit حالةً باسم Daki Hosting / اسم خادمك: أصفر أثناء النشر، ثم علامة صح خضراء أو علامة خطأ حمراء، مع رابط إلى تبويب Git Deploy.

  • على GitHub، تظهر عملية النشر أيضًا ضمن Deployments، مع اسم خادمك كبيئة (environment).
  • مع تطبيق GitHub تكتب الحالة Daki Git Deploy وتظهر بشعارها — ولا يلزم إعداد آخر. مع توكن، تظهر صورة حساب التوكن، ويحتاج التوكن إلى صلاحيات الكتابة (انظر صلاحيات التوكن).
  • يمكنك إيقافها لكل خادم على حدة. الحالة والرابط فقط عامّان — لا سجلات ولا تفاصيل أخطاء.

الفرق وصلاحيات المستخدمين الفرعيين

يحصل المستخدمون الفرعيون على مجموعة صلاحيات خاصة بهم باسم Git Deploy:

الصلاحيةتسمح بـ
view (github.read)رؤية الإعدادات وعنوان الـ webhook والسجل مع السجلات
deploy (github.deploy)Deploy now وDeploy again وإلغاء عمليات النشر
change settings (github.update)المستودع والوصول والـ webhook وكل الإعدادات

المستخدمون الفرعيون ليس لديهم وصول إلى Git Deploy افتراضيًا — أنت تقرر من يحصل على أي صلاحية. ويستطيع مالك الخادم دائمًا كل شيء.


الأمان

  • تُخزَّن التوكنات والأسرار مشفّرة ولا تُرسل أبدًا إلى متصفحك.
  • مع تطبيق GitHub، لا يوجد توكن طويل الأمد خاص بك للنشر أصلًا: كل نشر يستخدم مفتاحًا قصير الصلاحية (ساعة واحدة) يصل إلى مستودع خادمك فقط.
  • وصولك إلى GitHub هو ما يحدد المستودعات التي يمكنك ربطها. لا أحد يستطيع سحب مستودعات شخص آخر إلى خادمه.
  • الـ webhooks موقّعة بسر خاص بكل خادم. الطلبات التي تحمل سرًا خاطئًا أو تخص مستودعًا مختلفًا تُرفض.
  • فقط الشخص الذي حفظ التوكن يستطيع تغيير المستودع، لذلك لا يستطيع المستخدمون الفرعيون استخدام توكن المالك لتحميل مستودعات خاصة أخرى.
  • إذا غيّرت خدمة Git أو عنوان URL للخادم، يُحذف التوكن المحفوظ تلقائيًا عند الحفظ.
  • المسارات المحمية لا تُستبدل أبدًا، وRemove files that were deleted from the repository يحذف فقط ما كتبه Git Deploy نفسه.
  • الحالة العامة في مستودعك لا تحتوي على سجلات ولا تفاصيل أخطاء.

القيود المعروفة

  • مستودع واحد ووصول واحد لكل خادم.
  • كل خادم ينفذ عملية نشر واحدة فقط في كل مرة.
  • لا تظهر الحالة في مستودعك إلا بعد أن تبدأ عملية النشر فعلًا، لا أثناء انتظار CI.
  • لا تُستخرج ملفات الإصدارات إلا إذا كانت ملفات .zip؛ أما .tar.gz فيُرفع كملف.
  • تبقى المجلدات الفارغة في مكانها بعد Remove files that were deleted from the repository.
  • الروابط الرمزية (symbolic links) في المستودع لا تُنشر.
  • لا توجد إصدارات تجريبية في GitLab؛ الإصدار ذو التاريخ المستقبلي يُحسب إصدارًا تجريبيًا.
  • GitLab: ملفات الإصدارات المرفوعة إلى المشروع (/uploads/…) لا يمكن تنزيلها بتوكن من مشاريع خاصة؛ الروابط إلى سجل الحزم (package registry) تعمل.
  • Connect with GitHub متاح فقط لـ GitHub؛ أما GitLab وGitea وForgejo فتستخدم توكنًا.

الأسئلة الشائعة واستكشاف الأخطاء

هل أحتاج إلى تجديد التوكن بانتظام؟

ليس مع تطبيق GitHub: تجلب Portal مفتاحًا جديدًا لكل نشر تلقائيًا. التوكن الخاص بك يبقى صالحًا للمدة التي حددتها عند إنشائه لدى مزوّد Git؛ وعند انتهائه، احفظ توكنًا جديدًا ببساطة.

مستودعي غير موجود في القائمة (تطبيق GitHub)

انقر Choose repositories on GitHub وامنح التطبيق صلاحية الوصول إلى المستودع.

يبقى النشر على Scheduled

انتظر لحظة. إذا استمر ذلك لأكثر من بضع دقائق، يرجى التواصل مع الدعم.

الـ webhook لا يصل، أو يُظهر GitHub الخطأ 401

السر غير مطابق. انسخ السر من Portal وأدخله في الـ webhook مرة أخرى. New secret ينشئ سرًا جديدًا — بعدها غيّره لدى مزوّد Git أيضًا.

لماذا تم تخطّي نشري؟

الأسباب المحتملة: فشلت فحوص CI، أو تحتوي رسالة الـ commit على [skip deploy]، أو استبدل محفّز أحدث عملية نشر كانت لا تزال تنتظر. السبب يظهر في صف النشر.

لا أرى حالةً على الـ commit الخاص بي

يجب تفعيل Show deploys in the repository. مع توكن، يحتاج التوكن أيضًا إلى صلاحيات كتابة (انظر صلاحيات التوكن) — سجل النشر يوضح السبب.

يفشل النشر برسالة “The node rejected the request”

نوع خادمك لا يسمح بملفات معينة، أو أن القرص ممتلئ. السجل يوضح التفاصيل.

رابط نسخة Gitea الخاصة بي مرفوض

يجب أن تكون النسخ المستضافة ذاتيًا متاحة من الإنترنت. عناوين الشبكة المنزلية مثل 192.168.x.x لا تعمل.

كيف أتراجع؟

في السجل، انقر Deploy again على النشر السابق الذي تريد العودة إليه.

هل ستُستبدل عوالم اللعب أو قاعدة البيانات الخاصة بي؟

لا، إذا كانت مدرجة ضمن Protected paths (مثل world/ أو *.db).

من في فريقي يستطيع النشر؟

فقط من لديهم صلاحية deploy في مجموعة Git Deploy ضمن إعدادات المستخدمين الفرعيين للخادم. ويستطيع مالك الخادم دائمًا كل شيء.


الخطوات التالية