Документация
Описание функциональных характеристик программы для ЭВМ «Платформум», информация, необходимая для установки и эксплуатации, описание процессов жизненного цикла и перечень сторонних компонентов.
Содержание
Общие сведения
| Наименование программы | Платформум |
| Класс программного обеспечения | 09.11 «Средства управления содержимым (CMS), сайты и портальные решения» |
| Правообладатель | Индивидуальный предприниматель Азаров Василий Васильевич, ИНН 245606783350, ОГРНИП 317246800027095 |
| Язык интерфейса | русский |
| Способ поставки | серверное программное обеспечение, устанавливается на сервер заказчика либо предоставляется как услуга доступа |
Назначение и область применения
Платформум — система управления содержимым, предназначенная для создания и сопровождения официальных сайтов организаций. Основная область применения — сайты образовательных организаций и органов государственной власти, где к составу и оформлению сведений предъявляются требования нормативных актов.
Программа позволяет сотруднику организации, не владеющему вёрсткой и программированием, самостоятельно вести структуру сайта, наполнять страницы, публиковать новости и документы, собирать заявки посетителей и поддерживать раздел обязательных сведений в актуальном состоянии.
Отличительная особенность — встроенная поддержка раздела «Сведения об образовательной организации» по приказу Рособрнадзора от 04.08.2023 № 1493: адреса подразделов, обязательная микроразметка и проверка готовности раздела входят в состав программы, а не собираются вручную.
Функциональные характеристики
Структура сайта
- Дерево страниц произвольной вложенности; у каждой страницы собственный адрес.
- Шаблоны разметки с именованными зонами: одна колонка, страница с боковой колонкой, посадочная страница. Содержимое зон, отсутствующих в текущем шаблоне, сохраняется и восстанавливается при обратной смене шаблона.
- Состояния страницы: черновик, опубликована, в архиве. Тело хранится в двух копиях — правится черновая, посетителю отдаётся опубликованная. Предпросмотр черновика доступен по временной ссылке со сроком действия 30 минут.
- Сквозные области сайта (полоса над шапкой, шапка, боковая колонка, колонки подвала, конец страницы и другие — всего одиннадцать зон) настраиваются отдельно и применяются ко всем страницам сразу.
- Меню настраиваются независимо для каждого канала показа.
Конструктор страниц
- Страница собирается из блоков. Блок описывается типом, набором свойств и оформлением: якорь, ширина, отступы, высота секции, фон (цвет, изображение, градиент), появление при прокрутке.
- Состав типов блоков и состав их полей задан реестром типов; форма настройки в кабинете строится по реестру автоматически.
- Значения полей проверяются на сервере до записи.
- Заготовки: сохранение настроенного блока для повторной вставки, готовые секции и готовые страницы целиком.
- Блок, тип которого неизвестен текущей версии, не приводит к ошибке и не теряется.
Оформление и темы
- Оформление сайта задаётся темой — набором файлов (таблица стилей, манифест палитр и гарнитур, описания готовых секций и шаблонов блоков).
- Темы хранятся версиями: установка новой версии не затирает прежнюю, предусмотрены предпросмотр без применения и откат.
- Цвета и шрифты настраиваются набором переменных без правки файлов темы.
- Тема может принести собственную разметку блока, но не может запросить данные, которых программа этому типу блока не отдаёт.
Медиатека и документы
- Файловый менеджер с деревом папок; в папке хранятся вперемешку изображения и документы.
- Хранение по содержимому: имя файла вычисляется из его содержимого, поэтому один и тот же документ, загруженный дважды, физически хранится один раз.
- Изображения при загрузке автоматически преобразуются в формат WebP в несколько ширин; для плавной загрузки формируется размытый заполнитель.
- Ограничение доступа задаётся на папке, а не на отдельном файле.
- Сведения об электронной подписи документа. Рядом с документом может лежать отсоединённая подпись; программа читает из неё сведения о подписавшем, сертификате и дате и показывает штамп у документа на сайте. Проверку действительности подписи программа не выполняет и на себя не принимает.
Публикации
- Материалы в потоке: новости, статьи, вакансии, сведения о персонале и произвольные типы, заводимые администратором.
- У типа публикаций своя лента и свои рубрики; адрес карточки строится от адреса страницы с лентой.
- Отложенная публикация по дате, ручной и датный порядок, фильтр по рубрикам, обложка по умолчанию.
Раздел «Сведения об образовательной организации»
- Адреса подразделов соответствуют приказу Рособрнадзора от 04.08.2023 № 1493 и воспроизводятся без изменений, включая регистр букв, — по ним сведения ищет автоматизированная система мониторинга.
- Содержимое размещается блоком «Таблица сведений» с обязательной микроразметкой в двух видах: «поле — значение» и «таблица записей»; строки таблицы могут собираться из публикаций выбранного типа.
- Справочник обязательных строк даёт заготовку; подписи, имена атрибутов и порядок правятся из кабинета, поэтому обновление справочника не изменяет уже собранные страницы.
- Экран «Готовность к проверке» показывает, что страница по требуемому адресу заведена, опубликована, открыта посетителю, содержит блок с микроразметкой, обязательные строки заполнены, а у документов есть сведения о подписи. Проверка охватывает то, что видно программе, и не заменяет собой оценку соответствия организации требованиям приказа.
Формы обратной связи
- Состав полей формы задаётся конструктором; имя, телефон и согласие на обработку персональных данных присутствуют всегда, кроме формы подписки на рассылку.
- Форма работает без выполнения сценариев в браузере посетителя.
- Защита от автоматических отправок: скрытое поле-приманка, минимальное время заполнения, ограничение числа попыток с одного адреса. Суточная сводка исходов доступна администратору и не содержит данных посетителей.
- Принятая заявка создаёт обращение и, при наличии настроенных получателей, порождает уведомление сотруднику и передачу во внешнюю систему.
- При отказе введённые данные возвращаются в форму — заявка не теряется.
Поиск по сайту
Полнотекстовый поиск по опубликованным материалам. Индекс обновляется непосредственно при публикации и архивации. Результаты фильтруются по правам посетителя до выдачи: закрытые материалы не попадают в выдачу даже частично.
Разграничение доступа
- Уровни доступности страницы: открыта всем, для зарегистрированных посетителей, для сотрудников, для представителей. Дополнительно страница может требовать принадлежности к заданным группам доступа; условия складываются по «и».
- Закрытые файлы отдаются через промежуточный контроль: посторонний получает ответ «не найдено», а не «доступ запрещён».
- Закрытые страницы отдаются с запретом кэширования и не включаются в карту сайта.
Поисковая оптимизация и переезды
- Заголовок, описание, изображение для социальных сетей, канонический адрес и запрет индексации — у каждой страницы.
- Карта сайта и файл
robots.txtформируются автоматически; предусмотрен режим полного исключения сайта из поисковой выдачи. - История адресов: после переименования страницы прежний адрес продолжает работать и ведёт на новый постоянным перенаправлением.
- Правила переезда «старый адрес — новый адрес» задаются администратором и срабатывают только там, где сайт ничего не нашёл: существующая страница всегда главнее правила.
Доступность
Версия для слабовидящих переключается посетителем и учитывается при кэшировании страниц.
Многоканальность
Одно и то же содержимое отдаётся сайту готовой разметкой на стороне сервера, а мобильному приложению — структурированными данными. Канал показа задаётся у каждой страницы.
Информация, необходимая для установки
Требования к среде
| Компонент | Требование |
|---|---|
| Операционная система | Linux (проверено на Ubuntu); программа кроссплатформенная и работает также на Windows |
| Среда выполнения | ASP.NET Core Runtime 9 |
| Система управления базами данных | PostgreSQL версии 16 и выше (эксплуатируется на 18) |
| Веб-сервер | обратный прокси с поддержкой HTTPS |
| Способ установки | контейнеры (Docker с модулем compose) либо развёртывание службой |
Порядок установки контейнерами
- Разместить на сервере файлы поставки и файл лицензии.
- Запустить установщик из состава поставки. Установщик запрашивает доменное имя и открытый ключ проверки лицензии, формирует файл параметров с ограниченными правами доступа, генерирует пароль базы данных и ключ подписи сеансов, собирает конфигурацию обратного прокси и поднимает три службы: приложение, базу данных и прокси.
- Схема базы данных создаётся и обновляется автоматически при запуске приложения; отдельного шага миграции не требуется.
- По завершении установки публичная часть доступна по адресу домена, кабинет управления — по адресу
/admin.
Параметры конфигурации
Задаются переменными окружения либо файлом параметров:
| Параметр | Назначение |
|---|---|
| доменное имя и публичный адрес | адрес сайта, используется в ссылках |
| строка подключения к базе данных | размещение и учётные данные СУБД |
| ключ подписи сеансов | подпись токенов доступа кабинета |
| идентификатор и открытый ключ лицензии | проверка лицензии |
| предельные размеры изображений и файлов | ограничения медиатеки |
Секреты хранятся только в переменных окружения или защищённом файле параметров и не входят в состав исходного текста и файлов поставки.
Лицензирование
Право использования подтверждается файлом лицензии — подписанным маркером, который программа проверяет без обращения к сети, открытым ключом правообладателя. По истечении срока действия программа переходит в режим только для чтения: сайт продолжает работать и обслуживать посетителей, изменение содержимого становится недоступным. Продление выполняется заменой файла лицензии.
Средства выпуска и управления лицензионными ключами размещены на территории Российской Федерации и контролируются правообладателем.
Информация, необходимая для эксплуатации
Работа администратора
Управление ведётся через кабинет по адресу /admin. Вход по учётной записи
с разграничением прав. Доступны: дерево страниц и конструктор блоков, медиатека,
публикации, раздел обязательных сведений с экраном готовности, заявки посетителей,
меню и оформление, настройки сайта, переезды.
Резервное копирование
Копированию подлежат:
- база данных (всё содержимое сайта, настройки, заявки);
- каталог файлов медиатеки;
- каталог ключей защиты данных — без него зашифрованные значения в базе восстановить нельзя;
- файл лицензии.
Обновление
Обновление выполняется заменой поставки; изменения схемы базы данных применяются при запуске. Файлы на сервере вручную не изменяются: индивидуальность конкретного сайта хранится в его базе данных и в файлах темы, а не в файлах программы, поэтому обновление их не затрагивает.
Автоматическое обновление из внешних источников в программе отсутствует. Момент обновления определяет владелец сервера.
Техническая поддержка
Обращения принимаются по адресу электронной почты avasiliy1@ya.ru и по телефону +7 911 705-00-67. Режим работы, сроки реакции и границы поддержки — на странице «Техническая поддержка» и в публичной оферте.
Сведения о составе
Программа написана на языке C# (платформа .NET 9, веб-каркас ASP.NET Core); публичная часть сайта формируется на стороне сервера, кабинет управления — одностраничное приложение на TypeScript. Данные хранятся в PostgreSQL.
Перечень сторонних компонентов с указанием лицензий приведён ниже. Ни одна из лицензий не ограничивает права правообладателя на распространение программы на территории Российской Федерации.
Процессы жизненного цикла
Раздел описывает процессы, обеспечивающие поддержание жизненного цикла программного обеспечения, в том числе устранение неисправностей, выявленных в ходе эксплуатации, и совершенствование программы.
Общее устройство процесса
Разработка ведётся правообладателем непрерывно, версии выпускаются по мере готовности изменений. Программа представляет собой модульное приложение: части взаимодействуют через объявленные контракты и события, каждая владеет своей схемой данных. Такое устройство позволяет изменять одну часть, не затрагивая остальные, и составляет техническую основу сопровождения.
Все материалы разработки — исходный текст, документация, планы работ, история изменений — хранятся в системе контроля версий Git.
Планирование
Работа ведётся задачами. Каждая задача описывается кратким заданием: что меняется, в каких файлах, чем проверяется результат, какие решения приняты заранее. Задания хранятся в системе контроля версий вместе с исходным текстом, поэтому история решений восстановима на любую дату.
Разработка
Изменения выполняются в отдельной ветви системы контроля версий и попадают в основную ветвь только после проверки. Правила оформления исходного текста, границы модулей и принятые архитектурные решения зафиксированы документально и проверяются при приёмке изменения.
Проверка качества
Применяются два вида проверок:
- Сквозные проверки — автоматические сценарии, обращающиеся к работающему приложению по протоколу HTTP с настоящей базой данных. Каждый завершённый этап разработки закрывается своим сценарием: вход пользователя, работа с каталогом и заказом, проверка лицензии, работа приложения управления.
- Модульные и интеграционные проверки — автоматические тесты уровня кода, в первую очередь для областей с состоянием и параллельным доступом.
Изменение не принимается, если проверки не пройдены.
Выпуск версии
Состав версии воспроизводим. Версии всех сторонних компонентов закреплены точными числами, рядом с каждым проектом хранится файл с полным перечнем зависимостей, включая косвенные. Восстановление зависимостей при сборке выполняется в режиме строгой сверки: если состав компонентов разошёлся с зафиксированным перечнем, сборка прерывается. Тем самым поставка собирается ровно из того набора компонентов, который перечислен в разделе «Сторонние компоненты и лицензии».
Развёртывание и обновление
Обновление выполняется заменой поставки. Изменения структуры базы данных применяются автоматически при запуске приложения — отдельного действия администратора не требуется.
Перед обновлением сохраняются каталог предыдущей версии и дамп базы данных. Возврат к предыдущей версии выполняется восстановлением этих двух копий.
Каталоги, содержащие данные заказчика — файлы медиатеки, файл лицензии, файлы темы оформления, — вынесены за пределы поставки и обновлением не затрагиваются.
Устранение неисправностей, выявленных при эксплуатации
- Приём. Обращение принимается по каналам, указанным на странице «Техническая поддержка».
- Воспроизведение. Неисправность воспроизводится на стенде разработчика. Если воспроизвести не удаётся, у заказчика запрашиваются условия возникновения и записи журналов работы.
- Устранение. Исправление выполняется в отдельной ветви, сопровождается автоматической проверкой, которая до исправления не проходила.
- Выпуск. Исправление включается в очередную версию; при существенном влиянии на работоспособность выпускается отдельная версия вне очереди.
- Уведомление. Заказчик извещается о выпуске и порядке обновления.
Совершенствование
Новые возможности планируются по заявкам заказчиков и по собственному плану развития. Совместимость сохраняется: тип содержимого, неизвестный текущей версии, не приводит к ошибке и не теряется, а отменённые элементы не удаляются, а скрываются — ранее созданные страницы продолжают отображаться.
Резервное копирование
Резервному копированию подлежат база данных, каталог файлов медиатеки, каталог ключей защиты данных и файл лицензии. Состав и порядок описаны выше, в разделе «Информация, необходимая для эксплуатации».
Сведения о персонале
Поддержание жизненного цикла обеспечивает правообладатель.
| Роль | Обязанности | Требуемая квалификация |
|---|---|---|
| Разработчик серверной части | развитие и исправление серверной части, структура базы данных, сборка поставки | язык C#, платформа .NET, ASP.NET Core, PostgreSQL |
| Разработчик клиентской части | приложение управления и отображение содержимого | TypeScript, React, вёрстка |
| Инженер сопровождения | развёртывание, обновление, резервное копирование, разбор обращений | Linux, обратный прокси, контейнеры, PostgreSQL |
Численность: один человек — правообладатель. Все перечисленные роли совмещаются им лично. При росте числа заказчиков привлекаются исполнители по договору.
Сторонние компоненты и лицензии
Перечень собран из фактического состава сборки: пакеты NuGet — из файлов блокировки зависимостей рядом с каждым проектом, где записаны и прямые, и косвенные зависимости с точными версиями, а лицензия каждого пакета взята из его описания; пакеты npm — из состава производственных зависимостей фронтендов.
Версии закреплены точными числами, плавающих не осталось: именно плавающая версия однажды бесшумно перевела один из пакетов с безусловной лицензии на условную.
Ни одна из перечисленных лицензий не ограничивает права правообладателя
на распространение программы на территории Российской Федерации. Условных лицензий
вида «бесплатно, пока выручка меньше названной суммы» в перечне нет. Единственная
копилефт-лицензия — LGPL-3.0-or-later у пакета NetVips.Native; библиотека подключена
динамически, отдельными файлами рядом с приложением, её исходный текст не изменяется,
и при таком использовании LGPL не распространяется на текст программы.
NuGet — прямые зависимости
Пакеты, подключённые в *.csproj явно. Столбец «Где подключён» — короткие имена проектов
(Api — TenantApp.Api, BuildingBlocks, остальные — модули монолита, ControlPlane,
UnitTests).
| Пакет | Версия | Лицензия | Где подключён | Ссылка |
|---|---|---|---|---|
| ClosedXML | 0.104.2 | MIT | BuildingBlocks, Catalog, Inventory, Orders | сайт |
| EFCore.NamingConventions | 9.0.0 | Apache-2.0 | Booking, Broadcasts, Catalog, Chat, ClientState, Content, Contracts, ControlPlane, Crm, Deposit, Finance, Identity, Integrations, Inventory, Licensing, Logging, Loyalty, Marketing, Notifications, Orders, Payments, Reseller, Settings, Tickets | сайт |
| Magick.NET-Q8-AnyCPU | 14.16.0 | Apache-2.0 | Content | сайт |
| MailKit | 4.17.0 | MIT | BuildingBlocks | сайт |
| Markdig | 0.37.0 | BSD-2-Clause | Content | сайт |
| Microsoft.AspNetCore.Authentication.JwtBearer | 9.0.18 | MIT | Api, ControlPlane | сайт |
| Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation | 9.0.18 | MIT | Content | сайт |
| Microsoft.EntityFrameworkCore | 9.0.17 | MIT | BuildingBlocks | сайт |
| Microsoft.EntityFrameworkCore.Design ⁴ | 9.0.17 | MIT | Api, ControlPlane | сайт |
| Microsoft.EntityFrameworkCore.Relational | 9.0.17 | MIT | BuildingBlocks | сайт |
| Microsoft.IdentityModel.JsonWebTokens ⁵ | 8.19.1 | MIT | BuildingBlocks, Identity | сайт |
| Microsoft.NET.Test.Sdk ⁴ | 17.14.1 | MIT | UnitTests | сайт |
| NetVips | 3.2.0 | MIT | Catalog, Content | сайт |
| NetVips.Native | 8.18.4 | LGPL-3.0-or-later | Catalog, Content | сайт |
| Npgsql.EntityFrameworkCore.PostgreSQL | 9.0.4 | PostgreSQL | Booking, Broadcasts, Catalog, Chat, ClientState, Content, Contracts, ControlPlane, Crm, Deposit, Finance, Identity, Integrations, Inventory, Licensing, Logging, Loyalty, Marketing, Notifications, Orders, Payments, Reseller, Settings, Tickets | сайт |
| QRCoder | 1.6.0 | MIT | Settings | сайт |
| PDFsharp-MigraDoc ³ | 6.2.4 | MIT | Payments | сайт |
| System.Security.Cryptography.Pkcs ⁵ | 9.0.18 | MIT | Content | сайт |
| xunit ⁴ | 2.9.3 | Apache-2.0 | UnitTests | сайт |
| xunit.runner.visualstudio ⁴ | 2.8.2 | Apache-2.0 | UnitTests | сайт |
NuGet — транзитивные зависимости
Приезжают вместе с прямыми, версии зафиксированы lock-файлами. 97 строк: один пакет может встречаться дважды, если в разных проектах граф зависимостей разрешает разные версии.
| Пакет | Версия | Лицензия | Ссылка |
|---|---|---|---|
| BouncyCastle.Cryptography | 2.6.2 | MIT | сайт |
| ClosedXML.Parser | 1.2.0 | MIT | сайт |
| DocumentFormat.OpenXml | 3.1.1 | MIT | сайт |
| DocumentFormat.OpenXml.Framework | 3.1.1 | MIT | сайт |
| ExcelNumberFormat | 1.1.0 | MIT | сайт |
| Humanizer.Core | 2.14.1 | MIT | сайт |
| Magick.NET.Core | 14.16.0 | Apache-2.0 | сайт |
| Microsoft.AspNetCore.Mvc.Razor.Extensions | 6.0.0 | MIT | сайт |
| Microsoft.AspNetCore.Razor.Language | 6.0.0 | MIT | сайт |
| Microsoft.Bcl.AsyncInterfaces | 7.0.0 | MIT | сайт |
| Microsoft.Bcl.Cryptography | 10.0.2 | MIT | сайт |
| Microsoft.Build.Framework | 17.8.43 | MIT | сайт |
| Microsoft.Build.Locator | 1.7.8 | MIT | сайт |
| Microsoft.CodeAnalysis.Analyzers | 3.3.2 | Apache-2.0 | сайт |
| Microsoft.CodeAnalysis.Analyzers | 3.3.4 | MIT | сайт |
| Microsoft.CodeAnalysis.Common | 4.0.0 | MIT | сайт |
| Microsoft.CodeAnalysis.Common | 4.8.0 | MIT | сайт |
| Microsoft.CodeAnalysis.CSharp | 4.0.0 | MIT | сайт |
| Microsoft.CodeAnalysis.CSharp | 4.8.0 | MIT | сайт |
| Microsoft.CodeAnalysis.CSharp.Workspaces | 4.8.0 | MIT | сайт |
| Microsoft.CodeAnalysis.Razor | 6.0.0 | MIT | сайт |
| Microsoft.CodeAnalysis.Workspaces.Common | 4.8.0 | MIT | сайт |
| Microsoft.CodeAnalysis.Workspaces.MSBuild | 4.8.0 | MIT | сайт |
| Microsoft.CodeCoverage | 17.14.1 | MIT | сайт |
| Microsoft.EntityFrameworkCore.Abstractions | 9.0.17 | MIT | сайт |
| Microsoft.EntityFrameworkCore.Analyzers | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.Caching.Abstractions | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.Caching.Memory | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.Configuration.Abstractions | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.DependencyInjection | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.DependencyInjection.Abstractions | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.DependencyModel | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.DependencyModel | 9.0.18 | MIT | сайт |
| Microsoft.Extensions.Logging | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.Logging.Abstractions | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.Options | 9.0.17 | MIT | сайт |
| Microsoft.Extensions.Primitives | 9.0.17 | MIT | сайт |
| Microsoft.IdentityModel.Abstractions | 8.19.1 | MIT | сайт |
| Microsoft.IdentityModel.Abstractions | 8.19.2 | MIT | сайт |
| Microsoft.IdentityModel.JsonWebTokens | 8.19.2 | MIT | сайт |
| Microsoft.IdentityModel.Logging | 8.19.1 | MIT | сайт |
| Microsoft.IdentityModel.Logging | 8.19.2 | MIT | сайт |
| Microsoft.IdentityModel.Protocols | 8.19.2 | MIT | сайт |
| Microsoft.IdentityModel.Protocols.OpenIdConnect | 8.19.2 | MIT | сайт |
| Microsoft.IdentityModel.Tokens | 8.19.1 | MIT | сайт |
| Microsoft.IdentityModel.Tokens | 8.19.2 | MIT | сайт |
| Microsoft.NETCore.Platforms | 2.1.2 | MIT ¹ | сайт |
| Microsoft.TestPlatform.ObjectModel | 17.14.1 | MIT | сайт |
| Microsoft.TestPlatform.TestHost | 17.14.1 | MIT | сайт |
| MimeKit | 4.17.0 | MIT | сайт |
| Mono.TextTemplating | 3.0.0 | MIT | сайт |
| NetVips.Native.linux-arm | 8.18.4 | LGPL-3.0-or-later | сайт |
| NetVips.Native.linux-arm64 | 8.18.4 | LGPL-3.0-or-later | сайт |
| NetVips.Native.linux-musl-arm64 | 8.18.4 | LGPL-3.0-or-later | сайт |
| NetVips.Native.linux-musl-x64 | 8.18.4 | LGPL-3.0-or-later | сайт |
| NetVips.Native.linux-x64 | 8.18.4 | LGPL-3.0-or-later | сайт |
| NetVips.Native.osx-arm64 | 8.18.4 | LGPL-3.0-or-later | сайт |
| NetVips.Native.osx-x64 | 8.18.4 | LGPL-3.0-or-later | сайт |
| NetVips.Native.win-arm64 | 8.18.4 | LGPL-3.0-or-later | сайт |
| NetVips.Native.win-x64 | 8.18.4 | LGPL-3.0-or-later | сайт |
| NetVips.Native.win-x86 | 8.18.4 | LGPL-3.0-or-later | сайт |
| Newtonsoft.Json | 13.0.3 | MIT | сайт |
| Npgsql | 9.0.3 | PostgreSQL | сайт |
| PDFsharp | 6.2.4 | MIT | сайт |
| RBush | 4.0.0 | MIT | лицензия |
| SixLabors.Fonts | 1.0.0 | Apache-2.0 ² | сайт |
| System.CodeDom | 6.0.0 | MIT | сайт |
| System.Collections.Immutable | 5.0.0 | MIT | сайт |
| System.Collections.Immutable | 7.0.0 | MIT | сайт |
| System.Collections.Immutable | 8.0.0 | MIT | сайт |
| System.Composition | 7.0.0 | MIT | сайт |
| System.Composition.AttributedModel | 7.0.0 | MIT | сайт |
| System.Composition.Convention | 7.0.0 | MIT | сайт |
| System.Composition.Hosting | 7.0.0 | MIT | сайт |
| System.Composition.Runtime | 7.0.0 | MIT | сайт |
| System.Composition.TypedParts | 7.0.0 | MIT | сайт |
| System.Formats.Asn1 | 8.0.1 | MIT | сайт |
| System.IdentityModel.Tokens.Jwt | 8.19.2 | MIT | сайт |
| System.IO.Packaging | 8.0.1 | MIT | сайт |
| System.IO.Pipelines | 7.0.0 | MIT | сайт |
| System.Memory | 4.5.4 | MIT ¹ | сайт |
| System.Reflection.Metadata | 5.0.0 | MIT | сайт |
| System.Reflection.Metadata | 7.0.0 | MIT | сайт |
| System.Reflection.Metadata | 8.0.0 | MIT | сайт |
| System.Runtime.CompilerServices.Unsafe | 5.0.0 | MIT | сайт |
| System.Runtime.CompilerServices.Unsafe | 6.0.0 | MIT | сайт |
| System.Security.Cryptography.Pkcs | 8.0.1 | MIT | сайт |
| System.Text.Encoding.CodePages | 4.5.1 | MIT ¹ | сайт |
| System.Text.Json | 9.0.17 | MIT | сайт |
| System.Threading.Channels | 7.0.0 | MIT | сайт |
| System.Threading.Tasks.Extensions | 4.5.4 | MIT ¹ | сайт |
| xunit.abstractions | 2.0.3 | Apache-2.0 ² | сайт |
| xunit.analyzers | 1.18.0 | Apache-2.0 | лицензия |
| xunit.assert | 2.9.3 | Apache-2.0 | лицензия |
| xunit.core | 2.9.3 | Apache-2.0 | лицензия |
| xunit.extensibility.core | 2.9.3 | Apache-2.0 | лицензия |
| xunit.extensibility.execution | 2.9.3 | Apache-2.0 | лицензия |
Сноски к таблицам NuGet
¹ Поля license в .nuspec нет — это пакеты старого формата, у них указан только
licenseUrl (https://github.com/dotnet/corefx/blob/master/LICENSE.TXT). Лицензия определена
по файлу LICENSE.TXT внутри самого пакета: у всех четырёх это MIT
(«The MIT License (MIT), Copyright (c) .NET Foundation and Contributors»), файлы побайтово
одинаковы — SHA-256 D7A68596AB69B06F….
² У xunit.abstractions 2.0.3 поля license тоже нет, в licenseUrl — файл лицензии
проекта xUnit. Взята Apache-2.0: все остальные пакеты xUnit того же семейства объявляют
Apache-2.0 явным выражением. Единственная строка перечня, где лицензия определена не по
содержимому пакета, — при подаче проверить по актуальному тексту на сайте проекта.
³ Пришёл на замену QuestPDF. До 2026-08-06 PDF-счёт печатала QuestPDF 2024.12.3
с условной лицензией: MIT бесплатно, только пока годовая выручка меньше 1 млн $, иначе
платная Professional или Enterprise (в .nuspec не выражение SPDX, а файл PackageLicense.md
внутри пакета). PDFsharp и MigraDoc объявляют MIT выражением SPDX, без условий и без нативных
бинарников. Условных лицензий в перечне не осталось.
⁴ Только сборка и тесты, в дистрибутив не попадает. Microsoft.EntityFrameworkCore.Design
подключён с PrivateAssets=all и нужен для генерации миграций; Microsoft.NET.Test.Sdk,
xunit и xunit.runner.visualstudio — юнит-тесты. Вместе с ними в перечень транзитивных
попали их зависимости (Microsoft.CodeAnalysis.*, Microsoft.Build.*, Microsoft.TestPlatform.*,
Microsoft.CodeCoverage, Mono.TextTemplating, System.Composition.*, Humanizer.Core,
xunit.*) — в поставляемом артефакте их тоже нет.
⁵ Тот же пакет встречается и в транзитивной таблице другой версией. В *.csproj записано
Microsoft.IdentityModel.JsonWebTokens 8.19.1 и System.Security.Cryptography.Pkcs 9.0.18,
но в проектах, где их не подключают напрямую, версию поднимают чужие зависимости: JwtBearer
9.0.18 тянет Microsoft.IdentityModel.* 8.19.2, а MailKit → MimeKit тянет Pkcs 8.0.1.
Это штатное разрешение графа, а не рассинхрон: в каждом проекте версия одна и зафиксирована
lock-файлом.
npm — прямые production-зависимости
Только dependencies трёх фронтендов; версия — фактическая из package-lock.json
(файлы лежат в git, то есть npm-сборка тоже воспроизводима).
| Пакет | Версия | Лицензия | Где |
|---|---|---|---|
| @uiw/react-md-editor | 4.1.1 | MIT | админка |
| bootstrap-icons | 1.13.1 | MIT | мини-апп, админка |
| class-variance-authority | 0.7.1 | Apache-2.0 | админка, панель CP |
| clsx | 2.1.1 | MIT | админка, панель CP |
| dompurify | 3.4.11 | MPL-2.0 или Apache-2.0 (на выбор) | мини-апп |
| lucide-react | 1.21.0 | ISC | админка |
| lucide-react | 1.22.0 | ISC | панель CP |
| marked | 18.0.5 | MIT | мини-апп |
| react | 19.2.7 | MIT | мини-апп, админка, панель CP |
| react-dom | 19.2.7 | MIT | мини-апп, админка, панель CP |
| tailwind-merge | 3.6.0 | MIT | админка, панель CP |
Граница перечня названа честно: транзитивные npm-зависимости сюда не вошли — это тысячи строк, и собирать их имеет смысл инструментом (например,
license-checker) ближе к подаче, а не руками. Сборочные зависимости (devDependencies: Vite, TypeScript, Tailwind) в поставку не попадают и в перечень не включены.