# Установка PostgreSQL для кластера

## Цель

Развертывание базы данных PostgreSQL для кластерной конфигурации ПринтМенеджера.

## Предусловия

- Подготовлен сервер для базы данных (`DB_NFS`).
- Определено количество серверов ПринтМенеджер для расчёта `max_connections`.

#### Расчёт максимального количества подключений к БД

Для обеспечения достаточного количества соединений с базой данных настройте параметр `max_connections` в конфигурационном файле **PostgreSQL**. 

Используйте следующую формулу: 
```
max_connections = (3*N+70)*T
```
где:
  - `N`: количество процессорных ядер на одном сервере ПринтМенеджера (ПринтМенеджер).
  - `T`: количество серверов ПринтМенеджер в системе.

> **Пример**: Для 3 серверов ПринтМенеджер с 6 ядрами каждый: `max_connections = (3 х 6 + 70) х 3 = 264`. 

## Шаги установки

### Шаг 1. Установите Docker и Docker Compose

Для Ubuntu, Astra Linux и ALT Linux: 
```
sudo apt install docker.io -y
sudo apt install docker-compose -y
sudo systemctl enable docker --now
sudo systemctl status docker
```

Для РЕД ОС и Red Hat Enterprise Linux: 
```
sudo dnf install -y docker-ce docker-ce-cli
sudo dnf install -y docker-compose
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker 
```

### Шаг 2. Создайте файл docker-compose.yml

Выполните команду для создания файла: 
```
touch docker-compose.yml
```

Затем отредактируйте файл:
```
nano docker-compose.yml
```

Вставьте следующую конфигурацию:
```
version: "3.7"

services:
    postgres: image: postgres:15.15-alpine
    volumes:
      - postgres15:/var/lib/postgresql/data
    command: postgres -N 300
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: printmanager
      PGDATA: /var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    ports:
      - "5432:5432"
    restart: always
  
volumes:
    postgres15:
```

> **Важно:** Параметры `POSTGRES_USER` и `POSTGRES_PASSWORD` измените на свои значения. Эти данные потребуются для настройки системы.
>
> В строке `command: postgres -N 300` вместо `300` укажите значение максимального количества подключений к БД, исходя из количества используемых ПринтМенеджеров.

### Шаг 3. Создайте директорию для PostgreSQL

Переместите файл `docker-compose.yml` в новую директорию: 
```
sudo mkdir /opt/postgres15
sudo mv docker-compose.yml /opt/postgres15
cd /opt/postgres15
```

### Шаг 4. Запустите PostgreSQL через Docker Compose

Выполните команду:
```
sudo docker-compose up -d
```

Это запустит контейнер с PostgreSQL и выполнит его настройку.

#### Возможные ошибки

В Astra Linux может появиться ошибка: 
```
docker.errors.DockerException: Error while fetching server API version: Not supported URL scheme http+docker
```

**Причина**: установлен устаревший пакет docker-compose.

**Решение**: выполните команды:
```
sudo apt purge docker-compose
sudo apt install docker-compose-v2
```

## Как проверить установку

Убедитесь, что контейнер запущен и база данных доступна:
```
sudo docker ps
```

Проверьте работоспособность базы, используя ID её контейнера из предыдущей команды:
```
sudo docker logs <container_id>
```

## Параметры для дальнейшей настройки

Используйте указанные параметры `POSTGRES_USER`, `POSTGRES_PASSWORD` и `POSTGRES_DB` при настройке на этапе [Установка балансировщика HAProxy](https://wiki.printum.io/books/3-ustanovka/page/ustanovka-balansirovshhika-haproxy).

## Следующие шаги

- [Установка NFS-хранилища](https://wiki.printum.io/books/3-ustanovka/page/ustanovka-nfs-xranilishha)
- [Установка балансировщика HAProxy](https://wiki.printum.io/books/3-ustanovka/page/ustanovka-balansirovshhika-haproxy)

## Ожидаемый результат

- Контейнер PostgreSQL запущен (`sudo docker ps` показывает статус `Up`).
- База данных доступна; подготовлены параметры `DB_HOST`, `POSTGRES_LOGIN`, `POSTGRES_PASSWORD` для указания при установке ПринтМенеджеров.

## Типовые ошибки

| Ошибка | Причина | Решение |
| ------ | ------- | ------- |
| `django.db.utils.OperationalError: FATAL: sorry, too many clients already` | Превышено максимальное количество подключений к PostgreSQL после добавления новых узлов. | Увеличить `max_connections` в конфигурации PostgreSQL: <br><br>`max_connections = (3×N + 70) × T`<br><br>где `N` — количество ядер CPU, `T` — итоговое число серверов ПринтМенеджер в кластере |

---

## Связанные страницы

- [Подготовка к установке кластера Active-Active](https://wiki.printum.io/books/3-ustanovka/page/podgotovka-k-ustanovke-klastera-active-active)
- [Установка NFS-хранилища](https://wiki.printum.io/books/3-ustanovka/page/ustanovka-nfs-xranilishha)
- [Установка балансировщика HAProxy](https://wiki.printum.io/books/3-ustanovka/page/ustanovka-balansirovshhika-haproxy)