Author:
    Creation:2026-06-30Last update:2026-06-30

    इंटलेयर को सेल्फ-होस्ट करना

    Intlayer आपके स्वयं के infrastructure पर चल सकता है। कोई Intlayer Cloud खाता आवश्यक नहीं है। एक single all-in-one Docker image dashboard, API, और स्थानीय datastores (Redis और MinIO) को bundle करता है जिसकी इसे आवश्यकता है, s6-overlay द्वारा supervised।

    इंटलेयर पूरी तरह से आपके अपने इंफ्रास्ट्रक्चर पर चल सकता है - इसके लिए इंटलेयर क्लाउड खाते की आवश्यकता नहीं है। एक ही कमांड एक उत्पादन-तैयार स्टैक को बूट करता है:

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

    इंस्टॉलर Docker की जांच करता है (इसे इंस्टॉल करने की पेशकश करते हुए), intlayer.env फ़ाइल लिखता है जिसमें आपके सीक्रेट पहले से ही जेनरेट हो चुके होते हैं, और इमेज को पुल करता है। फिर यह आपको अपनी क्रेडेंशियल भरने के लिए कहता है और docker run कमांड प्रिंट करता है — क्विक स्टार्ट देखें।

    इंस्टॉलर एक docker-compose.yml और एक .env डाउनलोड करता है, आवश्यक सीक्रेट्स को स्वतः जेनरेट करता है, और docker compose up -d के साथ सभी कंटेनरों को शुरू करता है।

    विषय-सूची

    आर्किटेक्चर

    plaintext
                    ┌─────────────────────────────┐
     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)
    

    क्रोमियम (Puppeteer स्क्रीनशॉट जनरेशन के लिए उपयोग किया जाता है) बैकएंड इमेज के अंदर बंडल किया गया है - किसी अलग कंटेनर की आवश्यकता नहीं है।

    त्वरित शुरुआत

    1. जांचता है कि docker और docker compose मौजूद हैं या नहीं।
    2. docker-compose.yml और .env.example को ./intlayer/ में डाउनलोड करता है।
    3. यदि कोई .env मौजूद नहीं है, तो उदाहरण कॉपी करता है और openssl rand के माध्यम से BETTER_AUTH_SECRET, S3_ACCESS_KEY_ID, और S3_SECRET_ACCESS_KEY के लिए रैंडम सीक्रेट्स जेनरेट करता है।
    4. docker compose pull + docker compose up -d चलाता है।
    5. URL प्रिंट करता है: डैशबोर्ड :3000, API :3100, ईमेल UI :8025, MinIO कंसोल :9001

    स्टैक के चालू होने के बाद, http://localhost:3000 खोलें और अपना पहला अकाउंट बनाएँ।

    क्विक स्टार्ट

    1. इंस्टॉलर चलाएँ

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

    यह Docker इंस्टॉल है और चल रहा है, यह सत्यापित करता है, ./intlayer.env को BETTER_AUTH_SECRET और S3_SECRET_ACCESS_KEY के साथ पहले से ही जेनरेट किए गए लिखता है, और इमेज को पुल करता है। यह कंटेनर शुरू नहीं करता है — बैकएंड आपके डेटाबेस क्रेडेंशियल्स के बिना बूट नहीं कर सकता।

    इंस्टॉलर को फिर से चलाना सुरक्षित है: एक मौजूदा intlayer.env को कभी भी ओवरराइट नहीं किया जाता है, इसलिए यह अपग्रेड पथ के रूप में दोहरी भूमिका निभाता है।

    2. अपनी साख भरें

    intlayer.env खोलें और TODO से चिह्नित मानों को पूरा करें:

    intlayer.env
    DB_ID=<atlas-user>
    DB_MDP=<atlas-password>
    DB_CLUSTER=<cluster>.xxxxx.mongodb.net
    RESEND_API_KEY=<your-resend-key>
    

    फाइल में वैकल्पिक सुविधाओं के लिए comment किए गए ब्लॉक भी हैं — SMTP mailer, OPENAI_API_KEY, और OAuth providers। जो आपको चाहिए उसे uncomment करें।

    फाइल को docker run --env-file द्वारा पढ़ा जाता है, जो quotes को strip नहीं करता और = के बाद सब कुछ को मान के रूप में मानता है। bare values लिखें, और comments को उनकी अपनी lines पर रखें।

    3. कंटेनर शुरू करें

    यह वह कमांड है जो इंस्टॉलर समाप्त होने पर प्रिंट करता है:

    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 \
      ghcr.io/aymericzip/intlayer-selfhost:latest
    

    फिर http://localhost:3000 खोलें। पहली बूट डेटास्टोर को initialize करती है, इसलिए इसे एक मिनट दें।

    डैशबोर्ड localhost पर सर्व किया जाता है। Limitations देखें — कस्टम डोमेन प्रकाशित image द्वारा समर्थित नहीं हैं।

    इंस्टॉलर सेटिंग्स

    इंस्टॉलर कुछ environment variables को पढ़ता है। क्योंकि यह sh में piped है, उन्हें curl के बजाय shell में pass करें:

    sh
    curl -fsSL https://intlayer.org/install.sh | INTLAYER_ENV_FILE=./config/intlayer.env sh
    
    VariableDefaultDescription
    INTLAYER_IMAGEghcr.io/aymericzip/intlayer-selfhost:latestखींचने के लिए Image
    INTLAYER_ENV_FILE./intlayer.envenv file लिखने के लिए जगह
    INTLAYER_CONTAINER_NAMEintlayerContainer का नाम
    INTLAYER_DATA_VOLUMEintlayer-data/data पर mounted named volume
    INTLAYER_APP_PORT3000dashboard के लिए Host port
    INTLAYER_API_PORT3100API के लिए Host port
    INTLAYER_S3_PORT9000MinIO S3 API के लिए Host port
    INTLAYER_CONSOLE_PORT9001MinIO console के लिए Host port
    चार port variables केवल docker run command में printed mapping के host side को बदलते हैं। प्रकाशित image में http://localhost:3000, http://localhost:3100 और http://localhost:9000 build time पर dashboard bundle में compiled हैं, इसलिए उन्हें remapping करने से browser पुराने ports की ओर इशारा करता है। जब तक आप अपना खुद का image बिल्ड नहीं कर रहे हैं, तब तक defaults को रखें — Limitations देखें।

    पहली बार सेटअप

    एक नए instance (खाली डेटाबेस) पर, डैशबोर्ड खोलने से आप /init पृष्ठ पर रीडायरेक्ट हो जाते हैं:

    1. पहला खाता बनाएँ। क्योंकि users collection खाली है, यह खाता स्वचालित रूप से super admin को प्रचारित किया जाता है।
    2. एक सत्यापन ईमेल भेजा जाता है (Resend के माध्यम से)। ईमेल सत्यापन अनिवार्य है — यही कारण है कि RESEND_API_KEY को शुरू करने से पहले सेट किया जाना चाहिए।
    3. ईमेल में लिंक पर क्लिक करें, फिर साइन इन करें।

    एक बार admin मौजूद हो जाने पर, /init मानक साइन-इन पृष्ठ पर रीडायरेक्ट करता है।

    सेवाएँ

    सर्विसइमेजहोस्ट पोर्ट(s)उद्देश्य
    appapps/app/Dockerfile से निर्मित3000TanStack Start डैशबोर्ड (CMS UI)
    backendapps/backend/Dockerfile से निर्मित3100Fastify REST API (/health एंडपॉइंट)
    mongomongo:7आंतरिकसिंगल-नोड रेप्लिका सेट (rs0)
    redisredis:7-alpineआंतरिकजॉब क्यू (BullMQ) और कैशिंग (ioredis)
    miniominio/minio9000 (S3), 9001 (कंसोल)अवतार और स्क्रीनशॉट के लिए S3-संगत ऑब्जेक्ट स्टोरेज
    mailpitaxllent/mailpit1025 (SMTP), 8025 (वेब UI)लोकल ट्रांजैक्शनल ईमेल सिंक
    MinIO पोर्ट 9000 ब्राउज़र द्वारा पहुँच योग्य होना चाहिए क्योंकि अपलोड किए गए एसेट (अवतार, स्क्रीनशॉट) सीधे S3_PUBLIC_URL=http://localhost:9000/intlayer से लोड होते हैं।

    Environment variables

    आवश्यक

    VariableExampleDescription
    DB_IDintlayerMongoDB Atlas user
    DB_MDP(your password)MongoDB Atlas password
    DB_CLUSTERcluster0.xxxxx.mongodb.netMongoDB Atlas cluster host (used in the mongodb+srv:// URI)
    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 you configure a global SMTP mailer (see Global mailer)

    आवश्यक (स्वतः जेनरेटेड या प्रॉम्प्टेड)

    वेरिएबलउदाहरणविवरण
    NODE_ENVproductionरनटाइम एनवायरनमेंट
    PORT3100बैकएंड लिसनिंग पोर्ट
    BACKEND_URLhttp://localhost:3100बैकएंड API का पब्लिक URL
    APP_URLhttp://localhost:3000डैशबोर्ड का पब्लिक URL
    DOMAINlocalhostकुकी डोमेन
    MONGODB_URImongodb://mongo:27017/intlayer?replicaSet=rs0पूर्ण MongoDB कनेक्शन URI
    REDIS_URLredis://redis:6379Redis कनेक्शन URL
    BETTER_AUTH_SECRET(जेनरेटेड)सेशन साइनिंग के लिए 32-बाइट सीक्रेट
    MAIL_PROVIDERsmtpमेल ट्रांसपोर्ट: smtp या resend
    MAIL_SMTP_HOSTmailpitSMTP होस्टनेम (मेलपिट कंटेनर नाम)
    MAIL_SMTP_PORT1025SMTP पोर्ट
    MAIL_FROMIntlayer <no-reply@localhost>प्रेषक पता
    S3_ENDPOINThttp://minio:9000S3-संगत एंडपॉइंट
    S3_PUBLIC_URLhttp://localhost:9000/intlayerब्राउज़र एसेट लोडिंग के लिए पब्लिक URL
    S3_BUCKET_NAMEintlayerबकेट नाम
    S3_ACCESS_KEY_ID(जेनरेटेड)MinIO एक्सेस की
    S3_SECRET_ACCESS_KEY(जेनरेटेड)MinIO सीक्रेट की
    VITE_BACKEND_URLhttp://localhost:3100बिल्ड टाइम पर डैशबोर्ड में बेक किया गया बैकएंड URL
    VITE_DOMAINlocalhostबिल्ड टाइम पर डैशबोर्ड में बेक किया गया डोमेन

    Optional (features degrade gracefully when absent)

    VariableFeature
    OPENAI_API_KEYAI-assisted translation and content audit
    STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_*Billing and subscription management
    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

    वैकल्पिक (अनुपस्थिति में फीचर धीरे-धीरे खराब हो जाते हैं)

    डिफ़ॉल्ट रूप से, सभी transactional ईमेल RESEND_API_KEY का उपयोग करके Resend के माध्यम से भेजे जाते हैं। Self-hosted deployments इसके बजाय प्रत्येक ईमेल — non-organization ईमेल जैसे कि password resets और magic links सहित — को environment variables के साथ कॉन्फ़िगर किए गए global mailer के माध्यम से route कर सकते हैं।

    MAIL_PROVIDER को सेट करें इसे सक्रिय करने के लिए। जब यह सेट नहीं है, तो डिफ़ॉल्ट Resend mailer का उपयोग किया जाता है।

    वेरिएबलफीचर
    OPENAI_API_KEYAI-सहायता प्राप्त अनुवाद और कंटेंट ऑडिट
    STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_*बिलिंग और सब्सक्रिप्शन प्रबंधन
    RESEND_API_KEYरीसेंड के माध्यम से ट्रांजैक्शनल ईमेल (सेट होने पर मेलपिट को ओवरराइड करता है)
    GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRETGitHub OAuth लॉगिन
    GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRETGoogle OAuth लॉगिन
    GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRETGitLab OAuth लॉगिन
    MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRETMicrosoft OAuth लॉगिन
    LINKEDIN_CLIENT_ID, LINKEDIN_CLIENT_SECRETLinkedIn OAuth लॉगिन
    ATLASSIAN_CLIENT_ID, ATLASSIAN_CLIENT_SECRETAtlassian OAuth लॉगिन
    प्राधिकार: एक संगठन का अपना mailer (Organization dashboard से कॉन्फ़िगर किया गया) global mailer को प्राथमिकता देता है, जो बदले में default Resend key को प्राथमिकता देता है।

    अपने इंटलेयर प्रोजेक्ट को कनेक्ट करना

    एक बार जब स्टैक चल रहा हो, तो अपने प्रोजेक्ट को 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,
    
        /**
         * सेल्फ-होस्टेड CMS डैशबोर्ड का URL।
         * डिफ़ॉल्ट: https://app.intlayer.org
         */
        cmsURL: process.env.INTLAYER_CMS_URL, // उदाहरण के लिए http://localhost:3000
    
        /**
         * सेल्फ-होस्टेड बैकएंड API का URL।
         * डिफ़ॉल्ट: https://back.intlayer.org
         */
        backendURL: process.env.INTLAYER_BACKEND_URL, // उदाहरण के लिए http://localhost:3100
      },
    };
    
    export default config;
    

    अपने प्रोजेक्ट के .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 पर प्रोजेक्ट्स → एक्सेस कीज़ के अंतर्गत एक्सेस क्रेडेंशियल बनाएँ।

    @intlayer/api SDK

    प्रोग्रामेटिक रूप से @intlayer/api SDK का उपयोग करते समय, 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();
    

    अपग्रेड करना

    ./intlayer/ डायरेक्टरी के अंदर से मैन्युअल रूप से अपग्रेड करने के लिए:

    sh
    docker compose pull
    docker compose up -d
    

    बैकअप और रीस्टोर

    सभी स्थायी डेटा तीन नामित डॉकर वॉल्यूम में रहते हैं।

    बैकअप

    sh
    docker run --rm \
      -v intlayer_mongo-data:/data \
      -v "$(pwd)":/backup \
      busybox tar czf /backup/mongo-data.tar.gz /data
    
    docker run --rm \
      -v intlayer_redis-data:/data \
      -v "$(pwd)":/backup \
      busybox tar czf /backup/redis-data.tar.gz /data
    
    docker run --rm \
      -v intlayer_minio-data:/data \
      -v "$(pwd)":/backup \
      busybox tar czf /backup/minio-data.tar.gz /data
    

    रीस्टोर

    sh
    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 क्लस्टर प्रदान करें।
    • कोई कस्टम डोमेन नहीं। सभी ब्राउज़र-सामने वाले VITE_* URLs बिल्ड टाइम पर ऐप में इनलाइन किए जाते हैं, और प्रकाशित इमेज localhost मानों के साथ आती है। डैशबोर्ड को http://localhost:3000 पर एक्सेस किया जाना चाहिए; इसे एक सार्वजनिक डोमेन पर सर्व करने के लिए इमेज को लक्ष्य URLs के साथत: फिर से बनाने की आवश्यकता होगी और इसे तुरंत समर्थित नहीं किया जाता है।
    • ईमेल को एक काम करने वाले मेलर की आवश्यकता है। पहली बार सेटअप ईमेल सत्यापन को लागू करता है, इसलिए या तो RESEND_API_KEY या एक global SMTP mailer (MAIL_PROVIDER=smtp + MAIL_SMTP_*) को कॉन्फ़िगर किया जाना चाहिए। पहले एडमिन साइन इन करने के बाद, प्रत्येक संगठन डैशबोर्ड से अपना स्वयं का SMTP या Resend मेलर भी कॉन्फ़िगर कर सकता है।

    समस्या निवारण

    पहली शुरुआत में बैकएंड क्रैश-लूप करता है

    बैकएंड शुरू होने से पहले MongoDB और Redis स्वस्थ होने चाहिए। कंपोज़ फ़ाइल condition: service_healthy के साथ depends_on का उपयोग करती है। यदि आप बार-बार बैकएंड रीस्टार्ट देखते हैं, तो जांचें कि mongo और redis हेल्थचेक पास हो गए हैं या नहीं:

    sh
    docker compose ps
    docker compose logs mongo
    docker compose logs redis
    

    लॉग के शीर्ष के पास MongoDB connection error खोजें।

    ईमेल नहीं भेजा जा रहा है

    डिफ़ॉल्ट रूप से, सभी आउटबाउंड ईमेल मेलपिट द्वारा कैप्चर किए जाते हैं। भेजे गए संदेशों को देखने के लिए http://localhost:8025 खोलें। वास्तविक ईमेल भेजने के लिए, .env में MAIL_PROVIDER=resend और RESEND_API_KEY=<your-key> सेट करें, फिर बैकएंड को रीस्टार्ट करें:

    MinIO बकेट गायब है

    यदि minio-init वन-शॉट सर्विस नहीं चली (या MinIO के तैयार होने से पहले चली), तो बकेट को मैन्युअल रूप से बनाएँ:

    sh
    docker compose run --rm minio-init
    

    उपयोगी लिंक