استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
هذه الوثيقة غير محدثة، تم تحديث النسخة الأساسية في ٢ يوليو ٢٠٢٦.
الانتقال إلى الوثيقة الإنجليزيةتاريخ الإصدارات
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
استضافة Intlayer ذاتياً
يمكن تشغيل Intlayer بالكامل على بنيتك التحتية الخاصة — دون الحاجة إلى حساب Intlayer Cloud. يُشغّل أمر واحد مكدساً جاهزاً للإنتاج:
نسخ الكود إلى الحافظة
curl -fsSL https://intlayer.org/install.sh | shيقوم المثبّت بتنزيل ملف docker-compose.yml وملف .env، ويولّد الأسرار المطلوبة تلقائياً، ويبدأ تشغيل جميع الحاويات بـ docker compose up -d.
جدول المحتويات
البنية المعمارية
نسخ الكود إلى الحافظة
┌─────────────────────────────┐ browser ──────▶ │ app (TanStack Start) :3000│ ──┐ └─────────────────────────────┘ │ VITE_BACKEND_URL ┌─────────────────────────────┐ │ │ backend (Fastify/Bun) :3100│ ◀─┘ └──────────────┬──────────────┘ ┌──────────┬─────────┼──────────┬───────────┐ ▼ ▼ ▼ ▼ ▼ mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium (1-node RS) (S3 API) (SMTP) (in-image) minio:9001 mailpit:8025 (console) (web UI)يتم تضمين Chromium (المستخدم لتوليد لقطات الشاشة عبر Puppeteer) داخل صورة الخادم الخلفي — لا حاجة لحاوية منفصلة.
المتطلبات الأساسية
- Docker ≥ 24 وDocker Compose ≥ v2. إذا كان أحدهما مفقوداً، يطبع المثبّت رابط التثبيت ويخرج.
- المنافذ
3000،3100،8025،9000، و9001متاحة على المضيف. - مضيف Linux أو macOS (أو WSL2 على Windows).
البدء السريع
نسخ الكود إلى الحافظة
curl -fsSL https://intlayer.org/install.sh | shما يقوم به المثبّت:
- يتحقق من وجود
dockerوdocker compose. - يُنزّل
docker-compose.ymlو.env.exampleإلى./intlayer/. - إذا لم يكن هناك
.env، ينسخ المثال ويولّد أسراراً عشوائية لـBETTER_AUTH_SECRETوS3_ACCESS_KEY_IDوS3_SECRET_ACCESS_KEYعبرopenssl rand. - يُشغّل
docker compose pull+docker compose up -d. - يطبع عناوين URL: لوحة التحكم
:3000، API:3100، واجهة البريد الإلكتروني:8025، وحدة تحكم MinIO:9001.
بعد تشغيل المكدس، افتح http://localhost:3000 وأنشئ حسابك الأول.
إعداد التشغيل الأول
على نسخة جديدة (قاعدة بيانات فارغة)، يعيد فتح لوحة التحكم توجيهك إلى صفحة /init:
- أنشئ الحساب الأول. نظراً لأن مجموعة المستخدمين فارغة، يتم ترقية هذا الحساب تلقائياً إلى super admin.
- يتم إرسال بريد إلكتروني للتحقق (عبر Resend). التحقق من البريد الإلكتروني إلزامي — وهذا هو السبب في أنه يجب تعيين
RESEND_API_KEYقبل أن تبدأ. - انقر على الرابط في البريد الإلكتروني، ثم قم بتسجيل الدخول.
بمجرد وجود admin، يعيد /init التوجيه إلى صفحة تسجيل الدخول القياسية.
الخدمات
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| الخدمة | الصورة | المنفذ (المضيف) | الغرض |
|---|---|---|---|
| app | built from apps/app/Dockerfile | 3000 | لوحة تحكم TanStack Start (واجهة CMS) |
| backend | built from apps/backend/Dockerfile | 3100 | واجهة Fastify REST API (نقطة نهاية /health) |
| mongo | mongo:7 | داخلي | مجموعة نسخ متماثلة أحادية العقدة (rs0) |
| redis | redis:7-alpine | داخلي | قوائم انتظار المهام (BullMQ) والتخزين المؤقت (ioredis) |
| minio | minio/minio | 9000 (S3)، 9001 (وحدة التحكم) | تخزين كائنات متوافق مع S3 للصور الرمزية ولقطات الشاشة |
| mailpit | axllent/mailpit | 1025 (SMTP)، 8025 (واجهة الويب) | مجمّع بريد إلكتروني تفاعلي محلي |
المنافذ الداخلية (mongo، redis) غير معرّضة للمضيف افتراضياً.
يجب أن يكون منفذ MinIO9000قابلاً للوصول من المتصفح لأن الأصول المرفوعة (الصور الرمزية، لقطات الشاشة) تُحمَّل مباشرة منS3_PUBLIC_URL=http://localhost:9000/intlayer.
متغيرات البيئة
مطلوب
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| المتغير | مثال | الوصف |
|---|---|---|
DB_ID | intlayer | مستخدم MongoDB Atlas |
DB_MDP | (كلمة المرور الخاصة بك) | كلمة مرور MongoDB Atlas |
DB_CLUSTER | cluster0.xxxxx.mongodb.net | مضيف مجموعة MongoDB Atlas (المستخدم في URI mongodb+srv://) |
BETTER_AUTH_SECRET | (تم إنشاؤها) | سر بحجم 32 بايت لتوقيع الجلسة |
S3_SECRET_ACCESS_KEY | (تم إنشاؤها) | السر الخاص بـ MinIO المضمن |
RESEND_API_KEY | (مفتاحك) | البريد الإلكتروني المعاملاتي عبر Resend. مطلوب لإعداد التشغيل الأول إلا إذا قمت بتكوين mailer SMTP عام (انظر Global mailer) |
المطلوبة (مولّدة تلقائياً أو مطلوبة)
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| المتغير | مثال | الوصف |
|---|---|---|
NODE_ENV | production | بيئة وقت التشغيل |
PORT | 3100 | منفذ استماع الخادم الخلفي |
BACKEND_URL | http://localhost:3100 | عنوان URL العام لواجهة برمجة تطبيقات الخادم الخلفي |
APP_URL | http://localhost:3000 | عنوان URL العام للوحة التحكم |
DOMAIN | localhost | نطاق ملفات تعريف الارتباط |
MONGODB_URI | mongodb://mongo:27017/intlayer?replicaSet=rs0 | عنوان URI الكامل لاتصال MongoDB |
REDIS_URL | redis://redis:6379 | عنوان URL لاتصال Redis |
BETTER_AUTH_SECRET | (مولّد تلقائياً) | سر من 32 بايت لتوقيع الجلسة |
MAIL_PROVIDER | smtp | بروتوكول البريد: smtp أو resend |
MAIL_SMTP_HOST | mailpit | اسم المضيف SMTP (اسم حاوية Mailpit) |
MAIL_SMTP_PORT | 1025 | منفذ SMTP |
MAIL_FROM | Intlayer <no-reply@localhost> | عنوان المرسل |
S3_ENDPOINT | http://minio:9000 | نقطة نهاية متوافقة مع S3 |
S3_PUBLIC_URL | http://localhost:9000/intlayer | عنوان URL العام لتحميل الأصول في المتصفح |
S3_BUCKET_NAME | intlayer | اسم الدلو (Bucket) |
S3_ACCESS_KEY_ID | (مولّد تلقائياً) | مفتاح وصول MinIO |
S3_SECRET_ACCESS_KEY | (مولّد تلقائياً) | مفتاح سر MinIO |
VITE_BACKEND_URL | http://localhost:3100 | عنوان URL الخادم الخلفي المضمّن في لوحة التحكم عند البناء |
VITE_DOMAIN | localhost | النطاق المضمّن في لوحة التحكم عند البناء |
اختيارية (تتدهور الميزات بشكل سلس عند غيابها)
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| المتغير | الميزة |
|---|---|
OPENAI_API_KEY | الترجمة بمساعدة الذكاء الاصطناعي ومراجعة المحتوى |
STRIPE_SECRET_KEY، STRIPE_WEBHOOK_SECRET، STRIPE_* | إدارة الفواتير والاشتراكات |
RESEND_API_KEY | البريد الإلكتروني التفاعلي عبر Resend (يتجاوز Mailpit عند الضبط) |
GITHUB_CLIENT_ID، GITHUB_CLIENT_SECRET | تسجيل الدخول عبر OAuth لـ GitHub |
GOOGLE_CLIENT_ID، GOOGLE_CLIENT_SECRET | تسجيل الدخول عبر OAuth لـ Google |
GITLAB_CLIENT_ID، GITLAB_CLIENT_SECRET | تسجيل الدخول عبر OAuth لـ GitLab |
MICROSOFT_CLIENT_ID، MICROSOFT_CLIENT_SECRET | تسجيل الدخول عبر OAuth لـ Microsoft |
LINKEDIN_CLIENT_ID، LINKEDIN_CLIENT_SECRET | تسجيل الدخول عبر OAuth لـ LinkedIn |
ATLASSIAN_CLIENT_ID، ATLASSIAN_CLIENT_SECRET | تسجيل الدخول عبر OAuth لـ Atlassian |
بريد عام
بشكل افتراضي، يتم إرسال جميع رسائل البريد الإلكترونية للمعاملات عبر Resend باستخدام RESEND_API_KEY. يمكن للنشرات ذاتية الاستضافة بدلاً من ذلك توجيه كل بريد إلكتروني — بما في ذلك رسائل البريد الإلكترونية غير المتعلقة بالمنظمة مثل إعادة تعيين كلمات المرور والروابط السحرية — عبر بريد عام مُعد باستخدام متغيرات البيئة.
عيّن MAIL_PROVIDER لتفعيله. عند عدم التعيين، يتم استخدام بريد Resend الافتراضي.
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
| المتغير | مثال | الوصف |
|---|---|---|
MAIL_PROVIDER | smtp | النقل العام: smtp أو resend. اترك بدون تعيين لاستخدام الإعدادات الافتراضية |
MAIL_FROM | Intlayer <no-reply@acme.com> | رأس المُرسل. يقبل عنوان مجرد أو تنسيق Name <email> |
MAIL_SMTP_HOST | smtp.acme.com | مضيف SMTP (مطلوب عند MAIL_PROVIDER=smtp) |
MAIL_SMTP_PORT | 587 | منفذ SMTP (الافتراضي 587) |
MAIL_SMTP_SECURE | false | TLS ضمني. عيّن true للمنفذ 465 |
MAIL_SMTP_USER | (اسم المستخدم الخاص بك) | اسم مستخدم SMTP (اختياري؛ تجاهل للمرحلات غير المصرح بها) |
MAIL_SMTP_PASSWORD | (كلمة المرور الخاصة بك) | كلمة مرور SMTP |
الأولوية: بريد المنظمة الخاص بها (المُعد من لوحة المعلومات Organization) له الأولوية على البريد العام، والذي له بدوره الأولوية على مفتاح Resend الافتراضي.
ربط مشروعك بـ Intlayer
بمجرد تشغيل المكدس، وجّه مشروعك نحو الخادم الخلفي ولوحة التحكم المستضافَين ذاتياً بدلاً من intlayer.org.
تهيئة المشروع
نسخ الكود إلى الحافظة
import type { IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
editor: {
clientId: process.env.INTLAYER_CLIENT_ID,
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
/**
* عنوان URL للوحة تحكم CMS المستضافة ذاتياً.
* الافتراضي: https://app.intlayer.org
*/
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
/**
* عنوان URL لواجهة برمجة تطبيقات الخادم الخلفي المستضافة ذاتياً.
* الافتراضي: https://back.intlayer.org
*/
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
},
};
export default config;اضبط متغيرات البيئة في ملف .env الخاص بمشروعك:
نسخ الكود إلى الحافظة
INTLAYER_CMS_URL=http://localhost:3000INTLAYER_BACKEND_URL=http://localhost:3100INTLAYER_CLIENT_ID=<your-client-id>INTLAYER_CLIENT_SECRET=<your-client-secret>أنشئ بيانات اعتماد الوصول في لوحة التحكم المستضافة ذاتياً ضمن المشاريع ← مفاتيح الوصول على http://localhost:3000/projects.
SDK الخاص بـ @intlayer/api
عند استخدام SDK الخاص بـ @intlayer/api برمجياً، مرّر backendURL بشكل صريح:
نسخ الكود إلى الحافظة
import { createIntlayerCMS } from "@intlayer/api";import { dictionaryEndpoint } from "@intlayer/api/dictionary";const cms = createIntlayerCMS({ editor: { clientId: process.env.INTLAYER_CLIENT_ID, clientSecret: process.env.INTLAYER_CLIENT_SECRET, backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100 },});const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();الترقية
إعادة تشغيل المثبّت على نشر قائم تنفّذ ترقية متدحرجة:
نسخ الكود إلى الحافظة
curl -fsSL https://intlayer.org/install.sh | shيجلب هذا الأمر أحدث الصور ويعيد تشغيل الحاويات باستخدام docker compose pull && docker compose up -d. يتم الاحتفاظ بالأحجام الموجودة (mongo-data، redis-data، minio-data) — دون فقدان للبيانات.
للترقية يدوياً من داخل مجلد ./intlayer/:
نسخ الكود إلى الحافظة
docker compose pulldocker compose up -dالنسخ الاحتياطي والاستعادة
تعيش جميع البيانات الدائمة في ثلاثة أحجام Docker مسماة.
النسخ الاحتياطي
نسخ الكود إلى الحافظة
docker run --rm \ -v intlayer_mongo-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/mongo-data.tar.gz /datadocker run --rm \ -v intlayer_redis-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/redis-data.tar.gz /datadocker run --rm \ -v intlayer_minio-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/minio-data.tar.gz /dataالاستعادة
نسخ الكود إلى الحافظة
docker run --rm \ -v intlayer_mongo-data:/data \ -v "$(pwd)":/backup \ busybox tar xzf /backup/mongo-data.tar.gz -C /# كرر لـ redis-data و minio-dataالقيود
- MongoDB يجب أن يكون خارجياً (Atlas). يتصل الخادم الخلفي فقط عبر
mongodb+srv://(مبني منDB_ID/DB_MDP/DB_CLUSTER)، لذا لا يمكن استخدامmongodb://host:27017العادي — بما في ذلكmongodالمدمج في الحاوية الخاصة — لا يمكن استخدامه. قدم مجموعة MongoDB Atlas. - لا توجد نطاقات مخصصة. جميع عناوين URL الموجهة للمتصفح
VITE_*مدرجة مباشرة في التطبيق وقت البناء، والصورة المنشورة تأتي مع قيمlocalhost. يجب الوصول إلى لوحة التحكم علىhttp://localhost:3000؛ تقديمها على نطاق عام سيتطلب إعادة بناء الصورة مع عناوين URL المستهدفة المدمجة فيها وليس مدعوماً بشكل افتراضي. - البريد الإلكتروني يتطلب خادم بريد يعمل. إعداد التشغيل الأول يفرض التحقق من البريد الإلكتروني، لذا يجب تكوين إما
RESEND_API_KEYأو خادم SMTP عام (MAIL_PROVIDER=smtp+MAIL_SMTP_*). بعد دخول المسؤول الأول، يمكن لكل منظمة أيضاً تكوين خادم SMTP أو Resend الخاص بها من لوحة التحكم.
استكشاف الأخطاء وإصلاحها
الخادم الخلفي يتعطل عند الإقلاع
يجب أن يكون MongoDB وRedis في حالة صحية قبل بدء تشغيل الخادم الخلفي. يستخدم ملف compose depends_on مع condition: service_healthy. إذا رأيت إعادات تشغيل متكررة للخادم الخلفي، تحقق من اجتياز فحوصات صحة mongo وredis:
نسخ الكود إلى الحافظة
docker compose psdocker compose logs mongodocker compose logs redisلوحة التحكم لا تستطيع الوصول إلى API
تحقق من أن VITE_BACKEND_URL يطابق عنوان URL حيث يمكن الوصول إلى الخادم الخلفي من المتصفح (ليس شبكة Docker). إذا غيّرت منفذ الخادم الخلفي أو أضفت وكيلاً عكسياً، أعد بناء صورة لوحة التحكم:
نسخ الكود إلى الحافظة
docker compose build appdocker compose up -d appدلو MinIO مفقود
إذا لم تُشغَّل خدمة minio-init المؤقتة (أو شُغّلت قبل أن يكون MinIO جاهزاً)، أنشئ الدلو يدوياً:
نسخ الكود إلى الحافظة
docker compose run --rm minio-init