# Руководство по развертыванию

> Выберите форму развертывания приложения на Server SDK по масштабу, от одной машины до нескольких узлов совместного редактирования.

- Human documentation: [https://docs.univer.ai/ru-RU/server/deployment](https://docs.univer.ai/ru-RU/server/deployment)

- Agent Markdown: [https://docs.univer.ai/ru-RU/server/deployment.md](https://docs.univer.ai/ru-RU/server/deployment.md)

- Requested language: `ru-RU`

- Content language: `ru-RU`

- Documentation version: `1.2.0`

- Source: [deployment.ru-RU.mdx](https://github.com/dream-num/documentation/blob/dev/content/server/deployment.ru-RU.mdx)

---

На этой странице описаны три формы развертывания приложения на Server SDK в порядке роста масштаба. Сначала прочитайте [Collaboration SDK](https://docs.univer.ai/ru-RU/server/collaboration/overview.md), [импорт и экспорт](https://docs.univer.ai/ru-RU/server/import-export.md) и [примеры](https://docs.univer.ai/ru-RU/server/collaboration/examples.md), чтобы понять, как собираются модули; развертывание размещает ту же сборку на одном или нескольких узлах.

| Форма                                                          | Совместное редактирование | Импорт и экспорт | Рекомендуемый масштаб                                                               |
| -------------------------------------------------------------- | ------------------------- | ---------------- | ----------------------------------------------------------------------------------- |
| [Одна машина](#одна-машина)                                    | Один узел                 | Тот же узел      | Локальные приложения, разработка и тестирование, несколько внутренних пользователей |
| [Отдельный импорт и экспорт](#отдельный-импорт-и-экспорт)      | Один узел                 | Отдельный узел   | Многопользовательский онлайн-сервис в пределах емкости одного узла                  |
| [Несколько узлов](#несколько-узлов-совместного-редактирования) | Несколько узлов           | Отдельный узел   | Сверх емкости одного узла или при необходимости переключения между узлами           |

## Одна машина

Все функции развернуты в одном процессе Node.js, браузер подключается к нему напрямую.

```mermaid
%%{init: {"themeVariables": {"fontSize": "14px"}, "flowchart": {"nodeSpacing": 24, "rankSpacing": 40, "padding": 12}}}%%
flowchart LR
    Browser(["Браузер"]) --> App["Совместное редактирование + Exchange"]
    App --> DB[("База данных")]
    classDef default rx:8,ry:8,stroke-width:1px
    classDef actor fill:transparent,stroke:none
    class Browser actor
```

* Database Adapter реализует контракт `IDatabaseAdapter`; см. [Адаптеры баз данных](https://docs.univer.ai/ru-RU/server/collaboration/database-adapters.md).
* Хранение задач и файлов, тайм-ауты и ссылки на скачивание для импорта и экспорта описаны в разделе [Интеграция обмена файлами](https://docs.univer.ai/ru-RU/server/import-export.md).
* Конвертация сильно нагружает процессор, и большой файл замедляет совместное редактирование.

Выделяйте импорт и экспорт, когда конвертации влияют на отклик совместного редактирования или сервис должен постоянно обслуживать много пользователей.

## Отдельный импорт и экспорт

Импорт и экспорт переносятся на отдельный узел; совместное редактирование остается на одном узле; шлюз маршрутизирует два вида путей раздельно; оба используют одну базу данных.

```mermaid
%%{init: {"themeVariables": {"fontSize": "14px"}, "flowchart": {"nodeSpacing": 24, "rankSpacing": 40, "padding": 12}}}%%
flowchart LR
    Browser(["Браузер"]) --> Gateway["Шлюз"]
    Gateway -->|"Запросы совместного редактирования"| Node["Узел совместного редактирования"]
    Gateway -->|"Запросы импорта и экспорта"| Exchange["Узел импорта и экспорта"]
    Node --> DB[("База данных")]
    Exchange --> DB
    classDef default rx:8,ry:8,stroke-width:1px
    classDef actor fill:transparent,stroke:none
    class Browser actor
```

Узел импорта и экспорта собирает Database Adapter, `UniverCollabService` и модуль конвертации и работает напрямую с базой данных; точки внедрения те же, что и на одной машине.

Число документов, которые обслуживает один узел совместного редактирования, ограничено памятью процесса. Переходите к нескольким узлам, когда емкости не хватает или нужно переключение при отказе.

## Несколько узлов совместного редактирования

Несколько узлов совместного редактирования выполняют один и тот же код с одной базой данных. pub/sub-адаптер передает Rooms, Presence и рассылки между узлами, ticket store делит Session Tickets, а `@univerjs-pro/collaboration-cluster-redis` предоставляет реализацию на Redis. Пример: [Multi-node](https://docs.univer.ai/ru-RU/server/collaboration/examples.md#multi-node).

```mermaid
%%{init: {"themeVariables": {"fontSize": "14px"}, "flowchart": {"nodeSpacing": 24, "rankSpacing": 40, "padding": 12}}}%%
flowchart LR
    Browser(["Браузер"]) --> Gateway["Шлюз"]
    subgraph Nodes["Узлы совместного редактирования"]
        direction TB
        A["Узел A"]
        B["Узел B"]
    end
    Gateway -->|"Запросы совместного редактирования"| A
    Gateway --> B
    subgraph Exchange["Узлы импорта и экспорта"]
        direction TB
        X1["Узел A"]
        X2["Узел B"]
    end
    Gateway -->|"Запросы импорта и экспорта"| X1
    Gateway --> X2
    A --- PubSub[("pub/sub + ticket store")]
    B --- PubSub
    A --> DB[("База данных")]
    B --> DB
    X1 --> DB
    X2 --> DB
    classDef default rx:8,ry:8,stroke-width:1px
    classDef actor fill:transparent,stroke:none
    class Browser actor
```

Каждый узел совместного редактирования передает pub/sub-адаптер и ticket store Redis в Endpoint; остальная сборка остается прежней:

```ts
import { createClient } from "redis";
import { RedisPubSubAdapter, RedisSessionTicketStore } from "@univerjs-pro/collaboration-cluster-redis";
import { UniverCollabEndpoint } from "@univerjs-pro/collaboration-endpoint";

const client = createClient({ url: process.env.REDIS_URL });
const subClient = client.duplicate();
await Promise.all([client.connect(), subClient.connect()]);

const pubSub = new RedisPubSubAdapter({ pubClient: client, subClient });
const ticketStore = new RedisSessionTicketStore({ client });
const endpoint = new UniverCollabEndpoint(service, { pubSub, ticketStore });
```

## Дальше

Очень большой документ замедляет запросы небольших документов на том же узле. Разделите узлы на пулы по размеру документов и направляйте большие документы через шлюз в отдельный пул; ключом маршрутизации остается unit ID, а все пулы используют общую базу данных и pub/sub.
