حماية الدفعالتفاصيل
- التعديلات ضمن الباقة مجانية.
- إذا لم تردّ خلال 3 أيام من التسليم، يُقبل العمل تلقائيًا.
يُحجز المبلغ عند الدفع ولا يُحوَّل إلا بعد قبولك العمل.

مثال على النتيجة
دمج ملفات المبيعات الشهرية لـ 9 متاجر في تقرير Excel واحد
طريقة التشغيل
python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO المجلد: sales/2026-10، عُثر على 9 ملفات
2026-11-02 09:14:03 INFO shop-01.csv: 1,284 صفًا
2026-11-02 09:14:04 INFO shop-02.xlsx: 967 صفًا
2026-11-02 09:14:04 WARN shop-07.csv: تُخطّيت 3 صفوف بلا سعر (الأسطر 88، 412، 913)
2026-11-02 09:14:05 INFO تم: 10,412 صفًا -> report-2026-10.xlsx (الورقتان «المبيعات» و«الإجماليات»)
إعدادات لا كود
أسماء أعمدة كل متجر موجودة في settings.ini، فالمتجر الجديد أو العمود الذي تغيّر اسمه يعني سطرًا واحدًا هناك:
[columns]
date = التاريخ, تاريخ البيع, اليوم
product = المنتج, الصنف, الاسم
quantity = الكمية, العدد, قطع
price = السعر, سعر الوحدة
جزء من الكود
def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
"""يقرأ ملف متجر واحد ويمنح أعمدته أسماء أعمدة التقرير."""
table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
renamed = {}
for name, variants in columns.items():
found = next((c for c in table.columns if c.strip() in variants), None)
if found is None:
raise ReportError(f"{path.name}: لا يوجد عمود لـ «{name}» (جرى البحث عن: {', '.join(variants)})")
renamed[found] = name
table = table.rename(columns=renamed)[list(columns)]
table["shop"] = path.stem
return table
الملفات: أرشيف ZIP يضم merge_sales.py (310 أسطر)، وsettings.ini، وrequirements.txt، وملف README يشرح تثبيت Python وتشغيل السكربت ومعنى كل رسالة في السجل. يشغّله العميل على كمبيوتره الخاص.
العميل: سلسلة صغيرة من 9 متاجر للأدوات المكتبية؛ يرسل كل متجر مبيعاته الشهرية في ملف CSV أو Excel، بأسماء أعمدة تختلف قليلًا من متجر إلى آخر. المهمة: سكربت واحد يقرأ كل ملف في مجلد، ويوحّد الأعمدة في شكل واحد، ويكتب تقرير Excel واحدًا يضم كل المبيعات وورقة بالإجماليات حسب المتجر.
العميل وجميع التفاصيل افتراضية.
عن هذه الخدمة
قاعدة البيانات التي بلا نسخ منتظمة على بُعد تحديث خاطئ واحد أو قرص ممتلئ من فقدان الطلبات أو المنشورات أو سجلات العملاء. يُنشئ هذا السكربت، بلغة Bash أو Python حسب ما يناسب خادمك، تفريغًا كاملًا لقاعدة بيانات MySQL أو MariaDB أو PostgreSQL بالأدوات المرفقة معها (mysqldump أو pg_dump)، ويضغطه، ويسميه بالتاريخ، ولا يحتفظ إلا بالنسخ التي تحددها قواعدك، مثلًا 7 يومية و4 أسبوعية و6 شهرية؛ ولا تُزال النسخ الأقدم إلا وفق تلك القواعد. توضع كلمة مرور قاعدة البيانات في ملف الخيارات القياسي الذي تملؤه على خادمك (.my.cnf أو .pgpass)، ولا توضع أبدًا في الكود. تثبّته وتشغّله على خادمك الخاص؛ ولا نسجّل الدخول إليه أبدًا. جرّبه أولًا على نسخة تجريبية، واستعد نسخة احتياطية واحدة إلى قاعدة بيانات تجريبية للتأكد من أنه يعمل.
ما المشمول
- ما الذي تحصل عليهأرشيف ZIP يضم السكربت وملف README بتعليمات خطوة بخطوة، ومن الباقة القياسية ملف إعدادات بقواعد البيانات والمجلدات وعدد النسخ المحفوظة؛ ويُعرض الكود أيضًا في صفحة الطلب.
- أدوات قياسيةmysqldump أو pg_dump، بلا تثبيت أي شيء غريب
- التدوير وفق قواعدكلا تُزال النسخ القديمة إلا كما تحدد
- كلمة المرور خارج الكودفي .my.cnf أو .pgpass على خادمك
- رصد الإخفاقاتبدءًا من الباقة القياسية، يُسجَّل التفريغ الفاشل أو الفارغ ولا يُحسب كنسخة
- كود مقروءمع تعليقات، ليسهل إضافة قاعدة بيانات لاحقًا
كيف يعمل
- 1المهمةتصف الخادم وقواعد البيانات وعدد النسخ المطلوب الاحتفاظ بها
- 2الكودنكتب السكربت ودليل تثبيته
- 3جرّبهتشغّله على نسخة تجريبية وتستعيد نسخة احتياطية واحدة إلى قاعدة بيانات تجريبية
- 4التعديلاتتطلب التعديلات ضمن باقتك وترسل أي رسالة خطأ
ما نحتاجه منك
قاعدة البيانات (MySQL أو MariaDB أو PostgreSQL) وإصدارها، ونظام الخادم (مثلًا Ubuntu 22.04) وهل يمكنك تثبيت الحزم عليه، وحجم قاعدة البيانات، وأين يجب تخزين النسخ وكم المساحة المتوفرة. قواعد التدوير: كم نسخة يومية وأسبوعية وشهرية يُحتفظ بها. للباقة المميزة: المكان الثاني للنسخ والعنوان الذي تُرسل إليه رسائل الإخفاق. لا ترسل أبدًا كلمات المرور أو بيانات الوصول إلى الخادم.
سنسألك:
- أي قاعدة بيانات، وما حجمها؟
- على أي خادم هي؟
- كم نسخة يُحتفظ بها؟
- أين يجب أن تذهب النسخ؟
- Bash أم Python؟
قارن بين الباقات
| الباقات | الأساسيةقاعدة بيانات واحدة16 US$ | القياسيةالنسخ الاحتياطي مع الإعدادات33 US$ | المميزةأداة النسخ الاحتياطي67 US$ |
|---|---|---|---|
| مدة التنفيذ | 1 يوم | 2 يوم | 3 أيام |
| التعديلات | 1 | 2 | 3 |
| الكود | حتى 150 سطرًا | حتى 400 سطر | حتى 1,000 سطر |
| ملفات الكود | 1 | حتى 3 | حتى 8 |
| ملف الإعدادات | لا | نعم | نعم |
| رسائل خطأ واضحة وسجل | لا | نعم | نعم |
| خيارات التشغيل ودليل لتشغيله وفق جدول زمني | لا | لا | نعم |
| دليل التثبيت والتشغيل (README) | نعم | نعم | نعم |
| اللغة | Bash أو Python | Bash أو Python | Bash أو Python |
| اطلب الأساسية | اطلب القياسية | اطلب المميزة |
حماية الدفع
تدفع عند الطلب، لكن المبلغ لا يُحوَّل إلا مقابل عمل قبلته.
- سعر ثابتلا يتغير سعر الباقة بعد الدفع.
- المبلغ محجوزعند الدفع، يُحجز المبلغ فقط. ولا يُحوَّل إلى Dleex إلا بعد قبولك العمل.
- فحص قبل التسليمتخضع كل نتيجة لفحص الجودة قبل أن تصل إليك، وتراها في صفحة الطلب قبل قبولها.
- تعديلات مجانيةاطلب تعديلات ضمن متطلبات طلبك بالعدد الذي تسمح به الباقة.
- القبول بعد 3 أيامإذا لم تقبل العمل ولم تطلب تعديلات خلال 3 أيام من التسليم، يُقبل تلقائيًا. وإذا كتبت في محادثة الطلب بعد التسليم، يبقى الطلب قيد الانتظار؛ وبعد ردّنا، قد نعيد بدء مهلة 3 أيام وسنُعلمك بذلك في المحادثة.
- إعادة التنفيذ أو استرداد المبلغ كاملًاإذا لم تطابق النتيجة متطلبات طلبك ولم تُصلحها التعديلات، أو استغرق العمل أكثر من ضعف مدة التنفيذ، فاكتب في محادثة الطلب: سنعيد تنفيذ العمل أو نردّ إليك المبلغ كاملًا.
الأسئلة والأجوبة
هل سيحذف النسخ الاحتياطية القديمة؟
وفق القواعد التي تعطيها فقط، مثل الاحتفاظ بـ 7 نسخ يومية و4 أسبوعية، وفي مجلد النسخ الاحتياطية الذي يكتب فيه فقط. وإلى أن تحدد القواعد، يحتفظ بكل شيء.
هل يمكنني حفظ النسخ خارج الخادم؟
في الباقة المميزة تُنسخ كل نسخة احتياطية إلى قرص ثانٍ أو إلى مساحة تخزين لديك بالفعل، باستخدام أداة سطر الأوامر الخاصة بها ومفاتيحك الخاصة، التي تضعها في إعداداتها بنفسك.
هل يُوقف الموقع أثناء تشغيله؟
لجداول InnoDB في MySQL ولـ PostgreSQL يُؤخذ التفريغ دون إيقاف الموقع. ومع ذلك قد تبطئه قواعد البيانات الكبيرة جدًا، لذا شغّله في ساعة هادئة.
هل ستُعدّونه على خادمي؟
لا. لا نسجّل الدخول إلى خادمك أبدًا. يوضح ملف README كل خطوة، من نسخ السكربت إلى إضافته إلى cron (الباقة المميزة).
لم تجد إجابتك؟