النسخ الاحتياطي والترقيات
ما الذي يجب نسخه احتياطياً، وكيف تستعيده على مضيف جديد، وكيف تجري الترقية، وكيف تنقل خادم Mattermost أو مجتمعاً واحداً إلى Antimatter.
ما الذي يجب نسخه احتياطياً
| العنصر | مع ملف compose الخاص بالموقع | مع أرشيف الإصدار | باستخدام حزمة .deb أو .rpm |
|---|---|---|---|
| قاعدة البيانات: الرسائل، المستخدمون، المجتمعات، القنوات، والإعدادات (عند استخدام ملف compose الخاص بالموقع) | الحجم antimatter_postgres، عبر pg_dump | قاعدة بيانات PostgreSQL الخاصة بك | قاعدة بيانات PostgreSQL الخاصة بك |
| الملفات المرفوعة، الصور، والتطبيقات المثبتة | الحجم antimatter_files (تخزين S3) | FileSettings.Directory، الافتراضي هو ./data/ | /var/lib/antimatter |
| ملف الإعدادات | (في قاعدة البيانات) | config/config.json | /etc/antimatter/config/config.json |
| ملفات GIF والملصقات | الحجم antimatter_gifs | مجلد بيانات خدمة GIF | /var/lib/gifs-server |
| الأسرار | .env (و compose.override.yaml) | ملف البيئة الخاص بك | /etc/antimatter/antimatter.env, /etc/gifs-server |
| مفتاح تشفير الذكاء الاصطناعي، الذي يُشفّر مفاتيح اتصالات النماذج | AM_AI_ENCRYPTION_KEY في .env (موصى به)، أو الملف ai-encryption.key في مجلد antimatter_data | AM_AI_ENCRYPTION_KEY، أو data/ai-encryption.key | AM_AI_ENCRYPTION_KEY في antimatter.env، أو /var/lib/antimatter/data/ai-encryption.key |
بدون مفتاح تشفير الذكاء الاصطناعي، لا يستطيع الخادم المُستعاد قراءة مفاتيح واجهة برمجة التطبيقات الخاصة باتصالات النماذج، ويجب إعادة إدخال كل مفتاح يدويًا. احتفظ بنسخة من المفتاح منفصلة عن نسخ احتياطية لقاعدة البيانات، حتى لا تحتوي النسخة المسروقة على كليهما. راجع مفتاح التشفير.
قاعدة البيانات والملفات متلازمان: انسخهما احتياطياً في نفس الوقت، واحتفظ بنسخ منهما خارج الخادم. تبدأ أسماء الأحجام باسم مشروع compose، antimatter (تُعرض القائمة عبر docker volume ls).
النسخ الاحتياطي
من مجلد compose.yaml. إيقاف Antimatter أولاً يمنحك نسخة متسقة تماماً؛ والنسخة المأخوذة أثناء التشغيل غالباً ما تكون جيدة، لكن الملفات المرفوعة أثناء النسخ الاحتياطي قد لا تكون موجودة فيها.
stamp=$(date +%Y%m%d-%H%M%S)
mkdir -p backups
docker compose stop antimatter
# Database
docker compose exec -T postgres pg_dump -U antimatter -d antimatter -Fc \
> "backups/antimatter-db-$stamp.dump"
# File storage, GIF service and the data directory (the AI key file)
for v in files gifs data; do
docker run --rm -v "antimatter_$v:/data:ro" -v "$PWD/backups:/backup" \
alpine tar -czf "/backup/antimatter-$v-$stamp.tar.gz" -C /data .
done
docker compose start antimatter
# Secrets
cp .env "backups/env-$stamp"
إذا لم تضبط AM_AI_ENCRYPTION_KEY، فإن ملف مفتاح الخادم موجود في مجلد data، والذي يحفظه الحلقة أعلاه مع الملفات. الأفضل وضع محتواه في .env كما يشرح مفتاح التشفير، والاحتفاظ بنسخة منه منفصلة عن نسخ احتياطية لقاعدة البيانات.
شغّله من cron للنسخ الاحتياطي اليومي، وانسخ مجلد backups/ إلى جهاز آخر. احتفظ بنسخ .env بأمان مساوٍ للخادم: فهي تحتوي على كلمات المرور الخاصة به.
لنسخ الملفات المرفوعة كائنًا تلو الآخر (على سبيل المثال إلى تخزين S3 آخر)، استخدم أداة سطر الأوامر AWS الخاصة بخدمة bucket:
docker compose run --rm -v "$PWD/backups/files:/backup" bucket \
"aws --endpoint-url http://files:9000 s3 sync s3://antimatter /backup"
عند استخدام أرشيف إصدار، احفظ نسخة احتياطية من قاعدة البيانات باستخدام pg_dump -Fc، ومجلدي data/ وconfig/ باستخدام أدواتك المعتادة (يحتوي data/ على ملف مفتاح الذكاء الاصطناعي). عند استخدام الحزم، احفظ نسخة احتياطية من قاعدة البيانات بالطريقة نفسها، ومن /etc/antimatter، /var/lib/antimatter، /etc/gifs-server و/var/lib/gifs-server.
الاستعادة على مضيف جديد
ضع compose.yaml، و .env المحفوظ، والنسخ الاحتياطية في مجلد جديد، ثم:
stamp=20261016-030000 # the backup to restore
docker compose create # creates the volumes, starts nothing
docker compose up -d postgres
docker compose exec -T postgres pg_restore -U antimatter -d antimatter --no-owner \
< "backups/antimatter-db-$stamp.dump"
for v in files gifs data; do
docker run --rm -v "antimatter_$v:/data" -v "$PWD/backups:/backup" \
alpine tar -xzf "/backup/antimatter-$v-$stamp.tar.gz" -C /data
done
docker compose up -d
استخدم نفس ملف .env: يجب أن تحتفظ وحدة التخزين وقاعدة البيانات بكلمات المرور التي كانت لديها، وتحتاج اتصالات النماذج إلى نفس مفتاح تشفير الذكاء الاصطناعي. إذا كان المضيف الجديد له عنوان آخر، حدّث SITE_URL (وDOMAIN).
اختبر نسخك الاحتياطية من خلال استعادتها على جهاز آخر من حين لآخر.
الترقية
data: كان ملف مفتاح الذكاء الاصطناعي داخل الحاوية. قبل استخدام ملف compose.yaml الجديد، وإذا لم يحتوي .env على AM_AI_ENCRYPTION_KEY، احفظ المفتاح الذي أنشأه الخادم: echo "AM_AI_ENCRYPTION_KEY=$(docker compose exec -T antimatter cat /antimatter/data/ai-encryption.key)" >> .env. إذا لم يجد الأمر أي ملف، فلا توجد أي اتصال نموذج قد حفظ مفتاحًا بعد.- أنشئ نسخة احتياطية.
- غيّر وسم الصورة في
.env(ANTIMATTER_IMAGE)، إذا كنت تثبته، كما يُوصى به. - اسحب الصورة وأعد التشغيل:
docker compose pull docker compose up -d docker compose logs -f antimatter
عند بدء التشغيل، يحدّث الخادم مخطط قاعدة البيانات (يمكنك متابعة ذلك في السجل؛ وقد يستغرق الأمر عدة دقائق على خادم كبير) ويثبّت الإصدارات الأحدث من التطبيقات المضمّنة من الصورة. عند استخدام أرشيف الإصدار: أوقف الخادم، واستبدل كل شيء باستثناء config/، data/، logs/، plugins/، وclient/plugins/ بمحتوى الأرشيف الجديد، ثم أعد تشغيله. عند استخدام حزمة .deb أو .rpm، ثبّت الحزمة الجديدة كما يشرح ترقية الحزمة.
antimatter-next إلى antimatter.الإصدارات
يُبلّغ خادم Antimatter عن إصدار خط Mattermost الذي يستند إليه (حاليًا 12.0.0). للإصدارات على GitHub، مع أرشيفاتها وحزمها، أرقام إصدار خاصة، في سلسلة 0.9.0 خلال فترة بيتا: يعرض antimatter version ذلك كـرقم الإصدار. تُعاد بناء الصور من فروع main: antimatter-next كل ليلة (وسوم nightly-<YYYYMMDD>)، وكلا من الصور عند كل تغيير (وسوم sha-<commit>). ثبّت أحد هذه الوسوم، وترفّع عمدًا، واحتفظ بتدوين الوسم السابق حتى تعرف أي نسخة احتياطية تتوافق معه.
الإصدارات الرئيسية لـ PostgreSQL
يستخدم ملف compose postgres:17-alpine. يحتاج Antimatter إلى PostgreSQL 15 أو أحدث. لا يمكن لإصدار رئيسي جديد من PostgreSQL قراءة مجلد بيانات الإصدار السابق: للانتقال إلى إصدار جديد، قم بتصدير قاعدة البيانات، ابدأ الإصدار الجديد على مجلد جديد، واستعِد التصدير فيه.
الترقية إلى 0.9.0
يُجري أول تشغيل للإصدار 0.9.0 (أو صورة مبنية من 17 أكتوبر 2026 فصاعدًا) بعض التغييرات لمرة واحدة على البيانات. يُنفَّذ كل منها مرة واحدة، ويُسجَّل في قاعدة البيانات. تُنقل هذه التغييرات ما كان متروكًا على إعداد افتراضي قديم إلى الإعداد الجديد، وتترك ما اختاره المدير. تابعها في السجل.
AM_TEAMSETTINGS_DEFAULTCOMMUNITYKIND=workplace. تمنح الترقية كل مجتمع النوع الذي يكون عليه هذا الإعداد في تلك اللحظة، وتكون المكالمات متوقفة افتراضياً في قنوات المجتمعات من نوع Guild. راجع Guild أو مساحة عمل.| العنصر | التغيير |
|---|---|
| أنواع المجتمع | يُخصَّص لكل مجتمع نوع، إما Guild أو مساحة عمل، وهو قيمة نوع المجتمعات الجديدة (TeamSettings.DefaultCommunityKind) عند أول تشغيل. ويُحتفظ بأي نوع مُعيَّن مسبقاً. يمكن لمديري المجتمع تغيير نوع مجتمعهم لاحقاً من خلال إعدادات الفريق › عام. |
| من يُرشف القنوات | لم يعد أعضاء القناة يؤرشفون القنوات التي ينضمون إليها؛ بل يقوم بذلك مديرو المجتمع. في مساحة العمل، يؤرشفها أيضاً مديرو القناة (أي من أنشأها ومن عيَّنهم كمديرين). يُغيِّر هذا أدوار مخطط النظام؛ وتُترك مخططات الأذونات التي أنشأها مدير النظام لبعض المجتمعات كما هي. |
| دور المشرفين في قوالب التخطيط | يحصل دور المشرفين الذي تحصل عليه المجتمعات من قالب التخطيط على صلاحية إزالة أشخاص، وهي صلاحية ضرورية لإيقاف مؤقت للأشخاص وإزالتهم. لا تتغير إلا الأدوار التي ما زالت مطابقة تمامًا لما أنشأه القالب؛ أما الأدوار التي عدّلها شخص ما فتُترك كما هي. |
| الأدوار التي تحتوي على مدير | تصبح الآن أيّ دور مجتمعي مُفعّل بمفتاح مدير حائزًا على جميع الصلاحيات التي يمكن لإداريي المجتمع تنفيذها، كما يشير المفتاح، وليس فقط إعدادات المجتمع. |
| حدّ الأعضاء | الحد الأقصى لعدد الأعضاء في كل مجتمع (TeamSettings.MaxUsersPerTeam) ينتقل من 50، وهو الحد الافتراضي السابق، إلى 0 (بدون حد). تُحفظ أي قيمة أخرى، وكذلك أي حد مُعيَّن باستخدام AM_TEAMSETTINGS_MAXUSERSPERTEAM. |
| اتصالات النماذج | يحصل مسؤولو النظام على إدارة اتصالات النماذج، بينما يحصل مسؤولو المجتمع (والأدوار التي تحمل صلاحية مدير) على إدارة اتصالات نماذج مجتمعهم. تصبح خدمات الذكاء الاصطناعي لتطبيق الوكلاء اتصالات نماذج على مستوى الخادم، راجع ما يلي. |
| تصبح ساحة المدينة القناة العامة | يتم إعادة تسمية القناة الافتراضية لكل مجتمع من town-square (Town Square) إلى general (General). تحافظ القناة على معرّفها وأعضائها ورسائلها وإعداداتها، بالإضافة إلى الاسم المعروض الذي اختاره المسؤولون. لا تزال الروابط القديمة والبحث باستخدام town-square تؤدي إلى القناة. المجتمعات التي لديها بالفعل قناة باسم general، حتى لو كانت مؤرشفة، تحتفظ بقناة town-square كقناة افتراضية، وكذلك المجتمعات التي تكون قناة town-square فيها مؤرشفة: تُذكر هذه القنوات في السجل، ويمكن للمسؤولين إعادة تسميتها. |
| المفضلة | دور «المشرفين» في قوالب التخطيط |
خدمات تطبيق الوكلاء
تنسخ الترقية كل خدمة ذكاء اصطناعي من تطبيق الوكلاء إلى اتصال نموذج على مستوى الخادم، مشترك بين جميع المجتمعات ويمكن للجميع استخدامه باستثناء الضيوف (فعِّل الضيوف أيضاً للسماح لهم باستخدامه). تُشفَّر المفاتيح أثناء النسخ، لذا يحتاج الخادم إلى مفتاح تشفير الذكاء الاصطناعي الخاص به: على مجموعة خوادم (Cluster) توجد ملفاتها في S3، اضبط AM_AI_ENCRYPTION_KEY أولاً، وإلا سيتوقف النسخ حتى إعادة التشغيل التالية. ثم راجع وحدة التحكم بالنظام › الذكاء الاصطناعي › اتصالات النماذج:
- يحافظ كل اتصال على معرّف خدمته، لذا لا يزال وكلاء التطبيق وإعداد الترجمة التلقائية المرتبط بخدمة الوكلاء يجدونه.
- تتحول خدمات OpenAI، وOpenAI المتوافقة، وAnthropic، وMistral، وCohere، وGemini إلى اتصالات بنهاية OpenAI المتوافقة (أو Anthropic). تتحول خدمة Azure إلى اتصال بنهاية OpenAI المتوافقة للمورد: اختبرها.
- تُوسم خدمات AWS Bedrock، وGoogle Vertex AI، وCohere North، والأنواع غير المعروفة بـتحتاج إلى انتباه، مع ذكر السبب. لا تُنسخ بيانات اعتماد السحابة الخاصة بها: وجّهها إلى نهاية OpenAI المتوافقة للمورد أو إلى بوابة مثل LiteLLM، ثم احفظ.
- تتحول خدمة التضمين إلى نموذج التضمينات للاتصال الذي يحمل نفس العنوان والمفتاح، أو إلى اتصال خاص بها. تحصل خدمة النسخ النصي على نموذج
whisper-1. - عندما لا يكون هناك اتصال بعد للإعادة الصياغة والملخصات، تحصل على الخدمة والنموذج الخاص بالوكيل الافتراضي للتطبيق.
وكلاء تطبيق الوكلاء
بعد الخدمات، تحوّل الترقية كل وكيل من تطبيق الوكلاء (الذي أصبح الآن تطبيق الدردشة بالذكاء الاصطناعي) إلى وكيل على مستوى الخادم، على الحساب نفسه: اتصاله (النسخة المنسوخة من خدمته)، ونموذجه، وتعليماته، واستدلاله، وأدواته، ومن يمكنهم استخدامه. يجيب الخادم بعد ذلك نيابةً عن هؤلاء الوكلاء. وفي الحالات التي كان فيها التطبيق يقيّد وكيلاً بطريقة لا يعبر عنها وكلاء الخادم (القنوات التي يجيب فيها، وقوائم الحظر، والوصول القائم على السمات)، يُضيَّق نطاق الوكيل ليقتصر على أعضاء تلك القنوات، أو لا يُمنح الوصول لأحد، ويُميَّز على أنه يتطلب انتباهاً، وكذلك يُفعل مع أي وكيل لم تتحول خدمته إلى اتصال. راجعهم في وحدة التحكم بالنظام › الذكاء الاصطناعي › اتصالات النماذج. وتُترك إعدادات التطبيق الأخرى كما كانت.
تغييرات أخرى في الإعدادات الافتراضية
- المكالمات: وضع الاختبار غير مفعّل وتفعيل الفيديو مفعّل افتراضياً. يُحفظ أي خيار محفوظ في الإعدادات. تتبع المكالمات أيضاً نوع المجتمع (انظر المكالمات والصوت).
- وضع الرسائل في المقدمة متاح لإداريي القناة، وإداريي المجتمع، والمشرفين (مع إدارة الرسائل)؛ لا يزال أعضاء الرسائل المباشرة أو الجماعية قادرين على ذلك.
- يمكن للقنوات المؤرشفة قبول أعضاء جدد، الذين يقرؤون سجلها. لا ينشر أحد، ولا يرد بردود فعل، ولا يغيّر أي شيء فيها.
الانتقال من Mattermost
يستخدم Antimatter مخطط قاعدة بيانات Mattermost ويضيف جداوله الخاصة، لذا يمكنه الاستيلاء على قاعدة بيانات PostgreSQL وملفات خادم Mattermost. جرّب ذلك على نسخة أولاً:
- أنشئ نسخة احتياطية من قاعدة بيانات Mattermost، وتخزين الملفات الخاص بها (
data/أو حاوية S3) وconfig.json، ثم أوقف Mattermost. - استعِد قاعدة البيانات في PostgreSQL الخاص بـ Antimatter، أو وجّه Antimatter إلى نسخة منها (
AM_SQLSETTINGS_DATASOURCE). - انسخ الملفات إلى تخزين Antimatter، مع الحفاظ على مساراتها: إلى حاوية
antimatterباستخدام أداة S3، أو إلىdata/باستخدام أرشيف إصدار. - أعد استخدام إعداداتك: انسخ
config.json، أو انقله إلى قاعدة البيانات باستخدامamctl --local config migrate(انظر الإعدادات). تبقى متغيرات البيئةMM_الخاصة بك تعمل؛ أعد تسميتها إلىAM_عند الحاجة. - شغّل Antimatter وتابع السجل أثناء ترقية قاعدة البيانات. ثم تحقق من وحدة التحكم بالنظام › الإضافات › إدارة الإضافات. يقوم Antimatter بتثبيت إصداراته الخاصة من «المكالمات»، و«الدردشة بالذكاء الاصطناعي»، والتكاملات عندما تكون أحدث من الإصدار المثبت، وكذلك من «أدلة التشغيل» و«كانبان» (اللوحات) إذا كان خادم Mattermost يحتوي على أيٍّ منها مثبتًا مسبقًا (لم يعد أيٌّ منهما مضمّنًا في الخوادم الجديدة: راجع التطبيقات المضمّنة). إذا كان لدى Mattermost إصدار أحدث من أحد هذه التطبيقات، فأزل ذلك التطبيق وأعد تشغيل Antimatter، ليتم تثبيت إصدار Antimatter الخاص به.
- قم بإعداد الإشعارات الفورية مرة أخرى باستخدام وكيل الإشعارات الخاص بك: لا يرسل Antimatter أي إشعارات إلى خدمات Mattermost الفورية، سواء كانت تجريبية أو مستضافة، لأنها تصل فقط إلى تطبيقات Mattermost الخاصة. حتى تقوم بتغيير خادم الإشعارات الفورية، لن يرسل الخادم أي إشعارات فورية (راجع الإشعارات الفورية).
لا يتواصل Antimatter مع أي خدمة تشغّلها Mattermost, Inc. (راجع الاتصالات مع الخدمات الخارجية)، حتى إذا كان تكوينك لا يزال يذكر خدمةً منها:
- يُحفظ خادم الإشعارات الفورية الخاص بـ Mattermost في الإعدادات لكنه لا يُستخدم أبداً؛
- تُفرَّغ عناوين Mattermost الخاصة بسوق التطبيقات (عنوان URL للمتجر) والإشعارات المتعلقة بالمنتج؛
- تُستبدل روابط تنزيل التطبيقات التي كانت هي الافتراضية في Mattermost (رابط صفحة تنزيل تطبيقات Antimatter، رابط تنزيل تطبيق Android، ورابط تنزيل تطبيق iOS) بصفحات تنزيل تطبيقات Antimatter على GitHub؛ الروابط التي اضبطتها بنفسك تُحفظ؛
- يستخدم تطبيق المكالمات خادم STUN العام من Cloudflare بدلاً من خادم Mattermost، دون تغيير الإعداد المحفوظ (راجع المكالمات)؛
- تمت إزالة فحص التحديثات الأمنية والإبلاغ عن الأعطال، وكذلك إعدادات وحدة التحكم بالنظام الخاصة بها (تفعيل التنبيهات الأمنية، تفعيل التشخيص والإبلاغ عن الأخطاء) وصفحة الإشعارات.
أصبح المقبس الخاص بالوضع المحلي /var/tmp/antimatter_local.socket؛ ويحاول amctl أيضاً استخدام المقبس القديم /var/tmp/mattermost_local.socket. يدعم Mattermost قاعدة بيانات PostgreSQL فقط في إصداراته الحديثة، وكذلك يفعل Antimatter: انقل قاعدة بيانات MySQL إلى PostgreSQL أولاً. العودة إلى Mattermost بعد ترقية Antimatter لقاعدة البيانات تعني استعادة نسخة احتياطية من Mattermost.
تصدير واستيراد البيانات
تنسيق التصدير الشامل ينقل البيانات بين الخوادم: الخادم بأكمله، أو بعض المجتمعات، أو بعض القنوات، مع المرفقات وصور الملفات الشخصية والرموز التعبيرية المخصصة إذا رغبت في ذلك.
# on the source server
amctl export create --team-name design --include-profile-pictures
amctl export list
amctl export download <export file> design.zip
# on the destination server
amctl import upload design.zip
amctl import list available
amctl import process <uploaded file> --imported-users active
راقب المهام باستخدام amctl export job list وamctl import job list. عند تصدير مجتمع أو قناة، يكون --imported-users مطلوبًا: active إذا انتقل الأشخاص إلى هذا الخادم، وinactive عند الاستيراد إلى خادم لديهم فيه حسابات بالفعل، حتى تبقى الحسابات المُنشأة من تطابقات غير مؤكدة موقوفة حتى يفحصها مدير. يستورد --destination-team-name إلى مجتمع موجود. تُحفظ عمليات التصدير والاستيراد على تخزين الخادم (ExportSettings.Directory، ImportSettings.Directory) لمدة 30 يومًا افتراضيًا.
على الخادم نفسه، تنجز antimatter export bulk وantimatter import bulk --apply نفس الشيء من الملفات، دون استخدام واجهة برمجة التطبيقات.
يحمل سطر القناة في ملف التصدير نوعها وإعداداتها (am_type، am_mode، am_root_posts، وam_forum_view للمنتديات)؛ أما السطر الذي لا يحتوي عليها فيتم استيراده كقناة دردشة نصية عادية. يتطلب سطر المنشور الجذري في قناة منتدى وجود props.am_thread_title، وهو عنوان موضوع السلسلة؛ وبدونه تفشل عملية الاستيراد لهذا السطر.