# Руководство по конфигурации OSTP (`config.json`)

Файл `config.json` является основным конфигурационным файлом для сервера, клиента и реле.

Ниже приведено подробное описание структуры для режима работы **Server**.

---

## Полный пример конфигурации

```json
{
  "mode": "server",
  "log_level": "info",
  "listen": "0.0.0.0:50000",
  "access_keys": [
    "some_simple_key",
    {
      "access_key": "detailed_key_with_limit",
      "name": "Рабочий Ноутбук",
      "limit_bytes": 107374182400
    }
  ],
  "api": {
    "enabled": true,
    "bind": "127.0.0.1:9090",
    "token": "7a3f8b2c4d9e0f1a2b3c4d5e6f7a8b9c"
  },
  "fallback": {
    "enabled": false,
    "listen": "0.0.0.0:443",
    "target": "127.0.0.1:8080"
  },
  "reality": {
    "enabled": false,
    "dest": "www.microsoft.com:443",
    "private_key": "...",
    "pbk": "...",
    "sid": "...",
    "sni_list": ["www.microsoft.com"]
  },
  "outbound": {
    "enabled": false,
    "protocol": "socks5",
    "address": "127.0.0.1",
    "port": 9050,
    "default_action": "proxy",
    "rules": [
      {
        "domain_suffix": [".onion"],
        "action": "proxy"
      }
    ]
  },
  "debug": false
}
```

---

## Описание разделов конфигурации

### 1. Основные параметры
- **`mode`** (строка): Режим работы. Возможные варианты: `"server"`, `"client"`, `"relay"`.
- **`log_level`** (строка): Уровень логирования. Варианты: `"debug"`, `"info"`, `"warn"`, `"error"`.
- **`listen`** (строка или массив строк): Порт и интерфейсы, на которых сервер слушает входящие UDP (и опционально TCP/UoT) соединения. Примеры:
  - `"0.0.0.0:50000"` (все IPv4 интерфейсы)
  - `["0.0.0.0:50000", "[::]:50000"]` (поддержка IPv4 и IPv6 одновременно)
- **`debug`** (логический): Включает подробное отладочное логирование протокола.

---

### 2. Ключи доступа (`access_keys`)
Раздел содержит массив ключей доступа. Поддерживается два формата записи (для обратной совместимости):
1. **Простая строка**: Текст ключа доступа. Лимит трафика отсутствует.
   ```json
   "my_secure_key"
   ```
2. **Объект с метаданными**:
   - `access_key` (строка, обязательно): Текст ключа для подключения.
   - `name` (строка, опционально): Человекочитаемое описание клиента.
   - `limit_bytes` (число, опционально): Лимит трафика в байтах (загрузка + скачивание).

При достижении `limit_bytes` сессия клиента немедленно сбрасывается и подключение блокируется до обнуления счетчика или расширения лимита.

---

### 3. REST API Управления (`api`)
Используется для программного управления сервером и интеграции с внешними панелями.
- **`enabled`** (логический): Включение встроенного веб-сервера API.
- **`bind`** (строка): Интерфейс и порт для прослушивания (например, `"127.0.0.1:9090"`).
- **`token`** (строка): Bearer-токен для авторизации администратора. Автоматически генерируется сервером при команде `ostp --init server`.

---

### 4. Встроенный TCP Fallback прокси (`fallback`)
Позволяет маскировать порт под веб-сервер при сканировании активными DPI-зондами.
- **`enabled`** (логический): Включить проксирование TCP.
- **`listen`** (строка): Порт прослушивания TCP/TLS (например, `"0.0.0.0:443"`).
- **`target`** (строка): Локальный веб-сервер (например, `"127.0.0.1:8080"` на nginx/caddy), куда будут пересылаться все обычные запросы (не-OSTP трафик).

---

### 5. Reality Маскировка (`reality`)
Реализует спецификацию XTLS-Reality для бесшовной маскировки трафика под легитимный TLS-сервер.
- **`enabled`** (логический): Включение маскировки.
- **`dest`** (строка): Целевой домен маскировки (например, `"www.microsoft.com:443"`).
- **`private_key`** (строка): Приватный ключ Reality сервера (X25519).
- **`pbk`** (строка): Публичный ключ Reality сервера.
- **`sid`** (строка, 8 байт hex): Идентификатор сессии.
- **`sni_list`** (массив строк): Разрешенные SNI заголовки от клиентов.

---

### 6. Правила маршрутизации (`outbound`)
Позволяет пересылать часть исходящего трафика клиентов через прокси-сервер (например, SOCKS5/TOR).
- **`enabled`** (логический): Включить исходящую маршрутизацию.
- **`protocol`** (строка): Протокол прокси. На данный момент поддерживается `"socks5"`.
- **`address`** (строка): Хост прокси-сервера.
- **`port`** (число): Порт прокси-сервера.
- **`default_action`** (строка): Действие для трафика, не попавшего под правила. Варианты: `"direct"` (напрямую с сервера) или `"proxy"` (через прокси).
- **`rules`** (массив объектов): Список правил перенаправления:
  - `domain_suffix` (массив строк): Фильтрация по суффиксу домена.
  - `ip_cidr` (массив строк): Фильтрация по IP подсетям.
  - `action` (строка): Действие при совпадении (`"direct"` или `"proxy"`).
