المؤلف:
    إنشاء:2026-06-30آخر تحديث:2026-09-27

    استضافة Intlayer ذاتيًا (Self-Hosting)

    يمكن تشغيل Intlayer على بنيتك التحتية الخاصة دون الحاجة إلى حساب Intlayer Cloud. تتوفر ثلاثة إعدادات، يتم إدارتها جميعًا من خلال نفس برنامج التثبيت (install.sh، أو install.ps1 على نظام Windows، أو npx intlayer init infra):

    SetupWhat it isPick it for
    تطبيق سطح المكتبلوحة تحكم أصلية لأنظمة macOS و Linux و Windowsعميل محلي، لا يتطلب استضافة
    Docker شامل (All-in-one)لوحة التحكم وواجهة برمجة التطبيقات (API) و MongoDB و Redis و MinIO في حاوية واحدةللتجارب والتركيبات الصغيرة على جهاز واحد
    Docker Composeحاوية واحدة لكل خدمة، مع إمكانية استبدال أي مخزن بيانات بخدمة مُدارةللإنتاج والتوسع وقواعد البيانات المُدارة

    Table of Contents

    الصور والحزم المنشورة

    ArtifactDocker HubGHCR mirrorContents
    All-in-one containerintlayer/cms-allghcr.io/aymericzip/intlayer/cms-allapp + backend + MongoDB 8 + Redis + MinIO + Chromium
    Dashboard (frontend)intlayer/cms-frontendghcr.io/aymericzip/intlayer/cms-frontendTanStack Start dashboard on Bun
    API (backend)intlayer/cms-backendghcr.io/aymericzip/intlayer/cms-backendFastify REST API on Bun + Chromium
    Desktop appGitHub releasesn/a.dmg (macOS), .deb / .rpm / .AppImage (Linux), .exe / .msi (Windows)

    يتم بناء جميع الصور الثلاث من نفس الملف docker/selfhost/Dockerfile ويتم نشرها مع كل إصدار. تقوم حزمة Compose أيضًا بسحب الصور الرسمية mongo:8 و redis:8-alpine و quay.io/minio/minio.

    الإعداد

    يسأل برنامج التثبيت عن الإعداد المطلوب، ويتحقق من المتطلبات الأساسية (مع عرض تثبيت Docker)، ويكتب ملف البيئة مع المفاتيح السرية المنشأة مسبقًا، ويسحب الصور. لا يبدأ أي شيء تلقائيًا: تتطلب أوضاع Docker إعداد برنامج بريد أولاً، لذا ينتهي البرنامج بطباعة الأمر المطلوب تشغيله. إعادة التشغيل آمنة: لا يتم استبدال ملف البيئة الحالي أبدًا، مما يجعله أيضًا مسارًا للترقية.

    لوحة تحكم Intlayer كتطبيق أصلي تم إنشاؤه باستخدام Tauri. يسجل الدخول إلى Intlayer Cloud (https://app.intlayer.org)، لذلك لا توجد حاجة للاستضافة. إنه الخيار المناسب عندما تفضل عميلاً محلياً بدلاً من علامة تبويب في المتصفح.

    التثبيت

    يقوم برنامج التثبيت بتنزيل الحزمة المناسبة لنظام التشغيل والمعالج لديك ثم يفتحها (macOS)، أو يثبتها (dpkg / rpm على Linux) أو يشغل معالج الإعداد (Windows). يمكنك أيضًا تنزيلها يدويًا من صفحة الإصدارات.

    sh
    curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode desktop
    

    In PowerShell:

    powershell
    $env:INTLAYER_MODE = "desktop"; irm https://intlayer.org/install.ps1 | iex
    
    bash
    npx intlayer init infra --mode desktop
    

    المتطلبات

    • Node.js: يدمج التطبيق خادم لوحة التحكم ويشغله باستخدام ملف node الثنائي على جهازك. قم بتثبيته من nodejs.org إذا لم يفتح التطبيق.
    يتصل إصدار سطح المكتب المنشور بالواجهة الخلفية لـ Intlayer Cloud. يتطلب توجيهه إلى واجهة خلفية مستضافة ذاتيًا إعادة بناء التطبيق مع تعيين VITE_BACKEND_URL للإشارة إلى واجهة برمجة التطبيقات الخاصة بك، راجع القيود.

    يعمل كل شيء داخل حاوية intlayer/cms-all واحدة، تحت إشراف s6-overlay، مع استمرار حفظ جميع مخازن البيانات على وحدة تخزين واحدة.

    plaintext
                    ┌─────────────────────────────┐
     browser ──────▶ │  app  (TanStack Start)  :3000│ ──┐
     (localhost)    └─────────────────────────────┘   │ VITE_BACKEND_URL (baked at build)
                    ┌─────────────────────────────┐   │
                    │  backend (Fastify/Bun)  :3100│ ◀─┘
                    └──────────────┬──────────────┘
              ┌──────────┬─────────┼──────────────┐
              ▼          ▼         ▼               ▼
          mongo:27017  redis:6379  minio:9000   Chromium
          /data/mongo  /data/redis /data/minio  (in-image)
          (1-node RS)              minio:9001
    
    الخدمةمنفذ (منافذ) المضيفالغرض
    app3000لوحة التحكم (واجهة مستخدم CMS)
    backend3100واجهة برمجة تطبيقات REST (نقطة نهاية /health)
    mongoداخليMongoDB 8، مجموعة نسخ متماثلة بعقدة واحدة rs0
    redisداخليقوائم انتظار المهام (BullMQ) والتخزين المؤقت
    minio9000 (S3)، 9001 (وحدة التحكم)تخزين كائنات متوافق مع S3 للصور الرمزية ولقطات الشاشة

    يتم إدارة ترتيب التمهيد من خلال تبعيات s6 (mongod ← تهيئة مجموعة النسخ، minio ← إنشاء الحاوية، ثم backend، ثم app)، وتتم إعادة تشغيل الخدمات عند الخروج، بحيث يتعافى التمهيد الأول ذاتيًا.

    المتطلبات الأساسية

    • Docker ≥ 24: يعرض برنامج التثبيت تثبيته (عبر get.docker.com على Linux، أو Homebrew على macOS). على نظام Windows، قم بتثبيت Docker Desktop (واجهة WSL 2 الخلفية) أولاً.
    • المنافذ 3000 و 3100 و 9000 و 9001 متاحة على المضيف. يجب أن يظل منفذ MinIO 9000 قابلاً للوصول من قبل المتصفح حيث يتم تحميل الأصول مباشرة من S3_PUBLIC_URL.
    • خادم بريد (mailer): مفتاح API لـ Resend أو مرحّل SMTP.

    1. التثبيت

    يكتب ./intlayer.env مع مفاتيح BETTER_AUTH_SECRET و S3_SECRET_ACCESS_KEY المنشأة مسبقًا، ويطرح بضعة أسئلة لملء الباقي، ويسحب intlayer/cms-all:latest.

    sh
    curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode docker
    

    In PowerShell:

    powershell
    $env:INTLAYER_MODE = "docker"; irm https://intlayer.org/install.ps1 | iex
    
    bash
    npx intlayer init infra --mode docker
    

    2. الإجابة على أسئلة الإعداد

    يطلب برنامج التثبيت ما يلي (اضغط Enter لقبول الاقتراح، ويمكن تغيير أي إجابة في الملف لاحقًا):

    • النطاق الذي يُقدَّم عليه Intlayer. اتركه فارغًا للبقاء على localhost. مع نطاق مثل example.org، يقترح https://cms.example.org للوحة التحكم و https://back.example.org للواجهة الخلفية و https://s3.example.org/intlayer لتخزين الكائنات، ويكتب DOMAIN و APP_URL و BACKEND_URL و S3_PUBLIC_URL. انظر النطاق المخصص للخطوات التالية.
    • خادم البريد: Resend (مفتاح API) أو مرحّل SMTP (المضيف، المنفذ، بيانات الاعتماد)، بالإضافة إلى عنوان المرسل. يمكن تخطي هذه الخطوة وإجراؤها يدويًا لاحقًا.
    • مفتاح OpenAI API اختياري لميزات الذكاء الاصطناعي.

    بدون طرفية (على سبيل المثال عند تشغيل السكربت من CI)، يتم تخطي الأسئلة ولا يتم إنشاء سوى المفاتيح السرية. افتح intlayer.env واملأ إعدادات Resend أو SMTP يدويًا (انظر التفاصيل في خادم البريد العام):

    intlayer.env
    # Option A: Resend
    RESEND_API_KEY=<your-resend-key>
    
    # Option B: SMTP (takes over from Resend as soon as MAIL_SMTP_HOST is set)
    MAIL_SMTP_HOST=smtp.example.com
    MAIL_SMTP_PORT=587
    MAIL_SMTP_USER=<user>
    MAIL_SMTP_PASSWORD=<password>
    MAIL_FROM=Intlayer <no-reply@example.com>
    

    3. التشغيل

    هذا هو أمر التشغيل الذي يطبعه برنامج التثبيت (مع نطاق مخصص، يسبقه أمر docker build الذي ينتج intlayer/cms-all:custom، انظر النطاق المخصص):

    sh
    docker run -d --name intlayer \
      --restart unless-stopped \
      -p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 \
      -v intlayer-data:/data \
      --env-file ./intlayer.env \
      intlayer/cms-all:latest
    
    powershell
    docker run -d --name intlayer `
      --restart unless-stopped `
      -p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 `
      -v intlayer-data:/data `
      --env-file ./intlayer.env `
      intlayer/cms-all:latest
    

    تقوم أداة CLI بتشغيل برنامج التثبيت الذي يطبع الأمر docker run … الموضح في علامات التبويب الأخرى. الصقه في جهازك الطرفي بعد تكوين خادم البريد.

    افتح http://localhost:3000 (أو عنوان URL الخاص بلوحة التحكم) واتبع إعداد التشغيل الأول. يقوم التمهيد الأول بتهيئة مجموعة النسخ والحاوية، لذا امنحه دقيقة واحدة.

    النسخ الاحتياطي والترقية

    يتم الاحتفاظ بجميع الحالات داخل وحدة التخزين intlayer-data (/data/mongo، /data/redis، /data/minio).

    sh
    # Backup (stop the container first so MongoDB's files are consistent)
    docker stop intlayer
    docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
    docker start intlayer
    
    # Restore
    docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
    

    للترقية، أعد تشغيل برنامج التثبيت (يقوم بسحب أحدث صورة والاحتفاظ بملف intlayer.env)، ثم قم بتشغيل docker rm -f intlayer وأعد تشغيل أمر البدء. لاستخدام قاعدة بيانات MongoDB مُدارة بدلاً من المضمنة، عيّن MONGODB_URI في intlayer.env.

    حاوية واحدة لكل خدمة على شبكة Compose خاصة. تستخدم لوحة التحكم وواجهة برمجة التطبيقات الصور المنشورة intlayer/cms-frontend و intlayer/cms-backend؛ وتستخدم مخازن البيانات صور mongo و redis و minio الرسمية.

    plaintext
                    ┌───────────────────┐
     browser ──────▶ │  app        :3000 │ ── SSR ──▶ http://backend:3100
     (localhost)    └───────────────────┘
                    ┌───────────────────┐
     browser ──────▶ │  backend    :3100 │
     (localhost)    └─────────┬─────────┘
              ┌───────────────┼───────────────┐
              ▼               ▼               ▼
         mongo:27017     redis:6379      minio:9000 ◀── browser (assets)
         (1-node RS)                     minio:9001
    
    الخدمةالصورةالدور
    appintlayer/cms-frontendلوحة التحكم على المنفذ :3000؛ تنتظر حتى تكون الواجهة الخلفية جاهزة
    backendintlayer/cms-backendواجهة برمجة التطبيقات على المنفذ :3100 مع Chromium؛ تنتظر Mongo و Redis وحاوية MinIO
    mongomongo:8مجموعة نسخ بعقدة واحدة rs0، تتم تهيئتها بواسطة فحص الحالة الخاص بها
    redisredis:8-alpineقوائم الانتظار والتخزين المؤقت، واستمرارية الإلحاق فقط (append-only)
    minioquay.io/minio/minioتخزين S3 على المنفذ :9000، وحدة التحكم على :9001
    minio-initquay.io/minio/mcتشغيل لمرة واحدة: ينشئ الحاوية وسياسة التنزيل المجهول الخاصة بها

    يتم حفظ البيانات في وحدات التخزين intlayer_mongo-data و intlayer_redis-data و intlayer_minio-data. تم تثبيت اتصالات الخدمة (MONGODB_URI و REDIS_URL و S3_ENDPOINT وعنوان URL الداخلي للواجهة الخلفية للعرض من جانب الخادم) في ملف compose ولها الأسبقية على .env، الذي يحتفظ فقط بالمفاتيح السرية والتكاملات الاختيارية.

    المتطلبات الأساسية

    • Docker ≥ 24 مع ملحق Compose: يعرض برنامج التثبيت تثبيته على Linux و macOS. على نظام Windows، قم بتثبيت Docker Desktop (واجهة WSL 2 الخلفية) أولاً.
    • المنافذ 3000 و 3100 و 9000 و 9001 متاحة على المضيف.
    • خادم بريد: مفتاح API لـ Resend أو مرحّل SMTP.

    1. التثبيت

    يكتب docker-compose.yml وملف .env مع المفاتيح السرية المنشأة في ./intlayer/، ويطرح أسئلة الإعداد نفسها التي يطرحها الوضع الشامل (النطاق، خادم البريد، مفتاح OpenAI)، ويسحب الصور.

    sh
    curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
    

    Or by hand:

    sh
    mkdir intlayer && cd intlayer
    curl -fsSLO https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml
    curl -fsSL  https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -o .env
    # fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY (openssl rand -hex 32)
    

    In PowerShell:

    powershell
    $env:INTLAYER_MODE = "compose"; irm https://intlayer.org/install.ps1 | iex
    

    Or by hand:

    powershell
    mkdir intlayer; cd intlayer
    irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml -OutFile docker-compose.yml
    irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -OutFile .env
    # fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY
    
    bash
    npx intlayer init infra --mode compose
    

    2. تكوين خادم البريد

    إذا تخطيت سؤال خادم البريد، فاملأ بيانات Resend أو SMTP في intlayer/.env، تمامًا كما في الحاوية الشاملة (انظر خادم البريد العام).

    3. التشغيل

    sh
    cd intlayer && docker compose up -d
    

    مع نطاق مخصص، يقوم برنامج التثبيت أيضًا بتنزيل docker-compose.build.yml ويصبح أمر التشغيل docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build (انظر النطاق المخصص).

    افتح http://localhost:3000 (أو عنوان URL الخاص بلوحة التحكم) واتبع إعداد التشغيل الأول.

    مخازن البيانات المُدارة

    احذف الخدمة التي تستبدلها من ملف compose (بالإضافة إلى إدخال depends_on الخاص بها في backend)، وتجاوز المتغير المقابل:

    docker-compose.yml
    services:
      backend:
        environment:
          MONGODB_URI: mongodb+srv://user:password@cluster0.xxxxx.mongodb.net/intlayer
          REDIS_URL: rediss://default:password@redis.example.com:6380
          S3_ENDPOINT: https://s3.eu-west-1.amazonaws.com
          S3_PUBLIC_URL: https://intlayer-assets.s3.eu-west-1.amazonaws.com
    

    تعمل المتغيرات S3_ACCESS_KEY_ID / S3_SECRET_ACCESS_KEY / S3_BUCKET_NAME بشكل مباشر مع أي مزود متوافق مع S3.

    التوسع

    الخدمتان app و backend عديمتا الحالة (stateless). خلف موازن التحميل، وبافتراض إزالة تعيينات منافذ المضيف الثابتة وتوجيه الوكيل حسب اسم الخدمة، سيعمل الأمر docker compose up -d --scale backend=3. يتم تنسيق المهام في الخلفية عبر Redis (BullMQ)، بحيث تشارك نسخ الواجهة الخلفية المتعددة قوائم الانتظار بأمان.

    البناء من المصدر

    يقوم ملف تجاوز بتبديل خدمتي Intlayer من image: إلى build:. من استنساخ المستودع:

    sh
    cd docker/selfhost
    docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
    

    بدون استنساخ، وجّه سياق البناء إلى المستودع نفسه بتعيين INTLAYER_BUILD_CONTEXT=https://github.com/aymericzip/intlayer.git#main في .env. تتبع وسائط البناء VITE_* الخاصة بلوحة التحكم القيم DOMAIN و APP_URL و BACKEND_URL من الملف نفسه، وهكذا يتم تطبيق النطاق المخصص.

    النسخ الاحتياطي والترقية

    sh
    # Backup one volume (repeat for intlayer_redis-data and intlayer_minio-data)
    docker compose stop
    docker run --rm -v intlayer_mongo-data:/data -v "$(pwd)":/backup busybox tar czf /backup/mongo-data.tar.gz /data
    docker start intlayer
    
    # Upgrade, volumes are kept
    docker compose pull && docker compose up -d
    

    إعدادات برنامج التثبيت

    بدون --mode (أو INTLAYER_MODE)، يعرض برنامج التثبيت قائمة: desktop أو docker (شامل) أو compose. كما يقرأ بعض متغيرات البيئة؛ قم بتمريرها إلى الصدفة بدلاً من curl لأن الأمر يتم توجيهه بالأنابيب:

    sh
    curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
    
    powershell
    $env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
    
    VariableDefaultApplies toDescription
    INTLAYER_MODE(asked)alldesktop, docker or compose, same as --mode
    INTLAYER_DOWNLOAD_DIR~/DownloadsdesktopWhere the app installer is saved
    INTLAYER_IMAGEintlayer/cms-all:latestdockerAll-in-one image to pull
    INTLAYER_ENV_FILE./intlayer.envdockerWhere to write the environment file
    INTLAYER_CONTAINER_NAMEintlayerdockerContainer name
    INTLAYER_DATA_VOLUMEintlayer-datadockerNamed volume mounted at /data
    INTLAYER_APP_PORT3000dockerHost port for the dashboard
    INTLAYER_API_PORT3100dockerHost port for the API
    INTLAYER_S3_PORT9000dockerHost port for the MinIO S3 API
    INTLAYER_CONSOLE_PORT9001dockerHost port for the MinIO console
    INTLAYER_COMPOSE_DIR./intlayercomposeWhere docker-compose.yml and .env are written
    INTLAYER_SELFHOST_REFmainbothGit ref the compose file and env template are fetched from
    INTLAYER_BUILD_CONTEXT…/intlayer.git#mainbothBuild context used when a custom domain requires a rebuild
    INTLAYER_CUSTOM_IMAGEintlayer/cms-all:customdockerTag of the all-in-one image built for a custom domain
    تغير متغيرات المنفذ جانب المضيف فقط من التعيين. تحتوي الصور المنشورة على http://localhost:3000 و http://localhost:3100 و http://localhost:9000 المترجمة في حزمة لوحة التحكم، لذا احتفظ بالإعدادات الافتراضية ما لم تقم ببناء صورتك الخاصة، راجع القيود.

    إعداد التشغيل الأول

    سيؤدي فتح لوحة التحكم على مثيل جديد (قاعدة بيانات فارغة) إلى إعادة التوجيه تلقائيًا إلى صفحة /init:

    1. أنشئ الحساب الأول. نظرًا لأن مجموعة المستخدمين فارغة، تتم ترقية هذا الحساب تلقائيًا إلى مسؤول متميز.
    2. يتم إرسال رسالة بريد إلكتروني للتحقق عبر Resend أو مرحّل SMTP الخاص بك. التحقق من البريد الإلكتروني إلزامي، ولهذا السبب يجب تكوين خادم البريد قبل البدء.
    3. انقر فوق الرابط الموجود في البريد الإلكتروني وقم بتسجيل الدخول.

    بمجرد وجود مسؤول، يعيد المسار /init التوجيه إلى صفحة تسجيل الدخول العادية.

    متغيرات البيئة

    يقرأ كلا وضعي Docker نفس الملف (intlayer.env للحاوية أو .env لـ Compose) الذي تم إنشاؤه من docker/selfhost/.env.template.

    مطلوب

    VariableExampleDescription
    BETTER_AUTH_SECRET(generated)32-byte secret for session signing
    S3_SECRET_ACCESS_KEY(generated)Secret for the bundled MinIO
    RESEND_API_KEY(your key)Transactional email via Resend. Required for first-run setup unless an SMTP relay is configured instead (see Global mailer)

    محدد بواسطة النشر

    يتم تعيين هذه المتغيرات بواسطة الصورة (الشاملة) أو بواسطة ملف compose، ولا تحتاج إلى تجاوز إلا في حالة بنية غير قياسية. تُستثنى من ذلك DOMAIN و APP_URL و BACKEND_URL و S3_PUBLIC_URL: عند تعيينها في ملف env، تكون لها الأولوية في كلا الوضعين (انظر النطاق المخصص).

    VariableAll-in-oneDocker ComposeDescription
    PORT31003100Backend listening port
    APP_URLhttp://localhost:3000http://localhost:3000Public URL of the dashboard
    BACKEND_URLhttp://localhost:3100http://localhost:3100Public URL of the backend API
    DOMAINlocalhostlocalhostCookie domain
    SELF_HOSTEDtruetrueDisables the cloud-only API endpoints (billing, subscriptions, marketplace)
    MONGODB_URImongodb://127.0.0.1:27017/intlayer?replicaSet=rs0mongodb://mongo:27017/…MongoDB connection string, any mongodb:// or mongodb+srv:// cluster works
    REDIS_URLredis://127.0.0.1:6379redis://redis:6379Redis
    S3_ENDPOINThttp://127.0.0.1:9000http://minio:9000MinIO (server-to-server)
    S3_PUBLIC_URLhttp://localhost:9000/intlayerhttp://localhost:9000/intlayerPublic URL for browser asset loading
    S3_BUCKET_NAMEintlayerintlayerBucket name
    S3_ACCESS_KEY_IDintlayerintlayerMinIO access key

    تتلقى خدمة app في Compose أيضًا INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100: يصل المتصفح إلى واجهة برمجة التطبيقات على localhost:3100، ولكن العرض من جانب الخادم يتم داخل شبكة Compose ولذلك يجب استخدام اسم الخدمة.

    النطاق المخصص

    تقرأ الواجهة الخلفية عناوين URL العامة الخاصة بها وقت التشغيل، لكن لوحة التحكم تحتويها مضمّنة أثناء البناء: الصورتان المنشورتان intlayer/cms-frontend و intlayer/cms-all تعملان فقط على http://localhost:3000. لذلك يتطلب تقديم Intlayer على نطاقك الخاص أمرين، يُعدّهما برنامج التثبيت كليهما عندما تجيب على سؤال النطاق:

    1. أربعة متغيرات في ملف env، تقرؤها الواجهة الخلفية (ملفات تعريف الارتباط، روابط البريد الإلكتروني، استدعاءات OAuth، عناوين URL للأصول) ويستخدمها docker-compose.build.yml كوسائط بناء:

      intlayer.env
      DOMAIN=example.org                          # cookie domain, parent of the hosts below
      APP_URL=https://cms.example.org
      BACKEND_URL=https://back.example.org
      S3_PUBLIC_URL=https://s3.example.org/intlayer
      
    2. صورة للوحة التحكم مبنية بهذه العناوين. يبنيها Docker مباشرة من المستودع، دون الحاجة إلى استنساخ:

      sh
      # Docker Compose: the override reads the build args from .env
      docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
      
      # All-in-one
      docker build -f docker/selfhost/Dockerfile \
        --build-arg VITE_DOMAIN=example.org \
        --build-arg VITE_SITE_URL=https://cms.example.org \
        --build-arg VITE_IDE_URL=https://cms.example.org \
        --build-arg VITE_BACKEND_URL=https://back.example.org \
        -t intlayer/cms-all:custom \
        https://github.com/aymericzip/intlayer.git#main
      

    ثم ضع وكيلًا عكسيًا (reverse proxy) مع TLS أمام الحاوية: cms.example.org → المنفذ 3000، back.example.org → 3100، s3.example.org → 9000. يجب أن تشترك المضيفات الثلاثة في اللاحقة DOMAIN، لأن ملف تعريف ارتباط الجلسة مقيّد بها.

    اختياري (تتراجع الميزات بسلاسة عند غيابها)

    VariableFeature
    OPENAI_API_KEYAI-assisted translation and content audit
    GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRETGitHub OAuth login
    GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRETGoogle OAuth login
    GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRETGitLab OAuth login
    MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRETMicrosoft OAuth login

    خادم البريد العام

    تمر جميع رسائل البريد الإلكتروني الخاصة بالمعاملات، بما في ذلك رسائل البريد الإلكتروني غير التابعة للمؤسسة مثل عمليات إعادة تعيين كلمة المرور والروابط السحرية، عبر أحد وسيطي النقل العالميين:

    • Resend: باستخدام RESEND_API_KEY.
    • SMTP: باستخدام متغيرات MAIL_SMTP_*. بمجرد تعيين MAIL_SMTP_HOST، يتم استخدام SMTP وتجاهل RESEND_API_KEY.

    يلزم استخدام MAIL_PROVIDER فقط لفرض وسيلة نقل معينة إذا تم تكوين كليهما (على سبيل المثال MAIL_PROVIDER=resend للاحتفاظ بـ Resend عند وجود مضيف SMTP).

    VariableExampleDescription
    MAIL_FROMIntlayer <no-reply@acme.com>Sender header for either transport. Accepts a bare address or Name <email>
    MAIL_SMTP_HOSTsmtp.acme.comSMTP host. Setting it selects the SMTP transport
    MAIL_SMTP_PORT587SMTP port (defaults to 587)
    MAIL_SMTP_SECUREfalseImplicit TLS. Set true for port 465
    MAIL_SMTP_USER(your user)SMTP username (optional; omit for unauthenticated relays)
    MAIL_SMTP_PASSWORD(your password)SMTP password
    MAIL_PROVIDERresendOptional override: smtp or resend. Leave unset to auto-select
    ترتيب الأسبقية: يتجاوز خادم البريد الخاص بالمؤسسة (المكون من لوحة تحكم المؤسسة) خادم البريد العام، ويتجاوز خادم البريد العام مفتاح Resend الافتراضي.

    ربط مشروع Intlayer الخاص بك

    بمجرد تشغيل الحزمة، قم بتكوين مشروعك للإشارة إلى الواجهة الخلفية ولوحة التحكم المستضافة ذاتيًا بدلاً من intlayer.org.

    تكوين المشروع

    intlayer.config.ts
    import type { IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      editor: {
        clientId: process.env.INTLAYER_CLIENT_ID,
        clientSecret: process.env.INTLAYER_CLIENT_SECRET,
    
        /**
         * URL of the self-hosted CMS dashboard.
         * Default: https://app.intlayer.org
         */
        cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
    
        /**
         * URL of the self-hosted backend API.
         * Default: https://back.intlayer.org
         */
        backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
      },
    };
    
    export default config;
    

    Set the environment variables in your project's .env:

    sh
    INTLAYER_CMS_URL=http://localhost:3000
    INTLAYER_BACKEND_URL=http://localhost:3100
    INTLAYER_CLIENT_ID=<your-client-id>
    INTLAYER_CLIENT_SECRET=<your-client-secret>
    

    أنشئ بيانات اعتماد الوصول في لوحة التحكم المستضافة ذاتيًا في المشاريع ← مفاتيح الوصول (http://localhost:3000/projects).

    حزمة SDK @intlayer/api

    عند استخدام حزمة SDK @intlayer/api برمجيًا، مرر backendURL بشكل صريح:

    cms.ts
    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();
    

    القيود

    • النطاق المخصص يتطلب إعادة البناء. يتم تضمين جميع عناوين URL الخاصة بـ VITE_* الموجهة للمتصفح في لوحة التحكم أثناء وقت البناء، وتأتي الصور المنشورة (وتطبيق سطح المكتب) مع قيم localhost / Intlayer Cloud. افتراضيًا، يجب الوصول إلى لوحة التحكم على http://localhost:3000، والواجهة الخلفية على :3100، و MinIO على :9000؛ وإعادة تعيين منافذ المضيف لها التأثير نفسه. يُعدّ برنامج التثبيت كل شيء لإعادة البناء من المستودع عندما تزوده بنطاق (انظر النطاق المخصص)، لكن البناء نفسه يستغرق عدة دقائق. توجيه تطبيق سطح المكتب إلى واجهة خلفية مستضافة ذاتيًا غير مدعوم.
    • يتطلب إرسال البريد الإلكتروني خادم بريد فعال. يفرض إعداد التشغيل الأول التحقق من البريد الإلكتروني، لذلك يجب تكوين RESEND_API_KEY أو مرحّل SMTP (MAIL_SMTP_*). بعد تسجيل دخول المسؤول الأول، يمكن لكل مؤسسة أيضًا تكوين خادم بريد SMTP أو Resend الخاص بها من لوحة التحكم.
    • يحتاج تطبيق سطح المكتب إلى Node.js على الجهاز لبدء خادمه المدمج.
    • لا يوجد مساعد للتوثيق. يعتمد مساعد التوثيق بالذكاء الاصطناعي في intlayer.org (/api/ai/ask، /api/search/doc) على نحو 130 ميغابايت من التضمينات (embeddings) المحسوبة مسبقًا للتوثيق والتي لا تتضمنها صور الاستضافة الذاتية؛ لذا لا يتم تسجيل هذين المسارين في وضع الاستضافة الذاتية. لا تتأثر ميزات الذكاء الاصطناعي الخاصة بلوحة التحكم (الترجمة، التدقيق، الإكمال التلقائي، الدردشة) ولا تحتاج إلا إلى OPENAI_API_KEY.

    روابط مفيدة