Перейти к содержимому

Миграция из SharePoint

Инструмент portal-sp-migrate переносит списки, библиотеки, вложения и права из SharePoint Online или On-Premises в Portal. В дистрибутиве — один бинарник: веб-мастер и CLI.

  1. Установите Portal и войдите как portal_admin.
  2. На машине, которая видит и SharePoint, и Portal, возьмите portal-sp-migrate из дистрибутива.
  3. Запустите мастер:
Окно терминала
./portal-sp-migrate ui
  1. Откройте в браузере http://127.0.0.1:5088.
  2. Пройдите шаги: Источник → Portal → Область → План → Запуск → Итог.

Шаг «Источник»: SharePoint Online

Шаг «Portal»: URL и учётная запись

Источник On-Premises

По умолчанию UI слушает только localhost. Если открываете с другой машины: --host 0.0.0.0 --token СЕКРЕТ.

Инструмент — удалённый клиент, а не служба SharePoint и не модуль Portal.

ВопросОтвет
На сервере SharePoint?Нет
На сервере Portal?Не обязательно (часто хуже: у API может не быть маршрута до On-Prem SP)
Где правильно?Любая машина с доступом к SharePoint и Portal: ноутбук, jump-host, VPN
  • OnlineHTTPS до Microsoft 365 и до Portal
  • On-Premises — сеть/VPN до фермы SharePoint и до Portal
  • Portal с учётной записью portal_admin
  • SharePoint Online: App Registration с Graph Sites.Read.All, Files.Read.All и SharePoint Sites.Read.All (для вложений)
  • SharePoint On-Premises: NTLM-учётная запись с доступом к site collection
  • Рекомендуется предварительно синхронизировать пользователей AD (ad-sync)
КаналПуть
Native Linuxopt/portal/bin/portal-sp-migrate
Native Windowsopt/portal/bin/portal-sp-migrate.exe
Docker bundletools/portal-sp-migrate + sharepoint-migrate-config/

В дистрибутиве — готовый бинарник и примеры конфигов. Собирать инструмент из исходников клиенту не нужно.

Окно терминала
./portal-sp-migrate ui
# http://127.0.0.1:5088

Мастер: источник → Portal → область (Discover) → план → запуск. Сессии и state лежат в ./migration-jobs/.

Окно терминала
cp sharepoint-migrate-config/migration.example.yaml migration.yaml
# отредактируйте migration.yaml
./portal-sp-migrate discover -c migration.yaml
./portal-sp-migrate plan -c migration.yaml
./portal-sp-migrate run -c migration.yaml
КомандаОписание
uiЛокальный веб-мастер (--host, --port, --token, --jobs-dir, --no-browser)
discover -c FILEИнвентаризация источника, JSON-отчёт
plan -c FILEDry-run: подсчёт объектов без записи
run -c FILEПолная миграция
run -c FILE --phase itemsОдна фаза (nodes, schemas, items, attachments, folders, files, lookups, permissions, verify)
resume -c FILEПродолжить с checkpoint (SQLite state)
status -c FILEПрогресс и ошибки
source:
type: graph
siteUrl: https://contoso.sharepoint.com/sites/hr
tenantId: "..."
clientId: "..."
clientSecret: "..."
# deviceCode: true # только CLI; в UI — client secret
target:
portalUrl: https://portal.local
username: admin
password: "..."
authType: local
parentNodeId: null # null = корень Portal
scope:
includeSubsites: true
includeLists: [] # пусто = все списки
excludeLibraries:
- Form Templates
migratePermissions: true
principalMap:
"CONTOSO\\hr-managers": "portal-group-uuid"
"ivanov@company.local": "portal-user-uuid"
options:
batchSize: 100
uploadConcurrency: 4
stateFile: ./migration-state.db
logFile: ./migration.log
source:
type: onprem
siteUrl: https://sp.contoso.local/sites/hr
auth: ntlm
username: CONTOSO\\sp_admin
password: "..."
domain: CONTOSO

Полный пример On-Prem: файл migration.onprem.example.yaml в каталоге sharepoint-migrate-config/ дистрибутива (рядом с примером для Online).

  1. nodes — subsites SharePoint → узлы Portal
  2. schemas — списки, библиотеки, поля
  3. items — элементы списков (батчи через quick-edit)
  4. attachments — вложения элементов списков
  5. folders — папки в библиотеках
  6. files — файлы (параллельная загрузка)
  7. lookups — lookup- и person-поля
  8. permissions — ACL (если migratePermissions: true)
  9. verify — сравнение counts

Состояние в SQLite (options.stateFile / каталог job в UI). Повторный run / resume пропускает уже замапленные объекты.

Включите migratePermissions в мастере или в YAML. Инструмент читает role assignments из SharePoint, резолвит principal через principalMap и API search, затем вызывает POST /api/v1/permissions.

Поля lookup/person пропускаются в фазе items и заполняются в lookups. Нужны AD-sync и principalMap.

Фаза attachments после items:

  • On-Premises — CSOM AttachmentFiles
  • Online — SharePoint REST (Graph не отдаёт содержимое вложений)
  • Идемпотентность через state; параллелизм — uploadConcurrency
  • UUID и item_number назначает Portal — маппинг в state
  • Graph Online: list-level ACL не мигрируется (только site/web)
  • Версии файлов — вне текущей версии
  • Calculated fields, Managed Metadata — пропускаются
  • Modern Site Pages / WebParts — вне scope

Таблица маппинга полей: sharepoint-field-mapping.md.

ПроблемаРешение
401 при login в PortalПроверьте логин/пароль, используйте portal_admin
Graph throttlingУменьшите batchSize / uploadConcurrency, затем resume
On-Prem auth failedПроверьте domain, формат DOMAIN\\user
Lookup/person пустыеAD-sync до миграции, principalMap
Вложения Online: 401/403SharePoint permission Sites.Read.All у приложения
UI без стилей / 404 на /Рядом с бинарником должен быть каталог wwwroot/
Дубли при повторном runНормально — state пропускает импортированное