Автор:
    Создание:2026-06-30Последнее обновление:2026-06-30

    Самостоятельный хостинг Intlayer

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

    Одна команда устанавливает всё:

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

    Установщик загружает docker-compose.yml и .env, автоматически генерирует необходимые секреты и запускает все контейнеры с помощью docker compose up -d.

    Единственная внешняя зависимость — это MongoDB: backend подключается к кластеру MongoDB Atlas, который вы предоставляете. Всё остальное работает внутри контейнера.

    Оглавление

    Архитектура

    plaintext
                    ┌─────────────────────────────┐
     браузер ──────▶ │ приложение  (TanStack Start)  :3000│ ──┐
                    └─────────────────────────────┘   │ VITE_BACKEND_URL
                    ┌─────────────────────────────┐   │
                    │  бэкенд (Fastify/Bun)  :3100│ ◀─┘
                    └──────────────┬──────────────┘
              ┌──────────┬─────────┼──────────┬───────────┐
              ▼          ▼         ▼          ▼           ▼
         mongo:27017  redis:6379  minio:9000  mailpit:1025  Chromium
         (RS из 1 узла)          (API S3)     (SMTP)        (в образе)
                                 minio:9001   mailpit:8025
                                 (консоль)    (веб-интерфейс)
    

    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. См. Ограничения — пользовательские домены не поддерживаются опубликованным образом.

    Параметры установщика

    Установщик читает несколько переменных окружения. Поскольку он передаётся в sh, передавайте их в shell, а не в curl:

    sh
    curl -fsSL https://intlayer.org/install.sh | INTLAYER_ENV_FILE=./config/intlayer.env sh
    
    ПеременнаяПо умолчаниюОписание
    INTLAYER_IMAGEghcr.io/aymericzip/intlayer-selfhost:latestОбраз для загрузки
    INTLAYER_ENV_FILE./intlayer.envГде записать env файл
    INTLAYER_CONTAINER_NAMEintlayerИмя контейнера
    INTLAYER_DATA_VOLUMEintlayer-dataИменованный том, подключённый в /data
    INTLAYER_APP_PORT3000Порт хоста для панели управления
    INTLAYER_API_PORT3100Порт хоста для API
    INTLAYER_S3_PORT9000Порт хоста для MinIO S3 API
    INTLAYER_CONSOLE_PORT9001Порт хоста для консоли MinIO
    Четыре переменные портов изменяют только хост часть маппинга, выведённую в команде docker run. Опубликованный образ имеет http://localhost:3000, http://localhost:3100 и http://localhost:9000, встроенные в bundle панели управления во время сборки, поэтому переназначение их оставляет браузер указывающим на старые порты. Сохраняйте значения по умолчанию, если вы не создаёте свой собственный образ — см. Ограничения.

    Быстрый старт

    Что делает установщик:

    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/Dockerfile3000Панель управления TanStack Start (пользовательский интерфейс CMS)
    backendпостроен из apps/backend/Dockerfile3100REST API Fastify (эндпоинт /health)
    mongomongo:7внутреннийРепликационный набор из одного узла (rs0)
    redisredis:7-alpineвнутреннийОчереди заданий (BullMQ) и кеширование (ioredis)
    miniominio/minio9000 (S3), 9001 (консоль)S3-совместимое объектное хранилище для аватаров и скриншотов
    mailpitaxllent/mailpit1025 (SMTP), 8025 (веб-интерфейс)Локальный приемник транзакционных электронных писем
    Порт MinIO 9000 должен быть доступен из браузера, поскольку загруженные активы (аватары, скриншоты) загружаются непосредственно из S3_PUBLIC_URL=http://localhost:9000/intlayer.

    Переменные окружения

    Обязательно

    ПеременнаяПримерОписание
    DB_IDintlayerПользователь MongoDB Atlas
    DB_MDP(ваш пароль)Пароль MongoDB Atlas
    DB_CLUSTERcluster0.xxxxx.mongodb.netХост кластера MongoDB Atlas (используется в URI mongodb+srv://)
    BETTER_AUTH_SECRET(сгенерировано)32-байтовый секрет для подписания сессии
    S3_SECRET_ACCESS_KEY(сгенерировано)Секрет для встроенного MinIO
    RESEND_API_KEY(ваш ключ)Транзакционные письма через Resend. Требуется для первоначальной настройки, если вы не настроили глобальный SMTP mailer (см. Global mailer)

    Обязательные (автоматически генерируемые или запрашиваемые)

    ПеременнаяПримерОписание
    NODE_ENVproductionСреда выполнения
    PORT3100Порт прослушивания бэкенда
    BACKEND_URLhttp://localhost:3100Публичный URL API бэкенда
    APP_URLhttp://localhost:3000Публичный URL панели управления
    DOMAINlocalhostДомен для файлов cookie
    MONGODB_URImongodb://mongo:27017/intlayer?replicaSet=rs0Полный URI для подключения к MongoDB
    REDIS_URLredis://redis:6379URL для подключения к Redis
    BETTER_AUTH_SECRET(сгенерирован)32-байтный секрет для подписи сессий
    MAIL_PROVIDERsmtpТранспорт для почты: smtp или resend
    MAIL_SMTP_HOSTmailpitИмя хоста SMTP (имя контейнера Mailpit)
    MAIL_SMTP_PORT1025Порт SMTP
    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:3100URL бэкенда, встроенный в панель управления во время сборки
    VITE_DOMAINlocalhostДомен, встроенный в панель управления во время сборки

    Необязательные (функции работают с ограничениями, если отсутствуют)

    ПеременнаяФункция
    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_PROVIDERsmtpГлобальная доставка: smtp или resend. Оставьте не установленной для использования значений по умолчанию
    MAIL_FROMIntlayer <no-reply@acme.com>Заголовок отправителя. Принимает простой адрес или формат Name <email>
    MAIL_SMTP_HOSTsmtp.acme.comSMTP-хост (обязателен, когда MAIL_PROVIDER=smtp)
    MAIL_SMTP_PORT587SMTP-порт (по умолчанию 587)
    MAIL_SMTP_SECUREfalseНеявный 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, // e.g. http://localhost:3000
    
        /**
         * URL самохостингового API бэкенда.
         * По умолчанию: https://back.intlayer.org
         */
        backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. 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.

    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.
    • Нет пользовательского домена. Все URL-адреса VITE_*, обращенные к браузеру, встраиваются в приложение во время сборки, и опубликованный образ поставляется со значениями 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 ближе к началу логов.

    Панель управления не может связаться с API

    Убедитесь, что VITE_BACKEND_URL соответствует URL, по которому бэкенд доступен из браузера (а не из сети Docker). Если вы изменили порт бэкенда или добавили обратный прокси, пересоберите образ панели управления:

    Отсутствует корзина MinIO

    Если одноразовый сервис minio-init не запустился (или запустился до того, как MinIO был готов), создайте корзину вручную:

    sh
    docker compose run --rm minio-init
    

    Полезные ссылки