الأمر sbarbase
أمر واحد اسمه sbarbase يجمع المهام التي يكررها المشغّل كل أسبوع: فحص الخادم، وأخذ نسخة احتياطية أو استعادتها، وإضافة بيئة، وتدوير مفتاح، والترقية، وفتح Studio، وقراءة السجلات. لا يضيف قدرة جديدة. كل أمر فرعي يشغّل أداة موجودة أصلًا، أو يستدعي واجهة الإدارة البرمجية التي تستعملها لوحة الإدارة، بالفحوص نفسها وحالات الرفض نفسها.
تقرأ أوامر الإدارة سياسة MFA للتثبيت بعد تسجيل الدخول بكلمة المرور. تسمح السياسة الاختيارية للحسابات التي لا تملك عوامل موثقة بالمتابعة دون رمز مصادقة، بينما تتحقق الحسابات ذات العوامل المفعّلة منها. يغير مالك التثبيت السياسة من Account security. راجع عقد المصادقة.
التشغيل
الأمر هو الملف deploy/sbarbase في مجلد التثبيت. يشغّل lab/sbarbase.ts عبر Bun من ذلك المجلد، أينما استدعيته. يبحث عن Bun في مسار الأوامر، ثم في ~/.bun/bin للحساب الذي يشغّله، ثم في المسار الذي تعطيه الوحدة المثبّتة للخدمة؛ ويحدده SBARBASE_BUN صراحة. شغّله بحساب الخدمة، فهو مالك ملفات الحالة:
sudo -u sbarbase /opt/sbarbase/deploy/sbarbase statusلتكتب sbarbase وحده، اربطه بمسار الأوامر مرة واحدة:
sudo ln -s /opt/sbarbase/deploy/sbarbase /usr/local/bin/sbarbaseمع Docker، شغّله داخل حاوية طبقة التحكم، من مجلد المستودع:
docker compose exec sbarbase deploy/sbarbase statusيعرض sbarbase help كل الأوامر الفرعية، ويشرح sbarbase help <command> أمرًا واحدًا.
الأوامر الفرعية
| المهمة | الأمر | ما يشغّله |
|---|---|---|
| معرفة حال الخادم | sbarbase status |
يقرأ الحالة المحلية، بلا تسجيل دخول |
| عرض البيئات | sbarbase environments |
يقرأ الفهرس، بلا تسجيل دخول |
| نسخة احتياطية الآن | sbarbase backup now [<environment>] |
lab/backup.py create |
| عرض النسخ | sbarbase backups list [<environment>] |
lab/backup.py list |
| استعادة بيئة | sbarbase restore <environment> <backup> |
lab/backup.py restore بعد تأكيدك |
| تجهيز نسخة من تثبيت آخر | sbarbase relink <runtime> <backup> |
واجهة الإدارة البرمجية، لمشغّلي التثبيت وحدهم |
| إضافة بيئة | sbarbase add-environment <project> <name> |
واجهة الإدارة البرمجية، كما تفعل لوحة الإدارة |
| تدوير مفتاح عام | sbarbase rotate-key <environment> |
واجهة المفاتيح، كما تفعل لوحة الإدارة |
| حصة البوابة | sbarbase share <environment> [<n>] |
واجهة الإدارة البرمجية، كما تفعل لوحة الإدارة |
| نسيت كلمة مرور اللوحة | sbarbase reset-password <email> |
واجهة الإدارة لخدمة تسجيل الدخول، على الخادم فقط |
| الترقية | sbarbase upgrade [check|start|status|rollback|channel] |
lab/upgrade.py |
| Studio | sbarbase studio start|stop <environment> |
واجهة الإدارة البرمجية، ثم يشغّل المشرف lab/studio.py |
| السجلات | sbarbase logs [supervisor|auth|rest|storage|database] |
journalctl أو docker logs |
قيمة <environment> هي معرّف البيئة من لوحة الإدارة، أو معرّف التشغيل (e_ ثم 24 رمزًا ست عشريًا)، أو <project>/<name> مثل shop/production. إذا كان لعميلين مشروعان بالاسم نفسه فاكتب <client>/<project>/<name>. أما <backup> فهو الوقت الذي يعرضه backups list، مثل 20260924T030000Z.
الأمر status
يجيب status دون تسجيل دخول، فيبقى متاحًا حين تتعطل لوحة الإدارة أو تسجيل دخول الإدارة. يقرأ الملفات التي تكتبها طبقة التشغيل أصلًا، ويعرض:
- المشرف: الوحدة
sbarbase.serviceوهل يراها systemd نشطة، أو حاوية Docker؛ - لوحة الإدارة وعنوانها المحلي؛
- كل بيئة مع حالتها، وسجل التوجيه (تخدم أو في الصيانة، على محركها الأول أو منقولة)، وهل يجيب Auth وREST فيها، وآخر نسخة احتياطية مكتملة لها؛
- الإشعارات التي لم تُسلَّم بعد، مع نوعها وشدتها وحالة تسليمها. لا تُطبع تفاصيلها ولا أخطاء تسليمها أبدًا.
ينتهي بالرمز 0 حين تعمل لوحة الإدارة وتجيب كل بيئة منشورة، وبالرمز 1 في غير ذلك. ويطبع status --json الحقائق نفسها في كائن JSON واحد يناسب أدوات المراقبة.
الأوامر backup now وbackups list وrestore
تشغّل هذه الأوامر lab/backup.py، المشروح في النسخ الاحتياطي والاستعادة. إذا لم تسمِّ بيئة، ينسخ backup now كل البيئات. وتحتفظ النسخة اليدوية بعدد النسخ نفسه الذي تحتفظ به النسخة اليومية: تقرأ SBARBASE_BACKUP_KEEP من الطرفية، أو من الوحدة في تثبيت systemd، ويغيّره الخيار --keep N. إذا لم يضبطه أيّ منهما، يحتفظ lab/backup.py بسبع نسخ.
يجمع الأمر backup collect-installation --output <directory> ملفات هذا التثبيت المحلية الخاصة في مجلد خاص جديد، دون تشفير ودون أن تكون كاملة. أما backup installation --output <file> --key-file <key> فمحجوز للحزمة الكاملة، ويرفض حاليًا. كلاهما مشروح في الجمع المحلي الخاص لملفات التثبيت.
يطلب restore أن تكتب وقت النسخة قبل أن يستبدل شيئًا، ويذكر ما سيضيع. إذا لم تكن هناك طرفية، كما في سكربت، يرفض ما لم تمرر --yes. وما تحفظه الاستعادة جانبًا يُحذف بالأمر lab/backup.py discard-previous.
الأمر relink
الأمر relink <runtime> <backup> هو الخطوة الأولى لاستعادة نسخة أُخذت على تثبيت آخر، كما يشرح النسخ الاحتياطي والاستعادة. ضع النسخة أولًا في .lab/backups/<runtime>/<backup>/. يقرأ الأمر العميل والمشروع والبيئة المسجلة في بيان النسخة، ويسجّل الدخول مثل الأوامر التالية، ثم يطلب من واجهة الإدارة البرمجية أن تنشئها هنا بالمعرّفات نفسها ومعرّف التشغيل نفسه. لا يملك ذلك إلا مشغّلو التثبيت. ولا يربط النسخة بالاسم أبدًا: إذا وُجد عميل أو مشروع بالاسم المسجل لكن بمعرّف آخر رُفض الطلب، وكذلك أي تعارض آخر، ولا يتغير شيء. بعدها يجهّز العامل بيئة فارغة، ويملؤها restore.
الأوامر add-environment وrotate-key وshare وstudio
تسجّل هذه الأوامر الدخول إلى واجهة الإدارة البرمجية بحساب المشغّل الخاص بك، تمامًا كما تفعل لوحة الإدارة، فتنطبق فحوص العضوية وحد السعة وسجل التدقيق نفسها. يأتي البريد من --email أو SBARBASE_EMAIL أو من سؤال في الطرفية. وتأتي كلمة المرور من سؤال لا يُظهر ما تكتبه، أو من --password-stdin، أو من --operator-file مع الملف الخاص ذي الصلاحية 0600 الذي يكتبه lab/operator_file.py. لا تُقبل كلمة المرور وسيطًا في سطر الأمر أبدًا. تُغلق الجلسة في النهاية، ولا يُخزَّن رمزها ولا يُطبع.
- يطلب
add-environmentالبيئة ويعود فورًا، ثم يجهّزها العامل. تابعها بالأمرsbarbase environments. - يصدر
rotate-keyمفتاحًا عامًا جديدًا ويطبعه مرة واحدة على المخرج القياسي، ثم يلغي المفتاح القديم. احفظ المفتاح الجديد قبل أن تغلق الطرفية، فهو لا يظهر إلا مرة واحدة. إذا كان للبيئة أكثر من مفتاح نشط، يرفض الأمر بدل أن يخمّن؛ سمِّ المفتاح الذي تستبدله بالخيار--revoke <key id>. وإذا فشل الإلغاء فالمفتاح الجديد نشط والقديم نشط أيضًا؛ ألغِه من لوحة الإدارة. - يعرض
shareالحصة المضمونة للبيئة من بوابة التطبيقات، ومعها التوزيع على كل التثبيت إذا كنت مشغّل التثبيت. ويضبطهاshare <environment> <n>؛ لا يملك ذلك إلا مشغّلو التثبيت، وترفض الواجهة حصة تتجاوز بالمجموع سعة البوابة. - يسجّل
studio startوstudio stopالطلب، ثم يشغّل المشرف Studio أو يوقفه خلال ثوانٍ. افتحه من لوحة الإدارة كما يشرح دليل Studio.
الأمر upgrade
يشغّل sbarbase upgrade الأمر lab/upgrade.py check، ولا يغيّر شيئًا. أما upgrade start وupgrade status وupgrade rollback فتشغّل الأوامر الفرعية نفسها في lab/upgrade.py، ويختار --to REF الإصدار. وتصل إلى قناة الإصدارات بالطريقة نفسها:
| المهمة | الأمر |
|---|---|
| أحدث إصدار موقّع وما يحتاجه | sbarbase upgrade channel [--json] |
| الانتقال إلى إصدار متحقق منه | sbarbase upgrade start --release vX.Y.Z [--allow-class rebuild|attended] |
| هل سيمضي التراجع | sbarbase upgrade rollback --check |
يجب أن يكون الإصدار وسمًا بسيطًا على شكل vX.Y.Z، وأن يسمّي --allow-class إما rebuild أو attended؛ وأعطه مرتين لإصدار يحتاج الاثنين. وأي شيء آخر، أو خيار لا يناسب الأمر الفرعي، يُرفض قبل أن يعمل lab/upgrade.py. تشرح الترقيات كل خطوة.
الأمر logs
يعرض sbarbase logs سجل المشرف عبر journalctl؛ يبقيه --follow مفتوحًا، ويحدد --lines N كم سطرًا سابقًا يظهر. يحتاج حساب الخدمة إذنًا بقراءة السجل، مثل العضوية في systemd-journal. مع Docker، سجل المشرف هو مخرج الحاوية: شغّل docker compose logs sbarbase على الخادم نفسه بدلًا منه.
يعرض sbarbase logs auth <environment> وsbarbase logs rest <environment> حاوية Auth أو REST لبيئة واحدة. ويعرض sbarbase logs storage وsbarbase logs database حاويتي Storage وPostgreSQL المشتركتين.
رموز الخروج
| الرمز | المعنى |
|---|---|
0 |
تمّ، أو كل ما فحصه status سليم |
1 |
فشلت العملية. ورمز خروج الأداة المفوَّضة يمر كما هو |
2 |
خطأ في الاستعمال: أمر أو خيار غير معروف، أو وسيط ناقص |
3 |
رُفض أو لم يُؤكَّد: لم يتغير شيء |
الحدود
- يغطي الأمر المهام الشائعة وحدها. أما تصدير الاستعادة، ونقل بيئة، وتبنّي الحاويات المحفوظة، وباقي خطوات دليل التشغيل، فتبقى مع أدواتها الخاصة الموصوفة في النشر على خادم.
- يقرأ
statusوenvironmentsالفهرس مباشرة وللقراءة فقط. لا تملك واجهة الإدارة البرمجية مسارًا لسجلات التوجيه، ولهذا يعرضها الأمر بهذه الطريقة. - تدوير المفتاح استدعاءان للواجهة لا استدعاء واحد: بينهما يكون المفتاحان نشطين لحظة قصيرة.
- المشروع قيد التطوير وليس جاهزًا للإنتاج. تستبدل اختبارات الوحدات كل أداة والواجهة البرمجية ببدائل وهمية. وشُغّل
relinkوrestoreفعلًا في تجربة الاستعادة على آلة افتراضية في 2026-09-25 (الدليل)؛ أما بقية الأوامر الفرعية فلا يوجد تشغيل مسجّل لها في آلة التجربة الكاملة.