--- createdAt: 2026-06-30 updatedAt: 2026-06-30 title: Розгортання Intlayer на власному сервері description: Запустіть повний екземпляр Intlayer на власній інфраструктурі за допомогою однієї команди. Обліковий запис Intlayer Cloud не потрібен. keywords: - Самостійне розгортання - Docker - Docker Compose - Intlayer - CMS - Встановлення - Інфраструктура slugs: - doc - self-hosting author: aymericzip --- # Розгортання Intlayer на власному сервері Intlayer може повністю працювати на вашій власній інфраструктурі — обліковий запис Intlayer Cloud не потрібен. Одна команда запускає готовий до виробництва стек: ```sh 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). --- ## Швидкий старт ```sh curl -fsSL https://intlayer.org/install.sh | sh ``` Що робить інсталятор: 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` (веб-інтерфейс) | Локальний приймач транзакційних електронних листів | Внутрішні порти (mongo, redis) за замовчуванням не доступні з хосту. > Порт MinIO `9000` має бути доступним для браузера, оскільки завантажені ресурси (аватари, скріншоти) завантажуються безпосередньо з `S3_PUBLIC_URL=http://localhost:9000/intlayer`. --- ## Змінні середовища Інсталятор генерує готовий до використання файл `.env`. Таблиця нижче описує кожну змінну. ### Обов'язкові (автоматично генеруються або запитуються) | Змінна | Приклад | Опис | | ---------------------- | ----------------------------------------------- | ------------------------------------------------------- | | `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 ` | Адреса відправника | | `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 | --- ## Підключення вашого проекту Intlayer Після запуску стека направте свій проект на самостійно розгорнутий бекенд та дашборд замість `intlayer.org`. ### Конфігурація проекту ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]} 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` явно: ```typescript fileName="cms.ts" codeFormat="typescript" 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(); ``` --- ## Оновлення Повторний запуск інсталятора на існуючому розгортанні виконує послідовне оновлення: ```sh curl -fsSL https://intlayer.org/install.sh | sh ``` Це завантажує останні образи та перезапускає контейнери за допомогою `docker compose pull && docker compose up -d`. Існуючі томи (`mongo-data`, `redis-data`, `minio-data`) зберігаються — без втрати даних. Щоб оновити вручну з каталогу `./intlayer/`: ```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 ``` --- ## Використання зворотного проксі (Nginx / Caddy) Для виробничих розгортань розмістіть зворотний проксі перед контейнерами застосунку та бекенду замість прямого їх виставлення. ### Приклад Nginx ```nginx server { listen 80; server_name cms.example.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name api.example.com; location / { proxy_pass http://localhost:3100; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` Оновіть наступні змінні `.env`, щоб вони відповідали вашим публічним доменам: ```sh BACKEND_URL=https://api.example.com APP_URL=https://cms.example.com DOMAIN=example.com VITE_BACKEND_URL=https://api.example.com VITE_DOMAIN=example.com ``` > Змінні `VITE_*` вбудовуються в образ дашборду під час збірки. Якщо ви зміните їх після збірки образу, вам потрібно перезібрати образ `app` (`docker compose build app`) або використовувати ін'єкцію конфігурації під час виконання. --- ## Усунення несправностей ### Бекенд циклічно перезапускається під час першого запуску MongoDB та Redis повинні бути справними, перш ніж бекенд почне працювати. Файл compose використовує `depends_on` з `condition: service_healthy`. Якщо ви бачите багаторазові перезапуски бекенду, перевірте, чи проходять перевірки стану `mongo` та `redis`: ```sh docker compose ps docker compose logs mongo docker compose logs redis ``` ### Дашборд не може дістатися до API Переконайтеся, що `VITE_BACKEND_URL` відповідає URL-адресі, за якою бекенд доступний з **браузера** (не мережі Docker). Якщо ви змінили порт бекенду або додали зворотний проксі, перезіберіть образ дашборду: ```sh docker compose build app docker compose up -d app ``` ### Електронні листи не надсилаються За замовчуванням усі вихідні електронні листи захоплюються Mailpit. Відкрийте `http://localhost:8025`, щоб побачити надіслані повідомлення. Щоб надсилати реальні електронні листи, встановіть `MAIL_PROVIDER=resend` та `RESEND_API_KEY=<ваш-ключ>` у `.env`, а потім перезапустіть бекенд: ```sh docker compose restart backend ``` ### Відсутній кошик MinIO Якщо одноразовий сервіс `minio-init` не запустився (або запустився до того, як MinIO був готовий), створіть кошик вручну: ```sh docker compose run --rm minio-init ``` --- ## Корисні посилання - [Документація Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_CMS.md) - [Довідка щодо конфігурації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md) - [CMS SDK — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_CMS.md#програмний-доступ-за-допомогою-intlayerapi-sdk)