# Миграция Groupfolders: VM 100 → VM 108

> **Дата:** 03.03.2026
> **Статус:** Подготовлено, ожидает увеличения диска

---

## Источник: VM 100 (Cloud-NIIKN, старый NC)

- IP: 192.168.1.245
- NC data: `/mnt/nc-data/` (4.1 TB диск sdb, занято 3.7 TB)
- SSH: root, ключ niikn-helper@clawdbot-1 (добавлен 03.03.2026)
- Groupfolders path: `/mnt/nc-data/__groupfolders/`

### Данные

| ID | Путь | Название | Размер |
|----|------|----------|--------|
| 1 | `__groupfolders/1/` | Общий ресурс | 1.5 TB |
| 2 | `__groupfolders/2/` | ГИКЭ_ВОКН_Москва | 1.2 TB |
| — | `__groupfolders/versions/` | Версии файлов | 84 GB |
| — | `__groupfolders/trash/` | Корзина | 7.6 GB |
| — | `__groupfolders/onlyoffice/` | OnlyOffice locks | 213 MB |
| **Итого** | | | **~2.8 TB** |

### Права (oc_group_folders_groups)

| Папка | Группа | Permissions | Расшифровка |
|-------|--------|-------------|-------------|
| 1 (Общий ресурс) | НИИКН | 23 | read, write, share |
| 1 (Общий ресурс) | admin | 31 | read, write, share, delete |
| 1 (Общий ресурс) | Редактирование | 31 | read, write, share, delete |
| 2 (ГИКЭ_ВОКН_Москва) | Фотофиюксация ВОКН Москва | 23 | read, write, share |
| 2 (ГИКЭ_ВОКН_Москва) | admin | 31 | read, write, share, delete |
| 2 (ГИКЭ_ВОКН_Москва) | test | 23 | read, write, share |
| 2 (ГИКЭ_ВОКН_Москва) | ДКН | 23 | read, write, share |

### Управление (oc_group_folders_manage)

| Папка | Тип | Управляющий |
|-------|-----|-------------|
| 1 | group | admin |
| 2 | group | admin |

### ACL (oc_group_folders_acl) — Advanced Permissions

| Папка/FileID | Тип | Пользователь | Mask | Permissions |
|--------------|-----|-------------|------|-------------|
| 523107 | user | ulyanova140@gmail.com | 31 | 31 (full) |
| 2171076 | user | maksimmaul@gmail.com | 0 | 0 (deny) |
| 3381694 | user | admin | 0 | 0 (deny) |
| 1227009 | user | ccpupt@mail.ru | 15 | 15 |
| 3684395 | user | aan@labexp.ru | 13 | 13 |
| 1345540 | user | op.shishova@yandex.ru | 31 | 31 (full) |
| 1345540 | user | 19761113@mail.ru | 31 | 31 (full) |
| 1345628 | user | 19761113@mail.ru | 31 | 31 (full) |
| 1345628 | user | op.shishova@yandex.ru | 31 | 31 (full) |
| 1345628 | user | admin | 31 | 31 (full) |

> **Примечание:** ACL привязаны к fileid, которые на новом NC будут другими. ACL нужно будет переназначить после `files:scan` по путям файлов.

### Настройки папок (oc_group_folders)

| folder_id | mount_point | quota | acl |
|-----------|-------------|-------|-----|
| 1 | Общий ресурс | -3 (unlimited) | 1 (enabled) |
| 2 | ГИКЭ_ВОКН_Москва | -4 (unlimited) | 1 (enabled) |

---

## Приёмник: VM 108 (Nextclaud-AIO, новый NC)

- IP: 192.168.1.200
- NC data: `/mnt/ncdata/` (sdb1, 3.9 TB, занято 3.1 TB, **свободно 626 GB**)
- Groupfolders app: **установлен** (v20.1.12)
- Группы: НИИКН, admin, Редактирование, Фотофиюксация ВОКН Москва, ДКН, test — **все есть**
- Текущие External Storage (ID 4, 5) нужно удалить перед миграцией

---

## План миграции

### Шаг 0: Увеличить диск
- Пользователь увеличивает `/mnt/ncdata` (sdb1) минимум на 3 TB
- После увеличения: `resize2fs /dev/sdb1`

### Шаг 1: Копирование данных (10-15 часов)
```bash
# На VM 108:
rsync -avP --info=progress2 \
  root@192.168.1.245:/mnt/nc-data/__groupfolders/ \
  /mnt/ncdata/data/__groupfolders/

# Исправить владельца
chown -R www-data:www-data /mnt/ncdata/data/__groupfolders/
```

### Шаг 2: Удалить External Storage
```bash
docker exec -u www-data nextcloud-aio-nextcloud php occ files_external:delete 4
docker exec -u www-data nextcloud-aio-nextcloud php occ files_external:delete 5
```

### Шаг 3: Создать Groupfolders
```bash
# Создать папки (ID будут 1 и 2 если первые)
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:create "Общий ресурс"
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:create "ГИКЭ_ВОКН_Москва"

# Назначить группы с правами
# Папка 1 — Общий ресурс
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:group 1 НИИКН write share
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:group 1 admin write share delete
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:group 1 Редактирование write share delete

# Папка 2 — ГИКЭ_ВОКН_Москва
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:group 2 "Фотофиюксация ВОКН Москва" write share
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:group 2 admin write share delete
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:group 2 test write share
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:group 2 ДКН write share

# Включить ACL
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:acl 1 true
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:acl 2 true

# Управление — admin
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:manage 1 group admin
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:manage 2 group admin

# Квоты unlimited
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:quota 1 unlimited
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:quota 2 unlimited
```

### Шаг 4: Сканирование файлов
```bash
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:scan 1
docker exec -u www-data nextcloud-aio-nextcloud php occ groupfolders:scan 2
```

### Шаг 5: Восстановить ACL по путям

ACL привязаны к fileid. После scan fileid будут другие. Ниже — маппинг путей для восстановления.

**Папка 1 (Общий ресурс):**

| Путь внутри папки | Пользователь | Mask | Permissions | Смысл |
|-------------------|-------------|------|-------------|-------|
| `Казань/ТОМ 2 УТВЕРЖДАЕМАЯ ЧАСТЬ ВЫВОДЫ` | maksimmaul@gmail.com | 0 | 0 | запрет |
| `.stfolder` | admin | 0 | 0 | запрет |
| `2024/Вологда_2024/Дополнительная фотофиксация (Интерьер)/12) 31. Ледник И.П,Дружининского из деревни Окуловской` | ccpupt@mail.ru | 15 | 15 | r/w/delete (no share) |
| `2025/Иркутск_2025/Выписки ЕГРН` | aan@labexp.ru | 13 | 13 | r/delete (no write/share) |

**Папка 2 (ГИКЭ_ВОКН_Москва):**

| Путь внутри папки | Пользователь | Mask | Permissions | Смысл |
|-------------------|-------------|------|-------------|-------|
| `Образцы актов` | op.shishova@yandex.ru | 31 | 31 | полный доступ |
| `Образцы актов` | 19761113@mail.ru | 31 | 31 | полный доступ |
| `/` (корень папки) | 19761113@mail.ru | 31 | 31 | полный доступ |
| `/` (корень папки) | op.shishova@yandex.ru | 31 | 31 | полный доступ |
| `/` (корень папки) | admin | 31 | 31 | полный доступ |

**Скрипт восстановления ACL** (выполнить после scan):
```bash
# Получить новые fileid по путям и вставить ACL
docker exec nextcloud-aio-database psql -U oc_nextcloud -d nextcloud_database -c "
-- ACL для папки 1 (Общий ресурс)
INSERT INTO oc_group_folders_acl (fileid, mapping_type, mapping_id, mask, permissions)
SELECT fc.fileid, 'user', 'maksimmaul@gmail.com', 0, 0
FROM oc_filecache fc WHERE fc.path = '__groupfolders/1/Казань/ТОМ 2 УТВЕРЖДАЕМАЯ ЧАСТЬ  ВЫВОДЫ';

INSERT INTO oc_group_folders_acl (fileid, mapping_type, mapping_id, mask, permissions)
SELECT fc.fileid, 'user', 'ccpupt@mail.ru', 15, 15
FROM oc_filecache fc WHERE fc.path LIKE '__groupfolders/1/2024/Вологда_2024/Дополнительная фотофиксация%Ледник%';

INSERT INTO oc_group_folders_acl (fileid, mapping_type, mapping_id, mask, permissions)
SELECT fc.fileid, 'user', 'aan@labexp.ru', 13, 13
FROM oc_filecache fc WHERE fc.path = '__groupfolders/1/2025/Иркутск_2025/Выписки ЕГРН';

-- ACL для папки 2 (ГИКЭ_ВОКН_Москва) — корень
INSERT INTO oc_group_folders_acl (fileid, mapping_type, mapping_id, mask, permissions)
SELECT fc.fileid, 'user', '19761113@mail.ru', 31, 31
FROM oc_filecache fc WHERE fc.path = '__groupfolders/2';

INSERT INTO oc_group_folders_acl (fileid, mapping_type, mapping_id, mask, permissions)
SELECT fc.fileid, 'user', 'op.shishova@yandex.ru', 31, 31
FROM oc_filecache fc WHERE fc.path = '__groupfolders/2';

INSERT INTO oc_group_folders_acl (fileid, mapping_type, mapping_id, mask, permissions)
SELECT fc.fileid, 'user', 'admin', 31, 31
FROM oc_filecache fc WHERE fc.path = '__groupfolders/2';

-- ACL для папки 2 — Образцы актов
INSERT INTO oc_group_folders_acl (fileid, mapping_type, mapping_id, mask, permissions)
SELECT fc.fileid, 'user', 'op.shishova@yandex.ru', 31, 31
FROM oc_filecache fc WHERE fc.path = '__groupfolders/2/Образцы актов';

INSERT INTO oc_group_folders_acl (fileid, mapping_type, mapping_id, mask, permissions)
SELECT fc.fileid, 'user', '19761113@mail.ru', 31, 31
FROM oc_filecache fc WHERE fc.path = '__groupfolders/2/Образцы актов';
"
```

---

## Оценки

| Параметр | Значение |
|----------|----------|
| Объём данных | ~2.8 TB |
| Нужно свободного места | ≥3 TB на ncdata |
| Время rsync | 10-15 часов |
| Время настройки | ~30 мин |
| Downtime NC | 0 (NC работает во время копирования) |

<!-- AUTO-SYNC FROM MEMORY.MD - DO NOT EDIT BELOW -->
## Миграция НИИКН Groupfolders (VM 100 → VM 108) — ЗАВЕРШЕНА
- Rsync завершён 04.03.2026 17:50, 2.9TB, chown done
- groupfolders:scan выполнен: 458,677 файлов, 32,803 каталогов, 0 ошибок
- Папка 1 "Общий ресурс" (1.5TB): группы Редактирование, НИИКН, admin
- Папка 2 "ГИКЭ_ВОКН_Москва" (1.2TB): группы work(test), ДКН, Фотофиксация ВОКН Москва, admin
- Диск VM 108: /dev/sdb1 4.4T (85% занято, 651GB свободно)
<!-- END AUTO-SYNC -->
