Установка расширений без перезапуска
Одно из удобств платформы Portal: установка и обновление расширений не требуют перезапуска веб-сервера (nginx, IIS) и не останавливают работу портала для пользователей.
В классическом SharePoint on-premises развёртывание farm solutions (WSP) и обновление сборок в GAC часто приводят к recycle app pool или iisreset — кратковременному простою. В Portal расширения подключаются горячей перезагрузкой DLL в уже работающих процессах.
Граница доверия: пакеты ставит только portal admin. DLL выполняется в процессе API/Worker (не в отдельном sandbox). Пути в ZIP проверяются против zip-slip; код от admin по-прежнему имеет полный доступ к процессу.
Что можно обновлять без рестарта
Заголовок раздела «Что можно обновлять без рестарта»| Тип расширения | Пакет | Где выполняется | Механизм |
|---|---|---|---|
| WebPart | .portalpart | Portal.Api | Выгрузка и загрузка DLL в памяти API (AssemblyLoadContext) |
| Event Receiver | .portalevent | Portal.Worker | Сигнал через Valkey → перезагрузка обработчиков |
| Timer Job | .portaltimer | Portal.Worker | Тот же сигнал через Valkey |
Не перезапускаются: nginx / IIS, контейнер api, контейнер worker, службы portal-api и portal-worker.
WebPart
Заголовок раздела «WebPart»- Администратор загружает
.portalpartв Админка → WebPart (илиPOST /api/v1/webparts/packages). - При переустановке пакета с тем же
idвmanifest.jsonстарая DLL выгружается из памяти API, новая регистрируется в каталоге. - Новый код подхватывается при следующем рендере или action-запросе WebPart.
- CSS и JS версионируются в URL (
?v=1.0.2) — после обновления пользователю может понадобиться жёсткое обновление страницы в браузере (Cmd+Shift+R/Ctrl+Shift+R).
Подробнее: Сборка и обновление WebPart.
Event Receiver и Timer Job
Заголовок раздела «Event Receiver и Timer Job»- API сохраняет пакет в объектное хранилище (S3) и публикует сигнал в Valkey на канал
portal:event-handlers:reload. - Worker подписан на этот канал и перезагружает DLL Event Receiver и Timer Job без
docker compose restart worker. - Если Valkey временно недоступен, Worker подхватит изменения при следующем опросе очереди (интервал по умолчанию ~5 с).
Подробнее:
Админка → загрузка пакета (.portalpart / .portalevent / .portaltimer) ↓ PostgreSQL + S3 (метаданные и файлы пакета) ↓ ┌─────────────────────────────────────────────────────┐ │ WebPart → API: unload/load DLL in-process │ │ Event Receiver → Valkey signal → Worker reload DLL │ │ Timer Job → Valkey signal → Worker reload DLL │ └─────────────────────────────────────────────────────┘ ↓ Пользователи продолжают работу без простояКогда перезапуск всё же нужен
Заголовок раздела «Когда перезапуск всё же нужен»Рестарт служб или контейнеров требуется не при установке расширений, а при других операциях:
- обновление платформы Portal (новая версия API/Worker);
- смена переменных в
.envили конфигурации; - миграции схемы БД (
db-init); - ручной рестарт по регламенту обслуживания.
См. Установка и Troubleshooting.
Сравнение с SharePoint
Заголовок раздела «Сравнение с SharePoint»| SharePoint (on-prem, farm solutions) | Portal | |
|---|---|---|
| WebPart / WSP | Часто recycle app pool | Hot-reload DLL в API |
| Event Receiver / Timer Job | Зависит от типа решения | Reload DLL в Worker |
| nginx / IIS | Может затрагиваться | Не перезапускается |
| Простой для пользователей | Возможен при деплое | Не требуется при установке пакетов |