# Добавление NFS-томов в Global Server

В конфигурационном файле `config.yaml` может быть указан:

- основной том `appvol`, который в системе всегда монтируется как `/app`;
- дополнительные тома `extra_vols`, которые монтируются как отдельные каталоги и используются для настройки
  дополнительных файловых хранилищ.

Таким образом:

- `appvol` соответствует основному файловому хранилищу системы;
- каждый элемент из `extra_vols` соответствует отдельному дополнительному файловому хранилищу.

## Настройка основного тома

Основной NFS-том задается в секции `appvol`.

Пример `config.yaml`:

```yaml
appvol:
  type: nfs
  server: 192.168.1.3
  path: /nfs/share/global/filestorage
```

Примените ресурс:

```bash
kubectl apply -f ./config.yaml
```

Внутри Global Server данный том используется как каталог:

```text
/app
```

На уровне файловых хранилищ системы путь до хранилища для основного тома формируется как:

```text
/root/globalserver/workspace/mnt/app
```

## Настройка дополнительных томов

Дополнительные NFS-тома задаются в секции `extra_vols`.

Пример `config.yaml`:

```yaml
extra_vols:
  - name: rpl
    path: rpl
    volume:
      type: nfs
      server: 192.168.1.35
      path: /nfs/share/global/rpl
```

Где:

- `name` — системное имя дополнительного тома;
- `path` — имя каталога монтирования внутри системы;
- `volume` — параметры подключения NFS-ресурса.

Примените ресурс:

```bash
kubectl apply -f ./config.yaml
```

## Правило формирования пути в системе

После подключения дополнительного тома путь до хранилища в интерфейсе Global Server формируется по следующему правилу:

- базовая часть пути сохраняется без изменений;
- сегмент `/app` заменяется на имя тома из `extra_vols`.

Базовый путь основного тома:

```text
/root/globalserver/workspace/mnt/app
```

Пример для дополнительного тома `rpl`:

```text
/root/globalserver/workspace/mnt/rpl
```

```{important}
rpl - отдельное хранилище временных файлов интеграций. Для него характерно большое количество мелких файлов и автоматическая очистка по ротации через несколько дней.
По этой причине `rpl` рекомендуется размещать на отдельной NFS-шаре или в отдельном S3 bucket.
```

## Настройка файлового хранилища по протоколу S3

В системе Global Server в качестве файлового хранилища может использоваться объектное хранилище, доступное по протоколу
S3.

* Настройка S3 является альтернативой локальному или NFS-хранилищу.
* Для S3-хранилища не требуется настройка путей монтирования в файловой системе сервера Global Server.
* Параметры подключения и аутентификации должны поддерживаться в актуальном состоянии при смене учетных данных или
  бакета.
* При использовании внешнего объектного хранилища необходимо дополнительно учитывать сетевую доступность endpoint и
  политику доступа со стороны S3-провайдера.

### Основные параметры подключения

При создании или редактировании записи файлового хранилища в поле типа файлового хранилища необходимо выбрать
`S3 протокол`.

Для S3-хранилища указываются следующие параметры:

| Параметр                               | Назначение                                           |
|----------------------------------------|------------------------------------------------------|
| URL сервиса                            | Адрес S3-совместимого endpoint                       |
| Имя бакета                             | Имя целевого бакета для хранения файлов              |
| Регион                                 | Регион размещения бакета                             |
| Время ожидания завершения HTTP-запроса | Таймаут запросов к S3-сервису                        |
| Размер передаваемой порции             | Размер части файла при передаче данных               |
| Формат пути файла                      | Способ формирования ключа объекта в бакете           |
| Шаблон адреса `virtual hosted`         | Признак использования virtual-hosted-style адресации |

### Параметры аутентификации

Для доступа к S3-хранилищу используются параметры аутентификации, задаваемые в отдельном блоке.

Поддерживаются следующие поля:

| Параметр          | Назначение                                                                             |
|-------------------|----------------------------------------------------------------------------------------|
| Ключ доступа      | Access Key для обращения к S3 API                                                      |
| Секретный ключ    | Secret Key для обращения к S3 API                                                      |
| Логин             | Дополнительный идентификатор учетной записи, если используется в конкретной интеграции |
| Пароль            | Пароль учетной записи, если используется в конкретной интеграции                       |
| Токен авторизации | Дополнительный токен, если этого требует используемый S3-сервис                        |

При заполнении параметров необходимо использовать учетные данные, выданные для конкретного S3-бакета или сервисной
учетной записи.

## Настройка в интерфейсе Global Server

Настройка выполняется в приложении по пути:

```text
Настройка системы -> Сущности -> Файловые хранилища
```

Для каждого дополнительного NFS-тома необходимо создать или настроить отдельное файловое хранилище.

При настройке указываются:

- **Системное имя** — идентификатор хранилища в системе;
- **Папка для хранения** — логическое имя каталога;
- **Наименование** — отображаемое название;
- **Тип файлового хранилища** — локальное / S3;
- **Путь до хранилища** — путь вида `/root/globalserver/workspace/mnt/<name>`.

Пример настройки локального хранилища:

![Global NFS share settings](img/global_nfs_share_settings.png)

Пример настройки S3 хранилища:

![Global S3 share settings](img/add_s3_share.png)


**NFS: один основной том `/app`**

```mermaid
flowchart LR
    U["Пользователи / бизнес-функции"] --> GS["Global Server"]

    subgraph ST["Контур хранения"]
        NFS["NFS-сервер"]
        SHR1["appvol"]
    end

    GS --> M1["/root/globalserver/workspace/mnt/app"]
    M1 --> SHR1
    SHR1 --> NFS
```

**NFS: несколько хранилищ по функциональным зонам**

```mermaid
flowchart LR
    U["Пользователи / бизнес-функции"] --> GS["Global Server"]

    subgraph APP["Функциональные зоны"]
        Z1["Основное хранилище"]
        Z2["Склад"]
        Z3["Производство"]
        Z4["Документооборот"]
        Z5["Отчеты"]
        Z6["Архив"]
        Z7["RPL / временные файлы интеграций"]
    end

    GS --> Z1
    GS --> Z2
    GS --> Z3
    GS --> Z4
    GS --> Z5
    GS --> Z6
    GS --> Z7

    subgraph ST["Контур хранения"]
        NFS-1["NFS-сервер 1"]
        NFS-2["NFS-сервер 2"]
        NFS-3["NFS-сервер 3"]
        S1["filestorage -> /root/globalserver/workspace/mnt/app"]
        S2["warehouse -> /root/globalserver/workspace/mnt/warehouse"]
        S3["production -> /root/globalserver/workspace/mnt/production"]
        S4["workflow -> /root/globalserver/workspace/mnt/workflow"]
        S5["reports -> /root/globalserver/workspace/mnt/reports"]
        S6["archive -> /root/globalserver/workspace/mnt/archive"]
        S7["rpl -> /root/globalserver/workspace/mnt/rpl"]
    end

    Z1 --> S1
    Z2 --> S2
    Z3 --> S3
    Z4 --> S4
    Z5 --> S5
    Z6 --> S6
    Z7 --> S7
    S1 --> NFS-1
    S2 --> NFS-1
    S3 --> NFS-1
    S4 --> NFS-2
    S5 --> NFS-2
    S6 --> NFS-2
    S7 --> NFS-3
```

**S3: одно основное хранилище**

```mermaid
flowchart LR
    U["Пользователи / бизнес-функции"] --> GS["Global Server"]

    subgraph OBJ["Объектное хранилище"]
        S3["S3 endpoint"]
        B1["Bucket: default"]
    end

    GS --> B1
    B1 --> S3
```

**Смешанный вариант**


```mermaid
flowchart LR
U["Пользователи / бизнес-функции"] --> GS["Global Server"]

    subgraph APP["Функциональные зоны"]
        Z1["Основное хранилище"]
        Z2["Склад"]
        Z3["Производство"]
        Z4["Документооборот"]
        Z5["Отчеты"]
        Z6["Архив"]
        Z7["RPL / временные файлы интеграций"]
    end

    GS --> Z1
    GS --> Z2
    GS --> Z3
    GS --> Z4
    GS --> Z5
    GS --> Z6
    GS --> Z7

    subgraph ST["Контура хранения"]
        NFS-1["NFS-сервер 1"]
        NFS-2["NFS-сервер 2"]
        S3-1["S3 endpoint 1"]
        S3-2["S3 endpoint 2"]
        S1["filestorage -> /root/globalserver/workspace/mnt/app"]
        S2["Bucket: warehouse"]
        S3["Bucket: production"]
        S4["Bucket: workflow"]
        S5["Bucket: reports"]
        S6["archive -> /root/globalserver/workspace/mnt/archive"]
        S7["rpl -> /root/globalserver/workspace/mnt/rpl"]
    end

    Z1 --> S1
    Z2 --> S2
    Z3 --> S3
    Z4 --> S4
    Z5 --> S5
    Z6 --> S6
    Z7 --> S7
    S1 --> NFS-1
    S2 --> S3-1
    S3 --> S3-1
    S4 --> S3-2
    S5 --> S3-2
    S6 --> NFS-1
    S7 --> NFS-2
```
