البناء من الشيفرة المصدرية
يشرح هذا الصفحة كيفية بناء وتشغيل Antimatter من شيفرتها المصدرية، سواء للعمل عليها أو لإنشاء بنيتك الخاصة. يغطي الخادم وواجهات الويب، التي توجد في مستودع واحد، ثم صورة Docker والتطبيقات.
ما تحتاجه
- Go، بالإصدار المذكور في
server/go.mod(1.26.7 عند كتابة هذا الدليل). - Node.js وnpm، بالإصدارات الموجودة في
.nvmrcوwebapp/package.json(Node 24.11.1 مع npm 11.6.2). باستخدام mise، يقوم ملفmise.tomlفي المستودع بتثبيت الإصدار الصحيح من Node. - Docker مع Compose: يعمل إعداد التطوير على PostgreSQL وعدة خدمات أخرى داخل حاويات.
- make، git، وجهاز يعمل بنظام Linux أو macOS.
- الذاكرة: بناء واجهات الويب هو الجزء الثقيل. خطط لتخصيص 16 جيجابايت من ذاكرة RAM؛ راجع البناء والذاكرة.
git clone https://github.com/AntimatterChat/antimatter.git
cd antimatter
يحتوي المستودع على الخادم في server/، وواجهات الويب في webapp/ (Fusion في webapp/fusion، والكلاسيكية في webapp/channels، والحزم المشتركة في webapp/platform)، والاختبارات الشاملة في e2e-tests/.
تشغيل خادم التطوير
cd server
make run
يبدأ make run حاويات التطوير (PostgreSQL، Redis، أداة لالتقاط البريد الإلكتروني وأدوات المراقبة)، ويربط بنود تطبيق الويب في مكانها، ويشغل الخادم في الخلفية باستخدام go run، ويشغل مراقب تطبيق الويب الذي يعيد بناء الواجهة الكلاسيكية أثناء تحريرها. افتح http://localhost:8065 وأنشئ حساباً: يصبح الحساب الأول مدير النظام.
الأمر (في server/) | وظيفته |
|---|---|
make run-server, make run-client | تشغيل الخادم فقط، أو مراقب تطبيق الويب فقط. |
make restart-server | إعادة تشغيل الخادم بعد تغيير كود Go. |
make stop | إيقاف الخادم والمراقب والحاويات. |
make debug-server | تشغيل الخادم تحت مُصحح Delve. |
make run-cli ARGS="-version" | تشغيل أمر خادم. |
make config-reset | إعادة تعيين config/config.json إلى القيم الافتراضية. |
make clean, make nuke | إزالة ملفات البناء؛ يحذف nuke أيضاً بيانات التطوير. |
قاعدة بيانات التطوير هي postgres://mmuser:mostest_password@localhost/mattermost_test، وهي مصدر البيانات الافتراضي للخادم. اختر الحاويات التي تبدأ باستخدام ENABLED_DOCKER_SERVICES، في ملف server/config.override.mk أو في بيئة النظام (راجع server/config.mk).
واجهات الويب
في webapp/:
npm install # also builds the shared packages
npm run build # the classic interface, then Fusion
تُحفظ النتائج في webapp/channels/dist (الكلاسيكي) وwebapp/fusion/dist (Fusion). الأمر make client في server/ يربطها كـ server/client وserver/client-fusion، حيث يقدّمها الخادم: الكلاسيكي تحت /static/، وFusion تحت /static/fusion/.
- الأمر
npm run run(أوmake runفيwebapp/) يراقب ويعيد بناء الواجهة الكلاسيكية. أضفWATCH_FUSION=trueلإعادة بناء Fusion أيضًا. - الأمر
npm run dev-server(make dev) يشغّل خادم التطوير الخاص بـ webpack بدلاً من ذلك: الكلاسيكي على المنفذ 9005، وFusion على المنفذ 9006. - لعرض إحدى الواجهتين في المتصفح، أضف
?webui=fusionأو?webui=classicإلى عنوان أي صفحة.
الاختبارات والفحوصات
| الأمر | الموقع | وظيفته |
|---|---|---|
make test-server | server/ | مجموعة اختبارات الخادم، مقابل حاويات التطوير. تستغرق وقتًا طويلاً. |
make test-server-quick | server/ | الاختبارات القصيرة فقط. |
go test ./channels/app/... -run TestName | server/ | حزمة واحدة أو اختبار واحد، مع تشغيل الحاويات (make start-docker). |
make check-style | server/ | go vet وgolangci-lint وفحوصات Go الأخرى. |
make test | webapp/ | اختبارات الوحدات لتطبيق الويب (Jest)، في كل حزمة. |
npm run test -- <pattern> | webapp/fusion | بعض اختبارات Fusion. |
make check-style, make check-types | webapp/ | ESLint وTypeScript. |
make i18n-extract | server/ وwebapp/ | يحدّث ملفات النصوص الإنجليزية بعد إضافة أو تغيير النصوص (انظر الترجمات). |
شغّل make modules-tidy بدلاً من go mod tidy في server/.
أرشيفات الإصدارات
cd webapp && npm run build && cd ..
cd server
make build-linux # the antimatter and amctl binaries
make package-linux # dist/antimatter-linux-amd64.tar.gz and -arm64
يُنفّذ make build بناء واجهات الويب والثنائيات الخاصة بنظام Linux دفعة واحدة. يحتوي الأرشيف على bin/antimatter، وbin/amctl، وملف config/config.json افتراضي مع README.md يشرح كيفية تغيير الإعدادات، وكلا واجهتي الويب، والقوالب، والخطوط، والترجمات. أما المنصات الأخرى: make package-osx، make package-windows، make package-freebsd.
التطبيقات المدمجة
يُنتج make package-linux العادي أرشيفاً بدون تطبيقات. لتضمينها، كما تفعل الإصدارات المنشورة، احصل أولاً على حزم التطبيقات الموقّعة ثم مرّر مجلدها:
build/package/fetch-apps.sh "$HOME/release-apps" # needs gh, python3 and gpg
make package-linux PREPACKAGED_PLUGINS_DIR="$HOME/release-apps"
يُحمّل fetch-apps.sh أحدث إصدار من GitHub لكل تطبيق مُدرج في plugins.json الخاص بـ antimatter-docker، مع توقيعه، ويتحقق من التوقيع مقابل مفتاح الإضافات الخاص بـ Antimatter. افتراضيًا، يأخذ التطبيقات التالية: السبورة البيضاء، القنوات الصوتية، المكالمات، الدردشة الذكية (الوكلاء)، قائمة المهام، الاستطلاعات، الملاحظات، ملفات GIF والميمز؛ ويُغيّر AM_BUNDLED_APPS (أسماء المستودعات، مفصولة بمسافات) هذه القائمة. تُتخطى التطبيقات التي لا تحتوي على إصدار، أو التي لا تحتوي على توقيع، مع عرض تحذير. تُوضع الحزم في prepackaged_plugins/ ضمن الأرشيف.
حزم .deb و.rpm
يحوّل build/package/build-packages.sh <archive> <amd64|arm64> <version> <out-dir> أرشيف الإصدار إلى حزم .deb و.rpm شاملة، باستخدام nfpm. يصف دليل المدير ما تثبّته هذه الحزم: راجع تثبيت حزمة .deb أو .rpm.
سير عمل الإصدار
ينجز سير عمل antimatter-release.yml في مستودع الخادم كل هذا على GitHub: عند وسم v* يبني الأرشيفات والحزم لـ amd64 وarm64، مع SHA256SUMS، وينشرها كإصدار GitHub الخاص بالوسم (إصدار مسبق للإصدار الذي يحتوي على -). عند التشغيل يدوياً، يُرقّم البناء 0.9.0-dev.<run> ويحافظ على الملفات كعناصر سير عمل. لكل مستودع تطبيق سير عمل release.yml ينشر حزمته الموقّعة بالطريقة نفسها.
صورة Docker
مستودع antimatter-docker يبني الصور المنشورة، والخادم مع تطبيقاته، بالكامل داخل Docker:
git clone https://github.com/AntimatterChat/antimatter-docker.git
cd antimatter-docker
scripts/build-all.sh # from the main branches on GitHub
SOURCES=local scripts/build-all.sh # from your checkouts next to this folder
VARIANT=next scripts/build-all.sh # the "next" image, with every Antimatter app
يتطلب Docker مع buildx، وPython 3، وgit وgpg، وحوالي 16 جيجابايت من ذاكرة RAM و30 جيجابايت من مساحة القرص. يُحمَّل الناتج كـ ghcr.io/antimatterchat/antimatter:dev؛ جرّبه باستخدام ANTIMATTER_IMAGE=ghcr.io/antimatterchat/antimatter:dev docker compose -f compose.local.yml up -d. يحدد plugins.json التطبيقات والإصدارات المبنية، ويشرح README الخاص بالمستودع المتغيرات.
build-all.sh التطبيقات المضمّنة بمفتاح توقيع Antimatter، ويرفض بناء الصورة التطبيقات غير الموقّعة. بدون هذا المفتاح الخاص، الذي لا يملكه سوى المُحافظون على المشروع، نفّذ الخطوات الأولى فقط: scripts/fetch-sources.sh، scripts/build-plugins.sh (حزم التطبيقات في out/plugins/)، وscripts/build-server.sh (أرشيفات الخادم في out/server/).البناء والذاكرة
واجهات الويب هي حِزم webpack كبيرة، ونفاد الذاكرة هو أكثر أسباب فشل البناء شيوعًا.
- يبني
npm run buildالواجهة الكلاسيكية ثم Fusion واحدة تلو الأخرى، وليس معًا، للحفاظ على الحد الأقصى للذاكرة منخفضًا. لا تشغّلهما بالتوازي بنفسك. - يبدأ المُصغِّر عاملًا واحدًا لكل معالج. على جهاز بعدد كبير من الأنوية وذاكرة قليلة، حدّد عدد المعالجات التي يراها البناء:
taskset -c 0-5 npm run build. - إذا نفدت ذاكرة الكومة (heap) في Node، ارفع حدّها:
NODE_OPTIONS=--max-old-space-size=6144. يستخدم بناء Docker هذه القيمة (BUILD_NODE_OPTIONSفيbuild.env). - تجنّب تشغيل مجموعة اختبارات الخادم الكاملة، وبناء الويب، وبناء Docker في الوقت نفسه على جهاز صغير.
التطبيقات
لكل تطبيق (إضافة) مستودع وملف Makefile خاص به؛ make dist يبني حزمته. راجع البناء والتثبيت والتصحيح.
تطبيق سطح المكتب
تطبيق سطح المكتب هو تطبيق Electron. باستخدام Node.js 24 أو أحدث:
npm install --allow-git=all
npm run build # development build, into dist/
npm start # run it
npm run package:linux # packages into release/ (also package:windows, package:mac)
إعدادات وقت البناء، مثل الخوادم التي يجب ضبطها مسبقًا، موجودة في src/common/config/buildConfig.ts. في حال عدم وجود شهادة Apple، اضبط AM_MAC_ADHOC_SIGN=true لتوقيع تطبيق macOS بشكل مؤقت (ad hoc) دون ختم (notarisation)، حيث ترفض أجهزة Mac التي تعمل بمعالجات Apple silicon تنفيذ الأكواد غير الموقّعة. يقوم سير عمل release.yml في المستودع ببناء حزم غير موقّعة لأنظمة Linux وWindows وmacOS عند وسم v*.
التطبيق المحمول
تطبيق الجوال هو تطبيق React Native؛ ويذكر ملف README الخاص به الأوامر (npm run ios، npm run android). لبناء نسختك الخاصة، ستحتاج أيضًا إلى مفاتيح توقيع خاصة بك، ومشروع Firebase لإشعارات Android، ومفتاح APNs لـ iOS، ووكيل دفع (push proxy) يحتفظ بهذه الاعتمادات. يقوم سير عمل release.yml في المستودع ببناء حزمة APK وAAB الخاصة بـ Android، وحزمة iOS غير الموقّعة بصيغة .ipa عند وسم v*، دون الحاجة إلى حسابات متاجر التطبيقات؛ ويذكر ملف README الخاص به الأسرار التي توقّع بناء Android وتضبط Firebase.