> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cakestudio.fun/llms.txt
> Use this file to discover all available pages before exploring further.

# База данных и сеть

> Настройка SQL, Redis, Direct TCP и резервного копирования в database.yml.

Конфигурация хранилища и межсерверной синхронизации находится в `database.yml`.

## Режимы хранения

Параметр `storage-mode` определяет способ хранения лотов:

* **`HYBRID`:** Активные лоты хранятся в оперативной памяти Redis (или Dragonfly/KeyDB/Valkey). История сделок, логи и статистика асинхронно записываются в SQL-базу данных.
* **`SQL`:** Все данные (активные лоты и архив) хранятся исключительно в таблицах реляционной СУБД.

## Драйверы баз данных

Параметр `driver` определяет используемую СУБД:

| Драйвер      | Применение                                                                 |
| :----------- | :------------------------------------------------------------------------- |
| `mariadb`    | Рекомендуется для большинства серверов и связок BungeeCord/Velocity.       |
| `postgresql` | Альтернатива для крупных проектов с высокими требованиями к транзакциям.   |
| `mysql`      | Стандартная реляционная база данных.                                       |
| `sqlite`     | Локальный файл. Подходит только для одного сервера (не поддерживает сеть). |

```yaml theme={null}
# Идентификатор сервера в сети
server-identifier: "anarchy-1"

# Главный сервер, выполняющий централизованную очистку просроченных предметов.
# В кластере флаг true должен стоять только на одном сервере.
is-head: true
```

## Сетевая синхронизация

Синхронизация лотов между серверами кластера поддерживает следующие транспорты (в порядке приоритета):

1. **`direct-tcp`** — прямое бинарное TCP-соединение между серверами. Минимальная задержка без сторонних сервисов.
2. **`redis`** — публикация событий через Redis Pub/Sub.
3. **`bungee`** — передача сообщений через Plugin Messaging.
4. **`none`** — одиночный сервер без сети.

## Настройка Direct TCP

Прямой сокет обеспечивает мгновенную передачу сетевых событий с авторизацией по HMAC-SHA256.

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

При размещении на одной машине используется локальный интерфейс `127.0.0.1`:

<Tabs>
  <Tab title="Сервер 1">
    ```yaml theme={null}
    direct-tcp:
      enabled: true
      bind-port: 9090
      nodes:
        - "127.0.0.1:9091"
      allowed-ips: []
      secret-key: "YourSecretKeyChangeMe"
    ```
  </Tab>

  <Tab title="Сервер 2">
    ```yaml theme={null}
    direct-tcp:
      enabled: true
      bind-port: 9091
      nodes:
        - "127.0.0.1:9090"
      allowed-ips: []
      secret-key: "YourSecretKeyChangeMe"
    ```
  </Tab>
</Tabs>

### Сервера на разных хостах

Например, Сервер 1 (`10.0.0.1`) и Сервер 2 (`10.0.0.2`):

<Tabs>
  <Tab title="Сервер 1 (10.0.0.1)">
    ```yaml theme={null}
    direct-tcp:
      enabled: true
      bind-port: 9090
      nodes:
        - "10.0.0.2:9090"
      allowed-ips:
        - "10.0.0.2"
      secret-key: "YourSecretKeyChangeMe"
    ```
  </Tab>

  <Tab title="Сервер 2 (10.0.0.2)">
    ```yaml theme={null}
    direct-tcp:
      enabled: true
      bind-port: 9090
      nodes:
        - "10.0.0.1:9090"
      allowed-ips:
        - "10.0.0.1"
      secret-key: "YourSecretKeyChangeMe"
    ```
  </Tab>
</Tabs>

<Warning>
  Открывайте сокет-порт аукциона в фаерволе только для доверенных IP-адресов других серверов кластера:

  ```bash theme={null}
  # UFW:
  sudo ufw allow from 10.0.0.2 to any port 9090 proto tcp

  # iptables:
  sudo iptables -A INPUT -p tcp -s 10.0.0.2 --dport 9090 -j ACCEPT
  ```
</Warning>

## Настройка Redis

Используется для Pub/Sub синхронизации или в качестве кэша при `storage-mode: HYBRID`:

```yaml theme={null}
redis:
  enabled: true
  address: "127.0.0.1"
  port: 6379
  user: "default"
  password: "StrongPassword"
  timeout: 10000
```

<Note>
  Вместо классического Redis поддерживаются Dragonfly, KeyDB и Valkey.
</Note>

## Пул соединений

Параметры пула HikariCP:

```yaml theme={null}
pool:
  min_connections: 1
  max_connections: 10
  keepalive: 30 seconds
  timeout: 25 seconds
  idle_timeout: 5 minutes
  max_lifetime: 10 minutes
```

## Резервное копирование

Автоматическое создание дампов базы данных с отправкой в Discord Webhook:

```yaml theme={null}
backup:
  enabled: true
  disable-plugin: false # Создавать бэкап при выключении сервера
  interval: 15          # Интервал создания в минутах
  cleanup:
    enabled: true
    keep-days: 7        # Срок хранения дампов в днях

  webhook:
    enabled: true
    url: "https://discord.com/api/webhooks/YOUR_WEBHOOK_URL"
    message: "📦 **Резервная копия базы данных**\nСервер: `{server}`"
```
