---
title: "توقف العامل. المزامنة لم تتوقف."
description: "أوقف العامل في منتصف دفعة وتتبّع جهة اتصال واحدة: أي مؤشر حُفظ، ولماذا لا تُكتب الكتابة المُعادة مرتين، ومن يملك المزامنة أثناء إعادة تشغيلها. ثم الحادثتان اللتان أظهرتا أن الاستعادة لم تكن سوى نصف المهمة."
url: https://tajo.io/ar/blog/worker-died-sync-didnt/
markdown: https://tajo.io/ar/blog/worker-died-sync-didnt.md
lang: ar-SA
author: "Set Noa"
author_url: https://tajo.io/ar/set-noa/
published: 2026-11-05
updated: 2026-11-05
alternates: {en-US: /blog/worker-died-sync-didnt.md, bg-BG: /bg/blog/worker-died-sync-didnt.md, cs-CZ: /cz/blog/worker-died-sync-didnt.md, de-DE: /de/blog/worker-died-sync-didnt.md, da-DK: /dk/blog/worker-died-sync-didnt.md, es-ES: /es/blog/worker-died-sync-didnt.md, fr-FR: /fr/blog/worker-died-sync-didnt.md, el-GR: /gr/blog/worker-died-sync-didnt.md, hi-IN: /hi/blog/worker-died-sync-didnt.md, id-ID: /in/blog/worker-died-sync-didnt.md, hr-HR: /hr/blog/worker-died-sync-didnt.md, hu-HU: /hu/blog/worker-died-sync-didnt.md, it-IT: /it/blog/worker-died-sync-didnt.md, ja-JP: /jp/blog/worker-died-sync-didnt.md, ko-KR: /kr/blog/worker-died-sync-didnt.md, nl-NL: /nl/blog/worker-died-sync-didnt.md, no-NO: /no/blog/worker-died-sync-didnt.md, pl-PL: /pl/blog/worker-died-sync-didnt.md, pt-BR: /pt/blog/worker-died-sync-didnt.md, ro-RO: /ro/blog/worker-died-sync-didnt.md, ru-RU: /ru/blog/worker-died-sync-didnt.md, sv-SE: /se/blog/worker-died-sync-didnt.md, zh-CN: /zh-cn/blog/worker-died-sync-didnt.md, sl-SI: /sl/blog/worker-died-sync-didnt.md, sr-Latn-RS: /sr/blog/worker-died-sync-didnt.md, th-TH: /th/blog/worker-died-sync-didnt.md, tr-TR: /tr/blog/worker-died-sync-didnt.md, ur-PK: /ur/blog/worker-died-sync-didnt.md, vi-VN: /vi/blog/worker-died-sync-didnt.md, sk-SK: /sk/blog/worker-died-sync-didnt.md}
---

[مزامنة البيانات](https://tajo.io/ar/blog/?category=data-sync)

# توقف العامل. المزامنة لم تتوقف.

أوقف العامل في منتصف دفعة وتتبّع جهة اتصال واحدة: أي مؤشر حُفظ، ولماذا لا تُكتب الكتابة المُعادة مرتين، ومن يملك المزامنة أثناء إعادة تشغيلها. ثم الحادثتان اللتان أظهرتا أن الاستعادة لم تكن سوى نصف المهمة.

استعادة المزامنة بعد الفشل

ماذا يحدث لمزامنة قيد التشغيل عندما يتوقف العامل في منتصف دفعة؟

لا يتحرك المؤشر إلا في نهاية دفعة نظيفة، لذا فإن العامل الذي يتوقف في منتصف دفعة يتركه عند بداية تلك الدفعة، ويقرأ التشغيل التالي الصفحة نفسها. مفتاح تسليم كل سجل مشتق من مؤشر الصفحة وموضعه فيها، ودفتر الكتابات المكتملة لمدة سبعة أيام يمنع الإعادة من الكتابة مرتين. وحجز واحد (lease) لكل مزامنة يمنع تشغيلين من العمل في الوقت نفسه. كان هذا هو النصف السهل. ظلت مزامنة واحدة تفشل، تشغيلاً بعد تشغيل، قبل أن يوقفها أي شيء مؤقتاً، وبقيت مساحة عمل صامتة، فيها أخطاء ولا نجاح واحد، قبل أن ينتبه أي شيء. لذلك يوجد الآن قاطع يوقف المزامنة مؤقتاً بعد خمس حالات فشل متتالية، وتنبيه كل ساعة عند مرور أربع وعشرين ساعة دون نجاح.

[معرفة المزيد](https://tajo.io/ar/blog/worker-died-sync-didnt/#%D8%AA%D8%AA%D8%A8%D9%91%D8%B9-%D8%AC%D9%87%D8%A9-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D9%88%D8%A7%D8%AD%D8%AF%D8%A9)

في [محاضرة نشرتها AI Engineer في 3 أكتوبر 2026](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=701s)، شغّل مناصر للمطورين (developer advocate) في Crusoe مهمة تدريب PyTorch على عقدتين من نوع A100. ثم أبلغ نظام المراقبة الخاص بالعرض نفسه أن إحدى وحدات GPU أطلقت خطأ XID 79. عُلّمت العقدة بأنها معطلة وأُلغيت المهمة. تلقت العملية إشارة SIGTERM وأمامها “[ما يصل إلى دقيقتين للتعامل مع إشارة SIGTERM تلك، إما لحفظ نقاط الحفظ أو لتفريغ السجلات](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=633s)”. دخلت عقدة احتياطية، و”[ستُعاد تشغيل مهمة slurm. ستحمّل نقطة الحفظ وتواصل التدريب من حيث توقفت](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=769s)”. أقل بقليل من خمس عشرة دقيقة من البداية إلى النهاية. لم يُستدعَ أحد.

المزامنة كائن أصغر بكثير من تشغيل تدريب. لكن السؤال واحد. ما الذي يحتاجه التشغيل حتى لا يكلّف إيقاف العامل سوى دقائق، ودون أي تكرار؟

هذه هي الإجابة بالنسبة إلى [مشغّل المزامنة الخاص بـ Tajo](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/)، مقروءة من الشيفرة لا من كتيّب دعائي. يصف مقال [Reverse ETL](https://tajo.io/ar/blog/what-is-reverse-etl/) شكل المهمة. وهذا ما يحدث حين تتوقف المهمة.

## تتبّع جهة اتصال واحدة

يقرأ التشغيل المصدر صفحة بعد صفحة، بدءاً من مؤشر محفوظ. لنسمِّ مؤشر الصفحة `c3`، ولتكن جهة الاتصال لدينا السجل رقم 212 في تلك الصفحة. هناك ثلاثة أمور صحيحة بشأن جهة الاتصال هذه قبل كتابة أي شيء.

أولاً، لها مفتاح تسليم. المفتاح بصمة (hash) لمعرّف المزامنة والمصدر ومؤشر الصفحة والموضع في الصفحة والسجل نفسه. يدخل المؤشر والسجل في البصمة ولا يُضمَّنان في المفتاح أبداً، لذا لا يحمل المفتاح [أي عنوان بريد إلكتروني](https://tajo.io/ar/resources/help/getting-started/understanding-data-sync/).

ثانياً، تمر الكتابة عبر [دفتر](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#ledger)، لا مباشرة إلى الوجهة. قبل استدعاء الوجهة، يُحجز المفتاح بحالة “قيد الانتظار”. وعندما تنجح الكتابة، يُعلَّم الصف بأنه مكتمل ويُحتفظ به سبعة أيام.

ثالثاً، لم يتحرك المؤشر. فهو لا يتحرك إلا في نهاية دفعة، وفقط إذا وصل كل سجل في تلك الدفعة، وفقط بعد أن يثبت التشغيل أنه لا يزال يملك المزامنة.

الآن أوقف العامل بين الكتابة ونقطة الحفظ.

عند إشارة SIGTERM، يُفرَّغ كل عامل في الطابور ضمن مهلة مشتركة واحدة مدتها خمس عشرة ثانية، وتخرج العملية بعد خمس وعشرين ثانية مهما كان ما يزال يعمل؛ ويمنحها systemd خمساً وأربعين ثانية قبل أن ينهيها قسراً. التشغيل الذي لم ينتهِ ضمن تلك النافذة يبقى معلَّماً بأنه قيد التنفيذ، ويلتقطه العامل التالي عبر آلية الطابور لاستعادة المهام المتعثرة. أما عند الإيقاف القسري فلا يوجد تفريغ على الإطلاق. وفي الحالتين تبقى الحقيقتان نفسيهما. الوجهة لديها جهة الاتصال. و[مؤشرنا](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#cursor) لا يزال يقول `c3`.

## الإعادة

يبدأ التشغيل التالي من `c3`، ويقرأ الصفحة نفسها، ويشتق المفتاح نفسه للسجل رقم 212، ثم يسأل الدفتر. يجيب الدفتر: مكتمل. لا تُستدعى الوجهة؛ تُعاد النتيجة المخزنة ويمضي التشغيل. وفي المسار المجمّع، حيث تستقبل نقطة الاستيراد في Brevo صفحة كاملة في استدعاء واحد، يجري الفحص نفسه لكل مفتاح قبل بناء الطلب. والصفحة التي اكتملت كل مفاتيحها مسبقاً لا ترسل شيئاً.

هذه هي الحيلة كلها، ومن المفيد توضيح سبب نجاحها. المفتاح مشتق من مؤشر الصفحة في بداية الدفعة، لا من التشغيل الذي كان يعمل مصادفةً. الانهيار، وإعادة المحاولة بعد ستين ثانية، والتشغيل المجدول غداً، كلها [تشتق المفتاح نفسه](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#ledger) للسجل نفسه. ولا يهتم الدفتر بأيها يسأل.

والآن الكلفة. [ينسى الدفتر بعد سبعة أيام](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#ledger). يقول التعليق في الشيفرة نفسها إن سبعة أيام تغطي إعادة محاولة متأخرة وانقطاعاً قصيراً، وهذا كل ما يدّعيه. الإعادة من مؤشر أقدم من ذلك تكتب مرة أخرى. والتشغيل الذي يُقطع قسراً قد ينتظر. يبقى حجز التشغيل المتوقف قائماً حتى خمس عشرة دقيقة، وفي المزامنة المجدولة، التشغيل الذي لم يعد حجزه قائماً [لا يُكنس ويُعاد جدولته إلا إذا كان قد بدأ قبل أكثر من ساعة](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#stuck-runs). يعود عرض Crusoe [في أقل من خمس عشرة دقيقة](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=753s). أما عرضنا فليس دائماً كذلك.

## من يملك المزامنة أثناء إعادة تشغيلها

يملك المزامنة تشغيل واحد في كل مرة. يأخذ التشغيل [حجزاً](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#lease) في Redis برمزه الخاص، مدته خمس عشرة دقيقة ويُجدَّد كل خمس دقائق. وقبل كل نقطة حفظ، يتحقق من أنه لا يزال يملك ذلك الحجز. فإن لم يكن كذلك، يتوقف. ويُسجَّل التشغيل ب[الجملة البسيطة التي سيقرؤها الشخص](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures): “The run lost its slot part-way through and stopped to avoid writing twice.” (فقد التشغيل مكانه في منتصف الطريق وتوقف لتجنب الكتابة مرتين.) والتشغيل الثاني الذي يصطدم بمالك نشط لا تُعاد محاولته. [ينتهي بالرسالة](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures) “Another run of this sync was already in progress” (كان هناك تشغيل آخر لهذه المزامنة قيد التنفيذ بالفعل)، ويبدأ التشغيل المجدول التالي بشكل طبيعي.

مسؤولية الإصلاح مكتوبة أيضاً. كل [رمز فشل](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures) يقابله سطر يشرح ما حدث، وسطر يشرح ما يجب فعله بعد ذلك، ومالك: أنت أو Tajo. الوجهة التي رفضت كل السجلات لأن الربط خاطئ مسؤوليتك. و[الحجز المفقود مسؤوليتنا](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures). وتعرض صفحة التشغيل الخطوة التالية؛ ويذكر [دليل استعادة المزامنة](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures) أيهما.

حتى الآن هذا هو النصف السهل. الانهيار يكلّف إعادة واحدة، ولا يُكتب شيء مرتين. أما النصف الآخر فقد علّمتنا إياه حادثتان.

## فشل بعد فشل

فشلت مزامنة واحدة مرة بعد مرة. ليس في حلقة متلاحقة، بل مرة في كل فاصل زمني للمجدول، تشغيلاً بعد تشغيل، بالرسالة نفسها في كل مرة: لا يمكن أن يحتوي المعرّف المخصص على نقطتين رأسيتين. لم يصل التشغيل إلى الوجهة قط. توقف أثناء إدخاله في الطابور، قبل أن يراه أي مشغّل، لذا فإن أي تنبيه مربوط بالمشغّل لم يجد شيئاً يرتبط به.

لم يكن هناك ما يراقب هذه السلسلة. هذه هي النتيجة كلها.

الحل قاطع دائرة. بعد كل فشل مسجَّل، يقرأ آخر خمسة تشغيلات منتهية للمزامنة منذ آخر تعديل عليها. إذا كانت الخمسة كلها أخطاء، يوقف المزامنة مؤقتاً، ويكتب صف تدقيق واحداً بالسبب `circuit_breaker_tripped`، ويطلق تنبيهاً حرجاً واحداً. تُشتق السلسلة من التشغيلات المخزنة، لا من عدّاد داخل العامل. ويُحسب أي فشل مسجَّل من أي مسار، بما في ذلك فشل الإدخال في الطابور الذي تسبب في الحادثة. يقول التعليق في الشيفرة إنه كان سيوقف تلك الحادثة عند التشغيل الخامس. ونجاح واحد يعيد السلسلة إلى الصفر. واستئناف المزامنة يعيد تسليح القاطع بدلاً من أن يُطلقه مجدداً بسبب الصفوف القديمة. ويقول [دليل موصل Shopify](https://tajo.io/ar/docs/ecommerce-platforms/shopify/) الشيء نفسه في سطر واحد: بعد خمسة تشغيلات فاشلة متتالية، توقف المزامنة نفسها مؤقتاً وتعرض صفحتها آخر خطأ.

ما لا يفعله القاطع هو إصلاح أي شيء. تستبدل Crusoe العقدة وتعيد تشغيل المهمة دون أن تسأل. أما Tajo فيتوقف ويسأل: تبقى المزامنة الموقوفة مؤقتاً موقوفة حتى يصلح شخص السبب و[ينشرها من جديد](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#pause). هذا الخيار الافتراضي الحذر مقصود: إعادة المحاولة التلقائية لمزامنة تكتب في سجلات العملاء هي نفسها كتابة.

## الصمت الذي لم يره أحد

الاعتراض وجيه، ويقول: “القاطع الذي يوقف المزامنة بعد خمس حالات فشل كان سيلتقط الحادثة الثانية أيضاً. فلماذا نبني مراقباً ثانياً؟” لأن الحادثة الثانية لم تكن تبدو فشلاً. لفترة طويلة كانت في مساحة عمل مزامنة نشطة، وكومة متزايدة من صفوف الأخطاء، ولا نجاح واحد على الإطلاق، ولم ينبّه أي شيء. كل إشارة موجودة كانت مربوطة بنشاط ما: فشل تشغيل، أو وصل webhook، أو تجاوز ميزانية. صفر نجاحات ليس حدثاً. إنه غياب الحدث، والقاطع لا يعمل إلا عندما يُسجَّل فشل. مجدول متوقف، أو طابور عالق، أو عامل لا يبدأ أبداً: هذه لا تسجّل شيئاً، والقاطع لا يستيقظ أبداً.

مقبض الرجل الميت في القاطرة يعمل بالعكس. على السائق أن يواصل الضغط عليه، والصمت يوقف القطار. نسخة المزامنة [تعمل مرة كل ساعة](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#hourly-check)، عند الدقيقة الثالثة عشرة. ولكل مساحة عمل فيها مزامنة نشطة تطرح سؤالاً واحداً: هل نجح أي تشغيل خلال الأربع والعشرين ساعة الماضية؟ مساحة العمل التي فُعّلت أقدم مزامنة نشطة فيها قبل أقل من يوم تُترك وشأنها؛ فلم يمرّ عليها يوم لتنجح بعد. أما الأقدم منها والصامتة فتتلقى تنبيهاً حرجاً واحداً. يذكر التنبيه نوع الصمت: تشغيلات مسجلة لكن لا ينجح أي منها، أو لا تشغيلات مسجلة على الإطلاق. يُطلق مرة واحدة لكل حادثة. وتُبقيه علامة في Redis مغلقاً حتى أول تشغيل ناجح، ثم تُمسح، فتنبّه الحادثة التالية من جديد.

وصل المراقبان كلاهما في commit واحد، بعد وقوع الأمر. يقول تعليق القاطع إنه كان سيوقف الحادثة الأولى عند التشغيل الخامس. ويقول تعليق الرجل الميت إن المزامنة المفعّلة منذ زمن طويل دون أي تشغيل يجب أن تنبّه. لم يكن أي منهما موجوداً حين احتجنا إليه. كتبناهما لاحقاً، وسجّلنا الحادثتين في ترويسة الملف حتى لا ينسى أحد السبب.

## ما بُني وما لم يُبنَ

ما بُني حتى وقت كتابة هذا المقال:

- يُحفظ المؤشر في نهاية كل دفعة نظيفة، ومرة أخرى عند الانهيار.
- مفتاح تسليم كل سجل مشتق من مؤشر الصفحة وموضعه فيها، ويُتحقق منه في [دفتر مدته سبعة أيام](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#ledger) قبل كل استدعاء للوجهة.
- [حجز](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#lease) واحد لكل مزامنة، مدته خمس عشرة دقيقة.
- خمس [محاولات](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#retries) لكل تشغيل، مع تراجع يبدأ من ستين ثانية.
- [قاطع](https://tajo.io/ar/resources/help/getting-started/understanding-data-sync/) يوقف المزامنة مؤقتاً بعد خمس حالات فشل متتالية ويسجّل السبب.
- [تنبيه كل ساعة](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#hourly-check) عند مرور أربع وعشرين ساعة دون نجاح.

ما لم يُبنَ، ومن المفيد معرفته قبل الاعتماد عليه:

- يراقب فحص الرجل الميت مساحة العمل، لا المزامنة. فمزامنة سليمة واحدة تخفي مزامنة شقيقة صامتة في مساحة العمل نفسها.
- [يصل تنبيهه إلى مشغّلي Tajo](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#hourly-check): سطر في السجل دائماً، وSentry أو webhook أو بريد إلكتروني حيث تم إعدادها. ولا يظهر في صفحة المزامنة. أما الإيقاف المؤقت الذي يقوم به القاطع فيظهر.
- لا شيء يعيد تشغيل مزامنة موقوفة مؤقتاً. يفعل ذلك شخص.
- الاستعادة بعد الإيقاف القسري ليست سريعة. قد يبقى الحجز قائماً خمس عشرة دقيقة، و[الكنس ينتظر ساعة](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#stuck-runs).
- العتبتان كلتاهما، خمس حالات فشل وأربع وعشرون ساعة، [إعدادات على مستوى النشر](https://tajo.io/ar/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#limits). لا يمكنك ضبطهما لكل مزامنة على حدة.

[السلسلة الطويلة من الخطوات شبه المثالية تفشل مع ذلك](https://tajo.io/ar/blog/almost-perfect-steps-unreliable-chain/)؛ والمخرج هو تحديد الحالة النهائية والتحقق منها. هذا المقال هو النصف التشغيلي من ذلك. حدّد ما يتركه التشغيل المتوقف خلفه، وتحقّق من اللاشيء الذي يتركه الصمت خلفه.

كانت الجملة الختامية لدى Crusoe أن “[الإخفاقات حتمية](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=955s)”. وجملتنا تتقدم خطوة. كان الانهيار هو النصف السهل، لأنه ترك صفوفاً. أما الصمت فكان النصف الذي اضطررنا إلى البحث عنه.

## الأسئلة المتكررة

**ماذا يحدث لمزامنة قيد التشغيل عندما يتوقف العامل في منتصف دفعة؟**

يبقى المؤشر عند بداية الدفعة التي انقطعت، لأن Tajo لا يحرّكه إلا بعد أن تصل الدفعة كاملة دون أخطاء. يقرأ التشغيل التالي الصفحة نفسها مرة أخرى. يحمل كل سجل مفتاح تسليم مشتقاً من مؤشر الصفحة وموضعه فيها، ويحتفظ دفتر بكل كتابة مكتملة لمدة سبعة أيام، فتُعاد نتائج السجلات المكتوبة سابقاً من الدفتر بدلاً من إرسالها إلى الوجهة مرة ثانية.

**لماذا لا تكتب المزامنة المُعادة جهة الاتصال نفسها مرتين؟**

قبل كل استدعاء للوجهة، يتحقق التشغيل من مفتاح تسليم السجل في دفتر. المفتاح بصمة (hash) للمزامنة والمصدر ومؤشر الصفحة والموضع في الصفحة والسجل نفسه، لذا فإن الانهيار وإعادة المحاولة بعد دقيقة والتشغيل المجدول في اليوم التالي تشتق كلها المفتاح نفسه للسجل نفسه. المفتاح المعلَّم بأنه مكتمل خلال نافذة الأيام السبعة لا يُرسل مرة أخرى.

**ما تنبيه الرجل الميت في المزامنة؟**

فحص يُطلق التنبيه عند الغياب لا عند الفشل. مرة كل ساعة، ينظر Tajo في كل مساحة عمل فيها مزامنة نشطة، وينبّه إذا لم ينجح أي تشغيل خلال الأربع والعشرين ساعة الماضية، بما في ذلك حالة عدم تسجيل أي تشغيل على الإطلاق. يُطلق مرة واحدة لكل حادثة، ثم يُعاد تفعيله بعد أول تشغيل ناجح. وُجد لأن تنبيه الفشل لا يرى إلا حالات الفشل التي سُجّلت.

## مقالات ذات صلة

### [ست قواعد لمزامنة تعمل دون أن يراقبها أحد](https://tajo.io/ar/blog/six-rules-unattended-sync/)

٦ نوفمبر ٢٠٢٦ · 7 دقيقة قراءة

٧ أقسام

### [سير العمل الذي لا يظهر بين المربعات](https://tajo.io/ar/blog/the-workflow-between-the-boxes/)

٨ أكتوبر ٢٠٢٦ · 3 دقيقة قراءة

سجل المتجر → تصحيح المشغّل → وجهة البريد

### [تكاملات Brevo: اختر اتصالًا يمكنك التحقق منه](https://tajo.io/ar/blog/brevo-connector-guide/)

١٩ أغسطس ٢٠٢٦ · 4 دقيقة قراءة

٦ أقسام
