[{"data":1,"prerenderedAt":194},["ShallowReactive",2],{"seo-verification":3,"blog-استضافة-marimo-على-vps-دفاتر-python-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-استضافة-marimo-على-vps-دفاتر-python-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":131,"ctaBody":132,"ctaButton":133,"ctaUrl":134,"relatedPosts":135},552,"استضافة-marimo-على-vps-دفاتر-python",{"fr":12,"en":13,"ar":10,"es":14},"self-host-marimo-vps","self-host-marimo-vps-python-notebooks","autoalojar-marimo-vps-notebooks-python","marimo على VPS: دفاتر Python تفاعلية مستضافة ذاتيًا","ثبّت marimo على خادم افتراضي: دفاتر Python تفاعلية محفوظة كملفات ‎.py، ومحرّر ويب محمي بكلمة مرور، مع pandas وpolars مضمّنة.",8,0,false,"2026-11-01T00:00:00+00:00","2026-11-01T14:14:31+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"الاستضافة الذاتية","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-marimo-vps-poster.svg",{"categorySlug":34,"appSlug":35},"التطوير","marimo","دفتر Jupyter ظلّ يعمل طوال فترة بعد الظهر كثيرًا ما ينتهي إلى الكذب: خلية عُدّلت، وأخرى لم يُعد تشغيلها، والمخطط على الشاشة لم يعد يطابق الشيفرة. يعالج marimo هذه المشكلة من جذورها. هذا الدفتر المفتوح المصدر للغة Python (رخصة Apache-2.0) يحفظ كل دفتر في ملف ‎.py عادي، ويعيد تلقائيًا تشغيل الخلايا التي تعتمد على الخلية التي تعدّلها. يثبّته هذا الدليل باستخدام Docker Compose على خادم افتراضي، ويحمي المحرّر بكلمة مرور، وينشره عبر HTTPS خلف nginx، ثم يبيّن كيف تحوّل دفترًا إلى تطبيق صغير.",[38,42,52,84,87,103,107,110,113,116,119,122,125,128],{"type":39,"title":40,"body":41},"h2","لماذا دفتر تفاعلي على خادمك الخاص","في Jupyter يتوقف ترتيب التنفيذ على نقراتك: متغيّر أُعيد تعريفه في الأسفل، أو خلية منسية، فلا تعود النتائج المعروضة تطابق الشيفرة. وملف ‎.ipynb، وهو JSON مثقل بالمخرجات، صعب المراجعة ويولّد تعارضات في Git مع كل تشغيل.\n\nيحلّل marimo الاعتماديات بين الخلايا. عندما تتغيّر خلية تُعاد حساب كل الخلايا التي تعتمد عليها، وهي وحدها. والدفتر ملف Python عادي: يقرؤه `git diff` ويشغّله `python notebook.py`.\n\nاستضافته على خادمك الافتراضي تعني إبقاء البيانات على خادم تتحكّم فيه، ومنح الفريق كله البيئة نفسها من المتصفح، واختيار الذاكرة والمعالج اللذين تحتاجهما حساباتك.",{"type":43,"title":44,"items":45},"ul","ما يقدّمه marimo",[46,47,48,49,50,51],"**تنفيذ تفاعلي** — الخلية المعدّلة تعيد حساب الخلايا التي تعتمد عليها، دون حالة مخفية.","**ملفات ‎.py** — دفاتر مقروءة، تُصدَّر في Git وتُشغَّل كسكربتات.","**عناصر واجهة** — منزلقات وقوائم وجداول ومخططات مرتبطة بمتغيّرات Python.","**من دفتر إلى تطبيق** — `marimo run` يقدّم الدفتر للقراءة فقط مع إخفاء الشيفرة.","**الانتقال من Jupyter** — `marimo convert` يحوّل ملف ‎.ipynb.","**صورة «data» الرسمية** — pandas وpolars وnumpy وaltair مثبّتة مسبقًا.",{"type":53,"title":54,"headers":55,"rows":58},"comparison","marimo وJupyter وcode-server",[5,35,56,57],"JupyterLab","code-server",[59,64,69,74,79],[60,61,62,63],"صيغة الدفتر","ملف ‎.py","ملف ‎.ipynb ‏(JSON)","ملفات المشروع",[65,66,67,68],"ترتيب التنفيذ","تفاعلي، حسب الاعتماديات","يدوي، بالنقر","حسب السكربت المشغَّل",[70,71,72,73],"المراجعة في Git","فرق Python مقروء","فرق JSON مع المخرجات","فرق الشيفرة",[75,76,77,78],"النشر كتطبيق","نعم، `marimo run`","إضافات من أطراف أخرى","لا",[80,81,82,83],"الاستخدام الأمثل","التحليل والأدوات الداخلية بلغة Python","تنوّع واسع في النوى","تطوير البرمجيات الكامل",{"type":39,"title":85,"body":86},"المتطلبات","خادم افتراضي Ubuntu 24.04 بذاكرة 2 غيغابايت وقرص 20 غيغابايت (خطّط لذاكرة أكبر إن كنت تحمّل مجموعات بيانات كبيرة)، مع Docker وإضافة Compose، ووصول root عبر SSH. نطاق فرعي (مثل notebooks.example.com) يشير إلى الخادم مفيد للوصول عبر HTTPS لكنه ليس ضروريًا: يكفي نفق SSH إذا كنت تعمل وحدك.",{"type":88,"title":89,"steps":90},"steps","تثبيت marimo باستخدام Docker Compose",[91,94,97,100],{"title":92,"body":93},"تحضير المجلد وكلمة المرور","أنشئ مجلد التطبيق وملف `.env` يحمل كلمة مرور المحرّر.\n```bash\nmkdir -p \u002Fopt\u002Fmarimo && cd \u002Fopt\u002Fmarimo\necho \"ADMIN_PASSWORD=$(openssl rand -base64 24 | tr -d '\u002F+=')\" > .env\nchmod 600 .env\n```",{"title":95,"body":96},"كتابة ملف compose","أنشئ `compose.yaml`. تحتوي صورة «data» الرسمية مسبقًا على مكتبات التحليل. يُنشر المنفذ على الواجهة المحلية فقط، وتُمرَّر كلمة المرور عبر ملف بدلًا من سطر الأوامر.\n```yaml\nservices:\n  marimo:\n    image: ghcr.io\u002Fmarimo-team\u002Fmarimo:0.25.2-data\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:2718:8080\"\n    environment:\n      ADMIN_PASSWORD: ${ADMIN_PASSWORD:?ADMIN_PASSWORD requis}\n    command:\n      - sh\n      - -c\n      - umask 077 && printf %s \"$$ADMIN_PASSWORD\" > \u002Ftmp\u002Fmarimo-password && exec marimo edit --headless --skip-update-check --host 0.0.0.0 -p 8080 --token-password-file \u002Ftmp\u002Fmarimo-password \u002Fapp\n    volumes:\n      - marimo-data:\u002Fapp\nvolumes:\n  marimo-data: {}\n```",{"title":98,"body":99},"التشغيل والتحقق","شغّل الحزمة ثم استعلم عن مسبار الصحة: يجب أن يجيب بالرمز 200.\n```bash\ndocker compose up -d\ndocker compose ps\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' http:\u002F\u002F127.0.0.1:2718\u002Fhealth\n```",{"title":101,"body":102},"نشر المحرّر عبر HTTPS","يتواصل marimo مع المتصفح عبر WebSocket: يجب أن يمرّر مضيف nginx الترويستين `Upgrade` و`Connection`، وإلا ظهر المحرّر دون أن تُنفَّذ الخلايا أبدًا.\n```nginx\nserver {\n    server_name notebooks.example.com;\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:2718;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n        proxy_read_timeout 3600s;\n    }\n}\n```\n\n```bash\ncertbot --nginx -d notebooks.example.com\n```",{"type":104,"title":105,"body":106},"tip","لا نطاق لديك؟ استخدم نفق SSH","ينفّذ المحرّر شيفرة Python بصلاحيات الحاوية: لا تعرضه أبدًا دون كلمة مرور. إن كنت تعمل وحدك فلا حاجة لنشره — نفق SSH يفتح المحرّر على http:\u002F\u002Flocalhost:2718 من جهازك.\n```bash\nssh -L 2718:127.0.0.1:2718 root@\u003Cvps-ip>\n```",{"type":39,"title":108,"body":109},"تأمين المحرّر","محرّر marimo المفتوح يتيح لكل من يدخله تنفيذ شيفرة Python على خادمك: تلك غايته، ولذلك تفرض بعض القواعد البسيطة نفسها.\n\n**كلمة مرور طويلة وفريدة.** كلمة المرور في ملف `.env` عشوائية؛ لا تستبدلها بكلمة مرور تستخدمها في مكان آخر، وغيّرها عندما يغادر المشروع متعاون يعرفها (عدّل `.env` ثم شغّل `docker compose up -d`).\n\n**منفذ يبقى محليًا.** ينشر ملف compose المنفذ على `127.0.0.1` فقط: من الإنترنت لا يصل إليه سوى nginx عبر HTTPS. لا تستبدل هذا العنوان أبدًا بـ `0.0.0.0`.\n\n**لا أسرار مكشوفة في الدفاتر.** الدفتر ملف Python مُصدَّر: مفتاح API مكتوب في خلية ينتهي في سجل Git. اقرأه بدلًا من ذلك من متغيّر بيئة تضيفه إلى ملف compose، أو من ملف خارج المستودع.\n\n**سجلات تستحق المراقبة.** عند الإقلاع يطبع marimo عنوان الوصول في `docker compose logs` مع كلمة المرور: يبقى السجل على خادمك، لكن لا تلصقه كما هو في تذكرة أو محادثة.",{"type":39,"title":111,"body":112},"دفترك التفاعلي الأول","سجّل الدخول بكلمة المرور الموجودة في ملف `.env`. يفتح المحرّر المجلد `\u002Fapp` الذي يحتوي مسبقًا على الدروس الرسمية. أنشئ دفترًا بخليتين: الأولى تعرّف منزلقًا، والثانية ترشّح ملف CSV بقيمته. حرّك المنزلق: تُعاد حساب الخلية الثانية من تلقاء نفسها.\n\n```python\nimport marimo as mo\nimport polars as pl\n\nthreshold = mo.ui.slider(0, 1000, value=100, label=\"Minimum amount\")\nthreshold\n```\n\n```python\nsales = pl.read_csv(\"data\u002Fsales.csv\")\nsales.filter(pl.col(\"amount\") >= threshold.value)\n```",{"type":39,"title":114,"body":115},"قراءة بياناتك: CSV وParquet وواجهات API","تغطي صورة «data» معظم أعمال التحليل دون تثبيت أي شيء. تقرأ pandas ملفات CSV وExcel وJSON؛ وتقرأ polars ملفات CSV وParquet بسرعة كبيرة ويمكنها معالجة ملفات أكبر من الذاكرة في الوضع الكسول؛ وترسم altair مخططات تفاعلية تظهر مباشرة تحت الخلية.\n\nضع ملفاتك في المجلد `\u002Fapp\u002Fdata` من وحدة التخزين، عبر `scp` إلى الخادم ثم `docker compose cp`، أو ارفعها من لوحة الملفات في المحرّر. ولواجهة API تكفي مكتبة Python القياسية لتنزيل JSON تحوّله pandas أو polars بعد ذلك إلى جدول.\n\nكل نتيجة خلية كائن حيّ: يظهر DataFrame كجدول قابل للفرز والترشيح، ويمكن للتحديد الذي تجريه في جدول أو مخطط أن يغذّي الخلية التالية. هذه الآلية هي ما يحوّل الاستكشاف إلى أداة قابلة لإعادة الاستخدام.",{"type":39,"title":117,"body":118},"تحويل دفتر إلى تطبيق","الدفتر المزوّد بعناصر واجهة هو تطبيق أصلًا. الأمر `marimo run` يقدّمه للقراءة فقط: يستعمل الزوار المنزلقات والقوائم دون رؤية الشيفرة أو تعديلها. انشر هذا المنفذ الثاني خلف مضيفه الخاص، محميًا مثل المحرّر.\n\n```bash\ndocker compose exec marimo marimo run \u002Fapp\u002Frapport.py --host 0.0.0.0 -p 8081\n```\n\nتتحوّل دفاتر Jupyter الحالية بأمر واحد؛ راجع بعدها الخلايا التي كانت تعيد تعريف المتغيّر نفسه، وهو ما يرفضه marimo عن قصد.\n\n```bash\ndocker compose exec marimo marimo convert \u002Fapp\u002Fold.ipynb -o \u002Fapp\u002Fnew.py\n```",{"type":39,"title":120,"body":121},"العمل الجماعي على الدفاتر نفسها","خادم marimo محرّر مشترك: كل من يملك كلمة المرور يرى الملفات نفسها. للفريق الصغير، أبسط قاعدة هي دفتر لكل شخص ولكل موضوع، ومستودع Git في `\u002Fapp` للاحتفاظ بالسجل.\n\nولأن كل دفتر ملف Python، تنطبق أدوات المطوّر المعتادة: يبيّن `git diff` بدقة أي خلية تغيّرت، وتُراجَع طلبات الدمج كما تُراجَع الشيفرة، ويعمل عليه مدقّق Python أو أداة تنسيق دون تعديل. بل يمكن استيراد الدفتر كوحدة أو تشغيله كسكربت من مهمة مجدولة لإنتاج التقرير نفسه كل ليلة.",{"type":39,"title":123,"body":124},"تحديد حجم الخادم الافتراضي","marimo نفسه خفيف؛ بياناتك هي التي تحدّد حجم الخادم. احسب 2 غيغابايت من الذاكرة لاستكشاف ملفات من بضع مئات من الميغابايت باستخدام pandas، وانتقل إلى 4 أو 8 غيغابايت إن كنت تحمّل مجموعات بيانات أكبر أو يعمل عدة أشخاص في الوقت نفسه. يهمّ المعالج خصوصًا في الحسابات الثقيلة: تستغل polars كل الأنوية المتاحة. وأخيرًا خصّص مساحة قرص كافية للصورة (نحو 400 ميغابايت) ولملفات بياناتك التي تكبر أسرع من الدفاتر.",{"type":39,"title":126,"body":127},"النسخ الاحتياطي والتحديث","تعيش الدفاتر في وحدة التخزين `marimo-data`. الخيار الأكثر أمانًا هو إصدار `\u002Fapp` في مستودع Git؛ وإلا فأرشف وحدة التخزين بانتظام.\n\n```bash\ndocker run --rm -v marimo_marimo-data:\u002Fdata -v \"$PWD\":\u002Fbackup alpine \\\n  tar czf \u002Fbackup\u002Fmarimo-$(date +%F).tar.gz -C \u002Fdata .\n```\n\nللتحديث، غيّر وسم الصورة في `compose.yaml` بعد قراءة ملاحظات إصدار المشروع، ثم شغّل `docker compose pull && docker compose up -d`. لا تُمسّ الدفاتر، فهي ملفات ‎.py عادية.",{"type":39,"title":129,"body":130},"تثبيت بنقرة واحدة من متجر ServOrbit","على خادم ServOrbit الافتراضي يُثبَّت marimo من المتجر في مساحة العميل: ينشر السكربت الحاوية الرسمية، ويولّد كلمة مرور المحرّر، وينشئ وحدة تخزين الدفاتر. تظهر كلمة المرور في مساحة العميل. اربط نطاقًا فرعيًا من أحد نطاقاتك، أو النطاق الفرعي المجاني للخادم، لفتح المحرّر عبر HTTPS؛ ومن دون نطاق يعمل نفق SSH الموصوف أعلاه كما هو، مع المنفذ الظاهر في مساحة العميل.","دفاتر Python الخاصة بك، على خادمك","يكفي خادم ServOrbit افتراضي Ubuntu 24.04 بذاكرة 2 غيغابايت لتشغيل marimo. تثبيت بنقرة واحدة من المتجر، وكلمة مرور تُولَّد لك، وHTTPS على نطاقك أو على النطاق الفرعي المجاني للخادم.","اكتشف marimo","\u002Fmarketplace\u002Fالتطوير\u002Fmarimo",[136,157,176],{"id":137,"slug":138,"slugs":139,"title":143,"excerpt":144,"readTime":145,"views":23,"isPinned":19,"publishedAt":146,"updatedAt":147,"category":148,"categories":153,"featuredImage":30,"bgImage":31,"posterImage":155,"relatedSolution":156},301,"تثبيت-code-server-vps",{"fr":140,"en":141,"ar":138,"es":142},"installer-code-server-vps","install-code-server-vps","instalar-code-server-vps","Code Server على VPS: VS Code في متصفحك","Code Server (MIT، 79 ألف نجمة): شغّل VS Code في متصفحك على VPS — مساحة عمل دائمة، محمية بكلمة مرور.",3,"2026-08-24T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":149,"name":34,"slug":150,"color":151,"icon":152},4,"developpement","bg-warning\u002F10 text-warning","dev",[154],{"id":149,"name":34,"slug":150,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Finstaller-code-server-vps-poster.svg",{"categorySlug":34,"appSlug":57},{"id":158,"slug":159,"slugs":160,"title":164,"excerpt":165,"readTime":166,"views":149,"isPinned":19,"publishedAt":167,"updatedAt":168,"category":169,"categories":170,"featuredImage":30,"bgImage":31,"posterImage":172,"relatedSolution":173},168,"استضافة-metabase-على-vps-لوحات-ذكاء-أعمال-مفتوحة-المصدر",{"fr":161,"en":162,"ar":159,"es":163},"self-host-metabase-vps","how-to-self-host-metabase-on-a-vps-open-source-bi-dashboards","alojar-metabase-en-un-vps","استضافة Metabase على VPS: لوحات ذكاء أعمال مفتوحة المصدر","انشر ‎Metabase‎ على خادم ‎VPS‎: اربط أي قاعدة ‎SQL‎ وابنِ اللوحات والرسوم البيانية في المتصفح، مع قاعدة ‎Postgres‎ مرافقة، على بنية تحتية تتحكم فيها.",9,"2026-07-06T00:00:00+00:00","2026-10-20T23:18:08+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[171],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-metabase-vps-poster.svg",{"categorySlug":174,"appSlug":175},"قواعد-البيانات","metabase",{"id":177,"slug":178,"slugs":179,"title":183,"excerpt":184,"readTime":185,"views":149,"isPinned":19,"publishedAt":186,"updatedAt":187,"category":188,"categories":189,"featuredImage":30,"bgImage":31,"posterImage":191,"relatedSolution":192},45,"نشر-تطبيق-fastapi-على-vps",{"fr":180,"en":181,"ar":178,"es":182},"deployer-fastapi-vps","deploy-a-fastapi-application-on-a-vps","desplegar-una-aplicacion-fastapi-en-un-vps","نشر FastAPI على VPS: الدليل الكامل للإنتاج","انشر FastAPI على VPS مع Docker متعدد المراحل وGunicorn وPostgreSQL وCI\u002FCD وMониторинг. دليل Python شامل للإنتاج 2025.",10,"2026-05-06T00:00:00+00:00","2026-10-07T23:07:24+00:00",{"id":149,"name":34,"slug":150,"color":151,"icon":152},[190],{"id":149,"name":34,"slug":150,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Fdeployer-fastapi-vps-poster.svg",{"categorySlug":34,"appSlug":193},"fastapi",1793542750274]