Автор:
    Дата створення:2026-06-30Останнє оновлення:2026-06-30

    Розгортання Intlayer на власному сервері

    Intlayer може повністю працювати на вашій власній інфраструктурі — обліковий запис Intlayer Cloud не потрібен. Одна команда запускає готовий до виробництва стек:

    Одна команда встановлює все:

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

    Інсталятор завантажує docker-compose.yml та .env, автоматично генерує необхідні секрети та запускає всі контейнери за допомогою docker compose up -d.

    Єдиною зовнішньою залежністю є MongoDB: backend підключається до кластера MongoDB Atlas, який ви надаєте. Все інше працює всередині контейнера.

    Зміст


    Архітектура

    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)
    

    Chromium (використовується для генерації скріншотів Puppeteer) вбудований в образ бекенду — окремий контейнер не потрібен.


    Передумови

    • Docker ≥ 24 та Docker Compose ≥ v2. Якщо чогось бракує, інсталятор виводить посилання на встановлення та завершує роботу.
    • Порти 3000, 3100, 8025, 9000 та 9001 доступні на хості.
    • Хост Linux або macOS (або WSL2 на Windows).

    Все інше — Bun, Redis, MinIO, Chromium — поставляється всередині образу.


    Швидкий старт

    1. Запустити інсталятор

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

    Він перевіряє, чи встановлено Docker і він запущений, записує ./intlayer.env із уже згенерованими BETTER_AUTH_SECRET та S3_SECRET_ACCESS_KEY, і витягує образ. Він не запускає контейнер — backend не може завантажитися без ваших облікових даних бази даних.

    Повторне запущення інсталятора безпечне: існуючий 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>
    

    Файл також містить закоментовані блоки для опціональних функцій — SMTP mailer, OPENAI_API_KEY та OAuth провайдери. Розкоментуйте те, що вам потрібно.

    Файл читається за допомогою docker run --env-file, який не видаляє лапки та трактує все після = як значення. Пишіть значення без лапок і тримайте коментарі на окремих рядках.

    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. При першому завантаженні ініціалізуються сховища даних, тому дайте йому хвилину.

    Панель керування обслуговується на localhost. Див. Обмеження — спеціальні домени не підтримуються опублікованим образом.

    Налаштування installer

    Installer читає кілька змінних середовища. Оскільки він передається в sh, передайте їх оболонці, а не curl:

    sh
    curl -fsSL https://intlayer.org/install.sh | INTLAYER_ENV_FILE=./config/intlayer.env sh
    
    Змінна За замовчуванням Опис
    INTLAYER_IMAGE ghcr.io/aymericzip/intlayer-selfhost:latest Image для завантаження
    INTLAYER_ENV_FILE ./intlayer.env Де писати env файл
    INTLAYER_CONTAINER_NAME intlayer Ім'я контейнера
    INTLAYER_DATA_VOLUME intlayer-data Названий том, змонтований на /data
    INTLAYER_APP_PORT 3000 Хост-порт для dashboard
    INTLAYER_API_PORT 3100 Хост-порт для API
    INTLAYER_S3_PORT 9000 Хост-порт для MinIO S3 API
    INTLAYER_CONSOLE_PORT 9001 Хост-порт для MinIO console
    Чотири змінні портів змінюють лише сторону host у відображенні, надрукованому в команді docker run. Опублікований image має http://localhost:3000, http://localhost:3100 і http://localhost:9000 скомпільовані в bundle dashboard під час збірки, тому їх переназначення залишає браузер, спрямований на старі порти. Зберігайте значення за замовчуванням, якщо ви не будуєте власний image — див. Обмеження.

    Швидкий старт

    Що робить інсталятор:

    1. Перевіряє наявність docker та docker compose.
    2. Завантажує docker-compose.yml та .env.example до ./intlayer/.
    3. Якщо файл .env не існує, копіює приклад та генерує випадкові секрети для BETTER_AUTH_SECRET, S3_ACCESS_KEY_ID та S3_SECRET_ACCESS_KEY за допомогою openssl rand.
    4. Запускає docker compose pull + docker compose up -d.
    5. Виводить URL-адреси: дашборд :3000, API :3100, інтерфейс електронної пошти :8025, консоль MinIO :9001.

    Після запуску стека відкрийте http://localhost:3000 та створіть свій перший обліковий запис.


    Сервіси

    Сервіс Образ Порт(и) хосту Призначення
    app зібрано з apps/app/Dockerfile 3000 Панель приладів TanStack Start (інтерфейс CMS)
    backend зібрано з apps/backend/Dockerfile 3100 REST API Fastify (кінцева точка /health)
    mongo mongo:7 внутрішній Однонодовий реплікасет (rs0)
    redis redis:7-alpine внутрішній Черги завдань (BullMQ) та кешування (ioredis)
    minio minio/minio 9000 (S3), 9001 (консоль) Об'єктне сховище, сумісне з S3, для аватарів та скріншотів
    mailpit axllent/mailpit 1025 (SMTP), 8025 (веб-інтерфейс) Локальний приймач транзакційних електронних листів
    Порт MinIO 9000 має бути доступним для браузера, оскільки завантажені ресурси (аватари, скріншоти) завантажуються безпосередньо з S3_PUBLIC_URL=http://localhost:9000/intlayer.

    Змінні середовища

    Обов'язково

    Variable Example Description
    DB_ID intlayer MongoDB Atlas користувач
    DB_MDP (ваш пароль) MongoDB Atlas пароль
    DB_CLUSTER cluster0.xxxxx.mongodb.net MongoDB Atlas cluster хост (використовується в URI mongodb+srv://)
    BETTER_AUTH_SECRET (згенерований) 32-байтовий secret для підписання сеансу
    S3_SECRET_ACCESS_KEY (згенерований) Secret для bundled MinIO
    RESEND_API_KEY (ваш ключ) Transactional email через Resend. Обов'язково для першого запуску, якщо ви не налаштуєте глобальний SMTP mailer (див. Global mailer)

    Обов'язкові (автоматично генеруються або запитуються)

    Змінна Приклад Опис
    NODE_ENV production Середовище виконання
    PORT 3100 Порт прослуховування бекенду
    BACKEND_URL http://localhost:3100 Публічна URL-адреса API бекенду
    APP_URL http://localhost:3000 Публічна URL-адреса дашборду
    DOMAIN localhost Домен для cookie
    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 Ім'я кошика
    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 Вхід через GitHub OAuth
    GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET Вхід через Google OAuth
    GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRET Вхід через GitLab OAuth
    MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRET Вхід через Microsoft OAuth
    LINKEDIN_CLIENT_ID, LINKEDIN_CLIENT_SECRET Вхід через LinkedIn OAuth
    ATLASSIAN_CLIENT_ID, ATLASSIAN_CLIENT_SECRET Вхід через Atlassian OAuth

    Глобальний поштовик

    За замовчуванням усі транзакційні електронні листи відправляються через 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.

    Конфігурація проекту

    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 самостійно розгорнутого дашборду CMS.
         * За замовчуванням: https://app.intlayer.org
         */
        cmsURL: process.env.INTLAYER_CMS_URL, // наприклад, http://localhost:3000
    
        /**
         * URL самостійно розгорнутого бекенд API.
         * За замовчуванням: 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=<ваш-client-id>
    INTLAYER_CLIENT_SECRET=<ваш-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();
    

    Оновлення

    Це завантажує останні образи та перезапускає контейнери за допомогою docker compose pull && docker compose up -d. Існуючі томи (mongo-data, redis-data, minio-data) зберігаються — без втрати даних.

    sh
    docker compose pull
    docker compose up -d
    

    Резервне копіювання та відновлення

    Всі постійні дані зберігаються в трьох іменованих томах Docker.

    Резервне копіювання

    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). Backend підключається лише через mongodb+srv:// (побудований на основі DB_ID / DB_MDP / DB_CLUSTER), тому звичайний mongodb://host:27017 — включаючи вбудований mongod контейнера — не може бути використаний. Надайте кластер MongoDB Atlas.
    • Немає користувацького домену. Усі VITE_* URL-адреси, видимі браузером, вбудовуються в додаток під час збирання, а опублікований образ поставляється зі значеннями localhost. Доступ до панелі керування має здійснюватися через http://localhost:3000; обслуговування її на публічному домені потребувало б перебудови образу з цільовими URL-адресами вбудованими та не підтримується з коробки.
    • Email вимагає працюючого mailer. Перша установка примушує перевірку електронної пошти, тому має бути налаштований або RESEND_API_KEY, або глобальний SMTP mailer (MAIL_PROVIDER=smtp + MAIL_SMTP_*). Після того як перший адміністратор увійде, кожна організація також може налаштувати власний SMTP або Resend mailer з панелі керування.

    Усунення несправностей

    Бекенд циклічно перезапускається під час першого запуску

    MongoDB та Redis повинні бути справними, перш ніж бекенд почне працювати. Файл compose використовує depends_on з condition: service_healthy. Якщо ви бачите багаторазові перезапуски бекенду, перевірте, чи проходять перевірки стану mongo та redis:

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

    Шукайте MongoDB connection error близько до початку логу.

    Електронні листи не надсилаються

    За замовчуванням усі вихідні електронні листи захоплюються Mailpit. Відкрийте http://localhost:8025, щоб побачити надіслані повідомлення. Щоб надсилати реальні електронні листи, встановіть MAIL_PROVIDER=resend та RESEND_API_KEY=<ваш-ключ> у .env, а потім перезапустіть бекенд:

    Відсутній кошик MinIO

    Якщо одноразовий сервіс minio-init не запустився (або запустився до того, як MinIO був готовий), створіть кошик вручну:

    sh
    docker compose run --rm minio-init
    

    Корисні посилання