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

### Отличие от 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`) изменились — геофайлы перекачиваются автоматически


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://incy.gitbook.io/docs/dokumentaciya-dlya-razrabotchikov/avtorouting.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
