الرجوع لكل المقالات
uncategorized

دليل ماستر لاستضافة PostgreSQL بنفسك (Dokploy+VPS)

4 دقايق قراءة
12 مشاهدة

Pasted image 20260125195930Pasted image 20260125195930النسخة: Postgres 17.7 (Server) | Postgres 18.1 (Local Client) الحالة: ✅ SSL Enabled | ✅ WAL Logical Enabled | ✅ Multi-Tenant Ready هذا الدليل وثائق إعداد وتشغيل كامل لمثيل PostgreSQL جاهز للإنتاج، متعدد المستأجرين، ومضيف على Oracle Cloud (OCI) ، ومُنشأ عبر Dokploy ، وأمن عبر SSL. كما يغطي أذونات المستوى Scheme المناسبة للصواميل الحديثة مثل Next.js, Prisma, و migrations.

0. المتطلبات السابقة

  • OCI VM (يُفضل Ubuntu/Debian)
  • Dokploy مُثبت
  • Cloudflare DNS
  • Docker & Docker Compose
  • عميل PostgreSQL محلي (psql)

1. إعداد Cloudflare DNS 🌐

لإظهار PostgreSQL بأمان عبر نطاق مخصص، يجب تعطيل وكيل Cloudflare.

سجل DNS

  • النوع: A
  • الاسم: pg
  • IPv4: 193.123.91.169
  • حالة الوكيل: ☁️ DNS Only (Grey Cloud)

⚠️ مهم سحابة Cloudflare البرتقالية تمنع منافذ غير HTTP مثل 5432.


2. جدار الحماية وأمان الشبكة 🔐

يجب السماح ل Postgres على مستوى OCI ومستوى نظام التشغيل.

أ. قائمة أمان OCI Networking → Security Lists → Default Security List

أضف قاعدة الوارد: |الإعداد|القيمة| |---|---| |المصدر|0.0.0.0/0| |البروتوكول|TCP| |المنفذ|5432|

ب. جدار حماية نظام التشغيل الخادم (مستدام)

تشغيل على جهاز VM المضيف (ليس داخل Docker):

sudo iptables -I INPUT 6 -p tcp --dport 5432 -j ACCEPT 
sudo netfilter-persistent save 

3. Dokploy – PostgreSQL مع SSL & WAL 🐳

يستخدم هذا الإعداد صورة PostgreSQL 17 مع SSL مسبقًا وتمكين التكرار المنطقي (مطلوب ل Prisma Pulse, CDC, إلخ).

services: 
  postgres-db: 
    image: ghcr.io/railwayapp-templates/postgres-ssl:17 
    restart: always 
    environment: 
      POSTGRES_USER: ${POSTGRES_USER:-my-pg-user} 
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-my-pg-password} 
      POSTGRES_DB: ${POSTGRES_DB:-my-pg-db} 
    command: 
      - "postgres" 
      - "-c" 
      - "wal_level=logical" 
      - "-c" 
      - "max_replication_slots=10" 
      - "-c" 
      - "max_wal_senders=10" 
    volumes: 
      - postgres_data:/var/lib/postgresql/data 
    ports: 
      - "5432:5432" 
    networks: 
      - dokploy-network 
networks: 
  dokploy-network: 
    external: true 
volumes: 
  postgres_data: 

4. الاتصال الأولي والتأكيد 🔌

الاتصال من جهاز محلي

psql postgresql://my-pg-user:[email protected]:5432/my-pg-db 

النتيجة المتوقعة:

  • ✅ اتصال SSL
  • ✅ يُجيب الخادم (لا يُحدث انتهاءً بالوقت)

5. هندسة التenant المتعددة (المستخدمون والقواعد) 🏗️

يحصل كل مشروع على:

  • قاعدة بيانات واحدة
  • مستخدم مخصص واحد
  • أذونات على مستوى Scheme هذا يمنع الوصول عبر المشاريع ويدعم عمليات نقل Prisma.

6. إنشاء المستخدمين والقواعد 👤📦

تشغيل أثناء الاتصال كمستخدم Postgres الرئيسي.

مشاريع مثال تم إنشاؤها

CREATE USER database_user WITH PASSWORD 'secure_password'; 
CREATE DATABASE example_db OWNER example_user; 
GRANT ALL PRIVILEGES ON DATABASE example_db TO myportfolio_user; 

🔐 أفضل ممارسة استخدم كلمات مرور فريدة قوية لكل مستخدم


7. مطلوب: صلاحيات على مستوى السكما ( مهم جداً ⚠️)

بدون كده، Prisma / migrations هتفشل حتى لو ملكية القاعدة البيانية صح.


خطوة 1: اتصل بالقاعدة البيانية اللي انتا مستخدمها

\c zamalek_store_db

خطوة 2: اعطِ صلاحيات الوصول للسكما

GRANT USAGE ON SCHEMA public TO example_user;

خطوة 3: اعطِ صلاحيات الجدول والتسلسل

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO example_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO example_user;

خطوة 4: اعطِ صلاحيات تلقائية للجدول الجديد (مايجرشنز)

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO example_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO example_user;

✅ ده بيضمن ان الجدول الجديد اللي بيخلقو ببريما يعمل تلقائيا.

8. سترينج الاتصال 🔗

استخدم ده الشكل في كل مكان (تطبيقات، بريما، مايجرشنز):

postgresql://user:[email protected]:5432/db_name?sslmode=require

9. هجرة البيانات (لوكال → سيرفر) 🚚

الطريقة الأمان للهجرة عبر إصدارات بوستجريس:

docker run --rm -i postgres:17-alpine psql \
"postgresql://user:PASSWORD@vps-ip-or-domain:5432/db_name?sslmode=require" \
< your_local_dump.sql

10. قائمة التحقق ✅

شغل دول داخل psql: |التحقق|الأمر|النتيجة المتوقعة| |---|---|---| |تمكين WAL|SHOW wal_level;|logical| |SSL نشط|SELECT ssl_is_used();|t| |الإصدار|SELECT version();|PostgreSQL 17.x|

✅ النتيجة النهائية

لدولك دلوقتي:

  • 🔐 بوستجريس آمنة بال SSL
  • 🧱 قواعد بيانية متعددة معزولة
  • 🔄 صلاحيات بريما جاهزة
  • ☁️ إعدادات OCI + Dokploy محسنة
  • 🧠 كتاب إرشادي قابل لإعادة الاستخدام لمشاريع未来

لو عايز، نقدر نعمل:

  • 🔁 نعمل ده قالب للمشاريع الجديدة
  • 🔐 نضيف مستخدمين قراءة فقط
  • 📊 نضيف pgAdmin / مراقبة
  • 🧪 نضيف تلقائية النسخ الإحتياطي والاستعادة قول كلمة 🚀