5 филиалов и 5 версий одного файла: DFS-репликация для логистической компании

Задача клиента: логистическая компания, где каждый филиал жил своей жизнью

В марте 2026 года к нам в АйТи Фреш обратилась логистическая компания РосЛогистик из Самары. Ребята управляют грузоперевозками по всей России — головной офис в Самаре плюс четыре филиала: Казань, Нижний Новгород, Пермь и Уфа. Итого 180 сотрудников, раскиданных по половине страны.

Боль, с которой они пришли, — классика для распределённых компаний. В каждом филиале жила своя версия одних и тех же документов. Накладные, маршрутные листы, договоры редактировались локально, а «синхронизация» происходила по электронной почте. Итог предсказуемый: диспетчер в Казани строил маршрут по прайсу двухнедельной давности, бухгалтерия в Самаре месяцами не видела актов из Перми.

«Мы потеряли крупный контракт: клиенту отправили коммерческое предложение с прошлогодними тарифами. Казанский филиал работал со старым файлом, который кто-то забыл обновить. Это стало последней каплей» — коммерческий директор РосЛогистик.

Задача от руководства звучала чётко: единое файловое пространство для всех пяти точек, автоматическая синхронизация без участия людей, сохранение работоспособности при обрыве связи между офисами — и чтобы пользователи вообще не заметили, что что-то поменялось.

Аудит файловой инфраструктуры

Прежде чем предлагать решение, мы объехали каждый филиал и собрали реальную картину. Она оказалась, мягко говоря, пёстрой:

  • Самара (головной) — Windows Server 2022, файловый сервер с общими папками, 850 ГБ данных, Active Directory
  • Казань — Windows Server 2019, локальный файловый сервер, 320 ГБ данных, присоединён к домену через site-to-site VPN
  • Нижний Новгород — Windows Server 2019, аналогично Казани, 280 ГБ
  • Пермь — NAS Synology DS920+, не в домене, 200 ГБ данных
  • Уфа — общие папки на рабочей станции Windows 11 Pro (!!!), 150 ГБ

Связь между офисами — site-to-site VPN на MikroTik, полоса от 20 до 50 Мбит/с в зависимости от направления. Проблемы вырисовывались сами собой:

  • Нет единого пространства имён — пользователи подключают сетевые диски вручную по IP-адресам
  • Нет автоматической репликации — файлы копируются вручную или через почту
  • Конфликты версий — два человека редактируют один файл, побеждает «последний сохранивший»
  • Пермь и Уфа — вне домена, нет централизованного управления

Проектирование решения на DFS

Выбор пал на связку DFS Namespaces + DFS Replication (DFSR) — компоненты, встроенные прямо в Windows Server, без доплат за лицензии. Почему не облако или сторонние решения? Сравнили варианты — DFS выиграл по совокупности факторов:

РешениеПлатформаЛицензияИнтеграция с ADOffline-доступ
DFS Namespaces + DFSRWindows ServerВключено в ОСНативнаяЧерез Offline Files
Nextcloud + syncLinux/WindowsБесплатноЧерез LDAPКлиент синхронизации
SyncthingКроссплатформенноБесплатноНетДа
Azure File SyncГибридПодписка AzureЧерез Azure ADДа

Нативная интеграция с Active Directory, ноль дополнительных затрат и полная прозрачность для сотрудников. Люди работают с привычным UNC-путём \\roslogistic.local\shared и даже не подозревают, с какого именно сервера в данный момент получают файл. Это принципиально важно, когда менять привычки 180 человек никто не собирается.

Архитектура получилась следующая:

# Архитектура DFS
┌─────────────────────────────────────────────────────┐
│     DFS Namespace: \\roslogistic.local\shared       │
│     (Domain-based, Windows Server mode)              │
└───────────┬──────────────┬──────────────┬───────────┘
            │              │              │
     ┌──────▼──────┐ ┌────▼──────┐ ┌─────▼─────┐
     │  Самара     │ │  Казань   │ │  Н.Новгород│
     │  DC01-SAM   │ │  FS-KAZ   │ │  FS-NNO   │
     │  (Hub)      │ │  (Spoke)  │ │  (Spoke)  │
     └──────┬──────┘ └───────────┘ └───────────┘
            │
     ┌──────▼──────┐ ┌────────────┐
     │  Пермь     │ │  Уфа       │
     │  FS-PRM    │ │  FS-UFA    │
     │  (Spoke)   │ │  (Spoke)   │
     └────────────┘ └────────────┘

  Топология: Hub-and-Spoke (Самара — центр)

Подготовка серверов и Active Directory

Перед разворачиванием DFS пришлось навести порядок в инфраструктуре. Все файловые серверы должны быть членами домена с установленной ролью DFS — без исключений. А у нас два филиала вообще вне домена жили.

Ввод Перми и Уфы в домен

Пермь и Уфа потребовали отдельной работы. В Перми Synology заменили на Windows Server 2022 Standard — подняли виртуальную машину на уже имеющемся Hyper-V хосте, железо докупать не пришлось. В Уфе история грустнее: файловый сервер на рабочей станции с Windows 11 Pro — это, конечно, не дело, поэтому развернули нормальный сервер с нуля:

# Пермь: установка Windows Server 2022 на Hyper-V
# После установки ОС — присоединение к домену
Add-Computer -DomainName roslogistic.local -Credential (Get-Credential) -Restart

# Уфа: аналогично, после установки
Add-Computer -DomainName roslogistic.local -Credential (Get-Credential) -Restart

# Проверяем, что все серверы в домене
Get-ADComputer -Filter * -SearchBase "OU=Servers,DC=roslogistic,DC=local" | Select-Object Name, DNSHostName

# Name        DNSHostName
# ----        -----------
# DC01-SAM    dc01-sam.roslogistic.local
# FS-KAZ      fs-kaz.roslogistic.local
# FS-NNO      fs-nno.roslogistic.local
# FS-PRM      fs-prm.roslogistic.local
# FS-UFA      fs-ufa.roslogistic.local

Установка роли DFS на все серверы

Роли DFS Namespaces и DFS Replication ставятся через Server Manager или PowerShell — кому как удобнее:

# На каждом файловом сервере (можно удалённо через Invoke-Command)
$servers = @('DC01-SAM','FS-KAZ','FS-NNO','FS-PRM','FS-UFA')

Invoke-Command -ComputerName $servers -ScriptBlock {
    Install-WindowsFeature -Name FS-DFS-Namespace, FS-DFS-Replication -IncludeManagementTools
    Get-WindowsFeature FS-DFS* | Format-Table Name, InstallState
}

# Результат на каждом сервере:
# Name                    InstallState
# ----                    ------------
# FS-DFS-Namespace        Installed
# FS-DFS-Replication      Installed

На каждом сервере создали единообразную структуру папок — это важно для последующей настройки репликации:

# Создаём корневую папку для DFS-данных
$servers | ForEach-Object {
    Invoke-Command -ComputerName $_ -ScriptBlock {
        New-Item -Path 'D:\DFSRoots\Shared' -ItemType Directory -Force
        New-Item -Path 'D:\DFSStaging' -ItemType Directory -Force

        # Создаём SMB-шару
        New-SmbShare -Name 'Shared' -Path 'D:\DFSRoots\Shared' -FullAccess 'ROSLOGISTIC\Domain Admins' -ChangeAccess 'ROSLOGISTIC\Domain Users'
    }
}

Настройка DFS Namespaces

DFS Namespaces — это единая точка входа \\roslogistic.local\shared, за которой прячутся физические серверы в каждом офисе. Пользователь в Казани автоматически попадает на ближайший FS-KAZ, а не тянет каждый файл из Самары через VPN-канал на 30 Мбит/с.

Создание пространства имён

# Создаём доменное пространство имён
New-DfsnRoot -TargetPath '\\DC01-SAM\Shared' -Type DomainV2 -Path '\\roslogistic.local\shared' -Description 'Общие файлы РосЛогистик'

# Добавляем целевые папки (folder targets) для каждого филиала
# Папка "Документы" — реплицируется на все серверы
New-DfsnFolder -Path '\\roslogistic.local\shared\Документы' -TargetPath '\\DC01-SAM\Shared\Документы'
New-DfsnFolderTarget -Path '\\roslogistic.local\shared\Документы' -TargetPath '\\FS-KAZ\Shared\Документы'
New-DfsnFolderTarget -Path '\\roslogistic.local\shared\Документы' -TargetPath '\\FS-NNO\Shared\Документы'
New-DfsnFolderTarget -Path '\\roslogistic.local\shared\Документы' -TargetPath '\\FS-PRM\Shared\Документы'
New-DfsnFolderTarget -Path '\\roslogistic.local\shared\Документы' -TargetPath '\\FS-UFA\Shared\Документы'

# Папка "Бухгалтерия" — только Самара и филиал, где работают бухгалтеры
New-DfsnFolder -Path '\\roslogistic.local\shared\Бухгалтерия' -TargetPath '\\DC01-SAM\Shared\Бухгалтерия'
New-DfsnFolderTarget -Path '\\roslogistic.local\shared\Бухгалтерия' -TargetPath '\\FS-KAZ\Shared\Бухгалтерия'

# Папка "Шаблоны" — реплицируется read-only на филиалы
New-DfsnFolder -Path '\\roslogistic.local\shared\Шаблоны' -TargetPath '\\DC01-SAM\Shared\Шаблоны'

# Проверяем пространство имён
Get-DfsnFolder -Path '\\roslogistic.local\shared\*' | Format-Table Path, State

# Path                                           State
# ----                                           -----
# \\roslogistic.local\shared\Документы           Online
# \\roslogistic.local\shared\Бухгалтерия         Online
# \\roslogistic.local\shared\Шаблоны             Online

Настройка referral ordering и site awareness

Чтобы клиенты всегда обращались к ближайшему серверу, настроили AD Sites and Services и порядок referral. Без этого шага DFS работает, но медленно и непредсказуемо — проверено на собственных граблях:

# AD Sites (должны быть уже настроены, если нет — создаём)
# Site: Samara — subnet 10.10.1.0/24
# Site: Kazan — subnet 10.10.2.0/24
# Site: NNovgorod — subnet 10.10.3.0/24
# Site: Perm — subnet 10.10.4.0/24
# Site: Ufa — subnet 10.10.5.0/24

New-ADReplicationSite -Name 'Samara'
New-ADReplicationSite -Name 'Kazan'
New-ADReplicationSite -Name 'NNovgorod'
New-ADReplicationSite -Name 'Perm'
New-ADReplicationSite -Name 'Ufa'

New-ADReplicationSubnet -Name '10.10.1.0/24' -Site 'Samara'
New-ADReplicationSubnet -Name '10.10.2.0/24' -Site 'Kazan'
New-ADReplicationSubnet -Name '10.10.3.0/24' -Site 'NNovgorod'
New-ADReplicationSubnet -Name '10.10.4.0/24' -Site 'Perm'
New-ADReplicationSubnet -Name '10.10.5.0/24' -Site 'Ufa'

# Настройка referral ordering — приоритет ближайшему серверу
Set-DfsnRoot -Path '\\roslogistic.local\shared' -EnableSiteCosting $true -EnableInsiteReferrals $true

# Таймаут кэша referral — 30 минут
Set-DfsnRoot -Path '\\roslogistic.local\shared' -TimeToLiveSec 1800

Теперь при обращении к \\roslogistic.local\shared\Документы клиент в Казани первым делом получит referral на FS-KAZ. Только если тот недоступен — пойдёт на серверы других сайтов. Пользователь ничего не замечает, просто работает.

Настройка DFS Replication

DFS Replication (DFSR) — это и есть та самая автоматическая синхронизация, ради которой всё затевалось. Именно он убивает проблему «пяти версий одного файла в пяти городах».

Создание группы репликации

# Создаём группу репликации для папки "Документы"
New-DfsReplicationGroup -GroupName 'RG-Documents' -Description 'Репликация общих документов' | Out-Null

# Добавляем все серверы в группу
$members = @('DC01-SAM','FS-KAZ','FS-NNO','FS-PRM','FS-UFA')
$members | ForEach-Object {
    Add-DfsrMember -GroupName 'RG-Documents' -ComputerName $_
}

# Добавляем реплицируемую папку
Add-DfsrReplicatedFolder -GroupName 'RG-Documents' -FolderName 'Документы'

# Настраиваем пути на каждом сервере
Set-DfsrMembership -GroupName 'RG-Documents' -FolderName 'Документы' -ComputerName 'DC01-SAM' -ContentPath 'D:\DFSRoots\Shared\Документы' -PrimaryMember $true -StagingPathQuotaInMB 32768
Set-DfsrMembership -GroupName 'RG-Documents' -FolderName 'Документы' -ComputerName 'FS-KAZ' -ContentPath 'D:\DFSRoots\Shared\Документы' -StagingPathQuotaInMB 16384
Set-DfsrMembership -GroupName 'RG-Documents' -FolderName 'Документы' -ComputerName 'FS-NNO' -ContentPath 'D:\DFSRoots\Shared\Документы' -StagingPathQuotaInMB 16384
Set-DfsrMembership -GroupName 'RG-Documents' -FolderName 'Документы' -ComputerName 'FS-PRM' -ContentPath 'D:\DFSRoots\Shared\Документы' -StagingPathQuotaInMB 8192
Set-DfsrMembership -GroupName 'RG-Documents' -FolderName 'Документы' -ComputerName 'FS-UFA' -ContentPath 'D:\DFSRoots\Shared\Документы' -StagingPathQuotaInMB 8192

Топология Hub-and-Spoke и bandwidth throttling

Для пяти точек выбрали топологию Hub-and-Spoke: центральный сервер в Самаре связан с каждым филиалом напрямую, филиалы между собой — нет. Проще управлять, меньше трафика на слабых каналах:

# Создаём соединения Hub-and-Spoke (Самара — центр)
$spokes = @('FS-KAZ','FS-NNO','FS-PRM','FS-UFA')

foreach ($spoke in $spokes) {
    Add-DfsrConnection -GroupName 'RG-Documents' `
        -SourceComputerName 'DC01-SAM' `
        -DestinationComputerName $spoke `
        -Description "SAM <-> $spoke"
}

# Настраиваем ограничение полосы (bandwidth throttling)
# Каналы до филиалов: Казань 50 Мбит, Н.Новгород 30 Мбит, Пермь 20 Мбит, Уфа 20 Мбит
# Ограничиваем DFSR до 50% канала в рабочее время и 90% ночью

# Расписание для FS-KAZ: рабочее время 9:00-18:00 — 25 Мбит (50%)
Set-DfsrConnectionSchedule -GroupName 'RG-Documents' `
    -SourceComputerName 'DC01-SAM' `
    -DestinationComputerName 'FS-KAZ' `
    -Day Monday,Tuesday,Wednesday,Thursday,Friday `
    -BandwidthDetail @{TimeSlotIndex=36; Bandwidth='25Mbps'}

# Ночное время 22:00-06:00 — 45 Мбит (90%)
Set-DfsrConnectionSchedule -GroupName 'RG-Documents' `
    -SourceComputerName 'DC01-SAM' `
    -DestinationComputerName 'FS-KAZ' `
    -Day Monday,Tuesday,Wednesday,Thursday,Friday `
    -BandwidthDetail @{TimeSlotIndex=88; Bandwidth='45Mbps'}

# Для Перми и Уфы — более жёсткие ограничения
Set-DfsrConnectionSchedule -GroupName 'RG-Documents' `
    -SourceComputerName 'DC01-SAM' `
    -DestinationComputerName 'FS-PRM' `
    -Day Monday,Tuesday,Wednesday,Thursday,Friday `
    -BandwidthDetail @{TimeSlotIndex=36; Bandwidth='10Mbps'}

Staging folders и оптимизация

Staging folder — промежуточное хранилище, куда DFSR складывает файлы перед отправкой партнёру. Размер staging — одна из тех настроек, которую все игнорируют, а потом удивляются, почему репликация тормозит:

# Рекомендация Microsoft: staging quota = 32 × размер крупнейших файлов
# У РосЛогистик самые крупные файлы — сканы договоров до 50 МБ
# 32 × 50 МБ = 1600 МБ — но мы ставим с запасом

# Проверяем текущие настройки staging
Get-DfsrMembership -GroupName 'RG-Documents' | Select-Object ComputerName, ContentPath, StagingPath, StagingPathQuotaInMB | Format-Table

# ComputerName  ContentPath                        StagingPath                             StagingPathQuotaInMB
# ------------  -----------                        -----------                             --------------------
# DC01-SAM      D:\DFSRoots\Shared\Документы       D:\DFSRoots\Shared\Документы\DfsrPrivate\Staging  32768
# FS-KAZ        D:\DFSRoots\Shared\Документы       D:\DFSRoots\Shared\Документы\DfsrPrivate\Staging  16384
# FS-NNO        D:\DFSRoots\Shared\Документы       D:\DFSRoots\Shared\Документы\DfsrPrivate\Staging  16384
# FS-PRM        D:\DFSRoots\Shared\Документы       D:\DFSRoots\Shared\Документы\DfsrPrivate\Staging  8192
# FS-UFA        D:\DFSRoots\Shared\Документы       D:\DFSRoots\Shared\Документы\DfsrPrivate\Staging  8192

# Перемещаем staging на отдельный диск для лучшей производительности (если есть)
# На DC01-SAM:
Set-DfsrMembership -GroupName 'RG-Documents' -FolderName 'Документы' -ComputerName 'DC01-SAM' -StagingPath 'E:\DFSStaging\Документы'

Когда staging переполняется, DFSR начинает его принудительно чистить — и скорость репликации падает в разы. Мы настроили мониторинг размера staging через SCOM, чтобы поймать проблему до того, как её заметят пользователи.

Разрешение конфликтов и GPO для Folder Redirection

Одновременное редактирование одного файла из разных филиалов — не гипотетический сценарий, а рабочая реальность. DFSR разруливает такие конфликты по принципу «последний записавший побеждает», но проигравшую версию не выбрасывает — сохраняет в специальной папке. Файл не потеряется.

Политика разрешения конфликтов

При конфликте DFSR применяет два правила — в строгом порядке:

  • Для существующих файлов — побеждает тот, у кого дата модификации свежее. Если временны́е метки совпадают, система выбирает файл с сервера с бо́льшим GUID — тай-брейкер, о котором мало кто знает заранее
  • Для новых файлов/папок с одинаковым именем — побеждает тот, кто создан раньше. Логика простая, но на практике это ловит пользователей врасплох

«Проигравшая» версия не пропадает — она уходит в папку ConflictAndDeleted:

# Проверяем квоту для конфликтных файлов
Get-DfsrMembership -GroupName 'RG-Documents' | Select-Object ComputerName, ConflictAndDeletedQuotaInMB

# По умолчанию 4096 МБ — увеличиваем на хабе
Set-DfsrMembership -GroupName 'RG-Documents' -FolderName 'Документы' -ComputerName 'DC01-SAM' -ConflictAndDeletedQuotaInMB 8192

# Скрипт для отчёта о конфликтах (запуск раз в день)
$report = Get-DfsrBacklog -GroupName 'RG-Documents' -SourceComputerName 'DC01-SAM' -DestinationComputerName 'FS-KAZ' -Verbose

# Проверяем ConflictAndDeleted на всех серверах
$members | ForEach-Object {
    $path = "\\$_\d$\DFSRoots\Shared\Документы\DfsrPrivate\ConflictAndDeleted"
    $count = (Get-ChildItem $path -ErrorAction SilentlyContinue | Measure-Object).Count
    Write-Host "$_`: $count conflicted files"
}

Чтобы конфликтов было меньше, мы ввели простое организационное правило: критические документы — договоры, прайс-листы — редактируются только в Самаре. Филиалы открывают их на чтение, доступ к записи закрыт через NTFS-права. Да, это ограничение. Зато за полгода — ни одного конфликта по этим файлам.

GPO для Folder Redirection

Чтобы рабочие папки пользователей автоматически оказывались внутри DFS, настроили перенаправление через Group Policy:

# Создаём GPO для Folder Redirection
New-GPO -Name 'DFS Folder Redirection' -Comment 'Перенаправление папок в DFS' | New-GPLink -Target 'OU=Users,DC=roslogistic,DC=local'

# Настройка через GPMC (Group Policy Management Console):
# User Configuration → Policies → Windows Settings → Folder Redirection
#
# Папка "Документы":
#   Setting: Basic - Redirect everyone's folder to the same location
#   Target folder location: Create a folder for each user under the root path
#   Root Path: \\roslogistic.local\shared\UserDocs
#   Policy Removal: Redirect the folder back to the local userprofile location
#
# Папка "Рабочий стол":
#   Root Path: \\roslogistic.local\shared\UserDesktop

# Проверяем через PowerShell
Get-GPO -Name 'DFS Folder Redirection' | Get-GPOReport -ReportType HTML -Path 'C:\temp\dfs-gpo-report.html'

# Включаем Offline Files для работы при потере связи
# Computer Configuration → Policies → Administrative Templates
# → Network → Offline Files
#   Enable Offline Files: Enabled
#   Configure slow-link mode: Enabled, Latency=80ms, Throughput=64Kbps

Мониторинг DFSR и диагностика

DFS Replication без мониторинга — это мина с отложенным взрывателем. Backlog растёт тихо, staging переполняется, конфликты копятся — и всё это до первого звонка от директора филиала «у нас ничего не синхронизируется». Мы на такое нарывались. Поэтому сделали многоуровневый мониторинг.

Утилита dfsrdiag и PowerShell-мониторинг

# Проверка бэклога репликации между серверами
Get-DfsrBacklog -GroupName 'RG-Documents' -SourceComputerName 'DC01-SAM' -DestinationComputerName 'FS-KAZ'

# Identifier                  : {A1B2C3D4-5678-9ABC-DEF0-123456789ABC}
# BacklogFileCount            : 3

# Бэклог 3 файла — нормально. Бэклог 10000+ — проблема.

# Массовая проверка бэклога
$hub = 'DC01-SAM'
$spokes = @('FS-KAZ','FS-NNO','FS-PRM','FS-UFA')

foreach ($spoke in $spokes) {
    $backlog = (Get-DfsrBacklog -GroupName 'RG-Documents' -SourceComputerName $hub -DestinationComputerName $spoke).BacklogFileCount
    $backlogReverse = (Get-DfsrBacklog -GroupName 'RG-Documents' -SourceComputerName $spoke -DestinationComputerName $hub).BacklogFileCount
    Write-Host "$hub -> ${spoke}: $backlog files | $spoke -> ${hub}: $backlogReverse files"
}

# DC01-SAM -> FS-KAZ: 3 files | FS-KAZ -> DC01-SAM: 1 files
# DC01-SAM -> FS-NNO: 0 files | FS-NNO -> DC01-SAM: 5 files
# DC01-SAM -> FS-PRM: 12 files | FS-PRM -> DC01-SAM: 0 files
# DC01-SAM -> FS-UFA: 0 files | FS-UFA -> DC01-SAM: 0 files

# Диагностика с dfsrdiag
dfsrdiag backlog /rgname:"RG-Documents" /rfname:"Документы" /sendingmember:DC01-SAM /receivingmember:FS-KAZ

# Состояние репликации
Get-DfsrState -ComputerName $hub | Format-Table FileName, UpdateState, Inbound

Автоматические DFSR Health Reports

# Генерация отчёта о здоровье DFSR
# Запуск через Task Scheduler раз в неделю
$reportPath = 'D:\Reports\DFSR'
New-Item -Path $reportPath -ItemType Directory -Force

# Health report
Write-DfsrHealthReport -GroupName 'RG-Documents' -ReferenceComputerName 'DC01-SAM' -MemberComputerName $members -Path $reportPath -CountFiles

# Propagation report
Write-DfsrPropagationReport -GroupName 'RG-Documents' -ReferenceComputerName 'DC01-SAM' -Path $reportPath -FileCount 100

# Скрипт мониторинга с отправкой алерта в Telegram
$threshold = 100  # Бэклог больше 100 — тревога

foreach ($spoke in $spokes) {
    $backlog = (Get-DfsrBacklog -GroupName 'RG-Documents' -SourceComputerName $hub -DestinationComputerName $spoke -ErrorAction SilentlyContinue).BacklogFileCount
    if ($backlog -gt $threshold) {
        $message = "⚠ DFSR Alert: Backlog $hub -> ${spoke}: $backlog files (threshold: $threshold)"
        # Отправка в Telegram
        $token = 'BOT_TOKEN'
        $chatId = '-100XXXXXXXXXX'
        $uri = "https://api.telegram.org/bot$token/sendMessage?chat_id=$chatId&text=$message"
        Invoke-RestMethod -Uri $uri -Method Post
    }
}

Резервное копирование с учётом DFS

DFSR — не замена резервному копированию. Удалили файл в одном филиале — удаление разъедется по всем нодам. Мы настроили бэкапы с учётом специфики DFS:

# Windows Server Backup на хаб-сервере (ежедневно)
wbadmin start backup -backupTarget:F: -include:D:\DFSRoots -vssFull -quiet

# Veeam Backup на каждом филиальном сервере (еженедельно)
# Важно: бэкапим только хаб (Самара) полностью, филиалы — по расписанию

# VSS snapshot перед бэкапом (не прерывает репликацию)
# DFSR автоматически приостанавливает репликацию во время VSS snapshot
# и возобновляет после его завершения

# Восстановление отдельного файла из ConflictAndDeleted
# (если пользователь перезаписал нужную версию)
$conflictPath = '\\DC01-SAM\d$\DFSRoots\Shared\Документы\DfsrPrivate\ConflictAndDeleted'
Get-ChildItem $conflictPath | Sort-Object LastWriteTime -Descending | Select-Object Name, Length, LastWriteTime -First 20

Результаты внедрения: пять филиалов — один файл

Проект уложился в 8 рабочих дней: 2 дня на подготовку серверов, 2 дня на настройку DFS, 2 дня на миграцию данных из филиалов, 2 дня на тестирование и обучение. Через месяц эксплуатации замерили результаты:

МетрикаДо внедренияПосле внедрения
Инциденты «устаревшая версия файла»15–20 в неделю0 (автоматическая синхронизация)
Время доступа к файлу из филиала3–15 сек (через VPN до Самары)Мгновенно (локальная копия)
Время синхронизации измененийРучная отправка по почте (часы/дни)1–5 минут автоматически
Работа при обрыве VPNНет доступа к файламПолный доступ (локальная копия)
Единая точка входа5 разных UNC-путей по IP\\roslogistic.local\shared
«Диспетчер в Перми открывает тот же прайс-лист, что и менеджер в Казани. Бухгалтерия в Самаре видит акты из Уфы в тот же день. Мы наконец-то работаем как единая компания, а не как пять отдельных контор» — коммерческий директор РосЛогистик.

И вот что приятно: проект обошёлся без единой дополнительной лицензии. DFS Namespaces и DFS Replication идут в комплекте с Windows Server, который в каждом филиале уже стоял. Реальные затраты — замена NAS в Перми на виртуалку с Windows Server и новый сервер для Уфы. Всё.

Рекомендации при внедрении DFS

  • Начните с AD Sites — без нормальной конфигурации сайтов DFS referral будет гонять клиентов куда угодно, но не на ближайший сервер
  • Hub-and-Spoke для 3+ филиалов — Full Mesh выглядит симметрично на бумаге, но когда что-то ломается, диагностировать паутину из соединений репликации — то ещё удовольствие
  • Sizing staging — маленький staging это причина номер один, почему репликация ползёт как черепаха. Не экономьте на этом
  • Bandwidth throttling обязателен — без ограничений DFSR спокойно съест весь канал. Остальные сервисы это не оценят
  • Организационные правила — договоритесь на берегу: кто и на каком сервере редактирует критические файлы. Техника конфликты разрулит, но нервы потреплет
  • Мониторьте backlog — если он начал расти и не падает, это первый звонок: что-то не так с каналом или дисками

Развитие проекта

После того как DFS заработал в штатном режиме, РосЛогистик утвердил дорожную карту на следующий год:

  • Q2 2026 — включить ABE (Access-Based Enumeration), чтобы пользователи не видели папки, к которым у них нет доступа
  • Q3 2026 — интеграция с SharePoint Online для совместного редактирования документов Office в реальном времени
  • Q4 2026 — присмотреться к Azure File Sync как дополнению к DFSR: облачный бэкап и tiering для редко используемых файлов

Часто задаваемые вопросы

Это два разных компонента — их часто путают, потому что они работают в связке. DFS Namespaces — это витрина: создаёт единое виртуальное пространство имён вида \\domain\shared, за которым могут прятаться папки с десятка разных серверов. Пользователь видит одну структуру и понятия не имеет, где файл живёт физически. DFS Replication — это уже механика под капотом: отслеживает изменения и гоняет их между серверами. Можно запустить DFSR без Namespaces — например, для репликации SYSVOL. Можно использовать Namespaces без репликации — просто как агрегатор UNC-путей. Но когда они работают вместе, получается полноценная распределённая файловая система.

DFSR обработает это как конфликт. Победит файл с более поздней датой модификации — он разъедется на все серверы как актуальная версия. Проигравший не удаляется: он тихо переезжает в скрытую папку ConflictAndDeleted на том сервере, где «проиграл». Администратор может оттуда его достать вручную. Чтобы таких ситуаций было меньше — введите организационное правило: кто и где имеет право редактировать критические документы. Звучит банально, но работает лучше любых технических костылей.

Технически DFSR работает через RPC, и теоретически его можно пустить через RPC over HTTP на порту 443. Но Microsoft сами не рекомендуют этот сценарий для production — DFSR проектировался под надёжные каналы с предсказуемой задержкой, а не под интернет. Если нужна репликация через публичные каналы — поднимите site-to-site VPN: IPsec или WireGuard. Либо смотрите в сторону Azure File Sync — он как раз создавался для гибридных сценариев, где часть инфраструктуры в облаке.

Microsoft официально поддерживает DFSR для репликации нескольких терабайт данных и миллионов файлов — но реальные пределы всегда диктует инфраструктура: ширина канала, размер staging folder, интенсивность изменений. Мы на практике гоняли DFSR с объёмами до 5 ТБ и 2–3 миллионами файлов — работает стабильно. Дальше начинаются нюансы. Если данных больше, делите их на несколько групп репликации с разными расписаниями: это снимает пиковую нагрузку и даёт контроль над потоком.

Нет, отдельно платить не придётся. DFS Namespaces и DFS Replication — встроенные роли Windows Server, они входят в редакции Standard и Datacenter без каких-либо доплат. Из лицензий нужны только сам Windows Server и клиентские CAL для пользователей, которые подключаются к файловым ресурсам. Если у вас уже куплен Windows Server — DFS достаётся бесплатно. Честно говоря, это один из главных аргументов в пользу DFS, когда клиенты смотрят на альтернативы.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#DFS Namespaces настройка#DFS Replication филиалы#DFSR Windows Server#DFS staging folder#DFS конфликт разрешение#DFS bandwidth throttling#dfsrdiag мониторинг#DFSR health report