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

Миграция из SharePoint

Эта инструкция для администратора, которому нужно перенести списки, библиотеки, файлы и права из SharePoint в Portal.

В дистрибутиве Portal есть программа portal-sp-migrate: у неё два режима — веб-мастер (рекомендуется) и команды в терминале. Собирать программу из исходников не нужно — берите готовый файл из поставки.

Читайте сверху вниз. На каждом шаге — что сделать и что должно появиться на экране.


После успешной миграции:

  1. Подсайты SharePoint станут узлами Portal.
  2. Списки и библиотеки появятся с полями и данными.
  3. Файлы и вложения будут в библиотеках / у элементов.
  4. При включённом переносе прав — сотрудники получат доступ по сопоставлению групп/пользователей.

Таблица «какой тип поля куда попадает»: Маппинг полей.


Программа — отдельный клиент на вашем компьютере (или jump-хосте). Это не служба SharePoint и не модуль внутри Portal.

ВопросОтвет
Ставить на сервер SharePoint?Нет
Обязательно на сервер Portal?Нет (иногда даже хуже: с сервера Portal может не быть сети до старого SharePoint)
Где правильно?Любая машина, которая видит и SharePoint, и Portal (ноутбук админа, VPN, jump-host)
  • SharePoint Online — нужен доступ в интернет к Microsoft 365 и до вашего Portal.
  • SharePoint на своих серверах (On-Premises) — нужна сеть/VPN до фермы SharePoint и до Portal.

ЧтоЗачем
Установленный PortalКуда переносим данные
Учётка администратора порталаПрограмма входит в Portal от её имени
Доступ к сайту SharePointЧтение списков и файлов
Синхронизация пользователей из AD (служба ad-sync), если пользуетесь доменомЧтобы люди и группы нашлись в Portal при переносе прав и полей «сотрудник»
Бинарник portal-sp-migrate из дистрибутиваСам инструмент
Как установлен PortalПуть
Native Linuxopt/portal/bin/portal-sp-migrate
Native Windowsopt/portal/bin/portal-sp-migrate.exe
Docker-бандлtools/portal-sp-migrate (+ примеры в sharepoint-migrate-config/)

Рядом с программой должен быть каталог wwwroot/ — без него веб-мастер откроется «без стилей» или с ошибкой.

Обычно заводят приложение в каталоге Microsoft (App Registration) с правами на чтение сайтов и файлов. Это делает администратор Microsoft 365 / Entra ID.
В мастере понадобятся: адрес сайта, идентификаторы приложения и секрет.

Учётная запись Windows (NTLM) с доступом к нужной коллекции сайтов. Формат логина часто ДОМЕН\пользователь.


На машине с доступом к SharePoint и Portal откройте терминал в каталоге с программой:

Окно терминала
./portal-sp-migrate ui

На Windows — portal-sp-migrate.exe ui.

Адрес по умолчанию: http://127.0.0.1:5088.

Браузер может открыться сам. Если нет — вставьте адрес вручную.

По умолчанию мастер слушает только этот компьютер. Если открываете с другой машины:

Окно терминала
./portal-sp-migrate ui --host 0.0.0.0 --token СЕКРЕТНАЯ_СТРОКА

Токен нужно будет ввести при входе в мастер.

На экране порядок примерно такой:

  1. Источник — SharePoint Online или On-Premises, адрес сайта, учётные данные.
  2. Portal — адрес вашего Portal, логин и пароль администратора. Родительский узел выбирается из списка: кнопка Загрузить узлы показывает дерево, дочерние узлы сдвинуты под родителя. Пункт Корень портала кладёт сайт SharePoint на верхний уровень.
  3. Область — какие сайты/списки включать (инвентаризация).
  4. План — сколько объектов будет перенесено (без записи или с подтверждением — по экрану мастера).
  5. Запуск — сам перенос; можно смотреть прогресс.
  6. Итог — отчёт: что перенесено, где ошибки.

Файлы заданий мастер кладёт в каталог ./migration-jobs/ рядом с программой.

Шаг 3.4. Вернуться к незаконченному переносу

Заголовок раздела «Шаг 3.4. Вернуться к незаконченному переносу»

Если закрыли страницу, мастер перестал отвечать, SharePoint или Portal не ответили, или перезагрузился компьютер, уже перенесённые объекты остаются в задании. На шаге Источник мастер сам показывает блок Незаконченные переносы: сайт, адрес Portal, последний этап и сколько объектов уже записано.

Кнопка Вернуться открывает это же задание на шаге Запуск. Поля и пароли заново вводить не нужно. Дальше нажмите Продолжить: программа проходит этапы снова и пропускает то, что уже есть в файле состояния.

Задание пропадает из списка, когда этап проверки завершился успешно. Из терминала то же самое делает resume (раздел 4).

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

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

Источник On-Premises


Если мастер неудобен (автоматизация, сервер без GUI):

  1. Скопируйте пример конфига:
Окно терминала
cp sharepoint-migrate-config/migration.example.yaml migration.yaml
  1. Откройте migration.yaml в редакторе: адрес SharePoint, Portal, логины, что включать.
  2. Выполните по порядку:
Окно терминала
./portal-sp-migrate discover -c migration.yaml # что есть в источнике
./portal-sp-migrate plan -c migration.yaml # подсчёт без записи
./portal-sp-migrate run -c migration.yaml # перенос

Если перенос прервался:

Окно терминала
./portal-sp-migrate resume -c migration.yaml
./portal-sp-migrate status -c migration.yaml
КомандаЗачем
uiВеб-мастер
discoverИнвентаризация источника
planПлан без записи в Portal
runПолный перенос
run --phase …Только один этап (см. ниже)
resumeПродолжить с места остановки
statusПрогресс и ошибки

Программа идёт по этапам. Повторный запуск не дублирует уже перенесённое (состояние хранится в файле задания).

Повторный запуск этапа files дописывает историю уже скопированным файлам, если в Portal ещё нет своих версий. Если файл уже правили в Portal, старые версии SharePoint не подмешиваются.

ЭтапПростыми словами
nodesПодсайты → узлы Portal
schemasСписки, библиотеки, поля (в т.ч. колонки библиотек документов)
itemsСтроки списков
attachmentsФайлы, прикреплённые к элементам списка
foldersПапки в библиотеках + значения простых полей
filesФайлы библиотек, простые поля и предыдущие версии (содержимое и дата). Комментарий к версии переносится с On-Prem. Автор версии в Portal — учётка, под которой шла миграция
lookupsПоля «подстановка» и «сотрудник» у элементов и у файлов/папок (вторым проходом)
permissionsПрава (если включили перенос прав)
verifyСверка количества объектов

  1. В мастере или в YAML включите перенос прав (migratePermissions), если права нужны.
  2. Пользователи и группы сопоставляются автоматически: логин, почта и точное имя группы в Portal. Карта principalMap нужна только как исключение, если имя в Portal другое. Подстрока в названии группы не подходит: «HR» не станет «HR Owners».
  3. Группы Active Directory при переносе не создаются. Если такой группы нет в Portal, в конце этапа permissions появляется отчёт на русском: какие группы не найдены и что их нужно импортировать из AD (ad-sync), затем повторить этап permissions. Права с этими группами не назначаются, повторный запуск их дописывает.
  4. Локальные группы SharePoint, которых нет в Portal, мастер спрашивает во время этапа прав. Если подтвердить, программа создаёт группы и добавляет в них тот же состав пользователей, но только тех, у кого в Portal есть действующая учётная запись. В консоли без интерактивного ввода группы не создаются: в отчёте будет список и подсказка повторить этап. Чтобы создать их без вопроса, в YAML укажите createLocalGroups: true.
  5. Поля «сотрудник» и «подстановка» заполняются на этапе lookups — после того, как основные данные уже на месте. Это касается и колонок библиотек документов. Если список на одном дочернем сайте ссылается на список другого сайта, целевой список переносится раньше. План показывает этот порядок по-русски. Пользователь ищется по логину и почте. Если учётки нет в Portal, поле может остаться пустым — сначала нужен ad-sync.
  6. Если у списка или библиотеки в SharePoint свои права (наследование от сайта отключено), Portal тоже отключает наследование от узла и переносит только эти назначения. Списки, которые наследуют сайт, в Portal продолжают наследовать узел. Для SharePoint Online приложению нужно право читать RoleAssignments (обычно Sites.FullControl.All на SharePoint, не только Graph).
  7. Папка или файл библиотеки переносится так же, как в SharePoint. Если у объекта свои права, Portal отключает наследование от родителя и записывает этот набор. Если наследование не отключали, папка или файл в Portal наследует родителя: файл — папку, папка — библиотеку или родительскую папку.
  8. Элемент обычного списка переносится так же. Если у элемента свои права и он не наследует список, Portal отключает наследование и записывает этот набор. Если элемент наследует список, в Portal он тоже наследует список. Вложение отдельных прав не получает: оно наследует элемент. Свой набор прав у файла вложения в SharePoint в Portal не копируется.

Вычисляемые колонки переносятся. Узкий набор формул SharePoint становится живым выражением Portal и пересчитывается при сохранении элемента. Если формула шире этого набора, колонка всё равно создаётся: в элементы пишется уже посчитанное значение, а исходный текст формулы сохраняется в настройках поля и сам не считается.

Не переноситсяКомментарий
Workflows, типы содержимого, управляемые метаданныеВне текущей версии
Современные страницы сайта и веб-части SharePointВне объёма миграции

Подробный маппинг типов полей: sharepoint-field-mapping.md.


Что видитеЧто сделать
Ошибка входа в Portal (401)Проверьте логин/пароль; нужна учётка администратора портала
Облако «тормозит» / отказы MicrosoftУменьшите размер пакета и число параллельных загрузок в настройках, затем resume
On-Prem: ошибка входаПроверьте домен и формат ДОМЕН\пользователь
Пустые поля «сотрудник» / подстановкаСначала AD-sync, затем снова этап lookups. principalMap — только если логин в Portal другой
В отчёте «не найдены группы Active Directory»Импортируйте эти группы службой ad-sync и повторите этап permissions
Вопрос про локальные группы SharePointПодтвердите создание в мастере: в группы попадут действующие пользователи Portal
Вложения Online: отказ доступаУ приложения в Microsoft должны быть права на чтение SharePoint
Мастер без оформления / 404Рядом с программой должен быть каталог wwwroot/
Повторный запуск «ещё раз всё копирует»Обычно нет: уже перенесённое пропускается по файлу состояния
Мастер, SharePoint, Portal или компьютер прервали работуНа шаге «Источник» нажмите Вернуться у этого задания, затем Продолжить. Пароли вводить заново не нужно
Библиотеки без колонок после старой миграцииЗапустите run --phase schemas, затем folders, files, lookups — схема и значения колонок допишутся

source:
type: graph
siteUrl: https://contoso.sharepoint.com/sites/hr
tenantId: "..."
clientId: "..."
clientSecret: "..."
target:
portalUrl: https://portal.example.com
username: admin
password: "..."
authType: local
parentNodeId: null # null = корень Portal
scope:
includeSubsites: true
includeLists: [] # пусто = все списки
excludeLibraries:
- Form Templates
migratePermissions: true
# createLocalGroups: true # создать локальные группы SharePoint без вопроса в мастере
# principalMap нужен только если имя в Portal не совпадает с SharePoint
# principalMap:
# "CONTOSO\\hr-managers": "portal-group-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

Полные примеры лежат в sharepoint-migrate-config/ дистрибутива.