لماذا باتت الهجرة من Slack أمرًا عاجلًا
في عام 2024، تلقّى نادي Hack Club مطالبة من Slack: 50,000 $ فورًا ثم 200,000 $ سنويًا، أو حذف أحد عشر عامًا من السجل المجتمعي. ليس هذا حالةً استثنائية، بل منطق ناشر يعلم أن سجلّكم أصل استراتيجي واتخذ منه ذريعةً لخطة Enterprise. آليتا الاحتجاز تتضافران: أولاهما السجل، إذ لا يُتيح Slack على الخطتين المجانية وPro إلا نافذةً متحركة، وتستلزم الرؤية الكاملة خطة Business+ أو Enterprise Grid. وثانيتهما SSO: الاتصال بمزوّد الهوية (Okta أو Azure AD أو Google Workspace) محجوز لخطة Enterprise التي تُكلّف نحو 20 $ للمستخدم شهريًا. لفريق من خمسين شخصًا يعني ذلك 12,000 $ سنويًا مقابل ميزة يوفّرها Mattermost وRocket.Chat مجانًا منذ لحظة التثبيت. السؤال الحقيقي إذًا ليس «هل Slack جيد؟» بل «بأي ثمن نقبل الاعتماد على ناشر للوصول إلى محادثاتنا الخاصة مع العملاء؟».
الفوائد الملموسة لاستضافة منصة مراسلة الفريق ذاتيًا
- سجل غير محدود — جميع رسائلكم وقنواتكم ومرفقاتكم متاحة إلى أجل غير مسمى دون تكلفة إضافية.
- SSO وLDAP أصليّان ومجانيّان — اربطوا دليل شركتكم دون الحاجة إلى خطة مؤسسية لدى الناشر.
- البيانات تحت سيطرتكم — مراسلات العملاء والعقود المتناقَشة في الرسائل المباشرة والملفات المشتركة تبقى على بنيتكم التحتية.
- تكلفة يمكن التنبؤ بها — سعر VPS شهري ثابت، لا اشتراك مرتبط بنمو فريقكم.
- تكاملات مخصصة — webhook وبوتات وAPI دون قيود خطة.
- امتثال ميسّر — احتفاظ قابل للتهيئة وتصدير عند الطلب وسجل تدقيق لتلبية المتطلبات القانونية أو التعاقدية.
- استقلالية عن قرارات الناشر — لا تغييرات مفاجئة في الأسعار ولا نافذة 30 يومًا للتكيّف.
Mattermost مقابل Rocket.Chat مقابل Slack Enterprise
| المعيار | Mattermost (استضافة ذاتية) | Rocket.Chat (استضافة ذاتية) | Slack Enterprise Grid |
|---|---|---|---|
| الرخصة | MIT (الخادم) / Apache 2.0 | AGPL-3.0 | مملوكة |
| الذاكرة الدنيا | 2 GB (فريق أقل من 50) | 4 GB (replica set MongoDB إلزامي) | SaaS، لا خادم لإدارته |
| SSO / SAML / LDAP | مجاني في الاستضافة الذاتية | مجاني في الاستضافة الذاتية | نحو 20 $/user/month (خطة Enterprise) |
| السجل الكامل | غير محدود على قرصكم | غير محدود على قرصكم | مشروط بخطة مدفوعة |
| القنوات المتعددة (live chat، بريد، WhatsApp…) | محدود (إضافات المجتمع) | أصلي وكامل | لا (مراسلات داخلية فقط) |
| الاستيراد من Slack | أداة رسمية `mattermost import slack` | استيراد Slack عبر واجهة الإدارة | غير منطبق |
متطلبات الخادم قبل البدء
يبدأ الاختيار بين Mattermost وRocket.Chat من المتطلبات المادية. يستخدم Mattermost قاعدة بيانات PostgreSQL ويمكنه العمل بـ2 GB من الذاكرة لفريق أقل من خمسين، وخادم VPS متواضع يكفي للهجرة الأولية. أما Rocket.Chat فيعتمد MongoDB في وضع replica set: حتى بعقدة واحدة، هذا الوضع إلزامي منذ الإصدار 6، مما يرفع الحد الأدنى إلى 4 GB. برمجيًا، كلاهما يستلزم Docker وDocker Compose، ونطاقًا فرعيًا مخصصًا مع شهادة SSL، وخادم SMTP للإشعارات والدعوات. افتحوا المنفذ 443 وتحققوا أن حركة WebSocket ليست محجوبة، فهي أول نقطة عثرة بعد التثبيت. أخيرًا، خططوا لمساحة قرص تناسب حجم الملفات المشتركة التي تنوون استيرادها.
تصدير سجل Slack
الوصول إلى التصدير من إدارة Slack
سجّلوا دخولكم كمدير لمساحة العمل، انتقلوا إلى الإعدادات والإدارة > إعدادات مساحة العمل > استيراد/تصدير البيانات. تبويب التصدير متاح في خطة Pro وما فوقها.
اختيار النطاق الزمني وإطلاق التصدير
اختاروا «جميع الرسائل» لتصدير كامل السجل المتاح. ينشئ Slack أرشيف ZIP يحتوي ملف JSON لكل قناة عامة، وبيانات المستخدمين، وقائمة القنوات. القنوات الخاصة والرسائل المباشرة لا تُدرج إلا في خطة Business+ أو Enterprise.
تنزيل الأرشيف والتحقق من محتواه
عند اكتمال التصدير (من دقائق إلى ساعات حسب الحجم)، نزّلوا ملف ZIP. فكّوا ضغطه محليًا وتحققوا من وجود مجلدات القنوات وملفَي users.json وchannels.json؛ هذه الملفات الثلاثة هي ما تتوقعه أداة الاستيراد في Mattermost.
نقل الأرشيف إلى الخادم VPS
انسخوا الأرشيف إلى الخادم باستخدام: scp slack_export.zip user@your-vps:/opt/mattermost/imports/. تجنّبوا فكّ الضغط على الخادم قبل الاستيراد — تعمل الأداة مباشرةً على ملف ZIP.
نشر Mattermost على VPS باستخدام Docker
إنشاء هيكل المجلدات
على الخادم، أنشئوا مجلد العمل: mkdir -p /opt/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes,imports}. ستُوصَل هذه المجلدات كأحجام Docker وتحتوي الإعدادات وبيانات المستخدمين والملفات المستوردة.
كتابة ملف docker-compose.yml
عرّفوا خدمتين: postgres (صورة postgres:15) بحجم مُسمّى للبيانات، وmattermost (صورة mattermost/mattermost-team-edition:latest). اربطوهما بشبكة Docker داخلية ووصّلوا المجلدات الخمسة. مرّروا المتغير MM_SQLSETTINGS_DATASOURCE مشيرًا إلى خدمة postgres، ولا تعرّضوا المنفذ 8065 إلا على الحلقة المحلية (127.0.0.1:8065:8065).
إعداد الوكيل العكسي بـCaddy
أنشئوا ملف Caddyfile بالمدخل التالي: chat.yourdomain.com { reverse_proxy localhost:8065 }. يحصل Caddy على شهادة Let's Encrypt ويجددها تلقائيًا. أعيدوا تشغيل Caddy بعد التحقق من أن النطاق الفرعي يشير إلى IP الخادم.
تشغيل الـstack وإنشاء حساب المدير
نفّذوا docker compose up -d، انتظروا نحو ثلاثين ثانية وراقبوا السجلات بـdocker compose logs -f mattermost. افتحوا https://chat.yourdomain.com لإنشاء حساب المدير الأول عبر معالج الإعداد.
إعداد SMTP والإشعارات
في النظام > الإشعارات > البريد الإلكتروني، أدخلوا بيانات خادم SMTP. أرسلوا بريدًا تجريبيًا قبل المتابعة: دعوات المستخدمين وإشعارات الرسائل تعتمد على هذا الإعداد.
تفعيل SSO أو LDAP
في النظام > المصادقة، فعّلوا LDAP أو SAML وفق دليل شركتكم. كلاهما متاح مجانًا في الاستضافة الذاتية دون قيود. اختبروا الاتصال بحساب خدمة قبل دعوة مستخدميكم.
استيراد سجل Slack إلى Mattermost
إعداد الاستيراد بالأداة الرسمية
أداة mattermost import slack مدمجة في ثنائي Mattermost. من حاوية Docker نفّذوا: docker compose exec mattermost mattermost import slack /mattermost/imports/slack_export.zip --team اسم-فريقكم. تحوّل الأداة تنسيق JSON من Slack إلى تنسيق Bulk Import وتُبلّغ عن أي تعارضات.
تنفيذ الاستيراد الجماعي
بعد التحويل، يولّد Mattermost ملف JSONL. نفّذوا الاستيراد الفعلي بـdocker compose exec mattermost mattermost import bulk /mattermost/imports/mattermost_import.jsonl --workers 1. الخيار --workers 1 يتجنب تعارضات الكتابة على القواعد متوسطة الحجم.
التحقق من القنوات والمستخدمين المستوردين
بعد اكتمال الاستيراد، سجّلوا دخولكم وتحققوا من ظهور القنوات العامة وصحة الرسائل التاريخية وأسماء المؤلفين، ومن قدرة المستخدمين المستوردين على تسجيل الدخول عبر دعوة البريد الإلكتروني.
التعامل مع المرفقات المفقودة
لا يشمل تصدير Slack القياسي الملفات المرفقة في الخطط دون Business+. إن كانت ثمة مرفقات مفقودة ستظهر الرسائل بروابط معطّلة. وثّقوا القنوات المتأثرة وأبلغوا مستخدميكم: ستحتاجون إلى إعادة إرفاق الملفات الحيوية يدويًا.
البديل: Rocket.Chat لدعم عملاء موحّد
إن تجاوزت احتياجاتكم المراسلة الداخلية وشملت دعم العملاء في الوقت الفعلي، يُعدّ Rocket.Chat الخيار الأمثل في عالم المصدر المفتوح. تتيح وحدته متعددة القنوات تركيز المحادثات من أداة live chat على موقعكم والبريد الوارد ورسائل WhatsApp Business وقنوات Telegram في واجهة واحدة. يرى وكلاء الدعم قائمة تذاكر موحدة مع السجل الكامل لكل جهة اتصال. يميّز هذا التوجه الأداتين بوضوح: Mattermost منصة مراسلة فريق منظّمة قريبة من Slack في استخداماتها، وRocket.Chat منصة تواصل تستوعب أيضًا قنوات العملاء الخارجية. في المقابل، تزداد تعقيدات التثبيت: replica set MongoDB إلزامي، والموارد الدنيا أعلى، وتهيئة القنوات المتعددة تستوجب ضبطًا دقيقًا للتوجيه والوكلاء. لوكالة تدير تواصلًا مع العملاء وتريد توحيد المراسلة الداخلية والدعم في منصة واحدة، Rocket.Chat هو المرشح الطبيعي. لفريق تقني يبحث فحسب عن بديل لـSlack دون تعقيد إضافي، Mattermost هو المسار الأقصر.
SSO والمصادقة: استثمروا الاستضافة الذاتية
في الاستضافة الذاتية، تتوفر LDAP وSAML 2.0 والمصادقة بالشهادة دون قيود خطة أو تكلفة إضافية. هيّئوا منذ البداية الاتصال بدليلكم (Active Directory أو FreeIPA أو مزوّد الهوية السحابي) حتى لا يضطر مستخدموكم لإدارة حساب إضافي. فعّلوا كذلك المصادقة الثنائية (TOTP) في إعدادات الأمان — كلا المنصتين تدعمانها أصلًا. إن استخدمتم وكيل مصادقة كـAuthelia أو Authentik، تحققوا من أن وكيلكم العكسي يمرّر صحيحًا ترويسات X-Forwarded-For وX-Real-IP قبل فرض المصادقة الخارجية.
استكشاف الأخطاء: أكثر المشكلات شيوعًا
أربع مشكلات تتكرر بعد تثبيت ناجح. الأولى تخص MongoDB مع Rocket.Chat: إن بدأت الحاوية ثم توقفت بخطأ MongoServerError: not master، فـreplica set لم يُهيَّأ بعد. اتصلوا بـMongoDB shell بـdocker compose exec mongodb mongosh ونفّذوا rs.initiate() مرة واحدة فقط عند الإقلاع الأول. الثانية تتعلق بـWebSocket: إن أظهر Mattermost «انقطع اتصال WebSocket» باستمرار، تحققوا من أن وكيلكم العكسي يمرّر ترويسة Upgrade وConnection. مع Caddy يحدث ذلك تلقائيًا؛ مع Nginx أضيفوا proxy_http_version 1.1 وproxy_set_header Upgrade $http_upgrade وproxy_set_header Connection upgrade. الثالثة تخص الإشعارات على الجوّال: تتصل تطبيقات Mattermost افتراضيًا بخدمة الإشعارات لدى Mattermost Inc.؛ إن منعت سياسة أمانكم ذلك، ثبّتوا خادم push خاصًا أو عطّلوا إشعارات الجوّال. الرابعة تتعلق بـSMTP: بريد تجريبي يصل لكن دعوات لا تصل يعني في الغالب مشكلة في SPF أو DKIM. راجعوا سجلات DNS واختبروا الإرسال بـmail-tester.com قبل ترحيل مستخدميكم.