diff --git a/README.md b/README.md
index 5cfc277..20b0699 100644
--- a/README.md
+++ b/README.md
@@ -2,189 +2,60 @@
***Löst Probleme, bevor andere überhaupt wissen, dass sie existieren*** / ***It solves problems before others even realize they exist***
-### [**Telemt Chat in Telegram**](https://t.me/telemtrs)
-#### Fixed TLS ClientHello is now available in Telegram Desktop starting from version 6.7.2: to work with EE-MTProxy, please update your client;
-#### Fixed TLS ClientHello for Telegram Android Client is available in [our chat](https://t.me/telemtrs/30234/36441); official releases for Android and iOS are "work in progress";
+> [!NOTE]
+>
+> Fixed TLS ClientHello is now available in **Telegram Desktop** starting from version **6.7.2**: to work with EE-MTProxy, please update your client.
+>
+> Fixed TLS ClientHello is now available in **Telegram Android Client** starting from version **12.6.4**; **official release for iOS is "work in progress"**.
+
+
+
+
+
**Telemt** is a fast, secure, and feature-rich server written in Rust: it fully implements the official Telegram proxy algo and adds many production-ready improvements such as:
-- [ME Pool + Reader/Writer + Registry + Refill + Adaptive Floor + Trio-State + Generation Lifecycle](https://github.com/telemt/telemt/blob/main/docs/model/MODEL.en.md)
-- [Full-covered API w/ management](https://github.com/telemt/telemt/blob/main/docs/API.md)
-- Anti-Replay on Sliding Window
-- Prometheus-format Metrics
-- TLS-Fronting and TCP-Splicing for masking from "prying" eyes
+- [ME Pool + Reader/Writer + Registry + Refill + Adaptive Floor + Trio-State + Generation Lifecycle](https://github.com/telemt/telemt/blob/main/docs/model/MODEL.en.md);
+- [Full-covered API w/ management](https://github.com/telemt/telemt/blob/main/docs/API.md);
+- Anti-Replay on Sliding Window;
+- Prometheus-format Metrics;
+- TLS-Fronting and TCP-Splicing for masking from "prying" eyes.
+
+
⚓ Our implementation of **TLS-fronting** is one of the most deeply debugged, focused, advanced and *almost* **"behaviorally consistent to real"**: we are confident we have it right - [see evidence on our validation and traces](#recognizability-for-dpi-and-crawler)
⚓ Our ***Middle-End Pool*** is fastest by design in standard scenarios, compared to other implementations of connecting to the Middle-End Proxy: non dramatically, but usual
- Full support for all official MTProto proxy modes:
- - Classic
- - Secure - with `dd` prefix
- - Fake TLS - with `ee` prefix + SNI fronting
-- Replay attack protection
-- Optional traffic masking: forward unrecognized connections to a real web server, e.g. GitHub 🤪
-- Configurable keepalives + timeouts + IPv6 and "Fast Mode"
-- Graceful shutdown on Ctrl+C
-- Extensive logging via `trace` and `debug` with `RUST_LOG` method
+ - Classic;
+ - Secure - with `dd` prefix;
+ - Fake TLS - with `ee` prefix + SNI fronting;
+- Replay attack protection;
+- Optional traffic masking: forward unrecognized connections to a real web server, e.g. GitHub 🤪;
+- Configurable keepalives + timeouts + IPv6 and "Fast Mode";
+- Graceful shutdown on Ctrl+C;
+- Extensive logging via `trace` and `debug` with `RUST_LOG` method.
# GOTO
-- [Quick Start Guide](#quick-start-guide)
- [FAQ](#faq)
- - [Recognizability for DPI and crawler](#recognizability-for-dpi-and-crawler)
- - [Client WITH secret-key accesses the MTProxy resource:](#client-with-secret-key-accesses-the-mtproxy-resource)
- - [Client WITHOUT secret-key gets transparent access to the specified resource:](#client-without-secret-key-gets-transparent-access-to-the-specified-resource)
- - [Telegram Calls via MTProxy](#telegram-calls-via-mtproxy)
- - [How does DPI see MTProxy TLS?](#how-does-dpi-see-mtproxy-tls)
- - [Whitelist on IP](#whitelist-on-ip)
- - [Too many open files](#too-many-open-files)
+- [Architecture](docs/Architecture)
+- [Quick Start Guide](#quick-start-guide)
+- [Config parameters](docs/Config_params)
- [Build](#build)
- [Why Rust?](#why-rust)
- [Issues](#issues)
- [Roadmap](#roadmap)
-
## Quick Start Guide
-- [Quick Start Guide RU](docs/QUICK_START_GUIDE.ru.md)
-- [Quick Start Guide EN](docs/QUICK_START_GUIDE.en.md)
+- [Quick Start Guide RU](docs/Quick_start/QUICK_START_GUIDE.ru.md)
+- [Quick Start Guide EN](docs/Quick_start/QUICK_START_GUIDE.en.md)
## FAQ
- [FAQ RU](docs/FAQ.ru.md)
- [FAQ EN](docs/FAQ.en.md)
-### Recognizability for DPI and crawler
-
-On April 1, 2026, we became aware of a method for detecting MTProxy Fake-TLS,
-based on the ECH extension and the ordering of cipher suites,
-as well as an overall unique JA3/JA4 fingerprint
-that does not occur in modern browsers:
-we have already submitted initial changes to the Telegram Desktop developers and are working on updates for other clients.
-
-- We consider this a breakthrough aspect, which has no stable analogues today
-- Based on this: if `telemt` configured correctly, **TLS mode is completely identical to real-life handshake + communication** with a specified host
-- Here is our evidence:
- - 212.220.88.77 - "dummy" host, running `telemt`
- - `petrovich.ru` - `tls` + `masking` host, in HEX: `706574726f766963682e7275`
- - **No MITM + No Fake Certificates/Crypto** = pure transparent *TCP Splice* to "best" upstream: MTProxy or tls/mask-host:
- - DPI see legitimate HTTPS to `tls_host`, including *valid chain-of-trust* and entropy
- - Crawlers completely satisfied receiving responses from `mask_host`
- #### Client WITH secret-key accesses the MTProxy resource:
-
-
-
- #### Client WITHOUT secret-key gets transparent access to the specified resource:
- - with trusted certificate
- - with original handshake
- - with full request-response way
- - with low-latency overhead
-```bash
-root@debian:~/telemt# curl -v -I --resolve petrovich.ru:443:212.220.88.77 https://petrovich.ru/
-* Added petrovich.ru:443:212.220.88.77 to DNS cache
-* Hostname petrovich.ru was found in DNS cache
-* Trying 212.220.88.77:443...
-* Connected to petrovich.ru (212.220.88.77) port 443 (#0)
-* ALPN: offers h2,http/1.1
-* TLSv1.3 (OUT), TLS handshake, Client hello (1):
-* CAfile: /etc/ssl/certs/ca-certificates.crt
-* CApath: /etc/ssl/certs
-* TLSv1.3 (IN), TLS handshake, Server hello (2):
-* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
-* TLSv1.3 (IN), TLS handshake, Certificate (11):
-* TLSv1.3 (IN), TLS handshake, CERT verify (15):
-* TLSv1.3 (IN), TLS handshake, Finished (20):
-* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
-* TLSv1.3 (OUT), TLS handshake, Finished (20):
-* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
-* ALPN: server did not agree on a protocol. Uses default.
-* Server certificate:
-* subject: C=RU; ST=Saint Petersburg; L=Saint Petersburg; O=STD Petrovich; CN=*.petrovich.ru
-* start date: Jan 28 11:21:01 2025 GMT
-* expire date: Mar 1 11:21:00 2026 GMT
-* subjectAltName: host "petrovich.ru" matched cert's "petrovich.ru"
-* issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018
-* SSL certificate verify ok.
-* using HTTP/1.x
-> HEAD / HTTP/1.1
-> Host: petrovich.ru
-> User-Agent: curl/7.88.1
-> Accept: */*
->
-* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
-* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
-* old SSL session ID is stale, removing
-< HTTP/1.1 200 OK
-HTTP/1.1 200 OK
-< Server: Variti/0.9.3a
-Server: Variti/0.9.3a
-< Date: Thu, 01 Jan 2026 00:0000 GMT
-Date: Thu, 01 Jan 2026 00:0000 GMT
-< Access-Control-Allow-Origin: *
-Access-Control-Allow-Origin: *
-< Content-Type: text/html
-Content-Type: text/html
-< Cache-Control: no-store
-Cache-Control: no-store
-< Expires: Thu, 01 Jan 2026 00:0000 GMT
-Expires: Thu, 01 Jan 2026 00:0000 GMT
-< Pragma: no-cache
-Pragma: no-cache
-< Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/
-Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/
-< Content-Type: text/html
-Content-Type: text/html
-< Content-Length: 31253
-Content-Length: 31253
-< Connection: keep-alive
-Connection: keep-alive
-< Keep-Alive: timeout=60
-Keep-Alive: timeout=60
-
-<
-* Connection #0 to host petrovich.ru left intact
-
-```
-- We challenged ourselves, we kept trying and we didn't only *beat the air*: now, we have something to show you
- - Do not just take our word for it? - This is great and we respect that: you can build your own `telemt` or download a build and check it right now
-### Telegram Calls via MTProxy
-- Telegram architecture **does NOT allow calls via MTProxy**, but only via SOCKS5, which cannot be obfuscated
-### How does DPI see MTProxy TLS?
-- DPI sees MTProxy in Fake TLS (ee) mode as TLS 1.3
-- the SNI you specify sends both the client and the server;
-- ALPN is similar to HTTP 1.1/2;
-- high entropy, which is normal for AES-encrypted traffic;
-### Whitelist on IP
-- MTProxy cannot work when there is:
- - no IP connectivity to the target host: Russian Whitelist on Mobile Networks - "Белый список"
- - OR all TCP traffic is blocked
- - OR high entropy/encrypted traffic is blocked: content filters at universities and critical infrastructure
- - OR all TLS traffic is blocked
- - OR specified port is blocked: use 443 to make it "like real"
- - OR provided SNI is blocked: use "officially approved"/innocuous name
-- like most protocols on the Internet;
-- these situations are observed:
- - in China behind the Great Firewall
- - in Russia on mobile networks, less in wired networks
- - in Iran during "activity"
-### Too many open files
-- On a fresh Linux install the default open file limit is low; under load `telemt` may fail with `Accept error: Too many open files`
-- **Systemd**: add `LimitNOFILE=65536` to the `[Service]` section (already included in the example above)
-- **Docker**: add `--ulimit nofile=65536:65536` to your `docker run` command, or in `docker-compose.yml`:
-```yaml
-ulimits:
- nofile:
- soft: 65536
- hard: 65536
-```
-- **System-wide** (optional): add to `/etc/security/limits.conf`:
-```
-* soft nofile 1048576
-* hard nofile 1048576
-root soft nofile 1048576
-root hard nofile 1048576
-```
-
-
## Build
```bash
# Cloning repo
@@ -207,7 +78,7 @@ telemt config.toml
```
### OpenBSD
-- Build and service setup guide: [OpenBSD Guide (EN)](docs/OPENBSD.en.md)
+- Build and service setup guide: [OpenBSD Guide (EN)](docs/Quick_start/OPENBSD_QUICK_START_GUIDE.en.md)
- Example rc.d script: [contrib/openbsd/telemt.rcd](contrib/openbsd/telemt.rcd)
- Status: OpenBSD sandbox hardening with `pledge(2)` and `unveil(2)` is not implemented yet.
diff --git a/README.ru.md b/README.ru.md
new file mode 100644
index 0000000..aaf4aee
--- /dev/null
+++ b/README.ru.md
@@ -0,0 +1,123 @@
+# Telemt — MTProxy на Rust + Tokio
+
+***Решает проблемы раньше, чем другие узнают об их существовании***
+
+> [!Примечание]
+>
+> Исправленный TLS ClientHello доступен в **Telegram Desktop** начиная с версии **6.7.2**: для работы с EE-MTProxy обновите клиент.
+>
+> Исправленный TLS ClientHello доступен в **Telegram Android** начиная с версии **12.6.4**; **официальный релиз для iOS находится в процессе разработки**.
+
+
+
+
+
+
+
+**Telemt** — это быстрый, безопасный и функциональный сервер, написанный на Rust. Он полностью реализует официальный алгоритм прокси Telegram и добавляет множество улучшений для продакшена:
+
+- [ME Pool + Reader/Writer + Registry + Refill + Adaptive Floor + Trio-State + жизненный цикл генераций](https://github.com/telemt/telemt/blob/main/docs/model/MODEL.en.md);
+- [Полноценный API с управлением](https://github.com/telemt/telemt/blob/main/docs/API.md);
+- Защита от повторных атак (Anti-Replay on Sliding Window);
+- Метрики в формате Prometheus;
+- TLS-fronting и TCP-splicing для маскировки от DPI.
+
+
+
+## Особенности
+
+⚓ Реализация **TLS-fronting** максимально приближена к поведению реального HTTPS-трафика.
+
+⚓ ***Middle-End Pool*** оптимизирован для высокой производительности.
+
+- Поддержка всех режимов MTProto proxy:
+ - Classic;
+ - Secure (префикс `dd`);
+ - Fake TLS (префикс `ee` + SNI fronting);
+- Защита от replay-атак;
+- Маскировка трафика (перенаправление неизвестных подключений на реальные сайты);
+- Настраиваемые keepalive, таймауты, IPv6 и «быстрый режим»;
+- Корректное завершение работы (Ctrl+C);
+- Подробное логирование через `trace` и `debug`.
+
+# Навигация
+- [FAQ](#faq)
+- [Архитектура](docs/Architecture)
+- [Быстрый старт](#quick-start-guide)
+- [Параметры конфигурационного файла](docs/Config_params)
+- [Сборка](#build)
+- [Почему Rust?](#why-rust)
+- [Известные проблемы](#issues)
+- [Планы](#roadmap)
+
+## Быстрый старт
+- [Quick Start Guide RU](docs/Quick_start/QUICK_START_GUIDE.ru.md)
+- [Quick Start Guide EN](docs/Quick_start/QUICK_START_GUIDE.en.md)
+
+## FAQ
+
+- [FAQ RU](docs/FAQ.ru.md)
+- [FAQ EN](docs/FAQ.en.md)
+
+## Сборка
+
+```bash
+# Клонируйте репозиторий
+git clone https://github.com/telemt/telemt
+# Смените каталог на telemt
+cd telemt
+# Начните процесс сборки
+cargo build --release
+
+# Устройства с небольшим объёмом оперативной памяти (1 ГБ, например NanoPi Neo3 / Raspberry Pi Zero 2):
+# используется параметр lto = «thin» для уменьшения пикового потребления памяти.
+# Если ваш пользовательский набор инструментов переопределяет профили, не используйте Fat LTO.
+
+# Перейдите в каталог /bin
+mv ./target/release/telemt /bin
+# Сделайте файл исполняемым
+chmod +x /bin/telemt
+# Запустите!
+telemt config.toml
+```
+
+### Устройства с малым объемом RAM
+Для устройств с ~1 ГБ RAM (например Raspberry Pi):
+- используется облегчённая оптимизация линковщика (thin LTO);
+- не рекомендуется включать fat LTO.
+
+## OpenBSD
+
+- Руководство по сборке и настройке на английском языке [OpenBSD Guide (EN)](docs/Quick_start/OPENBSD_QUICK_START_GUIDE.en.md);
+- Пример rc.d скрипта: [contrib/openbsd/telemt.rcd](contrib/openbsd/telemt.rcd);
+- Поддержка sandbox с `pledge(2)` и `unveil(2)` пока не реализована.
+
+## Почему Rust?
+
+- Надёжность для долгоживущих процессов;
+- Детерминированное управление ресурсами (RAII);
+- Отсутствие сборщика мусора;
+- Безопасность памяти;
+- Асинхронная архитектура Tokio.
+
+## Известные проблемы
+
+- ✅ [Поддержка SOCKS5 как upstream](https://github.com/telemt/telemt/issues/1) -> добавлен Upstream Management;
+- ✅ [Проблема зависания загрузки медиа на iOS](https://github.com/telemt/telemt/issues/2).
+
+## Планы
+
+- Публичный IP в ссылках;
+- Перезагрузка конфигурации на лету;
+- Привязка к устройству или IP для входящих и исходящих соединений;
+- Поддержка рекламных тегов по SNI / секретному ключу;
+- Улучшенная обработка ошибок;
+- Zero-copy оптимизации;
+- Проверка состояния дата-центров;
+- Отсутствие глобального изменяемого состояния;
+- Изоляция клиентов и справедливое распределение трафика;
+- «Политика секретов» — маршрутизация по SNI / секрету;
+- Балансировщик с несколькими источниками и отработка отказов;
+- Строгие FSM для handshake;
+- Улучшенная защита от replay-атак;
+- Веб-интерфейс: статистика, состояние работоспособности, задержка, пользовательский опыт...
diff --git a/docs/TUNING.de.md b/docs/Advanced_settings/TUNING.de.md
similarity index 100%
rename from docs/TUNING.de.md
rename to docs/Advanced_settings/TUNING.de.md
diff --git a/docs/TUNING.en.md b/docs/Advanced_settings/TUNING.en.md
similarity index 100%
rename from docs/TUNING.en.md
rename to docs/Advanced_settings/TUNING.en.md
diff --git a/docs/TUNING.ru.md b/docs/Advanced_settings/TUNING.ru.md
similarity index 100%
rename from docs/TUNING.ru.md
rename to docs/Advanced_settings/TUNING.ru.md
diff --git a/docs/API.md b/docs/Architecture/API/API.md
similarity index 100%
rename from docs/API.md
rename to docs/Architecture/API/API.md
diff --git a/docs/fronting-splitting/TLS-F-TCP-S.ru.md b/docs/Architecture/Fronting-splitting/TLS-F-TCP-S.ru.md
similarity index 100%
rename from docs/fronting-splitting/TLS-F-TCP-S.ru.md
rename to docs/Architecture/Fronting-splitting/TLS-F-TCP-S.ru.md
diff --git a/docs/middle-end/KDF-internals/MIDDLE-END-KDF.de.md b/docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.de.md
similarity index 100%
rename from docs/middle-end/KDF-internals/MIDDLE-END-KDF.de.md
rename to docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.de.md
diff --git a/docs/middle-end/KDF-internals/MIDDLE-END-KDF.en.md b/docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.en.md
similarity index 100%
rename from docs/middle-end/KDF-internals/MIDDLE-END-KDF.en.md
rename to docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.en.md
diff --git a/docs/middle-end/KDF-internals/MIDDLE-END-KDF.ru.md b/docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.ru.md
similarity index 100%
rename from docs/middle-end/KDF-internals/MIDDLE-END-KDF.ru.md
rename to docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.ru.md
diff --git a/docs/model/FakeTLS.png b/docs/Architecture/Model/FakeTLS.png
similarity index 100%
rename from docs/model/FakeTLS.png
rename to docs/Architecture/Model/FakeTLS.png
diff --git a/docs/model/MODEL.en.md b/docs/Architecture/Model/MODEL.en.md
similarity index 100%
rename from docs/model/MODEL.en.md
rename to docs/Architecture/Model/MODEL.en.md
diff --git a/docs/model/MODEL.ru.md b/docs/Architecture/Model/MODEL.ru.md
similarity index 100%
rename from docs/model/MODEL.ru.md
rename to docs/Architecture/Model/MODEL.ru.md
diff --git a/docs/model/architecture.png b/docs/Architecture/Model/architecture.png
similarity index 100%
rename from docs/model/architecture.png
rename to docs/Architecture/Model/architecture.png
diff --git a/docs/CONFIG_PARAMS.en.md b/docs/Config_params/CONFIG_PARAMS.en.md
similarity index 100%
rename from docs/CONFIG_PARAMS.en.md
rename to docs/Config_params/CONFIG_PARAMS.en.md
diff --git a/docs/Config_params/CONFIG_PARAMS.ru.md b/docs/Config_params/CONFIG_PARAMS.ru.md
new file mode 100644
index 0000000..7dc15c4
--- /dev/null
+++ b/docs/Config_params/CONFIG_PARAMS.ru.md
@@ -0,0 +1,3300 @@
+# Справочник параметров конфигурации Telemt
+
+В этом документе перечислены все ключи конфигурации, принимаемые `config.toml`.
+
+> [!ПРИМЕЧАНИЕ]
+>
+> Этот справочник был составлен с помощью искусственного интеллекта и сверен с базой кода (схема конфигурации, значения по умолчанию и логика проверки).
+
+> [!ПРЕДУПРЕЖДЕНИЕ]
+>
+> Параметры конфигурации, подробно описанные в этом документе, предназначены для опытных пользователей и для целей тонкой настройки. Изменение этих параметров без четкого понимания их функции может привести к нестабильности приложения или другому неожиданному поведению. Пожалуйста, действуйте осторожно и на свой страх и риск.
+
+## Ключи верхнего уровня
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`include`](#cfg-top-include) | `String` (special directive) | — |
+| [`show_link`](#cfg-top-show_link) | `"*"` or `String[]` | `[]` (`ShowLink::None`) |
+| [`dc_overrides`](#cfg-top-dc_overrides) | `Map` | `{}` |
+| [`default_dc`](#cfg-top-default_dc) | `u8` | — (effective fallback: `2` in ME routing) |
+
+
+- `include`
+ - **Ограничения / валидация**: Должна быть однострочной директивой в форме `include = "path/to/file.toml"`. Включения расширяются перед анализом TOML. Максимальная глубина включения — 10.
+ - **Описание**: Включает еще один файл TOML с помощью `include = "relative/or/absolute/path.toml"`; включения обрабатываются рекурсивно перед анализом.
+ - **Пример**:
+
+ ```toml
+ include = "secrets.toml"
+ ```
+
+- `show_link`
+ - **Ограничения / валидация**: Принимает `"*"` или массив имен пользователей. Пустой массив означает «не показывать ничего».
+ - **Описание**: Устаревший селектор видимости ссылок верхнего уровня («*»` для всех пользователей или списка явных имен пользователей).
+ - **Пример**:
+
+ ```toml
+ # show links for all configured users
+ show_link = "*"
+
+ # or: show links only for selected users
+ # show_link = ["alice", "bob"]
+ ```
+
+- `dc_overrides`
+ - **Ограничения / валидация**: Ключ должен быть положительным целочисленным индексом DC, закодированным как строка (например, `"203"`). Значения должны анализироваться как `SocketAddr` (`ip:port`). Пустые строки игнорируются.
+ - **Описание**: Переопределяет конечные точки контроллера домена для нестандартных контроллеров домена; ключ — индексная строка контроллера домена, значение — один или несколько адресов `ip:port`.
+ - **Пример**:
+
+ ```toml
+ [dc_overrides]
+ "201" = "149.154.175.50:443"
+ "203" = ["149.154.175.100:443", "91.105.192.100:443"]
+ ```
+
+- `default_dc`
+ - **Ограничения / валидация**: Предполагаемый диапазон: «1..=5». Если этот параметр выходит за пределы диапазона, время выполнения возвращается к поведению DC1 в прямом реле; Маршрутизация среднего уровня возвращается к значению «2», если она не установлена.
+ - **Описание**: Индекс контроллера домена по умолчанию, используемый для несопоставленных нестандартных контроллеров домена.
+ - **Пример**:
+
+ ```toml
+ # When a client requests an unknown/non-standard DC with no override,
+ # route it to this default cluster (1..=5).
+ default_dc = 2
+ ```
+
+## [general]
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`data_path`](#cfg-general-data_path) | `String` | — |
+| [`prefer_ipv6`](#cfg-general-prefer_ipv6) | `bool` | `false` |
+| [`fast_mode`](#cfg-general-fast_mode) | `bool` | `true` |
+| [`use_middle_proxy`](#cfg-general-use_middle_proxy) | `bool` | `true` |
+| [`proxy_secret_path`](#cfg-general-proxy_secret_path) | `String` | `"proxy-secret"` |
+| [`proxy_config_v4_cache_path`](#cfg-general-proxy_config_v4_cache_path) | `String` | `"cache/proxy-config-v4.txt"` |
+| [`proxy_config_v6_cache_path`](#cfg-general-proxy_config_v6_cache_path) | `String` | `"cache/proxy-config-v6.txt"` |
+| [`ad_tag`](#cfg-general-ad_tag) | `String` | — |
+| [`middle_proxy_nat_ip`](#cfg-general-middle_proxy_nat_ip) | `IpAddr` | — |
+| [`middle_proxy_nat_probe`](#cfg-general-middle_proxy_nat_probe) | `bool` | `true` |
+| [`middle_proxy_nat_stun`](#cfg-general-middle_proxy_nat_stun) | `String` | — |
+| [`middle_proxy_nat_stun_servers`](#cfg-general-middle_proxy_nat_stun_servers) | `String[]` | `[]` |
+| [`stun_nat_probe_concurrency`](#cfg-general-stun_nat_probe_concurrency) | `usize` | `8` |
+| [`middle_proxy_pool_size`](#cfg-general-middle_proxy_pool_size) | `usize` | `8` |
+| [`middle_proxy_warm_standby`](#cfg-general-middle_proxy_warm_standby) | `usize` | `16` |
+| [`me_init_retry_attempts`](#cfg-general-me_init_retry_attempts) | `u32` | `0` |
+| [`me2dc_fallback`](#cfg-general-me2dc_fallback) | `bool` | `true` |
+| [`me2dc_fast`](#cfg-general-me2dc_fast) | `bool` | `false` |
+| [`me_keepalive_enabled`](#cfg-general-me_keepalive_enabled) | `bool` | `true` |
+| [`me_keepalive_interval_secs`](#cfg-general-me_keepalive_interval_secs) | `u64` | `8` |
+| [`me_keepalive_jitter_secs`](#cfg-general-me_keepalive_jitter_secs) | `u64` | `2` |
+| [`me_keepalive_payload_random`](#cfg-general-me_keepalive_payload_random) | `bool` | `true` |
+| [`rpc_proxy_req_every`](#cfg-general-rpc_proxy_req_every) | `u64` | `0` |
+| [`me_writer_cmd_channel_capacity`](#cfg-general-me_writer_cmd_channel_capacity) | `usize` | `4096` |
+| [`me_route_channel_capacity`](#cfg-general-me_route_channel_capacity) | `usize` | `768` |
+| [`me_c2me_channel_capacity`](#cfg-general-me_c2me_channel_capacity) | `usize` | `1024` |
+| [`me_c2me_send_timeout_ms`](#cfg-general-me_c2me_send_timeout_ms) | `u64` | `4000` |
+| [`me_reader_route_data_wait_ms`](#cfg-general-me_reader_route_data_wait_ms) | `u64` | `2` |
+| [`me_d2c_flush_batch_max_frames`](#cfg-general-me_d2c_flush_batch_max_frames) | `usize` | `32` |
+| [`me_d2c_flush_batch_max_bytes`](#cfg-general-me_d2c_flush_batch_max_bytes) | `usize` | `131072` |
+| [`me_d2c_flush_batch_max_delay_us`](#cfg-general-me_d2c_flush_batch_max_delay_us) | `u64` | `500` |
+| [`me_d2c_ack_flush_immediate`](#cfg-general-me_d2c_ack_flush_immediate) | `bool` | `true` |
+| [`me_quota_soft_overshoot_bytes`](#cfg-general-me_quota_soft_overshoot_bytes) | `u64` | `65536` |
+| [`me_d2c_frame_buf_shrink_threshold_bytes`](#cfg-general-me_d2c_frame_buf_shrink_threshold_bytes) | `usize` | `262144` |
+| [`direct_relay_copy_buf_c2s_bytes`](#cfg-general-direct_relay_copy_buf_c2s_bytes) | `usize` | `65536` |
+| [`direct_relay_copy_buf_s2c_bytes`](#cfg-general-direct_relay_copy_buf_s2c_bytes) | `usize` | `262144` |
+| [`crypto_pending_buffer`](#cfg-general-crypto_pending_buffer) | `usize` | `262144` |
+| [`max_client_frame`](#cfg-general-max_client_frame) | `usize` | `16777216` |
+| [`desync_all_full`](#cfg-general-desync_all_full) | `bool` | `false` |
+| [`beobachten`](#cfg-general-beobachten) | `bool` | `true` |
+| [`beobachten_minutes`](#cfg-general-beobachten_minutes) | `u64` | `10` |
+| [`beobachten_flush_secs`](#cfg-general-beobachten_flush_secs) | `u64` | `15` |
+| [`beobachten_file`](#cfg-general-beobachten_file) | `String` | `"cache/beobachten.txt"` |
+| [`hardswap`](#cfg-general-hardswap) | `bool` | `true` |
+| [`me_warmup_stagger_enabled`](#cfg-general-me_warmup_stagger_enabled) | `bool` | `true` |
+| [`me_warmup_step_delay_ms`](#cfg-general-me_warmup_step_delay_ms) | `u64` | `500` |
+| [`me_warmup_step_jitter_ms`](#cfg-general-me_warmup_step_jitter_ms) | `u64` | `300` |
+| [`me_reconnect_max_concurrent_per_dc`](#cfg-general-me_reconnect_max_concurrent_per_dc) | `u32` | `8` |
+| [`me_reconnect_backoff_base_ms`](#cfg-general-me_reconnect_backoff_base_ms) | `u64` | `500` |
+| [`me_reconnect_backoff_cap_ms`](#cfg-general-me_reconnect_backoff_cap_ms) | `u64` | `30000` |
+| [`me_reconnect_fast_retry_count`](#cfg-general-me_reconnect_fast_retry_count) | `u32` | `16` |
+| [`me_single_endpoint_shadow_writers`](#cfg-general-me_single_endpoint_shadow_writers) | `u8` | `2` |
+| [`me_single_endpoint_outage_mode_enabled`](#cfg-general-me_single_endpoint_outage_mode_enabled) | `bool` | `true` |
+| [`me_single_endpoint_outage_disable_quarantine`](#cfg-general-me_single_endpoint_outage_disable_quarantine) | `bool` | `true` |
+| [`me_single_endpoint_outage_backoff_min_ms`](#cfg-general-me_single_endpoint_outage_backoff_min_ms) | `u64` | `250` |
+| [`me_single_endpoint_outage_backoff_max_ms`](#cfg-general-me_single_endpoint_outage_backoff_max_ms) | `u64` | `3000` |
+| [`me_single_endpoint_shadow_rotate_every_secs`](#cfg-general-me_single_endpoint_shadow_rotate_every_secs) | `u64` | `900` |
+| [`me_floor_mode`](#cfg-general-me_floor_mode) | `"static"` or `"adaptive"` | `"adaptive"` |
+| [`me_adaptive_floor_idle_secs`](#cfg-general-me_adaptive_floor_idle_secs) | `u64` | `90` |
+| [`me_adaptive_floor_min_writers_single_endpoint`](#cfg-general-me_adaptive_floor_min_writers_single_endpoint) | `u8` | `1` |
+| [`me_adaptive_floor_min_writers_multi_endpoint`](#cfg-general-me_adaptive_floor_min_writers_multi_endpoint) | `u8` | `1` |
+| [`me_adaptive_floor_recover_grace_secs`](#cfg-general-me_adaptive_floor_recover_grace_secs) | `u64` | `180` |
+| [`me_adaptive_floor_writers_per_core_total`](#cfg-general-me_adaptive_floor_writers_per_core_total) | `u16` | `48` |
+| [`me_adaptive_floor_cpu_cores_override`](#cfg-general-me_adaptive_floor_cpu_cores_override) | `u16` | `0` |
+| [`me_adaptive_floor_max_extra_writers_single_per_core`](#cfg-general-me_adaptive_floor_max_extra_writers_single_per_core) | `u16` | `1` |
+| [`me_adaptive_floor_max_extra_writers_multi_per_core`](#cfg-general-me_adaptive_floor_max_extra_writers_multi_per_core) | `u16` | `2` |
+| [`me_adaptive_floor_max_active_writers_per_core`](#cfg-general-me_adaptive_floor_max_active_writers_per_core) | `u16` | `64` |
+| [`me_adaptive_floor_max_warm_writers_per_core`](#cfg-general-me_adaptive_floor_max_warm_writers_per_core) | `u16` | `64` |
+| [`me_adaptive_floor_max_active_writers_global`](#cfg-general-me_adaptive_floor_max_active_writers_global) | `u32` | `256` |
+| [`me_adaptive_floor_max_warm_writers_global`](#cfg-general-me_adaptive_floor_max_warm_writers_global) | `u32` | `256` |
+| [`upstream_connect_retry_attempts`](#cfg-general-upstream_connect_retry_attempts) | `u32` | `2` |
+| [`upstream_connect_retry_backoff_ms`](#cfg-general-upstream_connect_retry_backoff_ms) | `u64` | `100` |
+| [`upstream_connect_budget_ms`](#cfg-general-upstream_connect_budget_ms) | `u64` | `3000` |
+| [`upstream_unhealthy_fail_threshold`](#cfg-general-upstream_unhealthy_fail_threshold) | `u32` | `5` |
+| [`upstream_connect_failfast_hard_errors`](#cfg-general-upstream_connect_failfast_hard_errors) | `bool` | `false` |
+| [`stun_iface_mismatch_ignore`](#cfg-general-stun_iface_mismatch_ignore) | `bool` | `false` |
+| [`unknown_dc_log_path`](#cfg-general-unknown_dc_log_path) | `String` | `"unknown-dc.txt"` |
+| [`unknown_dc_file_log_enabled`](#cfg-general-unknown_dc_file_log_enabled) | `bool` | `false` |
+| [`log_level`](#cfg-general-log_level) | `"debug"`, `"verbose"`, `"normal"`, or `"silent"` | `"normal"` |
+| [`disable_colors`](#cfg-general-disable_colors) | `bool` | `false` |
+| [`me_socks_kdf_policy`](#cfg-general-me_socks_kdf_policy) | `"strict"` or `"compat"` | `"strict"` |
+| [`me_route_backpressure_base_timeout_ms`](#cfg-general-me_route_backpressure_base_timeout_ms) | `u64` | `25` |
+| [`me_route_backpressure_high_timeout_ms`](#cfg-general-me_route_backpressure_high_timeout_ms) | `u64` | `120` |
+| [`me_route_backpressure_high_watermark_pct`](#cfg-general-me_route_backpressure_high_watermark_pct) | `u8` | `80` |
+| [`me_health_interval_ms_unhealthy`](#cfg-general-me_health_interval_ms_unhealthy) | `u64` | `1000` |
+| [`me_health_interval_ms_healthy`](#cfg-general-me_health_interval_ms_healthy) | `u64` | `3000` |
+| [`me_admission_poll_ms`](#cfg-general-me_admission_poll_ms) | `u64` | `1000` |
+| [`me_warn_rate_limit_ms`](#cfg-general-me_warn_rate_limit_ms) | `u64` | `5000` |
+| [`me_route_no_writer_mode`](#cfg-general-me_route_no_writer_mode) | `"async_recovery_failfast"`, `"inline_recovery_legacy"`, or `"hybrid_async_persistent"` | `"hybrid_async_persistent"` |
+| [`me_route_no_writer_wait_ms`](#cfg-general-me_route_no_writer_wait_ms) | `u64` | `250` |
+| [`me_route_hybrid_max_wait_ms`](#cfg-general-me_route_hybrid_max_wait_ms) | `u64` | `3000` |
+| [`me_route_blocking_send_timeout_ms`](#cfg-general-me_route_blocking_send_timeout_ms) | `u64` | `250` |
+| [`me_route_inline_recovery_attempts`](#cfg-general-me_route_inline_recovery_attempts) | `u32` | `3` |
+| [`me_route_inline_recovery_wait_ms`](#cfg-general-me_route_inline_recovery_wait_ms) | `u64` | `3000` |
+| [`fast_mode_min_tls_record`](#cfg-general-fast_mode_min_tls_record) | `usize` | `0` |
+| [`update_every`](#cfg-general-update_every) | `u64` | `300` |
+| [`me_reinit_every_secs`](#cfg-general-me_reinit_every_secs) | `u64` | `900` |
+| [`me_hardswap_warmup_delay_min_ms`](#cfg-general-me_hardswap_warmup_delay_min_ms) | `u64` | `1000` |
+| [`me_hardswap_warmup_delay_max_ms`](#cfg-general-me_hardswap_warmup_delay_max_ms) | `u64` | `2000` |
+| [`me_hardswap_warmup_extra_passes`](#cfg-general-me_hardswap_warmup_extra_passes) | `u8` | `3` |
+| [`me_hardswap_warmup_pass_backoff_base_ms`](#cfg-general-me_hardswap_warmup_pass_backoff_base_ms) | `u64` | `500` |
+| [`me_config_stable_snapshots`](#cfg-general-me_config_stable_snapshots) | `u8` | `2` |
+| [`me_config_apply_cooldown_secs`](#cfg-general-me_config_apply_cooldown_secs) | `u64` | `300` |
+| [`me_snapshot_require_http_2xx`](#cfg-general-me_snapshot_require_http_2xx) | `bool` | `true` |
+| [`me_snapshot_reject_empty_map`](#cfg-general-me_snapshot_reject_empty_map) | `bool` | `true` |
+| [`me_snapshot_min_proxy_for_lines`](#cfg-general-me_snapshot_min_proxy_for_lines) | `u32` | `1` |
+| [`proxy_secret_stable_snapshots`](#cfg-general-proxy_secret_stable_snapshots) | `u8` | `2` |
+| [`proxy_secret_rotate_runtime`](#cfg-general-proxy_secret_rotate_runtime) | `bool` | `true` |
+| [`me_secret_atomic_snapshot`](#cfg-general-me_secret_atomic_snapshot) | `bool` | `true` |
+| [`proxy_secret_len_max`](#cfg-general-proxy_secret_len_max) | `usize` | `256` |
+| [`me_pool_drain_ttl_secs`](#cfg-general-me_pool_drain_ttl_secs) | `u64` | `90` |
+| [`me_instadrain`](#cfg-general-me_instadrain) | `bool` | `false` |
+| [`me_pool_drain_threshold`](#cfg-general-me_pool_drain_threshold) | `u64` | `32` |
+| [`me_pool_drain_soft_evict_enabled`](#cfg-general-me_pool_drain_soft_evict_enabled) | `bool` | `true` |
+| [`me_pool_drain_soft_evict_grace_secs`](#cfg-general-me_pool_drain_soft_evict_grace_secs) | `u64` | `10` |
+| [`me_pool_drain_soft_evict_per_writer`](#cfg-general-me_pool_drain_soft_evict_per_writer) | `u8` | `2` |
+| [`me_pool_drain_soft_evict_budget_per_core`](#cfg-general-me_pool_drain_soft_evict_budget_per_core) | `u16` | `16` |
+| [`me_pool_drain_soft_evict_cooldown_ms`](#cfg-general-me_pool_drain_soft_evict_cooldown_ms) | `u64` | `1000` |
+| [`me_bind_stale_mode`](#cfg-general-me_bind_stale_mode) | `"never"`, `"ttl"`, or `"always"` | `"ttl"` |
+| [`me_bind_stale_ttl_secs`](#cfg-general-me_bind_stale_ttl_secs) | `u64` | `90` |
+| [`me_pool_min_fresh_ratio`](#cfg-general-me_pool_min_fresh_ratio) | `f32` | `0.8` |
+| [`me_reinit_drain_timeout_secs`](#cfg-general-me_reinit_drain_timeout_secs) | `u64` | `90` |
+| [`proxy_secret_auto_reload_secs`](#cfg-general-proxy_secret_auto_reload_secs) | `u64` | `3600` |
+| [`proxy_config_auto_reload_secs`](#cfg-general-proxy_config_auto_reload_secs) | `u64` | `3600` |
+| [`me_reinit_singleflight`](#cfg-general-me_reinit_singleflight) | `bool` | `true` |
+| [`me_reinit_trigger_channel`](#cfg-general-me_reinit_trigger_channel) | `usize` | `64` |
+| [`me_reinit_coalesce_window_ms`](#cfg-general-me_reinit_coalesce_window_ms) | `u64` | `200` |
+| [`me_deterministic_writer_sort`](#cfg-general-me_deterministic_writer_sort) | `bool` | `true` |
+| [`me_writer_pick_mode`](#cfg-general-me_writer_pick_mode) | `"sorted_rr"` or `"p2c"` | `"p2c"` |
+| [`me_writer_pick_sample_size`](#cfg-general-me_writer_pick_sample_size) | `u8` | `3` |
+| [`ntp_check`](#cfg-general-ntp_check) | `bool` | `true` |
+| [`ntp_servers`](#cfg-general-ntp_servers) | `String[]` | `["pool.ntp.org"]` |
+| [`auto_degradation_enabled`](#cfg-general-auto_degradation_enabled) | `bool` | `true` |
+| [`degradation_min_unavailable_dc_groups`](#cfg-general-degradation_min_unavailable_dc_groups) | `u8` | `2` |
+
+
+- `data_path`
+ - **Ограничения / валидация**: `Строка` (необязательно).
+ - **Описание**: Необязательный путь к каталогу данных времени выполнения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ data_path = "/var/lib/telemt"
+ ```
+
+- `prefer_ipv6`
+ - **Ограничения / валидация**: Устарело. Используйте `network.prefer`.
+ - **Описание**: Устаревший устаревший флаг предпочтения IPv6 перенесен в network.prefer.
+ - **Пример**:
+
+ ```toml
+ [network]
+ prefer = 6
+ ```
+
+- `fast_mode`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает оптимизацию быстрого пути для обработки трафика.
+ - **Пример**:
+
+ ```toml
+ [general]
+ fast_mode = true
+ ```
+
+- `use_middle_proxy`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает транспортный режим ME; если значение false, среда выполнения возвращается к прямой маршрутизации постоянного тока.
+ - **Пример**:
+
+ ```toml
+ [general]
+ use_middle_proxy = true
+ ```
+
+- `proxy_secret_path`
+ - **Ограничения / валидация**: `Строка`. Если этот параметр опущен, путь по умолчанию — «proxy-secret». Пустые значения принимаются TOML/serde, но, скорее всего, во время выполнения произойдет ошибка (неверный путь к файлу).
+ - **Описание**: Путь к файлу кэша `proxy-secret` инфраструктуры Telegram, используемому ME-рукопожатием/аутентификацией RPC. Telemt всегда сначала пытается выполнить новую загрузку с https://core.telegram.org/getProxySecret, в случае успеха кэширует ее по этому пути и возвращается к чтению кэшированного файла (любого возраста) в случае сбоя загрузки.
+ - **Пример**:
+
+ ```toml
+ [general]
+ proxy_secret_path = "proxy-secret"
+ ```
+
+- `proxy_config_v4_cache_path`
+ - **Ограничения / валидация**: `Строка`. Если установлено, оно не должно быть пустым или содержать только пробелы.
+ - **Описание**: Необязательный путь к дисковому кэшу для необработанного снимка getProxyConfig (IPv4). При запуске Telemt сначала пытается получить свежий снимок; в случае сбоя выборки или пустого снимка он возвращается к этому файлу кэша, если он присутствует и не пуст.
+ - **Пример**:
+
+ ```toml
+ [general]
+ proxy_config_v4_cache_path = "cache/proxy-config-v4.txt"
+ ```
+
+- `proxy_config_v6_cache_path`
+ - **Ограничения / валидация**: `Строка`. Если установлено, оно не должно быть пустым или содержать только пробелы.
+ - **Описание**: Необязательный путь к дисковому кэшу для необработанного снимка getProxyConfigV6 (IPv6). При запуске Telemt сначала пытается получить свежий снимок; в случае сбоя выборки или пустого снимка он возвращается к этому файлу кэша, если он присутствует и не пуст.
+ - **Пример**:
+
+ ```toml
+ [general]
+ proxy_config_v6_cache_path = "cache/proxy-config-v6.txt"
+ ```
+
+- `ad_tag`
+ - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, должно быть ровно 32 шестнадцатеричных символа; недопустимые значения отключаются во время загрузки конфигурации.
+ - **Описание**: Глобальный резервный спонсируемый канал `ad_tag` (используется, когда у пользователя нет переопределения в `access.user_ad_tags`). Тег со всеми нулями принимается, но не имеет никакого эффекта (и о нем предупреждается), пока не будет заменен реальным тегом от `@MTProxybot`.
+ - **Пример**:
+
+ ```toml
+ [general]
+ ad_tag = "00112233445566778899aabbccddeeff"
+ ```
+
+- `middle_proxy_nat_ip`
+ - **Ограничения / валидация**: `IpAddr` (необязательно).
+ - **Описание**: Ручное переопределение общедоступного IP-адреса NAT используется в качестве материала ME-адреса, если оно установлено.
+ - **Пример**:
+
+ ```toml
+ [general]
+ middle_proxy_nat_ip = "203.0.113.10"
+ ```
+
+- `middle_proxy_nat_probe`
+ - **Ограничения / валидация**: `бул`. Эффективное зондирование ограничивается `network.stun_use` (когда `network.stun_use = false`, STUN-зондирование отключается, даже если этот флаг имеет значение `true`).
+ - **Описание**: Позволяет зондировать NAT на основе STUN для обнаружения общедоступного IP-порта, используемого при получении ключа ME в средах NAT.
+ - **Пример**:
+
+ ```toml
+ [general]
+ middle_proxy_nat_probe = true
+ ```
+
+- `middle_proxy_nat_stun`
+ - **Ограничения / валидация**: Устарело. Используйте `network.stun_servers`.
+ - **Описание**: Устаревший устаревший одиночный сервер STUN для проверки NAT. Во время загрузки конфигурации он объединяется с `network.stun_servers`, если `network.stun_servers` не задан явно.
+ - **Пример**:
+
+ ```toml
+ [network]
+ stun_servers = ["stun.l.google.com:19302"]
+ ```
+
+- `middle_proxy_nat_stun_servers`
+ - **Ограничения / валидация**: Устарело. Используйте `network.stun_servers`.
+ - **Описание**: Устаревший устаревший список STUN для резервного копирования NAT. Во время загрузки конфигурации он объединяется с `network.stun_servers`, если `network.stun_servers` не задан явно.
+ - **Пример**:
+
+ ```toml
+ [network]
+ stun_servers = ["stun.l.google.com:19302"]
+ ```
+
+- `stun_nat_probe_concurrency`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Максимальное количество параллельных тестов STUN во время обнаружения NAT/публичной конечной точки.
+ - **Пример**:
+
+ ```toml
+ [general]
+ stun_nat_probe_concurrency = 8
+ ```
+
+- `middle_proxy_pool_size`
+ - **Ограничения / валидация**: `использовать`. Эффективное значение — «max(value, 1)» во время выполнения (поэтому «0» ведет себя как «1»).
+ - **Описание**: Целевой размер активного пула устройств записи ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ middle_proxy_pool_size = 8
+ ```
+
+- `middle_proxy_warm_standby`
+ - **Ограничения / валидация**: `использовать`.
+ - **Описание**: Количество подключений ME в теплом резерве, предварительно инициализированных.
+ - **Пример**:
+
+ ```toml
+ [general]
+ middle_proxy_warm_standby = 16
+ ```
+
+- `me_init_retry_attempts`
+ - **Ограничения / валидация**: `0..=1_000_000` (`0` означает неограниченное количество повторов).
+ - **Описание**: Повторные попытки инициализации пула ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_init_retry_attempts = 0
+ ```
+
+- `me2dc_fallback`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Позволяет перейти из режима ME в режим прямого постоянного тока в случае сбоя запуска ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me2dc_fallback = true
+ ```
+
+- `me2dc_fast`
+ - **Ограничения / валидация**: `бул`. Активен только тогда, когда `use_middle_proxy = true` и `me2dc_fallback = true`.
+ - **Описание**: Fast ME->Режим прямого возврата для новых сеансов.
+ - **Пример**:
+
+ ```toml
+ [general]
+ use_middle_proxy = true
+ me2dc_fallback = true
+ me2dc_fast = false
+ ```
+
+- `me_keepalive_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает периодические дополнительные кадры поддержки активности ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_keepalive_enabled = true
+ ```
+
+- `me_keepalive_interval_secs`
+ - **Ограничения / валидация**: `u64` (секунды).
+ - **Описание**: Базовый интервал поддержки активности ME в секундах.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_keepalive_interval_secs = 8
+ ```
+
+- `me_keepalive_jitter_secs`
+ - **Ограничения / валидация**: `u64` (секунды).
+ - **Описание**: Джиттер Keepalive за считанные секунды для уменьшения синхронизированных пакетов.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_keepalive_jitter_secs = 2
+ ```
+
+- `me_keepalive_payload_random`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Случайным образом изменяет байты полезной нагрузки поддержки активности вместо фиксированной нулевой полезной нагрузки.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_keepalive_payload_random = true
+ ```
+
+- `rpc_proxy_req_every`
+ - **Ограничения / валидация**: `0` или в пределах `10..=300` (секунд).
+ - **Описание**: Интервал для сигналов активности службы `RPC_PROXY_REQ` для ME (`0` отключает).
+ - **Пример**:
+
+ ```toml
+ [general]
+ rpc_proxy_req_every = 0
+ ```
+
+- `me_writer_cmd_channel_capacity`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Пропускная способность командного канала для каждого записывающего устройства.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_writer_cmd_channel_capacity = 4096
+ ```
+
+- `me_route_channel_capacity`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Пропускная способность канала маршрута ответа ME для каждого соединения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_channel_capacity = 768
+ ```
+
+- `me_c2me_channel_capacity`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Емкость очереди команд для каждого клиента (читатель клиента -> отправитель ME).
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_c2me_channel_capacity = 1024
+ ```
+
+- `me_c2me_send_timeout_ms`
+ - **Ограничения / валидация**: `0..=60000` (миллисекунды).
+ - **Описание**: Максимальное ожидание постановки в очередь команд клиент->ME, когда очередь для каждого клиента заполнена (`0` сохраняет устаревшее неограниченное ожидание).
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_c2me_send_timeout_ms = 4000
+ ```
+
+- `me_reader_route_data_wait_ms`
+ - **Ограничения / валидация**: `0..=20` (миллисекунды).
+ - **Описание**: Ограниченное ожидание маршрутизации ME DATA в очередь для каждого соединения (`0` = нет ожидания).
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_reader_route_data_wait_ms = 2
+ ```
+
+- `me_d2c_flush_batch_max_frames`
+ - **Ограничения / валидация**: Должно быть в пределах `1..=512`.
+ - **Описание**: Макс. ME->клиентские кадры объединяются перед очисткой.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_d2c_flush_batch_max_frames = 32
+ ```
+
+- `me_d2c_flush_batch_max_bytes`
+ - **Ограничения / валидация**: Должно быть в пределах `4096..=2097152` (байт).
+ - **Описание**: Максимальное количество байтов полезной нагрузки ME->клиента, объединенных перед сбросом.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_d2c_flush_batch_max_bytes = 131072
+ ```
+
+- `me_d2c_flush_batch_max_delay_us`
+ - **Ограничения / валидация**: `0..=5000` (микросекунды).
+ - **Описание**: Максимальное время ожидания в микросекундах для объединения большего количества кадров ME->клиента (`0` отключает объединение по времени).
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_d2c_flush_batch_max_delay_us = 500
+ ```
+
+- `me_d2c_ack_flush_immediate`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Сбрасывает запись клиента сразу после записи быстрого подтверждения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_d2c_ack_flush_immediate = true
+ ```
+
+- `me_quota_soft_overshoot_bytes`
+ - **Ограничения / валидация**: `0..=16777216` (байты).
+ - **Описание**: Дополнительные квоты для каждого маршрута (в байтах) допускаются до того, как принудительное применение квот на стороне записи отбрасывает данные маршрута.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_quota_soft_overshoot_bytes = 65536
+ ```
+
+- `me_d2c_frame_buf_shrink_threshold_bytes`
+ - **Ограничения / валидация**: Должно быть в пределах `4096..=16777216` (байт).
+ - **Описание**: Пороговое значение для сжатия слишком больших буферов агрегации кадров ME->клиента после очистки.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_d2c_frame_buf_shrink_threshold_bytes = 262144
+ ```
+
+- `direct_relay_copy_buf_c2s_bytes`
+ - **Ограничения / валидация**: Должно быть в пределах `4096..=1048576` (байт).
+ - **Описание**: Размер буфера копирования для направления клиент->DC в прямой ретрансляции.
+ - **Пример**:
+
+ ```toml
+ [general]
+ direct_relay_copy_buf_c2s_bytes = 65536
+ ```
+
+- `direct_relay_copy_buf_s2c_bytes`
+ - **Ограничения / валидация**: Должно быть в пределах `8192..=2097152` (байт).
+ - **Описание**: Размер буфера копирования для направления DC->клиент при прямой ретрансляции.
+ - **Пример**:
+
+ ```toml
+ [general]
+ direct_relay_copy_buf_s2c_bytes = 262144
+ ```
+
+- `crypto_pending_buffer`
+ - **Ограничения / валидация**: `использовать` (байты).
+ - **Описание**: Максимальный буфер ожидающего зашифрованного текста на каждого клиента-писателя (в байтах).
+ - **Пример**:
+
+ ```toml
+ [general]
+ crypto_pending_buffer = 262144
+ ```
+
+- `max_client_frame`
+ - **Ограничения / валидация**: `использовать` (байты).
+ - **Описание**: Максимально допустимый размер кадра MTProto клиента (в байтах).
+ - **Пример**:
+
+ ```toml
+ [general]
+ max_client_frame = 16777216
+ ```
+
+- `desync_all_full`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Создает полные журналы крипто-рассинхронизации для каждого события.
+ - **Пример**:
+
+ ```toml
+ [general]
+ desync_all_full = false
+ ```
+
+- `beobachten`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает сегменты криминалистического наблюдения для каждого IP-адреса.
+ - **Пример**:
+
+ ```toml
+ [general]
+ beobachten = true
+ ```
+
+- `beobachten_minutes`
+ - **Ограничения / валидация**: Должно быть `> 0` (минуты).
+ - **Описание**: Окно хранения (минуты) для сегментов наблюдения по каждому IP-адресу.
+ - **Пример**:
+
+ ```toml
+ [general]
+ beobachten_minutes = 10
+ ```
+
+- `beobachten_flush_secs`
+ - **Ограничения / валидация**: Должно быть `> 0` (секунды).
+ - **Описание**: Интервал сброса моментального снимка (в секундах) для выходного файла наблюдения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ beobachten_flush_secs = 15
+ ```
+
+- `beobachten_file`
+ - **Ограничения / валидация**: Не должно быть пустым или содержать только пробелы.
+ - **Описание**: Путь к выходному файлу снимка наблюдения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ beobachten_file = "cache/beobachten.txt"
+ ```
+
+- `hardswap`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает стратегию жесткой замены ME на основе генерации.
+ - **Пример**:
+
+ ```toml
+ [general]
+ hardswap = true
+ ```
+
+- `me_warmup_stagger_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Перемещает дополнительные шкалы прогрева ME, чтобы избежать всплесков соединения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_warmup_stagger_enabled = true
+ ```
+
+- `me_warmup_step_delay_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды).
+ - **Описание**: Базовая задержка в миллисекундах между этапами набора прогрева.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_warmup_step_delay_ms = 500
+ ```
+
+- `me_warmup_step_jitter_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды).
+ - **Описание**: Дополнительная случайная задержка в миллисекундах для шагов разминки.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_warmup_step_jitter_ms = 300
+ ```
+
+- `me_reconnect_max_concurrent_per_dc`
+ - **Ограничения / валидация**: `u32`. Эффективное значение — «max(value, 1)» во время выполнения (поэтому «0» ведет себя как «1»).
+ - **Описание**: Ограничивает число одновременных рабочих повторных подключений на каждый контроллер домена во время восстановления работоспособности.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_reconnect_max_concurrent_per_dc = 8
+ ```
+
+- `me_reconnect_backoff_base_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды).
+ - **Описание**: Начальная задержка повторного подключения в миллисекундах.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_reconnect_backoff_base_ms = 500
+ ```
+
+- `me_reconnect_backoff_cap_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды).
+ - **Описание**: Максимальное ограничение задержки повторного подключения в миллисекундах.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_reconnect_backoff_cap_ms = 30000
+ ```
+
+- `me_reconnect_fast_retry_count`
+ - **Ограничения / валидация**: `u32`. Эффективное значение — «max(value, 1)» во время выполнения (поэтому «0» ведет себя как «1»).
+ - **Описание**: Немедленный бюджет повторных попыток, прежде чем применяется поведение длительной отсрочки.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_reconnect_fast_retry_count = 16
+ ```
+
+- `me_single_endpoint_shadow_writers`
+ - **Ограничения / валидация**: Должно быть в пределах `0..=32`.
+ - **Описание**: Дополнительные резервные модули записи для групп DC только с одной конечной точкой.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_single_endpoint_shadow_writers = 2
+ ```
+
+- `me_single_endpoint_outage_mode_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает агрессивный режим восстановления после сбоя для групп DC только с одной конечной точкой.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_single_endpoint_outage_mode_enabled = true
+ ```
+
+- `me_single_endpoint_outage_disable_quarantine`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Игнорирует карантин конечной точки в режиме отключения одной конечной точки.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_single_endpoint_outage_disable_quarantine = true
+ ```
+
+- `me_single_endpoint_outage_backoff_min_ms`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды) и `<= me_single_endpoint_outage_backoff_max_ms`.
+ - **Описание**: Минимальная задержка повторного подключения в режиме отключения одной конечной точки.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_single_endpoint_outage_backoff_min_ms = 250
+ ```
+
+- `me_single_endpoint_outage_backoff_max_ms`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды) и `>= me_single_endpoint_outage_backoff_min_ms`.
+ - **Описание**: Максимальная задержка повторного подключения в режиме отключения одной конечной точки.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_single_endpoint_outage_backoff_max_ms = 3000
+ ```
+
+- `me_single_endpoint_shadow_rotate_every_secs`
+ - **Ограничения / валидация**: `u64` (секунды). `0` отключает периодическое вращение тени.
+ - **Описание**: Периодический интервал ротации теневого записывающего устройства для групп DC с одной конечной точкой.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_single_endpoint_shadow_rotate_every_secs = 900
+ ```
+
+- `me_floor_mode`
+ - **Ограничения / валидация**: «статический» или «адаптивный».
+ - **Описание**: Режим политики пола для целей записи ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_floor_mode = "adaptive"
+ ```
+
+- `me_adaptive_floor_idle_secs`
+ - **Ограничения / валидация**: `u64` (секунды).
+ - **Описание**: Время простоя перед адаптивным ограничением может уменьшить целевую задачу записи с одной конечной точкой.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_idle_secs = 90
+ ```
+
+- `me_adaptive_floor_min_writers_single_endpoint`
+ - **Ограничения / валидация**: Должно быть в пределах `1..=32`.
+ - **Описание**: Минимальная цель записи для групп DC с одной конечной точкой в адаптивном режиме пола.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_min_writers_single_endpoint = 1
+ ```
+
+- `me_adaptive_floor_min_writers_multi_endpoint`
+ - **Ограничения / валидация**: Должно быть в пределах `1..=32`.
+ - **Описание**: Минимальная цель записи для групп DC с несколькими конечными точками в адаптивном режиме пола.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_min_writers_multi_endpoint = 1
+ ```
+
+- `me_adaptive_floor_recover_grace_secs`
+ - **Ограничения / валидация**: `u64` (секунды).
+ - **Описание**: Льготный период для сохранения статического минимума после активности в адаптивном режиме.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_recover_grace_secs = 180
+ ```
+
+- `me_adaptive_floor_writers_per_core_total`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Глобальный бюджет записи ME на логическое ядро ЦП в адаптивном режиме.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_writers_per_core_total = 48
+ ```
+
+- `me_adaptive_floor_cpu_cores_override`
+ - **Ограничения / валидация**: `u16`. `0` использует автоматическое обнаружение во время выполнения.
+ - **Описание**: Переопределить количество логических ядер ЦП, используемое для адаптивных вычислений минимального уровня.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_cpu_cores_override = 0
+ ```
+
+- `me_adaptive_floor_max_extra_writers_single_per_core`
+ - **Ограничения / валидация**: `u16`.
+ - **Описание**: Максимальное количество дополнительных устройств записи на ядро выше базового требуемого уровня для групп DC с одной конечной точкой.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_max_extra_writers_single_per_core = 1
+ ```
+
+- `me_adaptive_floor_max_extra_writers_multi_per_core`
+ - **Ограничения / валидация**: `u16`.
+ - **Описание**: Максимальное количество дополнительных устройств записи на ядро выше базового требуемого уровня для групп DC с несколькими конечными точками.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_max_extra_writers_multi_per_core = 2
+ ```
+
+- `me_adaptive_floor_max_active_writers_per_core`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Жесткое ограничение для активных устройств записи ME на логическое ядро ЦП.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_max_active_writers_per_core = 64
+ ```
+
+- `me_adaptive_floor_max_warm_writers_per_core`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Жесткое ограничение для теплых авторов ME на логическое ядро ЦП.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_max_warm_writers_per_core = 64
+ ```
+
+- `me_adaptive_floor_max_active_writers_global`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Жесткий глобальный лимит для активных авторов ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_max_active_writers_global = 256
+ ```
+
+- `me_adaptive_floor_max_warm_writers_global`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Жесткий глобальный лимит для теплых писателей ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_adaptive_floor_max_warm_writers_global = 256
+ ```
+
+- `upstream_connect_retry_attempts`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Попытки подключения для выбранного восходящего потока перед возвратом ошибки/резервного варианта.
+ - **Пример**:
+
+ ```toml
+ [general]
+ upstream_connect_retry_attempts = 2
+ ```
+
+- `upstream_connect_retry_backoff_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды). `0` отключает задержку отсрочки (повторные попытки становятся немедленными).
+ - **Описание**: Задержка в миллисекундах между попытками восходящего соединения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ upstream_connect_retry_backoff_ms = 100
+ ```
+
+- `upstream_connect_budget_ms`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды).
+ - **Описание**: Общий бюджет настенных часов в миллисекундах для одного запроса восходящего соединения при повторных попытках.
+ - **Пример**:
+
+ ```toml
+ [general]
+ upstream_connect_budget_ms = 3000
+ ```
+
+- `upstream_unhealthy_fail_threshold`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Последовательные неудачные запросы до того, как восходящий поток будет помечен как неработоспособный.
+ - **Пример**:
+
+ ```toml
+ [general]
+ upstream_unhealthy_fail_threshold = 5
+ ```
+
+- `upstream_connect_failfast_hard_errors`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Если установлено значение true, дополнительные попытки пропускаются при серьезных непереходных ошибках восходящего соединения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ upstream_connect_failfast_hard_errors = false
+ ```
+
+- `stun_iface_mismatch_ignore`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Флаг совместимости зарезервирован для использования в будущем. В настоящее время этот ключ анализируется, но не используется средой выполнения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ stun_iface_mismatch_ignore = false
+ ```
+
+- `unknown_dc_log_path`
+ - **Ограничения / валидация**: `Строка` (необязательно). Должен быть безопасный путь (никаких компонентов `..`, родительский каталог должен существовать); небезопасные пути отклоняются во время выполнения.
+ - **Описание**: Путь к файлу журнала для неизвестных (нестандартных) запросов DC, когда `unknown_dc_file_log_enabled = true`. Опустите этот ключ, чтобы отключить ведение журнала файлов.
+ - **Пример**:
+
+ ```toml
+ [general]
+ unknown_dc_log_path = "unknown-dc.txt"
+ ```
+
+- `unknown_dc_file_log_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает ведение журнала файла неизвестного DC (записывает строки `dc_idx=`). Требуется установить `unknown_dc_log_path` и на платформах, отличных от Unix, может не поддерживаться. Ведение журналов дедуплицировано и ограничено (записываются только первые ~ 1024 различных неизвестных индекса DC).
+ - **Пример**:
+
+ ```toml
+ [general]
+ unknown_dc_file_log_enabled = false
+ ```
+
+- `log_level`
+ - **Ограничения / валидация**: «отладка», «многословный», «нормальный» или «тихий».
+ - **Описание**: Уровень детализации журналирования во время выполнения (используется, если RUST_LOG не установлен). Если в среде установлен RUST_LOG, он имеет приоритет над этим параметром.
+ - **Пример**:
+
+ ```toml
+ [general]
+ log_level = "normal"
+ ```
+
+- `disable_colors`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Отключает цвета ANSI в журналах (полезно для файлов/systemd). Это влияет только на форматирование журнала и не меняет уровень/фильтрацию журнала.
+ - **Пример**:
+
+ ```toml
+ [general]
+ disable_colors = false
+ ```
+
+- `me_socks_kdf_policy`
+ - **Ограничения / валидация**: «строгий» или «совместимый».
+ - **Описание**: Резервная политика KDF, связанная с SOCKS, для рукопожатия среднего уровня.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_socks_kdf_policy = "strict"
+ ```
+
+- `me_route_backpressure_base_timeout_ms`
+ - **Ограничения / валидация**: Должно быть в пределах `1..=5000` (миллисекунд).
+ - **Описание**: Тайм-аут базового противодавления в миллисекундах для отправки по каналу маршрута ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_backpressure_base_timeout_ms = 25
+ ```
+
+- `me_route_backpressure_high_timeout_ms`
+ - **Ограничения / валидация**: Должно быть в пределах `1..=5000` (миллисекунды) и `>= me_route_backpressure_base_timeout_ms`.
+ - **Описание**: Тайм-аут высокого противодавления в миллисекундах, когда занятость очереди превышает водяной знак.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_backpressure_high_timeout_ms = 120
+ ```
+
+- `me_route_backpressure_high_watermark_pct`
+ - **Ограничения / валидация**: Должно быть в пределах `1..=100` (процентов).
+ - **Описание**: Пороговое значение процента занятости очереди для переключения на тайм-аут высокого противодавления.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_backpressure_high_watermark_pct = 80
+ ```
+
+- `me_health_interval_ms_unhealthy`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды).
+ - **Описание**: Интервал мониторинга работоспособности, когда покрытие записи ME ухудшается.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_health_interval_ms_unhealthy = 1000
+ ```
+
+- `me_health_interval_ms_healthy`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды).
+ - **Описание**: Интервал мониторинга работоспособности, пока покрытие записи ME стабильно/работоспособно.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_health_interval_ms_healthy = 3000
+ ```
+
+- `me_admission_poll_ms`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды).
+ - **Описание**: Интервал опроса для проверок состояния условного приема.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_admission_poll_ms = 1000
+ ```
+
+- `me_warn_rate_limit_ms`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды).
+ - **Описание**: Время восстановления повторяющихся журналов предупреждений ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_warn_rate_limit_ms = 5000
+ ```
+
+- `me_route_no_writer_mode`
+ - **Ограничения / валидация**: `"async_recovery_failfast"`, `"inline_recovery_legacy"` или `"hybrid_async_persistent"`.
+ - **Описание**: Поведение маршрута ME, когда ни один писатель не доступен немедленно.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_no_writer_mode = "hybrid_async_persistent"
+ ```
+
+- `me_route_no_writer_wait_ms`
+ - **Ограничения / валидация**: Должно быть в пределах `10..=5000` (миллисекунд).
+ - **Описание**: Максимальное время ожидания, используемое в быстром режиме асинхронного восстановления перед откатом.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_no_writer_wait_ms = 250
+ ```
+
+- `me_route_hybrid_max_wait_ms`
+ - **Ограничения / валидация**: Должно быть в пределах `50..=60000` (миллисекунд).
+ - **Описание**: Максимальное совокупное время ожидания в гибридном режиме без записи перед отказоустойчивым переходом.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_hybrid_max_wait_ms = 3000
+ ```
+
+- `me_route_blocking_send_timeout_ms`
+ - **Ограничения / валидация**: Должно быть в пределах `0..=5000` (миллисекунд). `0` сохраняет устаревшее неограниченное поведение ожидания.
+ - **Описание**: Максимальное ожидание блокировки резервной отправки маршрутного канала.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_blocking_send_timeout_ms = 250
+ ```
+
+- `me_route_inline_recovery_attempts`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Количество попыток оперативного восстановления в устаревшем режиме.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_inline_recovery_attempts = 3
+ ```
+
+- `me_route_inline_recovery_wait_ms`
+ - **Ограничения / валидация**: Должно быть в пределах `10..=30000` (миллисекунд).
+ - **Описание**: Максимальное время ожидания встроенного восстановления в устаревшем режиме.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_route_inline_recovery_wait_ms = 3000
+ ```
+
+- `fast_mode_min_tls_record`
+ - **Ограничения / валидация**: `использовать` (байты). `0` отключает ограничение.
+ - **Описание**: Минимальный размер записи TLS при включенном объединении в быстром режиме.
+ - **Пример**:
+
+ ```toml
+ [general]
+ fast_mode_min_tls_record = 0
+ ```
+
+- `update_every`
+ - **Ограничения / валидация**: `u64` (секунды). Если установлено, должно быть `> 0`. Если этот ключ не установлен явно, можно использовать устаревшие `proxy_secret_auto_reload_secs` и `proxy_config_auto_reload_secs` (их эффективный минимум должен быть `> 0`).
+ - **Описание**: Единый интервал обновления для задач обновления ME (getProxyConfig, getProxyConfigV6, getProxySecret). Если этот параметр установлен, он переопределяет устаревшие интервалы перезагрузки прокси-сервера.
+ - **Пример**:
+
+ ```toml
+ [general]
+ update_every = 300
+ ```
+
+- `me_reinit_every_secs`
+ - **Ограничения / валидация**: Должно быть `> 0` (секунды).
+ - **Описание**: Периодический интервал для цикла повторной инициализации ME с нулевым временем простоя.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_reinit_every_secs = 900
+ ```
+
+- `me_hardswap_warmup_delay_min_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть `<= me_hardswap_warmup_delay_max_ms`.
+ - **Описание**: Нижняя граница интервала прогрева жесткой замены.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_hardswap_warmup_delay_min_ms = 1000
+ ```
+
+- `me_hardswap_warmup_delay_max_ms`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды).
+ - **Описание**: Верхняя граница интервала прогрева жесткой замены.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_hardswap_warmup_delay_max_ms = 2000
+ ```
+
+- `me_hardswap_warmup_extra_passes`
+ - **Ограничения / валидация**: Должно быть в пределах `[0, 10]`.
+ - **Описание**: Дополнительные прогрева проходят после базового прохода за один цикл жесткой замены.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: 3 (allowed range: 0..=10)
+ me_hardswap_warmup_extra_passes = 3
+ ```
+
+- `me_hardswap_warmup_pass_backoff_base_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть `> 0`.
+ - **Описание**: Базовая задержка между дополнительными проходами по замене жесткого диска, когда пол еще не завершен.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: 500
+ me_hardswap_warmup_pass_backoff_base_ms = 500
+ ```
+
+- `me_config_stable_snapshots`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Количество идентичных снимков конфигурации ME, необходимое для применения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # require 3 identical snapshots before applying ME endpoint map updates
+ me_config_stable_snapshots = 3
+ ```
+
+- `me_config_apply_cooldown_secs`
+ - **Ограничения / валидация**: `u64`.
+ - **Описание**: Время восстановления между примененными обновлениями карты конечных точек ME. `0` отключает время восстановления.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # allow applying stable snapshots immediately (no cooldown)
+ me_config_apply_cooldown_secs = 0
+ ```
+
+- `me_snapshot_require_http_2xx`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Для применения снимков конфигурации ME требуется 2xx HTTP-ответа. Если установлено значение «false», ответы, отличные от 2xx, все равно могут быть проанализированы/учтены программой обновления.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # allow applying snapshots even when the HTTP status is non-2xx
+ me_snapshot_require_http_2xx = false
+ ```
+
+- `me_snapshot_reject_empty_map`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Отклоняет пустые снимки конфигурации ME (без конечных точек). Если установлено значение «false», может быть применен пустой снимок (с учетом других ворот), что может временно уменьшить/очистить карту ME.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # allow applying empty snapshots (use with care)
+ me_snapshot_reject_empty_map = false
+ ```
+
+- `me_snapshot_min_proxy_for_lines`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Минимальное количество проанализированных строк `proxy_for`, необходимое для принятия снимка.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # require at least 10 proxy_for rows before accepting a snapshot
+ me_snapshot_min_proxy_for_lines = 10
+ ```
+
+- `proxy_secret_stable_snapshots`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Количество идентичных снимков с секретом прокси-сервера, необходимых перед ротацией.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # require 2 identical getProxySecret snapshots before rotating at runtime
+ proxy_secret_stable_snapshots = 2
+ ```
+
+- `proxy_secret_rotate_runtime`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает ротацию секретов прокси-сервера во время выполнения из снимков средства обновления.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # disable runtime proxy-secret rotation (startup still uses proxy_secret_path/proxy_secret_len_max)
+ proxy_secret_rotate_runtime = false
+ ```
+
+- `me_secret_atomic_snapshot`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Сохраняет селекторные и секретные байты из одного и того же снимка атомарно. Если `general.use_middle_proxy = true`, это автоматически включается во время загрузки конфигурации, чтобы обеспечить согласованность материала ME KDF.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # NOTE: when use_middle_proxy=true, Telemt will auto-enable this during load
+ me_secret_atomic_snapshot = false
+ ```
+
+- `proxy_secret_len_max`
+ - **Ограничения / валидация**: Должно быть в пределах `[32, 4096]`.
+ - **Описание**: Верхний предел длины (в байтах) принимаемого прокси-секрета во время запуска и обновления среды выполнения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: 256 (bytes)
+ proxy_secret_len_max = 256
+ ```
+
+- `me_pool_drain_ttl_secs`
+ - **Ограничения / валидация**: `u64` (секунды). `0` отключает окно дренажного TTL (и подавляет предупреждения дренажного TTL для непустых записывающих устройств дренажа).
+ - **Описание**: Временной интервал Drain-TTL для устаревших модулей записи ME после изменения карты конечных точек. Во время TTL устаревшие средства записи можно использовать только в качестве резерва для новых привязок (в зависимости от политики привязки).
+ - **Пример**:
+
+ ```toml
+ [general]
+ # disable drain TTL (draining writers won't emit "past drain TTL" warnings)
+ me_pool_drain_ttl_secs = 0
+ ```
+
+- `me_instadrain`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Принудительно удаляет устаревшие записи записи при следующем такте очистки, минуя ожидание TTL/крайнего срока.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: false
+ me_instadrain = false
+ ```
+
+- `me_pool_drain_threshold`
+ - **Ограничения / валидация**: `u64`. Установите значение «0», чтобы отключить очистку на основе пороговых значений.
+ - **Описание**: Максимальное количество устаревших источников записи, прежде чем самые старые из них будут принудительно закрыты в пакетном режиме.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: 32
+ me_pool_drain_threshold = 32
+ ```
+
+- `me_pool_drain_soft_evict_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает постепенное мягкое удаление устаревших средств записи во время очистки/повторной инициализации вместо немедленного жесткого закрытия.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: true
+ me_pool_drain_soft_evict_enabled = true
+ ```
+
+- `me_pool_drain_soft_evict_grace_secs`
+ - **Ограничения / валидация**: `u64` (секунды). Должно быть в пределах `[0, 3600]`.
+ - **Описание**: Дополнительная льгота (после слива TTL) перед началом этапа мягкого вытеснения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: 10
+ me_pool_drain_soft_evict_grace_secs = 10
+ ```
+
+- `me_pool_drain_soft_evict_per_writer`
+ - **Ограничения / валидация**: `1..=16`.
+ - **Описание**: Максимальное количество устаревших маршрутов, мягко вытесняемых на одного автора за один проход выселения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: 2
+ me_pool_drain_soft_evict_per_writer = 2
+ ```
+
+- `me_pool_drain_soft_evict_budget_per_core`
+ - **Ограничения / валидация**: `1..=64`.
+ - **Описание**: Бюджет на ядро ограничивает совокупную работу по мягкому вытеснению за проход.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: 16
+ me_pool_drain_soft_evict_budget_per_core = 16
+ ```
+
+- `me_pool_drain_soft_evict_cooldown_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть `> 0`.
+ - **Описание**: Время восстановления между повторяющимися мягкими выселениями одного и того же автора.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # default: 1000
+ me_pool_drain_soft_evict_cooldown_ms = 1000
+ ```
+
+- `me_bind_stale_mode`
+ - **Ограничения / валидация**: «никогда», «ttl» или «всегда».
+ - **Описание**: Политика в отношении новых ограничений для устаревших истощающих авторов.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # allow stale binds only for a limited time window
+ me_bind_stale_mode = "ttl"
+ ```
+
+- `me_bind_stale_ttl_secs`
+ - **Ограничения / валидация**: `u64`.
+ - **Описание**: TTL для допуска устаревшей привязки, когда устаревший режим — «ttl».
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_bind_stale_mode = "ttl"
+ me_bind_stale_ttl_secs = 90
+ ```
+
+- `me_pool_min_fresh_ratio`
+ - **Ограничения / валидация**: Должно быть в пределах `[0.0, 1.0]`.
+ - **Описание**: Минимальный коэффициент покрытия свежих желаемых DC, прежде чем устаревшие авторы будут истощены.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # require >=90% desired-DC coverage before draining stale writers
+ me_pool_min_fresh_ratio = 0.9
+ ```
+
+- `me_reinit_drain_timeout_secs`
+ - **Ограничения / валидация**: `u64`. `0` использует тайм-аут принудительного закрытия для обеспечения безопасности во время выполнения. Если `> 0` и `< me_pool_drain_ttl_secs`, среда выполнения увеличивает значение TTL.
+ - **Описание**: Тайм-аут принудительного закрытия для слива устаревших авторов. Если установлено значение «0», эффективный тайм-аут представляет собой резервный режим безопасности во время выполнения (300 секунд).
+ - **Пример**:
+
+ ```toml
+ [general]
+ # use runtime safety fallback force-close timeout (300s)
+ me_reinit_drain_timeout_secs = 0
+ ```
+
+- `proxy_secret_auto_reload_secs`
+ - **Ограничения / валидация**: Устарело. Используйте `general.update_every`. Если `general.update_every` не задан явно, эффективный устаревший интервал обновления равен `min(proxy_secret_auto_reload_secs, proxy_config_auto_reload_secs)` и должен быть `> 0`.
+ - **Описание**: Устаревший устаревший интервал обновления секрета прокси-сервера. Используется только в том случае, если `general.update_every` не установлен.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # legacy mode: omit update_every to use proxy_*_auto_reload_secs
+ proxy_secret_auto_reload_secs = 600
+ proxy_config_auto_reload_secs = 120
+ # effective updater interval = min(600, 120) = 120 seconds
+ ```
+
+- `proxy_config_auto_reload_secs`
+ - **Ограничения / валидация**: Устарело. Используйте `general.update_every`. Если `general.update_every` не задан явно, эффективный устаревший интервал обновления равен `min(proxy_secret_auto_reload_secs, proxy_config_auto_reload_secs)` и должен быть `> 0`.
+ - **Описание**: Устаревший интервал обновления устаревшей конфигурации ME. Используется только в том случае, если `general.update_every` не установлен.
+ - **Пример**:
+
+ ```toml
+ [general]
+ # legacy mode: omit update_every to use proxy_*_auto_reload_secs
+ proxy_secret_auto_reload_secs = 600
+ proxy_config_auto_reload_secs = 120
+ # effective updater interval = min(600, 120) = 120 seconds
+ ```
+
+- `me_reinit_singleflight`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Сериализует циклы повторной инициализации ME по источникам триггера.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_reinit_singleflight = true
+ ```
+
+- `me_reinit_trigger_channel`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Емкость очереди триггеров для планировщика повторной инициализации.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_reinit_trigger_channel = 64
+ ```
+
+- `me_reinit_coalesce_window_ms`
+ - **Ограничения / валидация**: `u64`.
+ - **Описание**: Запустить окно объединения триггеров перед началом повторной инициализации (мс).
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_reinit_coalesce_window_ms = 200
+ ```
+
+- `me_deterministic_writer_sort`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает детерминированную сортировку кандидатов для пути привязки записи.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_deterministic_writer_sort = true
+ ```
+
+- `me_writer_pick_mode`
+ - **Ограничения / валидация**: `"sorted_rr"` или `"p2c"`.
+ - **Описание**: Режим выбора записывающего устройства для пути привязки маршрута.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_writer_pick_mode = "p2c"
+ ```
+
+- `me_writer_pick_sample_size`
+ - **Ограничения / валидация**: `2..=4`.
+ - **Описание**: Количество кандидатов, отобранных сборщиком в режиме p2c.
+ - **Пример**:
+
+ ```toml
+ [general]
+ me_writer_pick_mode = "p2c"
+ me_writer_pick_sample_size = 3
+ ```
+
+- `ntp_check`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ ntp_check = true
+ ```
+
+- `ntp_servers`
+ - **Ограничения / валидация**: `Строка[]`.
+ - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ ntp_servers = ["pool.ntp.org"]
+ ```
+
+- `auto_degradation_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ auto_degradation_enabled = true
+ ```
+
+- `degradation_min_unavailable_dc_groups`
+ - **Ограничения / валидация**: `u8`.
+ - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения.
+ - **Пример**:
+
+ ```toml
+ [general]
+ degradation_min_unavailable_dc_groups = 2
+ ```
+
+
+## [general.modes]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`classic`](#cfg-general-modes-classic) | `bool` | `false` |
+| [`secure`](#cfg-general-modes-secure) | `bool` | `false` |
+| [`tls`](#cfg-general-modes-tls) | `bool` | `true` |
+
+
+- `classic`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает классический режим MTProxy.
+ - **Пример**:
+
+ ```toml
+ [general.modes]
+ classic = true
+ ```
+
+- `secure`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает безопасный режим.
+ - **Пример**:
+
+ ```toml
+ [general.modes]
+ secure = true
+ ```
+
+- `tls`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает режим TLS.
+ - **Пример**:
+
+ ```toml
+ [general.modes]
+ tls = true
+ ```
+
+
+## [general.links]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`show`](#cfg-general-links-show) | `"*"` or `String[]` | `"*"` |
+| [`public_host`](#cfg-general-links-public_host) | `String` | — |
+| [`public_port`](#cfg-general-links-public_port) | `u16` | — |
+
+
+- `show`
+ - **Ограничения / валидация**: `"*"` или `String[]`. Пустой массив означает «не показывать ничего».
+ - **Описание**: Выбирает пользователей, чьи прокси-ссылки `tg://` отображаются при запуске.
+ - **Пример**:
+
+ ```toml
+ [general.links]
+ show = "*"
+ # or:
+ # show = ["alice", "bob"]
+ ```
+
+- `public_host`
+ - **Ограничения / валидация**: `Строка` (необязательно).
+ - **Описание**: Переопределение общедоступного имени хоста/IP-адреса, используемое для сгенерированных ссылок `tg://` (переопределяет обнаруженный IP-адрес).
+ - **Пример**:
+
+ ```toml
+ [general.links]
+ public_host = "proxy.example.com"
+ ```
+
+- `public_port`
+ - **Ограничения / валидация**: `u16` (необязательно).
+ - **Описание**: Переопределение общедоступного порта, используемое для сгенерированных ссылок `tg://` (переопределяет `server.port`).
+ - **Пример**:
+
+ ```toml
+ [general.links]
+ public_port = 443
+ ```
+
+
+## [general.telemetry]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`core_enabled`](#cfg-general-telemetry-core_enabled) | `bool` | `true` |
+| [`user_enabled`](#cfg-general-telemetry-user_enabled) | `bool` | `true` |
+| [`me_level`](#cfg-general-telemetry-me_level) | `"silent"`, `"normal"`, or `"debug"` | `"normal"` |
+
+
+- `core_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает основные счетчики телеметрии горячего пути.
+ - **Пример**:
+
+ ```toml
+ [general.telemetry]
+ core_enabled = true
+ ```
+
+- `user_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает счетчики телеметрии для каждого пользователя.
+ - **Пример**:
+
+ ```toml
+ [general.telemetry]
+ user_enabled = true
+ ```
+
+- `me_level`
+ - **Ограничения / валидация**: «тихий», «нормальный» или «отладка».
+ - **Описание**: Средний уровень детализации телеметрии.
+ - **Пример**:
+
+ ```toml
+ [general.telemetry]
+ me_level = "normal"
+ ```
+
+
+## [network]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`ipv4`](#cfg-network-ipv4) | `bool` | `true` |
+| [`ipv6`](#cfg-network-ipv6) | `bool` | `false` |
+| [`prefer`](#cfg-network-prefer) | `u8` | `4` |
+| [`multipath`](#cfg-network-multipath) | `bool` | `false` |
+| [`stun_use`](#cfg-network-stun_use) | `bool` | `true` |
+| [`stun_servers`](#cfg-network-stun_servers) | `String[]` | Built-in STUN list (13 hosts) |
+| [`stun_tcp_fallback`](#cfg-network-stun_tcp_fallback) | `bool` | `true` |
+| [`http_ip_detect_urls`](#cfg-network-http_ip_detect_urls) | `String[]` | `["https://ifconfig.me/ip", "https://api.ipify.org"]` |
+| [`cache_public_ip_path`](#cfg-network-cache_public_ip_path) | `String` | `"cache/public_ip.txt"` |
+| [`dns_overrides`](#cfg-network-dns_overrides) | `String[]` | `[]` |
+
+
+- `ipv4`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает сеть IPv4.
+ - **Пример**:
+
+ ```toml
+ [network]
+ ipv4 = true
+ ```
+
+- `ipv6`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает/выключает сеть IPv6. Если этот параметр опущен, по умолчанию используется значение «false».
+ - **Пример**:
+
+ ```toml
+ [network]
+ # enable IPv6 explicitly
+ ipv6 = true
+
+ # or: disable IPv6 explicitly
+ # ipv6 = false
+ ```
+
+- `prefer`
+ - **Ограничения / валидация**: Должно быть `4` или `6`. Если `prefer = 4`, а `ipv4 = false`, Telemt принудительно использует `prefer = 6`. Если `prefer = 6`, а `ipv6 = false`, Telemt принудительно использует `prefer = 4`.
+ - **Описание**: Предпочтительное семейство IP для выбора, если доступны оба семейства.
+ - **Пример**:
+
+ ```toml
+ [network]
+ prefer = 6
+ ```
+
+- `multipath`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает многопутевое поведение, если это поддерживается платформой и средой выполнения.
+ - **Пример**:
+
+ ```toml
+ [network]
+ multipath = true
+ ```
+
+- `stun_use`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Глобальный переключатель STUN; если установлено значение «false», проверка STUN отключается и остается только обнаружение без STUN.
+ - **Пример**:
+
+ ```toml
+ [network]
+ stun_use = false
+ ```
+
+- `stun_servers`
+ - **Ограничения / валидация**: `Строка[]`. Значения обрезаются; пустые значения удаляются; список дедуплицируется. Если этот ключ **не** установлен явно, Telemt сохраняет встроенный список STUN по умолчанию.
+ - **Описание**: Список серверов STUN для обнаружения общедоступных IP-адресов.
+ - **Пример**:
+
+ ```toml
+ [network]
+ stun_servers = [
+ "stun.l.google.com:19302",
+ "stun.stunprotocol.org:3478",
+ ]
+ ```
+
+- `stun_tcp_fallback`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает резервный TCP для STUN, когда путь UDP заблокирован/недоступен.
+ - **Пример**:
+
+ ```toml
+ [network]
+ stun_tcp_fallback = true
+ ```
+
+- `http_ip_detect_urls`
+ - **Ограничения / валидация**: `Строка[]`.
+ - **Описание**: Конечные точки HTTP, используемые для обнаружения общедоступных IP-адресов (резервный вариант после STUN).
+ - **Пример**:
+
+ ```toml
+ [network]
+ http_ip_detect_urls = ["https://ifconfig.me/ip", "https://api.ipify.org"]
+ ```
+
+- `cache_public_ip_path`
+ - **Ограничения / валидация**: `Строка`.
+ - **Описание**: Путь к файлу, используемый для кэширования обнаруженного общедоступного IP-адреса.
+ - **Пример**:
+
+ ```toml
+ [network]
+ cache_public_ip_path = "cache/public_ip.txt"
+ ```
+
+- `dns_overrides`
+ - **Ограничения / валидация**: `Строка[]`. Каждая запись должна использовать формат «хост:порт:ip».
+- `host`: имя домена (должно быть непустым и не должно содержать `:`)
+- `порт`: `u16`
+- `ip`: IPv4 (`1.2.3.4`) или IPv6 в квадратных скобках (`[2001:db8::1]`). **IPv6 без скобок отклонен**.
+ - **Описание**: Переопределения DNS во время выполнения для целей `host:port`. Полезно для принудительного использования определенных IP-адресов для определенных вышестоящих доменов, не затрагивая системный DNS.
+ - **Пример**:
+
+ ```toml
+ [network]
+ dns_overrides = [
+ "example.com:443:127.0.0.1",
+ "example.net:8443:[2001:db8::10]",
+ ]
+ ```
+
+
+## [server]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`port`](#cfg-server-port) | `u16` | `443` |
+| [`listen_addr_ipv4`](#cfg-server-listen_addr_ipv4) | `String` | `"0.0.0.0"` |
+| [`listen_addr_ipv6`](#cfg-server-listen_addr_ipv6) | `String` | `"::"` |
+| [`listen_unix_sock`](#cfg-server-listen_unix_sock) | `String` | — |
+| [`listen_unix_sock_perm`](#cfg-server-listen_unix_sock_perm) | `String` | — |
+| [`listen_tcp`](#cfg-server-listen_tcp) | `bool` | — (auto) |
+| [`proxy_protocol`](#cfg-server-proxy_protocol) | `bool` | `false` |
+| [`proxy_protocol_header_timeout_ms`](#cfg-server-proxy_protocol_header_timeout_ms) | `u64` | `500` |
+| [`proxy_protocol_trusted_cidrs`](#cfg-server-proxy_protocol_trusted_cidrs) | `IpNetwork[]` | `[]` |
+| [`metrics_port`](#cfg-server-metrics_port) | `u16` | — |
+| [`metrics_listen`](#cfg-server-metrics_listen) | `String` | — |
+| [`metrics_whitelist`](#cfg-server-metrics_whitelist) | `IpNetwork[]` | `["127.0.0.1/32", "::1/128"]` |
+| [`max_connections`](#cfg-server-max_connections) | `u32` | `10000` |
+| [`accept_permit_timeout_ms`](#cfg-server-accept_permit_timeout_ms) | `u64` | `250` |
+
+
+- `port`
+ - **Ограничения / валидация**: `u16`.
+ - **Описание**: Порт прослушивания основного прокси (TCP).
+ - **Пример**:
+
+ ```toml
+ [server]
+ port = 443
+ ```
+
+- `listen_addr_ipv4`
+ - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, это должна быть действительная строка адреса IPv4.
+ - **Описание**: Адрес привязки IPv4 для прослушивателя TCP (опустите этот ключ, чтобы отключить привязку IPv4).
+ - **Пример**:
+
+ ```toml
+ [server]
+ listen_addr_ipv4 = "0.0.0.0"
+ ```
+
+- `listen_addr_ipv6`
+ - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, это должна быть действительная строка адреса IPv6.
+ - **Описание**: Адрес привязки IPv6 для прослушивателя TCP (опустите этот ключ, чтобы отключить привязку IPv6).
+ - **Пример**:
+
+ ```toml
+ [server]
+ listen_addr_ipv6 = "::"
+ ```
+
+- `listen_unix_sock`
+ - **Ограничения / валидация**: `Строка` (необязательно). Не должно быть пустым, если установлено. Только Юникс.
+ - **Описание**: Путь сокета Unix для прослушивателя. Если установлено, `server.listen_tcp` по умолчанию имеет значение `false` (если не указано иное явно).
+ - **Пример**:
+
+ ```toml
+ [server]
+ listen_unix_sock = "/run/telemt.sock"
+ ```
+
+- `listen_unix_sock_perm`
+ - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, это должна быть восьмеричная строка разрешения, например `"0666"` или `"0777"`.
+ - **Описание**: Дополнительные разрешения для файлов сокетов Unix, применяемые после привязки (chmod). Если этот параметр опущен, разрешения не изменяются (наследует umask).
+ - **Пример**:
+
+ ```toml
+ [server]
+ listen_unix_sock = "/run/telemt.sock"
+ listen_unix_sock_perm = "0666"
+ ```
+
+- `listen_tcp`
+ - **Ограничения / валидация**: `bool` (необязательно). Если этот параметр опущен, Telemt автоматически обнаруживает:
+- `true`, если `listen_unix_sock` не установлен
+- «false», если установлен «listen_unix_sock».
+ - **Описание**: Явный прослушиватель TCP включает/отключает переопределение.
+ - **Пример**:
+
+ ```toml
+ [server]
+ # force-enable TCP even when also binding a unix socket
+ listen_unix_sock = "/run/telemt.sock"
+ listen_tcp = true
+ ```
+
+- `proxy_protocol`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает анализ протокола HAProxy PROXY при входящих соединениях (PROXY v1/v2). Если этот параметр включен, исходный адрес клиента берется из заголовка PROXY.
+ - **Пример**:
+
+ ```toml
+ [server]
+ proxy_protocol = true
+ ```
+
+- `proxy_protocol_header_timeout_ms`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды).
+ - **Описание**: Таймаут чтения и анализа заголовков протокола PROXY (мс).
+ - **Пример**:
+
+ ```toml
+ [server]
+ proxy_protocol = true
+ proxy_protocol_header_timeout_ms = 500
+ ```
+
+- `proxy_protocol_trusted_cidrs`
+ - **Ограничения / валидация**: `IpNetwork[]`.
+- Если этот параметр опущен, по умолчанию используются доверительные все CIDR (`0.0.0.0/0` и `::/0`).
+- Если явно задан пустой массив, все заголовки PROXY отклоняются.
+ - **Описание**: CIDR доверенного источника позволяют предоставлять заголовки протокола PROXY (контроль безопасности).
+ - **Пример**:
+
+ ```toml
+ [server]
+ proxy_protocol = true
+ proxy_protocol_trusted_cidrs = ["127.0.0.1/32", "10.0.0.0/8"]
+ ```
+
+- `metrics_port`
+ - **Ограничения / валидация**: `u16` (необязательно).
+ - **Описание**: Порт конечной точки метрик, совместимый с Prometheus. Если установлено, включает прослушиватель метрик (поведение привязки можно переопределить с помощью `metrics_listen`).
+ - **Пример**:
+
+ ```toml
+ [server]
+ metrics_port = 9090
+ ```
+
+- `metrics_listen`
+ - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, оно должно быть в формате IP:PORT.
+ - **Описание**: Полный адрес привязки метрик (`IP:PORT`) переопределяет `metrics_port` и привязывается только к указанному адресу.
+ - **Пример**:
+
+ ```toml
+ [server]
+ metrics_listen = "127.0.0.1:9090"
+ ```
+
+- `metrics_whitelist`
+ - **Ограничения / валидация**: `IpNetwork[]`.
+ - **Описание**: Белый список CIDR для доступа к конечной точке метрик.
+ - **Пример**:
+
+ ```toml
+ [server]
+ metrics_port = 9090
+ metrics_whitelist = ["127.0.0.1/32", "::1/128"]
+ ```
+
+- `max_connections`
+ - **Ограничения / валидация**: `u32`. `0` означает неограниченный.
+ - **Описание**: Максимальное количество одновременных клиентских подключений.
+ - **Пример**:
+
+ ```toml
+ [server]
+ max_connections = 10000
+ ```
+
+- `accept_permit_timeout_ms`
+ - **Ограничения / валидация**: `0..=60000` (миллисекунды). `0` сохраняет устаревшее неограниченное поведение ожидания.
+ - **Описание**: Максимальное время ожидания получения разрешения на слот подключения, прежде чем принятое соединение будет разорвано.
+ - **Пример**:
+
+ ```toml
+ [server]
+ accept_permit_timeout_ms = 250
+ ```
+
+
+Примечание. Когда `server.proxy_protocol` включен, входящие заголовки протокола PROXY анализируются с первых байтов соединения, а исходный адрес клиента заменяется на `src_addr` из заголовка. В целях безопасности IP-адрес однорангового источника (адрес прямого соединения) проверяется по `server.proxy_protocol_trusted_cidrs`; если этот список пуст, заголовки PROXY отклоняются и соединение считается ненадежным.
+
+## [server.conntrack_control]
+
+Примечание. Рабочий процесс conntrack-control работает **только в Linux**. В других операционных системах не запускается; если inline_conntrack_control имеет значение true, записывается предупреждение. Для эффективной работы также требуется **CAP_NET_ADMIN** и пригодный к использованию бэкенд (nft или iptables/ip6tables в PATH). Утилита `conntrack` используется для удаления необязательных записей таблицы под давлением.
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`inline_conntrack_control`](#cfg-server-conntrack_control-inline_conntrack_control) | `bool` | `true` |
+| [`mode`](#cfg-server-conntrack_control-mode) | `String` | `"tracked"` |
+| [`backend`](#cfg-server-conntrack_control-backend) | `String` | `"auto"` |
+| [`profile`](#cfg-server-conntrack_control-profile) | `String` | `"balanced"` |
+| [`hybrid_listener_ips`](#cfg-server-conntrack_control-hybrid_listener_ips) | `IpAddr[]` | `[]` |
+| [`pressure_high_watermark_pct`](#cfg-server-conntrack_control-pressure_high_watermark_pct) | `u8` | `85` |
+| [`pressure_low_watermark_pct`](#cfg-server-conntrack_control-pressure_low_watermark_pct) | `u8` | `70` |
+| [`delete_budget_per_sec`](#cfg-server-conntrack_control-delete_budget_per_sec) | `u64` | `4096` |
+
+
+- `inline_conntrack_control`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Главный переключатель для задачи conntrack-control во время выполнения: согласовывает правила сетевого фильтра **raw/notrack** для входа прослушивателя (см. `mode`), образцы загружаются каждую секунду и может запускать **`conntrack -D`** удаления для квалификации событий закрытия, пока **pressure mode** активен (см. `delete_budget_per_sec`). Если установлено значение false, правила отслеживания очищаются, а принудительное удаление отключается.
+ - **Пример**:
+
+ ```toml
+ [server.conntrack_control]
+ inline_conntrack_control = true
+ ```
+
+- `mode`
+ - **Ограничения / валидация**: Один из вариантов: «отслеживаемый», «без отслеживания», «гибридный» (регистронезависимый; сериализованный нижний регистр).
+ - **Описание**: **`tracked`**: не устанавливать правила telemt notrack (соединения остаются в состоянии conntrack). **`notrack`**: пометить совпадение входящего TCP с `server.port` как notrack — целевые объекты получаются из `[[server.listeners]]`, если таковые имеются, в противном случае из `server.listen_addr_ipv4` / `server.listen_addr_ipv6` (неуказанные адреса означают «любой» для этого семейства). **`hybrid`**: не отслеживать только адреса, перечисленные в `hybrid_listener_ips` (должно быть непустым; проверяется при загрузке).
+ - **Пример**:
+
+ ```toml
+ [server.conntrack_control]
+ mode = "notrack"
+ ```
+
+- `backend`
+ - **Ограничения / валидация**: Один из `auto`, `nftables`, `iptables` (без учета регистра; сериализованный нижний регистр).
+ - **Описание**: Какой набор команд применяет правила отслеживания. **`auto`**: используйте `nft`, если он присутствует в `PATH`, иначе `iptables`/`ip6tables`, если он присутствует. **`nftables`** / **`iptables`**: принудительно использовать этот бэкэнд; отсутствие двоичного кода означает, что правила невозможно применить. Путь nft использует таблицу `inet telemt_conntrack` и необработанный перехват предварительной маршрутизации; iptables использует цепочку TELEMT_NOTRACK в таблице raw.
+ - **Пример**:
+
+ ```toml
+ [server.conntrack_control]
+ backend = "auto"
+ ```
+
+- `profile`
+ - **Ограничения / валидация**: Один из «консервативных», «сбалансированных», «агрессивных» (без учета регистра; сериализованный нижний регистр).
+ - **Описание**: Когда **режим давления conntrack** активен (водяные знаки `pressure_*`), ограничиваются тайм-ауты простоя и активности, чтобы уменьшить отток коннтреков: например. **первый байт простоя клиента** (`client.rs`), **тайм-аут активности прямой ретрансляции** (`direct_relay.rs`) и **политика простоя среднего реле** (`middle_relay.rs` через `ConntrackPressureProfile::*_cap_secs` / `direct_activity_timeout_secs`). В более агрессивных профилях используются более короткие заглушки.
+ - **Пример**:
+
+ ```toml
+ [server.conntrack_control]
+ profile = "balanced"
+ ```
+
+- `hybrid_listener_ips`
+ - **Ограничения / валидация**: `IpAddr[]`. Должно быть **непустым**, когда `mode = "hybrid"`. Игнорируется для отслеживаемых/безотслеживаемых сообщений.
+ - **Описание**: Явные адреса прослушивателя, которые получают правила nottrack в гибридном режиме (разделенные на правила IPv4 и IPv6 в зависимости от реализации).
+ - **Пример**:
+
+ ```toml
+ [server.conntrack_control]
+ mode = "hybrid"
+ hybrid_listener_ips = ["203.0.113.10", "2001:db8::1"]
+ ```
+
+- `pressure_high_watermark_pct`
+ - **Ограничения / валидация**: Должно быть в пределах `[1, 100]`.
+ - **Описание**: Режим давления **входит** при любом из следующих событий: заполнение соединения или `server.max_connections` (в процентах, если `max_connections > 0`), **использование файлового дескриптора** и программное обеспечение процесса `RLIMIT_NOFILE`, **ненулевое** событие `accept_permit_timeout` в последнем окне примера или дельта счетчика **ME c2me send-full**. Ввод сравнивает соответствующие проценты с этой верхней отметкой (см. update_pressure_state в conntrack_control.rs).
+ - **Пример**:
+
+ ```toml
+ [server.conntrack_control]
+ pressure_high_watermark_pct = 85
+ ```
+
+- `pressure_low_watermark_pct`
+ - **Ограничения / валидация**: Должно быть **строго меньше** `pressure_high_watermark_pct`.
+ - **Описание**: Режим давления **сбрасывается** только после **трех** последовательных односекундных выборок, когда все сигналы находятся на уровне этой нижней границы или ниже, а дельты времени ожидания приема/ME-очереди равны нулю (гистерезис).
+ - **Пример**:
+
+ ```toml
+ [server.conntrack_control]
+ pressure_low_watermark_pct = 70
+ ```
+
+- `delete_budget_per_sec`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Максимальное количество попыток **`conntrack -D`** **в секунду** при активном режиме давления (корзина токенов пополняется каждую секунду). Удаление выполняется только для событий закрытия по причинам **тайм-аут**, **давление** или **сброс**; каждая попытка потребляет токен независимо от результата.
+ - **Пример**:
+
+ ```toml
+ [server.conntrack_control]
+ delete_budget_per_sec = 4096
+ ```
+
+
+## [server.api]
+
+Примечание. В этом разделе также принимается устаревший псевдоним `[server.admin_api]` (та же схема, что и `[server.api]`).
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`enabled`](#cfg-server-api-enabled) | `bool` | `true` |
+| [`listen`](#cfg-server-api-listen) | `String` | `"0.0.0.0:9091"` |
+| [`whitelist`](#cfg-server-api-whitelist) | `IpNetwork[]` | `["127.0.0.0/8"]` |
+| [`auth_header`](#cfg-server-api-auth_header) | `String` | `""` |
+| [`request_body_limit_bytes`](#cfg-server-api-request_body_limit_bytes) | `usize` | `65536` |
+| [`minimal_runtime_enabled`](#cfg-server-api-minimal_runtime_enabled) | `bool` | `true` |
+| [`minimal_runtime_cache_ttl_ms`](#cfg-server-api-minimal_runtime_cache_ttl_ms) | `u64` | `1000` |
+| [`runtime_edge_enabled`](#cfg-server-api-runtime_edge_enabled) | `bool` | `false` |
+| [`runtime_edge_cache_ttl_ms`](#cfg-server-api-runtime_edge_cache_ttl_ms) | `u64` | `1000` |
+| [`runtime_edge_top_n`](#cfg-server-api-runtime_edge_top_n) | `usize` | `10` |
+| [`runtime_edge_events_capacity`](#cfg-server-api-runtime_edge_events_capacity) | `usize` | `256` |
+| [`read_only`](#cfg-server-api-read_only) | `bool` | `false` |
+
+
+- `enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает REST API плоскости управления.
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ enabled = true
+ ```
+
+- `listen`
+ - **Ограничения / валидация**: `Строка`. Должен быть в формате IP:PORT.
+ - **Описание**: Адрес привязки API в формате IP:PORT.
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ listen = "0.0.0.0:9091"
+ ```
+
+- `whitelist`
+ - **Ограничения / валидация**: `IpNetwork[]`.
+ - **Описание**: Белый список CIDR разрешил доступ к API.
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ whitelist = ["127.0.0.0/8"]
+ ```
+
+- `auth_header`
+ - **Ограничения / валидация**: `Строка`. Пустая строка отключает проверку заголовка аутентификации.
+ - **Описание**: Точное ожидаемое значение заголовка `Authorization` (статический общий секрет).
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ auth_header = "Bearer MY_TOKEN"
+ ```
+
+- `request_body_limit_bytes`
+ - **Ограничения / валидация**: Должно быть `> 0` (байты).
+ - **Описание**: Максимальный принимаемый размер тела HTTP-запроса (в байтах).
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ request_body_limit_bytes = 65536
+ ```
+
+- `minimal_runtime_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает минимальную логику конечной точки снимков времени выполнения.
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ minimal_runtime_enabled = true
+ ```
+
+- `minimal_runtime_cache_ttl_ms`
+ - **Ограничения / валидация**: `0..=60000` (миллисекунды). `0` отключает кеш.
+ - **Описание**: Срок жизни кэша для минимальных снимков времени выполнения (мс).
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ minimal_runtime_cache_ttl_ms = 1000
+ ```
+
+- `runtime_edge_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает конечные точки границ среды выполнения.
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ runtime_edge_enabled = false
+ ```
+
+- `runtime_edge_cache_ttl_ms`
+ - **Ограничения / валидация**: `0..=60000` (миллисекунды).
+ - **Описание**: Срок жизни кэша для полезных данных агрегации границ во время выполнения (мс).
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ runtime_edge_cache_ttl_ms = 1000
+ ```
+
+- `runtime_edge_top_n`
+ - **Ограничения / валидация**: `1..=1000`.
+ - **Описание**: Размер Top-N для таблицы лидеров краевых соединений.
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ runtime_edge_top_n = 10
+ ```
+
+- `runtime_edge_events_capacity`
+ - **Ограничения / валидация**: `16..=4096`.
+ - **Описание**: Емкость кольцевого буфера для пограничных событий во время выполнения.
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ runtime_edge_events_capacity = 256
+ ```
+
+- `read_only`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Отклоняет изменение конечных точек API, если оно включено.
+ - **Пример**:
+
+ ```toml
+ [server.api]
+ read_only = false
+ ```
+
+
+## [[server.listeners]]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`ip`](#cfg-server-listeners-ip) | `IpAddr` | — |
+| [`announce`](#cfg-server-listeners-announce) | `String` | — |
+| [`announce_ip`](#cfg-server-listeners-announce_ip) | `IpAddr` | — |
+| [`proxy_protocol`](#cfg-server-listeners-proxy_protocol) | `bool` | — |
+| [`reuse_allow`](#cfg-server-listeners-reuse_allow) | `bool` | `false` |
+
+
+- `ip`
+ - **Ограничения / валидация**: Обязательное поле. Должен быть IPAddr.
+ - **Описание**: IP-адрес привязки прослушивателя.
+ - **Пример**:
+
+ ```toml
+ [[server.listeners]]
+ ip = "0.0.0.0"
+ ```
+
+- `announce`
+ - **Ограничения / валидация**: `Строка` (необязательно). Не должно быть пустым, если установлено.
+ - **Описание**: Публичный IP-адрес/домен, объявленный в прокси-ссылках для этого прослушивателя. Имеет приоритет над announce_ip.
+ - **Пример**:
+
+ ```toml
+ [[server.listeners]]
+ ip = "0.0.0.0"
+ announce = "proxy.example.com"
+ ```
+
+- `announce_ip`
+ - **Ограничения / валидация**: `IpAddr` (необязательно). Устарело. Используйте «объявить».
+ - **Описание**: Устаревший устаревший IP-адрес объявления. Во время загрузки конфигурации он переводится в «announce», если «announce» не установлен.
+ - **Пример**:
+
+ ```toml
+ [[server.listeners]]
+ ip = "0.0.0.0"
+ announce_ip = "203.0.113.10"
+ ```
+
+- `proxy_protocol`
+ - **Ограничения / валидация**: `bool` (необязательно). Если установлено, переопределяет `server.proxy_protocol` для этого прослушивателя.
+ - **Описание**: Переопределение протокола PROXY для каждого слушателя.
+ - **Пример**:
+
+ ```toml
+ [server]
+ proxy_protocol = false
+
+ [[server.listeners]]
+ ip = "0.0.0.0"
+ proxy_protocol = true
+ ```
+
+- `reuse_allow`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает `SO_REUSEPORT` для совместного использования привязки нескольких экземпляров (позволяет нескольким экземплярам telemt прослушивать один и тот же `ip:port`).
+ - **Пример**:
+
+ ```toml
+ [[server.listeners]]
+ ip = "0.0.0.0"
+ reuse_allow = false
+ ```
+
+
+## [timeouts]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`client_handshake`](#cfg-timeouts-client_handshake) | `u64` | `30` |
+| [`relay_idle_policy_v2_enabled`](#cfg-timeouts-relay_idle_policy_v2_enabled) | `bool` | `true` |
+| [`relay_client_idle_soft_secs`](#cfg-timeouts-relay_client_idle_soft_secs) | `u64` | `120` |
+| [`relay_client_idle_hard_secs`](#cfg-timeouts-relay_client_idle_hard_secs) | `u64` | `360` |
+| [`relay_idle_grace_after_downstream_activity_secs`](#cfg-timeouts-relay_idle_grace_after_downstream_activity_secs) | `u64` | `30` |
+| [`tg_connect`](#cfg-timeouts-tg_connect) | `u64` | `10` |
+| [`client_keepalive`](#cfg-timeouts-client_keepalive) | `u64` | `15` |
+| [`client_ack`](#cfg-timeouts-client_ack) | `u64` | `90` |
+| [`me_one_retry`](#cfg-timeouts-me_one_retry) | `u8` | `12` |
+| [`me_one_timeout_ms`](#cfg-timeouts-me_one_timeout_ms) | `u64` | `1200` |
+
+
+- `client_handshake`
+ - **Ограничения / валидация**: Должно быть `> 0`. Значение указано в секундах. Также используется в качестве верхней границы некоторых задержек эмуляции TLS (см. `censorship.server_hello_delay_max_ms`).
+ - **Описание**: Тайм-аут установления связи клиента (в секундах).
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ client_handshake = 30
+ ```
+
+- `relay_idle_policy_v2_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает политику простоя клиента среднего/жесткого промежуточного реле.
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ relay_idle_policy_v2_enabled = true
+ ```
+
+- `relay_client_idle_soft_secs`
+ - **Ограничения / валидация**: Должно быть `> 0`; должно быть `<=lay_client_idle_hard_secs`.
+ - **Описание**: Порог мягкого простоя (в секундах) для неактивности восходящей линии связи клиента среднего ретранслятора. Достижение этого порога отмечает сеанс как бездействующего кандидата (в зависимости от политики он может подлежать очистке).
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ relay_client_idle_soft_secs = 120
+ ```
+
+- `relay_client_idle_hard_secs`
+ - **Ограничения / валидация**: Должно быть `> 0`; должно быть `>=lay_client_idle_soft_secs`.
+ - **Описание**: Порог жесткого простоя (в секундах) для неактивности восходящей линии связи клиента среднего ретранслятора. Достижение этого порога закрывает сессию.
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ relay_client_idle_hard_secs = 360
+ ```
+
+- `relay_idle_grace_after_downstream_activity_secs`
+ - **Ограничения / валидация**: Должно быть `<=lay_client_idle_hard_secs`.
+ - **Описание**: Дополнительный льготный период жесткого простоя (в секундах), добавленный после недавней активности в нисходящем направлении.
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ relay_idle_grace_after_downstream_activity_secs = 30
+ ```
+
+- `tg_connect`
+ - **Ограничения / валидация**: `u64`. Значение указано в секундах.
+ - **Описание**: Тайм-аут восходящего соединения Telegram (в секундах).
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ tg_connect = 10
+ ```
+
+- `client_keepalive`
+ - **Ограничения / валидация**: `u64`. Значение указано в секундах.
+ - **Описание**: Тайм-аут поддержки активности клиента (в секундах).
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ client_keepalive = 15
+ ```
+
+- `client_ack`
+ - **Ограничения / валидация**: `u64`. Значение указано в секундах.
+ - **Описание**: Таймаут подтверждения клиента (в секундах).
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ client_ack = 90
+ ```
+
+- `me_one_retry`
+ - **Ограничения / валидация**: `u8`.
+ - **Описание**: Бюджет попыток быстрого повторного подключения для сценариев DC с одной конечной точкой.
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ me_one_retry = 12
+ ```
+
+- `me_one_timeout_ms`
+ - **Ограничения / валидация**: `u64`. Значение указано в миллисекундах.
+ - **Описание**: Тайм-аут на быструю попытку (мс) для логики повторного подключения постоянного тока с одной конечной точкой.
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ me_one_timeout_ms = 1200
+ ```
+
+
+## [censorship]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`tls_domain`](#cfg-censorship-tls_domain) | `String` | `"petrovich.ru"` |
+| [`tls_domains`](#cfg-censorship-tls_domains) | `String[]` | `[]` |
+| [`unknown_sni_action`](#cfg-censorship-unknown_sni_action) | `"drop"` or `"mask"` | `"drop"` |
+| [`tls_fetch_scope`](#cfg-censorship-tls_fetch_scope) | `String` | `""` |
+| [`tls_fetch`](#cfg-censorship-tls_fetch) | `Table` | built-in defaults |
+| [`mask`](#cfg-censorship-mask) | `bool` | `true` |
+| [`mask_host`](#cfg-censorship-mask_host) | `String` | — |
+| [`mask_port`](#cfg-censorship-mask_port) | `u16` | `443` |
+| [`mask_unix_sock`](#cfg-censorship-mask_unix_sock) | `String` | — |
+| [`fake_cert_len`](#cfg-censorship-fake_cert_len) | `usize` | `2048` |
+| [`tls_emulation`](#cfg-censorship-tls_emulation) | `bool` | `true` |
+| [`tls_front_dir`](#cfg-censorship-tls_front_dir) | `String` | `"tlsfront"` |
+| [`server_hello_delay_min_ms`](#cfg-censorship-server_hello_delay_min_ms) | `u64` | `0` |
+| [`server_hello_delay_max_ms`](#cfg-censorship-server_hello_delay_max_ms) | `u64` | `0` |
+| [`tls_new_session_tickets`](#cfg-censorship-tls_new_session_tickets) | `u8` | `0` |
+| [`tls_full_cert_ttl_secs`](#cfg-censorship-tls_full_cert_ttl_secs) | `u64` | `90` |
+| [`alpn_enforce`](#cfg-censorship-alpn_enforce) | `bool` | `true` |
+| [`mask_proxy_protocol`](#cfg-censorship-mask_proxy_protocol) | `u8` | `0` |
+| [`mask_shape_hardening`](#cfg-censorship-mask_shape_hardening) | `bool` | `true` |
+| [`mask_shape_hardening_aggressive_mode`](#cfg-censorship-mask_shape_hardening_aggressive_mode) | `bool` | `false` |
+| [`mask_shape_bucket_floor_bytes`](#cfg-censorship-mask_shape_bucket_floor_bytes) | `usize` | `512` |
+| [`mask_shape_bucket_cap_bytes`](#cfg-censorship-mask_shape_bucket_cap_bytes) | `usize` | `4096` |
+| [`mask_shape_above_cap_blur`](#cfg-censorship-mask_shape_above_cap_blur) | `bool` | `false` |
+| [`mask_shape_above_cap_blur_max_bytes`](#cfg-censorship-mask_shape_above_cap_blur_max_bytes) | `usize` | `512` |
+| [`mask_relay_max_bytes`](#cfg-censorship-mask_relay_max_bytes) | `usize` | `5242880` |
+| [`mask_classifier_prefetch_timeout_ms`](#cfg-censorship-mask_classifier_prefetch_timeout_ms) | `u64` | `5` |
+| [`mask_timing_normalization_enabled`](#cfg-censorship-mask_timing_normalization_enabled) | `bool` | `false` |
+| [`mask_timing_normalization_floor_ms`](#cfg-censorship-mask_timing_normalization_floor_ms) | `u64` | `0` |
+| [`mask_timing_normalization_ceiling_ms`](#cfg-censorship-mask_timing_normalization_ceiling_ms) | `u64` | `0` |
+
+
+- `tls_domain`
+ - **Ограничения / валидация**: Должно быть непустое доменное имя. Не должно содержать пробелов или `/`.
+ - **Описание**: Основной домен TLS, используемый в профиле подтверждения FakeTLS и в качестве домена SNI по умолчанию.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ tls_domain = "example.com"
+ ```
+
+- `tls_domains`
+ - **Ограничения / валидация**: `Строка[]`. Если установлено, значения объединяются с tls_domain и дедуплицируются (первичный tls_domain всегда остается первым).
+ - **Описание**: Дополнительные домены TLS для создания нескольких прокси-ссылок.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ tls_domain = "example.com"
+ tls_domains = ["example.net", "example.org"]
+ ```
+
+- `unknown_sni_action`
+ - **Ограничения / валидация**: «капля» или «маска».
+ - **Описание**: Действие для TLS ClientHello с неизвестным/ненастроенным SNI.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ unknown_sni_action = "drop"
+ ```
+
+- `tls_fetch_scope`
+ - **Ограничения / валидация**: `Строка`. Значение обрезается во время загрузки; whitespace-only становится пустым.
+ - **Описание**: Тег области восходящего потока, используемый для выборки метаданных TLS-фронт. Пустое значение сохраняет поведение восходящей маршрутизации по умолчанию.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ tls_fetch_scope = "fetch"
+ ```
+
+- `tls_fetch`
+ - **Ограничения / валидация**: Стол. См. раздел «[censorship.tls_fetch]» ниже.
+ - **Описание**: Настройки стратегии выборки метаданных TLS (начальная загрузка + поведение обновления для данных эмуляции TLS).
+ - **Пример**:
+
+ ```toml
+ [censorship.tls_fetch]
+ strict_route = true
+ attempt_timeout_ms = 5000
+ total_budget_ms = 15000
+ ```
+
+- `mask`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает режим маскировки/переднего реле.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask = true
+ ```
+
+- `mask_host`
+ - **Ограничения / валидация**: `Строка` (необязательно).
+- Если установлена маска_unix_sock, маска_хост должна быть опущена (взаимоисключающая).
+- Если `mask_host` не установлен и `mask_unix_sock` не установлен, Telemt по умолчанию устанавливает для `mask_host` значение `tls_domain`.
+ - **Описание**: Хост восходящей маски для фронтального реле TLS.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_host = "www.cloudflare.com"
+ ```
+
+- `mask_port`
+ - **Ограничения / валидация**: `u16`.
+ - **Описание**: Восходящий порт маски для фронтального реле TLS.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_port = 443
+ ```
+
+- `mask_unix_sock`
+ - **Ограничения / валидация**: `Строка` (необязательно).
+- Не должно быть пустым, если установлено.
+- Только Unix; отклонено на платформах, отличных от Unix.
+- В Unix должно быть \(\le 107\) байт (ограничение длины пути).
+- Взаимоисключающий с `mask_host`.
+ - **Описание**: Путь сокета Unix для серверной части маски вместо TCP `mask_host`/`mask_port`.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_unix_sock = "/run/telemt/mask.sock"
+ ```
+
+- `fake_cert_len`
+ - **Ограничения / валидация**: `использовать`. Когда `tls_emulation = false` и используется значение по умолчанию, Telemt может рандомизировать его при запуске для обеспечения вариативности.
+ - **Описание**: Длина полезных данных синтетического сертификата, когда данные эмуляции недоступны.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ fake_cert_len = 2048
+ ```
+
+- `tls_emulation`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает эмуляцию поведения сертификата/TLS из кэшированных реальных фронтов.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ tls_emulation = true
+ ```
+
+- `tls_front_dir`
+ - **Ограничения / валидация**: `Строка`.
+ - **Описание**: Путь к каталогу для хранения переднего кэша TLS.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ tls_front_dir = "tlsfront"
+ ```
+
+- `server_hello_delay_min_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды).
+ - **Описание**: Минимальная задержка server_hello для защиты от отпечатков пальцев (мс).
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ server_hello_delay_min_ms = 0
+ ```
+
+- `server_hello_delay_max_ms`
+ - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть \(<\) `timeouts.client_handshake * 1000`.
+ - **Описание**: Максимальная задержка `server_hello` для защиты от отпечатков пальцев (мс).
+ - **Пример**:
+
+ ```toml
+ [timeouts]
+ client_handshake = 30
+
+ [censorship]
+ server_hello_delay_max_ms = 0
+ ```
+
+- `tls_new_session_tickets`
+ - **Ограничения / валидация**: `u8`.
+ - **Описание**: Количество сообщений NewSessionTicket, отправляемых после рукопожатия.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ tls_new_session_tickets = 0
+ ```
+
+- `tls_full_cert_ttl_secs`
+ - **Ограничения / валидация**: `u64` (секунды).
+ - **Описание**: TTL для отправки полной полезной нагрузки сертификата для каждого кортежа (домен, IP-адрес клиента).
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ tls_full_cert_ttl_secs = 90
+ ```
+
+- `alpn_enforce`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Обеспечивает поведение эха ALPN в зависимости от предпочтений клиента.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ alpn_enforce = true
+ ```
+
+- `mask_proxy_protocol`
+ - **Ограничения / валидация**: `u8`. `0` = отключено, `1` = v1 (текст), `2` = v2 (двоичный).
+ - **Описание**: Отправляет заголовок протокола PROXY при подключении к серверной части маски, позволяя серверной части видеть реальный IP-адрес клиента.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_proxy_protocol = 0
+ ```
+
+- `mask_shape_hardening`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает усиление жесткости канала формы клиента->маски путем применения контролируемого заполнения хвоста к границам сегмента при отключении реле маски.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_shape_hardening = true
+ ```
+
+- `mask_shape_hardening_aggressive_mode`
+ - **Ограничения / валидация**: Требуется «mask_shape_hardening = true».
+ - **Описание**: Включите агрессивный профиль формирования (более сильное антиклассификаторское поведение с различной семантикой формирования).
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_shape_hardening = true
+ mask_shape_hardening_aggressive_mode = false
+ ```
+
+- `mask_shape_bucket_floor_bytes`
+ - **Ограничения / валидация**: Должно быть `> 0`; должно быть `<= Mask_shape_bucket_cap_bytes`.
+ - **Описание**: Минимальный размер ковша, используемый при закалке в форме канала.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_shape_bucket_floor_bytes = 512
+ ```
+
+- `mask_shape_bucket_cap_bytes`
+ - **Ограничения / валидация**: Должно быть `>= Mask_shape_bucket_floor_bytes`.
+ - **Описание**: Максимальный размер ковша, используемый при фасонно-канальной закалке; трафик, превышающий ограничение, не дополняется дальше.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_shape_bucket_cap_bytes = 4096
+ ```
+
+- `mask_shape_above_cap_blur`
+ - **Ограничения / валидация**: Требуется «mask_shape_hardening = true».
+ - **Описание**: Добавляет ограниченные рандомизированные хвостовые байты, даже если пересылаемый размер уже превышает ограничение.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_shape_hardening = true
+ mask_shape_above_cap_blur = false
+ ```
+
+- `mask_shape_above_cap_blur_max_bytes`
+ - **Ограничения / валидация**: Должно быть `<= 1048576`. Должно быть `> 0`, когда `mask_shape_above_cap_blur = true`.
+ - **Описание**: Максимальное количество случайных дополнительных байтов, добавляемых выше ограничения, если включено размытие выше ограничения.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_shape_above_cap_blur = true
+ mask_shape_above_cap_blur_max_bytes = 64
+ ```
+
+- `mask_relay_max_bytes`
+ - **Ограничения / валидация**: Должно быть `> 0`; должно быть `<= 67108864`.
+ - **Описание**: Максимальное количество ретранслируемых байтов в каждом направлении по резервному пути маскировки без аутентификации.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_relay_max_bytes = 5242880
+ ```
+
+- `mask_classifier_prefetch_timeout_ms`
+ - **Ограничения / валидация**: Должно быть в пределах `[5, 50]` (миллисекунды).
+ - **Описание**: Бюджет тайм-аута (мс) для расширения фрагментированного начального окна классификатора при откате маскирования.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_classifier_prefetch_timeout_ms = 5
+ ```
+
+- `mask_timing_normalization_enabled`
+ - **Ограничения / валидация**: Если задано значение true, требуется маска_timing_normalization_floor_ms > 0 и маска_timing_normalization_ceiling_ms >= Mask_timing_normalization_floor_ms. Потолок должен быть `<= 60000`.
+ - **Описание**: Включает нормализацию временного конверта для результатов маскировки.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_timing_normalization_enabled = false
+ ```
+
+- `mask_timing_normalization_floor_ms`
+ - **Ограничения / валидация**: Должно быть `> 0`, если нормализация времени включена; должно быть `<= Mask_timing_normalization_ceiling_ms`.
+ - **Описание**: Нижняя граница (мс) для маскировки цели нормализации результата.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_timing_normalization_floor_ms = 0
+ ```
+
+- `mask_timing_normalization_ceiling_ms`
+ - **Ограничения / валидация**: Должно быть `>= Mask_timing_normalization_floor_ms`; должно быть `<= 60000`.
+ - **Описание**: Верхняя граница (мс) для маскировки цели нормализации результата.
+ - **Пример**:
+
+ ```toml
+ [censorship]
+ mask_timing_normalization_ceiling_ms = 0
+ ```
+
+
+## [censorship.tls_fetch]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`profiles`](#cfg-censorship-tls_fetch-profiles) | `String[]` | `["modern_chrome_like", "modern_firefox_like", "compat_tls12", "legacy_minimal"]` |
+| [`strict_route`](#cfg-censorship-tls_fetch-strict_route) | `bool` | `true` |
+| [`attempt_timeout_ms`](#cfg-censorship-tls_fetch-attempt_timeout_ms) | `u64` | `5000` |
+| [`total_budget_ms`](#cfg-censorship-tls_fetch-total_budget_ms) | `u64` | `15000` |
+| [`grease_enabled`](#cfg-censorship-tls_fetch-grease_enabled) | `bool` | `false` |
+| [`deterministic`](#cfg-censorship-tls_fetch-deterministic) | `bool` | `false` |
+| [`profile_cache_ttl_secs`](#cfg-censorship-tls_fetch-profile_cache_ttl_secs) | `u64` | `600` |
+
+
+- `profiles`
+ - **Ограничения / валидация**: `Строка[]`. Пустой список возвращает значения по умолчанию; значения дедуплицируются с сохранением порядка.
+ - **Описание**: Упорядоченная резервная цепочка профиля ClientHello для выборки метаданных TLS-фронт.
+ - **Пример**:
+
+ ```toml
+ [censorship.tls_fetch]
+ profiles = ["modern_chrome_like", "compat_tls12"]
+ ```
+
+- `strict_route`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Если true и восходящий маршрут настроен, выборка TLS не закрывается из-за ошибок восходящего соединения вместо возврата к прямому TCP.
+ - **Пример**:
+
+ ```toml
+ [censorship.tls_fetch]
+ strict_route = true
+ ```
+
+- `attempt_timeout_ms`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды).
+ - **Описание**: Бюджет таймаута на одну попытку получения профиля TLS (мс).
+ - **Пример**:
+
+ ```toml
+ [censorship.tls_fetch]
+ attempt_timeout_ms = 5000
+ ```
+
+- `total_budget_ms`
+ - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды).
+ - **Описание**: Общий бюджет настенных часов для всех попыток TLS-выборки (мс).
+ - **Пример**:
+
+ ```toml
+ [censorship.tls_fetch]
+ total_budget_ms = 15000
+ ```
+
+- `grease_enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает случайные значения в стиле GREASE в выбранных расширениях ClientHello для получения трафика.
+ - **Пример**:
+
+ ```toml
+ [censorship.tls_fetch]
+ grease_enabled = false
+ ```
+
+- `deterministic`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Включает детерминированную случайность ClientHello для отладки/тестирования.
+ - **Пример**:
+
+ ```toml
+ [censorship.tls_fetch]
+ deterministic = false
+ ```
+
+- `profile_cache_ttl_secs`
+ - **Ограничения / валидация**: `u64` (секунды). `0` отключает кеш.
+ - **Описание**: TTL для записей кэша профиля победителя, используемых путем выборки TLS.
+ - **Пример**:
+
+ ```toml
+ [censorship.tls_fetch]
+ profile_cache_ttl_secs = 600
+ ```
+
+
+### Shape-channel hardening notes (`[censorship]`)
+
+Эти параметры предназначены для уменьшения одного конкретного источника отпечатков пальцев во время маскировки: точного количества байтов, отправленных с прокси-сервера на «mask_host» для недействительного или пробного трафика.
+
+Без усиления цензор часто может очень точно сопоставить входную длину зонда с длиной, наблюдаемой серверной частью (например: `5 + body_sent` на ранних путях отклонения TLS). Это создает сигнал классификатора на основе длины.
+
+When `mask_shape_hardening = true`, Telemt pads the **client->mask** stream tail to a bucket boundary at relay shutdown:
+
+- Сначала измеряется общее количество байтов, отправленных в маску.
+- Ведро выбирается с использованием степеней двойки, начиная с «mask_shape_bucket_floor_bytes».
+— Заполнение добавляется только в том случае, если общее количество байтов меньше «mask_shape_bucket_cap_bytes».
+- Если байты уже превышают ограничение, дополнительное дополнение не добавляется.
+
+Это означает, что несколько близлежащих размеров зондов объединяются в один и тот же класс размеров, наблюдаемый серверной частью, что усложняет активную классификацию.
+
+Что каждый параметр меняет на практике:
+
+- `mask_shape_hardening`
+Включает или отключает весь этот этап формирования длины на резервном пути.
+Если установлено значение «false», длина, наблюдаемая серверной частью, остается близкой к реальной длине пересылаемого зонда.
+Если задано значение true, при чистом отключении реле могут добавляться случайные байты заполнения для перемещения итоговой суммы в корзину.
+- `mask_shape_bucket_floor_bytes`
+Устанавливает первую границу сегмента, используемую для небольших зондов.
+Пример: с этажом «512» некорректный зонд, который в противном случае пересылал бы «37» байтов, может быть расширен до «512» байтов в чистом EOF.
+Большие минимальные значения лучше скрывают очень маленькие зонды, но увеличивают стоимость выхода.
+- `mask_shape_bucket_cap_bytes`
+Устанавливает самый большой сегмент, который Telemt будет дополнять логикой сегмента.
+Пример: с ограничением `4096` общее количество пересылаемых байтов `1800` может быть дополнено до `2048` или `4096` в зависимости от лестницы сегментов, но общее количество, уже превышающее `4096`, не будет дополняться дальше.
+Большие значения ограничения увеличивают диапазон, в котором сворачиваются классы размеров, но также увеличивают накладные расходы в худшем случае.
+- Чистый EOF имеет значение в консервативном режиме.
+В профиле по умолчанию заполнение формы намеренно консервативно: оно применяется при чистом отключении реле, а не при каждом тайм-ауте или пути утечки.
+Это позволяет избежать появления новых артефактов тайм-аута, которые некоторые серверные части или тесты интерпретируют как отдельные отпечатки пальцев.
+
+Практические компромиссы:
+
+- Улучшена защита от отпечатков пальцев на канале размера/формы.
+- Немного выше выходные накладные расходы для небольших зондов из-за заполнения.
+- Поведение намеренно консервативно и включено по умолчанию.
+
+Рекомендуемый стартовый профиль:
+
+- `mask_shape_hardening = true` (default)
+- `mask_shape_bucket_floor_bytes = 512`
+- `mask_shape_bucket_cap_bytes = 4096`
+
+### Aggressive mode notes (`[censorship]`)
+
+«mask_shape_hardening_aggressive_mode» — это дополнительный профиль для более высокого давления антиклассификатора.
+
+- По умолчанию установлено значение «false», чтобы сохранить консервативное поведение по тайм-ауту/без хвоста.
+- Requires `mask_shape_hardening = true`.
+- Если этот параметр включен, могут формироваться бесшумные пути маскировки без EOF.
+- При включении вместе с размытием над верхним пределом случайный дополнительный хвост использует `[1, max]` вместо `[0, max]`.
+
+Что меняется при включении агрессивного режима:
+
+- Могут быть сформированы пути тайм-аута, не требующие бэкенда.
+В режиме по умолчанию клиент, который держит сокет полуоткрытым и имеет тайм-аут, обычно не будет получать заполнение формы по этому пути.
+В агрессивном режиме Telemt все равно может формировать этот сеанс без звука, если никакие байты серверной части не были возвращены.
+Это специально предназначено для активных зондов, которые пытаются избежать EOF, чтобы сохранить точную наблюдаемую длину.
+- Размытие над заглавной буквой всегда добавляет хотя бы один байт.
+В режиме по умолчанию для размытия над пределом может быть выбрано значение «0», поэтому некоторые зонды слишком большого размера по-прежнему попадают на точную базовую длину пересылки.
+В агрессивном режиме эта базовая выборка удаляется автоматически.
+- Компромисс
+Агрессивный режим повышает устойчивость к активным классификаторам длины, но он более упрям и менее консервативен.
+Если в вашем развертывании приоритетом является строгая совместимость с семантикой тайм-аута/без хвоста, оставьте ее отключенной.
+Если ваша модель угроз включает в себя повторяющиеся активные проверки цензором, этот режим является более сильным профилем.
+
+Используйте этот режим только в том случае, если ваша модель угроз отдает приоритет устойчивости классификатора над строгой совместимостью с консервативной семантикой маскировки.
+
+### Above-cap blur notes (`[censorship]`)
+
+«mask_shape_above_cap_blur» добавляет размытие второго этапа для очень больших зондов, которые уже находятся выше «mask_shape_bucket_cap_bytes».
+
+- В режиме по умолчанию добавляется случайный хвост в `[0, Mask_shape_above_cap_blur_max_bytes]`.
+— В агрессивном режиме случайный хвост становится строго положительным: `[1, Mask_shape_above_cap_blur_max_bytes]`.
+- Это уменьшает утечку точного размера выше ограничения при ограниченных накладных расходах.
+— Сохраняйте «mask_shape_above_cap_blur_max_bytes» консервативным, чтобы избежать ненужного роста выходного сигнала.
+
+Операционное значение:
+
+- Без размытия над шапкой
+Зонд, который пересылает 5005 байтов, по-прежнему будет выглядеть как 5005 байт на серверную часть, если он уже превышает ограничение.
+- С включенным размытием над шапкой
+Тот же самый зонд может выглядеть как любое значение в ограниченном окне, превышающем его базовую длину.
+ Example with `mask_shape_above_cap_blur_max_bytes = 64`:
+наблюдаемый на сервере размер становится «5005..5069» в режиме по умолчанию или «5006..5069» в агрессивном режиме.
+- Выбор `mask_shape_above_cap_blur_max_bytes`
+Небольшие значения снижают затраты, но сохраняют большую степень разделения между удаленными друг от друга негабаритными классами.
+Большие значения размывают слишком большие классы более агрессивно, но добавляют больше исходящих издержек и большую дисперсию выходных данных.
+
+### Timing normalization envelope notes (`[censorship]`)
+
+`mask_timing_normalization_enabled` сглаживает разницу во времени между результатами маскировки, применяя целевой диапазон длительности.
+
+- Случайная цель выбирается в `[mask_timing_normalization_floor_ms, Mask_timing_normalization_ceiling_ms]`.
+- Быстрые пути задерживаются до выбранной цели.
+- Медленные пути не обязательно заканчиваются у потолка (огибающая формируется с максимальной эффективностью, а не усекается).
+
+Рекомендуемый стартовый профиль для формирования тайминга:
+
+- `mask_timing_normalization_enabled = true`
+- `mask_timing_normalization_floor_ms = 180`
+- `mask_timing_normalization_ceiling_ms = 320`
+
+Если ваша серверная часть или сеть сильно ограничена в пропускной способности, сначала уменьшите ограничение. Если датчики все еще слишком различимы в вашей среде, постепенно увеличивайте минимальное значение.
+
+## [access]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`users`](#cfg-access-users) | `Map` | `{"default": "000…000"}` |
+| [`user_ad_tags`](#cfg-access-user_ad_tags) | `Map` | `{}` |
+| [`user_max_tcp_conns`](#cfg-access-user_max_tcp_conns) | `Map` | `{}` |
+| [`user_max_tcp_conns_global_each`](#cfg-access-user_max_tcp_conns_global_each) | `usize` | `0` |
+| [`user_expirations`](#cfg-access-user_expirations) | `Map>` | `{}` |
+| [`user_data_quota`](#cfg-access-user_data_quota) | `Map` | `{}` |
+| [`user_max_unique_ips`](#cfg-access-user_max_unique_ips) | `Map` | `{}` |
+| [`user_max_unique_ips_global_each`](#cfg-access-user_max_unique_ips_global_each) | `usize` | `0` |
+| [`user_max_unique_ips_mode`](#cfg-access-user_max_unique_ips_mode) | `"active_window"`, `"time_window"`, or `"combined"` | `"active_window"` |
+| [`user_max_unique_ips_window_secs`](#cfg-access-user_max_unique_ips_window_secs) | `u64` | `30` |
+| [`replay_check_len`](#cfg-access-replay_check_len) | `usize` | `65536` |
+| [`replay_window_secs`](#cfg-access-replay_window_secs) | `u64` | `120` |
+| [`ignore_time_skew`](#cfg-access-ignore_time_skew) | `bool` | `false` |
+
+
+- `users`
+ - **Ограничения / валидация**: Не должно быть пустым (должен существовать хотя бы один пользователь). Каждое значение должно состоять **ровно из 32 шестнадцатеричных символов**.
+ - **Описание**: Карта учетных данных пользователя, используемая для аутентификации клиента. Ключи — это имена пользователей; значения являются секретами MTProxy.
+ - **Пример**:
+
+ ```toml
+ [access.users]
+ alice = "00112233445566778899aabbccddeeff"
+ bob = "0123456789abcdef0123456789abcdef"
+ ```
+
+- `user_ad_tags`
+ - **Ограничения / валидация**: Каждое значение должно содержать **ровно 32 шестнадцатеричных символа** (тот же формат, что и `general.ad_tag`). Тег со всеми нулями разрешен, но регистрирует предупреждение.
+ - **Описание**: Переопределение рекламного тега спонсируемого канала для каждого пользователя. Когда у пользователя есть запись здесь, она имеет приоритет над `general.ad_tag`.
+ - **Пример**:
+
+ ```toml
+ [general]
+ ad_tag = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+
+ [access.user_ad_tags]
+ alice = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+ ```
+
+- `user_max_tcp_conns`
+ - **Ограничения / валидация**: `Карта`.
+ - **Описание**: Максимальное количество одновременных TCP-соединений для каждого пользователя.
+ - **Пример**:
+
+ ```toml
+ [access.user_max_tcp_conns]
+ alice = 500
+ ```
+
+- `user_max_tcp_conns_global_each`
+ - **Ограничения / валидация**: `использовать`. `0` отключает унаследованный лимит.
+ - **Описание**: Глобальное максимальное количество одновременных TCP-соединений для каждого пользователя, применяется, когда у пользователя **нет положительной** записи в `[access.user_max_tcp_conns]` (отсутствующий ключ или значение `0` подпадают под этот параметр). Ограничения на пользователя, превышающие «0» в «user_max_tcp_conns», имеют приоритет.
+ - **Пример**:
+
+ ```toml
+ [access]
+ user_max_tcp_conns_global_each = 200
+
+ [access.user_max_tcp_conns]
+ alice = 500 # uses 500, not the global cap
+ # bob has no entry → uses 200
+ ```
+
+- `user_expirations`
+ - **Ограничения / валидация**: `Карта>`. Каждое значение должно быть допустимой датой и временем RFC3339/ISO-8601.
+ - **Описание**: Временные метки истечения срока действия учетной записи пользователя (UTC).
+ - **Пример**:
+
+ ```toml
+ [access.user_expirations]
+ alice = "2026-12-31T23:59:59Z"
+ ```
+
+- `user_data_quota`
+ - **Ограничения / валидация**: `Карта`.
+ - **Описание**: Квота трафика на пользователя в байтах.
+ - **Пример**:
+
+ ```toml
+ [access.user_data_quota]
+ alice = 1073741824 # 1 GiB
+ ```
+
+- `user_max_unique_ips`
+ - **Ограничения / валидация**: `Карта`.
+ - **Описание**: Ограничения на уникальные исходные IP-адреса для каждого пользователя.
+ - **Пример**:
+
+ ```toml
+ [access.user_max_unique_ips]
+ alice = 16
+ ```
+
+- `user_max_unique_ips_global_each`
+ - **Ограничения / валидация**: `использовать`. `0` отключает унаследованный лимит.
+ - **Описание**: Глобальный лимит уникального IP-адреса для каждого пользователя применяется, когда у пользователя нет индивидуального переопределения в `[access.user_max_unique_ips]`.
+ - **Пример**:
+
+ ```toml
+ [access]
+ user_max_unique_ips_global_each = 8
+ ```
+
+- `user_max_unique_ips_mode`
+ - **Ограничения / валидация**: Должно быть одно из «active_window», «time_window», «combined».
+ - **Описание**: Режим учета лимита уникальных IP-адресов источника.
+ - **Пример**:
+
+ ```toml
+ [access]
+ user_max_unique_ips_mode = "active_window"
+ ```
+
+- `user_max_unique_ips_window_secs`
+ - **Ограничения / валидация**: Должно быть `> 0`.
+ - **Описание**: Размер окна (в секундах), используемый режимами учета уникальных IP-адресов, включающими временное окно («time_window» и «комбинированный»).
+ - **Пример**:
+
+ ```toml
+ [access]
+ user_max_unique_ips_window_secs = 30
+ ```
+
+- `replay_check_len`
+ - **Ограничения / валидация**: `использовать`.
+ - **Описание**: Длина хранилища для защиты от повторения (количество записей, отслеживаемых на предмет обнаружения дубликатов).
+ - **Пример**:
+
+ ```toml
+ [access]
+ replay_check_len = 65536
+ ```
+
+- `replay_window_secs`
+ - **Ограничения / валидация**: `u64`.
+ - **Описание**: Временное окно защиты от повтора в секундах.
+ - **Пример**:
+
+ ```toml
+ [access]
+ replay_window_secs = 120
+ ```
+
+- `ignore_time_skew`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Отключает проверку перекоса временных меток клиента и сервера при проверке воспроизведения, если она включена.
+ - **Пример**:
+
+ ```toml
+ [access]
+ ignore_time_skew = false
+ ```
+
+
+## [[upstreams]]
+
+
+| Ключ | Тип | По умолчанию |
+| --- | ---- | ------- |
+| [`type`](#cfg-upstreams-type) | `"direct"`, `"socks4"`, `"socks5"`, or `"shadowsocks"` | — |
+| [`weight`](#cfg-upstreams-weight) | `u16` | `1` |
+| [`enabled`](#cfg-upstreams-enabled) | `bool` | `true` |
+| [`scopes`](#cfg-upstreams-scopes) | `String` | `""` |
+| [`interface`](#cfg-upstreams-interface) | `String` | — |
+| [`bind_addresses`](#cfg-upstreams-bind_addresses) | `String[]` | — |
+| [`url`](#cfg-upstreams-url) | `String` | — |
+| [`address`](#cfg-upstreams-address) | `String` | — |
+| [`user_id`](#cfg-upstreams-user_id) | `String` | — |
+| [`username`](#cfg-upstreams-username) | `String` | — |
+| [`password`](#cfg-upstreams-password) | `String` | — |
+
+
+- `type`
+ - **Ограничения / валидация**: Обязательное поле. Должен быть одним из: `"direct"`, `"socks4"`, `"socks5"`, `"shadowsocks"`.
+ - **Описание**: Выбирает реализацию восходящего транспорта для этой записи `[[upstreams]]`.
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "direct"
+
+ [[upstreams]]
+ type = "socks5"
+ address = "127.0.0.1:9050"
+
+ [[upstreams]]
+ type = "shadowsocks"
+ url = "ss://2022-blake3-aes-256-gcm:BASE64PASSWORD@127.0.0.1:8388"
+ ```
+
+- `weight`
+ - **Ограничения / валидация**: `u16` (0..=65535).
+ - **Описание**: Базовый вес, используемый взвешенно-случайным выбором в восходящем направлении (выше = выбирается чаще).
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "direct"
+ weight = 10
+ ```
+
+- `enabled`
+ - **Ограничения / валидация**: `бул`.
+ - **Описание**: Если установлено значение false, эта запись игнорируется и не используется для выбора в восходящем направлении.
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "socks5"
+ address = "127.0.0.1:9050"
+ enabled = false
+ ```
+
+- `scopes`
+ - **Ограничения / валидация**: `Строка`. Список, разделенный запятыми; пробелы обрезаются во время сопоставления.
+ - **Описание**: Теги области, используемые для восходящей фильтрации на уровне запроса. Если в запросе указана область, могут быть выбраны только восходящие потоки, чьи `области` содержат этот тег. Если в запросе не указана область, допускаются только восходящие потоки с пустыми «областями».
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "socks4"
+ address = "10.0.0.10:1080"
+ scopes = "me, fetch, dc2"
+ ```
+
+- `interface`
+ - **Ограничения / валидация**: `Строка` (необязательно).
+- Для «прямого»: может быть IP-адрес (используемый как явная локальная привязка) или имя интерфейса ОС (преобразующееся в IP-адрес во время выполнения; только для Unix).
+- Для `"socks4"`/`"socks5"`: поддерживается только тогда, когда `address` является литералом`IP:port`; когда `address` является именем хоста, привязка интерфейса игнорируется.
+- Для `"shadowsocks"`: передается в коннектор Shadowsocks как необязательная подсказка для исходящей привязки.
+ - **Описание**: Необязательный исходящий интерфейс/подсказка локальной привязки для восходящего сокета подключения.
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "direct"
+ interface = "eth0"
+
+ [[upstreams]]
+ type = "socks5"
+ address = "203.0.113.10:1080"
+ interface = "192.0.2.10" # explicit local bind IP
+ ```
+
+- `bind_addresses`
+ - **Ограничения / валидация**: `String[]` (необязательно). Применяется только к `type = "direct"`.
+- Каждая запись должна представлять собой строку IP-адреса.
+- Во время выполнения Telemt выбирает адрес, соответствующий целевому семейству (IPv4 или IPv6). Если установлен параметр «bind_addresses», и ни один из них не соответствует целевому семейству, попытка подключения не удалась.
+ - **Описание**: Явные локальные адреса источника для исходящих прямых TCP-подключений. Если указано несколько адресов, выбор осуществляется по кругу.
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "direct"
+ bind_addresses = ["192.0.2.10", "192.0.2.11"]
+ ```
+
+- `url`
+ - **Ограничения / валидация**: Применяется только к `type = "shadowsocks"`.
+- Должен быть действительный URL-адрес Shadowsocks, принятый ящиком Shadowsocks.
+- Плагины Shadowsocks не поддерживаются.
+ - Requires `general.use_middle_proxy = false` (shadowsocks upstreams are rejected in ME mode).
+ - **Описание**: URL-адрес сервера Shadowsocks, используемый для подключения к Telegram через ретранслятор Shadowsocks.
+ - **Пример**:
+
+ ```toml
+ [general]
+ use_middle_proxy = false
+
+ [[upstreams]]
+ type = "shadowsocks"
+ url = "ss://2022-blake3-aes-256-gcm:BASE64PASSWORD@127.0.0.1:8388"
+ ```
+
+- `address`
+ - **Ограничения / валидация**: Требуется для `type = "socks4"` и `type = "socks5"`. Должно быть `host:port` или `ip:port`.
+ - **Описание**: Конечная точка прокси-сервера SOCKS, используемая для восходящих подключений.
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "socks5"
+ address = "127.0.0.1:9050"
+ ```
+
+- `user_id`
+ - **Ограничения / валидация**: `Строка` (необязательно). Только для `type="socks4"`.
+ - **Описание**: Идентификатор пользователя SOCKS4 CONNECT. Примечание. Когда выбрана область запроса, Telemt может переопределить ее с помощью выбранного значения области.
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "socks4"
+ address = "127.0.0.1:1080"
+ user_id = "telemt"
+ ```
+
+- `username`
+ - **Ограничения / валидация**: `Строка` (необязательно). Только для `type="socks5"`.
+ - **Описание**: Имя пользователя SOCKS5 (для аутентификации по имени пользователя и паролю). Примечание. Когда выбрана область запроса, Telemt может переопределить ее с помощью выбранного значения области.
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "socks5"
+ address = "127.0.0.1:9050"
+ username = "alice"
+ ```
+
+- `password`
+ - **Ограничения / валидация**: `Строка` (необязательно). Только для `type="socks5"`.
+ - **Описание**: Пароль SOCKS5 (для аутентификации по имени пользователя и паролю). Примечание. Когда выбрана область запроса, Telemt может переопределить ее с помощью выбранного значения области.
+ - **Пример**:
+
+ ```toml
+ [[upstreams]]
+ type = "socks5"
+ address = "127.0.0.1:9050"
+ username = "alice"
+ password = "secret"
+ ```
+
+
diff --git a/docs/FAQ.en.md b/docs/FAQ.en.md
index 5e5a78a..7d477b2 100644
--- a/docs/FAQ.en.md
+++ b/docs/FAQ.en.md
@@ -1,5 +1,4 @@
## How to set up a "proxy sponsor" channel and statistics via the @MTProxybot
-
1. Go to the @MTProxybot.
2. Enter the `/newproxy` command.
3. Send your server's IP address and port. For example: `1.2.3.4:443`.
@@ -32,13 +31,130 @@ use_middle_proxy = true
hello = "ad_tag"
hello2 = "ad_tag2"
```
+## Recognizability for DPI and crawler
-## Why do you need a middle proxy (ME)
+On April 1, 2026, we became aware of a method for detecting MTProxy Fake-TLS,
+based on the ECH extension and the ordering of cipher suites,
+as well as an overall unique JA3/JA4 fingerprint
+that does not occur in modern browsers:
+we have already submitted initial changes to the Telegram Desktop developers and are working on updates for other clients.
+
+- We consider this a breakthrough aspect, which has no stable analogues today
+- Based on this: if `telemt` configured correctly, **TLS mode is completely identical to real-life handshake + communication** with a specified host
+- Here is our evidence:
+ - 212.220.88.77 - "dummy" host, running `telemt`
+ - `petrovich.ru` - `tls` + `masking` host, in HEX: `706574726f766963682e7275`
+ - **No MITM + No Fake Certificates/Crypto** = pure transparent *TCP Splice* to "best" upstream: MTProxy or tls/mask-host:
+ - DPI see legitimate HTTPS to `tls_host`, including *valid chain-of-trust* and entropy
+ - Crawlers completely satisfied receiving responses from `mask_host`
+ ### Client WITH secret-key accesses the MTProxy resource:
+
+
+
+ ### Client WITHOUT secret-key gets transparent access to the specified resource:
+ - with trusted certificate
+ - with original handshake
+ - with full request-response way
+ - with low-latency overhead
+```bash
+root@debian:~/telemt# curl -v -I --resolve petrovich.ru:443:212.220.88.77 https://petrovich.ru/
+* Added petrovich.ru:443:212.220.88.77 to DNS cache
+* Hostname petrovich.ru was found in DNS cache
+* Trying 212.220.88.77:443...
+* Connected to petrovich.ru (212.220.88.77) port 443 (#0)
+* ALPN: offers h2,http/1.1
+* TLSv1.3 (OUT), TLS handshake, Client hello (1):
+* CAfile: /etc/ssl/certs/ca-certificates.crt
+* CApath: /etc/ssl/certs
+* TLSv1.3 (IN), TLS handshake, Server hello (2):
+* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
+* TLSv1.3 (IN), TLS handshake, Certificate (11):
+* TLSv1.3 (IN), TLS handshake, CERT verify (15):
+* TLSv1.3 (IN), TLS handshake, Finished (20):
+* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
+* TLSv1.3 (OUT), TLS handshake, Finished (20):
+* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
+* ALPN: server did not agree on a protocol. Uses default.
+* Server certificate:
+* subject: C=RU; ST=Saint Petersburg; L=Saint Petersburg; O=STD Petrovich; CN=*.petrovich.ru
+* start date: Jan 28 11:21:01 2025 GMT
+* expire date: Mar 1 11:21:00 2026 GMT
+* subjectAltName: host "petrovich.ru" matched cert's "petrovich.ru"
+* issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018
+* SSL certificate verify ok.
+* using HTTP/1.x
+> HEAD / HTTP/1.1
+> Host: petrovich.ru
+> User-Agent: curl/7.88.1
+> Accept: */*
+>
+* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
+* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
+* old SSL session ID is stale, removing
+< HTTP/1.1 200 OK
+HTTP/1.1 200 OK
+< Server: Variti/0.9.3a
+Server: Variti/0.9.3a
+< Date: Thu, 01 Jan 2026 00:0000 GMT
+Date: Thu, 01 Jan 2026 00:0000 GMT
+< Access-Control-Allow-Origin: *
+Access-Control-Allow-Origin: *
+< Content-Type: text/html
+Content-Type: text/html
+< Cache-Control: no-store
+Cache-Control: no-store
+< Expires: Thu, 01 Jan 2026 00:0000 GMT
+Expires: Thu, 01 Jan 2026 00:0000 GMT
+< Pragma: no-cache
+Pragma: no-cache
+< Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/
+Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/
+< Content-Type: text/html
+Content-Type: text/html
+< Content-Length: 31253
+Content-Length: 31253
+< Connection: keep-alive
+Connection: keep-alive
+< Keep-Alive: timeout=60
+Keep-Alive: timeout=60
+
+<
+* Connection #0 to host petrovich.ru left intact
+
+```
+- We challenged ourselves, we kept trying and we didn't only *beat the air*: now, we have something to show you
+ - Do not just take our word for it? - This is great and we respect that: you can build your own `telemt` or download a build and check it right now
+
+
+## F.A.Q.
+
+### Telegram Calls via MTProxy
+- Telegram architecture **does NOT allow calls via MTProxy**, but only via SOCKS5, which cannot be obfuscated
+
+### How does DPI see MTProxy TLS?
+- DPI sees MTProxy in Fake TLS (ee) mode as TLS 1.3
+- the SNI you specify sends both the client and the server;
+- ALPN is similar to HTTP 1.1/2;
+- high entropy, which is normal for AES-encrypted traffic;
+
+### Whitelist on IP
+- MTProxy cannot work when there is:
+ - no IP connectivity to the target host: Russian Whitelist on Mobile Networks - "Белый список"
+ - OR all TCP traffic is blocked
+ - OR high entropy/encrypted traffic is blocked: content filters at universities and critical infrastructure
+ - OR all TLS traffic is blocked
+ - OR specified port is blocked: use 443 to make it "like real"
+ - OR provided SNI is blocked: use "officially approved"/innocuous name
+- like most protocols on the Internet;
+- these situations are observed:
+ - in China behind the Great Firewall
+ - in Russia on mobile networks, less in wired networks
+ - in Iran during "activity"
+
+### Why do you need a middle proxy (ME)
https://github.com/telemt/telemt/discussions/167
-
-## How many people can use one link
-
+### How many people can use one link
By default, an unlimited number of people can use a single link.
However, you can limit the number of unique IP addresses for each user:
```toml
@@ -47,8 +163,7 @@ hello = 1
```
This parameter sets the maximum number of unique IP addresses from which a single link can be used simultaneously. If the first user disconnects, a second one can connect. At the same time, multiple users can connect from a single IP address simultaneously (for example, devices on the same Wi-Fi network).
-## How to create multiple different links
-
+### How to create multiple different links
1. Generate the required number of secrets using the command: `openssl rand -hex 16`.
2. Open the configuration file: `nano /etc/telemt/telemt.toml`.
3. Add new users to the `[access.users]` section:
@@ -64,7 +179,7 @@ user3 = "00000000000000000000000000000003"
curl -s http://127.0.0.1:9091/v1/users | jq
```
-## "Unknown TLS SNI" error
+### "Unknown TLS SNI" error
Usually, this error occurs if you have changed the `tls_domain` parameter, but users continue to connect using old links with the previous domain.
If you need to allow connections with any domains (ignoring SNI mismatches), add the following parameters:
@@ -73,7 +188,7 @@ If you need to allow connections with any domains (ignoring SNI mismatches), add
unknown_sni_action = "mask"
```
-## How to view metrics
+### How to view metrics
1. Open the configuration file: `nano /etc/telemt/telemt.toml`.
2. Add the following parameters:
@@ -87,6 +202,25 @@ metrics_whitelist = ["127.0.0.1/32", "::1/128", "0.0.0.0/0"]
> [!WARNING]
> The value `"0.0.0.0/0"` in `metrics_whitelist` opens access to metrics from any IP address. It is recommended to replace it with your personal IP, for example: `"1.2.3.4/32"`.
+### Too many open files
+- On a fresh Linux install the default open file limit is low; under load `telemt` may fail with `Accept error: Too many open files`
+- **Systemd**: add `LimitNOFILE=65536` to the `[Service]` section (already included in the example above)
+- **Docker**: add `--ulimit nofile=65536:65536` to your `docker run` command, or in `docker-compose.yml`:
+```yaml
+ulimits:
+ nofile:
+ soft: 65536
+ hard: 65536
+```
+- **System-wide** (optional): add to `/etc/security/limits.conf`:
+```
+* soft nofile 1048576
+* hard nofile 1048576
+root soft nofile 1048576
+root hard nofile 1048576
+```
+
+
## Additional parameters
### Domain in the link instead of IP
diff --git a/docs/FAQ.ru.md b/docs/FAQ.ru.md
index fa7d5c0..a3bba17 100644
--- a/docs/FAQ.ru.md
+++ b/docs/FAQ.ru.md
@@ -32,11 +32,145 @@ use_middle_proxy = true
hello = "ad_tag"
hello2 = "ad_tag2"
```
+## Распознаваемость для DPI и сканеров
+
+1 апреля 2026 года нам стало известно о методе обнаружения MTProxy Fake-TLS, основанном на расширении ECH и порядке набора шифров,
+а также об общем уникальном отпечатке JA3/JA4, который не встречается в современных браузерах: мы уже отправили первоначальные изменения разработчикам Telegram Desktop и работаем над обновлениями для других клиентов.
+
+- Мы считаем это прорывом, которому на сегодняшний день нет стабильных аналогов;
+- Исходя из этого: если `telemt` настроен правильно, **режим TLS полностью идентичен реальному «рукопожатию» + обмену данными** с указанным хостом;
+- Вот наши доказательства:
+ - 212.220.88.77 — «фиктивный» хост, на котором запущен `telemt`;
+ - `petrovich.ru` — хост с `tls` + `masking`, в HEX: `706574726f766963682e7275`;
+ - **Без MITM + без поддельных сертификатов/шифрования** = чистое прозрачное *TCP Splice* к «лучшему» исходному серверу: MTProxy или tls/mask-host:
+ - DPI видит легитимный HTTPS к `tls_host`, включая *достоверную цепочку доверия* и энтропию;
+ - Краулеры полностью удовлетворены получением ответов от `mask_host`.
+
+ ### Клиент С секретным ключом получает доступ к ресурсу MTProxy:
+
+
+
+ ### Клиент БЕЗ секретного ключа получает прозрачный доступ к указанному ресурсу:
+ - с доверенным сертификатом;
+ - с исходным «рукопожатием»;
+ - с полным циклом запрос-ответ;
+ - с низкой задержкой.
+
+```bash
+root@debian:~/telemt# curl -v -I --resolve petrovich.ru:443:212.220.88.77 https://petrovich.ru/
+* Added petrovich.ru:443:212.220.88.77 to DNS cache
+* Hostname petrovich.ru was found in DNS cache
+* Trying 212.220.88.77:443...
+* Connected to petrovich.ru (212.220.88.77) port 443 (#0)
+* ALPN: offers h2,http/1.1
+* TLSv1.3 (OUT), TLS handshake, Client hello (1):
+* CAfile: /etc/ssl/certs/ca-certificates.crt
+* CApath: /etc/ssl/certs
+* TLSv1.3 (IN), TLS handshake, Server hello (2):
+* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
+* TLSv1.3 (IN), TLS handshake, Certificate (11):
+* TLSv1.3 (IN), TLS handshake, CERT verify (15):
+* TLSv1.3 (IN), TLS handshake, Finished (20):
+* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
+* TLSv1.3 (OUT), TLS handshake, Finished (20):
+* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
+* ALPN: server did not agree on a protocol. Uses default.
+* Server certificate:
+* subject: C=RU; ST=Saint Petersburg; L=Saint Petersburg; O=STD Petrovich; CN=*.petrovich.ru
+* start date: Jan 28 11:21:01 2025 GMT
+* expire date: Mar 1 11:21:00 2026 GMT
+* subjectAltName: host "petrovich.ru" matched cert's "petrovich.ru"
+* issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018
+* SSL certificate verify ok.
+* using HTTP/1.x
+> HEAD / HTTP/1.1
+> Host: petrovich.ru
+> User-Agent: curl/7.88.1
+> Accept: */*
+>
+* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
+* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
+* old SSL session ID is stale, removing
+< HTTP/1.1 200 OK
+HTTP/1.1 200 OK
+< Server: Variti/0.9.3a
+Server: Variti/0.9.3a
+< Date: Thu, 01 Jan 2026 00:0000 GMT
+Date: Thu, 01 Jan 2026 00:0000 GMT
+< Access-Control-Allow-Origin: *
+Access-Control-Allow-Origin: *
+< Content-Type: text/html
+Content-Type: text/html
+< Cache-Control: no-store
+Cache-Control: no-store
+< Expires: Thu, 01 Jan 2026 00:0000 GMT
+Expires: Thu, 01 Jan 2026 00:0000 GMT
+< Pragma: no-cache
+Pragma: no-cache
+< Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/
+Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/
+< Content-Type: text/html
+Content-Type: text/html
+< Content-Length: 31253
+Content-Length: 31253
+< Connection: keep-alive
+Connection: keep-alive
+< Keep-Alive: timeout=60
+Keep-Alive: timeout=60
+
+<
+* Connection #0 to host petrovich.ru left intact
+
+```
+- Мы поставили перед собой задачу, не сдавались и не просто «бились в пустоту»: теперь у нас есть что вам показать.
+- Не верите нам на слово? — Это прекрасно, и мы уважаем ваше решение: вы можете собрать свой собственный `telemt` или скачать готовую сборку и проверить её прямо сейчас.
+
+### Звонки в Telegram через MTProxy
+- Архитектура Telegram **НЕ поддерживает звонки через MTProxy**, а только через SOCKS5, который невозможно замаскировать
+
+### Как DPI распознает TLS-соединение MTProxy?
+- DPI распознает MTProxy в режиме Fake TLS (ee) как TLS 1.3
+- указанный вами SNI отправляется как клиентом, так и сервером;
+- ALPN аналогичен HTTP 1.1/2;
+- высокая энтропия, что нормально для трафика, зашифрованного AES;
+
+### Белый список по IP
+- MTProxy не может работать, если:
+ - отсутствует IP-связь с целевым хостом: российский белый список в мобильных сетях — «Белый список»;
+ - ИЛИ весь TCP-трафик заблокирован;
+ - ИЛИ трафик с высокой энтропией/зашифрованный трафик заблокирован: контент-фильтры в университетах и критически важной инфраструктуре;
+ - ИЛИ весь TLS-трафик заблокирован;
+ - ИЛИ заблокирован указанный порт: используйте 443, чтобы сделать его «как настоящий»;
+ - ИЛИ заблокирован предоставленный SNI: используйте «официально одобренное»/безобидное имя;
+- как и большинство протоколов в Интернете;
+- такие ситуации наблюдаются:
+ - в Китае за Великим файрволом;
+ - в России в мобильных сетях, реже в проводных сетях;
+ - в Иране во время «активности».
+
## Зачем нужен middle proxy (ME)
https://github.com/telemt/telemt/discussions/167
+## Что такое dd и ee в контексте MTProxy?
+
+Это два разных режима работы прокси. Понять, какой режим используется, можно взглянув на начало секрета — там будет dd или ee, вот пример:
+tg://proxy?server=s1.dimasssss.space&port=443&secret=eebe3007e927acd147dde12bee8b1a7c9364726976652e676f6f676c652e636f6d
+
+dd — режим с мусорным трафиком, обфускацией данных, похожий на shadowsocks. У такого трафика есть заметный паттерн, который DPI умеют распознавать и впоследствии блокировать. Использовать этот режим на текущий момент не рекомендуется.
+
+ee — режим маскировки под существующий домен (FakeTLS), словно вы сёрфите в интернете через браузер. На текущий момент не попадает под блокировку.
+
+### Где эти режимы настраиваются?
+
+```toml
+В конфиге telemt.toml в разделе [general.modes]:
+classic = false # классический режим, давно стал бесполезным
+secure = false # переменная dd-режима
+tls = true # переменная ee-режима
+```
+
## Сколько человек может пользоваться одной ссылкой
По умолчанию одной ссылкой может пользоваться неограниченное число людей.
@@ -104,7 +238,7 @@ max_connections = 10000 # 0 - без ограничений, 10000 - по у
```
### Upstream Manager
-Для настройки исходящих подключений (апстримов) добавьте соответствующие параметры в секцию `[[upstreams]]` файла конфигурации:
+Для настройки исходящих подключений (Upstreams) добавьте соответствующие параметры в секцию `[[upstreams]]` файла конфигурации:
#### Привязка к исходящему IP-адресу
```toml
@@ -119,20 +253,20 @@ interface = "192.168.1.100" # Замените на ваш исходящий IP
- Без авторизации:
```toml
[[upstreams]]
-type = "socks5" # Specify SOCKS4 or SOCKS5
-address = "1.2.3.4:1234" # SOCKS-server Address
-weight = 1 # Set Weight for Scenarios
+type = "socks5" # выбор типа SOCKS4 или SOCKS5
+address = "1.2.3.4:1234" # адрес сервера SOCKS
+weight = 1 # вес
enabled = true
```
- С авторизацией:
```toml
[[upstreams]]
-type = "socks5" # Specify SOCKS4 or SOCKS5
-address = "1.2.3.4:1234" # SOCKS-server Address
-username = "user" # Username for Auth on SOCKS-server
-password = "pass" # Password for Auth on SOCKS-server
-weight = 1 # Set Weight for Scenarios
+type = "socks5" # выбор типа SOCKS4 или SOCKS5
+address = "1.2.3.4:1234" # адрес сервера SOCKS
+username = "user" # имя пользователя
+password = "pass" # пароль
+weight = 1 # вес
enabled = true
```
diff --git a/docs/OPENBSD.en.md b/docs/Quick_start/OPENBSD_QUICK_START_GUIDE.en.md
similarity index 100%
rename from docs/OPENBSD.en.md
rename to docs/Quick_start/OPENBSD_QUICK_START_GUIDE.en.md
diff --git a/docs/QUICK_START_GUIDE.en.md b/docs/Quick_start/QUICK_START_GUIDE.en.md
similarity index 100%
rename from docs/QUICK_START_GUIDE.en.md
rename to docs/Quick_start/QUICK_START_GUIDE.en.md
diff --git a/docs/QUICK_START_GUIDE.ru.md b/docs/Quick_start/QUICK_START_GUIDE.ru.md
similarity index 100%
rename from docs/QUICK_START_GUIDE.ru.md
rename to docs/Quick_start/QUICK_START_GUIDE.ru.md
diff --git a/docs/VPS_DOUBLE_HOP.en.md b/docs/Setup_examples/VPS_DOUBLE_HOP.en.md
similarity index 100%
rename from docs/VPS_DOUBLE_HOP.en.md
rename to docs/Setup_examples/VPS_DOUBLE_HOP.en.md
diff --git a/docs/VPS_DOUBLE_HOP.ru.md b/docs/Setup_examples/VPS_DOUBLE_HOP.ru.md
similarity index 100%
rename from docs/VPS_DOUBLE_HOP.ru.md
rename to docs/Setup_examples/VPS_DOUBLE_HOP.ru.md
diff --git a/docs/XRAY-SINGBOX-ROUTING.ru.md b/docs/Setup_examples/XRAY-SINGBOX-ROUTING.ru.md
similarity index 100%
rename from docs/XRAY-SINGBOX-ROUTING.ru.md
rename to docs/Setup_examples/XRAY-SINGBOX-ROUTING.ru.md
diff --git a/docs/assets/telegram_button.png b/docs/assets/telegram_button.png
new file mode 100644
index 0000000..eb649d3
Binary files /dev/null and b/docs/assets/telegram_button.png differ
diff --git a/docs/assets/telemt.png b/docs/assets/telemt.png
new file mode 100644
index 0000000..653e383
Binary files /dev/null and b/docs/assets/telemt.png differ