دليل النشر

Windmill على VPS: سير عمل TypeScript/Python بدون قيود

انشر على VPS Cloud ←

دليل عملي

Windmill على VPS: سير عمل TypeScript/Python بدون قيود

الأتمتة11 دقيقةً للقراءةعدد الخطوات: 7

أصدر n8n الإصدار 3.0 في أكتوبر 2026 وفرض Docker طريقةً وحيدة للنشر، مع إزالة أكثر من 30 عقدة تاريخية. للفرق التي تقيّم البدائل، يبرز Windmill كأقرب خيار: اكتب TypeScript أو Python أصليًا، نفّذ السكريبتات مباشرةً من محرر الويب، ونظّم عشرات العمال على خادم VPS واحد. لا خطة مدفوعة للمتغيرات السرية، لا عقد مملوكة — فقط كود مُصدَر في مساحة عمل مرتبطة بـ Git. يصل هذا الدليل بك إلى نسخة Windmill v1.830 جاهزة للإنتاج في أقل من ساعة.

المحتويات· لماذا Windmill بدلاً من n8n أو Make في 20261/15
  1. 01لماذا Windmill بدلاً من n8n أو Make في 2026
  2. 02فوائد ملموسة لفرق DevOps والوكالات
  3. 03المتطلبات الدنيا بالأرقام
  4. 04التكوين الأدنى والموصى به
  5. 05النشر بـ Docker Compose في 7 خطوات
  6. 06الإعداد: مساحة العمل والمتغيرات السرية والـ Crons
  7. 07الإعدادات الأساسية بعد التثبيت
  8. 08مثال كامل لسير عمل Python
  9. 09سكريبت Python: استيراد API ← تصفية ← PostgreSQL
  10. 10التصليب والأمان
  11. 11استكشاف الأخطاء — الأخطاء الشائعة
  12. 125 أخطاء حقيقية وحلولها
  13. 13نحو الإنتاج: قائمة التحقق النهائية
  14. 14نقاط التحقق قبل الانتقال للإنتاج
  15. 15‏Windmill مقابل n8n مقابل Temporal

لماذا Windmill بدلاً من n8n أو Make في 2026

يُمثّل n8n ‏3‎.0 منعطفًا حقيقيًا: Docker إلزامي، وحذف أكثر من 30 عقدة، وعقد Code لم تعد تقرأ متغيرات البيئة. يبقى Make خدمةً مغلقة محدودةَ العمليات شهريًا. يسلك Windmill المسار المعاكس: كودك سكريبت من الدرجة الأولى، مُصدَر وقابل للاختبار الوحدوي، ويمكن تشغيله من الطرفية أو الواجهة بالسهولة ذاتها. تضمن رخصة AGPLv3 أن تكون النسخة ذاتية الاستضافة مطابقة وظيفيًا لعرض السحابة — دون ميزات حصرية للمؤسسات في الاستخدام اليومي‎.

فوائد ملموسة لفرق DevOps والوكالات

  • TypeScript وPython أصليان — تعمل السكريبتات في عامل Node‎.js أو Python دون تحويل أو طبقات وسيطة؛ تُحلَّل تبعيات npm/pip تلقائيًا عند أول تنفيذ‎.
  • محرر ويب مع تنفيذ مباشر — اكتب واختبر وأعد تشغيل سكريبت من المتصفح في ثوانٍ، دون دفع commit أو إعادة تشغيل أي خدمة‎.
  • تعدد المستأجرين مدمج — يدعم نشر واحد مساحات عمل معزولة متعددة، مثالي لوكالة تدير عدة عملاء أو فريق لديه بيئات dev/staging/prod‎.
  • مهام Cron والـ Webhooks دون إضافات — جدولة مهمة بـ 0 9 * * 1-5 أو كشف endpoint webhook هو عملية أصلية، وليست إضافة‎.
  • متغيرات سرية مشفرة — الأسرار مشفرة بـ AES-256 في القاعدة ولا تظهر في السجلات؛ لكل مساحة عمل نطاق أسرار خاص‎.
  • لا قيود على البائع — جميع السكريبتات والتدفقات والموارد قابلة للتصدير بصيغة JSON/YAML والاستيراد في أي نشر Windmill آخر‎.

المتطلبات الدنيا بالأرقام

يعتمد Windmill على PostgreSQL للتخزين وعلى عامل أو أكثر للتنفيذ. خادم HTTP خفيف الوزن؛ حِمل العمال هو ما يحدد حجم الخادم. خصص عاملًا واحدًا لكل vCPU متاح ونحو 1 إلى 2 غيغابايت RAM لكل عامل Python نشط‎.

التكوين الأدنى والموصى به

  • الحد الأدنى المطلق — 2 vCPU، 4 غيغابايت RAM، 20 غيغابايت SSD؛ مناسب لمساحة عمل فردية بعامل واحد ومهام متقطعة‎.
  • فريق صغير (موصى به) — 4 vCPU، 8 غيغابايت RAM، 40 غيغابايت SSD؛ يدعم 3 عمال متزامنين وPostgreSQL على المضيف ذاته دون ضغط على الذاكرة‎.
  • فريق أو متعدد العملاء — 8 vCPU، 16 غيغابايت RAM، 80 غيغابايت SSD؛ يدعم 6 إلى 8 عمال ومساحات عمل نشطة متعددة‎.
  • نظام التشغيل — Ubuntu 22‎.04 LTS أو Debian 12؛ يلزم Docker Engine 24+ وDocker Compose v2‎.
  • الشبكة — IPv4 مخصصة واسم نطاق لشهادة TLS؛ يكشف Windmill المنفذ 8000 افتراضيًا خلف reverse proxy‎.

النشر بـ Docker Compose في 7 خطوات

  1. تثبيت Docker وDocker Compose v2

    على Ubuntu 22‎.04 أو Debian 12: curl -fsSL https://get‎.docker‎.com | sh && docker compose version. تحقق أن الأمر يعيد Docker Compose version v2‎.x‎.x (بدون شرطة). إن كان النظام يحتوي docker-compose (v1)، أزله: apt remove docker-compose‎.

  2. جلب docker-compose‎.yml الرسمي

    أنشئ مجلدًا مخصصًا وحمّل الإعداد المرجعي: mkdir -p /opt/windmill && cd /opt/windmill && curl -fsSL https://raw‎.githubusercontent‎.com/windmill-labs/windmill/main/docker-compose‎.yml -o docker-compose‎.yml. يعلن هذا الملف أربعة خدمات: db ‏(PostgreSQL 16)، windmill_server، windmill_worker، وlsp (خادم إكمال الكود)‎.

  3. إنشاء ملف ‎.env

    يحتاج Windmill إلى متغيرين إلزاميين. أنشئ مفتاحًا عشوائيًا: openssl rand -hex 32. ثم أنشئ /opt/windmill/‎.env بالمحتوى: WM_BASE_URL=https://windmill‎.your-domain‎.com وWINDMILL_SECRET_KEY=<المفتاح المُنشأ>. لا تُودع هذا الملف أبدًا في Git‎.

  4. ضبط عدد العمال

    يبدأ docker-compose‎.yml افتراضيًا بنسخة واحدة من windmill_worker. لبدء 3: docker compose up -d --scale windmill_worker=3. على VPS بـ 4 vCPU / 8 غيغابايت، 2 أو 3 عمال هو التوازن المثالي‎.

  5. إعداد Nginx كـ reverse proxy مع TLS

    ثبّت Nginx وCertbot: apt install -y nginx certbot python3-certbot-nginx. أنشئ /etc/nginx/sites-available/windmill بكتلة server تستمع على المنفذ 80 مع proxy_pass http://127‎.0‎.0‎.1:8000; وترويسات WebSocket. احصل على الشهادة: certbot --nginx -d windmill‎.your-domain‎.com‎.

  6. تشغيل الـ stack وإنشاء مساحة العمل الأولى

    شغّل الـ stack: cd /opt/windmill && docker compose up -d. انتظر 30 ثانية لجاهزية PostgreSQL، ثم افتح https://windmill‎.your-domain‎.com. تطلب الواجهة إنشاء مساحة عمل — اختر معرّفًا قصيرًا (prod، acme-client) — وتعريف حساب المسؤول‎.

  7. تفعيل إعادة التشغيل التلقائي ومراجعة السجلات

    في docker-compose‎.yml تأكد من أن كل خدمة تحتوي restart: unless-stopped. تحقق من سجلات الخادم: docker compose logs -f windmill_server. السطر Windmill server started on port 8000 يؤكد أن النسخة تعمل‎.

الإعداد: مساحة العمل والمتغيرات السرية والـ Crons

بعد تشغيل النسخة، ثمة ثلاثة محاور إعداد يجب إتقانها قبل إنشاء أول سير عمل‎.

الإعدادات الأساسية بعد التثبيت

  • مساحة العمل والصلاحيات — في Settings → Workspace حدد المنطقة الزمنية (تُستخدم للـ Crons) وفعّل Auto-approve executions فقط إن كان جميع الأعضاء موثوقين‎.
  • المتغيرات والموارد — تخزّن Variables مفاتيح عددية مشفرة. تخزّن Resources كائنات منظمة مع مخطط JSON (اتصالات قواعد البيانات، بيانات OAuth)‎.
  • الجداول الزمنية (Crons) — في محرر السكريبت انقر Add schedule. الصيغة المقبولة هي Cron القياسية بـ 5 حقول. المنطقة الزمنية لمساحة العمل تُطبَّق تلقائيًا‎.
  • الـ Webhooks — كل سكريبت يكشف endpoint بالشكل /api/w/<workspace>/jobs/run/p/<path>. اعتمد التوثيق بـ token مُنشأ من Settings → Tokens‎.
  • مزامنة Git — في Settings → Git Sync اربط مستودع Git لدفع جميع السكريبتات والتدفقات تلقائيًا عند كل تعديل‎.

مثال كامل لسير عمل Python

سكريبت Python ملموس: يستعلم API خارجي، يُصفّي النتائج ويُدرج الصفوف في قاعدة PostgreSQL عبر مورد Windmill. أنشئ سكريبت Python 3‎.11 جديدًا وأدخله مباشرةً من المحرر‎.

سكريبت Python: استيراد API ← تصفية ← PostgreSQL

  • إعلان التبعيات — أسطر # requirements: في رأس السكريبت تخبر Windmill بحزم pip المطلوبة: # requirements:\n# httpx\n# psycopg2-binary‎.
  • توقيع الدالة الرئيسية — Windmill يستدعي دائمًا def main(‎.‎.‎.). المعاملات تُحقن من الواجهة أو الـ Cron أو جسم الـ Webhook‎.
  • استدعاء HTTP بـ httpx — import httpx; resp = httpx‎.get(api_url, timeout=10); resp‎.raise_for_status(); data = resp‎.json(). يلتقط Windmill الاستثناءات غير المعالجة ويعرضها في سجل التنفيذ‎.
  • التصفية والإدراج — rows = [r for r in data if r‎.get('active')]; conn = psycopg2‎.connect(**db); cur‎.executemany('INSERT INTO items(id, name) VALUES ‎.‎.‎.', rows); conn‎.commit(). يُمرَّر المورد db كـ dict بايثون‎.
  • قيمة الإرجاع — return {'inserted': len(rows), 'source': api_url}. القيمة المُرجَعة تظهر في الواجهة ومتاحة للخطوات التالية في Flow‎.

التصليب والأمان

احظر المنفذ 8000 في UFW (ufw deny 8000/tcp) — Nginx وحده يصل إليه عبر localhost. أضف ترويسات الأمان في Nginx: add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff. هيّئ نسخ احتياطية لـ PostgreSQL: docker exec windmill-db-1 pg_dump -U windmill windmill | gzip > /backups/windmill-$(date +%Y%m%d)‎.sql‎.gz. فعّل سياسة كلمة المرور في Settings → Security وفرض 2FA لحسابات المسؤولين‎.

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

إليك أكثر خمسة أخطاء شيوعًا عند أول نشر لـ Windmill، مع أسبابها الحقيقية وحلولها‎.

5 أخطاء حقيقية وحلولها

  • connection refused عند بدء تشغيل الخادم — حاوية windmill_server تبدأ قبل جاهزية PostgreSQL. أضف healthcheck لخدمة db وشرط depends_on: db: condition: service_healthy‎.
  • العمال يبقون IDLE إلى أجل غير مسمى — السبب الكلاسيكي: DATABASE_URL تشير إلى localhost بدلاً من اسم خدمة Docker (db). القيمة الصحيحة: postgresql://windmill:windmill@db/windmill‎.
  • فشل سكريبتات Python بـ ModuleNotFoundError — Windmill يحل تبعيات pip عند التشغيل الأول. إن كان العامل بلا اتصال بالإنترنت، يفشل التثبيت صامتًا. افتح المنفذ 443 الصادر لـ pypi‎.org‎.
  • الـ Webhook يُرجع 403 Forbidden — السكريبت في وضع Require approval. عطّله في محرر السكريبت أو استخدم token خدمة بدور executor‎.
  • Cron لا يُشغَّل في الوقت المتوقع — المنطقة الزمنية لمساحة العمل UTC افتراضيًا. تحقق من الإعداد في Settings → Workspace → Timezone وأعد تشغيل: docker compose restart windmill_server‎.

نحو الإنتاج: قائمة التحقق النهائية

قبل تعريض Windmill لحركة مرور حقيقية أو مهام حرجة، مرّ على هذه القائمة‎.

نقاط التحقق قبل الانتقال للإنتاج

  • TLS صالح وHSTS — تحقق أن https://windmill‎.your-domain‎.com يستجيب دون تحذيرات وأضف Strict-Transport-Security: max-age=31536000‎.
  • نسخ احتياطية مختبرة — اصنع dump لـ PostgreSQL، استعده في حاوية اختبار وتحقق من اتصال الواجهة‎.
  • مراقبة العمال — صفحة Admin → Workers تعرض الحالة في الوقت الفعلي. هيّئ تنبيهًا إن انخفض عدد العمال النشطين دون 1‎.
  • تدوير الأسرار — إن فقدت WINDMILL_SECRET_KEY فالأسرار المشفرة في القاعدة غير قابلة للاسترداد. احفظ المفتاح في مدير أسرار منفصل عن الـ VPS‎.
  • إصدار محدد في docker-compose‎.yml — استبدل :latest بـ :1‎.830‎.0 لتجنب التحديثات التلقائية غير المتحكم بها‎.
  • Git Sync مفعّل — اربط مستودعًا خاصًا لتنسيق جميع سكريبتاتك وتدفقاتك‎.

‏Windmill مقابل n8n مقابل Temporal

مرّر الجدول أفقيًا

المعيارWindmill ‏1.830n8n ‏3.xTemporal (سحابة/ذاتي الاستضافة)
لغة سير العملTypeScript, Python, Go, BashJavaScript (عقد) + Code nodes محدودةGo, Java, Python, TypeScript عبر SDK
نموذج النشرDocker Compose، صورة واحدةDocker إلزامي منذ v3.0Docker أو Temporal Cloud SaaS
الرخصةAGPLv3 (استضافة ذاتية كاملة)Sustainable Use License (قيود على الوكالات)MIT (النواة) + عرض سحابة مدفوع
المتغيرات السرية (ذاتي الاستضافة)مضمّنة، مشفرة AES-256مضمّنةمضمّنة (Temporal Namespace)
محرر ويب مدمجنعم — IDE كامل مع إكمال تلقائينعم — لوحة بصريةلا — تطوير محلي فقط
تعدد المستأجريننعم — مساحات عمل معزولة أصليةجزئي — يُنصح بنسخ منفصلةنعم — Temporal Namespaces
الحد الأدنى من RAM4 غيغابايت (عامل واحد + PostgreSQL)2 غيغابايت (SQLite)، 4 غيغابايت (PostgreSQL)4 غيغابايت (ذاتي) / غير محدد (سحابة)
المدة القصوى لسير العملغير محدودة (مهام طويلة الأمد)محدودة بمهلة العقدةغير محدودة (متانة الأنشطة)
منحنى التعلممنخفض — كود Python/TS قياسيمنخفض — لوحة بصريةمرتفع — نموذج أنشطة/إشارات

VPS جاهز لـ Windmill في دقائق

تقدم ServOrbit خوادم VPS بوصول root وIPv4 مخصصة وخيار Ubuntu/Debian. شغّل stack Windmill بـ Docker Compose منذ أول اتصال SSH.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة