نشر 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 |
للمزيد
- Directus Docs docs.directus.io
- Coolify Docs coolify.io/docs
- Cloudflare R2 developers.cloudflare.com/r2
- Directus Self-Hosted Guide docs.directus.io/self-hosted