[{"data":1,"prerenderedAt":264},["ShallowReactive",2],{"seo-verification":3,"blog-محرك-سير-العمل-windmill-على-vps-python-typescript-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-محرك-سير-العمل-windmill-على-vps-python-typescript-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":35,"sections":36,"ctaTitle":199,"ctaBody":200,"ctaButton":201,"ctaUrl":202,"relatedPosts":203},438,"محرك-سير-العمل-windmill-على-vps-python-typescript",{"fr":12,"en":13,"ar":10,"es":14},"windmill-workflow-engine-vps","windmill-on-vps-typescriptpython-workflows-without-lock-in","windmill-en-vps-workflows-typescriptpython-sin-dependencias","Windmill على VPS: سير عمل TypeScript\u002FPython بدون قيود","نشر Windmill v1.830 على خادم VPS في أقل من ساعة: سير عمل TypeScript\u002FPython، مهام Cron، Webhooks وواجهة مدمجة، بدون الاعتماد على n8n أو Make.",11,0,false,"2026-10-13T00:00:00+00:00","2026-10-13T14:10:28+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},2,"الأتمتة","automatisation","bg-brand-action\u002F10 text-brand-action",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fwindmill-workflow-engine-vps-poster.svg",{"categorySlug":33,"appSlug":34},"الأتمتة-وسير-العمل","windmill","أصدر n8n الإصدار 3.0 في أكتوبر 2026 وفرض Docker طريقةً وحيدة للنشر، مع إزالة أكثر من 30 عقدة تاريخية. للفرق التي تقيّم البدائل، يبرز Windmill كأقرب خيار: اكتب TypeScript أو Python أصليًا، نفّذ السكريبتات مباشرةً من محرر الويب، ونظّم عشرات العمال على خادم VPS واحد. لا خطة مدفوعة للمتغيرات السرية، لا عقد مملوكة — فقط كود مُصدَر في مساحة عمل مرتبطة بـ Git. يصل هذا الدليل بك إلى نسخة Windmill v1.830 جاهزة للإنتاج في أقل من ساعة.",[37,42,52,56,64,90,94,102,106,114,119,123,131,135,144],{"type":38,"title":39,"body":40,"items":41},"h2","لماذا Windmill بدلاً من n8n أو Make في 2026","يُمثّل n8n ‏3‎.0 منعطفًا حقيقيًا: Docker إلزامي، وحذف أكثر من 30 عقدة، وعقد Code لم تعد تقرأ متغيرات البيئة. يبقى Make خدمةً مغلقة محدودةَ العمليات شهريًا. يسلك Windmill المسار المعاكس: كودك سكريبت من الدرجة الأولى، مُصدَر وقابل للاختبار الوحدوي، ويمكن تشغيله من الطرفية أو الواجهة بالسهولة ذاتها. تضمن رخصة AGPLv3 أن تكون النسخة ذاتية الاستضافة مطابقة وظيفيًا لعرض السحابة — دون ميزات حصرية للمؤسسات في الاستخدام اليومي‎.",[],{"type":43,"title":44,"items":45},"ul","فوائد ملموسة لفرق DevOps والوكالات",[46,47,48,49,50,51],"**TypeScript وPython أصليان** — تعمل السكريبتات في عامل Node‎.js أو Python دون تحويل أو طبقات وسيطة؛ تُحلَّل تبعيات npm\u002Fpip تلقائيًا عند أول تنفيذ‎.","**محرر ويب مع تنفيذ مباشر** — اكتب واختبر وأعد تشغيل سكريبت من المتصفح في ثوانٍ، دون دفع commit أو إعادة تشغيل أي خدمة‎.","**تعدد المستأجرين مدمج** — يدعم نشر واحد مساحات عمل معزولة متعددة، مثالي لوكالة تدير عدة عملاء أو فريق لديه بيئات dev\u002Fstaging\u002Fprod‎.","**مهام Cron والـ Webhooks دون إضافات** — جدولة مهمة بـ `0 9 * * 1-5` أو كشف endpoint webhook هو عملية أصلية، وليست إضافة‎.","**متغيرات سرية مشفرة** — الأسرار مشفرة بـ AES-256 في القاعدة ولا تظهر في السجلات؛ لكل مساحة عمل نطاق أسرار خاص‎.","**لا قيود على البائع** — جميع السكريبتات والتدفقات والموارد قابلة للتصدير بصيغة JSON\u002FYAML والاستيراد في أي نشر Windmill آخر‎.",{"type":38,"title":53,"body":54,"items":55},"المتطلبات الدنيا بالأرقام","يعتمد Windmill على PostgreSQL للتخزين وعلى عامل أو أكثر للتنفيذ. خادم HTTP خفيف الوزن؛ حِمل العمال هو ما يحدد حجم الخادم. خصص عاملًا واحدًا لكل vCPU متاح ونحو 1 إلى 2 غيغابايت RAM لكل عامل Python نشط‎.",[],{"type":43,"title":57,"items":58},"التكوين الأدنى والموصى به",[59,60,61,62,63],"**الحد الأدنى المطلق** — 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‎.",{"type":65,"title":66,"steps":67,"items":89},"steps","النشر بـ Docker Compose في 7 خطوات",[68,71,74,77,80,83,86],{"title":69,"body":70},"تثبيت Docker وDocker Compose v2","على Ubuntu 22‎.04 أو Debian 12: `curl -fsSL https:\u002F\u002Fget‎.docker‎.com | sh && docker compose version`. تحقق أن الأمر يعيد `Docker Compose version v2‎.x‎.x` (بدون شرطة). إن كان النظام يحتوي `docker-compose` (v1)، أزله: `apt remove docker-compose`‎.",{"title":72,"body":73},"جلب docker-compose‎.yml الرسمي","أنشئ مجلدًا مخصصًا وحمّل الإعداد المرجعي: `mkdir -p \u002Fopt\u002Fwindmill && cd \u002Fopt\u002Fwindmill && curl -fsSL https:\u002F\u002Fraw‎.githubusercontent‎.com\u002Fwindmill-labs\u002Fwindmill\u002Fmain\u002Fdocker-compose‎.yml -o docker-compose‎.yml`. يعلن هذا الملف أربعة خدمات: `db` ‏(PostgreSQL 16)، `windmill_server`، `windmill_worker`، و`lsp` (خادم إكمال الكود)‎.",{"title":75,"body":76},"إنشاء ملف ‎.env","يحتاج Windmill إلى متغيرين إلزاميين. أنشئ مفتاحًا عشوائيًا: `openssl rand -hex 32`. ثم أنشئ `\u002Fopt\u002Fwindmill\u002F‎.env` بالمحتوى: `WM_BASE_URL=https:\u002F\u002Fwindmill‎.your-domain‎.com` و`WINDMILL_SECRET_KEY=\u003Cالمفتاح المُنشأ>`. لا تُودع هذا الملف أبدًا في Git‎.",{"title":78,"body":79},"ضبط عدد العمال","يبدأ `docker-compose‎.yml` افتراضيًا بنسخة واحدة من `windmill_worker`. لبدء 3: `docker compose up -d --scale windmill_worker=3`. على VPS بـ 4 vCPU \u002F 8 غيغابايت، 2 أو 3 عمال هو التوازن المثالي‎.",{"title":81,"body":82},"إعداد Nginx كـ reverse proxy مع TLS","ثبّت Nginx وCertbot: `apt install -y nginx certbot python3-certbot-nginx`. أنشئ `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fwindmill` بكتلة `server` تستمع على المنفذ 80 مع `proxy_pass http:\u002F\u002F127‎.0‎.0‎.1:8000;` وترويسات WebSocket. احصل على الشهادة: `certbot --nginx -d windmill‎.your-domain‎.com`‎.",{"title":84,"body":85},"تشغيل الـ stack وإنشاء مساحة العمل الأولى","شغّل الـ stack: `cd \u002Fopt\u002Fwindmill && docker compose up -d`. انتظر 30 ثانية لجاهزية PostgreSQL، ثم افتح `https:\u002F\u002Fwindmill‎.your-domain‎.com`. تطلب الواجهة إنشاء مساحة عمل — اختر معرّفًا قصيرًا (`prod`، `acme-client`) — وتعريف حساب المسؤول‎.",{"title":87,"body":88},"تفعيل إعادة التشغيل التلقائي ومراجعة السجلات","في `docker-compose‎.yml` تأكد من أن كل خدمة تحتوي `restart: unless-stopped`. تحقق من سجلات الخادم: `docker compose logs -f windmill_server`. السطر `Windmill server started on port 8000` يؤكد أن النسخة تعمل‎.",[],{"type":38,"title":91,"body":92,"items":93},"الإعداد: مساحة العمل والمتغيرات السرية والـ Crons","بعد تشغيل النسخة، ثمة ثلاثة محاور إعداد يجب إتقانها قبل إنشاء أول سير عمل‎.",[],{"type":43,"title":95,"items":96},"الإعدادات الأساسية بعد التثبيت",[97,98,99,100,101],"**مساحة العمل والصلاحيات** — في `Settings → Workspace` حدد المنطقة الزمنية (تُستخدم للـ Crons) وفعّل `Auto-approve executions` فقط إن كان جميع الأعضاء موثوقين‎.","**المتغيرات والموارد** — تخزّن `Variables` مفاتيح عددية مشفرة. تخزّن `Resources` كائنات منظمة مع مخطط JSON (اتصالات قواعد البيانات، بيانات OAuth)‎.","**الجداول الزمنية (Crons)** — في محرر السكريبت انقر `Add schedule`. الصيغة المقبولة هي Cron القياسية بـ 5 حقول. المنطقة الزمنية لمساحة العمل تُطبَّق تلقائيًا‎.","**الـ Webhooks** — كل سكريبت يكشف endpoint بالشكل `\u002Fapi\u002Fw\u002F\u003Cworkspace>\u002Fjobs\u002Frun\u002Fp\u002F\u003Cpath>`. اعتمد التوثيق بـ token مُنشأ من `Settings → Tokens`‎.","**مزامنة Git** — في `Settings → Git Sync` اربط مستودع Git لدفع جميع السكريبتات والتدفقات تلقائيًا عند كل تعديل‎.",{"type":38,"title":103,"body":104,"items":105},"مثال كامل لسير عمل Python","سكريبت Python ملموس: يستعلم API خارجي، يُصفّي النتائج ويُدرج الصفوف في قاعدة PostgreSQL عبر مورد Windmill. أنشئ سكريبت Python 3‎.11 جديدًا وأدخله مباشرةً من المحرر‎.",[],{"type":43,"title":107,"items":108},"سكريبت Python: استيراد API ← تصفية ← PostgreSQL",[109,110,111,112,113],"**إعلان التبعيات** — أسطر `# 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‎.",{"type":115,"title":116,"body":117,"items":118},"tip","التصليب والأمان","احظر المنفذ 8000 في UFW (`ufw deny 8000\u002Ftcp`) — 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 > \u002Fbackups\u002Fwindmill-$(date +%Y%m%d)‎.sql‎.gz`. فعّل سياسة كلمة المرور في `Settings → Security` وفرض 2FA لحسابات المسؤولين‎.",[],{"type":38,"title":120,"body":121,"items":122},"استكشاف الأخطاء — الأخطاء الشائعة","إليك أكثر خمسة أخطاء شيوعًا عند أول نشر لـ Windmill، مع أسبابها الحقيقية وحلولها‎.",[],{"type":43,"title":124,"items":125},"5 أخطاء حقيقية وحلولها",[126,127,128,129,130],"**`connection refused` عند بدء تشغيل الخادم** — حاوية `windmill_server` تبدأ قبل جاهزية PostgreSQL. أضف `healthcheck` لخدمة `db` وشرط `depends_on: db: condition: service_healthy`‎.","**العمال يبقون `IDLE` إلى أجل غير مسمى** — السبب الكلاسيكي: `DATABASE_URL` تشير إلى `localhost` بدلاً من اسم خدمة Docker (`db`). القيمة الصحيحة: `postgresql:\u002F\u002Fwindmill:windmill@db\u002Fwindmill`‎.","**فشل سكريبتات Python بـ `ModuleNotFoundError`** — Windmill يحل تبعيات pip عند التشغيل الأول. إن كان العامل بلا اتصال بالإنترنت، يفشل التثبيت صامتًا. افتح المنفذ 443 الصادر لـ `pypi‎.org`‎.","**الـ Webhook يُرجع 403 Forbidden** — السكريبت في وضع `Require approval`. عطّله في محرر السكريبت أو استخدم token خدمة بدور `executor`‎.","**Cron لا يُشغَّل في الوقت المتوقع** — المنطقة الزمنية لمساحة العمل UTC افتراضيًا. تحقق من الإعداد في `Settings → Workspace → Timezone` وأعد تشغيل: `docker compose restart windmill_server`‎.",{"type":38,"title":132,"body":133,"items":134},"نحو الإنتاج: قائمة التحقق النهائية","قبل تعريض Windmill لحركة مرور حقيقية أو مهام حرجة، مرّ على هذه القائمة‎.",[],{"type":43,"title":136,"items":137},"نقاط التحقق قبل الانتقال للإنتاج",[138,139,140,141,142,143],"**TLS صالح وHSTS** — تحقق أن `https:\u002F\u002Fwindmill‎.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 مفعّل** — اربط مستودعًا خاصًا لتنسيق جميع سكريبتاتك وتدفقاتك‎.",{"type":145,"title":146,"headers":147,"rows":152,"items":198},"comparison","‏Windmill مقابل n8n مقابل Temporal",[148,149,150,151],"المعيار","Windmill ‏1.830","n8n ‏3.x","Temporal (سحابة\u002Fذاتي الاستضافة)",[153,158,163,168,173,178,183,188,193],[154,155,156,157],"لغة سير العمل","TypeScript, Python, Go, Bash","JavaScript (عقد) + Code nodes محدودة","Go, Java, Python, TypeScript عبر SDK",[159,160,161,162],"نموذج النشر","Docker Compose، صورة واحدة","Docker إلزامي منذ v3.0","Docker أو Temporal Cloud SaaS",[164,165,166,167],"الرخصة","AGPLv3 (استضافة ذاتية كاملة)","Sustainable Use License (قيود على الوكالات)","MIT (النواة) + عرض سحابة مدفوع",[169,170,171,172],"المتغيرات السرية (ذاتي الاستضافة)","مضمّنة، مشفرة AES-256","مضمّنة","مضمّنة (Temporal Namespace)",[174,175,176,177],"محرر ويب مدمج","نعم — IDE كامل مع إكمال تلقائي","نعم — لوحة بصرية","لا — تطوير محلي فقط",[179,180,181,182],"تعدد المستأجرين","نعم — مساحات عمل معزولة أصلية","جزئي — يُنصح بنسخ منفصلة","نعم — Temporal Namespaces",[184,185,186,187],"الحد الأدنى من RAM","4 غيغابايت (عامل واحد + PostgreSQL)","2 غيغابايت (SQLite)، 4 غيغابايت (PostgreSQL)","4 غيغابايت (ذاتي) \u002F غير محدد (سحابة)",[189,190,191,192],"المدة القصوى لسير العمل","غير محدودة (مهام طويلة الأمد)","محدودة بمهلة العقدة","غير محدودة (متانة الأنشطة)",[194,195,196,197],"منحنى التعلم","منخفض — كود Python\u002FTS قياسي","منخفض — لوحة بصرية","مرتفع — نموذج أنشطة\u002Fإشارات",[],"VPS جاهز لـ Windmill في دقائق","تقدم ServOrbit خوادم VPS بوصول root وIPv4 مخصصة وخيار Ubuntu\u002FDebian. شغّل stack Windmill بـ Docker Compose منذ أول اتصال SSH.","نشر Windmill على VPS ServOrbit","\u002Fmarketplace\u002Fالأتمتة-وسير-العمل\u002Fwindmill",[204,222,246],{"id":205,"slug":206,"slugs":207,"title":211,"excerpt":212,"readTime":213,"views":23,"isPinned":19,"publishedAt":214,"updatedAt":215,"category":216,"categories":217,"featuredImage":29,"bgImage":30,"posterImage":219,"relatedSolution":220},3,"تثبيت-n8n-على-vps-مع-docker-دليل-شامل-2026",{"fr":208,"en":209,"ar":206,"es":210},"installer-n8n-vps","install-n8n-on-vps-with-docker-complete-2026-guide","instalar-n8n-en-vps-con-docker","تثبيت n8n على VPS مع Docker: دليل شامل 2026","انشر n8n على VPS مع Docker والوكيل العكسي وHTTPS. يشمل عطل V8، خطأ 502، الانتقال من npm وأمان التنفيذ (تنبيه GHSA-vrv8-j27g-g7cr، أغسطس 2026).",16,"2026-06-05T00:00:00+00:00","2026-09-23T15:23:17+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[218],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-n8n-vps-poster.svg",{"categorySlug":33,"appSlug":221},"n8n",{"id":223,"slug":224,"slugs":225,"title":229,"excerpt":230,"readTime":231,"views":18,"isPinned":19,"publishedAt":232,"updatedAt":233,"category":234,"categories":240,"featuredImage":29,"bgImage":30,"posterImage":242,"relatedSolution":243},359,"بيئة-ذكاء-اصطناعي-ذاتية-الاستضافة-vps",{"fr":226,"en":227,"ar":224,"es":228},"construire-stack-ia-open-source-vps","open-source-ai-stack-vps-ollama-openwebui-n8n","stack-ia-open-source-vps-ollama-openwebui-n8n","بيئة ذكاء اصطناعي ذاتية الاستضافة: Ollama و Open WebUI و n8n","جمِّع ‏Ollama و‏Open WebUI و‏n8n على خادم VPS واحد: محرّك LLM محلي وواجهة دردشة وأتمتة، باستضافة ذاتية 100٪ دون أي API سحابي.",8,"2026-09-18T00:00:00+00:00","2026-09-21T15:22:03+00:00",{"id":235,"name":236,"slug":237,"color":238,"icon":239},1,"الذكاء الاصطناعي","intelligence-artificielle","bg-purple-500\u002F10 text-purple-400","ia",[241],{"id":235,"name":236,"slug":237,"color":238,"icon":239},"\u002Fblog\u002Fcovers\u002Fconstruire-stack-ia-open-source-vps-poster.svg",{"categorySlug":244,"appSlug":245},"الذكاء-الاصطناعي","open-webui",{"id":247,"slug":248,"slugs":249,"title":252,"excerpt":253,"readTime":17,"views":18,"isPinned":19,"publishedAt":254,"updatedAt":21,"category":255,"categories":261,"featuredImage":29,"bgImage":30,"posterImage":263,"relatedSolution":29},436,"laravel-octane-على-vps-frankenphp-docker-traefik",{"fr":250,"en":251,"ar":248,"es":251},"deployer-laravel-vps-octane","laravel-octane-vps-frankenphp-docker-traefik","‎Laravel Octane على ‎VPS: ‎FrankenPHP و‎Docker و‎Traefik","الانتقال من ‎PHP-FPM إلى ‎Laravel Octane مع ‎FrankenPHP في ‎Docker Compose خلف ‎Traefik، وفهم تغييرات دورة حياة الطلبات لتجنب تسريبات الذاكرة في الإنتاج.","2026-10-12T00:00:00+00:00",{"id":256,"name":257,"slug":258,"color":259,"icon":260},4,"التطوير","developpement","bg-warning\u002F10 text-warning","dev",[262],{"id":256,"name":257,"slug":258,"color":259,"icon":260},"\u002Fblog\u002Fcovers\u002Fdeployer-laravel-vps-octane-poster.svg",1791900903184]