# Миграция конфигурации OSTP v0.3.1

В версии OSTP 0.3.1 мы полностью переработали архитектуру конфигурации `config.json` для клиента. Старая монолитная структура (где все настройки были в корневом объекте) заменена на модульную систему на базе массивов `inbounds` (входящие соединения) и `outbounds` (исходящие соединения), аналогично Xray/V2Ray/Sing-box.

Это позволяет OSTP масштабироваться, поддерживать несколько прокси-серверов, несколько точек входа (SOCKS5, TUN) и сложную маршрутизацию (`routing`).

## Автоматическая миграция

В ядро `ostp` встроен автоматический мигратор. При запуске любой программы (cli, gui, flutter) ядро проверит ваш `config.json`. 

Если в конфигурации отсутствует поле `"version": "0.3.1"`, OSTP **автоматически** конвертирует ваш старый конфиг в новый модульный формат и сохранит его на диск без потери данных.

### Что происходит при миграции:

1. **TUN и SOCKS5** -> преобразуются в массив `inbounds`.
   - Настройка `socks5_bind` становится входящим `local_proxy` (SOCKS).
   - Настройка `tun` становится входящим `tun`.
2. **Сервер OSTP** -> переносится в массив `outbounds`.
   - Параметры `server`, `access_key`, `transport`, `mux` объединяются в `outbound` с типом `"ostp"`.
3. **Split Tunneling (Exclude)** -> преобразуется в `routing` правила.
   - Старые `domains` и `ips` конвертируются в правила, направляющие трафик в `"direct"` outbound.
   - Все остальные запросы по умолчанию направляются в `"proxy"` outbound.
4. **Поля `version`**
   - Добавляется поле `"version": "0.3.1"`, чтобы предотвратить повторную миграцию в будущем. Поле `_comment` было удалено.

## Пример изменения

### До 0.3.1 (Старый формат)
```json
{
  "mode": "client",
  "log_level": "info",
  "server": "1.2.3.4:50000",
  "access_key": "secret",
  "socks5_bind": "127.0.0.1:1088",
  "tun": {
    "enable": true
  },
  "exclude": {
    "domains": ["localhost"]
  }
}
```

### После 0.3.1 (Новый формат)
```json
{
  "mode": "client",
  "version": "0.3.1",
  "log": {
    "level": "info"
  },
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "auto_route": true,
      "mtu": 1140
    },
    {
      "type": "local_proxy",
      "tag": "socks-in",
      "protocol": "socks",
      "listen": "127.0.0.1",
      "port": 1088
    }
  ],
  "outbounds": [
    {
      "type": "ostp",
      "tag": "proxy",
      "server": "1.2.3.4",
      "port": 50000,
      "access_key": "secret",
      "transport": {
        "type": "udp"
      }
    },
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "block",
      "tag": "block"
    }
  ],
  "routing": {
    "rules": [
      {
        "domain_suffix": ["localhost"],
        "outbound": "direct"
      }
    ],
    "default_outbound": "proxy"
  }
}
```

## Информация для разработчиков GUI (ostp-gui, ostp-flutter)

Если вы разрабатываете интеграции или сторонние клиенты, **вам больше не нужно парсить старые поля**. Вы должны использовать массивы `inbounds` и `outbounds`. Если GUI передает `serde_json::Value` в ядро, ядро само проведет миграцию перед запуском. Однако для сохранения изменений из UI вы должны изменять именно новую структуру массивов.
