لماذا تستضيف Cal.com ذاتيًا على خادم VPS
Cal.com تطبيق Next.js يعتمد على PostgreSQL يتولّى جدولة المواعيد وأنواع الأحداث وأوقات التوفّر والمزامنة مع التقاويم (Google وCalDAV وOffice 365). تلبّي الاستضافة الذاتية حاجة محدّدة: التحكم في بيانات توفّر عملائك وحجز مواعيدهم، التي تمرّ عادةً عبر خدمة أمريكية طرف ثالث. على خادم VPS، تلغي قيود الخطة المجانية (نوع حدث واحد، علامة تجارية مفروضة)، وتربط مفاتيح API الخاصة بك لـGoogle/الاجتماعات المرئية، وتضمّن أداة الحجز مباشرةً في موقعك تحت نطاقك. وبما أن Cal.com تطبيق Node دائم مع قاعدة بيانات وبناء إنتاجي، فإنه يتطلّب خادم VPS — إذ لا تستطيع الاستضافة المشتركة تشغيل العملية ولا استضافة PostgreSQL.
فوائد ملموسة لـCal.com المُستضاف ذاتيًا
- أنواع أحداث غير محدودة: مقابلات 15 دقيقة، وعروض توضيحية 30 دقيقة، وورش جماعية، دون حاجز مدفوع (paywall).
- بيانات الحجز لديك: دون أي تسريب لبيانات اتصال العملاء ومواعيدهم إلى خدمة SaaS طرف ثالث.
- علامة بيضاء (white-label) كاملة: يحمل رابط الحجز نطاقك، لا نطاق مطوّر.
- Webhooks وAPI: شغّل الأتمتة (CRM، الفوترة) عند كل موعد يُحجَز.
- تكاملات Google Agenda وCalDAV والاجتماعات المرئية (Jitsi وGoogle Meet) مضبوطة بمفاتيحك الخاصة.
- حجوزات الفريق والتوزيع الدوري (round-robin) لتوزيع المواعيد بين عدة متعاونين.
المتطلبات التقنية
Cal.com أكثر تطلّبًا من متوسط الاستضافة الذاتية بسبب أساسه Next.js وخطوة البناء. خصّص 2 vCPU و4 غيغابايت من RAM و20 غيغابايت من القرص لنسخة فريق مريحة؛ وقد يكفي 2 غيغابايت من RAM للاستخدام الفردي لكن البناء الأولي يكون أضيق. تحتاج إلى Docker وDocker Compose، وقاعدة بيانات PostgreSQL (مشمولة في ملف compose الرسمي)، ونطاق rdv.yourdomain.com موجَّه إلى الخادم VPS، وعدة متغيرات بيئة إلزامية: NEXTAUTH_SECRET وCALENDSO_ENCRYPTION_KEY (مفاتيح مولَّدة عشوائيًا) وNEXT_PUBLIC_WEBAPP_URL مضبوطًا على عنوان HTTPS النهائي. وللمزامنة مع التقويم والاجتماعات المرئية، جهّز معرّفات OAuth الخاصة بـGoogle.
نشر Cal.com خطوة بخطوة
استنساخ مستودع نشر Docker
على الخادم VPS: git clone https://github.com/calcom/docker.git cal-docker && cd cal-docker. يوفّر هذا المستودع ملف docker-compose.yml وملف .env.example لتكييفه.
توليد الأسرار وإعداد البيئة
انسخ .env.example إلى .env، ثم ولّد المفاتيح: openssl rand -base64 32 لـNEXTAUTH_SECRET ولـCALENDSO_ENCRYPTION_KEY. عيّن NEXT_PUBLIC_WEBAPP_URL=https://rdv.yourdomain.com ومعرّفات PostgreSQL.
بناء المكدّس وتشغيله
ابدأ بـdocker compose up -d. يبني التشغيل الأول صورة Next.js ويطبّق عمليات ترحيل Prisma على PostgreSQL — وهي الخطوة الأطول، تابِعها بـdocker compose logs -f.
وضع الوكيل العكسي وSSL
ضع Cal.com (المنفذ الداخلي 3000) خلف وكيل عكسي بـHTTPS. باستخدام Caddy: rdv.yourdomain.com { reverse_proxy calcom:3000 }. تُحصَّل الشهادة تلقائيًا. يجب أن يطابق العنوان NEXT_PUBLIC_WEBAPP_URL تمامًا، وإلا فستفشل المصادقة.
إنشاء الحساب وإعداد أوقات التوفّر
افتح https://rdv.yourdomain.com، وأنشئ حساب المالك، وحدّد فتراتك الزمنية ونوع حدث أول. اختبر حجزًا من البداية إلى النهاية للتحقق من السلسلة.
توصيل التقويم والاجتماعات المرئية
في التكاملات، أضف معرّفات OAuth الخاصة بـGoogle للمزامنة ثنائية الاتجاه للتقويم، وفعّل Jitsi أو Google Meet لتوليد رابط اجتماع مرئي تلقائيًا عند كل حجز.
قد يفشل بناء Cal.com في الذاكرة على خادم VPS بسعة 2 غيغابايت أثناء ترجمة Next.js. إذا رأيت خطأ «JavaScript heap out of memory»، أضِف مؤقتًا ملف swap بسعة 2 غيغابايت (fallocate -l 2G /swapfile && mkswap /swapfile && swapon /swapfile) طوال مدة البناء، ثم أزِله. وبالنسبة للتحديثات، انسخ دائمًا قاعدة بيانات PostgreSQL احتياطيًا قبل docker compose pull لأن عمليات ترحيل Prisma غير قابلة للتراجع.