# Установка NFS-хранилища

## Цель

Подготовка сервера NFS для совместного хранения данных ПринтМенеджеров в кластерной конфигурации.

## Предусловия

- Подготовлен сервер для NFS (`DB_NFS`).
- Все сервера ПринтМенеджер должны иметь сетевой доступ к серверу NFS.

## Шаги установки

### Шаг 1. Установите и запустите NFS

Для Ubuntu, Astra Linux и ALT Linux:
```
sudo apt install nfs-kernel-server -y
sudo systemctl start nfs-kernel-server.service
sudo systemctl status nfs-kernel-server.service
```

Для РЕД ОС и Red Hat Enterprise Linux:
```
sudo dnf install -y nfs-utils
sudo systemctl enable nfs-server.service
sudo systemctl start nfs-server.service
sudo systemctl status nfs-server.service
```

### Шаг 2. Создайте папку для NFS

Создайте директорию /scratch:

```
sudo mkdir /scratch
```

### Шаг 3. Настройте файл экспорта

Отредактируйте файл конфигурации экспортируемых директорий для редактирования:

```
sudo nano /etc/exports
```

Добавьте строку для папки /scratch:

```
/scratch *(rw,async,no_subtree_check,no_root_squash)
```

Сохраните файл и примените изменения экспорта:

```
sudo exportfs -a
```

### Шаг 4. Настройте права доступа

Измените владельца папки:
- Для Ubuntu, Astra Linux и ALT Linux:
  ```
  sudo chown nobody:nogroup /scratch
  ```

- Для РЕД ОС и Red Hat Enterprise Linux:
  ```
  sudo chown nobody:nobody /scratch
  ```

Установите разрешения для записи:

```
sudo chmod -R 777 /scratch
```

---

## Параметры для установки системы

Для установки балансировщика понадобится адрес сервера `NFS_ADDR` и путь к папке `NFS_FOLDER_PATH`:
- `NFS_ADDR`: IP-адрес или доменное имя сервера NFS.
- `NFS_FOLDER_PATH`: в данном примере путь к папке — `/scratch`.

Эта настройка позволяет использовать NFS-хранилище для хранения данных системы управления печатью.

---

## Установка с шифрованием (stunnel)

**Stunnel** — это прокси с открытым исходным кодом, который позволяет создавать безопасные туннели для взаимодействия с другими компьютерами по протоколу TLS. 

Ниже описаны шаги по установке и настройке **Stunnel** для обеспечения безопасного подключения к серверу **NFS**.

#### Установка сервера NFS и Stunnel

Для Ubuntu, Astra Linux и ALT Linux:
```
sudo apt update
sudo apt install -y nfs-kernel-server stunnel4
```

Для РЕД ОС и Red Hat Enterprise Linux:
```
sudo dnf update
sudo dnf install -y nfs-utils stunnel
```

#### Настройка сервера NFS

Создайте директорию для экспорта:
```
sudo mkdir /scratch
```

Измените владельца папки:
- Для Ubuntu, и Astra Linux и ALT Linux:
  ```
  sudo chown nobody:nogroup /scratch
  sudo chmod 777 /scratch
  ```

- Для РЕД ОС и Red Hat Enterprise Linux:
  ```
  sudo chown nobody:nobody /scratch
  sudo chmod 777 /scratch
  ```
где `/scratch` – путь к общей директории.

Настройте экспорт директории. Для этого отредактируйте файл конфигурации экспортируемых директорий:
```
sudo nano /etc/exports
```
Добавьте строку для папки `/scratch`:
```
/scratch 127.0.0.1(rw,sync,no_subtree_check,insecure,no_root_squash)
```
> **Обратите внимание**: параметр `insecure` обязателен.

#### Применение изменений в экспортах:​

Выполните команду:
```
sudo exportfs -a
```

#### Перезапуск службы NFS

Выполните перезапуск службы NFS:

- Для Ubuntu, Astra Linux и ALT Linux:​
  ```
  sudo systemctl restart nfs-kernel-server.service​
  ```

- Для РЕД ОС и Red Hat Enterprise Linux:​
  ```
  sudo systemctl restart nfs-server.service
  ```

#### Настройка Stunnel на сервере NFS

##### Получение сертификатов

Если используются автоматические сертификаты, выпустите дополнительные сертификаты для NFS сервера, выполнив следующие команды на сервере балансировщика:
```
cd /opt/printum_balancer/scripts
sudo ./generate_certs.sh <HOSTNAME_NFS_SERVER>
```
где `<HOSTNAME_NFS_SERVER>` — IP-адрес или доменное имя сервера NFS.

После выполнения команды архив `printum_certs.tar.gz`, содержащий необходимые сертификаты, будет создан в директории `/opt/printum_balancer/certificates/<HOSTNAME_NFS_SERVER>`.

На сервере NFS создайте директорию `/etc/stunnel/cert`:
```
sudo mkdir /etc/stunnel/cert
```

Скопируйте архив на сервер NFS и извлеките файлы в эту директорию:
```
sudo cp printum_certs.tar.gz /etc/stunnel/cert
sudo tar -xvf printum_certs.tar.gz
```

Если используются собственные сертификаты, скопируйте CA-сертификат, SSL-сертификат и ключ на сервер NFS в эту директорию:
```
sudo cp ssl_cert ssl_key ca_cert /etc/stunnel/cert
```

##### Настройка Stunnel

Создайте файл `/etc/stunnel/stunnel.conf` со следующим содержимым:
```
cert = /etc/stunnel/cert/<cert.crt>
key = /etc/stunnel/cert/<cert.key>
CAfile = /etc/stunnel/cert/<ca.crt>

[nfs]
accept = <NFS_STUNNEL_PORT>
connect = 127.0.0.1:2049
```
где:
  - `/etc/stunnel/cert/<cert.crt>`, `/etc/stunnel/cert/<cert.key>`, `/etc/stunnel/cert/<ca.crt>` — абсолютные пути к сертификату, ключу и CA-сертификату.
  - `<NFS_STUNNEL_PORT>` — порт для туннеля (рекомендуется указать 20490 или другой непривилегированный порт).

##### Настройка Stunnel для автоматического запуска

- Для Ubuntu, ALT Linux и Astra Linux:
  - Откройте файл `/etc/default/stunnel4`
  - Найдите строку `ENABLED` и установите значение `1`:
    ```
    ENABLED=1
    ```
    Если строки нет, добавьте ее вручную.

- Для РЕД ОС и Red Hat Enterprise Linux:
```​
sudo systemctl enable stunnel​
```

##### Запуск и включение Stunnel

- Для Ubuntu и Astra Linux:​
  ```
  sudo systemctl enable stunnel4
  sudo systemctl start stunnel4​
  ```

- Для РЕД ОС и Red Hat Enterprise Linux:
  ```
  sudo systemctl enable stunnel
  sudo systemctl start stunnel
  ```
Теперь сервер NFS настроен с использованием шифрования через **Stunnel**. Для получения дополнительной информации обращайтесь к [официальной документации](https://www.stunnel.org/static/stunnel.html).

> **Примечание**: Если ранее у вас уже был развёрнут балансировщик с использованием нешифрованного соединения с NFS, то для перехода на шифрование с Stunnel вам необходимо выполнить повторную установку балансировщика и всех нод ПМ.
>
> Допускается установка на уже развёрнутые версии.
>
> В сценарии установки балансировщика с помощью скрипта массового развёртывания, укажите следующие значения переменных в файле конфигурации (`config.ini`):
> - `NFS_TLS = 1` и `NFS_STUNNEL_PORT = <порт_для_Stunnel>`.
> - `SKIP = true` в секции настроек `[Monitoring]`.
>   
> После изменения значений переменных сохраните файл конфигурации и запустите установку:
>```
>sudo ./install_all_offline.sh
>```
> В сценарии установки балансировщика вручную обновите балансировщик и все ноды ПМ с указанием переменных `NFS_TLS = 1` и `NFS_STUNNEL_PORT = <порт_для_Stunnel>`.

## Ожидаемый результат

- NFS-сервис активен; общая папка доступна на чтение и запись.
- Параметры `NFS_ADDR` и `NFS_FOLDER_PATH` готовы для указания при установке ПринтМенеджеров.


## Следующие шаги

- [Установка балансировщика HAProxy](https://wiki.printum.io/books/3-ustanovka/page/ustanovka-balansirovshhika-haproxy)
- [Установка первого ПринтМенеджера в кластере](https://wiki.printum.io/books/3-ustanovka/page/ustanovka-pervogo-printmenedzera-v-klastere)


---

## Типовые ошибки

| Ошибка | Причина | Решение |
| ------ | ------- | ------- |
| При отложенной печати появляется ошибка "файл недоступен". | NFS-хранилище недоступно или неверно указаны параметры в `.env` ПринтМенеджера. | Выполнить `sudo cat /opt/printmanager/.env`.<br><br>Параметры должны быть:<br> `DRIVER_OPTS_DEVICE` — `:NFS\FOLDER\PATH`,<br>`DRIVER_OPTS_O` — `addr=NFS_ADDR,nolock,soft,rw`,<br>`DRIVER_OPTS_TYPE` — `nfs`.<br><br>Убедитесь в сетевой доступности NFS-сервера и возможности чтения/записи из `NFS_FOLDER_PATH`. |

---

## Связанные страницы

- [Подготовка к установке кластера Active-Active](https://docs.printum.io/books/8-spravocnik/page/podgotovka-k-ustanovke-klastera-active-active)
- [Установка PostgreSQL для кластера](http://wiki.printum.io/books/3-ustanovka/page/ustanovka-postgresql-dlia-klastera)
- [Установка балансировщика HAProxy](http://wiki.printum.io/books/3-ustanovka/page/ustanovka-balansirovshhika-haproxy)
- [Установка первого ПринтМенеджера в кластере](http://wiki.printum.io/books/3-ustanovka/page/ustanovka-pervogo-printmenedzera-v-klastere)