تطوير الويب

نشر Directus على Coolify مع Postgres: درس كامل 2026

5 دقائق للقراءة

نشر Directus على Coolify يجمع أفضل ما في العالمين: headless CMS قوي مفتوح المصدر، على منصة استضافة ذاتية بسيطة. هذا الدرس يقدم تثبيتاً كاملاً جاهزاً للإنتاج في 8 خطوات: إعداد Coolify، PostgreSQL، Directus، SSL، النسخ الاحتياطي، الأداء.

المتطلبات

  • VPS بـ 4 GB RAM (8 GB موصى لـ production)
  • Coolify v4.0+ مثبّت
  • نطاق + DNS يشير للـ VPS
  • الوقت المقدر: ساعة ونصف

الخطوة 1 — إنشاء Project

# في Coolify:
Projects → New Project
  Name: my-cms
  Description: Directus CMS production

# داخل Project:
Resources → New Resource
  - PostgreSQL (للقاعدة)
  - Directus (التطبيق)

تنظيم كل شيء في Project واحد يبسّط الإدارة: الـ resources مرتبطة، يمكنك ربط Directus بـ PostgreSQL في خطوة واحدة. للمشاريع متعددة (Directus + Outline + Vaultwarden)، أنشئ Project لكل واحد. هذا يفصل أيضاً صلاحيات الوصول للفرق.

الخطوة 2 — PostgreSQL

# Resources → New → Database → PostgreSQL 18
Name: directus-db
DB Name: directus
User: directus
Password: قوي عشوائي 24 char
Resources: 1 GB RAM, 10 GB disk

# Connection internal (داخل Coolify):
postgresql://directus:password@directus-db:5432/directus

1 GB RAM يكفي لـ Directus بنطاق 100K records و50 concurrent users. تجاوزت ذلك → ترفع لـ 2-4 GB. الـ Internal connection (داخل Coolify network) أكثر أماناً + أسرع من Public. لا تفتح port PostgreSQL على الإنترنت إلا للضرورة.

الخطوة 3 — Directus container

# Resources → New → Application → Docker Image
Image: directus/directus:11
Name: directus-app
Port: 8055

Environment variables:
  KEY: random-32-chars
  SECRET: random-32-chars
  DB_CLIENT: pg
  DB_HOST: directus-db
  DB_DATABASE: directus
  DB_USER: directus
  DB_PASSWORD: ${PG_PASSWORD}
  ADMIN_EMAIL: admin@example.com
  ADMIN_PASSWORD: SuperPassword2026!
  PUBLIC_URL: https://cms.example.com
  CORS_ENABLED: true
  CORS_ORIGIN: https://app.example.com

Volumes:
  /uploads → directus-uploads
  /extensions → directus-extensions

KEY و SECRET حرجان: استخدم سلاسل عشوائية حقيقية (32+ char). قائمة CORS_ORIGIN يجب أن تطابق نطاقات الـ frontends التي ستستهلك API. الـ volumes تحفظ الملفات المرفوعة بين restarts. بدون volume على /uploads، الصور والملفات تُفقد عند إعادة تشغيل container.

الخطوة 4 — Domain + SSL

# في Directus app settings:
Domain: cms.example.com
Generate SSL: Let's Encrypt (مدمج Coolify)
Force HTTPS: Yes

# Coolify يدير cert renewals تلقائياً كل 90 يوم
# تحقق من DNS قبل التطبيق:
dig cms.example.com
# يجب أن يعطي IP الـ VPS

DNS يجب أن ينتشر قبل توليد الـ certificate. عادة 5 دقائق إلى ساعة بعد إنشاء A record. إذا كنت خلف Cloudflare، استخدم وضع « Full (strict) » — يجب أن يكون الـ cert صالحاً على الـ origin. خيار « Flexible » غير آمن، لا تستخدمه.

الخطوة 5 — File Storage على S3

الـ files المرفوعة (صور، PDFs) محلية افتراضياً. للنمو، نقلها إلى S3 (أو R2 الأرخص) يحرّر مساحة القرص ويحسن الأداء.

# أضف environment variables:
STORAGE_LOCATIONS: s3
STORAGE_S3_DRIVER: s3
STORAGE_S3_KEY: AWS_ACCESS_KEY
STORAGE_S3_SECRET: AWS_SECRET_KEY
STORAGE_S3_BUCKET: cms-uploads-myapp
STORAGE_S3_REGION: eu-west-1
STORAGE_S3_ENDPOINT: https://s3.eu-west-1.amazonaws.com
# لـ R2 (Cloudflare):
STORAGE_S3_ENDPOINT: https://accountid.r2.cloudflarestorage.com

# أعد تشغيل Directus
# الـ uploads الجديدة تذهب إلى S3 تلقائياً
# الموجودة محلياً تبقى — إن أردت نقلها، سكريبت migration

R2 من Cloudflare أرخص لكثرة Egress: 0 USD egress + 0.015 USD/GB تخزين. ممتاز لـ CMS (الصور تُقرأ كثيراً). AWS S3 موثوق لكنه مكلف على egress (0.09 USD/GB أحياناً). للمشاريع الكبيرة (1+ TB)، Cloudflare R2 يوفر ألاف الدولارات سنوياً.

الخطوة 6 — Backups

# في Coolify لـ PostgreSQL:
Directus-db → Backups → Configure
  Schedule: 0 3 * * *  (3 صباحاً يومياً)
  Storage: production-backups (S3)
  Retention: 30 days
  Encryption: enabled

# للـ uploads على S3، Versioning مفعّل في bucket
# يحمي من الحذف العرضي

# اختبار استرداد:
# نزّل آخر backup
# استورد على staging instance
# تحقق أن البيانات سليمة

اختبار الاسترداد كل ربع سنة إلزامي. نسخة احتياطية لم تُختبر = ليست نسخة احتياطية. سيناريو: قاعدة بيانات تالفة، تنزل آخر backup، تحاول الاستيراد، تكتشف أن الـ extension ناقصة → نسبة الفشل في حالة طارئة 80%. الاختبار يكشف مثل هذه المشاكل قبل الكارثة.

الخطوة 7 — Monitoring + Alerts

# Coolify يأتي مع Prometheus + Grafana مدمجين
# الوصول: مانيتور Project → Resource → Metrics

# المؤشرات الأهم:
- CPU usage (تنبيه عند 70%+)
- Memory usage (تنبيه عند 85%+)
- Disk usage (تنبيه عند 80%+)
- Response time (Directus API)
- Error rate (5xx responses)

# تنبيهات على Slack:
Settings → Notifications → Slack
Notify on: Resource down, High CPU, Backup failed

Uptime monitoring خارجي مهم: لو سقط VPS كاملاً، Coolify لا يمكن تنبيهك. UptimeRobot (مجاني)، Better Stack، Pingdom. ping كل 5 دقائق + Slack/SMS عند فشل ping. هذه الطبقة الإضافية تكشف الكوارث الكبرى قبل أن يخبرك الزبائن.

الخطوة 8 — تحسين الأداء

Directus على VPS متوسط يخدم 50-100 concurrent users بسلاسة. للمزيد، تحسينات:

التحسين التأثير
Redis cache API responses أسرع 5-10×
CDN للملفات صور تصل بأقل من 50ms عالمياً
Database indexes queries 10-100× أسرع
Asset transformations Directus يقوم بهم أصلاً
Connection pool (pgBouncer) +1000 concurrent
# تفعيل Redis cache في Directus:
# Resources → New → Redis

# ثم في Directus environment:
CACHE_ENABLED: true
CACHE_STORE: redis
CACHE_REDIS: redis://directus-redis:6379
CACHE_TTL: 5m
ASSETS_CACHE_TTL: 30d

Cache TTL 5 دقائق للـ API يقلّل DB load بـ 70-80% مع تأثير ضئيل على الـ freshness. للأصول (الصور)، 30 يوم آمن لأن Directus يضيف hash للـ URL عند تغيير الصورة. Redis يبقى رخيصاً (1 GB RAM = 1M+ key).

أخطاء شائعة

المشكلة السبب الحل
Directus لا يبدأ DB غير جاهزة انتظر 30 ثانية، أعد start
Uploads تختفي بعد restart volume غير معدّ أضف volume على /uploads
CORS errors CORS_ORIGIN ناقص أضف الـ frontend domain
SSL cert فشل DNS لم ينتشر انتظر، tools.com/dns-check
API بطيء على lists كبيرة غياب indexes أنشئ indexes في DB
Storage ينفجر uploads محلية انتقل إلى R2/S3

للمزيد

مقالات ذات صلة

مشاركة