> For the complete documentation index, see [llms.txt](https://incy.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://incy.gitbook.io/docs/dokumentaciya-dlya-razrabotchikov/avtorouting.md).

# Автороутинг

### Отличие от Routing

|             | Routing                            | Autorouting                                   |
| ----------- | ---------------------------------- | --------------------------------------------- |
| Данные      | Base64-профиль передаётся один раз | URL-источник, профиль скачивается по нему     |
| Обновление  | Только при обновлении подписки     | Автоматически по интервалу (по умолчанию 24ч) |
| `sourceURL` | Не устанавливается                 | Устанавливается — профиль привязан к URL      |
| Индикатор   | Нет                                | Иконка облака в списке профилей               |

### Типы ссылок

| Формат ссылки                | Описание                                                            |
| ---------------------------- | ------------------------------------------------------------------- |
| `://autorouting/onadd/{url}` | Скачивает профиль по URL, устанавливает автообновление и активирует |
| `://autorouting/add/{url}`   | Скачивает профиль по URL, устанавливает автообновление              |

> **Важно:** `://routing/onadd/{url}` **не** является авторутингом — это одноразовый импорт без автообновления. Только схема `://autorouting/` устанавливает `sourceURL` и включает автообновление.

> `{url}` — прямая ссылка на JSON-файл профиля (начинается с `http://` или `https://`).

#### Определение типа

Тип определяется **по схеме ссылки**:

* `://autorouting/` → **autorouting** (устанавливается `sourceURL`, включается автообновление)
* `://routing/` → **routing** (одноразовый импорт, без `sourceURL`, без автообновления)

Примеры:

```
://autorouting/onadd/https://example.com/profile.json   → autorouting (автообновление)
://routing/onadd/https://example.com/profile.json        → routing (одноразовый импорт)
://routing/onadd/ewogICJOYW1lIjogIlRlc3QiCn0=          → routing (base64)
```

### HTTP-заголовок

Заголовок `autorouting` содержит URL, по которому доступен JSON-профиль маршрутизации:

```
HTTP/2 200
autorouting: https://raw.githubusercontent.com/user/repo/main/profile.json
```

Профиль скачивается при обновлении подписки, сохраняется с привязкой к URL-источнику и периодически обновляется.

### Тело подписки

Строка autorouting размещается в теле подписки наряду с серверными конфигурациями:

```
vless://uuid@server1:443?security=tls#Server1
vless://uuid@server2:443?security=tls#Server2
://autorouting/onadd/https://raw.githubusercontent.com/user/repo/main/profile.json
```

### Приоритет источников

При наличии нескольких источников маршрутизации используется **первый найденный**:

| Приоритет  | Источник                | Тип             |
| ---------- | ----------------------- | --------------- |
| 1 (высший) | Заголовок `autorouting` | Автообновляемый |
| 2          | Body — строка с URL     | Автообновляемый |
| 3          | Заголовок `routing`     | Статический     |
| 4 (низший) | Body — строка с base64  | Статический     |

***

### Конвертация GitHub URL

Ссылки на файлы в GitHub-репозиториях автоматически конвертируются из «blob» формата в «raw»:

```
https://github.com/user/repo/blob/main/path/profile.json
→
https://raw.githubusercontent.com/user/repo/main/path/profile.json
```

Это происходит прозрачно при импорте и автообновлении. Можно использовать обычные GitHub-ссылки — приложение само подставит правильный URL.

***

### Контент по URL

Файл по URL может содержать:

**1. Вложенная deep link ссылка:**

Если контент начинается с `incy://` — приложение автоматически извлекает данные профиля из ссылки. Это позволяет размещать `.deeplink` файлы:

```
incy://routing/onadd/ewogICJOYW1lIjogIlJvc2NvbVZQTiIKfQ==
```

Приложение извлечёт base64-данные и декодирует профиль.

**2. JSON-профиль (рекомендуемый):**

```json
{
    "Name": "RoscomVPN",
    "GlobalProxy": "true",
    "RemoteDNSType": "DoH",
    "RemoteDNSDomain": "https://cloudflare-dns.com/dns-query",
    "RemoteDNSIP": "1.1.1.1",
    "Geoipurl": "https://example.com/geoip.dat",
    "Geositeurl": "https://example.com/geosite.dat",
    "DirectSites": ["geosite:ru"],
    "DirectIp": ["geoip:ru"],
    "DomainStrategy": "IPIfNonMatch"
}
```

**3. Base64-закодированный JSON:**

```
ewogICAgIk5hbWUiOiAiUm9zY29tVlBOIiwKICAgICJHbG9iYWxQcm94eSI6ICJ0cnVlIgp9
```

Приложение пробует: вложенную deep link → JSON → base64 (в порядке приоритета).

Структура полей профиля описана в routing.md.

***

### Автообновление

#### Механизм

* Приложение проверяет все профили с `sourceURL` каждые 30 минут
* Если с момента последнего обновления (`sourceLastUpdated`) прошло больше `updateInterval` — профиль скачивается заново
* При обновлении сохраняются: ID профиля, `sourceURL`, `updateInterval`, хеши геофайлов
* Если URL геофайлов изменились после обновления — геофайлы перекачиваются автоматически

#### Интервалы обновления

| Значение (сек) | Отображение                |
| -------------- | -------------------------- |
| `43200`        | 12 часов                   |
| `86400`        | 24 часа **(по умолчанию)** |
| `259200`       | 3 дня                      |
| `604800`       | 7 дней                     |

#### Управление в UI

Профили с `sourceURL` отображают в списке иконку облака. В редакторе профиля доступна секция «Источник обновлений»:

* **URL** — можно просмотреть и изменить URL-источник
* **Частота обновления** — выбор интервала обновления
* **Обновлено** — время последнего обновления
* **Обновить сейчас** — ручное обновление профиля
* **Удалить источник** — отвязать профиль от URL (превращает в статический)

***

### Обновление существующих профилей

* Профили с одинаковым `Name` обновляются, а не дублируются
* При обновлении автообновляемого профиля сохраняются: `sourceURL`, `updateInterval`, хеши геофайлов
* Если URL геофайлов (`Geoipurl`, `Geositeurl`) изменились — геофайлы перекачиваются автоматически
