المُشغّلات المستضافة من GitHub افتراضي جيّد. تتوقّف عن الحاجة إليها لحظة يريد بناء شيئًا لا تملكه — سجلّ حزمك الخاص، إصدار سلسلة أدوات محدّدًا سئمت إعادة تثبيته كل تشغيل، قاعدة بيانات على شبكتك الخاصة، أو مجرّد تحكّم أكثر بالآلة. عندها يكسب مُشغّل مستضاف ذاتيًا على VPS مكانه.
هذا الدليل يُشغّل واحدًا صحيحًا: مثبّتًا، مُسجّلًا، حيًّا تحت systemd، و — الجزء الذي يخطئه الناس — آمنًا. لنبدأ بذلك الأخير، لأنه الجزء الذي يعضّ.
قاعدة الأمان الواحدة
سير عمل GitHub Actions يُشغّل شيفرة عشوائية — أيًّا كان في ملف سير العمل، وأيًّا كان ما تجرّه تلك الشيفرة. على مستودعك الخاص تلك شيفرتك، وهي جيّدة. على مستودع عامّ، طلب سحب من غريب يمكن أن يُشغّل شيفرته على مُشغّلك. ذلك ليس خطأ؛ هكذا يعمل CI. توثيق GitHub نفسه يقول بوضوح: لا تستخدم مُشغّلات مستضافة ذاتيًا مع مستودعات عامة.
فالقاعدة بسيطة وغير قابلة للتفاوض: المُشغّلات المستضافة ذاتيًا للمستودعات الخاصة. إن كان مستودعك عامًّا، استخدم مُشغّلات GitHub المستضافة وامضِ. كل ما أدناه يفترض مستودعًا خاصًا.
ما يحتاجه مُشغّل من الصندوق
يعتمد على البناء، وينبغي أن تحدّد الحجم لبنائك بدل رقم من صفحة:
- مهمّة ترجمة-واختبار نموذجية — نواتان و4-8 GB مريح. Small (8$، 4 vCPU / 4 GB) أو Medium (12$، 6 vCPU / 6 GB) يغطّي معظمها.
- بناءات أثقل — ترجمات أصيلة كبيرة، بناءات صور Docker كبيرة، مجموعات اختبار جائعة للذاكرة — تريد متّسعًا أكثر. راقب تشغيلًا حقيقيًا واحدًا (
htopبينما يبني) وحدّد الحجم لما تراه فعلًا، لا للأمل.
القرص يهمّ أيضًا: مخابئ البناء، وطبقات Docker، والمستودعات المستنسخة تتراكم. أبقِ عينًا عليه وقلّم.
1. جهّز الصندوق
أنشئ مستخدمًا غير root للمُشغّل — مثبّت GitHub يرفض العمل كـ root على أي حال، وتريده كذلك:
sudo adduser --disabled-password --gecos "" runner
sudo usermod -aG sudo runner # فقط إن كانت بناءاتك تحتاج sudo فعلًا
ثبّت أيًّا كان ما تحتاجه بناءاتك — سلسلة أدوات لغة، Docker، أدوات بناء. مثلًا، إن بنت مهامّك حاويات:
sudo apt update && sudo apt install -y docker.io
sudo usermod -aG docker runner
2. نزّل المُشغّل وسجّله
في مستودعك (أو مؤسّستك) على GitHub، اذهب إلى Settings ← Actions ← Runners ← New self-hosted runner. يمنحك GitHub أوامر التنزيل الدقيقة ورمز تسجيل (قصير الأمد — خذه طازجًا). كمستخدم runner:
sudo -iu runner
mkdir actions-runner && cd actions-runner
# استخدم الرابط الدقيق الذي يُظهره GitHub لنظامك/معماريتك:
curl -o actions-runner-linux-x64.tar.gz -L "URL_FROM_GITHUB"
tar xzf actions-runner-linux-x64.tar.gz
./config.sh --url https://github.com/YOUR_ORG/YOUR_REPO --token YOUR_TOKEN
config.sh يسأل عن اسم مُشغّل، وتسميات، ومجلّد عمل — الافتراضات جيّدة للبدء. التسميات هي كيف يستهدف سير عملك هذا المُشغّل (runs-on: self-hosted).
3. شغّله كخدمة systemd
يأتي المُشغّل بمساعد يثبّت خدمة systemd لأجلك — استخدمه، كي ينجو المُشغّل من إعادات التشغيل ويُعيد التشغيل عند الفشل. لا يزال كتثبيت مستخدم runner، لكن أوامر الخدمة تحتاج root:
sudo ./svc.sh install runner
sudo ./svc.sh start
sudo ./svc.sh status
ذلك يسجّل actions.runner.* كوحدة systemd تعمل كمستخدم runner، تبدأ عند الإقلاع. السجلّات تذهب إلى journald:
sudo journalctl -u 'actions.runner.*' -f
عد إلى صفحة Runners في GitHub، مُشغّلك الآن يُظهر Idle — نقطة خضراء. وجّه سير عمل إليه:
jobs:
build:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- run: make test
ادفع، وتعمل المهمّة على صندوقك.
4. أبقِه نظيفًا
مُشغّل مستضاف ذاتيًا يُعيد استخدام نظام ملفّاته بين المهامّ — تلك مكسب السرعة (مخابئ دافئة) والفخّ (حالة متبقّية). عادتان تُبقيانه سليمًا:
- قلّم بانتظام. Docker خصوصًا —
docker system pruneعلى cron، وإلا يمتلئ القرص بصمت بطبقات ميتة. - لا تخزّن أسرارًا على الصندوق. استخدم أسرار GitHub Actions، مُحقَنة لكل تشغيل، لا ملفّات تجلس في بيت المُشغّل. إن اختُرق المُشغّل، أي شيء على القرص يذهب معه.
إن احتجت بيئة نظيفة حقًا لكل مهمّة، شغّل كل مهمّة داخل خطوة حاوية — يبقى المُشغّل، وفوضى المهمّة لا.
متى تستضيف ذاتيًا، بصدق
استضف ذاتيًا حين تحتاج سلسلة أدواتك مخبوزة، وصولًا لموارد شبكة خاصة، أو تحكّمًا بالآلة. ابقَ على مُشغّلات GitHub المستضافة حين تناسبك بيئة نظيفة مؤقّتة ودقائقهم — ذلك أبسط فعلًا، والأبسط يساوي شيئًا. ولا تستضف ذاتيًا أبدًا على مستودع عامّ. تلك ليست تفضيلًا.
إن كان مُشغّل مستودع خاص ما تحتاجه: اختر خطة — Small (8$) للبناءات الأخفّ، Medium (12$) حين تصير أثقل — ادفع بـ USDC أو USDT (بلا KYC، بلا وثائق)، وسيكون لديك root في نحو 60 ثانية. ثم اعمل نزولًا في هذه الصفحة وسيكون لديك مُشغّل يلتقط مهامّ بعد بضع دقائق.
التعليقات
لا تعليقات بعد. كن الأول.