[{"data":1,"prerenderedAt":289},["ShallowReactive",2],{"seo-verification":3,"blog-استضافة-supabase-على-خادم-vps-ma-ar":6,"promo-bar-likely":288},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-استضافة-supabase-على-خادم-vps-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":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":229,"ctaBody":230,"ctaButton":231,"ctaUrl":232,"relatedPosts":233},60,"استضافة-supabase-على-خادم-vps",{"fr":12,"en":13,"ar":10,"es":14},"heberger-supabase-vps","hosting-supabase-on-a-vps","alojar-supabase-en-un-vps","استضافة Supabase على VPS في 2026","‏استضف Supabase ذاتيًا على VPS: Postgres والمصادقة والتخزين وREST API خلف Envoy. هجرة PG 15→17 وKong→Envoy وثغرة GoTrue.",15,0,false,"2026-04-21T00:00:00+00:00","2026-11-08T01:13:14+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},6,"قواعد البيانات","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-supabase-vps-poster.svg",{"categorySlug":34,"appSlug":35},"قواعد-البيانات","supabase","‏Supabase هو البديل مفتوح المصدر لـ Firebase المبني على PostgreSQL: قاعدة بيانات ومصادقة وتخزين وedge functions وواجهة برمجية تلقائية. منذ أغسطس 2026، انتقلت الحزمة المستضافة ذاتيًا من Kong إلى **Envoy** كبروكسي API داخلي. استضافتها على VPS تمنحك backend متكاملًا دون قيود على المشاريع ودون فوترة بالاستخدام، مع بياناتك في Postgres الخاص بك.",[38,42,52,55,77,117,120,123,126,129,132,153,184,187,202,205,208],{"type":39,"title":40,"body":41},"h2","لماذا تستضيف Supabase ذاتيًا على VPS","Supabase ليس صندوقًا أسود: إنه مجموعة من الخدمات مفتوحة المصدر (PostgreSQL، وGoTrue للمصادقة، وPostgREST للواجهة البرمجية، وRealtime، وStorage، وEnvoy كبوابة بعد Kong سابقًا) مُنسَّقة معًا. تُفوتر النسخة السحابية لكل مشروع ولكل مستخدم نشط شهريًا، وتوقف المشاريع المجانية الخاملة. باستضافة Supabase ذاتيًا على خادم VPS، تحصل على backend-as-a-service متكامل دون هذه القيود، مع وصول مباشر إلى PostgreSQL للهجرات والإضافات (`pgvector`، `PostGIS`) والضبط. مثالي لوكالة تستضيف تطبيقات عدة لعملاء، أو SaaS ناشئ يريد التحكم في التكاليف، أو أي مشروع يستلزم سيادة البيانات. تدير التحديثات والنسخ الاحتياطية بنفسك، مقابل حرية كاملة.",{"type":43,"title":44,"items":45},"ul","المزايا الملموسة لـ Supabase المستضاف ذاتيًا",[46,47,48,49,50,51],"‏backend متكامل: Postgres والمصادقة والتخزين وRealtime وواجهة REST\u002FGraphQL في مكدس واحد.","وصول مباشر إلى PostgreSQL الأساسي: هجرات SQL وإضافات وسياسات RLS بلا حدود.","بلا إيقاف مؤقت أو فوترة لكل مستخدم نشط شهريًا.","‏Studio مضمَّن: واجهة ويب للإدارة لإدارة الجداول والمصادقة والـbuckets.","إضافات الذكاء الاصطناعي عبر `pgvector` للـRAG والبحث الدلالي، مفعَّلة بحرية.","مشاريع متعددة على نفس الـ VPS: عملي لوكالة أو استوديو تطوير.",{"type":39,"title":53,"body":54},"متطلبات الأجهزة والبرامج","يشغّل Supabase المستضاف ذاتيًا نحو عشر حاويات (Postgres، وEnvoy، وGoTrue، وPostgREST، وRealtime، وStorage، وStudio، وMeta، وImgproxy...)، مما يجعله أكثر استهلاكًا من قاعدة بيانات بسيطة. احسب حدًا أدنى من 2 vCPU و4 غيغابايت RAM لبيئة تجريبية، ويُفضَّل 4 vCPU مع 8 غيغابايت RAM و80 غيغابايت SSD للإنتاج. على صعيد البرامج: Ubuntu 22.04\u002F24.04 LTS، وDocker وDocker Compose v2، واسم نطاق يشير إلى الخادم (مثلاً `api.myapp.com`) لعرض البوابة بصيغة HTTPS، وبروكسي عكسي مثل Caddy أو Traefik أو Nginx لإدارة SSL. خطِّط أيضًا لتوليد أسرار قوية (`JWT_SECRET`، مفاتيح `anon` و`service_role`).",{"type":56,"title":57,"steps":58},"steps","نشر Supabase المستضاف ذاتيًا بـ Docker",[59,62,65,68,71,74],{"title":60,"body":61},"استنساخ المستودع الرسمي وإعداد البيئة","احصل على مجلد `docker` من مستودع Supabase، وانسخ `.env.example` إلى `.env`، ثم أنشئ أسرارًا فريدة: `POSTGRES_PASSWORD`، و`JWT_SECRET`، ومفاتيح `ANON_KEY`\u002F`SERVICE_ROLE_KEY` المشتقة من JWT. لا تنشر أبدًا بالقيم الافتراضية.",{"title":63,"body":64},"تهيئة عناوين URL وكلمة مرور Studio","في `.env`، عيِّن `SITE_URL` و`API_EXTERNAL_URL` و`SUPABASE_PUBLIC_URL` بنطاقك، وحمِّ Supabase Studio بـ`DASHBOARD_USERNAME` و`DASHBOARD_PASSWORD`: يمنح Studio وصولًا إداريًا كاملًا لمشروعك.",{"title":66,"body":67},"تشغيل المكدس","ابدأ بـ`docker compose up -d`، ثم تابع بدء تشغيل الخدمات عبر `docker compose ps`. تستغرق التهيئة الأولى لـPostgres وتطبيق هجرات داخلية دقيقة إلى دقيقتين؛ تحقق من غياب الأخطاء في `docker compose logs`.",{"title":69,"body":70},"وضع بروكسي عكسي مع SSL","ضع Caddy أو Traefik أمام بوابة الـ API (Envoy، المنفذ 8000) لعرض واجهتك البرمجية بصيغة HTTPS. يحصل Caddy على شهادات Let's Encrypt ويجدِّدها تلقائيًا: كتلة بسيطة `myapp.com { reverse_proxy localhost:8000 }` تكفي. لا تكشف Postgres للعموم أبدًا. غير أن ملف compose الرسمي ينشر البوابة (8000) ومجمّع الاتصالات Supavisor (5432 و6543) على كل الواجهات، والمنافذ التي ينشرها Docker تتجاوز ufw: أضف قبلها `127.0.0.1:` في `docker-compose.yml` (مثلًا `127.0.0.1:${POSTGRES_PORT}:5432`)، أو أغلقها في الجدار الناري لدى مزوّدك.",{"title":72,"body":73},"تفعيل سياسات RLS","اتصل بـStudio، وأنشئ جداولك، ثم فعِّل Row Level Security على كل منها وعرِّف سياساتك. بدون RLS، يكشف مفتاحك `anon` جميع بياناتك: هذا الإعداد الواجب قبل عرض أي شيء.",{"title":75,"body":76},"نسخ Postgres والتخزين احتياطيًا","جدوِل `pg_dump` يوميًا لقاعدة البيانات، وأرشف حجم التخزين (مجلدات الملفات) إلى تخزين خارجي. اختبر الاستعادة الكاملة على VPS تجريبي قبل الاعتماد عليها في الإنتاج.",{"type":78,"title":79,"headers":80,"rows":84},"comparison","Supabase أم Appwrite: أيّ BaaS مستضاف ذاتيًا تختار؟",[81,82,83],"المعيار","Supabase","Appwrite",[85,89,93,97,101,105,109,113],[86,87,88],"قاعدة البيانات","PostgreSQL أصيل، SQL كامل","MariaDB داخليًا، واجهة وثيقة\u002Fمجموعة",[90,91,92],"نموذج البيانات","علائقي، RLS Postgres","وثائق ومجموعات، صلاحيات بقاعدة",[94,95,96],"واجهة برمجية تلقائية","REST (PostgREST) + GraphQL","REST وGraphQL ومجموعات SDK متعددة",[98,99,100],"المصادقة","GoTrue وOAuth وروابط سحرية","مصادقة مدمجة وOAuth وفرق وJWT",[102,103,104],"بصمة الموارد","أثقل (~10 حاويات)","معتدلة، مكدس أكثر إحكامًا",[106,107,108],"البحث الشعاعي\u002Fالذكاء الاصطناعي","أصيل عبر pgvector","غير أصيل، يجب الاستعانة بخارجي",[110,111,112],"الأنسب لـ","تطبيقات علائقية، RAG، SQL متقدم","تطبيقات جوال\u002Fويب موجَّهة للوثائق",[114,115,116],"منحنى التعلم","مريح إن أتقنت SQL","سريع لمطوري الواجهة الأمامية\u002Fالجوال",{"type":118,"body":119},"tip","حدِّث Supabase بحذر: إذ إن الصور مُرقَّمة في `docker-compose.yml`، نفِّذ دائمًا `pg_dump` كاملًا ولقطة للخادم قبل `docker compose pull && docker compose up -d`. بعض التحديثات تمس مخطط الخدمات الداخلية. للإنتاج، عزل Postgres على حجم مخصص عالي IOPS، واعلم أن `pgvector` مضمَّن في الصورة: يمكن تفعيله في أي وقت بـ `create extension vector;` دون إعادة بناء القاعدة.",{"type":39,"title":121,"body":122},"انشر من المكدس الرسمي لـ Supabase، لا من compose محلي الصنع","قد يبدو إغراؤك في كتابة docker-compose مُختزَل بالخدمات التي تحتاجها وحسب. في الواقع، هذا يتعطّل: تنفِّذ صورة supabase\u002Fpostgres نصها الخاص للهجرة (migrate.sh) الذي يُنشئ الأدوار الأساسية (supabase_admin، authenticator، supabase_auth_admin...) ومخطط المصادقة بالكامل، وتتوقع وجود ملفات SQL لتهيئة Supabase مرفوعة كملفات مع توسيع المتغيرات وقت التشغيل. لا يمكن لـcompose داخلي مستقل استنساخ ذلك (يُفسِّر Docker Compose المتغيرات داخل الإعدادات الداخلية، تاركًا مخطط المصادقة نصف مهاجَر وGoTrue يفشل بـ'must be owner of function auth.uid()'). المقاربة الصلبة — تلك التي يستخدمها ServOrbit — هي نشر ملفات Docker الرسمية لـSupabase، مثبَّتة على إصدار محدد، وترك migrate.sh يُشغِّل الإقلاع تمامًا كما يتوقعه upstream.",{"type":39,"title":124,"body":125},"النسخ الاحتياطي التلقائي لنسختك","لا ينشئ نشر Supabase عبر Docker أي نسخة احتياطية من تلقاء نفسه، وهذه أكثر ثغرة يبلّغ عنها من يستضيفونه ذاتيًا. تتكامل آليتان. الأولى، `pg_dump`، تنتج نسخة منطقية كاملة: شغّلها من المضيف عبر cron، واكتبها إلى وحدة تخزين منفصلة عن وحدة قاعدة البيانات، واحتفظ بعدة أجيال منها. والثانية، أرشفة WAL، تسجّل كل معاملة وتتيح الرجوع إلى لحظة محددة بدل الرجوع إلى آخر نسخة. الأولى تكفي معظم المشاريع، والثانية تصبح ضرورية حين يكون فقدان يوم من الكتابات غير مقبول. وفي الحالتين، لا تساوي النسخة الاحتياطية شيئًا قبل أن تثبت الاستعادة صحتها: أنشئ نسخة فارغة وأعد تشغيل ملف النسخ داخلها قبل أن تحتاج إليها فعلًا.",{"type":39,"title":127,"body":128},"تخفيف الحزمة: خدمة التحليلات","حتى الإصدار المستضاف ذاتيًا 0.5.0 (يونيو 2026)، كانت تركيبة Docker الرسمية تضمّ Logflare، خدمة التحليلات الداخلية في Supabase، باسم `analytics`. أصبحت الآن اختيارية: أُزيلت من `docker-compose.yml` الافتراضي، وتُفعَّل عبر الملف الإضافي `docker-compose.logs.yml`. ليست ضرورية للواجهة البرمجية ولا للمصادقة ولا للتخزين: إنها أداة مراقبة. في نسخة أقدم قد تكون ما زالت تعمل، وعلى VPS محدود الموارد كثيرًا ما تظهر بحالة `unhealthy` دون أن يتأثر باقي المكدس. قِس أولًا ما تستهلكه لديك بـ `docker stats` قبل أن تقرر: إن كانت مراقبتك تمر أصلًا بأداة خارجية فلن تخسر شيئًا، وإن كنت تعتمد على سجلاتها فلا توقفها إلا بعد ربط بديل.",{"type":39,"title":130,"body":131},"الانتقال من Kong إلى Envoy: ما الذي يتغيّر، ولمن يُعدّ كاسرًا","في 11 أغسطس 2026، مع الإصدار المستضاف ذاتيًا 0.8.0، جعلت Supabase من **Envoy** بوّابة الـ API الافتراضية للتنصيبات المستضافة ذاتيًا، وانتقل Kong إلى طبقة اختيارية. كان Envoy متاحًا منذ عدّة إصدارات عبر `docker-compose.envoy.yml` — الذي تغيّر هو **الافتراضي**.\n\nفي `docker-compose.yml` صارت الخدمة تُسمّى `api-gw` والحاوية `supabase-envoy`، لكن **الاسم الشبكي البديل `kong` باقٍ**: الخدمات التي تنادي البوّابة بهذا الاسم تستمر في العمل. ويبقى منفذ HTTP هو **8000**، ويُضبط عبر `API_GW_HTTP_PORT`، فلا يحتاج وسيطك العكسي Caddy أو Nginx إلى أي تعديل.\n\n⚠️ **تصف Supabase هذا التغيير بأنه كاسر لجزء من المستضيفين ذاتيًا**، وعليك معرفة إن كنت منهم. ثلاث حالات: كنت تعتمد على **منفذ HTTPS 8443 المدمج في Kong** — لم يعد مُتاحًا بالافتراضي، وانتقلت إنهاء TLS إلى `docker-compose.caddy.yml` أو `docker-compose.nginx.yml`؛ كان لديك `volumes\u002Fapi\u002Fkong.yml` **مُخصَّص** — يجب نقل المسارات والإضافات إلى إعداد Envoy في `volumes\u002Fapi\u002Fenvoy\u002F`؛ تشير نصوصك إلى البوابة **باسم الخدمة**. في الحالات الثلاث يمكنك البقاء على Kong: `sh run.sh config add kong`.",{"type":56,"title":133,"steps":134},"الانتقال إلى Envoy دون كسر بوّابتك",[135,138,141,144,147,150],{"title":136,"body":137},"معرفة ما تشغّله حاليًا","شغِّل `docker compose ps`. وجود حاوية `supabase-kong` يعني أنك لا تزال على Kong؛ `supabase-envoy` يعني أن التحويل تمّ. تحقق أيضًا من وجود `volumes\u002Fapi\u002Fkong.yml` مُعدَّل عن نسخة المستودع — هو الذي يقرر ما إذا كان الانتقال يستلزم عملًا منك.",{"title":139,"body":140},"النسخ الاحتياطي قبل لمس الـcompose","خذ `pg_dump` كاملًا، وإن سمح مزوِّد الخدمة، لقطة للخادم. التبديل بين البوابتين لا يمسّ مخطط PostgreSQL، لكنه يغير مسار دخول جميع الطلبات: العودة السريعة للخلف أفضل من التشخيص على الهواء.",{"title":142,"body":143},"القرار: نقل أم بقاء","إن كان `kong.yml` الخاص بك هو نفسه في المستودع، فلا شيء لنقله. إن احتوى على مسارات أو إضافات خاصة بك، ثمة مسلكان: ترجمتها إلى إعداد Envoy في `volumes\u002Fapi\u002Fenvoy\u002F`، أو البقاء على Kong مع `sh run.sh config add kong` ريثما تُنجز الأمر. البقاء قرار مشروع، وليس فشلًا.",{"title":145,"body":146},"سحب الـcompose الجديد وإعادة التشغيل","اسحب أحدث نسخة من مجلد `docker` في المستودع الرسمي لـSupabase، ثم `docker compose down && docker compose up -d`. تحقق من أن `api-gw` يصل إلى `healthy` وأن واجهة البرمجة تستجيب على المنفذ 8000.",{"title":148,"body":149},"إعادة TLS إن كنت تستخدم 8443 من Kong","منفذ HTTPS المدمج لم يعد مُتاحًا. أضف إنهاء TLS بـ`docker-compose.caddy.yml` أو `docker-compose.nginx.yml`، أو اتركه للوسيط العكسي الموجود أمام المنفذ 8000. هذه النقطة هي الأكثر تعطلًا، ولا تظهر إلا عند أول استدعاء HTTPS مباشر.",{"title":151,"body":152},"التحقق من التخزين وعناوين URL الموقَّعة","اختبر تنزيلًا من حاوية خاصة عبر URL مُوقَّع مسبقًا. إن حصلت على 403 بعد التبديل، انظر أولًا إلى إعادة كتابة رأس `Host` وقيمة URL العامة لخدمة التخزين: هناك يكمن الفارق بين البوابتين.",{"type":78,"title":154,"headers":155,"rows":159},"Kong وEnvoy نقطة بنقطة",[156,157,158],"الجانب","Kong (قبل أغسطس 2026)","Envoy (الافتراضي منذ)",[160,164,168,172,176,180],[161,162,163],"الخدمة في `docker-compose.yml`","`kong`","`api-gw` — الاسم الشبكي `kong` محفوظ",[165,166,167],"الحاوية","`supabase-kong`","`supabase-envoy`",[169,170,171],"منفذ HTTP","8000","8000 — عبر `API_GW_HTTP_PORT`",[173,174,175],"منفذ HTTPS المدمج","8443","**مُزال** — TLS عبر `docker-compose.caddy.yml` \u002F `.nginx.yml`",[177,178,179],"الإعداد","`volumes\u002Fapi\u002Fkong.yml`","`volumes\u002Fapi\u002Fenvoy\u002F` (YAML مُصدَّر)",[181,182,183],"العودة لـKong","—","`sh run.sh config add kong`",{"type":39,"title":185,"body":186},"CVE-2026-31813: ثغرة OIDC في GoTrue — حدِّث الآن","نُشرت في مارس 2026 ثغرة في GoTrue (Supabase Auth، خدمة المصادقة في Supabase) تحت المرجع CVE-2026-31813. وهي تمسّ تسجيل الدخول برمز ID token لدى مزوّدَي Apple وAzure: كان GoTrue يتحقق من الرمز لدى الجهة المُصدِرة التي يحددها الرمز نفسه، بما في ذلك جهة يتحكم فيها المهاجم.\n\nعمليًا، المهاجم الذي يوقّع من جهة OIDC خاصة به رمز ID token يحمل عنوان البريد الإلكتروني لضحية يحصل على جلسة صالحة (بمستوى AAL1) على حساب هذه الضحية. لا تتأثر إلا النسخ التي فُعِّل فيها مزوّد Apple أو Azure. أما النسخ التي تكتفي بالمصادقة بالبريد الإلكتروني وكلمة المرور أو بالروابط السحرية فهي **غير** معرَّضة.\n\nالإصلاح مضمَّن في **Supabase Auth (GoTrue) 2.185.0**. للتحقق من إصدارك: `docker compose exec auth gotrue version`. إذا كان إصدار gotrue لديك أقدم من 2.185.0، فحدِّث فورًا.",{"type":56,"title":188,"steps":189},"تحديث GoTrue لإصلاح CVE-2026-31813",[190,193,196,199],{"title":191,"body":192},"تحديد الإصدار الحالي","من مجلد مكدس Supabase الخاص بك: `docker compose exec auth gotrue version`. إن أظهرت النتيجة إصدارًا \u003C 2.185.0، فنسختك مكشوفة لـCVE-2026-31813. سجِّل أيضًا إصدار المكدس العام: `grep 'SUPABASE_VERSION' .env` (إن ثبَّته) أو `docker compose images | grep supabase`.",{"title":194,"body":195},"النسخ الاحتياطي قبل التحديث","قبل أي تحديث، انسخ قاعدة البيانات: `(umask 077; docker compose exec -T db pg_dumpall -h localhost -U supabase_admin > \u002Froot\u002Fsupabase-backup-$(date +%F).sql)`، وليس أبدًا في `\u002Ftmp` الذي يقرؤه كل حساب على الخادم. تحديث GoTrue لا يستلزم هجرة مخطط PostgreSQL، لكن النسخة الاحتياطية المسبقة تبقى قاعدة قبل أي تغيير في إصدار بيئة الإنتاج.",{"title":197,"body":198},"التحديث إلى Supabase Auth 2.185.0 أو أحدث","في `docker-compose.yml`، حدِّث علامة صورة `supabase\u002Fgotrue` إلى `v2.185.0` أو أحدث، أو إن كنت تتبع المكدس الكامل، اسحب آخر إصدار متوافق: `docker compose pull && docker compose up -d auth`. تحديث GoTrue وحده لا يستلزم إعادة تشغيل الخدمات الأخرى. تحقق بـ`docker compose exec auth gotrue version` من تفعيل الإصدار الجديد.",{"title":200,"body":201},"التحقق من مصادقة OIDC","بعد التحديث، اختبر تدفق مصادقة كاملًا مع كل مزوِّد OIDC مُهيَّأ: تسجيل دخول، خروج، إعادة دخول. تحقق في سجلات GoTrue (`docker compose logs auth`) من غياب رسائل خطأ متعلقة بالتحقق من `iss` في ظروف الاستخدام الطبيعي.",{"type":118,"title":203,"body":204},"تعطيل Apple وAzure مؤقتًا إن تعذَّر التحديث فورًا","إن تعذّر التحديث الفوري (لأنه يتطلب نافذة صيانة)، قلّل سطح التعرّض بتعطيل مزوّدَي Apple وAzure مؤقتًا. في الاستضافة الذاتية يُضبطان عبر متغيرات البيئة لخدمة `auth`: اجعل `GOTRUE_EXTERNAL_APPLE_ENABLED` و`GOTRUE_EXTERNAL_AZURE_ENABLED` بقيمة `false`، ثم شغّل `docker compose up -d auth`. تبقى المصادقة بالبريد الإلكتروني وكلمة المرور تعمل. هذا الحل مؤقت: لا يصلح الثغرة، بل يقلّل سطح الهجوم فقط ريثما تُعدّ التحديث.",{"type":39,"title":206,"body":207},"هجرة PostgreSQL 15 ← 17: ثبِّت الإصدار قبل أي سحب","في 17 يونيو 2026، ومع الإصدار المستضاف ذاتيًا 0.6.0، غيّرت Supabase صورة PostgreSQL الافتراضية في ملف `docker-compose.yml` الرسمي من الإصدار 15 إلى الإصدار 17 (وهو تغيير أُعلن في 18 مايو 2026 في النقاش [#46080](https:\u002F\u002Fgithub.com\u002Forgs\u002Fsupabase\u002Fdiscussions\u002F46080)). هذا التغيير **مدمِّر** إن تجاهلته: تحذّر الجهة المطوّرة من تشغيل PostgreSQL 17 أبدًا على مجلد بيانات أنشأه PostgreSQL 15. وسحب ملف compose الجديد دون احتياط على نسخة ما زالت على PG 15 يعرّضك لقاعدة لا تعود تقلع.\n\nالفخ الثاني: الإضافات `timescaledb` و`plv8` و`plcoffee` و`plls` **غير مبنية لصورة PG 17**. لا تُثبَّت أيّ منها افتراضيًا؛ وإن أضفت إحداها وتحتاج إلى الاحتفاظ بها، فتنصح الجهة المطوّرة بعدم إطلاق الترقية. تحقّق قبل المتابعة: `docker compose exec db psql -U postgres -c \"\\dx\"` يسرد الإضافات المفعّلة.",{"type":56,"title":209,"steps":210},"الهجرة من PostgreSQL 15 إلى 17 دون فقدان بياناتك",[211,214,217,220,223,226],{"title":212,"body":213},"البقاء على PG 15 قبل أي `docker compose pull`","تحقّق أولًا من إصدارك: `docker compose exec db psql -U postgres -c \"SELECT version();\"`. إن كان يبدأ بـ 15، فاحتفظ بصورة PG 15 ما دامت الهجرة لم تتم: يوفّر المستودع الملف الإضافي `docker-compose.pg15.yml` الذي يثبّت `supabase\u002Fpostgres:15.8.1.085`. أضفه بـ `sh run.sh config add pg15`، أو مرّره يدويًا: `docker compose -f docker-compose.yml -f docker-compose.pg15.yml up -d`. وهو أيضًا هدف التراجع لسكربت الهجرة.",{"title":215,"body":216},"نسخ البيانات ومفتاح pgsodium احتياطيًا","في صدفة root، ابدأ بـ `umask 077`: لن تكون الملفات المُنشأة مقروءة إلا لك. انسخ مجلد البيانات: `cp -a .\u002Fvolumes\u002Fdb\u002Fdata .\u002Fvolumes\u002Fdb\u002Fdata-manual-backup`. ثم احفظ مفتاح الجذر pgsodium، المخزَّن في وحدة Docker المسماة `db-config` لا في هذا المجلد: `docker compose run --rm db cat \u002Fetc\u002Fpostgresql-custom\u002Fpgsodium_root.key > .\u002Fpgsodium_root.key.backup`. من دونه تصبح أسرار Vault غير قابلة للاسترجاع. وإضافة إلى ذلك، تصدير منطقي: `docker compose exec -T db pg_dumpall -h localhost -U supabase_admin > .\u002Fpg15_dump.sql`. انسخ هذه الملفات إلى تخزين خارجي.",{"title":218,"body":219},"التحقق من الإضافات ومساحة القرص","`docker compose exec db psql -U postgres -c \"\\dx\"` يسرد الإضافات المفعّلة. إن ظهرت `timescaledb` أو `plv8` أو `plcoffee` أو `plls` وكنت بحاجة إليها، فتوقّف هنا: لا وجود لها في PG 17. وإلا فسيقترح عليك السكربت حذفها. تحقّق أيضًا من المساحة الحرة: يلزم ضعف حجم القاعدة على الأقل، مضافًا إليه 5 غيغابايت.",{"title":221,"body":222},"جلب مجلد docker المحدَّث","اسحب أحدث نسخة من مجلد `docker` في مستودع Supabase الرسمي، وهو يحتوي على `utils\u002Fupgrade-pg17.sh`. اترك كل حاويات المكدس قيد التشغيل: السكربت يشترط ذلك. لا تحذف أي وحدة Docker يدويًا، وخصوصًا `db-config` التي تحمل مفتاح pgsodium.",{"title":224,"body":225},"تشغيل الهجرة الرسمية","`sudo bash utils\u002Fupgrade-pg17.sh`. يوقف السكربت المكدس، ويشغّل `pg_upgrade` من حاوية PG 15 مؤقتة، ويعيد تفعيل الإضافات في حاوية PG 17، ويبدّل مجلدات البيانات مع الاحتفاظ بالأصل في `.\u002Fvolumes\u002Fdb\u002Fdata.bak.pg15`، ثم يعيد تشغيل Supabase على PG 17. ويطلب التأكيد عند كل خطوة مهمة (`--yes` لتجاوز ذلك).",{"title":227,"body":228},"التحقق ثم التنظيف","تحقّق من الإصدار بـ `docker compose exec db psql -U postgres -c \"SELECT version();\"`، ثم `docker compose ps`، واختبر استدعاء API كاملًا. إن كان `docker-compose.pg15.yml` ما زال مدرجًا في `COMPOSE_FILE`، فأزله بـ `sh run.sh config remove pg15`. وبعد التحقق من كل شيء فقط، احذف `.\u002Fvolumes\u002Fdb\u002Fdata.bak.pg15` و`.\u002Fvolumes\u002Fdb\u002Fpgsodium_root.key.bak.pg15` والأرشيف `.\u002Fvolumes\u002Fdb\u002Fpg17_upgrade_bin_*.tar.gz` لاستعادة المساحة.","استضِف خلفية ‌Supabase الخاصة بك ذاتيًا","يستضيف خادم ‌ServOrbit Cloud VPS مع قالب ‌Docker المُهيّأ مسبقًا وذاكرة ‌RAM سخية حزمة ‌Supabase بالكامل: Postgres وAuth وStorage وAPI عبر HTTPS.","أطلق خادم ‌VPS السحابي الخاص بي","\u002Fvps-cloud",[234,253,270],{"id":235,"slug":236,"slugs":237,"title":241,"excerpt":242,"readTime":243,"views":244,"isPinned":19,"noindex":19,"publishedAt":245,"updatedAt":246,"category":247,"categories":248,"featuredImage":30,"bgImage":31,"posterImage":250,"relatedSolution":251},56,"postgresql-على-خادم-vps-قاعدة-بيانات-موثوقة-ومتحكم-بها",{"fr":238,"en":239,"ar":236,"es":240},"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,1,"2026-04-25T00:00:00+00:00","2026-10-21T15:21:37+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[249],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":34,"appSlug":252},"postgresql-stack",{"id":254,"slug":255,"slugs":256,"title":260,"excerpt":261,"readTime":243,"views":18,"isPinned":19,"noindex":19,"publishedAt":262,"updatedAt":263,"category":264,"categories":265,"featuredImage":30,"bgImage":31,"posterImage":267,"relatedSolution":268},57,"استضافة-mysql-على-خادم-vps",{"fr":257,"en":258,"ar":255,"es":259},"heberger-mysql-vps","hosting-mysql-on-a-vps","alojar-mysql-en-un-vps","استضافة MySQL على خادم VPS: دليل شامل","ثبّت ‎MySQL 8.4 LTS‎ على خادم ‎VPS‎: المتطلبات، التأمين، أداء ‎InnoDB‎، الوصول عن بُعد الآمن، النسخ الاحتياطية التلقائية، واستكشاف الأخطاء.","2026-04-24T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[266],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-mysql-vps-poster.svg",{"categorySlug":34,"appSlug":269},"mysql-stack",{"id":271,"slug":272,"slugs":273,"title":277,"excerpt":278,"readTime":279,"views":18,"isPinned":19,"noindex":19,"publishedAt":280,"updatedAt":281,"category":282,"categories":283,"featuredImage":30,"bgImage":31,"posterImage":285,"relatedSolution":286},58,"استضافة-redis-على-خادم-vps",{"fr":274,"en":275,"ar":272,"es":276},"heberger-redis-vps","hosting-redis-on-a-vps","alojar-redis-en-un-vps","استضافة ‎Redis‎ على خادم ‎VPS‎: الدليل الشامل","انشر ‎Redis‎ على خادم ‎VPS‎ السحابي: متطلبات ‎RAM‎ و‎CPU‎، الأمان (‎ACL‎ و‎TLS‎)، استمرارية ‎RDB\u002FAOF‎، استكشاف الأخطاء والتوافر العالي.",10,"2026-04-23T00:00:00+00:00","2026-09-08T21:59:59+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[284],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-redis-vps-poster.svg",{"categorySlug":34,"appSlug":287},"redis-stack",true,1794270241506]