[{"data":1,"prerenderedAt":188},["ShallowReactive",2],{"seo-verification":3,"blog-استضافة-hasura-على-vps-واجهة-graphql-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-استضافة-hasura-على-vps-واجهة-graphql-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":122,"ctaBody":123,"ctaButton":124,"ctaUrl":125,"relatedPosts":126},505,"استضافة-hasura-على-vps-واجهة-graphql",{"fr":12,"en":13,"ar":10,"es":14},"self-host-hasura-vps","self-host-hasura-graphql-engine-vps","autoalojar-hasura-api-graphql-vps","Hasura على VPS: واجهة GraphQL فورية فوق PostgreSQL","ثبّت Hasura على خادم افتراضي عبر Docker Compose: واجهة GraphQL وREST فوق PostgreSQL، وصلاحيات حسب الدور، واشتراكات فورية، وHTTPS.",6,0,false,"2026-10-27T00:00:00+00:00","2026-10-27T23:58:39+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-hasura-vps-poster.svg",{"categorySlug":34,"appSlug":35},"التطوير","hasura","كتابة شيفرة CRUD نفسها لكل جدول، ثم ضوابط الوصول نفسها، ثم توثيق الواجهة نفسه: هذا هو العمل الذي يلغيه Hasura GraphQL Engine. يتصل هذا المحرّك مفتوح المصدر (رخصة Apache-2.0) بقاعدة PostgreSQL ويعرض فوراً واجهة GraphQL كاملة، بعلاقاتها وفلاترها وتجميعاتها واشتراكاتها الفورية، محميّة بصلاحيات تُعلَن حسب الدور. يثبّته هذا الدليل عبر Docker Compose على خادم افتراضي، بجوار قاعدة PostgreSQL خاصة به، وينشره عبر HTTPS خلف nginx، ويضع قواعد الأمان التي لا يجوز نسيانها.",[38,42,52,87,90,106,110,113,116,119],{"type":39,"title":40,"body":41},"h2","لماذا واجهة مولَّدة بدل خلفية مكتوبة يدوياً","في معظم التطبيقات، يقتصر جزء كبير من شيفرة الخادم على ترجمة طلبات HTTP إلى SQL: عرض وتصفية وتقسيم صفحات وإنشاء وتعديل وحذف، مع التحقق في كل مرة من أن المستخدم مخوَّل. هذه الشيفرة مكرّرة وتحتاج إلى اختبارات، وكل عمود جديد يفرض تعديلها.\n\nينطلق Hasura من مخطط القاعدة. يصبح الجدول المتتبَّع نوعاً في GraphQL، والمفتاح الأجنبي حقلاً متداخلاً، وقاعدة الصلاحية المكتوبة مرة واحدة تسري على كل الاستعلامات. أما منطق عملك الخاص — دفع أو إرسال بريد أو حساب — فيبقى في شيفرتك التي يستدعيها Hasura عبر webhook. وتحتفظ بقاعدة PostgreSQL: لا شيء محبوس في صيغة مغلقة.",{"type":43,"title":44,"items":45},"ul","ما يقدّمه Hasura",[46,47,48,49,50,51],"**واجهة GraphQL فورية** — استعلامات وتعديلات وفلاتر وترتيب وتقسيم صفحات وتجميعات على كل جدول متتبَّع.","**العلاقات** — تتحوّل المفاتيح الأجنبية إلى حقول متداخلة يمكن استعلامها في طلب واحد.","**اشتراكات فورية** — يشترك العميل في استعلام ويتلقّى التغييرات عبر WebSocket.","**صلاحيات حسب الدور** — قواعد على مستوى السطر والعمود تغذّيها claims رمز JWT.","**Actions والمشغّلات** — webhooks تستدعيها عملية تعديل أو تغيّر في البيانات أو جدولة cron.","**لوحة ونقاط REST** — إدارة عبر الويب، ومستكشف GraphiQL، وتحويل استعلام إلى مسار REST.",{"type":53,"title":54,"headers":55,"rows":59},"comparison","Hasura مقارنةً بطرق أخرى لعرض PostgreSQL",[5,56,57,58],"Hasura","واجهة مكتوبة يدوياً","PostgREST",[60,65,70,74,79,84],[61,62,63,64],"واجهة مولَّدة من المخطط","نعم، GraphQL وREST","لا","نعم، REST",[66,67,68,69],"علاقات متداخلة في طلب واحد","نعم","حسب الشيفرة","نعم، عبر embedding",[71,72,73,63],"الزمن الحقيقي","اشتراكات GraphQL","يجب تطويره",[75,76,77,78],"الصلاحيات","حسب الدور والسطر والعمود، من اللوحة","في الشيفرة","أدوار PostgreSQL وRLS",[80,81,82,83],"منطق العمل","Actions ومشغّلات عبر webhooks","حرّ","دوال SQL",[85,86,63,63],"واجهة إدارة","لوحة ويب",{"type":39,"title":88,"body":89},"المتطلبات","يكفي خادم Ubuntu 24.04 بذاكرة **1 غيغابايت** للبدء: في وضع السكون يستهلك محرّك Hasura وPostgreSQL معاً نحو 200 ميغابايت. خطّط لـ **2 غيغابايت** حين تكبر القاعدة أو تتكاثر الاشتراكات. تحتاج إلى Docker مع إضافة Compose، وإلى **اسم نطاق** يشير إلى الخادم مع nginx وشهادة HTTPS: ستستدعي المتصفحات وتطبيقات الجوال واجهتك، فيجب أن تردّ على عنوان ثابت ومشفّر.",{"type":91,"title":92,"steps":93},"steps","تثبيت Hasura عبر Docker Compose",[94,97,100,103],{"title":95,"body":96},"تحضير الأسرار","أنشئ مجلد التطبيق وملف `.env` يحمل كلمة مرور القاعدة و**admin secret**، المفتاح الرئيسي للواجهة. لا يقرأ الملف إلا root.\n```bash\nmkdir -p \u002Fopt\u002Fhasura && cd \u002Fopt\u002Fhasura\ncat > .env \u003C\u003CEOF\nDB_PASSWORD=$(openssl rand -hex 16)\nADMIN_SECRET=$(openssl rand -hex 24)\nEOF\nchmod 600 .env\n```",{"title":98,"body":99},"إنشاء ملف Compose","يشغّل ملف `docker-compose.yml` هذا PostgreSQL على الشبكة الداخلية للمجموعة دون نشر أي منفذ، ثم Hasura حين تصبح القاعدة جاهزة. يُنشر منفذ Hasura على الواجهة المحلية فقط؛ وتُقدَّم اللوحة من الصورة نفسها دون استدعاء شبكة CDN الخاصة بالناشر، والقياس عن بعد معطّل.\n```yaml\nservices:\n  postgres:\n    image: postgres:17.11-alpine\n    restart: unless-stopped\n    environment:\n      POSTGRES_DB: hasura\n      POSTGRES_USER: hasura\n      POSTGRES_PASSWORD: ${DB_PASSWORD}\n    volumes:\n      - hasura-pgdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U hasura -d hasura\"]\n      interval: 10s\n      retries: 10\n  hasura:\n    image: hasura\u002Fgraphql-engine:v2.51.3\n    restart: unless-stopped\n    depends_on:\n      postgres:\n        condition: service_healthy\n    ports:\n      - \"127.0.0.1:8103:8080\"\n    env_file: .env\n    environment:\n      HASURA_GRAPHQL_DATABASE_URL: postgres:\u002F\u002Fhasura:${DB_PASSWORD}@postgres:5432\u002Fhasura\n      HASURA_GRAPHQL_ADMIN_SECRET: ${ADMIN_SECRET}\n      HASURA_GRAPHQL_ENABLE_CONSOLE: \"true\"\n      HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: \u002Fsrv\u002Fconsole-assets\n      HASURA_GRAPHQL_DEV_MODE: \"false\"\n      HASURA_GRAPHQL_ENABLE_TELEMETRY: \"false\"\nvolumes:\n  hasura-pgdata: {}\n```",{"title":101,"body":102},"تشغيل المجموعة","عند التشغيل الأول ينشئ Hasura جداول بياناته الوصفية في المخطط `hdb_catalog` ويربط القاعدة مصدراً باسم `default`. تردّ النقطة `\u002Fhealthz` بـ `OK` حين يصبح المحرّك جاهزاً.\n```bash\ndocker compose up -d\ncurl -fsS http:\u002F\u002F127.0.0.1:8103\u002Fhealthz   # OK\n```",{"title":104,"body":105},"النشر عبر HTTPS خلف nginx","أضف كتلة `server` لنطاقك مع شهادة Let's Encrypt. الترويستان `Upgrade` و`Connection` ضروريتان: تمرّ الاشتراكات عبر WebSocket.\n```nginx\nlocation \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:8103;\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_set_header X-Forwarded-Proto $scheme;\n}\n```",{"type":107,"title":108,"body":109},"tip","لا يغادر admin secret الخادم أبداً","من دون `HASURA_GRAPHQL_ADMIN_SECRET` تكون اللوحة والواجهة كلها مفتوحة لكل من يعرف العنوان. ومعه يمنح السرّ **كل الصلاحيات**: قراءة كل الجداول والكتابة فيها، وتنفيذ SQL، وتعديل البيانات الوصفية. احتفظ به للوحة ولسكربتات الإدارة، ولا تضعه أبداً في شيفرة واجهة أمامية أو تطبيق جوال.",{"type":39,"title":111,"body":112},"إنشاء جدول واستعلامه","افتح `https:\u002F\u002Fapi.example.com\u002Fconsole` وأدخل admin secret، ثم في تبويب **Data** أنشئ جدولاً `todos` بالأعمدة `id` (عدد صحيح تلقائي الزيادة) و`title` (نص) و`done` (منطقي). انقر **Track**: يظهر الجدول فوراً في مستكشف تبويب **API**. ومن سكربت إدارة يُرسَل الاستعلام نفسه مع admin secret:\n```bash\ncurl -s https:\u002F\u002Fapi.example.com\u002Fv1\u002Fgraphql \\\n  -H \"x-hasura-admin-secret: $ADMIN_SECRET\" \\\n  -H 'content-type: application\u002Fjson' \\\n  -d '{\"query\":\"{ todos { id title done } }\"}'\n```",{"type":39,"title":114,"body":115},"مصادقة المستخدمين وضبط الصلاحيات","يجب ألا يستخدم مستخدموك admin secret: يقدّمون رمز JWT يصدره مزوّد الهوية لديك (Logto أو Authentik أو Zitadel أو Auth0…). أخبر Hasura أين يجد مفاتيح التحقق، وأي دور يُمنح للطلبات بلا رمز، في ملف `.env`:\n```bash\nHASURA_GRAPHQL_JWT_SECRET={\"type\":\"RS256\",\"jwk_url\":\"https:\u002F\u002Fauth.example.com\u002Foidc\u002Fjwks\"}\nHASURA_GRAPHQL_UNAUTHORIZED_ROLE=anonymous\n```\n\nأعد تشغيل المجموعة بالأمر `docker compose up -d`، فالخدمة `hasura` تقرأ هذا الملف عبر `env_file`. يجب أن يحمل الرمز الـ claims `x-hasura-default-role` و`x-hasura-allowed-roles` و`x-hasura-user-id`. ثم في تبويب **Permissions** لكل جدول حدّد ما يمكن لكل دور قراءته أو إدراجه أو تعديله — مثلاً لا يرى الدور `user` إلا الأسطر التي يساوي فيها `user_id` القيمة `X-Hasura-User-Id`.",{"type":39,"title":117,"body":118},"استكشاف الأخطاء","**تعرض اللوحة «invalid x-hasura-admin-secret»**: السرّ المُدخل لا يطابق قيمة `.env`. تحقّق منها بالأمر `grep ADMIN_SECRET \u002Fopt\u002Fhasura\u002F.env` ثم أعد تحميل الصفحة.\n\n**يعيد Hasura التشغيل بلا توقف**: لا يمكن الوصول إلى القاعدة. يعرض `docker compose logs hasura` خطأ الاتصال؛ تحقّق من أن كلمة المرور في الرابط `HASURA_GRAPHQL_DATABASE_URL` هي كلمة مرور PostgreSQL. وإن غيّرتها بعد التشغيل الأول فقد احتفظ PostgreSQL بالقديمة: فهو لا يقرأ `POSTGRES_PASSWORD` إلا عند إنشاء وحدة التخزين.\n\n**تنقطع الاشتراكات**: لا يمرّر الوكيل العكسي ترقية WebSocket. أضف الترويستين `Upgrade` و`Connection` المذكورتين أعلاه، وارفع `proxy_read_timeout` إن بقي عملاؤك خاملين طويلاً.\n\n**لا يظهر جدول في الواجهة**: هو موجود في القاعدة لكنه غير متتبَّع. انقر **Track** في تبويب **Data**، أو تتبّع كل جداول المخطط دفعة واحدة.",{"type":39,"title":120,"body":121},"التثبيت بنقرة واحدة من متجر ServOrbit","يثبّت متجر ServOrbit تطبيق Hasura على خادمك دون سطر أوامر: ينشر PostgreSQL ومحرّك Hasura، ويولّد admin secret وكلمة مرور القاعدة، ويربط القاعدة مصدراً باسم `default`، وينشر الواجهة عبر HTTPS على نطاق فرعي لنطاقك أو على النطاق الفرعي المجاني للخادم. يظهر admin secret في مساحة العميل؛ ولا يبقى إلا فتح اللوحة وإنشاء جداولك.","واجهة GraphQL فوق PostgreSQL، على خادمك الخاص","يكفي خادم افتراضي من ServOrbit بنظام Ubuntu 24.04 وذاكرة 1 غيغابايت للبدء مع Hasura. تثبيت بنقرة واحدة من المتجر، مع PostgreSQL، وadmin secret مولَّد لك، وHTTPS على نطاقك أو على النطاق الفرعي المجاني للخادم.","ثبّت Hasura","\u002Fmarketplace\u002Fالتطوير\u002Fhasura",[127,150,168],{"id":128,"slug":129,"slugs":130,"title":134,"excerpt":135,"readTime":136,"views":18,"isPinned":19,"publishedAt":137,"updatedAt":138,"category":139,"categories":144,"featuredImage":30,"bgImage":31,"posterImage":146,"relatedSolution":147},56,"postgresql-على-خادم-vps-قاعدة-بيانات-موثوقة-ومتحكم-بها",{"fr":131,"en":132,"ar":129,"es":133},"heberger-postgresql-vps","postgresql-on-a-vps-a-reliable-and-controlled-database","alojar-postgresql-en-un-vps","‎PostgreSQL على خادم VPS: قاعدة بيانات موثوقة ومتحكَّم بها","‎استضف PostgreSQL على VPS: إعداد الإنتاج، نسخ pgBackRest، HA بالبث، مقارنة RDS\u002FSupabase\u002FNeon واستكشاف أخطاء OOM.",9,"2026-04-25T00:00:00+00:00","2026-10-21T15:21:37+00:00",{"id":17,"name":140,"slug":141,"color":142,"icon":143},"قواعد البيانات","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[145],{"id":17,"name":140,"slug":141,"color":142,"icon":143},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":148,"appSlug":149},"قواعد-البيانات","postgresql-stack",{"id":151,"slug":152,"slugs":153,"title":157,"excerpt":158,"readTime":159,"views":18,"isPinned":19,"publishedAt":160,"updatedAt":161,"category":162,"categories":163,"featuredImage":30,"bgImage":31,"posterImage":165,"relatedSolution":166},60,"استضافة-supabase-على-خادم-vps",{"fr":154,"en":155,"ar":152,"es":156},"heberger-supabase-vps","hosting-supabase-on-a-vps","alojar-supabase-en-un-vps","استضافة Supabase على VPS في 2026","‏استضف Supabase ذاتيًا على VPS: Postgres والمصادقة والتخزين وREST API مع Envoy Gateway. هجرة PG 15→17 وKong→Envoy وثغرة GoTrue.",14,"2026-04-21T00:00:00+00:00","2026-10-09T22:36:10+00:00",{"id":17,"name":140,"slug":141,"color":142,"icon":143},[164],{"id":17,"name":140,"slug":141,"color":142,"icon":143},"\u002Fblog\u002Fcovers\u002Fheberger-supabase-vps-poster.svg",{"categorySlug":148,"appSlug":167},"supabase",{"id":169,"slug":170,"slugs":171,"title":175,"excerpt":176,"readTime":177,"views":18,"isPinned":19,"publishedAt":178,"updatedAt":179,"category":180,"categories":185,"featuredImage":30,"bgImage":31,"posterImage":187,"relatedSolution":30},282,"depends-on-لا-يكفي-healthcheck-لـ-postgresql-في-compose",{"fr":172,"en":173,"ar":170,"es":174},"docker-compose-depends-on-healthcheck","depends-on-is-not-enough-postgresql-healthcheck-in-compose","docker-compose-healthcheck-postgresql","depends_on لا يكفي: healthcheck لـ PostgreSQL في Compose","لماذا لا يضمن `depends_on` وحده جاهزية PostgreSQL، وكيف تُعدّ healthcheck موثوقاً باستخدام `service_healthy` لتجنب race conditions عند الإقلاع.",8,"2026-08-19T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":181,"name":182,"slug":183,"color":184,"icon":183},3,"النشر","deploiement","bg-success\u002F10 text-success",[186],{"id":181,"name":182,"slug":183,"color":184,"icon":183},"\u002Fblog\u002Fcovers\u002Fdocker-compose-depends-on-healthcheck-poster.svg",1793145790499]