Как настроить Doconut для распределённых развертываний серверов
← Back to Blog••3 min read

Как настроить Doconut для распределённых развертываний серверов

Использование Doconut в конфигурации распределённых серверов

Когда необходимо обслуживать PDF‑файлы, файлы Office, чертежи CAD или изображения из кластера узлов ASP.NET Core, Doconut’s распределённый режим позволяет каждому узлу читать одинаковые артефакты страниц из общего места. Результат — горизонтально масштабируемый, безопасный просмотрщик, работающий за балансировщиком нагрузки без привязки сессий.

Почему распределённый режим важен

  • Масштабируемость – Каждый узел может публиковать страницы в UNC‑ или облачное хранилище; любой другой узел может обслуживать их мгновенно.
  • Безопасность – Артефакты хранятся зашифрованными в общей папке; просмотрщик проверяет каждый запрос с помощью токена сеанса ASP.NET.
  • Отсутствие зависимости от Office – Плагин Converter работает на сервере, преобразуя Word, Excel, PowerPoint, CAD и изображения в PDF или изображения без установки Microsoft Office.

Эти свойства позволяют корпоративным DMS, CRM или порталам e‑learning держать обработку документов внутри бэкенда .NET, масштабируясь до десятков контейнеров.

Общее хранилище для распределённого режима

В распределённом режиме Doconut ожидает, что артефакты страниц (PDF‑страницы, тайлы изображений и т.д.) будут записываться в место хранения, доступное каждому узлу фермы — сетевой ресурс, контейнер Azure Blob, бакет S3 или любое другое общее хранилище, поддерживаемое функцией Progressive Cloud Publishing. Просмотрщик автоматически ищет папку артефактов, соответствующую токену безопасности для каждого документа, поэтому дополнительный код не требуется, кроме обеспечения одинакового доступа чтения‑записи у всех узлов к выбранному хранилищу.

Подсказка: Используйте один и тот же UNC‑путь (например, \\fileserver\doconut) или облачный URL в конфигурации каждого экземпляра и поддерживайте согласованные разрешения папки. Поведение UsePerTokenSubfolders включено по умолчанию и изолирует страницы каждого документа.

Регистрация Doconut и промежуточного ПО сессии

Doconut полагается на состояние сессии ASP.NET Core для безопасности каждого документа. Распределённый кэш требуется только при использовании проекта minimal‑API; MVC или Razor Pages уже добавляют его.

builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
});

builder.Services.AddDistributedMemoryCache(); // session нуждается в кэше
builder.Services.AddSession();                 // Doconut проверяет session

app.UseSession();               // Должно выполняться до UseDoconut()
app.UseDoconutResources();      // Регистрирует статические ресурсы просмотрщика
app.Map("/doconut", branch => branch.UseDoconut());

Пользовательские пути (необязательно)

Если другой маршрут конфликтует с /doconut, измените пути один раз и синхронно обновите клиент BasePath:

builder.Services.AddDoconut(options =>
{
    options.MiddlewarePath = "/docs-engine";
    options.ResourcesPath  = "/docs-assets";
});
app.UseDoconutResources();
app.Map("/docs-engine", branch => branch.UseDoconut());

Никогда не добавляйте начальный слеш к MiddlewarePath или ResourcesPath; просмотрщик добавит слеш автоматически.

Собираем всё вместе: пример Minimal‑API

Ниже представлена компактная, готовая к продакшену настройка, объединяющая требования общего хранилища, обработку сессий и регистрацию Doconut.

var builder = WebApplication.CreateBuilder(args);

// 1️⃣ Регистрация ядра Doconut
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(
        AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
    options.MiddlewarePath = "/doconut";
    options.ResourcesPath  = "/doconut-res";
});

// 2️⃣ Session и кэш (требуется для безопасности)
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();

var app = builder.Build();

app.UseRouting();
app.UseSession();
app.UseDoconutResources();                     // статический пакет просмотрщика
app.Map("/doconut", branch => branch.UseDoconut());

app.Run();

Разверните этот бинарный файл в любое количество Docker‑контейнеров или Windows‑служб за балансировщиком нагрузки. Пока каждый экземпляр может достичь общего места хранения, настроенного для артефактов страниц, просмотрщик будет получать страницы с любого узла, а загрузки/конвертации переживут переходы между узлами.

Развёртывание за балансировщиком нагрузки

  1. Откройте одинаковый базовый URL (например, ` на каждом узле.
  2. Отключите привязку сессий – Распределённый режим Doconut устраняет необходимость привязки сессий.
  3. Убедитесь, что мониторинг состояния проверяет базовый эндпоинт вашего приложения (например, /health), чтобы балансировщик направлял трафик только на живые узлы.
  4. Следите за ростом общей папки; значение TTL по умолчанию 30 минут ограничивает объём хранилища, но вы можете изменить его в соответствии с требованиями соответствия.

С помощью этих шагов ваше .NET‑приложение, интенсивно работающие с документами, может обслуживать тысячи одновременных зрителей, хранить каждую страницу зашифрованной в покое и избежать накладных расходов на установку Office на каждый сервер.

Готовы попробовать? Возьмите бесплатную пробную версию Doconut, запустите пару контейнеров, укажите им общий UNC‑путь и наблюдайте, как просмотрщик масштабируется без единой cookie‑сессии с привязкой.

#dotnet#distributed#web‑farm#document‑viewer#scaling#распределённый#веб‑ферма#просмотрщик‑документов#масштабирование