[{"data":1,"prerenderedAt":190},["ShallowReactive",2],{"seo-verification":3,"blog-استضافة-grist-على-vps-بديل-airtable-مفتوح-المصدر-ma-ar":6,"promo-bar-likely":157},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-استضافة-grist-على-vps-بديل-airtable-مفتوح-المصدر-ma-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":35,"sections":36,"ctaTitle":125,"ctaBody":126,"ctaButton":127,"ctaUrl":128,"relatedPosts":129},218,"استضافة-grist-على-vps-بديل-airtable-مفتوح-المصدر",{"fr":12,"en":13,"ar":10,"es":14},"self-host-grist-vps","self-hosting-grist-on-a-vps-open-source-airtable-alternative","alojar-grist-en-un-vps-alternativa-a-airtable","استضافة Grist على VPS: بديل Airtable مفتوح المصدر","انشر Grist v1.7.20 على VPS: Docker Compose، nginx HTTPS، صيغ Python، OIDC SSO، نسخ احتياطية تلقائية — بديل مفتوح المصدر لـ Airtable.",7,3,false,"2026-08-04T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},"الاستضافة الذاتية","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[28],{"id":17,"name":23,"slug":24,"color":25,"icon":26},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-grist-vps-poster.svg",{"categorySlug":33,"appSlug":34},"التطوير","grist","Google Sheets يخزن القوائم. Airtable يضيف العلاقات بين الجداول لكن بـ 20 دولاراً للمستخدم شهرياً. Grist يجمع الاثنين، مفتوح المصدر، على خادمك الخاص: أعمدة مكتوبة، مراجع بين الجداول، صيغ Python تعمل من جانب الخادم، وواجهة برمجية REST مُولَّدة تلقائياً على كل مستند — أداة نمذجة بيانات متكاملة بدون اشتراك.",[37,41,50,53,66,69,72,75,78,122],{"type":38,"title":39,"body":40},"h2","لماذا Grist بدلاً من Google Sheets أو Airtable","Google Sheets جدول بيانات: يخزن البيانات مستوية والحسابات محدودة بدوال الورقة والعلاقات تعتمد على VLOOKUP هشة. Airtable يحل هذا بقواعد علائقية لكن بـ 20 دولاراً للمستخدم شهرياً، تتراكم الفاتورة بسرعة.\n\nGrist يجمع العالمين: واجهة جداول بيانات مألوفة فوق قاعدة بيانات علائقية حقيقية. كل مستند يحتوي على جداول بأعمدة مكتوبة (نص، رقمي، تاريخ، مرجع، مرفق)، علاقات صريحة بين الجداول وصيغ Python تعمل من جانب الخادم. على VPS الخاص بك، Grist يكلف 0 دولار إضافي شهرياً.",{"type":42,"title":43,"items":44},"ul","ما يفعله Grist ولا يستطيع Google Sheets فعله",[45,46,47,48,49],"**علاقات بين الجداول**: عمود مرجع في `الطلبات` يشير إلى `العملاء` — ليس VLOOKUP هشاً بل مفتاح أجنبي حقيقي مع إكمال تلقائي.","**صيغ Python من جانب الخادم**: `import datetime`، `import re`، `import uuid` — وأي مكتبة Python نقية. الصيغ تعمل في صندوق رملي على الخادم.","**واجهة برمجية REST تلقائية**: كل مستند يعرض `\u002Fapi\u002Fdocs\u002F\u003Cid>\u002Ftables\u002F\u003Ctable>\u002Frecords` بلا إعداد. دمج Grist مع n8n أو Make أو أي عميل HTTP.","**طرق عرض متعددة على نفس البيانات**: شبكة، بطاقة، مخطط، تقويم، ودجت مخصص — كل طريقة عرض قابلة للتصفية والإعداد بشكل مستقل.","**قواعد وصول لكل صف وعمود**: قيّد القراءة والكتابة بناءً على سمات المستخدم — دقيق بما يكفي للمستندات متعددة المستأجرين.",{"type":38,"title":51,"body":52},"المتطلبات ومعمارية Docker","VPS بـ **1 غيغابايت RAM على الأقل** مع Docker المثبت كافٍ للبدء. Grist ينتشر في حاوية واحدة `gristlabs\u002Fgrist` تضم Node.js (الخادم) وPython (صندوق الصيغ) وSQLite (تخزين المستندات). حجم مسمى `\u002Fpersist` يخزن ملفات `‎.grist` — ملف واحد لكل مستند. لا خدمة خارجية مطلوبة.\n\nالمنفذ الافتراضي هو **8484**. تحقق من إمكانية الوصول قبل إعداد الـ reverse proxy (`curl -sI http:\u002F\u002Flocalhost:8484\u002F`).",{"type":54,"title":55,"steps":56},"steps","Docker Compose الكامل والنشر",[57,60,63],{"title":58,"body":59},"إنشاء الدليل وdocker-compose.yml","اتصل بـ SSH على VPS وأنشئ مجلد الـ stack:\n\n```bash\nmkdir -p \u002Fopt\u002Fstacks\u002Fgrist && cd \u002Fopt\u002Fstacks\u002Fgrist\n```\n\nأنشئ ملف `docker-compose.yml` التالي:\n\n```yaml\nservices:\n  grist:\n    image: gristlabs\u002Fgrist:1.7.20\n    container_name: grist\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8484:8484\"\n    volumes:\n      - grist_data:\u002Fpersist\n    environment:\n      GRIST_SESSION_SECRET: \"REPLACE_WITH_openssl_rand_hex_32\"\n      APP_HOME_URL: \"https:\u002F\u002Fgrist.yourdomain.com\"\n      GRIST_DEFAULT_EMAIL: \"admin@localhost.local\"\n      GRIST_SANDBOX_FLAVOR: \"gvisor\"\n\nvolumes:\n  grist_data:\n```\n\nولّد سر الجلسة قبل البدء: `openssl rand -hex 32`.",{"title":61,"body":62},"الإطلاق والتحقق","```bash\ndocker compose up -d\ndocker compose logs -f grist\n```\n\nانتظر رسالة `Grist server ready`. تحقق من حالة HTTP:\n\n```bash\ncurl -sI http:\u002F\u002Flocalhost:8484\u002F\n```\n\nيجب أن تحصل على `HTTP\u002F1.1 200 OK` أو إعادة توجيه `302`.",{"title":64,"body":65},"إعداد nginx كـ reverse proxy مع HTTPS","ثبّت nginx وcertbot على VPS ثم أنشئ `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fgrist.conf`:\n\n```nginx\nserver {\n    listen 80;\n    server_name grist.yourdomain.com;\n    return 301 https:\u002F\u002F$host$request_uri;\n}\n\nserver {\n    listen 443 ssl;\n    server_name grist.yourdomain.com;\n\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgrist.yourdomain.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgrist.yourdomain.com\u002Fprivkey.pem;\n    ssl_protocols TLSv1.2 TLSv1.3;\n\n    add_header Strict-Transport-Security \"max-age=63072000; includeSubDomains\" always;\n    add_header X-Frame-Options SAMEORIGIN always;\n    add_header X-Content-Type-Options nosniff always;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:8484;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_read_timeout 300s;\n    }\n}\n```\n\nاحصل على الشهادة وفعّل الـ vhost:\n\n```bash\ncertbot certonly --nginx -d grist.yourdomain.com\nln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fgrist.conf \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\nnginx -t && systemctl reload nginx\n```",{"type":38,"title":67,"body":68},"صيغ Grist المتقدمة: VLOOKUP والمراجع بين الجداول","Grist يستبدل VLOOKUP الهش بـ **أعمدة المراجع** و**دوال البحث المكتوبة**. في جدول `الطلبات` بعمود `العميل` من نوع `Reference → العملاء`، الوصول لاسم العميل ببساطة `$العميل.الاسم` — لا VLOOKUP.\n\nللتجميعات، يوفر Grist `lookupRecords()` و`lookupOne()`:\n\n```python\n# في جدول العملاء — إجمالي مبالغ الطلبات لعميل\nSUM(الطلبات.lookupRecords(العميل=$id).المبلغ)\n\n# في جدول الطلبات — استرجاع الرمز البريدي للعميل\nالعملاء.lookupOne(الاسم=$العميل.الاسم).الرمزالبريدي\n\n# حساب الخصم التدريجي مع استيراد Python\nimport datetime\nالتأخير = (datetime.date.today() - $تاريخالطلب).days\n$المبلغ * (1 - 0.02 * التأخير \u002F\u002F 30)\n```\n\nتعمل الصيغ في **صندوق رملي gVisor** (`GRIST_SANDBOX_FLAVOR=gvisor`): لا وصول لنظام الملفات أو الشبكة.",{"type":38,"title":70,"body":71},"مصادقة SSO مع OIDC (اختياري)","للنشر متعدد المستخدمين مع مصادقة حقيقية، يدعم Grist **OpenID Connect (OIDC)** مع Authentik أو Keycloak أو Google Workspace:\n\n```yaml\nenvironment:\n  GRIST_OIDC_IDP_ISSUER: \"https:\u002F\u002Fauth.yourdomain.com\u002Fapplication\u002Fo\u002Fgrist\u002F\"\n  GRIST_OIDC_IDP_CLIENT_ID: \"your-client-id\"\n  GRIST_OIDC_IDP_CLIENT_SECRET: \"your-client-secret\"\n  GRIST_OIDC_IDP_SCOPES: \"openid email profile\"\n  GRIST_OIDC_SP_HOST: \"https:\u002F\u002Fgrist.yourdomain.com\"\n```\n\nاحذف `GRIST_DEFAULT_EMAIL` بمجرد إعداد OIDC — المتغيران غير متوافقين. أول مستخدم يسجل دخوله عبر OIDC يصبح مدير الموقع.",{"type":38,"title":73,"body":74},"النسخ الاحتياطية: أحجام Docker والتصدير","مستندات Grist في حجم Docker `grist_data`، ضمن `\u002Fpersist\u002Fdocs\u002F`. استراتيجيتان متكاملتان:\n\n**لقطة الحجم** (موصى به): اربط `\u002Fpersist\u002Fdocs\u002F` بمهمة Backrest (متاح في كتالوج ServOrbit). Backrest يأخذ لقطات عبر restic ويرسل الزيادات المشفرة إلى S3 أو Backblaze B2 أو SFTP — دون إيقاف Grist.\n\n```bash\n# نسخة احتياطية طارئة يدوية\ndocker run --rm \\\n  -v grist_data:\u002Fsource:ro \\\n  -v \u002Fbackups\u002Fgrist:\u002Fdest \\\n  alpine tar czf \u002Fdest\u002Fgrist-$(date +%Y%m%d).tar.gz -C \u002Fsource .\n```\n\n**تصدير المستندات**: في Grist، قائمة Document → Export → `‎.grist` (تنسيق SQLite الأصلي) أو CSV\u002FXLSX لكل جدول. Grist يحفظ أيضاً **تاريخ لقطات لكل مستند** (Document → History).",{"type":38,"title":76,"body":77},"استكشاف الأخطاء الشائعة","**الحاوية تعيد التشغيل باستمرار**: تحقق من السجلات (`docker compose logs grist`). السبب الأكثر شيوعاً هو `GRIST_SESSION_SECRET` فارغ أو قصير — يجب أن يكون 32 حرفاً سداسياً على الأقل.\n\n**أخطاء CORS على API**: أضف `GRIST_ALLOWED_HOSTS=grist.yourdomain.com` وتأكد أن `APP_HOME_URL` يطابق URL العام بالضبط (مع `https:\u002F\u002F`، بدون شرطة مائلة في النهاية).\n\n**بطء على مجموعات البيانات الكبيرة**: على الجداول التي تتجاوز 100,000 صف، حدّد `lookupRecords()` بالأعمدة المفهرسة وتجنب صيغ Python مع استيرادات ثقيلة.\n\n**مشاكل الوصول بعد تغيير النطاق**: حدّث `APP_HOME_URL`، امسح ملفات تعريف الارتباط وأعد تشغيل الحاوية.",{"type":79,"title":80,"intro":81,"headers":82,"rows":87,"conclusion":121},"comparison","Grist مقابل NocoDB مقابل Baserow","الثلاثة تحتل مكانة «Airtable مفتوح المصدر» لكن بتوجهات مختلفة.",[83,84,85,86],"المعيار","Grist","NocoDB","Baserow",[88,93,98,103,108,112,117],[89,90,91,92],"التخزين","SQLite لكل مستند (ملف ‎.grist)","PostgreSQL أو MySQL (قاعدة مشتركة)","PostgreSQL (قاعدة مشتركة)",[94,95,96,97],"الصيغ","Python من جانب الخادم (صندوق رملي)","لا توجد صيغ أصلية","صيغ محدودة، JS من جانب العميل",[99,100,101,102],"REST API","تلقائية لكل مستند","تلقائية لكل قاعدة","تلقائية",[104,105,106,107],"SSO","OIDC أصلي","LDAP، OIDC (Enterprise)","SSO مدفوع",[109,110,111,111],"النسخ الاحتياطية","ملف ‎.grist واحد لكل مستند","تفريغ PostgreSQL",[113,114,115,116],"حالة الاستخدام المثالية","نمذجة البيانات، صيغ معقدة","بديل Airtable للفرق","واجهة no-code للفرق",[118,119,120,120],"الموارد (البدء)","1 GB RAM, Docker","2 GB RAM, Docker + PostgreSQL","Grist هو الوحيد من الثلاثة الذي يعزل كل مستند في ملف SQLite مستقل — مما يبسّط النسخ الاحتياطي وترحيل المستندات الفردية.",{"type":123,"body":124},"tip","لتحديث Grist، غيّر وسم الصورة في Compose (`gristlabs\u002Fgrist:1.7.20` → الإصدار التالي)، أوقف الحاوية (`docker compose down`), ثم أعد تشغيلها (`docker compose up -d`). حجم `grist_data` يستمر بين الإصدارات. راجع ملاحظات الإصدار على github.com\u002Fgristlabs\u002Fgrist-core قبل كل تحديث.","Airtable الخاص بك، على خادمك","انشر Grist على VPS ServOrbit ونمذج بياناتك بدون اشتراك ودون ارتباط بمزوّد — واجهة REST وصيغ Python وتعاون في الوقت الفعلي.","نشر Grist","\u002Fapplications\u002Fالتطوير\u002Fgrist",[130,148,167],{"id":131,"slug":132,"slugs":133,"title":137,"excerpt":138,"readTime":139,"views":140,"isPinned":19,"noindex":19,"publishedAt":141,"updatedAt":21,"category":142,"categories":143,"featuredImage":29,"bgImage":30,"posterImage":145,"relatedSolution":146},188,"استضافة-nocobase-على-vps-منصة-بلا-كود-لأدواتك-الداخلية",{"fr":134,"en":135,"ar":132,"es":136},"self-host-nocobase-vps","self-host-nocobase-on-a-vps-no-code-platform-for-internal-tools","alojar-nocobase-en-un-vps-no-code-herramientas-internas","استضافة NocoBase على VPS: منصة بلا كود لأدواتك الداخلية","انشر ‎NocoBase‎ على خادم VPS — منصة no-code\u002Flow-code لبناء الأدوات الداخلية وCRM وسير موافقات. Apache-2.0، أكثر من 23 ألف نجمة، v2.1.26.",10,1,"2026-07-22T00:00:00+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},[144],{"id":17,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fself-host-nocobase-vps-poster.svg",{"categorySlug":33,"appSlug":147},"nocobase",{"id":149,"slug":150,"slugs":151,"title":155,"excerpt":156,"readTime":18,"views":140,"isPinned":19,"noindex":157,"publishedAt":158,"updatedAt":159,"category":160,"categories":161,"featuredImage":29,"bgImage":30,"posterImage":163,"relatedSolution":164},157,"كيفية-استضافة-nocodb-ذاتيا-على-خادم-vps",{"fr":152,"en":153,"ar":150,"es":154},"self-host-nocodb-vps","how-to-self-host-nocodb-on-a-vps","como-autoalojar-nocodb-en-un-vps","كيفية استضافة NocoDB ذاتيًا على خادم VPS","انشر NocoDB على خادم VPS للحصول على بديل مفتوح المصدر ومستضاف ذاتيًا عن Airtable. حوّل أي قاعدة بيانات إلى جدول بيانات ذكي مع واجهات REST وGraphQL عبر Docker Compose.",true,"2026-01-20T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},[162],{"id":17,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fself-host-nocodb-vps-poster.svg",{"categorySlug":165,"appSlug":166},"قواعد-البيانات","nocodb",{"id":168,"slug":169,"slugs":170,"title":174,"excerpt":175,"readTime":176,"views":18,"isPinned":19,"noindex":19,"publishedAt":177,"updatedAt":178,"category":179,"categories":185,"featuredImage":29,"bgImage":30,"posterImage":187,"relatedSolution":188},67,"استضافة-meilisearch-على-خادم-vps",{"fr":171,"en":172,"ar":169,"es":173},"heberger-meilisearch-vps","hosting-meilisearch-on-a-vps","alojar-meilisearch-en-un-vps","استضافة Meilisearch على خادم VPS","استضِف Meilisearch على خادمك الـVPS: محرك بحث فوري ومتسامح مع الأعطال والأخطاء المطبعية. دليل Docker والمفتاح الرئيسي (master key) وSSL.",5,"2026-04-14T00:00:00+00:00","2026-09-08T22:00:01+00:00",{"id":180,"name":181,"slug":182,"color":183,"icon":184},6,"قواعد البيانات","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[186],{"id":180,"name":181,"slug":182,"color":183,"icon":184},"\u002Fblog\u002Fcovers\u002Fheberger-meilisearch-vps-poster.svg",{"categorySlug":165,"appSlug":189},"meilisearch",1794270221632]