From 1383dfcbb1c0ea7c2336544baa621ac3a2982f84 Mon Sep 17 00:00:00 2001 From: TWRoman Date: Sun, 12 Apr 2026 12:37:38 +0300 Subject: [PATCH] [docs]Update CONFIG-PARAMS --- docs/Config_params/CONFIG_PARAMS.en.md | 1380 +++-- docs/Config_params/CONFIG_PARAMS.ru.md | 6403 ++++++++++++------------ 2 files changed, 3629 insertions(+), 4154 deletions(-) diff --git a/docs/Config_params/CONFIG_PARAMS.en.md b/docs/Config_params/CONFIG_PARAMS.en.md index 82c98f5..abdb598 100644 --- a/docs/Config_params/CONFIG_PARAMS.en.md +++ b/docs/Config_params/CONFIG_PARAMS.en.md @@ -20,24 +20,23 @@ This document lists all configuration keys accepted by `config.toml`. - [server](#server) - [server.conntrack_control](#serverconntrack_control) - [server.api](#serverapi) - - [[server.listeners]](#serverlisteners) + - [server.listeners](#serverlisteners) - [timeouts](#timeouts) - [censorship](#censorship) - [censorship.tls_fetch](#censorshiptls_fetch) - [access](#access) - - [[upstreams]](#upstreams) + - [upstreams](#upstreams) # Top-level keys | Key | Type | Default | | --- | ---- | ------- | -| [`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) | `String` (special directive) | — | +| [`show_link`](#show_link) | `"*"` or `String[]` | `[]` (`ShowLink::None`) | +| [`dc_overrides`](#dc_overrides) | `Map` | `{}` | +| [`default_dc`](#default_dc) | `u8` | — (effective fallback: `2` in ME routing) | -## "cfg-top-include" -- `include` +## include - **Constraints / validation**: Must be a single-line directive in the form `include = "path/to/file.toml"`. Includes are expanded before TOML parsing. Maximum include depth is 10. - **Description**: Includes another TOML file with `include = "relative/or/absolute/path.toml"`; includes are processed recursively before parsing. - **Example**: @@ -45,8 +44,7 @@ This document lists all configuration keys accepted by `config.toml`. ```toml include = "secrets.toml" ``` -## "cfg-top-show_link" -- `show_link` +## show_link - **Constraints / validation**: Accepts `"*"` or an array of usernames. Empty array means "show none". - **Description**: Legacy top-level link visibility selector (`"*"` for all users or explicit usernames list). - **Example**: @@ -58,8 +56,7 @@ This document lists all configuration keys accepted by `config.toml`. # or: show links only for selected users # show_link = ["alice", "bob"] ``` -## "cfg-top-dc_overrides" -- `dc_overrides` +## dc_overrides - **Constraints / validation**: Key must be a positive integer DC index encoded as string (e.g. `"203"`). Values must parse as `SocketAddr` (`ip:port`). Empty strings are ignored. - **Description**: Overrides DC endpoints for non-standard DCs; key is DC index string, value is one or more `ip:port` addresses. - **Example**: @@ -69,8 +66,7 @@ This document lists all configuration keys accepted by `config.toml`. "201" = "149.154.175.50:443" "203" = ["149.154.175.100:443", "91.105.192.100:443"] ``` -## "cfg-top-default_dc" -- `default_dc` +## default_dc - **Constraints / validation**: Intended range is `1..=5`. If set out of range, runtime falls back to DC1 behavior in direct relay; Middle-End routing falls back to `2` when not set. - **Description**: Default DC index used for unmapped non-standard DCs. - **Example**: @@ -85,144 +81,143 @@ This document lists all configuration keys accepted by `config.toml`. | Key | Type | Default | | --- | ---- | ------- | -| [`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` | -| [`rst_on_close`](#cfg-general-rst_on_close) | `"off"`, `"errors"`, or `"always"` | `"off"` | +| [`data_path`](#data_path) | `String` | — | +| [`prefer_ipv6`](#prefer_ipv6) | `bool` | `false` | +| [`fast_mode`](#fast_mode) | `bool` | `true` | +| [`use_middle_proxy`](#use_middle_proxy) | `bool` | `true` | +| [`proxy_secret_path`](#proxy_secret_path) | `String` | `"proxy-secret"` | +| [`proxy_config_v4_cache_path`](#proxy_config_v4_cache_path) | `String` | `"cache/proxy-config-v4.txt"` | +| [`proxy_config_v6_cache_path`](#proxy_config_v6_cache_path) | `String` | `"cache/proxy-config-v6.txt"` | +| [`ad_tag`](#ad_tag) | `String` | — | +| [`middle_proxy_nat_ip`](#middle_proxy_nat_ip) | `IpAddr` | — | +| [`middle_proxy_nat_probe`](#middle_proxy_nat_probe) | `bool` | `true` | +| [`middle_proxy_nat_stun`](#middle_proxy_nat_stun) | `String` | — | +| [`middle_proxy_nat_stun_servers`](#middle_proxy_nat_stun_servers) | `String[]` | `[]` | +| [`stun_nat_probe_concurrency`](#stun_nat_probe_concurrency) | `usize` | `8` | +| [`middle_proxy_pool_size`](#middle_proxy_pool_size) | `usize` | `8` | +| [`middle_proxy_warm_standby`](#middle_proxy_warm_standby) | `usize` | `16` | +| [`me_init_retry_attempts`](#me_init_retry_attempts) | `u32` | `0` | +| [`me2dc_fallback`](#me2dc_fallback) | `bool` | `true` | +| [`me2dc_fast`](#me2dc_fast) | `bool` | `false` | +| [`me_keepalive_enabled`](#me_keepalive_enabled) | `bool` | `true` | +| [`me_keepalive_interval_secs`](#me_keepalive_interval_secs) | `u64` | `8` | +| [`me_keepalive_jitter_secs`](#me_keepalive_jitter_secs) | `u64` | `2` | +| [`me_keepalive_payload_random`](#me_keepalive_payload_random) | `bool` | `true` | +| [`rpc_proxy_req_every`](#rpc_proxy_req_every) | `u64` | `0` | +| [`me_writer_cmd_channel_capacity`](#me_writer_cmd_channel_capacity) | `usize` | `4096` | +| [`me_route_channel_capacity`](#me_route_channel_capacity) | `usize` | `768` | +| [`me_c2me_channel_capacity`](#me_c2me_channel_capacity) | `usize` | `1024` | +| [`me_c2me_send_timeout_ms`](#me_c2me_send_timeout_ms) | `u64` | `4000` | +| [`me_reader_route_data_wait_ms`](#me_reader_route_data_wait_ms) | `u64` | `2` | +| [`me_d2c_flush_batch_max_frames`](#me_d2c_flush_batch_max_frames) | `usize` | `32` | +| [`me_d2c_flush_batch_max_bytes`](#me_d2c_flush_batch_max_bytes) | `usize` | `131072` | +| [`me_d2c_flush_batch_max_delay_us`](#me_d2c_flush_batch_max_delay_us) | `u64` | `500` | +| [`me_d2c_ack_flush_immediate`](#me_d2c_ack_flush_immediate) | `bool` | `true` | +| [`me_quota_soft_overshoot_bytes`](#me_quota_soft_overshoot_bytes) | `u64` | `65536` | +| [`me_d2c_frame_buf_shrink_threshold_bytes`](#me_d2c_frame_buf_shrink_threshold_bytes) | `usize` | `262144` | +| [`direct_relay_copy_buf_c2s_bytes`](#direct_relay_copy_buf_c2s_bytes) | `usize` | `65536` | +| [`direct_relay_copy_buf_s2c_bytes`](#direct_relay_copy_buf_s2c_bytes) | `usize` | `262144` | +| [`crypto_pending_buffer`](#crypto_pending_buffer) | `usize` | `262144` | +| [`max_client_frame`](#max_client_frame) | `usize` | `16777216` | +| [`desync_all_full`](#desync_all_full) | `bool` | `false` | +| [`beobachten`](#beobachten) | `bool` | `true` | +| [`beobachten_minutes`](#beobachten_minutes) | `u64` | `10` | +| [`beobachten_flush_secs`](#beobachten_flush_secs) | `u64` | `15` | +| [`beobachten_file`](#beobachten_file) | `String` | `"cache/beobachten.txt"` | +| [`hardswap`](#hardswap) | `bool` | `true` | +| [`me_warmup_stagger_enabled`](#me_warmup_stagger_enabled) | `bool` | `true` | +| [`me_warmup_step_delay_ms`](#me_warmup_step_delay_ms) | `u64` | `500` | +| [`me_warmup_step_jitter_ms`](#me_warmup_step_jitter_ms) | `u64` | `300` | +| [`me_reconnect_max_concurrent_per_dc`](#me_reconnect_max_concurrent_per_dc) | `u32` | `8` | +| [`me_reconnect_backoff_base_ms`](#me_reconnect_backoff_base_ms) | `u64` | `500` | +| [`me_reconnect_backoff_cap_ms`](#me_reconnect_backoff_cap_ms) | `u64` | `30000` | +| [`me_reconnect_fast_retry_count`](#me_reconnect_fast_retry_count) | `u32` | `16` | +| [`me_single_endpoint_shadow_writers`](#me_single_endpoint_shadow_writers) | `u8` | `2` | +| [`me_single_endpoint_outage_mode_enabled`](#me_single_endpoint_outage_mode_enabled) | `bool` | `true` | +| [`me_single_endpoint_outage_disable_quarantine`](#me_single_endpoint_outage_disable_quarantine) | `bool` | `true` | +| [`me_single_endpoint_outage_backoff_min_ms`](#me_single_endpoint_outage_backoff_min_ms) | `u64` | `250` | +| [`me_single_endpoint_outage_backoff_max_ms`](#me_single_endpoint_outage_backoff_max_ms) | `u64` | `3000` | +| [`me_single_endpoint_shadow_rotate_every_secs`](#me_single_endpoint_shadow_rotate_every_secs) | `u64` | `900` | +| [`me_floor_mode`](#me_floor_mode) | `"static"` or `"adaptive"` | `"adaptive"` | +| [`me_adaptive_floor_idle_secs`](#me_adaptive_floor_idle_secs) | `u64` | `90` | +| [`me_adaptive_floor_min_writers_single_endpoint`](#me_adaptive_floor_min_writers_single_endpoint) | `u8` | `1` | +| [`me_adaptive_floor_min_writers_multi_endpoint`](#me_adaptive_floor_min_writers_multi_endpoint) | `u8` | `1` | +| [`me_adaptive_floor_recover_grace_secs`](#me_adaptive_floor_recover_grace_secs) | `u64` | `180` | +| [`me_adaptive_floor_writers_per_core_total`](#me_adaptive_floor_writers_per_core_total) | `u16` | `48` | +| [`me_adaptive_floor_cpu_cores_override`](#me_adaptive_floor_cpu_cores_override) | `u16` | `0` | +| [`me_adaptive_floor_max_extra_writers_single_per_core`](#me_adaptive_floor_max_extra_writers_single_per_core) | `u16` | `1` | +| [`me_adaptive_floor_max_extra_writers_multi_per_core`](#me_adaptive_floor_max_extra_writers_multi_per_core) | `u16` | `2` | +| [`me_adaptive_floor_max_active_writers_per_core`](#me_adaptive_floor_max_active_writers_per_core) | `u16` | `64` | +| [`me_adaptive_floor_max_warm_writers_per_core`](#me_adaptive_floor_max_warm_writers_per_core) | `u16` | `64` | +| [`me_adaptive_floor_max_active_writers_global`](#me_adaptive_floor_max_active_writers_global) | `u32` | `256` | +| [`me_adaptive_floor_max_warm_writers_global`](#me_adaptive_floor_max_warm_writers_global) | `u32` | `256` | +| [`upstream_connect_retry_attempts`](#upstream_connect_retry_attempts) | `u32` | `2` | +| [`upstream_connect_retry_backoff_ms`](#upstream_connect_retry_backoff_ms) | `u64` | `100` | +| [`upstream_connect_budget_ms`](#upstream_connect_budget_ms) | `u64` | `3000` | +| [`upstream_unhealthy_fail_threshold`](#upstream_unhealthy_fail_threshold) | `u32` | `5` | +| [`upstream_connect_failfast_hard_errors`](#upstream_connect_failfast_hard_errors) | `bool` | `false` | +| [`stun_iface_mismatch_ignore`](#stun_iface_mismatch_ignore) | `bool` | `false` | +| [`unknown_dc_log_path`](#unknown_dc_log_path) | `String` | `"unknown-dc.txt"` | +| [`unknown_dc_file_log_enabled`](#unknown_dc_file_log_enabled) | `bool` | `false` | +| [`log_level`](#log_level) | `"debug"`, `"verbose"`, `"normal"`, or `"silent"` | `"normal"` | +| [`disable_colors`](#disable_colors) | `bool` | `false` | +| [`me_socks_kdf_policy`](#me_socks_kdf_policy) | `"strict"` or `"compat"` | `"strict"` | +| [`me_route_backpressure_base_timeout_ms`](#me_route_backpressure_base_timeout_ms) | `u64` | `25` | +| [`me_route_backpressure_high_timeout_ms`](#me_route_backpressure_high_timeout_ms) | `u64` | `120` | +| [`me_route_backpressure_high_watermark_pct`](#me_route_backpressure_high_watermark_pct) | `u8` | `80` | +| [`me_health_interval_ms_unhealthy`](#me_health_interval_ms_unhealthy) | `u64` | `1000` | +| [`me_health_interval_ms_healthy`](#me_health_interval_ms_healthy) | `u64` | `3000` | +| [`me_admission_poll_ms`](#me_admission_poll_ms) | `u64` | `1000` | +| [`me_warn_rate_limit_ms`](#me_warn_rate_limit_ms) | `u64` | `5000` | +| [`me_route_no_writer_mode`](#me_route_no_writer_mode) | `"async_recovery_failfast"`, `"inline_recovery_legacy"`, or `"hybrid_async_persistent"` | `"hybrid_async_persistent"` | +| [`me_route_no_writer_wait_ms`](#me_route_no_writer_wait_ms) | `u64` | `250` | +| [`me_route_hybrid_max_wait_ms`](#me_route_hybrid_max_wait_ms) | `u64` | `3000` | +| [`me_route_blocking_send_timeout_ms`](#me_route_blocking_send_timeout_ms) | `u64` | `250` | +| [`me_route_inline_recovery_attempts`](#me_route_inline_recovery_attempts) | `u32` | `3` | +| [`me_route_inline_recovery_wait_ms`](#me_route_inline_recovery_wait_ms) | `u64` | `3000` | +| [`fast_mode_min_tls_record`](#fast_mode_min_tls_record) | `usize` | `0` | +| [`update_every`](#update_every) | `u64` | `300` | +| [`me_reinit_every_secs`](#me_reinit_every_secs) | `u64` | `900` | +| [`me_hardswap_warmup_delay_min_ms`](#me_hardswap_warmup_delay_min_ms) | `u64` | `1000` | +| [`me_hardswap_warmup_delay_max_ms`](#me_hardswap_warmup_delay_max_ms) | `u64` | `2000` | +| [`me_hardswap_warmup_extra_passes`](#me_hardswap_warmup_extra_passes) | `u8` | `3` | +| [`me_hardswap_warmup_pass_backoff_base_ms`](#me_hardswap_warmup_pass_backoff_base_ms) | `u64` | `500` | +| [`me_config_stable_snapshots`](#me_config_stable_snapshots) | `u8` | `2` | +| [`me_config_apply_cooldown_secs`](#me_config_apply_cooldown_secs) | `u64` | `300` | +| [`me_snapshot_require_http_2xx`](#me_snapshot_require_http_2xx) | `bool` | `true` | +| [`me_snapshot_reject_empty_map`](#me_snapshot_reject_empty_map) | `bool` | `true` | +| [`me_snapshot_min_proxy_for_lines`](#me_snapshot_min_proxy_for_lines) | `u32` | `1` | +| [`proxy_secret_stable_snapshots`](#proxy_secret_stable_snapshots) | `u8` | `2` | +| [`proxy_secret_rotate_runtime`](#proxy_secret_rotate_runtime) | `bool` | `true` | +| [`me_secret_atomic_snapshot`](#me_secret_atomic_snapshot) | `bool` | `true` | +| [`proxy_secret_len_max`](#proxy_secret_len_max) | `usize` | `256` | +| [`me_pool_drain_ttl_secs`](#me_pool_drain_ttl_secs) | `u64` | `90` | +| [`me_instadrain`](#me_instadrain) | `bool` | `false` | +| [`me_pool_drain_threshold`](#me_pool_drain_threshold) | `u64` | `32` | +| [`me_pool_drain_soft_evict_enabled`](#me_pool_drain_soft_evict_enabled) | `bool` | `true` | +| [`me_pool_drain_soft_evict_grace_secs`](#me_pool_drain_soft_evict_grace_secs) | `u64` | `10` | +| [`me_pool_drain_soft_evict_per_writer`](#me_pool_drain_soft_evict_per_writer) | `u8` | `2` | +| [`me_pool_drain_soft_evict_budget_per_core`](#me_pool_drain_soft_evict_budget_per_core) | `u16` | `16` | +| [`me_pool_drain_soft_evict_cooldown_ms`](#me_pool_drain_soft_evict_cooldown_ms) | `u64` | `1000` | +| [`me_bind_stale_mode`](#me_bind_stale_mode) | `"never"`, `"ttl"`, or `"always"` | `"ttl"` | +| [`me_bind_stale_ttl_secs`](#me_bind_stale_ttl_secs) | `u64` | `90` | +| [`me_pool_min_fresh_ratio`](#me_pool_min_fresh_ratio) | `f32` | `0.8` | +| [`me_reinit_drain_timeout_secs`](#me_reinit_drain_timeout_secs) | `u64` | `90` | +| [`proxy_secret_auto_reload_secs`](#proxy_secret_auto_reload_secs) | `u64` | `3600` | +| [`proxy_config_auto_reload_secs`](#proxy_config_auto_reload_secs) | `u64` | `3600` | +| [`me_reinit_singleflight`](#me_reinit_singleflight) | `bool` | `true` | +| [`me_reinit_trigger_channel`](#me_reinit_trigger_channel) | `usize` | `64` | +| [`me_reinit_coalesce_window_ms`](#me_reinit_coalesce_window_ms) | `u64` | `200` | +| [`me_deterministic_writer_sort`](#me_deterministic_writer_sort) | `bool` | `true` | +| [`me_writer_pick_mode`](#me_writer_pick_mode) | `"sorted_rr"` or `"p2c"` | `"p2c"` | +| [`me_writer_pick_sample_size`](#me_writer_pick_sample_size) | `u8` | `3` | +| [`ntp_check`](#ntp_check) | `bool` | `true` | +| [`ntp_servers`](#ntp_servers) | `String[]` | `["pool.ntp.org"]` | +| [`auto_degradation_enabled`](#auto_degradation_enabled) | `bool` | `true` | +| [`degradation_min_unavailable_dc_groups`](#degradation_min_unavailable_dc_groups) | `u8` | `2` | +| [`rst_on_close`](#rst_on_close) | `"off"`, `"errors"`, or `"always"` | `"off"` | -## "cfg-general-data_path" -- `data_path` +## data_path - **Constraints / validation**: `String` (optional). - **Description**: Optional runtime data directory path. - **Example**: @@ -231,8 +226,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] data_path = "/var/lib/telemt" ``` -## "cfg-general-prefer_ipv6" -- `prefer_ipv6` +## prefer_ipv6 - **Constraints / validation**: Deprecated. Use `network.prefer`. - **Description**: Deprecated legacy IPv6 preference flag migrated to `network.prefer`. - **Example**: @@ -241,8 +235,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] prefer = 6 ``` -## "cfg-general-fast_mode" -- `fast_mode` +## fast_mode - **Constraints / validation**: `bool`. - **Description**: Enables fast-path optimizations for traffic processing. - **Example**: @@ -251,8 +244,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] fast_mode = true ``` -## "cfg-general-use_middle_proxy" -- `use_middle_proxy` +## use_middle_proxy - **Constraints / validation**: `bool`. - **Description**: Enables ME transport mode; if `false`, runtime falls back to direct DC routing. - **Example**: @@ -261,8 +253,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] use_middle_proxy = true ``` -## "cfg-general-proxy_secret_path" -- `proxy_secret_path` +## proxy_secret_path - **Constraints / validation**: `String`. When omitted, the default path is `"proxy-secret"`. Empty values are accepted by TOML/serde but will likely fail at runtime (invalid file path). - **Description**: Path to Telegram infrastructure `proxy-secret` cache file used by ME handshake/RPC auth. Telemt always tries a fresh download from `https://core.telegram.org/getProxySecret` first, caches it to this path on success, and falls back to reading the cached file (any age) on download failure. - **Example**: @@ -271,8 +262,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] proxy_secret_path = "proxy-secret" ``` -## "cfg-general-proxy_config_v4_cache_path" -- `proxy_config_v4_cache_path` +## proxy_config_v4_cache_path - **Constraints / validation**: `String`. When set, must not be empty/whitespace-only. - **Description**: Optional disk cache path for raw `getProxyConfig` (IPv4) snapshot. At startup Telemt tries to fetch a fresh snapshot first; on fetch failure or empty snapshot it falls back to this cache file when present and non-empty. - **Example**: @@ -281,8 +271,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] proxy_config_v4_cache_path = "cache/proxy-config-v4.txt" ``` -## "cfg-general-proxy_config_v6_cache_path" -- `proxy_config_v6_cache_path` +## proxy_config_v6_cache_path - **Constraints / validation**: `String`. When set, must not be empty/whitespace-only. - **Description**: Optional disk cache path for raw `getProxyConfigV6` (IPv6) snapshot. At startup Telemt tries to fetch a fresh snapshot first; on fetch failure or empty snapshot it falls back to this cache file when present and non-empty. - **Example**: @@ -291,8 +280,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] proxy_config_v6_cache_path = "cache/proxy-config-v6.txt" ``` -## "cfg-general-ad_tag" -- `ad_tag` +## ad_tag - **Constraints / validation**: `String` (optional). When set, must be exactly 32 hex characters; invalid values are disabled during config load. - **Description**: Global fallback sponsored-channel `ad_tag` (used when user has no override in `access.user_ad_tags`). An all-zero tag is accepted but has no effect (and is warned about) until replaced with a real tag from `@MTProxybot`. - **Example**: @@ -301,8 +289,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] ad_tag = "00112233445566778899aabbccddeeff" ``` -## "cfg-general-middle_proxy_nat_ip" -- `middle_proxy_nat_ip` +## middle_proxy_nat_ip - **Constraints / validation**: `IpAddr` (optional). - **Description**: Manual public NAT IP override used as ME address material when set. - **Example**: @@ -311,8 +298,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] middle_proxy_nat_ip = "203.0.113.10" ``` -## "cfg-general-middle_proxy_nat_probe" -- `middle_proxy_nat_probe` +## middle_proxy_nat_probe - **Constraints / validation**: `bool`. Effective probing is gated by `network.stun_use` (when `network.stun_use = false`, STUN probing is disabled even if this flag is `true`). - **Description**: Enables STUN-based NAT probing to discover public IP:port used by ME key derivation in NAT environments. - **Example**: @@ -321,8 +307,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] middle_proxy_nat_probe = true ``` -## "cfg-general-middle_proxy_nat_stun" -- `middle_proxy_nat_stun` +## middle_proxy_nat_stun - **Constraints / validation**: Deprecated. Use `network.stun_servers`. - **Description**: Deprecated legacy single STUN server for NAT probing. During config load it is merged into `network.stun_servers` unless `network.stun_servers` is explicitly set. - **Example**: @@ -331,8 +316,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] stun_servers = ["stun.l.google.com:19302"] ``` -## "cfg-general-middle_proxy_nat_stun_servers" -- `middle_proxy_nat_stun_servers` +## middle_proxy_nat_stun_servers - **Constraints / validation**: Deprecated. Use `network.stun_servers`. - **Description**: Deprecated legacy STUN list for NAT probing fallback. During config load it is merged into `network.stun_servers` unless `network.stun_servers` is explicitly set. - **Example**: @@ -341,8 +325,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] stun_servers = ["stun.l.google.com:19302"] ``` -## "cfg-general-stun_nat_probe_concurrency" -- `stun_nat_probe_concurrency` +## stun_nat_probe_concurrency - **Constraints / validation**: Must be `> 0`. - **Description**: Maximum number of parallel STUN probes during NAT/public endpoint discovery. - **Example**: @@ -351,8 +334,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] stun_nat_probe_concurrency = 8 ``` -## "cfg-general-middle_proxy_pool_size" -- `middle_proxy_pool_size` +## middle_proxy_pool_size - **Constraints / validation**: `usize`. Effective value is `max(value, 1)` at runtime (so `0` behaves as `1`). - **Description**: Target size of active ME writer pool. - **Example**: @@ -361,8 +343,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] middle_proxy_pool_size = 8 ``` -## "cfg-general-middle_proxy_warm_standby" -- `middle_proxy_warm_standby` +## middle_proxy_warm_standby - **Constraints / validation**: `usize`. - **Description**: Number of warm standby ME connections kept pre-initialized. - **Example**: @@ -371,8 +352,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] middle_proxy_warm_standby = 16 ``` -## "cfg-general-me_init_retry_attempts" -- `me_init_retry_attempts` +## me_init_retry_attempts - **Constraints / validation**: `0..=1_000_000` (`0` means unlimited retries). - **Description**: Startup retries for ME pool initialization. - **Example**: @@ -381,8 +361,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_init_retry_attempts = 0 ``` -## "cfg-general-me2dc_fallback" -- `me2dc_fallback` +## me2dc_fallback - **Constraints / validation**: `bool`. - **Description**: Allows fallback from ME mode to direct DC when ME startup fails. - **Example**: @@ -391,8 +370,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me2dc_fallback = true ``` -## "cfg-general-me2dc_fast" -- `me2dc_fast` +## me2dc_fast - **Constraints / validation**: `bool`. Active only when `use_middle_proxy = true` and `me2dc_fallback = true`. - **Description**: Fast ME->Direct fallback mode for new sessions. - **Example**: @@ -403,8 +381,7 @@ This document lists all configuration keys accepted by `config.toml`. me2dc_fallback = true me2dc_fast = false ``` -## "cfg-general-me_keepalive_enabled" -- `me_keepalive_enabled` +## me_keepalive_enabled - **Constraints / validation**: `bool`. - **Description**: Enables periodic ME keepalive padding frames. - **Example**: @@ -413,8 +390,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_keepalive_enabled = true ``` -## "cfg-general-me_keepalive_interval_secs" -- `me_keepalive_interval_secs` +## me_keepalive_interval_secs - **Constraints / validation**: `u64` (seconds). - **Description**: Base ME keepalive interval in seconds. - **Example**: @@ -423,8 +399,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_keepalive_interval_secs = 8 ``` -## "cfg-general-me_keepalive_jitter_secs" -- `me_keepalive_jitter_secs` +## me_keepalive_jitter_secs - **Constraints / validation**: `u64` (seconds). - **Description**: Keepalive jitter in seconds to reduce synchronized bursts. - **Example**: @@ -433,8 +408,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_keepalive_jitter_secs = 2 ``` -## "cfg-general-me_keepalive_payload_random" -- `me_keepalive_payload_random` +## me_keepalive_payload_random - **Constraints / validation**: `bool`. - **Description**: Randomizes keepalive payload bytes instead of fixed zero payload. - **Example**: @@ -443,8 +417,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_keepalive_payload_random = true ``` -## "cfg-general-rpc_proxy_req_every" -- `rpc_proxy_req_every` +## rpc_proxy_req_every - **Constraints / validation**: `0` or within `10..=300` (seconds). - **Description**: Interval for service `RPC_PROXY_REQ` activity signals to ME (`0` disables). - **Example**: @@ -453,8 +426,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] rpc_proxy_req_every = 0 ``` -## "cfg-general-me_writer_cmd_channel_capacity" -- `me_writer_cmd_channel_capacity` +## me_writer_cmd_channel_capacity - **Constraints / validation**: Must be `> 0`. - **Description**: Capacity of per-writer command channel. - **Example**: @@ -463,8 +435,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_writer_cmd_channel_capacity = 4096 ``` -## "cfg-general-me_route_channel_capacity" -- `me_route_channel_capacity` +## me_route_channel_capacity - **Constraints / validation**: Must be `> 0`. - **Description**: Capacity of per-connection ME response route channel. - **Example**: @@ -473,8 +444,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_channel_capacity = 768 ``` -## "cfg-general-me_c2me_channel_capacity" -- `me_c2me_channel_capacity` +## me_c2me_channel_capacity - **Constraints / validation**: Must be `> 0`. - **Description**: Capacity of per-client command queue (client reader -> ME sender). - **Example**: @@ -483,8 +453,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_c2me_channel_capacity = 1024 ``` -## "cfg-general-me_c2me_send_timeout_ms" -- `me_c2me_send_timeout_ms` +## me_c2me_send_timeout_ms - **Constraints / validation**: `0..=60000` (milliseconds). - **Description**: Maximum wait for enqueueing client->ME commands when the per-client queue is full (`0` keeps legacy unbounded wait). - **Example**: @@ -493,8 +462,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_c2me_send_timeout_ms = 4000 ``` -## "cfg-general-me_reader_route_data_wait_ms" -- `me_reader_route_data_wait_ms` +## me_reader_route_data_wait_ms - **Constraints / validation**: `0..=20` (milliseconds). - **Description**: Bounded wait for routing ME DATA to per-connection queue (`0` = no wait). - **Example**: @@ -503,8 +471,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_reader_route_data_wait_ms = 2 ``` -## "cfg-general-me_d2c_flush_batch_max_frames" -- `me_d2c_flush_batch_max_frames` +## me_d2c_flush_batch_max_frames - **Constraints / validation**: Must be within `1..=512`. - **Description**: Max ME->client frames coalesced before flush. - **Example**: @@ -513,8 +480,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_d2c_flush_batch_max_frames = 32 ``` -## "cfg-general-me_d2c_flush_batch_max_bytes" -- `me_d2c_flush_batch_max_bytes` +## me_d2c_flush_batch_max_bytes - **Constraints / validation**: Must be within `4096..=2097152` (bytes). - **Description**: Max ME->client payload bytes coalesced before flush. - **Example**: @@ -523,8 +489,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_d2c_flush_batch_max_bytes = 131072 ``` -## "cfg-general-me_d2c_flush_batch_max_delay_us" -- `me_d2c_flush_batch_max_delay_us` +## me_d2c_flush_batch_max_delay_us - **Constraints / validation**: `0..=5000` (microseconds). - **Description**: Max microsecond wait for coalescing more ME->client frames (`0` disables timed coalescing). - **Example**: @@ -533,8 +498,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_d2c_flush_batch_max_delay_us = 500 ``` -## "cfg-general-me_d2c_ack_flush_immediate" -- `me_d2c_ack_flush_immediate` +## me_d2c_ack_flush_immediate - **Constraints / validation**: `bool`. - **Description**: Flushes client writer immediately after quick-ack write. - **Example**: @@ -543,8 +507,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_d2c_ack_flush_immediate = true ``` -## "cfg-general-me_quota_soft_overshoot_bytes" -- `me_quota_soft_overshoot_bytes` +## me_quota_soft_overshoot_bytes - **Constraints / validation**: `0..=16777216` (bytes). - **Description**: Extra per-route quota allowance (bytes) tolerated before writer-side quota enforcement drops route data. - **Example**: @@ -553,8 +516,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_quota_soft_overshoot_bytes = 65536 ``` -## "cfg-general-me_d2c_frame_buf_shrink_threshold_bytes" -- `me_d2c_frame_buf_shrink_threshold_bytes` +## me_d2c_frame_buf_shrink_threshold_bytes - **Constraints / validation**: Must be within `4096..=16777216` (bytes). - **Description**: Threshold for shrinking oversized ME->client frame-aggregation buffers after flush. - **Example**: @@ -563,8 +525,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_d2c_frame_buf_shrink_threshold_bytes = 262144 ``` -## "cfg-general-direct_relay_copy_buf_c2s_bytes" -- `direct_relay_copy_buf_c2s_bytes` +## direct_relay_copy_buf_c2s_bytes - **Constraints / validation**: Must be within `4096..=1048576` (bytes). - **Description**: Copy buffer size for client->DC direction in direct relay. - **Example**: @@ -573,8 +534,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] direct_relay_copy_buf_c2s_bytes = 65536 ``` -## "cfg-general-direct_relay_copy_buf_s2c_bytes" -- `direct_relay_copy_buf_s2c_bytes` +## direct_relay_copy_buf_s2c_bytes - **Constraints / validation**: Must be within `8192..=2097152` (bytes). - **Description**: Copy buffer size for DC->client direction in direct relay. - **Example**: @@ -583,8 +543,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] direct_relay_copy_buf_s2c_bytes = 262144 ``` -## "cfg-general-crypto_pending_buffer" -- `crypto_pending_buffer` +## crypto_pending_buffer - **Constraints / validation**: `usize` (bytes). - **Description**: Max pending ciphertext buffer per client writer (bytes). - **Example**: @@ -593,8 +552,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] crypto_pending_buffer = 262144 ``` -## "cfg-general-max_client_frame" -- `max_client_frame` +## max_client_frame - **Constraints / validation**: `usize` (bytes). - **Description**: Maximum allowed client MTProto frame size (bytes). - **Example**: @@ -603,8 +561,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] max_client_frame = 16777216 ``` -## "cfg-general-desync_all_full" -- `desync_all_full` +## desync_all_full - **Constraints / validation**: `bool`. - **Description**: Emits full crypto-desync forensic logs for every event. - **Example**: @@ -613,8 +570,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] desync_all_full = false ``` -## "cfg-general-beobachten" -- `beobachten` +## beobachten - **Constraints / validation**: `bool`. - **Description**: Enables per-IP forensic observation buckets. - **Example**: @@ -623,8 +579,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] beobachten = true ``` -## "cfg-general-beobachten_minutes" -- `beobachten_minutes` +## beobachten_minutes - **Constraints / validation**: Must be `> 0` (minutes). - **Description**: Retention window (minutes) for per-IP observation buckets. - **Example**: @@ -633,8 +588,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] beobachten_minutes = 10 ``` -## "cfg-general-beobachten_flush_secs" -- `beobachten_flush_secs` +## beobachten_flush_secs - **Constraints / validation**: Must be `> 0` (seconds). - **Description**: Snapshot flush interval (seconds) for observation output file. - **Example**: @@ -643,8 +597,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] beobachten_flush_secs = 15 ``` -## "cfg-general-beobachten_file" -- `beobachten_file` +## beobachten_file - **Constraints / validation**: Must not be empty/whitespace-only. - **Description**: Observation snapshot output file path. - **Example**: @@ -653,8 +606,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] beobachten_file = "cache/beobachten.txt" ``` -## "cfg-general-hardswap" -- `hardswap` +## hardswap - **Constraints / validation**: `bool`. - **Description**: Enables generation-based ME hardswap strategy. - **Example**: @@ -663,8 +615,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] hardswap = true ``` -## "cfg-general-me_warmup_stagger_enabled" -- `me_warmup_stagger_enabled` +## me_warmup_stagger_enabled - **Constraints / validation**: `bool`. - **Description**: Staggers extra ME warmup dials to avoid connection spikes. - **Example**: @@ -673,8 +624,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_warmup_stagger_enabled = true ``` -## "cfg-general-me_warmup_step_delay_ms" -- `me_warmup_step_delay_ms` +## me_warmup_step_delay_ms - **Constraints / validation**: `u64` (milliseconds). - **Description**: Base delay in milliseconds between warmup dial steps. - **Example**: @@ -683,8 +633,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_warmup_step_delay_ms = 500 ``` -## "cfg-general-me_warmup_step_jitter_ms" -- `me_warmup_step_jitter_ms` +## me_warmup_step_jitter_ms - **Constraints / validation**: `u64` (milliseconds). - **Description**: Additional random delay in milliseconds for warmup steps. - **Example**: @@ -693,8 +642,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_warmup_step_jitter_ms = 300 ``` -## "cfg-general-me_reconnect_max_concurrent_per_dc" -- `me_reconnect_max_concurrent_per_dc` +## me_reconnect_max_concurrent_per_dc - **Constraints / validation**: `u32`. Effective value is `max(value, 1)` at runtime (so `0` behaves as `1`). - **Description**: Limits concurrent reconnect workers per DC during health recovery. - **Example**: @@ -703,8 +651,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_reconnect_max_concurrent_per_dc = 8 ``` -## "cfg-general-me_reconnect_backoff_base_ms" -- `me_reconnect_backoff_base_ms` +## me_reconnect_backoff_base_ms - **Constraints / validation**: `u64` (milliseconds). - **Description**: Initial reconnect backoff in milliseconds. - **Example**: @@ -713,8 +660,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_reconnect_backoff_base_ms = 500 ``` -## "cfg-general-me_reconnect_backoff_cap_ms" -- `me_reconnect_backoff_cap_ms` +## me_reconnect_backoff_cap_ms - **Constraints / validation**: `u64` (milliseconds). - **Description**: Maximum reconnect backoff cap in milliseconds. - **Example**: @@ -723,8 +669,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_reconnect_backoff_cap_ms = 30000 ``` -## "cfg-general-me_reconnect_fast_retry_count" -- `me_reconnect_fast_retry_count` +## me_reconnect_fast_retry_count - **Constraints / validation**: `u32`. Effective value is `max(value, 1)` at runtime (so `0` behaves as `1`). - **Description**: Immediate retry budget before long backoff behavior applies. - **Example**: @@ -733,8 +678,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_reconnect_fast_retry_count = 16 ``` -## "cfg-general-me_single_endpoint_shadow_writers" -- `me_single_endpoint_shadow_writers` +## me_single_endpoint_shadow_writers - **Constraints / validation**: Must be within `0..=32`. - **Description**: Additional reserve writers for DC groups with exactly one endpoint. - **Example**: @@ -743,8 +687,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_single_endpoint_shadow_writers = 2 ``` -## "cfg-general-me_single_endpoint_outage_mode_enabled" -- `me_single_endpoint_outage_mode_enabled` +## me_single_endpoint_outage_mode_enabled - **Constraints / validation**: `bool`. - **Description**: Enables aggressive outage recovery mode for DC groups with exactly one endpoint. - **Example**: @@ -753,8 +696,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_single_endpoint_outage_mode_enabled = true ``` -## "cfg-general-me_single_endpoint_outage_disable_quarantine" -- `me_single_endpoint_outage_disable_quarantine` +## me_single_endpoint_outage_disable_quarantine - **Constraints / validation**: `bool`. - **Description**: Ignores endpoint quarantine while in single-endpoint outage mode. - **Example**: @@ -763,8 +705,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_single_endpoint_outage_disable_quarantine = true ``` -## "cfg-general-me_single_endpoint_outage_backoff_min_ms" -- `me_single_endpoint_outage_backoff_min_ms` +## me_single_endpoint_outage_backoff_min_ms - **Constraints / validation**: Must be `> 0` (milliseconds) and `<= me_single_endpoint_outage_backoff_max_ms`. - **Description**: Minimum reconnect backoff in single-endpoint outage mode. - **Example**: @@ -773,8 +714,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_single_endpoint_outage_backoff_min_ms = 250 ``` -## "cfg-general-me_single_endpoint_outage_backoff_max_ms" -- `me_single_endpoint_outage_backoff_max_ms` +## me_single_endpoint_outage_backoff_max_ms - **Constraints / validation**: Must be `> 0` (milliseconds) and `>= me_single_endpoint_outage_backoff_min_ms`. - **Description**: Maximum reconnect backoff in single-endpoint outage mode. - **Example**: @@ -783,8 +723,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_single_endpoint_outage_backoff_max_ms = 3000 ``` -## "cfg-general-me_single_endpoint_shadow_rotate_every_secs" -- `me_single_endpoint_shadow_rotate_every_secs` +## me_single_endpoint_shadow_rotate_every_secs - **Constraints / validation**: `u64` (seconds). `0` disables periodic shadow rotation. - **Description**: Periodic shadow writer rotation interval for single-endpoint DC groups. - **Example**: @@ -793,8 +732,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_single_endpoint_shadow_rotate_every_secs = 900 ``` -## "cfg-general-me_floor_mode" -- `me_floor_mode` +## me_floor_mode - **Constraints / validation**: `"static"` or `"adaptive"`. - **Description**: Floor policy mode for ME writer targets. - **Example**: @@ -803,8 +741,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_floor_mode = "adaptive" ``` -## "cfg-general-me_adaptive_floor_idle_secs" -- `me_adaptive_floor_idle_secs` +## me_adaptive_floor_idle_secs - **Constraints / validation**: `u64` (seconds). - **Description**: Idle time before adaptive floor may reduce the single-endpoint writer target. - **Example**: @@ -813,8 +750,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_idle_secs = 90 ``` -## "cfg-general-me_adaptive_floor_min_writers_single_endpoint" -- `me_adaptive_floor_min_writers_single_endpoint` +## me_adaptive_floor_min_writers_single_endpoint - **Constraints / validation**: Must be within `1..=32`. - **Description**: Minimum writer target for single-endpoint DC groups in adaptive floor mode. - **Example**: @@ -823,8 +759,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_min_writers_single_endpoint = 1 ``` -## "cfg-general-me_adaptive_floor_min_writers_multi_endpoint" -- `me_adaptive_floor_min_writers_multi_endpoint` +## me_adaptive_floor_min_writers_multi_endpoint - **Constraints / validation**: Must be within `1..=32`. - **Description**: Minimum writer target for multi-endpoint DC groups in adaptive floor mode. - **Example**: @@ -833,8 +768,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_min_writers_multi_endpoint = 1 ``` -## "cfg-general-me_adaptive_floor_recover_grace_secs" -- `me_adaptive_floor_recover_grace_secs` +## me_adaptive_floor_recover_grace_secs - **Constraints / validation**: `u64` (seconds). - **Description**: Grace period to hold static floor after activity in adaptive mode. - **Example**: @@ -843,8 +777,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_recover_grace_secs = 180 ``` -## "cfg-general-me_adaptive_floor_writers_per_core_total" -- `me_adaptive_floor_writers_per_core_total` +## me_adaptive_floor_writers_per_core_total - **Constraints / validation**: Must be `> 0`. - **Description**: Global ME writer budget per logical CPU core in adaptive mode. - **Example**: @@ -853,8 +786,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_writers_per_core_total = 48 ``` -## "cfg-general-me_adaptive_floor_cpu_cores_override" -- `me_adaptive_floor_cpu_cores_override` +## me_adaptive_floor_cpu_cores_override - **Constraints / validation**: `u16`. `0` uses runtime auto-detection. - **Description**: Override logical CPU core count used for adaptive floor calculations. - **Example**: @@ -863,8 +795,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_cpu_cores_override = 0 ``` -## "cfg-general-me_adaptive_floor_max_extra_writers_single_per_core" -- `me_adaptive_floor_max_extra_writers_single_per_core` +## me_adaptive_floor_max_extra_writers_single_per_core - **Constraints / validation**: `u16`. - **Description**: Per-core max extra writers above base required floor for single-endpoint DC groups. - **Example**: @@ -873,8 +804,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_max_extra_writers_single_per_core = 1 ``` -## "cfg-general-me_adaptive_floor_max_extra_writers_multi_per_core" -- `me_adaptive_floor_max_extra_writers_multi_per_core` +## me_adaptive_floor_max_extra_writers_multi_per_core - **Constraints / validation**: `u16`. - **Description**: Per-core max extra writers above base required floor for multi-endpoint DC groups. - **Example**: @@ -883,8 +813,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_max_extra_writers_multi_per_core = 2 ``` -## "cfg-general-me_adaptive_floor_max_active_writers_per_core" -- `me_adaptive_floor_max_active_writers_per_core` +## me_adaptive_floor_max_active_writers_per_core - **Constraints / validation**: Must be `> 0`. - **Description**: Hard cap for active ME writers per logical CPU core. - **Example**: @@ -893,8 +822,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_max_active_writers_per_core = 64 ``` -## "cfg-general-me_adaptive_floor_max_warm_writers_per_core" -- `me_adaptive_floor_max_warm_writers_per_core` +## me_adaptive_floor_max_warm_writers_per_core - **Constraints / validation**: Must be `> 0`. - **Description**: Hard cap for warm ME writers per logical CPU core. - **Example**: @@ -903,8 +831,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_max_warm_writers_per_core = 64 ``` -## "cfg-general-me_adaptive_floor_max_active_writers_global" -- `me_adaptive_floor_max_active_writers_global` +## me_adaptive_floor_max_active_writers_global - **Constraints / validation**: Must be `> 0`. - **Description**: Hard global cap for active ME writers. - **Example**: @@ -913,8 +840,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_max_active_writers_global = 256 ``` -## "cfg-general-me_adaptive_floor_max_warm_writers_global" -- `me_adaptive_floor_max_warm_writers_global` +## me_adaptive_floor_max_warm_writers_global - **Constraints / validation**: Must be `> 0`. - **Description**: Hard global cap for warm ME writers. - **Example**: @@ -923,8 +849,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_adaptive_floor_max_warm_writers_global = 256 ``` -## "cfg-general-upstream_connect_retry_attempts" -- `upstream_connect_retry_attempts` +## upstream_connect_retry_attempts - **Constraints / validation**: Must be `> 0`. - **Description**: Connect attempts for the selected upstream before returning error/fallback. - **Example**: @@ -933,8 +858,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] upstream_connect_retry_attempts = 2 ``` -## "cfg-general-upstream_connect_retry_backoff_ms" -- `upstream_connect_retry_backoff_ms` +## upstream_connect_retry_backoff_ms - **Constraints / validation**: `u64` (milliseconds). `0` disables backoff delay (retries become immediate). - **Description**: Delay in milliseconds between upstream connect attempts. - **Example**: @@ -943,8 +867,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] upstream_connect_retry_backoff_ms = 100 ``` -## "cfg-general-upstream_connect_budget_ms" -- `upstream_connect_budget_ms` +## upstream_connect_budget_ms - **Constraints / validation**: Must be `> 0` (milliseconds). - **Description**: Total wall-clock budget in milliseconds for one upstream connect request across retries. - **Example**: @@ -953,8 +876,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] upstream_connect_budget_ms = 3000 ``` -## "cfg-general-upstream_unhealthy_fail_threshold" -- `upstream_unhealthy_fail_threshold` +## upstream_unhealthy_fail_threshold - **Constraints / validation**: Must be `> 0`. - **Description**: Consecutive failed requests before upstream is marked unhealthy. - **Example**: @@ -963,8 +885,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] upstream_unhealthy_fail_threshold = 5 ``` -## "cfg-general-upstream_connect_failfast_hard_errors" -- `upstream_connect_failfast_hard_errors` +## upstream_connect_failfast_hard_errors - **Constraints / validation**: `bool`. - **Description**: When true, skips additional retries for hard non-transient upstream connect errors. - **Example**: @@ -973,8 +894,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] upstream_connect_failfast_hard_errors = false ``` -## "cfg-general-stun_iface_mismatch_ignore" -- `stun_iface_mismatch_ignore` +## stun_iface_mismatch_ignore - **Constraints / validation**: `bool`. - **Description**: Compatibility flag reserved for future use. Currently this key is parsed but not used by the runtime. - **Example**: @@ -983,8 +903,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] stun_iface_mismatch_ignore = false ``` -## "cfg-general-unknown_dc_log_path" -- `unknown_dc_log_path` +## unknown_dc_log_path - **Constraints / validation**: `String` (optional). Must be a safe path (no `..` components, parent directory must exist); unsafe paths are rejected at runtime. - **Description**: Log file path for unknown (non-standard) DC requests when `unknown_dc_file_log_enabled = true`. Omit this key to disable file logging. - **Example**: @@ -993,8 +912,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] unknown_dc_log_path = "unknown-dc.txt" ``` -## "cfg-general-unknown_dc_file_log_enabled" -- `unknown_dc_file_log_enabled` +## unknown_dc_file_log_enabled - **Constraints / validation**: `bool`. - **Description**: Enables unknown-DC file logging (writes `dc_idx=` lines). Requires `unknown_dc_log_path` to be set and, on non-Unix platforms, may be unsupported. Logging is deduplicated and capped (only the first ~1024 distinct unknown DC indices are recorded). - **Example**: @@ -1003,8 +921,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] unknown_dc_file_log_enabled = false ``` -## "cfg-general-log_level" -- `log_level` +## log_level - **Constraints / validation**: `"debug"`, `"verbose"`, `"normal"`, or `"silent"`. - **Description**: Runtime logging verbosity level (used when `RUST_LOG` is not set). If `RUST_LOG` is set in the environment, it takes precedence over this setting. - **Example**: @@ -1013,8 +930,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] log_level = "normal" ``` -## "cfg-general-disable_colors" -- `disable_colors` +## disable_colors - **Constraints / validation**: `bool`. - **Description**: Disables ANSI colors in logs (useful for files/systemd). This affects log formatting only and does not change the log level/filtering. - **Example**: @@ -1023,8 +939,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] disable_colors = false ``` -## "cfg-general-me_socks_kdf_policy" -- `me_socks_kdf_policy` +## me_socks_kdf_policy - **Constraints / validation**: `"strict"` or `"compat"`. - **Description**: SOCKS-bound KDF fallback policy for Middle-End handshake. - **Example**: @@ -1033,8 +948,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_socks_kdf_policy = "strict" ``` -## "cfg-general-me_route_backpressure_base_timeout_ms" -- `me_route_backpressure_base_timeout_ms` +## me_route_backpressure_base_timeout_ms - **Constraints / validation**: Must be within `1..=5000` (milliseconds). - **Description**: Base backpressure timeout in milliseconds for ME route-channel send. - **Example**: @@ -1043,8 +957,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_backpressure_base_timeout_ms = 25 ``` -## "cfg-general-me_route_backpressure_high_timeout_ms" -- `me_route_backpressure_high_timeout_ms` +## me_route_backpressure_high_timeout_ms - **Constraints / validation**: Must be within `1..=5000` (milliseconds) and `>= me_route_backpressure_base_timeout_ms`. - **Description**: High backpressure timeout in milliseconds when queue occupancy is above watermark. - **Example**: @@ -1053,8 +966,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_backpressure_high_timeout_ms = 120 ``` -## "cfg-general-me_route_backpressure_high_watermark_pct" -- `me_route_backpressure_high_watermark_pct` +## me_route_backpressure_high_watermark_pct - **Constraints / validation**: Must be within `1..=100` (percent). - **Description**: Queue occupancy percent threshold for switching to high backpressure timeout. - **Example**: @@ -1063,8 +975,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_backpressure_high_watermark_pct = 80 ``` -## "cfg-general-me_health_interval_ms_unhealthy" -- `me_health_interval_ms_unhealthy` +## me_health_interval_ms_unhealthy - **Constraints / validation**: Must be `> 0` (milliseconds). - **Description**: Health monitor interval while ME writer coverage is degraded. - **Example**: @@ -1073,8 +984,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_health_interval_ms_unhealthy = 1000 ``` -## "cfg-general-me_health_interval_ms_healthy" -- `me_health_interval_ms_healthy` +## me_health_interval_ms_healthy - **Constraints / validation**: Must be `> 0` (milliseconds). - **Description**: Health monitor interval while ME writer coverage is stable/healthy. - **Example**: @@ -1083,8 +993,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_health_interval_ms_healthy = 3000 ``` -## "cfg-general-me_admission_poll_ms" -- `me_admission_poll_ms` +## me_admission_poll_ms - **Constraints / validation**: Must be `> 0` (milliseconds). - **Description**: Poll interval for conditional-admission state checks. - **Example**: @@ -1093,8 +1002,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_admission_poll_ms = 1000 ``` -## "cfg-general-me_warn_rate_limit_ms" -- `me_warn_rate_limit_ms` +## me_warn_rate_limit_ms - **Constraints / validation**: Must be `> 0` (milliseconds). - **Description**: Cooldown for repetitive ME warning logs. - **Example**: @@ -1103,8 +1011,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_warn_rate_limit_ms = 5000 ``` -## "cfg-general-me_route_no_writer_mode" -- `me_route_no_writer_mode` +## me_route_no_writer_mode - **Constraints / validation**: `"async_recovery_failfast"`, `"inline_recovery_legacy"`, or `"hybrid_async_persistent"`. - **Description**: ME route behavior when no writer is immediately available. - **Example**: @@ -1113,8 +1020,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_no_writer_mode = "hybrid_async_persistent" ``` -## "cfg-general-me_route_no_writer_wait_ms" -- `me_route_no_writer_wait_ms` +## me_route_no_writer_wait_ms - **Constraints / validation**: Must be within `10..=5000` (milliseconds). - **Description**: Max wait time used by async-recovery failfast mode before falling back. - **Example**: @@ -1123,8 +1029,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_no_writer_wait_ms = 250 ``` -## "cfg-general-me_route_hybrid_max_wait_ms" -- `me_route_hybrid_max_wait_ms` +## me_route_hybrid_max_wait_ms - **Constraints / validation**: Must be within `50..=60000` (milliseconds). - **Description**: Maximum cumulative wait in hybrid no-writer mode before failfast fallback. - **Example**: @@ -1133,8 +1038,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_hybrid_max_wait_ms = 3000 ``` -## "cfg-general-me_route_blocking_send_timeout_ms" -- `me_route_blocking_send_timeout_ms` +## me_route_blocking_send_timeout_ms - **Constraints / validation**: Must be within `0..=5000` (milliseconds). `0` keeps legacy unbounded wait behavior. - **Description**: Maximum wait for blocking route-channel send fallback. - **Example**: @@ -1143,8 +1047,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_blocking_send_timeout_ms = 250 ``` -## "cfg-general-me_route_inline_recovery_attempts" -- `me_route_inline_recovery_attempts` +## me_route_inline_recovery_attempts - **Constraints / validation**: Must be `> 0`. - **Description**: Number of inline recovery attempts in legacy mode. - **Example**: @@ -1153,8 +1056,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_inline_recovery_attempts = 3 ``` -## "cfg-general-me_route_inline_recovery_wait_ms" -- `me_route_inline_recovery_wait_ms` +## me_route_inline_recovery_wait_ms - **Constraints / validation**: Must be within `10..=30000` (milliseconds). - **Description**: Max inline recovery wait in legacy mode. - **Example**: @@ -1163,8 +1065,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_route_inline_recovery_wait_ms = 3000 ``` -## "cfg-general-fast_mode_min_tls_record" -- `fast_mode_min_tls_record` +## fast_mode_min_tls_record - **Constraints / validation**: `usize` (bytes). `0` disables the limit. - **Description**: Minimum TLS record size when fast-mode coalescing is enabled. - **Example**: @@ -1173,8 +1074,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] fast_mode_min_tls_record = 0 ``` -## "cfg-general-update_every" -- `update_every` +## update_every - **Constraints / validation**: `u64` (seconds). If set, must be `> 0`. If this key is not explicitly set, legacy `proxy_secret_auto_reload_secs` and `proxy_config_auto_reload_secs` may be used (their effective minimum must be `> 0`). - **Description**: Unified refresh interval for ME updater tasks (`getProxyConfig`, `getProxyConfigV6`, `getProxySecret`). When set, it overrides legacy proxy reload intervals. - **Example**: @@ -1183,8 +1083,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] update_every = 300 ``` -## "cfg-general-me_reinit_every_secs" -- `me_reinit_every_secs` +## me_reinit_every_secs - **Constraints / validation**: Must be `> 0` (seconds). - **Description**: Periodic interval for zero-downtime ME reinit cycle. - **Example**: @@ -1193,8 +1092,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_reinit_every_secs = 900 ``` -## "cfg-general-me_hardswap_warmup_delay_min_ms" -- `me_hardswap_warmup_delay_min_ms` +## me_hardswap_warmup_delay_min_ms - **Constraints / validation**: `u64` (milliseconds). Must be `<= me_hardswap_warmup_delay_max_ms`. - **Description**: Lower bound for hardswap warmup dial spacing. - **Example**: @@ -1203,8 +1101,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_hardswap_warmup_delay_min_ms = 1000 ``` -## "cfg-general-me_hardswap_warmup_delay_max_ms" -- `me_hardswap_warmup_delay_max_ms` +## me_hardswap_warmup_delay_max_ms - **Constraints / validation**: Must be `> 0` (milliseconds). - **Description**: Upper bound for hardswap warmup dial spacing. - **Example**: @@ -1213,8 +1110,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_hardswap_warmup_delay_max_ms = 2000 ``` -## "cfg-general-me_hardswap_warmup_extra_passes" -- `me_hardswap_warmup_extra_passes` +## me_hardswap_warmup_extra_passes - **Constraints / validation**: Must be within `[0, 10]`. - **Description**: Additional warmup passes after the base pass in one hardswap cycle. - **Example**: @@ -1224,8 +1120,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: 3 (allowed range: 0..=10) me_hardswap_warmup_extra_passes = 3 ``` -## "cfg-general-me_hardswap_warmup_pass_backoff_base_ms" -- `me_hardswap_warmup_pass_backoff_base_ms` +## me_hardswap_warmup_pass_backoff_base_ms - **Constraints / validation**: `u64` (milliseconds). Must be `> 0`. - **Description**: Base backoff between extra hardswap warmup passes when the floor is still incomplete. - **Example**: @@ -1235,8 +1130,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: 500 me_hardswap_warmup_pass_backoff_base_ms = 500 ``` -## "cfg-general-me_config_stable_snapshots" -- `me_config_stable_snapshots` +## me_config_stable_snapshots - **Constraints / validation**: Must be `> 0`. - **Description**: Number of identical ME config snapshots required before apply. - **Example**: @@ -1246,8 +1140,7 @@ This document lists all configuration keys accepted by `config.toml`. # require 3 identical snapshots before applying ME endpoint map updates me_config_stable_snapshots = 3 ``` -## "cfg-general-me_config_apply_cooldown_secs" -- `me_config_apply_cooldown_secs` +## me_config_apply_cooldown_secs - **Constraints / validation**: `u64`. - **Description**: Cooldown between applied ME endpoint-map updates. `0` disables the cooldown. - **Example**: @@ -1257,8 +1150,7 @@ This document lists all configuration keys accepted by `config.toml`. # allow applying stable snapshots immediately (no cooldown) me_config_apply_cooldown_secs = 0 ``` -## "cfg-general-me_snapshot_require_http_2xx" -- `me_snapshot_require_http_2xx` +## me_snapshot_require_http_2xx - **Constraints / validation**: `bool`. - **Description**: Requires 2xx HTTP responses for applying ME config snapshots. When `false`, non-2xx responses may still be parsed/considered by the updater. - **Example**: @@ -1268,8 +1160,7 @@ This document lists all configuration keys accepted by `config.toml`. # allow applying snapshots even when the HTTP status is non-2xx me_snapshot_require_http_2xx = false ``` -## "cfg-general-me_snapshot_reject_empty_map" -- `me_snapshot_reject_empty_map` +## me_snapshot_reject_empty_map - **Constraints / validation**: `bool`. - **Description**: Rejects empty ME config snapshots (no endpoints). When `false`, an empty snapshot can be applied (subject to other gates), which may temporarily reduce/clear the ME map. - **Example**: @@ -1279,8 +1170,7 @@ This document lists all configuration keys accepted by `config.toml`. # allow applying empty snapshots (use with care) me_snapshot_reject_empty_map = false ``` -## "cfg-general-me_snapshot_min_proxy_for_lines" -- `me_snapshot_min_proxy_for_lines` +## me_snapshot_min_proxy_for_lines - **Constraints / validation**: Must be `> 0`. - **Description**: Minimum parsed `proxy_for` rows required to accept snapshot. - **Example**: @@ -1290,8 +1180,7 @@ This document lists all configuration keys accepted by `config.toml`. # require at least 10 proxy_for rows before accepting a snapshot me_snapshot_min_proxy_for_lines = 10 ``` -## "cfg-general-proxy_secret_stable_snapshots" -- `proxy_secret_stable_snapshots` +## proxy_secret_stable_snapshots - **Constraints / validation**: Must be `> 0`. - **Description**: Number of identical proxy-secret snapshots required before rotation. - **Example**: @@ -1301,8 +1190,7 @@ This document lists all configuration keys accepted by `config.toml`. # require 2 identical getProxySecret snapshots before rotating at runtime proxy_secret_stable_snapshots = 2 ``` -## "cfg-general-proxy_secret_rotate_runtime" -- `proxy_secret_rotate_runtime` +## proxy_secret_rotate_runtime - **Constraints / validation**: `bool`. - **Description**: Enables runtime proxy-secret rotation from updater snapshots. - **Example**: @@ -1312,8 +1200,7 @@ This document lists all configuration keys accepted by `config.toml`. # disable runtime proxy-secret rotation (startup still uses proxy_secret_path/proxy_secret_len_max) proxy_secret_rotate_runtime = false ``` -## "cfg-general-me_secret_atomic_snapshot" -- `me_secret_atomic_snapshot` +## me_secret_atomic_snapshot - **Constraints / validation**: `bool`. - **Description**: Keeps selector and secret bytes from the same snapshot atomically. When `general.use_middle_proxy = true`, this is auto-enabled during config load to keep ME KDF material coherent. - **Example**: @@ -1323,8 +1210,7 @@ This document lists all configuration keys accepted by `config.toml`. # NOTE: when use_middle_proxy=true, Telemt will auto-enable this during load me_secret_atomic_snapshot = false ``` -## "cfg-general-proxy_secret_len_max" -- `proxy_secret_len_max` +## proxy_secret_len_max - **Constraints / validation**: Must be within `[32, 4096]`. - **Description**: Upper length limit (bytes) for accepted proxy-secret during startup and runtime refresh. - **Example**: @@ -1334,8 +1220,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: 256 (bytes) proxy_secret_len_max = 256 ``` -## "cfg-general-me_pool_drain_ttl_secs" -- `me_pool_drain_ttl_secs` +## me_pool_drain_ttl_secs - **Constraints / validation**: `u64` (seconds). `0` disables the drain-TTL window (and suppresses drain-TTL warnings for non-empty draining writers). - **Description**: Drain-TTL time window for stale ME writers after endpoint map changes. During the TTL, stale writers may be used only as fallback for new bindings (depending on bind policy). - **Example**: @@ -1345,8 +1230,7 @@ This document lists all configuration keys accepted by `config.toml`. # disable drain TTL (draining writers won't emit "past drain TTL" warnings) me_pool_drain_ttl_secs = 0 ``` -## "cfg-general-me_instadrain" -- `me_instadrain` +## me_instadrain - **Constraints / validation**: `bool`. - **Description**: Forces draining stale writers to be removed on the next cleanup tick, bypassing TTL/deadline waiting. - **Example**: @@ -1356,8 +1240,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: false me_instadrain = false ``` -## "cfg-general-me_pool_drain_threshold" -- `me_pool_drain_threshold` +## me_pool_drain_threshold - **Constraints / validation**: `u64`. Set to `0` to disable threshold-based cleanup. - **Description**: Maximum number of draining stale writers before oldest ones are force-closed in batches. - **Example**: @@ -1367,8 +1250,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: 32 me_pool_drain_threshold = 32 ``` -## "cfg-general-me_pool_drain_soft_evict_enabled" -- `me_pool_drain_soft_evict_enabled` +## me_pool_drain_soft_evict_enabled - **Constraints / validation**: `bool`. - **Description**: Enables gradual soft-eviction of stale writers during drain/reinit instead of immediate hard close. - **Example**: @@ -1378,8 +1260,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: true me_pool_drain_soft_evict_enabled = true ``` -## "cfg-general-me_pool_drain_soft_evict_grace_secs" -- `me_pool_drain_soft_evict_grace_secs` +## me_pool_drain_soft_evict_grace_secs - **Constraints / validation**: `u64` (seconds). Must be within `[0, 3600]`. - **Description**: Extra grace (after drain TTL) before soft-eviction stage starts. - **Example**: @@ -1389,8 +1270,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: 10 me_pool_drain_soft_evict_grace_secs = 10 ``` -## "cfg-general-me_pool_drain_soft_evict_per_writer" -- `me_pool_drain_soft_evict_per_writer` +## me_pool_drain_soft_evict_per_writer - **Constraints / validation**: `1..=16`. - **Description**: Maximum stale routes soft-evicted per writer in one eviction pass. - **Example**: @@ -1400,8 +1280,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: 2 me_pool_drain_soft_evict_per_writer = 2 ``` -## "cfg-general-me_pool_drain_soft_evict_budget_per_core" -- `me_pool_drain_soft_evict_budget_per_core` +## me_pool_drain_soft_evict_budget_per_core - **Constraints / validation**: `1..=64`. - **Description**: Per-core budget limiting aggregate soft-eviction work per pass. - **Example**: @@ -1411,8 +1290,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: 16 me_pool_drain_soft_evict_budget_per_core = 16 ``` -## "cfg-general-me_pool_drain_soft_evict_cooldown_ms" -- `me_pool_drain_soft_evict_cooldown_ms` +## me_pool_drain_soft_evict_cooldown_ms - **Constraints / validation**: `u64` (milliseconds). Must be `> 0`. - **Description**: Cooldown between repetitive soft-eviction on the same writer. - **Example**: @@ -1422,8 +1300,7 @@ This document lists all configuration keys accepted by `config.toml`. # default: 1000 me_pool_drain_soft_evict_cooldown_ms = 1000 ``` -## "cfg-general-me_bind_stale_mode" -- `me_bind_stale_mode` +## me_bind_stale_mode - **Constraints / validation**: `"never"`, `"ttl"`, or `"always"`. - **Description**: Policy for new binds on stale draining writers. - **Example**: @@ -1433,8 +1310,7 @@ This document lists all configuration keys accepted by `config.toml`. # allow stale binds only for a limited time window me_bind_stale_mode = "ttl" ``` -## "cfg-general-me_bind_stale_ttl_secs" -- `me_bind_stale_ttl_secs` +## me_bind_stale_ttl_secs - **Constraints / validation**: `u64`. - **Description**: TTL for stale bind allowance when stale mode is `ttl`. - **Example**: @@ -1444,8 +1320,7 @@ This document lists all configuration keys accepted by `config.toml`. me_bind_stale_mode = "ttl" me_bind_stale_ttl_secs = 90 ``` -## "cfg-general-me_pool_min_fresh_ratio" -- `me_pool_min_fresh_ratio` +## me_pool_min_fresh_ratio - **Constraints / validation**: Must be within `[0.0, 1.0]`. - **Description**: Minimum fresh desired-DC coverage ratio before stale writers are drained. - **Example**: @@ -1455,8 +1330,7 @@ This document lists all configuration keys accepted by `config.toml`. # require >=90% desired-DC coverage before draining stale writers me_pool_min_fresh_ratio = 0.9 ``` -## "cfg-general-me_reinit_drain_timeout_secs" -- `me_reinit_drain_timeout_secs` +## me_reinit_drain_timeout_secs - **Constraints / validation**: `u64`. `0` uses the runtime safety fallback force-close timeout. If `> 0` and `< me_pool_drain_ttl_secs`, runtime bumps it to TTL. - **Description**: Force-close timeout for draining stale writers. When set to `0`, the effective timeout is the runtime safety fallback (300 seconds). - **Example**: @@ -1466,8 +1340,7 @@ This document lists all configuration keys accepted by `config.toml`. # use runtime safety fallback force-close timeout (300s) me_reinit_drain_timeout_secs = 0 ``` -## "cfg-general-proxy_secret_auto_reload_secs" -- `proxy_secret_auto_reload_secs` +## proxy_secret_auto_reload_secs - **Constraints / validation**: Deprecated. Use `general.update_every`. When `general.update_every` is not explicitly set, the effective legacy refresh interval is `min(proxy_secret_auto_reload_secs, proxy_config_auto_reload_secs)` and must be `> 0`. - **Description**: Deprecated legacy proxy-secret refresh interval. Used only when `general.update_every` is not set. - **Example**: @@ -1479,8 +1352,7 @@ This document lists all configuration keys accepted by `config.toml`. proxy_config_auto_reload_secs = 120 # effective updater interval = min(600, 120) = 120 seconds ``` -## "cfg-general-proxy_config_auto_reload_secs" -- `proxy_config_auto_reload_secs` +## proxy_config_auto_reload_secs - **Constraints / validation**: Deprecated. Use `general.update_every`. When `general.update_every` is not explicitly set, the effective legacy refresh interval is `min(proxy_secret_auto_reload_secs, proxy_config_auto_reload_secs)` and must be `> 0`. - **Description**: Deprecated legacy ME config refresh interval. Used only when `general.update_every` is not set. - **Example**: @@ -1492,8 +1364,7 @@ This document lists all configuration keys accepted by `config.toml`. proxy_config_auto_reload_secs = 120 # effective updater interval = min(600, 120) = 120 seconds ``` -## "cfg-general-me_reinit_singleflight" -- `me_reinit_singleflight` +## me_reinit_singleflight - **Constraints / validation**: `bool`. - **Description**: Serializes ME reinit cycles across trigger sources. - **Example**: @@ -1502,8 +1373,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_reinit_singleflight = true ``` -## "cfg-general-me_reinit_trigger_channel" -- `me_reinit_trigger_channel` +## me_reinit_trigger_channel - **Constraints / validation**: Must be `> 0`. - **Description**: Trigger queue capacity for reinit scheduler. - **Example**: @@ -1512,8 +1382,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_reinit_trigger_channel = 64 ``` -## "cfg-general-me_reinit_coalesce_window_ms" -- `me_reinit_coalesce_window_ms` +## me_reinit_coalesce_window_ms - **Constraints / validation**: `u64`. - **Description**: Trigger coalescing window before starting reinit (ms). - **Example**: @@ -1522,8 +1391,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_reinit_coalesce_window_ms = 200 ``` -## "cfg-general-me_deterministic_writer_sort" -- `me_deterministic_writer_sort` +## me_deterministic_writer_sort - **Constraints / validation**: `bool`. - **Description**: Enables deterministic candidate sort for writer binding path. - **Example**: @@ -1532,8 +1400,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_deterministic_writer_sort = true ``` -## "cfg-general-me_writer_pick_mode" -- `me_writer_pick_mode` +## me_writer_pick_mode - **Constraints / validation**: `"sorted_rr"` or `"p2c"`. - **Description**: Writer selection mode for route bind path. - **Example**: @@ -1542,8 +1409,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] me_writer_pick_mode = "p2c" ``` -## "cfg-general-me_writer_pick_sample_size" -- `me_writer_pick_sample_size` +## me_writer_pick_sample_size - **Constraints / validation**: `2..=4`. - **Description**: Number of candidates sampled by picker in `p2c` mode. - **Example**: @@ -1553,8 +1419,7 @@ This document lists all configuration keys accepted by `config.toml`. me_writer_pick_mode = "p2c" me_writer_pick_sample_size = 3 ``` -## "cfg-general-ntp_check" -- `ntp_check` +## ntp_check - **Constraints / validation**: `bool`. - **Description**: Reserved for future use. Currently this key is parsed but not used by the runtime. - **Example**: @@ -1563,8 +1428,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] ntp_check = true ``` -## "cfg-general-ntp_servers" -- `ntp_servers` +## ntp_servers - **Constraints / validation**: `String[]`. - **Description**: Reserved for future use. Currently this key is parsed but not used by the runtime. - **Example**: @@ -1573,8 +1437,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] ntp_servers = ["pool.ntp.org"] ``` -## "cfg-general-auto_degradation_enabled" -- `auto_degradation_enabled` +## auto_degradation_enabled - **Constraints / validation**: `bool`. - **Description**: Reserved for future use. Currently this key is parsed but not used by the runtime. - **Example**: @@ -1583,8 +1446,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] auto_degradation_enabled = true ``` -## "cfg-general-degradation_min_unavailable_dc_groups" -- `degradation_min_unavailable_dc_groups` +## degradation_min_unavailable_dc_groups - **Constraints / validation**: `u8`. - **Description**: Reserved for future use. Currently this key is parsed but not used by the runtime. - **Example**: @@ -1593,8 +1455,7 @@ This document lists all configuration keys accepted by `config.toml`. [general] degradation_min_unavailable_dc_groups = 2 ``` -## "cfg-general-rst_on_close" -- `rst_on_close` +## rst_on_close - **Constraints / validation**: one of `"off"`, `"errors"`, `"always"`. - **Description**: Controls `SO_LINGER(0)` behaviour on accepted client TCP sockets. High-traffic proxy servers accumulate `FIN-WAIT-1` and orphaned sockets from connections that never complete the Telegram handshake (scanners, DPI probes, bots). @@ -1614,12 +1475,11 @@ This document lists all configuration keys accepted by `config.toml`. | Key | Type | Default | | --- | ---- | ------- | -| [`classic`](#cfg-general-modes-classic) | `bool` | `false` | -| [`secure`](#cfg-general-modes-secure) | `bool` | `false` | -| [`tls`](#cfg-general-modes-tls) | `bool` | `true` | +| [`classic`](#classic) | `bool` | `false` | +| [`secure`](#secure) | `bool` | `false` | +| [`tls`](#tls) | `bool` | `true` | -## "cfg-general-modes-classic" -- `classic` +## classic - **Constraints / validation**: `bool`. - **Description**: Enables classic MTProxy mode. - **Example**: @@ -1628,8 +1488,7 @@ This document lists all configuration keys accepted by `config.toml`. [general.modes] classic = true ``` -## "cfg-general-modes-secure" -- `secure` +## secure - **Constraints / validation**: `bool`. - **Description**: Enables secure mode. - **Example**: @@ -1638,8 +1497,7 @@ This document lists all configuration keys accepted by `config.toml`. [general.modes] secure = true ``` -## "cfg-general-modes-tls" -- `tls` +## tls - **Constraints / validation**: `bool`. - **Description**: Enables TLS mode. - **Example**: @@ -1655,12 +1513,11 @@ This document lists all configuration keys accepted by `config.toml`. | Key | Type | Default | | --- | ---- | ------- | -| [`show`](#cfg-general-links-show) | `"*"` or `String[]` | `"*"` | -| [`public_host`](#cfg-general-links-public_host) | `String` | — | -| [`public_port`](#cfg-general-links-public_port) | `u16` | — | +| [`show`](#show) | `"*"` or `String[]` | `"*"` | +| [`public_host`](#public_host) | `String` | — | +| [`public_port`](#public_port) | `u16` | — | -## "cfg-general-links-show" -- `show` +## show - **Constraints / validation**: `"*"` or `String[]`. An empty array means "show none". - **Description**: Selects users whose `tg://` proxy links are shown at startup. - **Example**: @@ -1671,8 +1528,7 @@ This document lists all configuration keys accepted by `config.toml`. # or: # show = ["alice", "bob"] ``` -## "cfg-general-links-public_host" -- `public_host` +## public_host - **Constraints / validation**: `String` (optional). - **Description**: Public hostname/IP override used for generated `tg://` links (overrides detected IP). - **Example**: @@ -1681,8 +1537,7 @@ This document lists all configuration keys accepted by `config.toml`. [general.links] public_host = "proxy.example.com" ``` -## "cfg-general-links-public_port" -- `public_port` +## public_port - **Constraints / validation**: `u16` (optional). - **Description**: Public port override used for generated `tg://` links (overrides `server.port`). - **Example**: @@ -1698,12 +1553,11 @@ This document lists all configuration keys accepted by `config.toml`. | Key | Type | Default | | --- | ---- | ------- | -| [`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`](#core_enabled) | `bool` | `true` | +| [`user_enabled`](#user_enabled) | `bool` | `true` | +| [`me_level`](#me_level) | `"silent"`, `"normal"`, or `"debug"` | `"normal"` | -## "cfg-general-telemetry-core_enabled" -- `core_enabled` +## core_enabled - **Constraints / validation**: `bool`. - **Description**: Enables core hot-path telemetry counters. - **Example**: @@ -1712,8 +1566,7 @@ This document lists all configuration keys accepted by `config.toml`. [general.telemetry] core_enabled = true ``` -## "cfg-general-telemetry-user_enabled" -- `user_enabled` +## user_enabled - **Constraints / validation**: `bool`. - **Description**: Enables per-user telemetry counters. - **Example**: @@ -1722,8 +1575,7 @@ This document lists all configuration keys accepted by `config.toml`. [general.telemetry] user_enabled = true ``` -## "cfg-general-telemetry-me_level" -- `me_level` +## me_level - **Constraints / validation**: `"silent"`, `"normal"`, or `"debug"`. - **Description**: Middle-End telemetry verbosity level. - **Example**: @@ -1739,19 +1591,18 @@ This document lists all configuration keys accepted by `config.toml`. | Key | Type | Default | | --- | ---- | ------- | -| [`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) | `bool` | `true` | +| [`ipv6`](#ipv6) | `bool` | `false` | +| [`prefer`](#prefer) | `u8` | `4` | +| [`multipath`](#multipath) | `bool` | `false` | +| [`stun_use`](#stun_use) | `bool` | `true` | +| [`stun_servers`](#stun_servers) | `String[]` | Built-in STUN list (13 hosts) | +| [`stun_tcp_fallback`](#stun_tcp_fallback) | `bool` | `true` | +| [`http_ip_detect_urls`](#http_ip_detect_urls) | `String[]` | `["https://ifconfig.me/ip", "https://api.ipify.org"]` | +| [`cache_public_ip_path`](#cache_public_ip_path) | `String` | `"cache/public_ip.txt"` | +| [`dns_overrides`](#dns_overrides) | `String[]` | `[]` | -## "cfg-network-ipv4" -- `ipv4` +## ipv4 - **Constraints / validation**: `bool`. - **Description**: Enables IPv4 networking. - **Example**: @@ -1760,8 +1611,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] ipv4 = true ``` -## "cfg-network-ipv6" -- `ipv6` +## ipv6 - **Constraints / validation**: `bool`. - **Description**: Enables/disables IPv6 networking. When omitted, defaults to `false`. - **Example**: @@ -1774,8 +1624,7 @@ This document lists all configuration keys accepted by `config.toml`. # or: disable IPv6 explicitly # ipv6 = false ``` -## "cfg-network-prefer" -- `prefer` +## prefer - **Constraints / validation**: Must be `4` or `6`. If `prefer = 4` while `ipv4 = false`, Telemt forces `prefer = 6`. If `prefer = 6` while `ipv6 = false`, Telemt forces `prefer = 4`. - **Description**: Preferred IP family for selection when both families are available. - **Example**: @@ -1784,8 +1633,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] prefer = 6 ``` -## "cfg-network-multipath" -- `multipath` +## multipath - **Constraints / validation**: `bool`. - **Description**: Enables multipath behavior where supported by the platform and runtime. - **Example**: @@ -1794,8 +1642,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] multipath = true ``` -## "cfg-network-stun_use" -- `stun_use` +## stun_use - **Constraints / validation**: `bool`. - **Description**: Global STUN switch; when `false`, STUN probing is disabled and only non-STUN detection remains. - **Example**: @@ -1804,8 +1651,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] stun_use = false ``` -## "cfg-network-stun_servers" -- `stun_servers` +## stun_servers - **Constraints / validation**: `String[]`. Values are trimmed; empty values are removed; list is deduplicated. If this key is **not** explicitly set, Telemt keeps the built-in default STUN list. - **Description**: STUN servers list for public IP discovery. - **Example**: @@ -1817,8 +1663,7 @@ This document lists all configuration keys accepted by `config.toml`. "stun.stunprotocol.org:3478", ] ``` -## "cfg-network-stun_tcp_fallback" -- `stun_tcp_fallback` +## stun_tcp_fallback - **Constraints / validation**: `bool`. - **Description**: Enables TCP fallback for STUN when the UDP path is blocked/unavailable. - **Example**: @@ -1827,8 +1672,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] stun_tcp_fallback = true ``` -## "cfg-network-http_ip_detect_urls" -- `http_ip_detect_urls` +## http_ip_detect_urls - **Constraints / validation**: `String[]`. - **Description**: HTTP endpoints used for public IP detection (fallback after STUN). - **Example**: @@ -1837,8 +1681,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] http_ip_detect_urls = ["https://ifconfig.me/ip", "https://api.ipify.org"] ``` -## "cfg-network-cache_public_ip_path" -- `cache_public_ip_path` +## cache_public_ip_path - **Constraints / validation**: `String`. - **Description**: File path used to cache the detected public IP. - **Example**: @@ -1847,8 +1690,7 @@ This document lists all configuration keys accepted by `config.toml`. [network] cache_public_ip_path = "cache/public_ip.txt" ``` -## "cfg-network-dns_overrides" -- `dns_overrides` +## dns_overrides - **Constraints / validation**: `String[]`. Each entry must use `host:port:ip` format. - `host`: domain name (must be non-empty and must not contain `:`) - `port`: `u16` @@ -1870,23 +1712,22 @@ This document lists all configuration keys accepted by `config.toml`. | Key | Type | Default | | --- | ---- | ------- | -| [`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`](#port) | `u16` | `443` | +| [`listen_addr_ipv4`](#listen_addr_ipv4) | `String` | `"0.0.0.0"` | +| [`listen_addr_ipv6`](#listen_addr_ipv6) | `String` | `"::"` | +| [`listen_unix_sock`](#listen_unix_sock) | `String` | — | +| [`listen_unix_sock_perm`](#listen_unix_sock_perm) | `String` | — | +| [`listen_tcp`](#listen_tcp) | `bool` | — (auto) | +| [`proxy_protocol`](#proxy_protocol) | `bool` | `false` | +| [`proxy_protocol_header_timeout_ms`](#proxy_protocol_header_timeout_ms) | `u64` | `500` | +| [`proxy_protocol_trusted_cidrs`](#proxy_protocol_trusted_cidrs) | `IpNetwork[]` | `[]` | +| [`metrics_port`](#metrics_port) | `u16` | — | +| [`metrics_listen`](#metrics_listen) | `String` | — | +| [`metrics_whitelist`](#metrics_whitelist) | `IpNetwork[]` | `["127.0.0.1/32", "::1/128"]` | +| [`max_connections`](#max_connections) | `u32` | `10000` | +| [`accept_permit_timeout_ms`](#accept_permit_timeout_ms) | `u64` | `250` | -## "cfg-server-port" -- `port` +## port - **Constraints / validation**: `u16`. - **Description**: Main proxy listen port (TCP). - **Example**: @@ -1895,8 +1736,7 @@ This document lists all configuration keys accepted by `config.toml`. [server] port = 443 ``` -## "cfg-server-listen_addr_ipv4" -- `listen_addr_ipv4` +## listen_addr_ipv4 - **Constraints / validation**: `String` (optional). When set, must be a valid IPv4 address string. - **Description**: IPv4 bind address for TCP listener (omit this key to disable IPv4 bind). - **Example**: @@ -1905,8 +1745,7 @@ This document lists all configuration keys accepted by `config.toml`. [server] listen_addr_ipv4 = "0.0.0.0" ``` -## "cfg-server-listen_addr_ipv6" -- `listen_addr_ipv6` +## listen_addr_ipv6 - **Constraints / validation**: `String` (optional). When set, must be a valid IPv6 address string. - **Description**: IPv6 bind address for TCP listener (omit this key to disable IPv6 bind). - **Example**: @@ -1915,8 +1754,7 @@ This document lists all configuration keys accepted by `config.toml`. [server] listen_addr_ipv6 = "::" ``` -## "cfg-server-listen_unix_sock" -- `listen_unix_sock` +## listen_unix_sock - **Constraints / validation**: `String` (optional). Must not be empty when set. Unix only. - **Description**: Unix socket path for listener. When set, `server.listen_tcp` defaults to `false` (unless explicitly overridden). - **Example**: @@ -1925,8 +1763,7 @@ This document lists all configuration keys accepted by `config.toml`. [server] listen_unix_sock = "/run/telemt.sock" ``` -## "cfg-server-listen_unix_sock_perm" -- `listen_unix_sock_perm` +## listen_unix_sock_perm - **Constraints / validation**: `String` (optional). When set, should be an octal permission string like `"0666"` or `"0777"`. - **Description**: Optional Unix socket file permissions applied after bind (chmod). When omitted, permissions are not changed (inherits umask). - **Example**: @@ -1936,8 +1773,7 @@ This document lists all configuration keys accepted by `config.toml`. listen_unix_sock = "/run/telemt.sock" listen_unix_sock_perm = "0666" ``` -## "cfg-server-listen_tcp" -- `listen_tcp` +## listen_tcp - **Constraints / validation**: `bool` (optional). When omitted, Telemt auto-detects: - `true` when `listen_unix_sock` is not set - `false` when `listen_unix_sock` is set @@ -1950,8 +1786,7 @@ This document lists all configuration keys accepted by `config.toml`. listen_unix_sock = "/run/telemt.sock" listen_tcp = true ``` -## "cfg-server-proxy_protocol" -- `proxy_protocol` +## proxy_protocol - **Constraints / validation**: `bool`. - **Description**: Enables HAProxy PROXY protocol parsing on incoming connections (PROXY v1/v2). When enabled, client source address is taken from the PROXY header. - **Example**: @@ -1960,8 +1795,7 @@ This document lists all configuration keys accepted by `config.toml`. [server] proxy_protocol = true ``` -## "cfg-server-proxy_protocol_header_timeout_ms" -- `proxy_protocol_header_timeout_ms` +## proxy_protocol_header_timeout_ms - **Constraints / validation**: Must be `> 0` (milliseconds). - **Description**: Timeout for reading and parsing PROXY protocol headers (ms). - **Example**: @@ -1971,8 +1805,7 @@ This document lists all configuration keys accepted by `config.toml`. proxy_protocol = true proxy_protocol_header_timeout_ms = 500 ``` -## "cfg-server-proxy_protocol_trusted_cidrs" -- `proxy_protocol_trusted_cidrs` +## proxy_protocol_trusted_cidrs - **Constraints / validation**: `IpNetwork[]`. - If omitted, defaults to trust-all CIDRs (`0.0.0.0/0` and `::/0`). - If explicitly set to an empty array, all PROXY headers are rejected. @@ -1984,8 +1817,7 @@ This document lists all configuration keys accepted by `config.toml`. proxy_protocol = true proxy_protocol_trusted_cidrs = ["127.0.0.1/32", "10.0.0.0/8"] ``` -## "cfg-server-metrics_port" -- `metrics_port` +## metrics_port - **Constraints / validation**: `u16` (optional). - **Description**: Prometheus-compatible metrics endpoint port. When set, enables the metrics listener (bind behavior can be overridden by `metrics_listen`). - **Example**: @@ -1994,8 +1826,7 @@ This document lists all configuration keys accepted by `config.toml`. [server] metrics_port = 9090 ``` -## "cfg-server-metrics_listen" -- `metrics_listen` +## metrics_listen - **Constraints / validation**: `String` (optional). When set, must be in `IP:PORT` format. - **Description**: Full metrics bind address (`IP:PORT`), overrides `metrics_port` and binds on the specified address only. - **Example**: @@ -2004,8 +1835,7 @@ This document lists all configuration keys accepted by `config.toml`. [server] metrics_listen = "127.0.0.1:9090" ``` -## "cfg-server-metrics_whitelist" -- `metrics_whitelist` +## metrics_whitelist - **Constraints / validation**: `IpNetwork[]`. - **Description**: CIDR whitelist for metrics endpoint access. - **Example**: @@ -2015,8 +1845,7 @@ This document lists all configuration keys accepted by `config.toml`. metrics_port = 9090 metrics_whitelist = ["127.0.0.1/32", "::1/128"] ``` -## "cfg-server-max_connections" -- `max_connections` +## max_connections - **Constraints / validation**: `u32`. `0` means unlimited. - **Description**: Maximum number of concurrent client connections. - **Example**: @@ -2025,8 +1854,7 @@ This document lists all configuration keys accepted by `config.toml`. [server] max_connections = 10000 ``` -## "cfg-server-accept_permit_timeout_ms" -- `accept_permit_timeout_ms` +## accept_permit_timeout_ms - **Constraints / validation**: `0..=60000` (milliseconds). `0` keeps legacy unbounded wait behavior. - **Description**: Maximum wait for acquiring a connection-slot permit before the accepted connection is dropped. - **Example**: @@ -2046,17 +1874,16 @@ Note: The conntrack-control worker runs **only on Linux**. On other operating sy | Key | Type | Default | | --- | ---- | ------- | -| [`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`](#inline_conntrack_control) | `bool` | `true` | +| [`mode`](#mode) | `String` | `"tracked"` | +| [`backend`](#backend) | `String` | `"auto"` | +| [`profile`](#profile) | `String` | `"balanced"` | +| [`hybrid_listener_ips`](#hybrid_listener_ips) | `IpAddr[]` | `[]` | +| [`pressure_high_watermark_pct`](#pressure_high_watermark_pct) | `u8` | `85` | +| [`pressure_low_watermark_pct`](#pressure_low_watermark_pct) | `u8` | `70` | +| [`delete_budget_per_sec`](#delete_budget_per_sec) | `u64` | `4096` | -## "cfg-server-conntrack_control-inline_conntrack_control" -- `inline_conntrack_control` +## inline_conntrack_control - **Constraints / validation**: `bool`. - **Description**: Master switch for the runtime conntrack-control task: reconciles **raw/notrack** netfilter rules for listener ingress (see `mode`), samples load every second, and may run **`conntrack -D`** deletes for qualifying close events while **pressure mode** is active (see `delete_budget_per_sec`). When `false`, notrack rules are cleared and pressure-driven deletes are disabled. - **Example**: @@ -2065,8 +1892,7 @@ Note: The conntrack-control worker runs **only on Linux**. On other operating sy [server.conntrack_control] inline_conntrack_control = true ``` -## "cfg-server-conntrack_control-mode" -- `mode` +## mode - **Constraints / validation**: One of `tracked`, `notrack`, `hybrid` (case-insensitive; serialized lowercase). - **Description**: **`tracked`**: do not install telemt notrack rules (connections stay in conntrack). **`notrack`**: mark matching ingress TCP to `server.port` as notrack — targets are derived from `[[server.listeners]]` if any, otherwise from `server.listen_addr_ipv4` / `server.listen_addr_ipv6` (unspecified addresses mean “any” for that family). **`hybrid`**: notrack only for addresses listed in `hybrid_listener_ips` (must be non-empty; validated at load). - **Example**: @@ -2075,8 +1901,7 @@ Note: The conntrack-control worker runs **only on Linux**. On other operating sy [server.conntrack_control] mode = "notrack" ``` -## "cfg-server-conntrack_control-backend" -- `backend` +## backend - **Constraints / validation**: One of `auto`, `nftables`, `iptables` (case-insensitive; serialized lowercase). - **Description**: Which command set applies notrack rules. **`auto`**: use `nft` if present on `PATH`, else `iptables`/`ip6tables` if present. **`nftables`** / **`iptables`**: force that backend; missing binary means rules cannot be applied. The nft path uses table `inet telemt_conntrack` and a prerouting raw hook; iptables uses chain `TELEMT_NOTRACK` in the `raw` table. - **Example**: @@ -2085,8 +1910,7 @@ Note: The conntrack-control worker runs **only on Linux**. On other operating sy [server.conntrack_control] backend = "auto" ``` -## "cfg-server-conntrack_control-profile" -- `profile` +## profile - **Constraints / validation**: One of `conservative`, `balanced`, `aggressive` (case-insensitive; serialized lowercase). - **Description**: When **conntrack pressure mode** is active (`pressure_*` watermarks), caps idle and activity timeouts to reduce conntrack churn: e.g. **client first-byte idle** (`client.rs`), **direct relay activity timeout** (`direct_relay.rs`), and **middle-relay idle policy** caps (`middle_relay.rs` via `ConntrackPressureProfile::*_cap_secs` / `direct_activity_timeout_secs`). More aggressive profiles use shorter caps. - **Example**: @@ -2095,8 +1919,7 @@ Note: The conntrack-control worker runs **only on Linux**. On other operating sy [server.conntrack_control] profile = "balanced" ``` -## "cfg-server-conntrack_control-hybrid_listener_ips" -- `hybrid_listener_ips` +## hybrid_listener_ips - **Constraints / validation**: `IpAddr[]`. Required to be **non-empty** when `mode = "hybrid"`. Ignored for `tracked` / `notrack`. - **Description**: Explicit listener addresses that receive notrack rules in hybrid mode (split into IPv4 vs IPv6 rules by the implementation). - **Example**: @@ -2106,8 +1929,7 @@ Note: The conntrack-control worker runs **only on Linux**. On other operating sy mode = "hybrid" hybrid_listener_ips = ["203.0.113.10", "2001:db8::1"] ``` -## "cfg-server-conntrack_control-pressure_high_watermark_pct" -- `pressure_high_watermark_pct` +## pressure_high_watermark_pct - **Constraints / validation**: Must be within `[1, 100]`. - **Description**: Pressure mode **enters** when any of: connection fill vs `server.max_connections` (percentage, if `max_connections > 0`), **file-descriptor** usage vs process soft `RLIMIT_NOFILE`, **non-zero** `accept_permit_timeout` events in the last sample window, or **ME c2me send-full** counter delta. Entry compares relevant percentages against this high watermark (see `update_pressure_state` in `conntrack_control.rs`). - **Example**: @@ -2116,8 +1938,7 @@ Note: The conntrack-control worker runs **only on Linux**. On other operating sy [server.conntrack_control] pressure_high_watermark_pct = 85 ``` -## "cfg-server-conntrack_control-pressure_low_watermark_pct" -- `pressure_low_watermark_pct` +## pressure_low_watermark_pct - **Constraints / validation**: Must be **strictly less than** `pressure_high_watermark_pct`. - **Description**: Pressure mode **clears** only after **three** consecutive one-second samples where all signals are at or below this low watermark and the accept-timeout / ME-queue deltas are zero (hysteresis). - **Example**: @@ -2126,8 +1947,7 @@ Note: The conntrack-control worker runs **only on Linux**. On other operating sy [server.conntrack_control] pressure_low_watermark_pct = 70 ``` -## "cfg-server-conntrack_control-delete_budget_per_sec" -- `delete_budget_per_sec` +## delete_budget_per_sec - **Constraints / validation**: Must be `> 0`. - **Description**: Maximum number of **`conntrack -D`** attempts **per second** while pressure mode is active (token bucket refilled each second). Deletes run only for close events with reasons **timeout**, **pressure**, or **reset**; each attempt consumes a token regardless of outcome. - **Example**: @@ -2145,21 +1965,20 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche | Key | Type | Default | | --- | ---- | ------- | -| [`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`](#enabled) | `bool` | `true` | +| [`listen`](#listen) | `String` | `"0.0.0.0:9091"` | +| [`whitelist`](#whitelist) | `IpNetwork[]` | `["127.0.0.0/8"]` | +| [`auth_header`](#auth_header) | `String` | `""` | +| [`request_body_limit_bytes`](#request_body_limit_bytes) | `usize` | `65536` | +| [`minimal_runtime_enabled`](#minimal_runtime_enabled) | `bool` | `true` | +| [`minimal_runtime_cache_ttl_ms`](#minimal_runtime_cache_ttl_ms) | `u64` | `1000` | +| [`runtime_edge_enabled`](#runtime_edge_enabled) | `bool` | `false` | +| [`runtime_edge_cache_ttl_ms`](#runtime_edge_cache_ttl_ms) | `u64` | `1000` | +| [`runtime_edge_top_n`](#runtime_edge_top_n) | `usize` | `10` | +| [`runtime_edge_events_capacity`](#runtime_edge_events_capacity) | `usize` | `256` | +| [`read_only`](#read_only) | `bool` | `false` | -## "cfg-server-api-enabled" -- `enabled` +## enabled - **Constraints / validation**: `bool`. - **Description**: Enables control-plane REST API. - **Example**: @@ -2168,8 +1987,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] enabled = true ``` -## "cfg-server-api-listen" -- `listen` +## listen - **Constraints / validation**: `String`. Must be in `IP:PORT` format. - **Description**: API bind address in `IP:PORT` format. - **Example**: @@ -2178,8 +1996,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] listen = "0.0.0.0:9091" ``` -## "cfg-server-api-whitelist" -- `whitelist` +## whitelist - **Constraints / validation**: `IpNetwork[]`. - **Description**: CIDR whitelist allowed to access API. - **Example**: @@ -2188,8 +2005,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] whitelist = ["127.0.0.0/8"] ``` -## "cfg-server-api-auth_header" -- `auth_header` +## auth_header - **Constraints / validation**: `String`. Empty string disables auth-header validation. - **Description**: Exact expected `Authorization` header value (static shared secret). - **Example**: @@ -2198,8 +2014,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] auth_header = "Bearer MY_TOKEN" ``` -## "cfg-server-api-request_body_limit_bytes" -- `request_body_limit_bytes` +## request_body_limit_bytes - **Constraints / validation**: Must be `> 0` (bytes). - **Description**: Maximum accepted HTTP request body size (bytes). - **Example**: @@ -2208,8 +2023,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] request_body_limit_bytes = 65536 ``` -## "cfg-server-api-minimal_runtime_enabled" -- `minimal_runtime_enabled` +## minimal_runtime_enabled - **Constraints / validation**: `bool`. - **Description**: Enables minimal runtime snapshots endpoint logic. - **Example**: @@ -2218,8 +2032,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] minimal_runtime_enabled = true ``` -## "cfg-server-api-minimal_runtime_cache_ttl_ms" -- `minimal_runtime_cache_ttl_ms` +## minimal_runtime_cache_ttl_ms - **Constraints / validation**: `0..=60000` (milliseconds). `0` disables cache. - **Description**: Cache TTL for minimal runtime snapshots (ms). - **Example**: @@ -2228,8 +2041,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] minimal_runtime_cache_ttl_ms = 1000 ``` -## "cfg-server-api-runtime_edge_enabled" -- `runtime_edge_enabled` +## runtime_edge_enabled - **Constraints / validation**: `bool`. - **Description**: Enables runtime edge endpoints. - **Example**: @@ -2238,8 +2050,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] runtime_edge_enabled = false ``` -## "cfg-server-api-runtime_edge_cache_ttl_ms" -- `runtime_edge_cache_ttl_ms` +## runtime_edge_cache_ttl_ms - **Constraints / validation**: `0..=60000` (milliseconds). - **Description**: Cache TTL for runtime edge aggregation payloads (ms). - **Example**: @@ -2248,8 +2059,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] runtime_edge_cache_ttl_ms = 1000 ``` -## "cfg-server-api-runtime_edge_top_n" -- `runtime_edge_top_n` +## runtime_edge_top_n - **Constraints / validation**: `1..=1000`. - **Description**: Top-N size for edge connection leaderboard. - **Example**: @@ -2258,8 +2068,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] runtime_edge_top_n = 10 ``` -## "cfg-server-api-runtime_edge_events_capacity" -- `runtime_edge_events_capacity` +## runtime_edge_events_capacity - **Constraints / validation**: `16..=4096`. - **Description**: Ring-buffer capacity for runtime edge events. - **Example**: @@ -2268,8 +2077,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server.api] runtime_edge_events_capacity = 256 ``` -## "cfg-server-api-read_only" -- `read_only` +## read_only - **Constraints / validation**: `bool`. - **Description**: Rejects mutating API endpoints when enabled. - **Example**: @@ -2285,46 +2093,42 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche | Key | Type | Default | | --- | ---- | ------- | -| [`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`](#ip) | `IpAddr` | — | +| [`announce`](#announce) | `String` | — | +| [`announce_ip`](#announce_ip) | `IpAddr` | — | +| [`proxy_protocol`](#proxy_protocol) | `bool` | — | +| [`reuse_allow`](#reuse_allow) | `bool` | `false` | -## "cfg-server-listeners-ip" -- `ip` +## ip - **Constraints / validation**: Required field. Must be an `IpAddr`. - **Description**: Listener bind IP. - **Example**: ```toml - [[server.listeners]] + [server.listeners] ip = "0.0.0.0" ``` -## "cfg-server-listeners-announce" -- `announce` +## announce - **Constraints / validation**: `String` (optional). Must not be empty when set. - **Description**: Public IP/domain announced in proxy links for this listener. Takes precedence over `announce_ip`. - **Example**: ```toml - [[server.listeners]] + [server.listeners] ip = "0.0.0.0" announce = "proxy.example.com" ``` -## "cfg-server-listeners-announce_ip" -- `announce_ip` +## announce_ip - **Constraints / validation**: `IpAddr` (optional). Deprecated. Use `announce`. - **Description**: Deprecated legacy announce IP. During config load it is migrated to `announce` when `announce` is not set. - **Example**: ```toml - [[server.listeners]] + [server.listeners] ip = "0.0.0.0" announce_ip = "203.0.113.10" ``` -## "cfg-server-listeners-proxy_protocol" -- `proxy_protocol` +## proxy_protocol - **Constraints / validation**: `bool` (optional). When set, overrides `server.proxy_protocol` for this listener. - **Description**: Per-listener PROXY protocol override. - **Example**: @@ -2333,18 +2137,18 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [server] proxy_protocol = false - [[server.listeners]] + [server.listeners] ip = "0.0.0.0" proxy_protocol = true ``` -## "cfg-server-listeners-reuse_allow" +## reuse_allow" - `reuse_allow` - **Constraints / validation**: `bool`. - **Description**: Enables `SO_REUSEPORT` for multi-instance bind sharing (allows multiple telemt instances to listen on the same `ip:port`). - **Example**: ```toml - [[server.listeners]] + [server.listeners] ip = "0.0.0.0" reuse_allow = false ``` @@ -2355,19 +2159,18 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche | Key | Type | Default | | --- | ---- | ------- | -| [`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`](#client_handshake) | `u64` | `30` | +| [`relay_idle_policy_v2_enabled`](#relay_idle_policy_v2_enabled) | `bool` | `true` | +| [`relay_client_idle_soft_secs`](#relay_client_idle_soft_secs) | `u64` | `120` | +| [`relay_client_idle_hard_secs`](#relay_client_idle_hard_secs) | `u64` | `360` | +| [`relay_idle_grace_after_downstream_activity_secs`](#relay_idle_grace_after_downstream_activity_secs) | `u64` | `30` | +| [`tg_connect`](#tg_connect) | `u64` | `10` | +| [`client_keepalive`](#client_keepalive) | `u64` | `15` | +| [`client_ack`](#client_ack) | `u64` | `90` | +| [`me_one_retry`](#me_one_retry) | `u8` | `12` | +| [`me_one_timeout_ms`](#me_one_timeout_ms) | `u64` | `1200` | -## "cfg-timeouts-client_handshake" -- `client_handshake` +## client_handshake - **Constraints / validation**: Must be `> 0`. Value is in seconds. Also used as an upper bound for some TLS emulation delays (see `censorship.server_hello_delay_max_ms`). - **Description**: Client handshake timeout (seconds). - **Example**: @@ -2376,8 +2179,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [timeouts] client_handshake = 30 ``` -## "cfg-timeouts-relay_idle_policy_v2_enabled" -- `relay_idle_policy_v2_enabled` +## relay_idle_policy_v2_enabled - **Constraints / validation**: `bool`. - **Description**: Enables soft/hard middle-relay client idle policy. - **Example**: @@ -2386,8 +2188,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [timeouts] relay_idle_policy_v2_enabled = true ``` -## "cfg-timeouts-relay_client_idle_soft_secs" -- `relay_client_idle_soft_secs` +## relay_client_idle_soft_secs - **Constraints / validation**: Must be `> 0`; must be `<= relay_client_idle_hard_secs`. - **Description**: Soft idle threshold (seconds) for middle-relay client uplink inactivity. Hitting this threshold marks the session as an idle-candidate (it may be eligible for cleanup depending on policy). - **Example**: @@ -2396,8 +2197,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [timeouts] relay_client_idle_soft_secs = 120 ``` -## "cfg-timeouts-relay_client_idle_hard_secs" -- `relay_client_idle_hard_secs` +## relay_client_idle_hard_secs - **Constraints / validation**: Must be `> 0`; must be `>= relay_client_idle_soft_secs`. - **Description**: Hard idle threshold (seconds) for middle-relay client uplink inactivity. Hitting this threshold closes the session. - **Example**: @@ -2406,8 +2206,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [timeouts] relay_client_idle_hard_secs = 360 ``` -## "cfg-timeouts-relay_idle_grace_after_downstream_activity_secs" -- `relay_idle_grace_after_downstream_activity_secs` +## relay_idle_grace_after_downstream_activity_secs - **Constraints / validation**: Must be `<= relay_client_idle_hard_secs`. - **Description**: Extra hard-idle grace period (seconds) added after recent downstream activity. - **Example**: @@ -2416,8 +2215,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [timeouts] relay_idle_grace_after_downstream_activity_secs = 30 ``` -## "cfg-timeouts-tg_connect" -- `tg_connect` +## tg_connect - **Constraints / validation**: `u64`. Value is in seconds. - **Description**: Upstream Telegram connect timeout (seconds). - **Example**: @@ -2426,8 +2224,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [timeouts] tg_connect = 10 ``` -## "cfg-timeouts-client_keepalive" -- `client_keepalive` +## client_keepalive - **Constraints / validation**: `u64`. Value is in seconds. - **Description**: Client keepalive timeout (seconds). - **Example**: @@ -2436,8 +2233,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [timeouts] client_keepalive = 15 ``` -## "cfg-timeouts-client_ack" -- `client_ack` +## client_ack - **Constraints / validation**: `u64`. Value is in seconds. - **Description**: Client ACK timeout (seconds). - **Example**: @@ -2446,8 +2242,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [timeouts] client_ack = 90 ``` -## "cfg-timeouts-me_one_retry" -- `me_one_retry` +## me_one_retry - **Constraints / validation**: `u8`. - **Description**: Fast reconnect attempts budget for single-endpoint DC scenarios. - **Example**: @@ -2456,8 +2251,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [timeouts] me_one_retry = 12 ``` -## "cfg-timeouts-me_one_timeout_ms" -- `me_one_timeout_ms` +## me_one_timeout_ms - **Constraints / validation**: `u64`. Value is in milliseconds. - **Description**: Timeout per quick attempt (ms) for single-endpoint DC reconnect logic. - **Example**: @@ -2473,38 +2267,37 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche | Key | Type | Default | | --- | ---- | ------- | -| [`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"`, `"mask"`, `"accept"` | `"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_domain) | `String` | `"petrovich.ru"` | +| [`tls_domains`](#tls_domains) | `String[]` | `[]` | +| [`unknown_sni_action`](#unknown_sni_action) | `"drop"`, `"mask"`, `"accept"` | `"drop"` | +| [`tls_fetch_scope`](#tls_fetch_scope) | `String` | `""` | +| [`tls_fetch`](#tls_fetch) | `Table` | built-in defaults | +| [`mask`](#mask) | `bool` | `true` | +| [`mask_host`](#mask_host) | `String` | — | +| [`mask_port`](#mask_port) | `u16` | `443` | +| [`mask_unix_sock`](#mask_unix_sock) | `String` | — | +| [`fake_cert_len`](#fake_cert_len) | `usize` | `2048` | +| [`tls_emulation`](#tls_emulation) | `bool` | `true` | +| [`tls_front_dir`](#tls_front_dir) | `String` | `"tlsfront"` | +| [`server_hello_delay_min_ms`](#server_hello_delay_min_ms) | `u64` | `0` | +| [`server_hello_delay_max_ms`](#server_hello_delay_max_ms) | `u64` | `0` | +| [`tls_new_session_tickets`](#tls_new_session_tickets) | `u8` | `0` | +| [`tls_full_cert_ttl_secs`](#tls_full_cert_ttl_secs) | `u64` | `90` | +| [`alpn_enforce`](#alpn_enforce) | `bool` | `true` | +| [`mask_proxy_protocol`](#mask_proxy_protocol) | `u8` | `0` | +| [`mask_shape_hardening`](#mask_shape_hardening) | `bool` | `true` | +| [`mask_shape_hardening_aggressive_mode`](#mask_shape_hardening_aggressive_mode) | `bool` | `false` | +| [`mask_shape_bucket_floor_bytes`](#mask_shape_bucket_floor_bytes) | `usize` | `512` | +| [`mask_shape_bucket_cap_bytes`](#mask_shape_bucket_cap_bytes) | `usize` | `4096` | +| [`mask_shape_above_cap_blur`](#mask_shape_above_cap_blur) | `bool` | `false` | +| [`mask_shape_above_cap_blur_max_bytes`](#mask_shape_above_cap_blur_max_bytes) | `usize` | `512` | +| [`mask_relay_max_bytes`](#mask_relay_max_bytes) | `usize` | `5242880` | +| [`mask_classifier_prefetch_timeout_ms`](#mask_classifier_prefetch_timeout_ms) | `u64` | `5` | +| [`mask_timing_normalization_enabled`](#mask_timing_normalization_enabled) | `bool` | `false` | +| [`mask_timing_normalization_floor_ms`](#mask_timing_normalization_floor_ms) | `u64` | `0` | +| [`mask_timing_normalization_ceiling_ms`](#mask_timing_normalization_ceiling_ms) | `u64` | `0` | -## "cfg-censorship-tls_domain" -- `tls_domain` +## tls_domain - **Constraints / validation**: Must be a non-empty domain name. Must not contain spaces or `/`. - **Description**: Primary TLS domain used in FakeTLS handshake profile and as the default SNI domain. - **Example**: @@ -2513,8 +2306,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] tls_domain = "example.com" ``` -## "cfg-censorship-tls_domains" -- `tls_domains` +## tls_domains - **Constraints / validation**: `String[]`. When set, values are merged with `tls_domain` and deduplicated (primary `tls_domain` always stays first). - **Description**: Additional TLS domains for generating multiple proxy links. - **Example**: @@ -2524,8 +2316,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche tls_domain = "example.com" tls_domains = ["example.net", "example.org"] ``` -## "cfg-censorship-unknown_sni_action" -- `unknown_sni_action` +## unknown_sni_action - **Constraints / validation**: `"drop"`, `"mask"` or `"accept"`. - **Description**: Action for TLS ClientHello with unknown / non-configured SNI. - **Example**: @@ -2534,8 +2325,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] unknown_sni_action = "drop" ``` -## "cfg-censorship-tls_fetch_scope" -- `tls_fetch_scope` +## tls_fetch_scope - **Constraints / validation**: `String`. Value is trimmed during load; whitespace-only becomes empty. - **Description**: Upstream scope tag used for TLS-front metadata fetches. Empty value keeps default upstream routing behavior. - **Example**: @@ -2544,8 +2334,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] tls_fetch_scope = "fetch" ``` -## "cfg-censorship-tls_fetch" -- `tls_fetch` +## tls_fetch - **Constraints / validation**: Table. See `[censorship.tls_fetch]` section below. - **Description**: TLS-front metadata fetch strategy settings (bootstrap + refresh behavior for TLS emulation data). - **Example**: @@ -2556,8 +2345,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche attempt_timeout_ms = 5000 total_budget_ms = 15000 ``` -## "cfg-censorship-mask" -- `mask` +## mask - **Constraints / validation**: `bool`. - **Description**: Enables masking / fronting relay mode. - **Example**: @@ -2566,8 +2354,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask = true ``` -## "cfg-censorship-mask_host" -- `mask_host` +## mask_host - **Constraints / validation**: `String` (optional). - If `mask_unix_sock` is set, `mask_host` must be omitted (mutually exclusive). - If `mask_host` is not set and `mask_unix_sock` is not set, Telemt defaults `mask_host` to `tls_domain`. @@ -2578,8 +2365,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_host = "www.cloudflare.com" ``` -## "cfg-censorship-mask_port" -- `mask_port` +## mask_port - **Constraints / validation**: `u16`. - **Description**: Upstream mask port for TLS fronting relay. - **Example**: @@ -2588,8 +2374,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_port = 443 ``` -## "cfg-censorship-mask_unix_sock" -- `mask_unix_sock` +## mask_unix_sock - **Constraints / validation**: `String` (optional). - Must not be empty when set. - Unix only; rejected on non-Unix platforms. @@ -2602,8 +2387,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_unix_sock = "/run/telemt/mask.sock" ``` -## "cfg-censorship-fake_cert_len" -- `fake_cert_len` +## fake_cert_len - **Constraints / validation**: `usize`. When `tls_emulation = false` and the default value is in use, Telemt may randomize this at startup for variability. - **Description**: Length of synthetic certificate payload when emulation data is unavailable. - **Example**: @@ -2612,8 +2396,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] fake_cert_len = 2048 ``` -## "cfg-censorship-tls_emulation" -- `tls_emulation` +## tls_emulation - **Constraints / validation**: `bool`. - **Description**: Enables certificate/TLS behavior emulation from cached real fronts. - **Example**: @@ -2622,8 +2405,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] tls_emulation = true ``` -## "cfg-censorship-tls_front_dir" -- `tls_front_dir` +## tls_front_dir - **Constraints / validation**: `String`. - **Description**: Directory path for TLS front cache storage. - **Example**: @@ -2632,8 +2414,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] tls_front_dir = "tlsfront" ``` -## "cfg-censorship-server_hello_delay_min_ms" -- `server_hello_delay_min_ms` +## server_hello_delay_min_ms - **Constraints / validation**: `u64` (milliseconds). - **Description**: Minimum `server_hello` delay for anti-fingerprint behavior (ms). - **Example**: @@ -2642,8 +2423,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] server_hello_delay_min_ms = 0 ``` -## "cfg-censorship-server_hello_delay_max_ms" -- `server_hello_delay_max_ms` +## server_hello_delay_max_ms - **Constraints / validation**: `u64` (milliseconds). Must be \(<\) `timeouts.client_handshake * 1000`. - **Description**: Maximum `server_hello` delay for anti-fingerprint behavior (ms). - **Example**: @@ -2655,8 +2435,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] server_hello_delay_max_ms = 0 ``` -## "cfg-censorship-tls_new_session_tickets" -- `tls_new_session_tickets` +## tls_new_session_tickets - **Constraints / validation**: `u8`. - **Description**: Number of `NewSessionTicket` messages to emit after handshake. - **Example**: @@ -2665,8 +2444,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] tls_new_session_tickets = 0 ``` -## "cfg-censorship-tls_full_cert_ttl_secs" -- `tls_full_cert_ttl_secs` +## tls_full_cert_ttl_secs - **Constraints / validation**: `u64` (seconds). - **Description**: TTL for sending full cert payload per (domain, client IP) tuple. - **Example**: @@ -2675,8 +2453,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] tls_full_cert_ttl_secs = 90 ``` -## "cfg-censorship-alpn_enforce" -- `alpn_enforce` +## alpn_enforce - **Constraints / validation**: `bool`. - **Description**: Enforces ALPN echo behavior based on client preference. - **Example**: @@ -2685,8 +2462,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] alpn_enforce = true ``` -## "cfg-censorship-mask_proxy_protocol" -- `mask_proxy_protocol` +## mask_proxy_protocol - **Constraints / validation**: `u8`. `0` = disabled, `1` = v1 (text), `2` = v2 (binary). - **Description**: Sends PROXY protocol header when connecting to mask backend, allowing the backend to see the real client IP. - **Example**: @@ -2695,8 +2471,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_proxy_protocol = 0 ``` -## "cfg-censorship-mask_shape_hardening" -- `mask_shape_hardening` +## mask_shape_hardening - **Constraints / validation**: `bool`. - **Description**: Enables client->mask shape-channel hardening by applying controlled tail padding to bucket boundaries on mask relay shutdown. - **Example**: @@ -2705,8 +2480,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_shape_hardening = true ``` -## "cfg-censorship-mask_shape_hardening_aggressive_mode" -- `mask_shape_hardening_aggressive_mode` +## mask_shape_hardening_aggressive_mode - **Constraints / validation**: Requires `mask_shape_hardening = true`. - **Description**: Opt-in aggressive shaping profile (stronger anti-classifier behavior with different shaping semantics). - **Example**: @@ -2716,8 +2490,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche mask_shape_hardening = true mask_shape_hardening_aggressive_mode = false ``` -## "cfg-censorship-mask_shape_bucket_floor_bytes" -- `mask_shape_bucket_floor_bytes` +## mask_shape_bucket_floor_bytes - **Constraints / validation**: Must be `> 0`; must be `<= mask_shape_bucket_cap_bytes`. - **Description**: Minimum bucket size used by shape-channel hardening. - **Example**: @@ -2726,8 +2499,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_shape_bucket_floor_bytes = 512 ``` -## "cfg-censorship-mask_shape_bucket_cap_bytes" -- `mask_shape_bucket_cap_bytes` +## mask_shape_bucket_cap_bytes - **Constraints / validation**: Must be `>= mask_shape_bucket_floor_bytes`. - **Description**: Maximum bucket size used by shape-channel hardening; traffic above cap is not bucket-padded further. - **Example**: @@ -2736,8 +2508,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_shape_bucket_cap_bytes = 4096 ``` -## "cfg-censorship-mask_shape_above_cap_blur" -- `mask_shape_above_cap_blur` +## mask_shape_above_cap_blur - **Constraints / validation**: Requires `mask_shape_hardening = true`. - **Description**: Adds bounded randomized tail bytes even when forwarded size already exceeds cap. - **Example**: @@ -2747,8 +2518,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche mask_shape_hardening = true mask_shape_above_cap_blur = false ``` -## "cfg-censorship-mask_shape_above_cap_blur_max_bytes" -- `mask_shape_above_cap_blur_max_bytes` +## mask_shape_above_cap_blur_max_bytes - **Constraints / validation**: Must be `<= 1048576`. Must be `> 0` when `mask_shape_above_cap_blur = true`. - **Description**: Maximum randomized extra bytes appended above cap when above-cap blur is enabled. - **Example**: @@ -2758,8 +2528,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche mask_shape_above_cap_blur = true mask_shape_above_cap_blur_max_bytes = 64 ``` -## "cfg-censorship-mask_relay_max_bytes" -- `mask_relay_max_bytes` +## mask_relay_max_bytes - **Constraints / validation**: Must be `> 0`; must be `<= 67108864`. - **Description**: Maximum relayed bytes per direction on unauthenticated masking fallback path. - **Example**: @@ -2768,8 +2537,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_relay_max_bytes = 5242880 ``` -## "cfg-censorship-mask_classifier_prefetch_timeout_ms" -- `mask_classifier_prefetch_timeout_ms` +## mask_classifier_prefetch_timeout_ms - **Constraints / validation**: Must be within `[5, 50]` (milliseconds). - **Description**: Timeout budget (ms) for extending fragmented initial classifier window on masking fallback. - **Example**: @@ -2778,8 +2546,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_classifier_prefetch_timeout_ms = 5 ``` -## "cfg-censorship-mask_timing_normalization_enabled" -- `mask_timing_normalization_enabled` +## mask_timing_normalization_enabled - **Constraints / validation**: When `true`, requires `mask_timing_normalization_floor_ms > 0` and `mask_timing_normalization_ceiling_ms >= mask_timing_normalization_floor_ms`. Ceiling must be `<= 60000`. - **Description**: Enables timing envelope normalization on masking outcomes. - **Example**: @@ -2788,8 +2555,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_timing_normalization_enabled = false ``` -## "cfg-censorship-mask_timing_normalization_floor_ms" -- `mask_timing_normalization_floor_ms` +## mask_timing_normalization_floor_ms - **Constraints / validation**: Must be `> 0` when timing normalization is enabled; must be `<= mask_timing_normalization_ceiling_ms`. - **Description**: Lower bound (ms) for masking outcome normalization target. - **Example**: @@ -2798,8 +2564,7 @@ Note: This section also accepts the legacy alias `[server.admin_api]` (same sche [censorship] mask_timing_normalization_floor_ms = 0 ``` -## "cfg-censorship-mask_timing_normalization_ceiling_ms" -- `mask_timing_normalization_ceiling_ms` +## mask_timing_normalization_ceiling_ms - **Constraints / validation**: Must be `>= mask_timing_normalization_floor_ms`; must be `<= 60000`. - **Description**: Upper bound (ms) for masking outcome normalization target. - **Example**: @@ -2922,16 +2687,15 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p | Key | Type | Default | | --- | ---- | ------- | -| [`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`](#profiles) | `String[]` | `["modern_chrome_like", "modern_firefox_like", "compat_tls12", "legacy_minimal"]` | +| [`strict_route`](#strict_route) | `bool` | `true` | +| [`attempt_timeout_ms`](#attempt_timeout_ms) | `u64` | `5000` | +| [`total_budget_ms`](#total_budget_ms) | `u64` | `15000` | +| [`grease_enabled`](#grease_enabled) | `bool` | `false` | +| [`deterministic`](#deterministic) | `bool` | `false` | +| [`profile_cache_ttl_secs`](#profile_cache_ttl_secs) | `u64` | `600` | -## "cfg-censorship-tls_fetch-profiles" -- `profiles` +## profiles - **Constraints / validation**: `String[]`. Empty list falls back to defaults; values are deduplicated preserving order. - **Description**: Ordered ClientHello profile fallback chain for TLS-front metadata fetch. - **Example**: @@ -2940,8 +2704,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [censorship.tls_fetch] profiles = ["modern_chrome_like", "compat_tls12"] ``` -## "cfg-censorship-tls_fetch-strict_route" -- `strict_route` +## strict_route - **Constraints / validation**: `bool`. - **Description**: When `true` and an upstream route is configured, TLS fetch fails closed on upstream connect errors instead of falling back to direct TCP. - **Example**: @@ -2950,8 +2713,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [censorship.tls_fetch] strict_route = true ``` -## "cfg-censorship-tls_fetch-attempt_timeout_ms" -- `attempt_timeout_ms` +## attempt_timeout_ms - **Constraints / validation**: Must be `> 0` (milliseconds). - **Description**: Timeout budget per one TLS-fetch profile attempt (ms). - **Example**: @@ -2960,8 +2722,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [censorship.tls_fetch] attempt_timeout_ms = 5000 ``` -## "cfg-censorship-tls_fetch-total_budget_ms" -- `total_budget_ms` +## total_budget_ms - **Constraints / validation**: Must be `> 0` (milliseconds). - **Description**: Total wall-clock budget across all TLS-fetch attempts (ms). - **Example**: @@ -2970,8 +2731,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [censorship.tls_fetch] total_budget_ms = 15000 ``` -## "cfg-censorship-tls_fetch-grease_enabled" -- `grease_enabled` +## grease_enabled - **Constraints / validation**: `bool`. - **Description**: Enables GREASE-style random values in selected ClientHello extensions for fetch traffic. - **Example**: @@ -2980,8 +2740,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [censorship.tls_fetch] grease_enabled = false ``` -## "cfg-censorship-tls_fetch-deterministic" -- `deterministic` +## deterministic - **Constraints / validation**: `bool`. - **Description**: Enables deterministic ClientHello randomness for debugging/tests. - **Example**: @@ -2990,8 +2749,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [censorship.tls_fetch] deterministic = false ``` -## "cfg-censorship-tls_fetch-profile_cache_ttl_secs" -- `profile_cache_ttl_secs` +## profile_cache_ttl_secs - **Constraints / validation**: `u64` (seconds). `0` disables cache. - **Description**: TTL for winner-profile cache entries used by TLS fetch path. - **Example**: @@ -3006,22 +2764,21 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p | Key | Type | Default | | --- | ---- | ------- | -| [`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`](#users) | `Map` | `{"default": "000…000"}` | +| [`user_ad_tags`](#user_ad_tags) | `Map` | `{}` | +| [`user_max_tcp_conns`](#user_max_tcp_conns) | `Map` | `{}` | +| [`user_max_tcp_conns_global_each`](#user_max_tcp_conns_global_each) | `usize` | `0` | +| [`user_expirations`](#user_expirations) | `Map>` | `{}` | +| [`user_data_quota`](#user_data_quota) | `Map` | `{}` | +| [`user_max_unique_ips`](#user_max_unique_ips) | `Map` | `{}` | +| [`user_max_unique_ips_global_each`](#user_max_unique_ips_global_each) | `usize` | `0` | +| [`user_max_unique_ips_mode`](#user_max_unique_ips_mode) | `"active_window"`, `"time_window"`, or `"combined"` | `"active_window"` | +| [`user_max_unique_ips_window_secs`](#user_max_unique_ips_window_secs) | `u64` | `30` | +| [`replay_check_len`](#replay_check_len) | `usize` | `65536` | +| [`replay_window_secs`](#replay_window_secs) | `u64` | `120` | +| [`ignore_time_skew`](#ignore_time_skew) | `bool` | `false` | -## "cfg-access-users" -- `users` +## users - **Constraints / validation**: Must not be empty (at least one user must exist). Each value must be **exactly 32 hex characters**. - **Description**: User credentials map used for client authentication. Keys are user names; values are MTProxy secrets. - **Example**: @@ -3031,8 +2788,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p alice = "00112233445566778899aabbccddeeff" bob = "0123456789abcdef0123456789abcdef" ``` -## "cfg-access-user_ad_tags" -- `user_ad_tags` +## user_ad_tags - **Constraints / validation**: Each value must be **exactly 32 hex characters** (same format as `general.ad_tag`). An all-zero tag is allowed but logs a warning. - **Description**: Per-user sponsored-channel ad tag override. When a user has an entry here, it takes precedence over `general.ad_tag`. - **Example**: @@ -3044,8 +2800,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access.user_ad_tags] alice = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" ``` -## "cfg-access-user_max_tcp_conns" -- `user_max_tcp_conns` +## user_max_tcp_conns - **Constraints / validation**: `Map`. - **Description**: Per-user maximum concurrent TCP connections. - **Example**: @@ -3054,8 +2809,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access.user_max_tcp_conns] alice = 500 ``` -## "cfg-access-user_max_tcp_conns_global_each" -- `user_max_tcp_conns_global_each` +## user_max_tcp_conns_global_each - **Constraints / validation**: `usize`. `0` disables the inherited limit. - **Description**: Global per-user maximum concurrent TCP connections, applied when a user has **no positive** entry in `[access.user_max_tcp_conns]` (a missing key, or a value of `0`, both fall through to this setting). Per-user limits greater than `0` in `user_max_tcp_conns` take precedence. - **Example**: @@ -3068,8 +2822,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p alice = 500 # uses 500, not the global cap # bob has no entry → uses 200 ``` -## "cfg-access-user_expirations" -- `user_expirations` +## user_expirations - **Constraints / validation**: `Map>`. Each value must be a valid RFC3339 / ISO-8601 datetime. - **Description**: Per-user account expiration timestamps (UTC). - **Example**: @@ -3078,8 +2831,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access.user_expirations] alice = "2026-12-31T23:59:59Z" ``` -## "cfg-access-user_data_quota" -- `user_data_quota` +## user_data_quota - **Constraints / validation**: `Map`. - **Description**: Per-user traffic quota in bytes. - **Example**: @@ -3088,8 +2840,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access.user_data_quota] alice = 1073741824 # 1 GiB ``` -## "cfg-access-user_max_unique_ips" -- `user_max_unique_ips` +## user_max_unique_ips - **Constraints / validation**: `Map`. - **Description**: Per-user unique source IP limits. - **Example**: @@ -3098,8 +2849,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access.user_max_unique_ips] alice = 16 ``` -## "cfg-access-user_max_unique_ips_global_each" -- `user_max_unique_ips_global_each` +## user_max_unique_ips_global_each - **Constraints / validation**: `usize`. `0` disables the inherited limit. - **Description**: Global per-user unique IP limit applied when a user has no individual override in `[access.user_max_unique_ips]`. - **Example**: @@ -3108,8 +2858,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access] user_max_unique_ips_global_each = 8 ``` -## "cfg-access-user_max_unique_ips_mode" -- `user_max_unique_ips_mode` +## user_max_unique_ips_mode - **Constraints / validation**: Must be one of `"active_window"`, `"time_window"`, `"combined"`. - **Description**: Unique source IP limit accounting mode. - **Example**: @@ -3118,8 +2867,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access] user_max_unique_ips_mode = "active_window" ``` -## "cfg-access-user_max_unique_ips_window_secs" -- `user_max_unique_ips_window_secs` +## user_max_unique_ips_window_secs - **Constraints / validation**: Must be `> 0`. - **Description**: Window size (seconds) used by unique-IP accounting modes that include a time window (`"time_window"` and `"combined"`). - **Example**: @@ -3128,8 +2876,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access] user_max_unique_ips_window_secs = 30 ``` -## "cfg-access-replay_check_len" -- `replay_check_len` +## replay_check_len - **Constraints / validation**: `usize`. - **Description**: Replay-protection storage length (number of entries tracked for duplicate detection). - **Example**: @@ -3138,8 +2885,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access] replay_check_len = 65536 ``` -## "cfg-access-replay_window_secs" -- `replay_window_secs` +## replay_window_secs - **Constraints / validation**: `u64`. - **Description**: Replay-protection time window in seconds. - **Example**: @@ -3148,8 +2894,7 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [access] replay_window_secs = 120 ``` -## "cfg-access-ignore_time_skew" -- `ignore_time_skew` +## ignore_time_skew - **Constraints / validation**: `bool`. - **Description**: Disables client/server timestamp skew checks in replay validation when enabled. - **Example**: @@ -3160,78 +2905,73 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p ``` -# [[upstreams]] +# [upstreams] | Key | Type | Default | | --- | ---- | ------- | -| [`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`](#type) | `"direct"`, `"socks4"`, `"socks5"`, or `"shadowsocks"` | — | +| [`weight`](#weight) | `u16` | `1` | +| [`enabled`](#enabled) | `bool` | `true` | +| [`scopes`](#scopes) | `String` | `""` | +| [`interface`](#interface) | `String` | — | +| [`bind_addresses`](#bind_addresses) | `String[]` | — | +| [`url`](#url) | `String` | — | +| [`address`](#address) | `String` | — | +| [`user_id`](#user_id) | `String` | — | +| [`username`](#username) | `String` | — | +| [`password`](#password) | `String` | — | -## "cfg-upstreams-type" -- `type` +## type - **Constraints / validation**: Required field. Must be one of: `"direct"`, `"socks4"`, `"socks5"`, `"shadowsocks"`. - - **Description**: Selects the upstream transport implementation for this `[[upstreams]]` entry. + - **Description**: Selects the upstream transport implementation for this `[upstreams]` entry. - **Example**: ```toml - [[upstreams]] + [upstreams] type = "direct" - [[upstreams]] + [upstreams] type = "socks5" address = "127.0.0.1:9050" - [[upstreams]] + [upstreams] type = "shadowsocks" url = "ss://2022-blake3-aes-256-gcm:BASE64PASSWORD@127.0.0.1:8388" ``` -## "cfg-upstreams-weight" -- `weight` +## weight - **Constraints / validation**: `u16` (0..=65535). - **Description**: Base weight used by weighted-random upstream selection (higher = chosen more often). - **Example**: ```toml - [[upstreams]] + [upstreams] type = "direct" weight = 10 ``` -## "cfg-upstreams-enabled" -- `enabled` +## enabled - **Constraints / validation**: `bool`. - **Description**: When `false`, this entry is ignored and not used for any upstream selection. - **Example**: ```toml - [[upstreams]] + [upstreams] type = "socks5" address = "127.0.0.1:9050" enabled = false ``` -## "cfg-upstreams-scopes" -- `scopes` +## scopes - **Constraints / validation**: `String`. Comma-separated list; whitespace is trimmed during matching. - **Description**: Scope tags used for request-level upstream filtering. If a request specifies a scope, only upstreams whose `scopes` contains that tag can be selected. If a request does not specify a scope, only upstreams with empty `scopes` are eligible. - **Example**: ```toml - [[upstreams]] + [upstreams] type = "socks4" address = "10.0.0.10:1080" scopes = "me, fetch, dc2" ``` -## "cfg-upstreams-interface" -- `interface` +## interface - **Constraints / validation**: `String` (optional). - For `"direct"`: may be an IP address (used as explicit local bind) or an OS interface name (resolved to an IP at runtime; Unix only). - For `"socks4"`/`"socks5"`: supported only when `address` is an `IP:port` literal; when `address` is a hostname, interface binding is ignored. @@ -3240,17 +2980,16 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p - **Example**: ```toml - [[upstreams]] + [upstreams] type = "direct" interface = "eth0" - [[upstreams]] + [upstreams] type = "socks5" address = "203.0.113.10:1080" interface = "192.0.2.10" # explicit local bind IP ``` -## "cfg-upstreams-bind_addresses" -- `bind_addresses` +## bind_addresses - **Constraints / validation**: `String[]` (optional). Applies only to `type = "direct"`. - Each entry should be an IP address string. - At runtime, Telemt selects an address that matches the target family (IPv4 vs IPv6). If `bind_addresses` is set and none match the target family, the connect attempt fails. @@ -3258,12 +2997,11 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p - **Example**: ```toml - [[upstreams]] + [upstreams] type = "direct" bind_addresses = ["192.0.2.10", "192.0.2.11"] ``` -## "cfg-upstreams-url" -- `url` +## url - **Constraints / validation**: Applies only to `type = "shadowsocks"`. - Must be a valid Shadowsocks URL accepted by the `shadowsocks` crate. - Shadowsocks plugins are not supported. @@ -3275,53 +3013,49 @@ If your backend or network is very bandwidth-constrained, reduce cap first. If p [general] use_middle_proxy = false - [[upstreams]] + [upstreams] type = "shadowsocks" url = "ss://2022-blake3-aes-256-gcm:BASE64PASSWORD@127.0.0.1:8388" ``` -## "cfg-upstreams-address" -- `address` +## address - **Constraints / validation**: Required for `type = "socks4"` and `type = "socks5"`. Must be `host:port` or `ip:port`. - **Description**: SOCKS proxy server endpoint used for upstream connects. - **Example**: ```toml - [[upstreams]] + [upstreams] type = "socks5" address = "127.0.0.1:9050" ``` -## "cfg-upstreams-user_id" -- `user_id` +## user_id - **Constraints / validation**: `String` (optional). Only for `type = "socks4"`. - **Description**: SOCKS4 CONNECT user ID. Note: when a request scope is selected, Telemt may override this with the selected scope value. - **Example**: ```toml - [[upstreams]] + [upstreams] type = "socks4" address = "127.0.0.1:1080" user_id = "telemt" ``` -## "cfg-upstreams-username" -- `username` +## username - **Constraints / validation**: `String` (optional). Only for `type = "socks5"`. - **Description**: SOCKS5 username (for username/password authentication). Note: when a request scope is selected, Telemt may override this with the selected scope value. - **Example**: ```toml - [[upstreams]] + [upstreams] type = "socks5" address = "127.0.0.1:9050" username = "alice" ``` -## "cfg-upstreams-password" -- `password` +## password - **Constraints / validation**: `String` (optional). Only for `type = "socks5"`. - **Description**: SOCKS5 password (for username/password authentication). Note: when a request scope is selected, Telemt may override this with the selected scope value. - **Example**: ```toml - [[upstreams]] + [upstreams] type = "socks5" address = "127.0.0.1:9050" username = "alice" diff --git a/docs/Config_params/CONFIG_PARAMS.ru.md b/docs/Config_params/CONFIG_PARAMS.ru.md index fd56556..bbc663a 100644 --- a/docs/Config_params/CONFIG_PARAMS.ru.md +++ b/docs/Config_params/CONFIG_PARAMS.ru.md @@ -1,3331 +1,3072 @@ -# Справочник параметров конфигурации Telemt - -В этом документе перечислены все ключи конфигурации, принимаемые `config.toml`. - -> [!NOTE] -> -> Этот справочник был составлен с помощью искусственного интеллекта и сверен с базой кода (схема конфигурации, значения по умолчанию и логика проверки). - -> [!WARNING] -> -> Параметры конфигурации, подробно описанные в этом документе, предназначены для опытных пользователей и для целей тонкой настройки. Изменение этих параметров без четкого понимания их функции может привести к нестабильности приложения или другому неожиданному поведению. Пожалуйста, действуйте осторожно и на свой страх и риск. - -# Содержание - - [Ключи верхнего уровня](#top-level-keys) - - [general](#general) - - [general.modes](#generalmodes) - - [general.links](#generallinks) - - [general.telemetry](#generaltelemetry) - - [network](#network) - - [server](#server) - - [server.conntrack_control](#serverconntrack_control) - - [server.api](#serverapi) - - [[server.listeners]](#serverlisteners) - - [timeouts](#timeouts) - - [censorship](#censorship) - - [censorship.tls_fetch](#censorshiptls_fetch) - - [access](#access) - - [[upstreams]](#upstreams) - -# Ключи верхнего уровня - -| Ключ | Тип | По умолчанию | -| --- | ---- | ------- | -| [`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) | - -## "cfg-top-include" -- `include` - - **Ограничения / валидация**: Должна быть однострочной директивой в форме `include = "path/to/file.toml"`. Включения расширяются перед анализом TOML. Максимальная глубина включения — 10. - - **Описание**: Включает еще один файл TOML с помощью `include = "relative/or/absolute/path.toml"`; включения обрабатываются рекурсивно перед анализом. - - **Пример**: - - ```toml - include = "secrets.toml" - ``` -## "cfg-top-show_link" -- `show_link` - - **Ограничения / валидация**: Принимает `"*"` или массив имен пользователей. Пустой массив означает «не показывать ничего». - - **Описание**: Устаревший селектор видимости ссылок верхнего уровня («*»` для всех пользователей или списка явных имен пользователей). - - **Пример**: - - ```toml - # show links for all configured users - show_link = "*" - - # or: show links only for selected users - # show_link = ["alice", "bob"] - ``` -## "cfg-top-dc_overrides" -- `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"] - ``` -## "cfg-top-default_dc" -- `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` | -| [`rst_on_close`](#cfg-general-rst_on_close) | `"off"`, `"errors"` или `"always"` | `"off"` | - -## "cfg-general-data_path" -- `data_path` - - **Ограничения / валидация**: `Строка` (необязательно). - - **Описание**: Необязательный путь к каталогу данных времени выполнения. - - **Пример**: - - ```toml - [general] - data_path = "/var/lib/telemt" - ``` -## "cfg-general-prefer_ipv6" -- `prefer_ipv6` - - **Ограничения / валидация**: Устарело. Используйте `network.prefer`. - - **Описание**: Устаревший устаревший флаг предпочтения IPv6 перенесен в network.prefer. - - **Пример**: - - ```toml - [network] - prefer = 6 - ``` -## "cfg-general-fast_mode" -- `fast_mode` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает оптимизацию быстрого пути для обработки трафика. - - **Пример**: - - ```toml - [general] - fast_mode = true - ``` -## "cfg-general-use_middle_proxy" -- `use_middle_proxy` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает транспортный режим ME; если значение false, среда выполнения возвращается к прямой маршрутизации постоянного тока. - - **Пример**: - - ```toml - [general] - use_middle_proxy = true - ``` -## "cfg-general-proxy_secret_path" -- `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" - ``` -## "cfg-general-proxy_config_v4_cache_path" -- `proxy_config_v4_cache_path` - - **Ограничения / валидация**: `Строка`. Если установлено, оно не должно быть пустым или содержать только пробелы. - - **Описание**: Необязательный путь к дисковому кэшу для необработанного снимка getProxyConfig (IPv4). При запуске Telemt сначала пытается получить свежий снимок; в случае сбоя выборки или пустого снимка он возвращается к этому файлу кэша, если он присутствует и не пуст. - - **Пример**: - - ```toml - [general] - proxy_config_v4_cache_path = "cache/proxy-config-v4.txt" - ``` -## "cfg-general-proxy_config_v6_cache_path" -- `proxy_config_v6_cache_path` - - **Ограничения / валидация**: `Строка`. Если установлено, оно не должно быть пустым или содержать только пробелы. - - **Описание**: Необязательный путь к дисковому кэшу для необработанного снимка getProxyConfigV6 (IPv6). При запуске Telemt сначала пытается получить свежий снимок; в случае сбоя выборки или пустого снимка он возвращается к этому файлу кэша, если он присутствует и не пуст. - - **Пример**: - - ```toml - [general] - proxy_config_v6_cache_path = "cache/proxy-config-v6.txt" - ``` -## "cfg-general-ad_tag" -- `ad_tag` - - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, должно быть ровно 32 шестнадцатеричных символа; недопустимые значения отключаются во время загрузки конфигурации. - - **Описание**: Глобальный резервный спонсируемый канал `ad_tag` (используется, когда у пользователя нет переопределения в `access.user_ad_tags`). Тег со всеми нулями принимается, но не имеет никакого эффекта (и о нем предупреждается), пока не будет заменен реальным тегом от `@MTProxybot`. - - **Пример**: - - ```toml - [general] - ad_tag = "00112233445566778899aabbccddeeff" - ``` -## "cfg-general-middle_proxy_nat_ip" -- `middle_proxy_nat_ip` - - **Ограничения / валидация**: `IpAddr` (необязательно). - - **Описание**: Ручное переопределение общедоступного IP-адреса NAT используется в качестве материала ME-адреса, если оно установлено. - - **Пример**: - - ```toml - [general] - middle_proxy_nat_ip = "203.0.113.10" - ``` -## "cfg-general-middle_proxy_nat_probe" -- `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 - ``` -## "cfg-general-middle_proxy_nat_stun" -- `middle_proxy_nat_stun` - - **Ограничения / валидация**: Устарело. Используйте `network.stun_servers`. - - **Описание**: Устаревший устаревший одиночный сервер STUN для проверки NAT. Во время загрузки конфигурации он объединяется с `network.stun_servers`, если `network.stun_servers` не задан явно. - - **Пример**: - - ```toml - [network] - stun_servers = ["stun.l.google.com:19302"] - ``` -## "cfg-general-middle_proxy_nat_stun_servers" -- `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"] - ``` -## "cfg-general-stun_nat_probe_concurrency" -- `stun_nat_probe_concurrency` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Максимальное количество параллельных тестов STUN во время обнаружения NAT/публичной конечной точки. - - **Пример**: - - ```toml - [general] - stun_nat_probe_concurrency = 8 - ``` -## "cfg-general-middle_proxy_pool_size" -- `middle_proxy_pool_size` - - **Ограничения / валидация**: `использовать`. Эффективное значение — «max(value, 1)» во время выполнения (поэтому «0» ведет себя как «1»). - - **Описание**: Целевой размер активного пула устройств записи ME. - - **Пример**: - - ```toml - [general] - middle_proxy_pool_size = 8 - ``` -## "cfg-general-middle_proxy_warm_standby" -- `middle_proxy_warm_standby` - - **Ограничения / валидация**: `использовать`. - - **Описание**: Количество подключений ME в теплом резерве, предварительно инициализированных. - - **Пример**: - - ```toml - [general] - middle_proxy_warm_standby = 16 - ``` -## "cfg-general-me_init_retry_attempts" -- `me_init_retry_attempts` - - **Ограничения / валидация**: `0..=1_000_000` (`0` означает неограниченное количество повторов). - - **Описание**: Повторные попытки инициализации пула ME. - - **Пример**: - - ```toml - [general] - me_init_retry_attempts = 0 - ``` -## "cfg-general-me2dc_fallback" -- `me2dc_fallback` - - **Ограничения / валидация**: `бул`. - - **Описание**: Позволяет перейти из режима ME в режим прямого постоянного тока в случае сбоя запуска ME. - - **Пример**: - - ```toml - [general] - me2dc_fallback = true - ``` -## "cfg-general-me2dc_fast" -- `me2dc_fast` - - **Ограничения / валидация**: `бул`. Активен только тогда, когда `use_middle_proxy = true` и `me2dc_fallback = true`. - - **Описание**: Fast ME->Режим прямого возврата для новых сеансов. - - **Пример**: - - ```toml - [general] - use_middle_proxy = true - me2dc_fallback = true - me2dc_fast = false - ``` -## "cfg-general-me_keepalive_enabled" -- `me_keepalive_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает периодические дополнительные кадры поддержки активности ME. - - **Пример**: - - ```toml - [general] - me_keepalive_enabled = true - ``` -## "cfg-general-me_keepalive_interval_secs" -- `me_keepalive_interval_secs` - - **Ограничения / валидация**: `u64` (секунды). - - **Описание**: Базовый интервал поддержки активности ME в секундах. - - **Пример**: - - ```toml - [general] - me_keepalive_interval_secs = 8 - ``` -## "cfg-general-me_keepalive_jitter_secs" -- `me_keepalive_jitter_secs` - - **Ограничения / валидация**: `u64` (секунды). - - **Описание**: Джиттер Keepalive за считанные секунды для уменьшения синхронизированных пакетов. - - **Пример**: - - ```toml - [general] - me_keepalive_jitter_secs = 2 - ``` -## "cfg-general-me_keepalive_payload_random" -- `me_keepalive_payload_random` - - **Ограничения / валидация**: `бул`. - - **Описание**: Случайным образом изменяет байты полезной нагрузки поддержки активности вместо фиксированной нулевой полезной нагрузки. - - **Пример**: - - ```toml - [general] - me_keepalive_payload_random = true - ``` -## "cfg-general-rpc_proxy_req_every" -- `rpc_proxy_req_every` - - **Ограничения / валидация**: `0` или в пределах `10..=300` (секунд). - - **Описание**: Интервал для сигналов активности службы `RPC_PROXY_REQ` для ME (`0` отключает). - - **Пример**: - - ```toml - [general] - rpc_proxy_req_every = 0 - ``` -## "cfg-general-me_writer_cmd_channel_capacity" -- `me_writer_cmd_channel_capacity` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Пропускная способность командного канала для каждого записывающего устройства. - - **Пример**: - - ```toml - [general] - me_writer_cmd_channel_capacity = 4096 - ``` -## "cfg-general-me_route_channel_capacity" -- `me_route_channel_capacity` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Пропускная способность канала маршрута ответа ME для каждого соединения. - - **Пример**: - - ```toml - [general] - me_route_channel_capacity = 768 - ``` -## "cfg-general-me_c2me_channel_capacity" -- `me_c2me_channel_capacity` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Емкость очереди команд для каждого клиента (читатель клиента -> отправитель ME). - - **Пример**: - - ```toml - [general] - me_c2me_channel_capacity = 1024 - ``` -## "cfg-general-me_c2me_send_timeout_ms" -- `me_c2me_send_timeout_ms` - - **Ограничения / валидация**: `0..=60000` (миллисекунды). - - **Описание**: Максимальное ожидание постановки в очередь команд клиент->ME, когда очередь для каждого клиента заполнена (`0` сохраняет устаревшее неограниченное ожидание). - - **Пример**: - - ```toml - [general] - me_c2me_send_timeout_ms = 4000 - ``` -## "cfg-general-me_reader_route_data_wait_ms" -- `me_reader_route_data_wait_ms` - - **Ограничения / валидация**: `0..=20` (миллисекунды). - - **Описание**: Ограниченное ожидание маршрутизации ME DATA в очередь для каждого соединения (`0` = нет ожидания). - - **Пример**: - - ```toml - [general] - me_reader_route_data_wait_ms = 2 - ``` -## "cfg-general-me_d2c_flush_batch_max_frames" -- `me_d2c_flush_batch_max_frames` - - **Ограничения / валидация**: Должно быть в пределах `1..=512`. - - **Описание**: Макс. ME->клиентские кадры объединяются перед очисткой. - - **Пример**: - - ```toml - [general] - me_d2c_flush_batch_max_frames = 32 - ``` -## "cfg-general-me_d2c_flush_batch_max_bytes" -- `me_d2c_flush_batch_max_bytes` - - **Ограничения / валидация**: Должно быть в пределах `4096..=2097152` (байт). - - **Описание**: Максимальное количество байтов полезной нагрузки ME->клиента, объединенных перед сбросом. - - **Пример**: - - ```toml - [general] - me_d2c_flush_batch_max_bytes = 131072 - ``` -## "cfg-general-me_d2c_flush_batch_max_delay_us" -- `me_d2c_flush_batch_max_delay_us` - - **Ограничения / валидация**: `0..=5000` (микросекунды). - - **Описание**: Максимальное время ожидания в микросекундах для объединения большего количества кадров ME->клиента (`0` отключает объединение по времени). - - **Пример**: - - ```toml - [general] - me_d2c_flush_batch_max_delay_us = 500 - ``` -## "cfg-general-me_d2c_ack_flush_immediate" -- `me_d2c_ack_flush_immediate` - - **Ограничения / валидация**: `бул`. - - **Описание**: Сбрасывает запись клиента сразу после записи быстрого подтверждения. - - **Пример**: - - ```toml - [general] - me_d2c_ack_flush_immediate = true - ``` -## "cfg-general-me_quota_soft_overshoot_bytes" -- `me_quota_soft_overshoot_bytes` - - **Ограничения / валидация**: `0..=16777216` (байты). - - **Описание**: Дополнительные квоты для каждого маршрута (в байтах) допускаются до того, как принудительное применение квот на стороне записи отбрасывает данные маршрута. - - **Пример**: - - ```toml - [general] - me_quota_soft_overshoot_bytes = 65536 - ``` -## "cfg-general-me_d2c_frame_buf_shrink_threshold_bytes" -- `me_d2c_frame_buf_shrink_threshold_bytes` - - **Ограничения / валидация**: Должно быть в пределах `4096..=16777216` (байт). - - **Описание**: Пороговое значение для сжатия слишком больших буферов агрегации кадров ME->клиента после очистки. - - **Пример**: - - ```toml - [general] - me_d2c_frame_buf_shrink_threshold_bytes = 262144 - ``` -## "cfg-general-direct_relay_copy_buf_c2s_bytes" -- `direct_relay_copy_buf_c2s_bytes` - - **Ограничения / валидация**: Должно быть в пределах `4096..=1048576` (байт). - - **Описание**: Размер буфера копирования для направления клиент->DC в прямой ретрансляции. - - **Пример**: - - ```toml - [general] - direct_relay_copy_buf_c2s_bytes = 65536 - ``` -## "cfg-general-direct_relay_copy_buf_s2c_bytes" -- `direct_relay_copy_buf_s2c_bytes` - - **Ограничения / валидация**: Должно быть в пределах `8192..=2097152` (байт). - - **Описание**: Размер буфера копирования для направления DC->клиент при прямой ретрансляции. - - **Пример**: - - ```toml - [general] - direct_relay_copy_buf_s2c_bytes = 262144 - ``` -## "cfg-general-crypto_pending_buffer" -- `crypto_pending_buffer` - - **Ограничения / валидация**: `использовать` (байты). - - **Описание**: Максимальный буфер ожидающего зашифрованного текста на каждого клиента-писателя (в байтах). - - **Пример**: - - ```toml - [general] - crypto_pending_buffer = 262144 - ``` -## "cfg-general-max_client_frame" -- `max_client_frame` - - **Ограничения / валидация**: `использовать` (байты). - - **Описание**: Максимально допустимый размер кадра MTProto клиента (в байтах). - - **Пример**: - - ```toml - [general] - max_client_frame = 16777216 - ``` -## "cfg-general-desync_all_full" -- `desync_all_full` - - **Ограничения / валидация**: `бул`. - - **Описание**: Создает полные журналы крипто-рассинхронизации для каждого события. - - **Пример**: - - ```toml - [general] - desync_all_full = false - ``` -## "cfg-general-beobachten" -- `beobachten` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает сегменты криминалистического наблюдения для каждого IP-адреса. - - **Пример**: - - ```toml - [general] - beobachten = true - ``` -## "cfg-general-beobachten_minutes" -- `beobachten_minutes` - - **Ограничения / валидация**: Должно быть `> 0` (минуты). - - **Описание**: Окно хранения (минуты) для сегментов наблюдения по каждому IP-адресу. - - **Пример**: - - ```toml - [general] - beobachten_minutes = 10 - ``` -## "cfg-general-beobachten_flush_secs" -- `beobachten_flush_secs` - - **Ограничения / валидация**: Должно быть `> 0` (секунды). - - **Описание**: Интервал сброса моментального снимка (в секундах) для выходного файла наблюдения. - - **Пример**: - - ```toml - [general] - beobachten_flush_secs = 15 - ``` -## "cfg-general-beobachten_file" -- `beobachten_file` - - **Ограничения / валидация**: Не должно быть пустым или содержать только пробелы. - - **Описание**: Путь к выходному файлу снимка наблюдения. - - **Пример**: - - ```toml - [general] - beobachten_file = "cache/beobachten.txt" - ``` -## "cfg-general-hardswap" -- `hardswap` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает стратегию жесткой замены ME на основе генерации. - - **Пример**: - - ```toml - [general] - hardswap = true - ``` -## "cfg-general-me_warmup_stagger_enabled" -- `me_warmup_stagger_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Перемещает дополнительные шкалы прогрева ME, чтобы избежать всплесков соединения. - - **Пример**: - - ```toml - [general] - me_warmup_stagger_enabled = true - ``` -## "cfg-general-me_warmup_step_delay_ms" -- `me_warmup_step_delay_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). - - **Описание**: Базовая задержка в миллисекундах между этапами набора прогрева. - - **Пример**: - - ```toml - [general] - me_warmup_step_delay_ms = 500 - ``` -## "cfg-general-me_warmup_step_jitter_ms" -- `me_warmup_step_jitter_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). - - **Описание**: Дополнительная случайная задержка в миллисекундах для шагов разминки. - - **Пример**: - - ```toml - [general] - me_warmup_step_jitter_ms = 300 - ``` -## "cfg-general-me_reconnect_max_concurrent_per_dc" -- `me_reconnect_max_concurrent_per_dc` - - **Ограничения / валидация**: `u32`. Эффективное значение — «max(value, 1)» во время выполнения (поэтому «0» ведет себя как «1»). - - **Описание**: Ограничивает число одновременных рабочих повторных подключений на каждый контроллер домена во время восстановления работоспособности. - - **Пример**: - - ```toml - [general] - me_reconnect_max_concurrent_per_dc = 8 - ``` -## "cfg-general-me_reconnect_backoff_base_ms" -- `me_reconnect_backoff_base_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). - - **Описание**: Начальная задержка повторного подключения в миллисекундах. - - **Пример**: - - ```toml - [general] - me_reconnect_backoff_base_ms = 500 - ``` -## "cfg-general-me_reconnect_backoff_cap_ms" -- `me_reconnect_backoff_cap_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). - - **Описание**: Максимальное ограничение задержки повторного подключения в миллисекундах. - - **Пример**: - - ```toml - [general] - me_reconnect_backoff_cap_ms = 30000 - ``` -## "cfg-general-me_reconnect_fast_retry_count" -- `me_reconnect_fast_retry_count` - - **Ограничения / валидация**: `u32`. Эффективное значение — «max(value, 1)» во время выполнения (поэтому «0» ведет себя как «1»). - - **Описание**: Немедленный бюджет повторных попыток, прежде чем применяется поведение длительной отсрочки. - - **Пример**: - - ```toml - [general] - me_reconnect_fast_retry_count = 16 - ``` -## "cfg-general-me_single_endpoint_shadow_writers" -- `me_single_endpoint_shadow_writers` - - **Ограничения / валидация**: Должно быть в пределах `0..=32`. - - **Описание**: Дополнительные резервные модули записи для групп DC только с одной конечной точкой. - - **Пример**: - - ```toml - [general] - me_single_endpoint_shadow_writers = 2 - ``` -## "cfg-general-me_single_endpoint_outage_mode_enabled" -- `me_single_endpoint_outage_mode_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает агрессивный режим восстановления после сбоя для групп DC только с одной конечной точкой. - - **Пример**: - - ```toml - [general] - me_single_endpoint_outage_mode_enabled = true - ``` -## "cfg-general-me_single_endpoint_outage_disable_quarantine" -- `me_single_endpoint_outage_disable_quarantine` - - **Ограничения / валидация**: `бул`. - - **Описание**: Игнорирует карантин конечной точки в режиме отключения одной конечной точки. - - **Пример**: - - ```toml - [general] - me_single_endpoint_outage_disable_quarantine = true - ``` -## "cfg-general-me_single_endpoint_outage_backoff_min_ms" -- `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 - ``` -## "cfg-general-me_single_endpoint_outage_backoff_max_ms" -- `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 - ``` -## "cfg-general-me_single_endpoint_shadow_rotate_every_secs" -- `me_single_endpoint_shadow_rotate_every_secs` - - **Ограничения / валидация**: `u64` (секунды). `0` отключает периодическое вращение тени. - - **Описание**: Периодический интервал ротации теневого записывающего устройства для групп DC с одной конечной точкой. - - **Пример**: - - ```toml - [general] - me_single_endpoint_shadow_rotate_every_secs = 900 - ``` -## "cfg-general-me_floor_mode" -- `me_floor_mode` - - **Ограничения / валидация**: «статический» или «адаптивный». - - **Описание**: Режим политики пола для целей записи ME. - - **Пример**: - - ```toml - [general] - me_floor_mode = "adaptive" - ``` -## "cfg-general-me_adaptive_floor_idle_secs" -- `me_adaptive_floor_idle_secs` - - **Ограничения / валидация**: `u64` (секунды). - - **Описание**: Время простоя перед адаптивным ограничением может уменьшить целевую задачу записи с одной конечной точкой. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_idle_secs = 90 - ``` -## "cfg-general-me_adaptive_floor_min_writers_single_endpoint" -- `me_adaptive_floor_min_writers_single_endpoint` - - **Ограничения / валидация**: Должно быть в пределах `1..=32`. - - **Описание**: Минимальная цель записи для групп DC с одной конечной точкой в ​​адаптивном режиме пола. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_min_writers_single_endpoint = 1 - ``` -## "cfg-general-me_adaptive_floor_min_writers_multi_endpoint" -- `me_adaptive_floor_min_writers_multi_endpoint` - - **Ограничения / валидация**: Должно быть в пределах `1..=32`. - - **Описание**: Минимальная цель записи для групп DC с несколькими конечными точками в адаптивном режиме пола. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_min_writers_multi_endpoint = 1 - ``` -## "cfg-general-me_adaptive_floor_recover_grace_secs" -- `me_adaptive_floor_recover_grace_secs` - - **Ограничения / валидация**: `u64` (секунды). - - **Описание**: Льготный период для сохранения статического минимума после активности в адаптивном режиме. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_recover_grace_secs = 180 - ``` -## "cfg-general-me_adaptive_floor_writers_per_core_total" -- `me_adaptive_floor_writers_per_core_total` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Глобальный бюджет записи ME на логическое ядро ​​ЦП в адаптивном режиме. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_writers_per_core_total = 48 - ``` -## "cfg-general-me_adaptive_floor_cpu_cores_override" -- `me_adaptive_floor_cpu_cores_override` - - **Ограничения / валидация**: `u16`. `0` использует автоматическое обнаружение во время выполнения. - - **Описание**: Переопределить количество логических ядер ЦП, используемое для адаптивных вычислений минимального уровня. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_cpu_cores_override = 0 - ``` -## "cfg-general-me_adaptive_floor_max_extra_writers_single_per_core" -- `me_adaptive_floor_max_extra_writers_single_per_core` - - **Ограничения / валидация**: `u16`. - - **Описание**: Максимальное количество дополнительных устройств записи на ядро ​​выше базового требуемого уровня для групп DC с одной конечной точкой. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_max_extra_writers_single_per_core = 1 - ``` -## "cfg-general-me_adaptive_floor_max_extra_writers_multi_per_core" -- `me_adaptive_floor_max_extra_writers_multi_per_core` - - **Ограничения / валидация**: `u16`. - - **Описание**: Максимальное количество дополнительных устройств записи на ядро ​​выше базового требуемого уровня для групп DC с несколькими конечными точками. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_max_extra_writers_multi_per_core = 2 - ``` -## "cfg-general-me_adaptive_floor_max_active_writers_per_core" -- `me_adaptive_floor_max_active_writers_per_core` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Жесткое ограничение для активных устройств записи ME на логическое ядро ​​ЦП. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_max_active_writers_per_core = 64 - ``` -## "cfg-general-me_adaptive_floor_max_warm_writers_per_core" -- `me_adaptive_floor_max_warm_writers_per_core` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Жесткое ограничение для теплых авторов ME на логическое ядро ​​ЦП. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_max_warm_writers_per_core = 64 - ``` -## "cfg-general-me_adaptive_floor_max_active_writers_global" -- `me_adaptive_floor_max_active_writers_global` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Жесткий глобальный лимит для активных авторов ME. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_max_active_writers_global = 256 - ``` -## "cfg-general-me_adaptive_floor_max_warm_writers_global" -- `me_adaptive_floor_max_warm_writers_global` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Жесткий глобальный лимит для теплых писателей ME. - - **Пример**: - - ```toml - [general] - me_adaptive_floor_max_warm_writers_global = 256 - ``` -## "cfg-general-upstream_connect_retry_attempts" -- `upstream_connect_retry_attempts` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Попытки подключения для выбранного восходящего потока перед возвратом ошибки/резервного варианта. - - **Пример**: - - ```toml - [general] - upstream_connect_retry_attempts = 2 - ``` -## "cfg-general-upstream_connect_retry_backoff_ms" -- `upstream_connect_retry_backoff_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). `0` отключает задержку отсрочки (повторные попытки становятся немедленными). - - **Описание**: Задержка в миллисекундах между попытками восходящего соединения. - - **Пример**: - - ```toml - [general] - upstream_connect_retry_backoff_ms = 100 - ``` -## "cfg-general-upstream_connect_budget_ms" -- `upstream_connect_budget_ms` - - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). - - **Описание**: Общий бюджет настенных часов в миллисекундах для одного запроса восходящего соединения при повторных попытках. - - **Пример**: - - ```toml - [general] - upstream_connect_budget_ms = 3000 - ``` -## "cfg-general-upstream_unhealthy_fail_threshold" -- `upstream_unhealthy_fail_threshold` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Последовательные неудачные запросы до того, как восходящий поток будет помечен как неработоспособный. - - **Пример**: - - ```toml - [general] - upstream_unhealthy_fail_threshold = 5 - ``` -## "cfg-general-upstream_connect_failfast_hard_errors" -- `upstream_connect_failfast_hard_errors` - - **Ограничения / валидация**: `бул`. - - **Описание**: Если установлено значение true, дополнительные попытки пропускаются при серьезных непереходных ошибках восходящего соединения. - - **Пример**: - - ```toml - [general] - upstream_connect_failfast_hard_errors = false - ``` -## "cfg-general-stun_iface_mismatch_ignore" -- `stun_iface_mismatch_ignore` - - **Ограничения / валидация**: `бул`. - - **Описание**: Флаг совместимости зарезервирован для использования в будущем. В настоящее время этот ключ анализируется, но не используется средой выполнения. - - **Пример**: - - ```toml - [general] - stun_iface_mismatch_ignore = false - ``` -## "cfg-general-unknown_dc_log_path" -- `unknown_dc_log_path` - - **Ограничения / валидация**: `Строка` (необязательно). Должен быть безопасный путь (никаких компонентов `..`, родительский каталог должен существовать); небезопасные пути отклоняются во время выполнения. - - **Описание**: Путь к файлу журнала для неизвестных (нестандартных) запросов DC, когда `unknown_dc_file_log_enabled = true`. Опустите этот ключ, чтобы отключить ведение журнала файлов. - - **Пример**: - - ```toml - [general] - unknown_dc_log_path = "unknown-dc.txt" - ``` -## "cfg-general-unknown_dc_file_log_enabled" -- `unknown_dc_file_log_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает ведение журнала файла неизвестного DC (записывает строки `dc_idx=`). Требуется установить `unknown_dc_log_path` и на платформах, отличных от Unix, может не поддерживаться. Ведение журналов дедуплицировано и ограничено (записываются только первые ~ 1024 различных неизвестных индекса DC). - - **Пример**: - - ```toml - [general] - unknown_dc_file_log_enabled = false - ``` -## "cfg-general-log_level" -- `log_level` - - **Ограничения / валидация**: «отладка», «многословный», «нормальный» или «тихий». - - **Описание**: Уровень детализации журналирования во время выполнения (используется, если RUST_LOG не установлен). Если в среде установлен RUST_LOG, он имеет приоритет над этим параметром. - - **Пример**: - - ```toml - [general] - log_level = "normal" - ``` -## "cfg-general-disable_colors" -- `disable_colors` - - **Ограничения / валидация**: `бул`. - - **Описание**: Отключает цвета ANSI в журналах (полезно для файлов/systemd). Это влияет только на форматирование журнала и не меняет уровень/фильтрацию журнала. - - **Пример**: - - ```toml - [general] - disable_colors = false - ``` -## "cfg-general-me_socks_kdf_policy" -- `me_socks_kdf_policy` - - **Ограничения / валидация**: «строгий» или «совместимый». - - **Описание**: Резервная политика KDF, связанная с SOCKS, для рукопожатия среднего уровня. - - **Пример**: - - ```toml - [general] - me_socks_kdf_policy = "strict" - ``` -## "cfg-general-me_route_backpressure_base_timeout_ms" -- `me_route_backpressure_base_timeout_ms` - - **Ограничения / валидация**: Должно быть в пределах `1..=5000` (миллисекунд). - - **Описание**: Тайм-аут базового противодавления в миллисекундах для отправки по каналу маршрута ME. - - **Пример**: - - ```toml - [general] - me_route_backpressure_base_timeout_ms = 25 - ``` -## "cfg-general-me_route_backpressure_high_timeout_ms" -- `me_route_backpressure_high_timeout_ms` - - **Ограничения / валидация**: Должно быть в пределах `1..=5000` (миллисекунды) и `>= me_route_backpressure_base_timeout_ms`. - - **Описание**: Тайм-аут высокого противодавления в миллисекундах, когда занятость очереди превышает водяной знак. - - **Пример**: - - ```toml - [general] - me_route_backpressure_high_timeout_ms = 120 - ``` -## "cfg-general-me_route_backpressure_high_watermark_pct" -- `me_route_backpressure_high_watermark_pct` - - **Ограничения / валидация**: Должно быть в пределах `1..=100` (процентов). - - **Описание**: Пороговое значение процента занятости очереди для переключения на тайм-аут высокого противодавления. - - **Пример**: - - ```toml - [general] - me_route_backpressure_high_watermark_pct = 80 - ``` -## "cfg-general-me_health_interval_ms_unhealthy" -- `me_health_interval_ms_unhealthy` - - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). - - **Описание**: Интервал мониторинга работоспособности, когда покрытие записи ME ухудшается. - - **Пример**: - - ```toml - [general] - me_health_interval_ms_unhealthy = 1000 - ``` -## "cfg-general-me_health_interval_ms_healthy" -- `me_health_interval_ms_healthy` - - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). - - **Описание**: Интервал мониторинга работоспособности, пока покрытие записи ME стабильно/работоспособно. - - **Пример**: - - ```toml - [general] - me_health_interval_ms_healthy = 3000 - ``` -## "cfg-general-me_admission_poll_ms" -- `me_admission_poll_ms` - - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). - - **Описание**: Интервал опроса для проверок состояния условного приема. - - **Пример**: - - ```toml - [general] - me_admission_poll_ms = 1000 - ``` -## "cfg-general-me_warn_rate_limit_ms" -- `me_warn_rate_limit_ms` - - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). - - **Описание**: Время восстановления повторяющихся журналов предупреждений ME. - - **Пример**: - - ```toml - [general] - me_warn_rate_limit_ms = 5000 - ``` -## "cfg-general-me_route_no_writer_mode" -- `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" - ``` -## "cfg-general-me_route_no_writer_wait_ms" -- `me_route_no_writer_wait_ms` - - **Ограничения / валидация**: Должно быть в пределах `10..=5000` (миллисекунд). - - **Описание**: Максимальное время ожидания, используемое в быстром режиме асинхронного восстановления перед откатом. - - **Пример**: - - ```toml - [general] - me_route_no_writer_wait_ms = 250 - ``` -## "cfg-general-me_route_hybrid_max_wait_ms" -- `me_route_hybrid_max_wait_ms` - - **Ограничения / валидация**: Должно быть в пределах `50..=60000` (миллисекунд). - - **Описание**: Максимальное совокупное время ожидания в гибридном режиме без записи перед отказоустойчивым переходом. - - **Пример**: - - ```toml - [general] - me_route_hybrid_max_wait_ms = 3000 - ``` -## "cfg-general-me_route_blocking_send_timeout_ms" -- `me_route_blocking_send_timeout_ms` - - **Ограничения / валидация**: Должно быть в пределах `0..=5000` (миллисекунд). `0` сохраняет устаревшее неограниченное поведение ожидания. - - **Описание**: Максимальное ожидание блокировки резервной отправки маршрутного канала. - - **Пример**: - - ```toml - [general] - me_route_blocking_send_timeout_ms = 250 - ``` -## "cfg-general-me_route_inline_recovery_attempts" -- `me_route_inline_recovery_attempts` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Количество попыток оперативного восстановления в устаревшем режиме. - - **Пример**: - - ```toml - [general] - me_route_inline_recovery_attempts = 3 - ``` -## "cfg-general-me_route_inline_recovery_wait_ms" -- `me_route_inline_recovery_wait_ms` - - **Ограничения / валидация**: Должно быть в пределах `10..=30000` (миллисекунд). - - **Описание**: Максимальное время ожидания встроенного восстановления в устаревшем режиме. - - **Пример**: - - ```toml - [general] - me_route_inline_recovery_wait_ms = 3000 - ``` -## "cfg-general-fast_mode_min_tls_record" -- `fast_mode_min_tls_record` - - **Ограничения / валидация**: `использовать` (байты). `0` отключает ограничение. - - **Описание**: Минимальный размер записи TLS при включенном объединении в быстром режиме. - - **Пример**: - - ```toml - [general] - fast_mode_min_tls_record = 0 - ``` -## "cfg-general-update_every" -- `update_every` - - **Ограничения / валидация**: `u64` (секунды). Если установлено, должно быть `> 0`. Если этот ключ не установлен явно, можно использовать устаревшие `proxy_secret_auto_reload_secs` и `proxy_config_auto_reload_secs` (их эффективный минимум должен быть `> 0`). - - **Описание**: Единый интервал обновления для задач обновления ME (getProxyConfig, getProxyConfigV6, getProxySecret). Если этот параметр установлен, он переопределяет устаревшие интервалы перезагрузки прокси-сервера. - - **Пример**: - - ```toml - [general] - update_every = 300 - ``` -## "cfg-general-me_reinit_every_secs" -- `me_reinit_every_secs` - - **Ограничения / валидация**: Должно быть `> 0` (секунды). - - **Описание**: Периодический интервал для цикла повторной инициализации ME с нулевым временем простоя. - - **Пример**: - - ```toml - [general] - me_reinit_every_secs = 900 - ``` -## "cfg-general-me_hardswap_warmup_delay_min_ms" -- `me_hardswap_warmup_delay_min_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть `<= me_hardswap_warmup_delay_max_ms`. - - **Описание**: Нижняя граница интервала прогрева жесткой замены. - - **Пример**: - - ```toml - [general] - me_hardswap_warmup_delay_min_ms = 1000 - ``` -## "cfg-general-me_hardswap_warmup_delay_max_ms" -- `me_hardswap_warmup_delay_max_ms` - - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). - - **Описание**: Верхняя граница интервала прогрева жесткой замены. - - **Пример**: - - ```toml - [general] - me_hardswap_warmup_delay_max_ms = 2000 - ``` -## "cfg-general-me_hardswap_warmup_extra_passes" -- `me_hardswap_warmup_extra_passes` - - **Ограничения / валидация**: Должно быть в пределах `[0, 10]`. - - **Описание**: Дополнительные прогрева проходят после базового прохода за один цикл жесткой замены. - - **Пример**: - - ```toml - [general] - # default: 3 (allowed range: 0..=10) - me_hardswap_warmup_extra_passes = 3 - ``` -## "cfg-general-me_hardswap_warmup_pass_backoff_base_ms" -- `me_hardswap_warmup_pass_backoff_base_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть `> 0`. - - **Описание**: Базовая задержка между дополнительными проходами по замене жесткого диска, когда пол еще не завершен. - - **Пример**: - - ```toml - [general] - # default: 500 - me_hardswap_warmup_pass_backoff_base_ms = 500 - ``` -## "cfg-general-me_config_stable_snapshots" -- `me_config_stable_snapshots` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Количество идентичных снимков конфигурации ME, необходимое для применения. - - **Пример**: - - ```toml - [general] - # require 3 identical snapshots before applying ME endpoint map updates - me_config_stable_snapshots = 3 - ``` -## "cfg-general-me_config_apply_cooldown_secs" -- `me_config_apply_cooldown_secs` - - **Ограничения / валидация**: `u64`. - - **Описание**: Время восстановления между примененными обновлениями карты конечных точек ME. `0` отключает время восстановления. - - **Пример**: - - ```toml - [general] - # allow applying stable snapshots immediately (no cooldown) - me_config_apply_cooldown_secs = 0 - ``` -## "cfg-general-me_snapshot_require_http_2xx" -- `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 - ``` -## "cfg-general-me_snapshot_reject_empty_map" -- `me_snapshot_reject_empty_map` - - **Ограничения / валидация**: `бул`. - - **Описание**: Отклоняет пустые снимки конфигурации ME (без конечных точек). Если установлено значение «false», может быть применен пустой снимок (с учетом других ворот), что может временно уменьшить/очистить карту ME. - - **Пример**: - - ```toml - [general] - # allow applying empty snapshots (use with care) - me_snapshot_reject_empty_map = false - ``` -## "cfg-general-me_snapshot_min_proxy_for_lines" -- `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 - ``` -## "cfg-general-proxy_secret_stable_snapshots" -- `proxy_secret_stable_snapshots` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Количество идентичных снимков с секретом прокси-сервера, необходимых перед ротацией. - - **Пример**: - - ```toml - [general] - # require 2 identical getProxySecret snapshots before rotating at runtime - proxy_secret_stable_snapshots = 2 - ``` -## "cfg-general-proxy_secret_rotate_runtime" -- `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 - ``` -## "cfg-general-me_secret_atomic_snapshot" -- `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 - ``` -## "cfg-general-proxy_secret_len_max" -- `proxy_secret_len_max` - - **Ограничения / валидация**: Должно быть в пределах `[32, 4096]`. - - **Описание**: Верхний предел длины (в байтах) принимаемого прокси-секрета во время запуска и обновления среды выполнения. - - **Пример**: - - ```toml - [general] - # default: 256 (bytes) - proxy_secret_len_max = 256 - ``` -## "cfg-general-me_pool_drain_ttl_secs" -- `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 - ``` -## "cfg-general-me_instadrain" -- `me_instadrain` - - **Ограничения / валидация**: `бул`. - - **Описание**: Принудительно удаляет устаревшие записи записи при следующем такте очистки, минуя ожидание TTL/крайнего срока. - - **Пример**: - - ```toml - [general] - # default: false - me_instadrain = false - ``` -## "cfg-general-me_pool_drain_threshold" -- `me_pool_drain_threshold` - - **Ограничения / валидация**: `u64`. Установите значение «0», чтобы отключить очистку на основе пороговых значений. - - **Описание**: Максимальное количество устаревших источников записи, прежде чем самые старые из них будут принудительно закрыты в пакетном режиме. - - **Пример**: - - ```toml - [general] - # default: 32 - me_pool_drain_threshold = 32 - ``` -## "cfg-general-me_pool_drain_soft_evict_enabled" -- `me_pool_drain_soft_evict_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает постепенное мягкое удаление устаревших средств записи во время очистки/повторной инициализации вместо немедленного жесткого закрытия. - - **Пример**: - - ```toml - [general] - # default: true - me_pool_drain_soft_evict_enabled = true - ``` -## "cfg-general-me_pool_drain_soft_evict_grace_secs" -- `me_pool_drain_soft_evict_grace_secs` - - **Ограничения / валидация**: `u64` (секунды). Должно быть в пределах `[0, 3600]`. - - **Описание**: Дополнительная льгота (после слива TTL) перед началом этапа мягкого вытеснения. - - **Пример**: - - ```toml - [general] - # default: 10 - me_pool_drain_soft_evict_grace_secs = 10 - ``` -## "cfg-general-me_pool_drain_soft_evict_per_writer" -- `me_pool_drain_soft_evict_per_writer` - - **Ограничения / валидация**: `1..=16`. - - **Описание**: Максимальное количество устаревших маршрутов, мягко вытесняемых на одного автора за один проход выселения. - - **Пример**: - - ```toml - [general] - # default: 2 - me_pool_drain_soft_evict_per_writer = 2 - ``` -## "cfg-general-me_pool_drain_soft_evict_budget_per_core" -- `me_pool_drain_soft_evict_budget_per_core` - - **Ограничения / валидация**: `1..=64`. - - **Описание**: Бюджет на ядро ​​ограничивает совокупную работу по мягкому вытеснению за проход. - - **Пример**: - - ```toml - [general] - # default: 16 - me_pool_drain_soft_evict_budget_per_core = 16 - ``` -## "cfg-general-me_pool_drain_soft_evict_cooldown_ms" -- `me_pool_drain_soft_evict_cooldown_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть `> 0`. - - **Описание**: Время восстановления между повторяющимися мягкими выселениями одного и того же автора. - - **Пример**: - - ```toml - [general] - # default: 1000 - me_pool_drain_soft_evict_cooldown_ms = 1000 - ``` -## "cfg-general-me_bind_stale_mode" -- `me_bind_stale_mode` - - **Ограничения / валидация**: «никогда», «ttl» или «всегда». - - **Описание**: Политика в отношении новых ограничений для устаревших истощающих авторов. - - **Пример**: - - ```toml - [general] - # allow stale binds only for a limited time window - me_bind_stale_mode = "ttl" - ``` -## "cfg-general-me_bind_stale_ttl_secs" -- `me_bind_stale_ttl_secs` - - **Ограничения / валидация**: `u64`. - - **Описание**: TTL для допуска устаревшей привязки, когда устаревший режим — «ttl». - - **Пример**: - - ```toml - [general] - me_bind_stale_mode = "ttl" - me_bind_stale_ttl_secs = 90 - ``` -## "cfg-general-me_pool_min_fresh_ratio" -- `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 - ``` -## "cfg-general-me_reinit_drain_timeout_secs" -- `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 - ``` -## "cfg-general-proxy_secret_auto_reload_secs" -- `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 - ``` -## "cfg-general-proxy_config_auto_reload_secs" -- `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 - ``` -## "cfg-general-me_reinit_singleflight" -- `me_reinit_singleflight` - - **Ограничения / валидация**: `бул`. - - **Описание**: Сериализует циклы повторной инициализации ME по источникам триггера. - - **Пример**: - - ```toml - [general] - me_reinit_singleflight = true - ``` -## "cfg-general-me_reinit_trigger_channel" -- `me_reinit_trigger_channel` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Емкость очереди триггеров для планировщика повторной инициализации. - - **Пример**: - - ```toml - [general] - me_reinit_trigger_channel = 64 - ``` -## "cfg-general-me_reinit_coalesce_window_ms" -- `me_reinit_coalesce_window_ms` - - **Ограничения / валидация**: `u64`. - - **Описание**: Запустить окно объединения триггеров перед началом повторной инициализации (мс). - - **Пример**: - - ```toml - [general] - me_reinit_coalesce_window_ms = 200 - ``` -## "cfg-general-me_deterministic_writer_sort" -- `me_deterministic_writer_sort` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает детерминированную сортировку кандидатов для пути привязки записи. - - **Пример**: - - ```toml - [general] - me_deterministic_writer_sort = true - ``` -## "cfg-general-me_writer_pick_mode" -- `me_writer_pick_mode` - - **Ограничения / валидация**: `"sorted_rr"` или `"p2c"`. - - **Описание**: Режим выбора записывающего устройства для пути привязки маршрута. - - **Пример**: - - ```toml - [general] - me_writer_pick_mode = "p2c" - ``` -## "cfg-general-me_writer_pick_sample_size" -- `me_writer_pick_sample_size` - - **Ограничения / валидация**: `2..=4`. - - **Описание**: Количество кандидатов, отобранных сборщиком в режиме p2c. - - **Пример**: - - ```toml - [general] - me_writer_pick_mode = "p2c" - me_writer_pick_sample_size = 3 - ``` -## "cfg-general-ntp_check" -- `ntp_check` - - **Ограничения / валидация**: `бул`. - - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения. - - **Пример**: - - ```toml - [general] - ntp_check = true - ``` -## "cfg-general-ntp_servers" -- `ntp_servers` - - **Ограничения / валидация**: `Строка[]`. - - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения. - - **Пример**: - - ```toml - [general] - ntp_servers = ["pool.ntp.org"] - ``` -## "cfg-general-auto_degradation_enabled" -- `auto_degradation_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения. - - **Пример**: - - ```toml - [general] - auto_degradation_enabled = true - ``` -## "cfg-general-degradation_min_unavailable_dc_groups" -- `degradation_min_unavailable_dc_groups` - - **Ограничения / валидация**: `u8`. - - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения. - - **Пример**: - - ```toml - [general] - degradation_min_unavailable_dc_groups = 2 - ``` -## "cfg-general-rst_on_close" -- `rst_on_close` - - **Ограничения / валидация**: одно из `"off"`, `"errors"`, `"always"`. - - **Описание**: Управляет поведением `SO_LINGER(0)` на принятых клиентских TCP-сокетах. - На высоконагруженных прокси-серверах накапливаются `FIN-WAIT-1` и осиротевшие (orphan) сокеты от соединений, которые не завершают Telegram-рукопожатие (сканеры, DPI-зонды, боты). - Эта опция позволяет отправлять немедленный `RST` вместо корректного `FIN` для таких соединений, мгновенно освобождая ресурсы ядра. - - `"off"` — по умолчанию. Обычный `FIN` при закрытии всех соединений; поведение не меняется. - - `"errors"` — `SO_LINGER(0)` устанавливается при `accept()`. Если клиент успешно проходит аутентификацию, linger сбрасывается и relay-сессия закрывается корректно через `FIN`. Соединения, закрытые до завершения рукопожатия (таймауты, ошибки крипто, сканеры), отправляют `RST`. - - `"always"` — `SO_LINGER(0)` устанавливается при `accept()` и никогда не сбрасывается. Все закрытия отправляют `RST` независимо от результата рукопожатия. - - **Пример**: - - ```toml - [general] - rst_on_close = "errors" - ``` - -# [general.modes] - - -| Ключ | Тип | По умолчанию | -| --- | ---- | ------- | -| [`classic`](#cfg-general-modes-classic) | `bool` | `false` | -| [`secure`](#cfg-general-modes-secure) | `bool` | `false` | -| [`tls`](#cfg-general-modes-tls) | `bool` | `true` | - -## "cfg-general-modes-classic" -- `classic` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает классический режим MTProxy. - - **Пример**: - - ```toml - [general.modes] - classic = true - ``` -## "cfg-general-modes-secure" -- `secure` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает безопасный режим. - - **Пример**: - - ```toml - [general.modes] - secure = true - ``` -## "cfg-general-modes-tls" -- `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` | — | - -## "cfg-general-links-show" -- `show` - - **Ограничения / валидация**: `"*"` или `String[]`. Пустой массив означает «не показывать ничего». - - **Описание**: Выбирает пользователей, чьи прокси-ссылки `tg://` отображаются при запуске. - - **Пример**: - - ```toml - [general.links] - show = "*" - # or: - # show = ["alice", "bob"] - ``` -## "cfg-general-links-public_host" -- `public_host` - - **Ограничения / валидация**: `Строка` (необязательно). - - **Описание**: Переопределение общедоступного имени хоста/IP-адреса, используемое для сгенерированных ссылок `tg://` (переопределяет обнаруженный IP-адрес). - - **Пример**: - - ```toml - [general.links] - public_host = "proxy.example.com" - ``` -## "cfg-general-links-public_port" -- `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"` | - -## "cfg-general-telemetry-core_enabled" -- `core_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает основные счетчики телеметрии горячего пути. - - **Пример**: - - ```toml - [general.telemetry] - core_enabled = true - ``` -## "cfg-general-telemetry-user_enabled" -- `user_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает счетчики телеметрии для каждого пользователя. - - **Пример**: - - ```toml - [general.telemetry] - user_enabled = true - ``` -## "cfg-general-telemetry-me_level" -- `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[]` | `[]` | - -## "cfg-network-ipv4" -- `ipv4` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает сеть IPv4. - - **Пример**: - - ```toml - [network] - ipv4 = true - ``` -## "cfg-network-ipv6" -- `ipv6` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает/выключает сеть IPv6. Если этот параметр опущен, по умолчанию используется значение «false». - - **Пример**: - - ```toml - [network] - # enable IPv6 explicitly - ipv6 = true - - # or: disable IPv6 explicitly - # ipv6 = false - ``` -## "cfg-network-prefer" -- `prefer` - - **Ограничения / валидация**: Должно быть `4` или `6`. Если `prefer = 4`, а `ipv4 = false`, Telemt принудительно использует `prefer = 6`. Если `prefer = 6`, а `ipv6 = false`, Telemt принудительно использует `prefer = 4`. - - **Описание**: Предпочтительное семейство IP для выбора, если доступны оба семейства. - - **Пример**: - - ```toml - [network] - prefer = 6 - ``` -## "cfg-network-multipath" -- `multipath` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает многопутевое поведение, если это поддерживается платформой и средой выполнения. - - **Пример**: - - ```toml - [network] - multipath = true - ``` -## "cfg-network-stun_use" -- `stun_use` - - **Ограничения / валидация**: `бул`. - - **Описание**: Глобальный переключатель STUN; если установлено значение «false», проверка STUN отключается и остается только обнаружение без STUN. - - **Пример**: - - ```toml - [network] - stun_use = false - ``` -## "cfg-network-stun_servers" -- `stun_servers` - - **Ограничения / валидация**: `Строка[]`. Значения обрезаются; пустые значения удаляются; список дедуплицируется. Если этот ключ **не** установлен явно, Telemt сохраняет встроенный список STUN по умолчанию. - - **Описание**: Список серверов STUN для обнаружения общедоступных IP-адресов. - - **Пример**: - - ```toml - [network] - stun_servers = [ - "stun.l.google.com:19302", - "stun.stunprotocol.org:3478", - ] - ``` -## "cfg-network-stun_tcp_fallback" -- `stun_tcp_fallback` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает резервный TCP для STUN, когда путь UDP заблокирован/недоступен. - - **Пример**: - - ```toml - [network] - stun_tcp_fallback = true - ``` -## "cfg-network-http_ip_detect_urls" -- `http_ip_detect_urls` - - **Ограничения / валидация**: `Строка[]`. - - **Описание**: Конечные точки HTTP, используемые для обнаружения общедоступных IP-адресов (резервный вариант после STUN). - - **Пример**: - - ```toml - [network] - http_ip_detect_urls = ["https://ifconfig.me/ip", "https://api.ipify.org"] - ``` -## "cfg-network-cache_public_ip_path" -- `cache_public_ip_path` - - **Ограничения / валидация**: `Строка`. - - **Описание**: Путь к файлу, используемый для кэширования обнаруженного общедоступного IP-адреса. - - **Пример**: - - ```toml - [network] - cache_public_ip_path = "cache/public_ip.txt" - ``` -## "cfg-network-dns_overrides" -- `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` | - -## "cfg-server-port" -- `port` - - **Ограничения / валидация**: `u16`. - - **Описание**: Порт прослушивания основного прокси (TCP). - - **Пример**: - - ```toml - [server] - port = 443 - ``` -## "cfg-server-listen_addr_ipv4" -- `listen_addr_ipv4` - - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, это должна быть действительная строка адреса IPv4. - - **Описание**: Адрес привязки IPv4 для прослушивателя TCP (опустите этот ключ, чтобы отключить привязку IPv4). - - **Пример**: - - ```toml - [server] - listen_addr_ipv4 = "0.0.0.0" - ``` -## "cfg-server-listen_addr_ipv6" -- `listen_addr_ipv6` - - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, это должна быть действительная строка адреса IPv6. - - **Описание**: Адрес привязки IPv6 для прослушивателя TCP (опустите этот ключ, чтобы отключить привязку IPv6). - - **Пример**: - - ```toml - [server] - listen_addr_ipv6 = "::" - ``` -## "cfg-server-listen_unix_sock" -- `listen_unix_sock` - - **Ограничения / валидация**: `Строка` (необязательно). Не должно быть пустым, если установлено. Только Юникс. - - **Описание**: Путь сокета Unix для прослушивателя. Если установлено, `server.listen_tcp` по умолчанию имеет значение `false` (если не указано иное явно). - - **Пример**: - - ```toml - [server] - listen_unix_sock = "/run/telemt.sock" - ``` -## "cfg-server-listen_unix_sock_perm" -- `listen_unix_sock_perm` - - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, это должна быть восьмеричная строка разрешения, например `"0666"` или `"0777"`. - - **Описание**: Дополнительные разрешения для файлов сокетов Unix, применяемые после привязки (chmod). Если этот параметр опущен, разрешения не изменяются (наследует umask). - - **Пример**: - - ```toml - [server] - listen_unix_sock = "/run/telemt.sock" - listen_unix_sock_perm = "0666" - ``` -## "cfg-server-listen_tcp" -- `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 - ``` -## "cfg-server-proxy_protocol" -- `proxy_protocol` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает анализ протокола HAProxy PROXY при входящих соединениях (PROXY v1/v2). Если этот параметр включен, исходный адрес клиента берется из заголовка PROXY. - - **Пример**: - - ```toml - [server] - proxy_protocol = true - ``` -## "cfg-server-proxy_protocol_header_timeout_ms" -- `proxy_protocol_header_timeout_ms` - - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). - - **Описание**: Таймаут чтения и анализа заголовков протокола PROXY (мс). - - **Пример**: - - ```toml - [server] - proxy_protocol = true - proxy_protocol_header_timeout_ms = 500 - ``` -## "cfg-server-proxy_protocol_trusted_cidrs" -- `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"] - ``` -## "cfg-server-metrics_port" -- `metrics_port` - - **Ограничения / валидация**: `u16` (необязательно). - - **Описание**: Порт конечной точки метрик, совместимый с Prometheus. Если установлено, включает прослушиватель метрик (поведение привязки можно переопределить с помощью `metrics_listen`). - - **Пример**: - - ```toml - [server] - metrics_port = 9090 - ``` -## "cfg-server-metrics_listen" -- `metrics_listen` - - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, оно должно быть в формате IP:PORT. - - **Описание**: Полный адрес привязки метрик (`IP:PORT`) переопределяет `metrics_port` и привязывается только к указанному адресу. - - **Пример**: - - ```toml - [server] - metrics_listen = "127.0.0.1:9090" - ``` -## "cfg-server-metrics_whitelist" -- `metrics_whitelist` - - **Ограничения / валидация**: `IpNetwork[]`. - - **Описание**: Белый список CIDR для доступа к конечной точке метрик. - - **Пример**: - - ```toml - [server] - metrics_port = 9090 - metrics_whitelist = ["127.0.0.1/32", "::1/128"] - ``` -## "cfg-server-max_connections" -- `max_connections` - - **Ограничения / валидация**: `u32`. `0` означает неограниченный. - - **Описание**: Максимальное количество одновременных клиентских подключений. - - **Пример**: - - ```toml - [server] - max_connections = 10000 - ``` -## "cfg-server-accept_permit_timeout_ms" -- `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` | - -## "cfg-server-conntrack_control-inline_conntrack_control" -- `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 - ``` -## "cfg-server-conntrack_control-mode" -- `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" - ``` -## "cfg-server-conntrack_control-backend" -- `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" - ``` -## "cfg-server-conntrack_control-profile" -- `profile` - - **Ограничения / валидация**: Один из «консервативных», «сбалансированных», «агрессивных» (без учета регистра; сериализованный нижний регистр). - - **Описание**: Когда **режим давления conntrack** активен (водяные знаки `pressure_*`), ограничиваются тайм-ауты простоя и активности, чтобы уменьшить отток коннтреков: например. **первый байт простоя клиента** (`client.rs`), **тайм-аут активности прямой ретрансляции** (`direct_relay.rs`) и **политика простоя среднего реле** (`middle_relay.rs` через `ConntrackPressureProfile::*_cap_secs` / `direct_activity_timeout_secs`). В более агрессивных профилях используются более короткие заглушки. - - **Пример**: - - ```toml - [server.conntrack_control] - profile = "balanced" - ``` -## "cfg-server-conntrack_control-hybrid_listener_ips" -- `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"] - ``` -## "cfg-server-conntrack_control-pressure_high_watermark_pct" -- `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 - ``` -## "cfg-server-conntrack_control-pressure_low_watermark_pct" -- `pressure_low_watermark_pct` - - **Ограничения / валидация**: Должно быть **строго меньше** `pressure_high_watermark_pct`. - - **Описание**: Режим давления **сбрасывается** только после **трех** последовательных односекундных выборок, когда все сигналы находятся на уровне этой нижней границы или ниже, а дельты времени ожидания приема/ME-очереди равны нулю (гистерезис). - - **Пример**: - - ```toml - [server.conntrack_control] - pressure_low_watermark_pct = 70 - ``` -## "cfg-server-conntrack_control-delete_budget_per_sec" -- `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` | - -## "cfg-server-api-enabled" -- `enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает REST API плоскости управления. - - **Пример**: - - ```toml - [server.api] - enabled = true - ``` -## "cfg-server-api-listen" -- `listen` - - **Ограничения / валидация**: `Строка`. Должен быть в формате IP:PORT. - - **Описание**: Адрес привязки API в формате IP:PORT. - - **Пример**: - - ```toml - [server.api] - listen = "0.0.0.0:9091" - ``` -## "cfg-server-api-whitelist" -- `whitelist` - - **Ограничения / валидация**: `IpNetwork[]`. - - **Описание**: Белый список CIDR разрешил доступ к API. - - **Пример**: - - ```toml - [server.api] - whitelist = ["127.0.0.0/8"] - ``` -## "cfg-server-api-auth_header" -- `auth_header` - - **Ограничения / валидация**: `Строка`. Пустая строка отключает проверку заголовка аутентификации. - - **Описание**: Точное ожидаемое значение заголовка `Authorization` (статический общий секрет). - - **Пример**: - - ```toml - [server.api] - auth_header = "Bearer MY_TOKEN" - ``` -## "cfg-server-api-request_body_limit_bytes" -- `request_body_limit_bytes` - - **Ограничения / валидация**: Должно быть `> 0` (байты). - - **Описание**: Максимальный принимаемый размер тела HTTP-запроса (в байтах). - - **Пример**: - - ```toml - [server.api] - request_body_limit_bytes = 65536 - ``` -## "cfg-server-api-minimal_runtime_enabled" -- `minimal_runtime_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает минимальную логику конечной точки снимков времени выполнения. - - **Пример**: - - ```toml - [server.api] - minimal_runtime_enabled = true - ``` -## "cfg-server-api-minimal_runtime_cache_ttl_ms" -- `minimal_runtime_cache_ttl_ms` - - **Ограничения / валидация**: `0..=60000` (миллисекунды). `0` отключает кеш. - - **Описание**: Срок жизни кэша для минимальных снимков времени выполнения (мс). - - **Пример**: - - ```toml - [server.api] - minimal_runtime_cache_ttl_ms = 1000 - ``` -## "cfg-server-api-runtime_edge_enabled" -- `runtime_edge_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает конечные точки границ среды выполнения. - - **Пример**: - - ```toml - [server.api] - runtime_edge_enabled = false - ``` -## "cfg-server-api-runtime_edge_cache_ttl_ms" -- `runtime_edge_cache_ttl_ms` - - **Ограничения / валидация**: `0..=60000` (миллисекунды). - - **Описание**: Срок жизни кэша для полезных данных агрегации границ во время выполнения (мс). - - **Пример**: - - ```toml - [server.api] - runtime_edge_cache_ttl_ms = 1000 - ``` -## "cfg-server-api-runtime_edge_top_n" -- `runtime_edge_top_n` - - **Ограничения / валидация**: `1..=1000`. - - **Описание**: Размер Top-N для таблицы лидеров краевых соединений. - - **Пример**: - - ```toml - [server.api] - runtime_edge_top_n = 10 - ``` -## "cfg-server-api-runtime_edge_events_capacity" -- `runtime_edge_events_capacity` - - **Ограничения / валидация**: `16..=4096`. - - **Описание**: Емкость кольцевого буфера для пограничных событий во время выполнения. - - **Пример**: - - ```toml - [server.api] - runtime_edge_events_capacity = 256 - ``` -## "cfg-server-api-read_only" -- `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` | - -## "cfg-server-listeners-ip" -- `ip` - - **Ограничения / валидация**: Обязательное поле. Должен быть IPAddr. - - **Описание**: IP-адрес привязки прослушивателя. - - **Пример**: - - ```toml - [[server.listeners]] - ip = "0.0.0.0" - ``` -## "cfg-server-listeners-announce" -- `announce` - - **Ограничения / валидация**: `Строка` (необязательно). Не должно быть пустым, если установлено. - - **Описание**: Публичный IP-адрес/домен, объявленный в прокси-ссылках для этого прослушивателя. Имеет приоритет над announce_ip. - - **Пример**: - - ```toml - [[server.listeners]] - ip = "0.0.0.0" - announce = "proxy.example.com" - ``` -## "cfg-server-listeners-announce_ip" -- `announce_ip` - - **Ограничения / валидация**: `IpAddr` (необязательно). Устарело. Используйте «объявить». - - **Описание**: Устаревший устаревший IP-адрес объявления. Во время загрузки конфигурации он переводится в «announce», если «announce» не установлен. - - **Пример**: - - ```toml - [[server.listeners]] - ip = "0.0.0.0" - announce_ip = "203.0.113.10" - ``` -## "cfg-server-listeners-proxy_protocol" -- `proxy_protocol` - - **Ограничения / валидация**: `bool` (необязательно). Если установлено, переопределяет `server.proxy_protocol` для этого прослушивателя. - - **Описание**: Переопределение протокола PROXY для каждого слушателя. - - **Пример**: - - ```toml - [server] - proxy_protocol = false - - [[server.listeners]] - ip = "0.0.0.0" - proxy_protocol = true - ``` -## "cfg-server-listeners-reuse_allow" -- `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` | - -## "cfg-timeouts-client_handshake" -- `client_handshake` - - **Ограничения / валидация**: Должно быть `> 0`. Значение указано в секундах. Также используется в качестве верхней границы некоторых задержек эмуляции TLS (см. `censorship.server_hello_delay_max_ms`). - - **Описание**: Тайм-аут установления связи клиента (в секундах). - - **Пример**: - - ```toml - [timeouts] - client_handshake = 30 - ``` -## "cfg-timeouts-relay_idle_policy_v2_enabled" -- `relay_idle_policy_v2_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает политику простоя клиента среднего/жесткого промежуточного реле. - - **Пример**: - - ```toml - [timeouts] - relay_idle_policy_v2_enabled = true - ``` -## "cfg-timeouts-relay_client_idle_soft_secs" -- `relay_client_idle_soft_secs` - - **Ограничения / валидация**: Должно быть `> 0`; должно быть `<=lay_client_idle_hard_secs`. - - **Описание**: Порог мягкого простоя (в секундах) для неактивности восходящей линии связи клиента среднего ретранслятора. Достижение этого порога отмечает сеанс как бездействующего кандидата (в зависимости от политики он может подлежать очистке). - - **Пример**: - - ```toml - [timeouts] - relay_client_idle_soft_secs = 120 - ``` -## "cfg-timeouts-relay_client_idle_hard_secs" -- `relay_client_idle_hard_secs` - - **Ограничения / валидация**: Должно быть `> 0`; должно быть `>=lay_client_idle_soft_secs`. - - **Описание**: Порог жесткого простоя (в секундах) для неактивности восходящей линии связи клиента среднего ретранслятора. Достижение этого порога закрывает сессию. - - **Пример**: - - ```toml - [timeouts] - relay_client_idle_hard_secs = 360 - ``` -## "cfg-timeouts-relay_idle_grace_after_downstream_activity_secs" -- `relay_idle_grace_after_downstream_activity_secs` - - **Ограничения / валидация**: Должно быть `<=lay_client_idle_hard_secs`. - - **Описание**: Дополнительный льготный период жесткого простоя (в секундах), добавленный после недавней активности в нисходящем направлении. - - **Пример**: - - ```toml - [timeouts] - relay_idle_grace_after_downstream_activity_secs = 30 - ``` -## "cfg-timeouts-tg_connect" -- `tg_connect` - - **Ограничения / валидация**: `u64`. Значение указано в секундах. - - **Описание**: Тайм-аут восходящего соединения Telegram (в секундах). - - **Пример**: - - ```toml - [timeouts] - tg_connect = 10 - ``` -## "cfg-timeouts-client_keepalive" -- `client_keepalive` - - **Ограничения / валидация**: `u64`. Значение указано в секундах. - - **Описание**: Тайм-аут поддержки активности клиента (в секундах). - - **Пример**: - - ```toml - [timeouts] - client_keepalive = 15 - ``` -## "cfg-timeouts-client_ack" -- `client_ack` - - **Ограничения / валидация**: `u64`. Значение указано в секундах. - - **Описание**: Таймаут подтверждения клиента (в секундах). - - **Пример**: - - ```toml - [timeouts] - client_ack = 90 - ``` -## "cfg-timeouts-me_one_retry" -- `me_one_retry` - - **Ограничения / валидация**: `u8`. - - **Описание**: Бюджет попыток быстрого повторного подключения для сценариев DC с одной конечной точкой. - - **Пример**: - - ```toml - [timeouts] - me_one_retry = 12 - ``` -## "cfg-timeouts-me_one_timeout_ms" -- `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"`, `"mask"`, `"accept"` | `"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` | - -## "cfg-censorship-tls_domain" -- `tls_domain` - - **Ограничения / валидация**: Должно быть непустое доменное имя. Не должно содержать пробелов или `/`. - - **Описание**: Основной домен TLS, используемый в профиле подтверждения FakeTLS и в качестве домена SNI по умолчанию. - - **Пример**: - - ```toml - [censorship] - tls_domain = "example.com" - ``` -## "cfg-censorship-tls_domains" -- `tls_domains` - - **Ограничения / валидация**: `Строка[]`. Если установлено, значения объединяются с tls_domain и дедуплицируются (первичный tls_domain всегда остается первым). - - **Описание**: Дополнительные домены TLS для создания нескольких прокси-ссылок. - - **Пример**: - - ```toml - [censorship] - tls_domain = "example.com" - tls_domains = ["example.net", "example.org"] - ``` -## "cfg-censorship-unknown_sni_action" -- `unknown_sni_action` - - **Ограничения / валидация**: «drop», «mask» или «accept». - - **Описание**: Действие для TLS ClientHello с неизвестным/ненастроенным SNI. - - **Пример**: - - ```toml - [censorship] - unknown_sni_action = "drop" - ``` -## "cfg-censorship-tls_fetch_scope" -- `tls_fetch_scope` - - **Ограничения / валидация**: `Строка`. Значение обрезается во время загрузки; whitespace-only становится пустым. - - **Описание**: Тег области восходящего потока, используемый для выборки метаданных TLS-фронт. Пустое значение сохраняет поведение восходящей маршрутизации по умолчанию. - - **Пример**: - - ```toml - [censorship] - tls_fetch_scope = "fetch" - ``` -## "cfg-censorship-tls_fetch" -- `tls_fetch` - - **Ограничения / валидация**: Стол. См. раздел «[censorship.tls_fetch]» ниже. - - **Описание**: Настройки стратегии выборки метаданных TLS (начальная загрузка + поведение обновления для данных эмуляции TLS). - - **Пример**: - - ```toml - [censorship.tls_fetch] - strict_route = true - attempt_timeout_ms = 5000 - total_budget_ms = 15000 - ``` -## "cfg-censorship-mask" -- `mask` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает режим маскировки/переднего реле. - - **Пример**: - - ```toml - [censorship] - mask = true - ``` -## "cfg-censorship-mask_host" -- `mask_host` - - **Ограничения / валидация**: `Строка` (необязательно). -- Если установлена ​​маска_unix_sock, маска_хост должна быть опущена (взаимоисключающая). -- Если `mask_host` не установлен и `mask_unix_sock` не установлен, Telemt по умолчанию устанавливает для `mask_host` значение `tls_domain`. - - **Описание**: Хост восходящей маски для фронтального реле TLS. - - **Пример**: - - ```toml - [censorship] - mask_host = "www.cloudflare.com" - ``` -## "cfg-censorship-mask_port" -- `mask_port` - - **Ограничения / валидация**: `u16`. - - **Описание**: Восходящий порт маски для фронтального реле TLS. - - **Пример**: - - ```toml - [censorship] - mask_port = 443 - ``` -## "cfg-censorship-mask_unix_sock" -- `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" - ``` -## "cfg-censorship-fake_cert_len" -- `fake_cert_len` - - **Ограничения / валидация**: `использовать`. Когда `tls_emulation = false` и используется значение по умолчанию, Telemt может рандомизировать его при запуске для обеспечения вариативности. - - **Описание**: Длина полезных данных синтетического сертификата, когда данные эмуляции недоступны. - - **Пример**: - - ```toml - [censorship] - fake_cert_len = 2048 - ``` -## "cfg-censorship-tls_emulation" -- `tls_emulation` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает эмуляцию поведения сертификата/TLS из кэшированных реальных фронтов. - - **Пример**: - - ```toml - [censorship] - tls_emulation = true - ``` -## "cfg-censorship-tls_front_dir" -- `tls_front_dir` - - **Ограничения / валидация**: `Строка`. - - **Описание**: Путь к каталогу для хранения переднего кэша TLS. - - **Пример**: - - ```toml - [censorship] - tls_front_dir = "tlsfront" - ``` -## "cfg-censorship-server_hello_delay_min_ms" -- `server_hello_delay_min_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). - - **Описание**: Минимальная задержка server_hello для защиты от отпечатков пальцев (мс). - - **Пример**: - - ```toml - [censorship] - server_hello_delay_min_ms = 0 - ``` -## "cfg-censorship-server_hello_delay_max_ms" -- `server_hello_delay_max_ms` - - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть \(<\) `timeouts.client_handshake * 1000`. - - **Описание**: Максимальная задержка `server_hello` для защиты от отпечатков пальцев (мс). - - **Пример**: - - ```toml - [timeouts] - client_handshake = 30 - - [censorship] - server_hello_delay_max_ms = 0 - ``` -## "cfg-censorship-tls_new_session_tickets" -- `tls_new_session_tickets` - - **Ограничения / валидация**: `u8`. - - **Описание**: Количество сообщений NewSessionTicket, отправляемых после рукопожатия. - - **Пример**: - - ```toml - [censorship] - tls_new_session_tickets = 0 - ``` -## "cfg-censorship-tls_full_cert_ttl_secs" -- `tls_full_cert_ttl_secs` - - **Ограничения / валидация**: `u64` (секунды). - - **Описание**: TTL для отправки полной полезной нагрузки сертификата для каждого кортежа (домен, IP-адрес клиента). - - **Пример**: - - ```toml - [censorship] - tls_full_cert_ttl_secs = 90 - ``` -## "cfg-censorship-alpn_enforce" -- `alpn_enforce` - - **Ограничения / валидация**: `бул`. - - **Описание**: Обеспечивает поведение эха ALPN в зависимости от предпочтений клиента. - - **Пример**: - - ```toml - [censorship] - alpn_enforce = true - ``` -## "cfg-censorship-mask_proxy_protocol" -- `mask_proxy_protocol` - - **Ограничения / валидация**: `u8`. `0` = отключено, `1` = v1 (текст), `2` = v2 (двоичный). - - **Описание**: Отправляет заголовок протокола PROXY при подключении к серверной части маски, позволяя серверной части видеть реальный IP-адрес клиента. - - **Пример**: - - ```toml - [censorship] - mask_proxy_protocol = 0 - ``` -## "cfg-censorship-mask_shape_hardening" -- `mask_shape_hardening` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает усиление жесткости канала формы клиента->маски путем применения контролируемого заполнения хвоста к границам сегмента при отключении реле маски. - - **Пример**: - - ```toml - [censorship] - mask_shape_hardening = true - ``` -## "cfg-censorship-mask_shape_hardening_aggressive_mode" -- `mask_shape_hardening_aggressive_mode` - - **Ограничения / валидация**: Требуется «mask_shape_hardening = true». - - **Описание**: Включите агрессивный профиль формирования (более сильное антиклассификаторское поведение с различной семантикой формирования). - - **Пример**: - - ```toml - [censorship] - mask_shape_hardening = true - mask_shape_hardening_aggressive_mode = false - ``` -## "cfg-censorship-mask_shape_bucket_floor_bytes" -- `mask_shape_bucket_floor_bytes` - - **Ограничения / валидация**: Должно быть `> 0`; должно быть `<= Mask_shape_bucket_cap_bytes`. - - **Описание**: Минимальный размер ковша, используемый при закалке в форме канала. - - **Пример**: - - ```toml - [censorship] - mask_shape_bucket_floor_bytes = 512 - ``` -## "cfg-censorship-mask_shape_bucket_cap_bytes" -- `mask_shape_bucket_cap_bytes` - - **Ограничения / валидация**: Должно быть `>= Mask_shape_bucket_floor_bytes`. - - **Описание**: Максимальный размер ковша, используемый при фасонно-канальной закалке; трафик, превышающий ограничение, не дополняется дальше. - - **Пример**: - - ```toml - [censorship] - mask_shape_bucket_cap_bytes = 4096 - ``` -## "cfg-censorship-mask_shape_above_cap_blur" -- `mask_shape_above_cap_blur` - - **Ограничения / валидация**: Требуется «mask_shape_hardening = true». - - **Описание**: Добавляет ограниченные рандомизированные хвостовые байты, даже если пересылаемый размер уже превышает ограничение. - - **Пример**: - - ```toml - [censorship] - mask_shape_hardening = true - mask_shape_above_cap_blur = false - ``` -## "cfg-censorship-mask_shape_above_cap_blur_max_bytes" -- `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 - ``` -## "cfg-censorship-mask_relay_max_bytes" -- `mask_relay_max_bytes` - - **Ограничения / валидация**: Должно быть `> 0`; должно быть `<= 67108864`. - - **Описание**: Максимальное количество ретранслируемых байтов в каждом направлении по резервному пути маскировки без аутентификации. - - **Пример**: - - ```toml - [censorship] - mask_relay_max_bytes = 5242880 - ``` -## "cfg-censorship-mask_classifier_prefetch_timeout_ms" -- `mask_classifier_prefetch_timeout_ms` - - **Ограничения / валидация**: Должно быть в пределах `[5, 50]` (миллисекунды). - - **Описание**: Бюджет тайм-аута (мс) для расширения фрагментированного начального окна классификатора при откате маскирования. - - **Пример**: - - ```toml - [censorship] - mask_classifier_prefetch_timeout_ms = 5 - ``` -## "cfg-censorship-mask_timing_normalization_enabled" -- `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 - ``` -## "cfg-censorship-mask_timing_normalization_floor_ms" -- `mask_timing_normalization_floor_ms` - - **Ограничения / валидация**: Должно быть `> 0`, если нормализация времени включена; должно быть `<= Mask_timing_normalization_ceiling_ms`. - - **Описание**: Нижняя граница (мс) для маскировки цели нормализации результата. - - **Пример**: - - ```toml - [censorship] - mask_timing_normalization_floor_ms = 0 - ``` -## "cfg-censorship-mask_timing_normalization_ceiling_ms" -- `mask_timing_normalization_ceiling_ms` - - **Ограничения / валидация**: Должно быть `>= Mask_timing_normalization_floor_ms`; должно быть `<= 60000`. - - **Описание**: Верхняя граница (мс) для маскировки цели нормализации результата. - - **Пример**: - - ```toml - [censorship] - mask_timing_normalization_ceiling_ms = 0 - ``` - -## 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` - -Если ваша серверная часть или сеть сильно ограничена в пропускной способности, сначала уменьшите ограничение. Если датчики все еще слишком различимы в вашей среде, постепенно увеличивайте минимальное значение. - -# [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` | - -## "cfg-censorship-tls_fetch-profiles" -- `profiles` - - **Ограничения / валидация**: `Строка[]`. Пустой список возвращает значения по умолчанию; значения дедуплицируются с сохранением порядка. - - **Описание**: Упорядоченная резервная цепочка профиля ClientHello для выборки метаданных TLS-фронт. - - **Пример**: - - ```toml - [censorship.tls_fetch] - profiles = ["modern_chrome_like", "compat_tls12"] - ``` -## "cfg-censorship-tls_fetch-strict_route" -- `strict_route` - - **Ограничения / валидация**: `бул`. - - **Описание**: Если true и восходящий маршрут настроен, выборка TLS не закрывается из-за ошибок восходящего соединения вместо возврата к прямому TCP. - - **Пример**: - - ```toml - [censorship.tls_fetch] - strict_route = true - ``` -## "cfg-censorship-tls_fetch-attempt_timeout_ms" -- `attempt_timeout_ms` - - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). - - **Описание**: Бюджет таймаута на одну попытку получения профиля TLS (мс). - - **Пример**: - - ```toml - [censorship.tls_fetch] - attempt_timeout_ms = 5000 - ``` -## "cfg-censorship-tls_fetch-total_budget_ms" -- `total_budget_ms` - - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). - - **Описание**: Общий бюджет настенных часов для всех попыток TLS-выборки (мс). - - **Пример**: - - ```toml - [censorship.tls_fetch] - total_budget_ms = 15000 - ``` -## "cfg-censorship-tls_fetch-grease_enabled" -- `grease_enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает случайные значения в стиле GREASE в выбранных расширениях ClientHello для получения трафика. - - **Пример**: - - ```toml - [censorship.tls_fetch] - grease_enabled = false - ``` -## "cfg-censorship-tls_fetch-deterministic" -- `deterministic` - - **Ограничения / валидация**: `бул`. - - **Описание**: Включает детерминированную случайность ClientHello для отладки/тестирования. - - **Пример**: - - ```toml - [censorship.tls_fetch] - deterministic = false - ``` -## "cfg-censorship-tls_fetch-profile_cache_ttl_secs" -- `profile_cache_ttl_secs` - - **Ограничения / валидация**: `u64` (секунды). `0` отключает кеш. - - **Описание**: TTL для записей кэша профиля победителя, используемых путем выборки TLS. - - **Пример**: - - ```toml - [censorship.tls_fetch] - profile_cache_ttl_secs = 600 - ``` - - -# [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` | - -## "cfg-access-users" -- `users` - - **Ограничения / валидация**: Не должно быть пустым (должен существовать хотя бы один пользователь). Каждое значение должно состоять **ровно из 32 шестнадцатеричных символов**. - - **Описание**: Карта учетных данных пользователя, используемая для аутентификации клиента. Ключи — это имена пользователей; значения являются секретами MTProxy. - - **Пример**: - - ```toml - [access.users] - alice = "00112233445566778899aabbccddeeff" - bob = "0123456789abcdef0123456789abcdef" - ``` -## "cfg-access-user_ad_tags" -- `user_ad_tags` - - **Ограничения / валидация**: Каждое значение должно содержать **ровно 32 шестнадцатеричных символа** (тот же формат, что и `general.ad_tag`). Тег со всеми нулями разрешен, но регистрирует предупреждение. - - **Описание**: Переопределение рекламного тега спонсируемого канала для каждого пользователя. Когда у пользователя есть запись здесь, она имеет приоритет над `general.ad_tag`. - - **Пример**: - - ```toml - [general] - ad_tag = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - - [access.user_ad_tags] - alice = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" - ``` -## "cfg-access-user_max_tcp_conns" -- `user_max_tcp_conns` - - **Ограничения / валидация**: `Карта`. - - **Описание**: Максимальное количество одновременных TCP-соединений для каждого пользователя. - - **Пример**: - - ```toml - [access.user_max_tcp_conns] - alice = 500 - ``` -## "cfg-access-user_max_tcp_conns_global_each" -- `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 - ``` -## "cfg-access-user_expirations" -- `user_expirations` - - **Ограничения / валидация**: `Карта>`. Каждое значение должно быть допустимой датой и временем RFC3339/ISO-8601. - - **Описание**: Временные метки истечения срока действия учетной записи пользователя (UTC). - - **Пример**: - - ```toml - [access.user_expirations] - alice = "2026-12-31T23:59:59Z" - ``` -## "cfg-access-user_data_quota" -- `user_data_quota` - - **Ограничения / валидация**: `Карта`. - - **Описание**: Квота трафика на пользователя в байтах. - - **Пример**: - - ```toml - [access.user_data_quota] - alice = 1073741824 # 1 GiB - ``` -## "cfg-access-user_max_unique_ips" -- `user_max_unique_ips` - - **Ограничения / валидация**: `Карта`. - - **Описание**: Ограничения на уникальные исходные IP-адреса для каждого пользователя. - - **Пример**: - - ```toml - [access.user_max_unique_ips] - alice = 16 - ``` -## "cfg-access-user_max_unique_ips_global_each" -- `user_max_unique_ips_global_each` - - **Ограничения / валидация**: `использовать`. `0` отключает унаследованный лимит. - - **Описание**: Глобальный лимит уникального IP-адреса для каждого пользователя применяется, когда у пользователя нет индивидуального переопределения в `[access.user_max_unique_ips]`. - - **Пример**: - - ```toml - [access] - user_max_unique_ips_global_each = 8 - ``` -## "cfg-access-user_max_unique_ips_mode" -- `user_max_unique_ips_mode` - - **Ограничения / валидация**: Должно быть одно из «active_window», «time_window», «combined». - - **Описание**: Режим учета лимита уникальных IP-адресов источника. - - **Пример**: - - ```toml - [access] - user_max_unique_ips_mode = "active_window" - ``` -## "cfg-access-user_max_unique_ips_window_secs" -- `user_max_unique_ips_window_secs` - - **Ограничения / валидация**: Должно быть `> 0`. - - **Описание**: Размер окна (в секундах), используемый режимами учета уникальных IP-адресов, включающими временное окно («time_window» и «комбинированный»). - - **Пример**: - - ```toml - [access] - user_max_unique_ips_window_secs = 30 - ``` -## "cfg-access-replay_check_len" -- `replay_check_len` - - **Ограничения / валидация**: `использовать`. - - **Описание**: Длина хранилища для защиты от повторения (количество записей, отслеживаемых на предмет обнаружения дубликатов). - - **Пример**: - - ```toml - [access] - replay_check_len = 65536 - ``` -## "cfg-access-replay_window_secs" -- `replay_window_secs` - - **Ограничения / валидация**: `u64`. - - **Описание**: Временное окно защиты от повтора в секундах. - - **Пример**: - - ```toml - [access] - replay_window_secs = 120 - ``` -## "cfg-access-ignore_time_skew" -- `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` | — | - -## "cfg-upstreams-type" -- `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" - ``` -## "cfg-upstreams-weight" -- `weight` - - **Ограничения / валидация**: `u16` (0..=65535). - - **Описание**: Базовый вес, используемый взвешенно-случайным выбором в восходящем направлении (выше = выбирается чаще). - - **Пример**: - - ```toml - [[upstreams]] - type = "direct" - weight = 10 - ``` -## "cfg-upstreams-enabled" -- `enabled` - - **Ограничения / валидация**: `бул`. - - **Описание**: Если установлено значение false, эта запись игнорируется и не используется для выбора в восходящем направлении. - - **Пример**: - - ```toml - [[upstreams]] - type = "socks5" - address = "127.0.0.1:9050" - enabled = false - ``` -## "cfg-upstreams-scopes" -- `scopes` - - **Ограничения / валидация**: `Строка`. Список, разделенный запятыми; пробелы обрезаются во время сопоставления. - - **Описание**: Теги области, используемые для восходящей фильтрации на уровне запроса. Если в запросе указана область, могут быть выбраны только восходящие потоки, чьи `области` содержат этот тег. Если в запросе не указана область, допускаются только восходящие потоки с пустыми «областями». - - **Пример**: - - ```toml - [[upstreams]] - type = "socks4" - address = "10.0.0.10:1080" - scopes = "me, fetch, dc2" - ``` -## "cfg-upstreams-interface" -- `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 - ``` -## "cfg-upstreams-bind_addresses" -- `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"] - ``` -## "cfg-upstreams-url" -- `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" - ``` -## "cfg-upstreams-address" -- `address` - - **Ограничения / валидация**: Требуется для `type = "socks4"` и `type = "socks5"`. Должно быть `host:port` или `ip:port`. - - **Описание**: Конечная точка прокси-сервера SOCKS, используемая для восходящих подключений. - - **Пример**: - - ```toml - [[upstreams]] - type = "socks5" - address = "127.0.0.1:9050" - ``` -## "cfg-upstreams-user_id" -- `user_id` - - **Ограничения / валидация**: `Строка` (необязательно). Только для `type="socks4"`. - - **Описание**: Идентификатор пользователя SOCKS4 CONNECT. Примечание. Когда выбрана область запроса, Telemt может переопределить ее с помощью выбранного значения области. - - **Пример**: - - ```toml - [[upstreams]] - type = "socks4" - address = "127.0.0.1:1080" - user_id = "telemt" - ``` -## "cfg-upstreams-username" -- `username` - - **Ограничения / валидация**: `Строка` (необязательно). Только для `type="socks5"`. - - **Описание**: Имя пользователя SOCKS5 (для аутентификации по имени пользователя и паролю). Примечание. Когда выбрана область запроса, Telemt может переопределить ее с помощью выбранного значения области. - - **Пример**: - - ```toml - [[upstreams]] - type = "socks5" - address = "127.0.0.1:9050" - username = "alice" - ``` -## "cfg-upstreams-password" -- `password` - - **Ограничения / валидация**: `Строка` (необязательно). Только для `type="socks5"`. - - **Описание**: Пароль SOCKS5 (для аутентификации по имени пользователя и паролю). Примечание. Когда выбрана область запроса, Telemt может переопределить ее с помощью выбранного значения области. - - **Пример**: - - ```toml - [[upstreams]] - type = "socks5" - address = "127.0.0.1:9050" - username = "alice" - password = "secret" - ``` - - +# Справочник параметров конфигурации Telemt + +В этом документе перечислены все ключи конфигурации, принимаемые `config.toml`. + +> [!NOTE] +> +> Этот справочник был составлен с помощью искусственного интеллекта и сверен с базой кода (схема конфигурации, значения по умолчанию и логика проверки). + +> [!WARNING] +> +> Параметры конфигурации, подробно описанные в этом документе, предназначены для опытных пользователей и для целей тонкой настройки. Изменение этих параметров без четкого понимания их функции может привести к нестабильности приложения или другому неожиданному поведению. Пожалуйста, действуйте осторожно и на свой страх и риск. + +# Содержание + - [Ключи верхнего уровня](#top-level-keys) + - [general](#general) + - [general.modes](#generalmodes) + - [general.links](#generallinks) + - [general.telemetry](#generaltelemetry) + - [network](#network) + - [server](#server) + - [server.conntrack_control](#serverconntrack_control) + - [server.api](#serverapi) + - [server.listeners](#serverlisteners) + - [timeouts](#timeouts) + - [censorship](#censorship) + - [censorship.tls_fetch](#censorshiptls_fetch) + - [access](#access) + - [upstreams](#upstreams) + +# Ключи верхнего уровня + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`include`](#include) | `String` (специальная директива) | — | +| [`show_link`](#show_link) | `"*"` or `String[]` | `[]` (`ShowLink::None`) | +| [`dc_overrides`](#dc_overrides) | `Map` | `{}` | +| [`default_dc`](#default_dc) | `u8` | — (эффективный резервный вариант: `2` в ME маршрутизации) | + +## 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 + - **Ограничения / валидация**: значение должно быть положительным целым числом в формате строки (например, `"203"`). Значения разбираются как `SocketAddr` (`ip:port`). Пустые строки игнорируются. + - **Описание**: Переопределяет DC эндпоинты для нестандартных DC; задается в виде строки с индексом DC, значение — один или несколько адресов `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; Middle-end маршрутизация возвращается к значению «2», если она не установлена. + - **Описание**: Индекс DC по умолчанию, используемый для нестандартных DC. Когда клиент запрашивает неизвестный/нестандартный DC без переопределения, направлять его в этот кластер по умолчанию. + - **Пример**: + + ```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`](#data_path) | `String` | — | +| [`prefer_ipv6`](#prefer_ipv6) | `bool` | `false` | +| [`fast_mode`](#fast_mode) | `bool` | `true` | +| [`use_middle_proxy`](#use_middle_proxy) | `bool` | `true` | +| [`proxy_secret_path`](#proxy_secret_path) | `String` | `"proxy-secret"` | +| [`proxy_config_v4_cache_path`](#proxy_config_v4_cache_path) | `String` | `"cache/proxy-config-v4.txt"` | +| [`proxy_config_v6_cache_path`](#proxy_config_v6_cache_path) | `String` | `"cache/proxy-config-v6.txt"` | +| [`ad_tag`](#ad_tag) | `String` | — | +| [`middle_proxy_nat_ip`](#middle_proxy_nat_ip) | `IpAddr` | — | +| [`middle_proxy_nat_probe`](#middle_proxy_nat_probe) | `bool` | `true` | +| [`middle_proxy_nat_stun`](#middle_proxy_nat_stun) | `String` | — | +| [`middle_proxy_nat_stun_servers`](#middle_proxy_nat_stun_servers) | `String[]` | `[]` | +| [`stun_nat_probe_concurrency`](#stun_nat_probe_concurrency) | `usize` | `8` | +| [`middle_proxy_pool_size`](#middle_proxy_pool_size) | `usize` | `8` | +| [`middle_proxy_warm_standby`](#middle_proxy_warm_standby) | `usize` | `16` | +| [`me_init_retry_attempts`](#me_init_retry_attempts) | `u32` | `0` | +| [`me2dc_fallback`](#me2dc_fallback) | `bool` | `true` | +| [`me2dc_fast`](#me2dc_fast) | `bool` | `false` | +| [`me_keepalive_enabled`](#me_keepalive_enabled) | `bool` | `true` | +| [`me_keepalive_interval_secs`](#me_keepalive_interval_secs) | `u64` | `8` | +| [`me_keepalive_jitter_secs`](#me_keepalive_jitter_secs) | `u64` | `2` | +| [`me_keepalive_payload_random`](#me_keepalive_payload_random) | `bool` | `true` | +| [`rpc_proxy_req_every`](#rpc_proxy_req_every) | `u64` | `0` | +| [`me_writer_cmd_channel_capacity`](#me_writer_cmd_channel_capacity) | `usize` | `4096` | +| [`me_route_channel_capacity`](#me_route_channel_capacity) | `usize` | `768` | +| [`me_c2me_channel_capacity`](#me_c2me_channel_capacity) | `usize` | `1024` | +| [`me_c2me_send_timeout_ms`](#me_c2me_send_timeout_ms) | `u64` | `4000` | +| [`me_reader_route_data_wait_ms`](#me_reader_route_data_wait_ms) | `u64` | `2` | +| [`me_d2c_flush_batch_max_frames`](#me_d2c_flush_batch_max_frames) | `usize` | `32` | +| [`me_d2c_flush_batch_max_bytes`](#me_d2c_flush_batch_max_bytes) | `usize` | `131072` | +| [`me_d2c_flush_batch_max_delay_us`](#me_d2c_flush_batch_max_delay_us) | `u64` | `500` | +| [`me_d2c_ack_flush_immediate`](#me_d2c_ack_flush_immediate) | `bool` | `true` | +| [`me_quota_soft_overshoot_bytes`](#me_quota_soft_overshoot_bytes) | `u64` | `65536` | +| [`me_d2c_frame_buf_shrink_threshold_bytes`](#me_d2c_frame_buf_shrink_threshold_bytes) | `usize` | `262144` | +| [`direct_relay_copy_buf_c2s_bytes`](#direct_relay_copy_buf_c2s_bytes) | `usize` | `65536` | +| [`direct_relay_copy_buf_s2c_bytes`](#direct_relay_copy_buf_s2c_bytes) | `usize` | `262144` | +| [`crypto_pending_buffer`](#crypto_pending_buffer) | `usize` | `262144` | +| [`max_client_frame`](#max_client_frame) | `usize` | `16777216` | +| [`desync_all_full`](#desync_all_full) | `bool` | `false` | +| [`beobachten`](#beobachten) | `bool` | `true` | +| [`beobachten_minutes`](#beobachten_minutes) | `u64` | `10` | +| [`beobachten_flush_secs`](#beobachten_flush_secs) | `u64` | `15` | +| [`beobachten_file`](#beobachten_file) | `String` | `"cache/beobachten.txt"` | +| [`hardswap`](#hardswap) | `bool` | `true` | +| [`me_warmup_stagger_enabled`](#me_warmup_stagger_enabled) | `bool` | `true` | +| [`me_warmup_step_delay_ms`](#me_warmup_step_delay_ms) | `u64` | `500` | +| [`me_warmup_step_jitter_ms`](#me_warmup_step_jitter_ms) | `u64` | `300` | +| [`me_reconnect_max_concurrent_per_dc`](#me_reconnect_max_concurrent_per_dc) | `u32` | `8` | +| [`me_reconnect_backoff_base_ms`](#me_reconnect_backoff_base_ms) | `u64` | `500` | +| [`me_reconnect_backoff_cap_ms`](#me_reconnect_backoff_cap_ms) | `u64` | `30000` | +| [`me_reconnect_fast_retry_count`](#me_reconnect_fast_retry_count) | `u32` | `16` | +| [`me_single_endpoint_shadow_writers`](#me_single_endpoint_shadow_writers) | `u8` | `2` | +| [`me_single_endpoint_outage_mode_enabled`](#me_single_endpoint_outage_mode_enabled) | `bool` | `true` | +| [`me_single_endpoint_outage_disable_quarantine`](#me_single_endpoint_outage_disable_quarantine) | `bool` | `true` | +| [`me_single_endpoint_outage_backoff_min_ms`](#me_single_endpoint_outage_backoff_min_ms) | `u64` | `250` | +| [`me_single_endpoint_outage_backoff_max_ms`](#me_single_endpoint_outage_backoff_max_ms) | `u64` | `3000` | +| [`me_single_endpoint_shadow_rotate_every_secs`](#me_single_endpoint_shadow_rotate_every_secs) | `u64` | `900` | +| [`me_floor_mode`](#me_floor_mode) | `"static"` or `"adaptive"` | `"adaptive"` | +| [`me_adaptive_floor_idle_secs`](#me_adaptive_floor_idle_secs) | `u64` | `90` | +| [`me_adaptive_floor_min_writers_single_endpoint`](#me_adaptive_floor_min_writers_single_endpoint) | `u8` | `1` | +| [`me_adaptive_floor_min_writers_multi_endpoint`](#me_adaptive_floor_min_writers_multi_endpoint) | `u8` | `1` | +| [`me_adaptive_floor_recover_grace_secs`](#me_adaptive_floor_recover_grace_secs) | `u64` | `180` | +| [`me_adaptive_floor_writers_per_core_total`](#me_adaptive_floor_writers_per_core_total) | `u16` | `48` | +| [`me_adaptive_floor_cpu_cores_override`](#me_adaptive_floor_cpu_cores_override) | `u16` | `0` | +| [`me_adaptive_floor_max_extra_writers_single_per_core`](#me_adaptive_floor_max_extra_writers_single_per_core) | `u16` | `1` | +| [`me_adaptive_floor_max_extra_writers_multi_per_core`](#me_adaptive_floor_max_extra_writers_multi_per_core) | `u16` | `2` | +| [`me_adaptive_floor_max_active_writers_per_core`](#me_adaptive_floor_max_active_writers_per_core) | `u16` | `64` | +| [`me_adaptive_floor_max_warm_writers_per_core`](#me_adaptive_floor_max_warm_writers_per_core) | `u16` | `64` | +| [`me_adaptive_floor_max_active_writers_global`](#me_adaptive_floor_max_active_writers_global) | `u32` | `256` | +| [`me_adaptive_floor_max_warm_writers_global`](#me_adaptive_floor_max_warm_writers_global) | `u32` | `256` | +| [`upstream_connect_retry_attempts`](#upstream_connect_retry_attempts) | `u32` | `2` | +| [`upstream_connect_retry_backoff_ms`](#upstream_connect_retry_backoff_ms) | `u64` | `100` | +| [`upstream_connect_budget_ms`](#upstream_connect_budget_ms) | `u64` | `3000` | +| [`upstream_unhealthy_fail_threshold`](#upstream_unhealthy_fail_threshold) | `u32` | `5` | +| [`upstream_connect_failfast_hard_errors`](#upstream_connect_failfast_hard_errors) | `bool` | `false` | +| [`stun_iface_mismatch_ignore`](#stun_iface_mismatch_ignore) | `bool` | `false` | +| [`unknown_dc_log_path`](#unknown_dc_log_path) | `String` | `"unknown-dc.txt"` | +| [`unknown_dc_file_log_enabled`](#unknown_dc_file_log_enabled) | `bool` | `false` | +| [`log_level`](#log_level) | `"debug"`, `"verbose"`, `"normal"`, or `"silent"` | `"normal"` | +| [`disable_colors`](#disable_colors) | `bool` | `false` | +| [`me_socks_kdf_policy`](#me_socks_kdf_policy) | `"strict"` or `"compat"` | `"strict"` | +| [`me_route_backpressure_base_timeout_ms`](#me_route_backpressure_base_timeout_ms) | `u64` | `25` | +| [`me_route_backpressure_high_timeout_ms`](#me_route_backpressure_high_timeout_ms) | `u64` | `120` | +| [`me_route_backpressure_high_watermark_pct`](#me_route_backpressure_high_watermark_pct) | `u8` | `80` | +| [`me_health_interval_ms_unhealthy`](#me_health_interval_ms_unhealthy) | `u64` | `1000` | +| [`me_health_interval_ms_healthy`](#me_health_interval_ms_healthy) | `u64` | `3000` | +| [`me_admission_poll_ms`](#me_admission_poll_ms) | `u64` | `1000` | +| [`me_warn_rate_limit_ms`](#me_warn_rate_limit_ms) | `u64` | `5000` | +| [`me_route_no_writer_mode`](#me_route_no_writer_mode) | `"async_recovery_failfast"`, `"inline_recovery_legacy"`, or `"hybrid_async_persistent"` | `"hybrid_async_persistent"` | +| [`me_route_no_writer_wait_ms`](#me_route_no_writer_wait_ms) | `u64` | `250` | +| [`me_route_hybrid_max_wait_ms`](#me_route_hybrid_max_wait_ms) | `u64` | `3000` | +| [`me_route_blocking_send_timeout_ms`](#me_route_blocking_send_timeout_ms) | `u64` | `250` | +| [`me_route_inline_recovery_attempts`](#me_route_inline_recovery_attempts) | `u32` | `3` | +| [`me_route_inline_recovery_wait_ms`](#me_route_inline_recovery_wait_ms) | `u64` | `3000` | +| [`fast_mode_min_tls_record`](#fast_mode_min_tls_record) | `usize` | `0` | +| [`update_every`](#update_every) | `u64` | `300` | +| [`me_reinit_every_secs`](#me_reinit_every_secs) | `u64` | `900` | +| [`me_hardswap_warmup_delay_min_ms`](#me_hardswap_warmup_delay_min_ms) | `u64` | `1000` | +| [`me_hardswap_warmup_delay_max_ms`](#me_hardswap_warmup_delay_max_ms) | `u64` | `2000` | +| [`me_hardswap_warmup_extra_passes`](#me_hardswap_warmup_extra_passes) | `u8` | `3` | +| [`me_hardswap_warmup_pass_backoff_base_ms`](#me_hardswap_warmup_pass_backoff_base_ms) | `u64` | `500` | +| [`me_config_stable_snapshots`](#me_config_stable_snapshots) | `u8` | `2` | +| [`me_config_apply_cooldown_secs`](#me_config_apply_cooldown_secs) | `u64` | `300` | +| [`me_snapshot_require_http_2xx`](#me_snapshot_require_http_2xx) | `bool` | `true` | +| [`me_snapshot_reject_empty_map`](#me_snapshot_reject_empty_map) | `bool` | `true` | +| [`me_snapshot_min_proxy_for_lines`](#me_snapshot_min_proxy_for_lines) | `u32` | `1` | +| [`proxy_secret_stable_snapshots`](#proxy_secret_stable_snapshots) | `u8` | `2` | +| [`proxy_secret_rotate_runtime`](#proxy_secret_rotate_runtime) | `bool` | `true` | +| [`me_secret_atomic_snapshot`](#me_secret_atomic_snapshot) | `bool` | `true` | +| [`proxy_secret_len_max`](#proxy_secret_len_max) | `usize` | `256` | +| [`me_pool_drain_ttl_secs`](#me_pool_drain_ttl_secs) | `u64` | `90` | +| [`me_instadrain`](#me_instadrain) | `bool` | `false` | +| [`me_pool_drain_threshold`](#me_pool_drain_threshold) | `u64` | `32` | +| [`me_pool_drain_soft_evict_enabled`](#me_pool_drain_soft_evict_enabled) | `bool` | `true` | +| [`me_pool_drain_soft_evict_grace_secs`](#me_pool_drain_soft_evict_grace_secs) | `u64` | `10` | +| [`me_pool_drain_soft_evict_per_writer`](#me_pool_drain_soft_evict_per_writer) | `u8` | `2` | +| [`me_pool_drain_soft_evict_budget_per_core`](#me_pool_drain_soft_evict_budget_per_core) | `u16` | `16` | +| [`me_pool_drain_soft_evict_cooldown_ms`](#me_pool_drain_soft_evict_cooldown_ms) | `u64` | `1000` | +| [`me_bind_stale_mode`](#me_bind_stale_mode) | `"never"`, `"ttl"`, or `"always"` | `"ttl"` | +| [`me_bind_stale_ttl_secs`](#me_bind_stale_ttl_secs) | `u64` | `90` | +| [`me_pool_min_fresh_ratio`](#me_pool_min_fresh_ratio) | `f32` | `0.8` | +| [`me_reinit_drain_timeout_secs`](#me_reinit_drain_timeout_secs) | `u64` | `90` | +| [`proxy_secret_auto_reload_secs`](#proxy_secret_auto_reload_secs) | `u64` | `3600` | +| [`proxy_config_auto_reload_secs`](#proxy_config_auto_reload_secs) | `u64` | `3600` | +| [`me_reinit_singleflight`](#me_reinit_singleflight) | `bool` | `true` | +| [`me_reinit_trigger_channel`](#me_reinit_trigger_channel) | `usize` | `64` | +| [`me_reinit_coalesce_window_ms`](#me_reinit_coalesce_window_ms) | `u64` | `200` | +| [`me_deterministic_writer_sort`](#me_deterministic_writer_sort) | `bool` | `true` | +| [`me_writer_pick_mode`](#me_writer_pick_mode) | `"sorted_rr"` or `"p2c"` | `"p2c"` | +| [`me_writer_pick_sample_size`](#me_writer_pick_sample_size) | `u8` | `3` | +| [`ntp_check`](#ntp_check) | `bool` | `true` | +| [`ntp_servers`](#ntp_servers) | `String[]` | `["pool.ntp.org"]` | +| [`auto_degradation_enabled`](#auto_degradation_enabled) | `bool` | `true` | +| [`degradation_min_unavailable_dc_groups`](#degradation_min_unavailable_dc_groups) | `u8` | `2` | +| [`rst_on_close`](#rst_on_close) | `"off"`, `"errors"` или `"always"` | `"off"` | + +## data_path + - **Ограничения / валидация**: `String` (необязательный параметр). + - **Описание**: Необязательный путь к каталогу данных состояния telemt. + - **Пример**: + + ```toml + [general] + data_path = "/var/lib/telemt" + ``` +## prefer_ipv6 + - **Ограничения / валидация**: Устарело. Используйте `network.prefer`. + - **Описание**: Устаревший флаг предпочтения IPv6 перенесен в `network.prefer`. + - **Пример**: + + ```toml + [network] + prefer = 6 + ``` +## fast_mode + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает оптимизированные маршруты для обработки трафика. + - **Пример**: + + ```toml + [general] + fast_mode = true + ``` +## use_middle_proxy + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает режим ME; если значение `false`, telemt возвращается к прямой DC-маршрутизации. + - **Пример**: + + ```toml + [general] + use_middle_proxy = true + ``` +## proxy_secret_path + - **Ограничения / валидация**: `String`. Если этот параметр не указан, используется путь по умолчанию — «proxy-secret». Пустые значения принимаются TOML/serde, но во время выполнения произойдет ошибка (invalid file path). + - **Описание**: Путь к файлу кэша `proxy-secret` инфраструктуры Telegram, используемому ME-handshake/аутентификацией RPC. Telemt всегда сначала пытается выполнить новую загрузку с https://core.telegram.org/getProxySecret, в случае успеха кэширует ее по этому пути и возвращается к чтению кэшированного файла в случае сбоя загрузки. + - **Пример**: + + ```toml + [general] + proxy_secret_path = "proxy-secret" + ``` +## proxy_config_v4_cache_path + - **Ограничения / валидация**: `String`. Если используется, значение не должно быть пустым или содержать только пробелы. + - **Описание**: Необязательный путь к кэшу для необработанного (raw) снимка getProxyConfig (IPv4). При запуске Telemt сначала пытается получить свежий снимок; в случае сбоя выборки или пустого снимка он возвращается к этому файлу кэша, если он присутствует и не пуст. + - **Пример**: + + ```toml + [general] + proxy_config_v4_cache_path = "cache/proxy-config-v4.txt" + ``` +## proxy_config_v6_cache_path + - **Ограничения / валидация**: `String`. Если используется, значение не должно быть пустым или содержать только пробелы. + - **Описание**: Необязательный путь к кэшу для необработанного (raw) снимка getProxyConfigV6 (IPv6). При запуске Telemt сначала пытается получить свежий снимок; в случае сбоя выборки или пустого снимка он возвращается к этому файлу кэша, если он присутствует и не пуст. + - **Пример**: + + ```toml + [general] + proxy_config_v6_cache_path = "cache/proxy-config-v6.txt" + ``` +## ad_tag + - **Ограничения / валидация**: `String` (необязательный параметр). Если используется, значение должно быть ровно 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 + - **Ограничения / валидация**: `bool`. Возможность проверки ограничивается значением параметра `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-fallback. Во время загрузки конфигурации значение параметра объединяется с `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 + - **Ограничения / валидация**: `usize`. + - **Описание**: Размер пула записи ME. + - **Пример**: + + ```toml + [general] + middle_proxy_pool_size = 8 + ``` +## middle_proxy_warm_standby + - **Ограничения / валидация**: `usize`. + - **Описание**: Количество предварительно инициализированных резервных подключений 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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Перейти из режима ME в режим прямого соединения (DC) в случае сбоя запуска ME. + - **Пример**: + + ```toml + [general] + me2dc_fallback = true + ``` +## me2dc_fast + - **Ограничения / валидация**: `bool`. Используется только, когда `use_middle_proxy = true` и `me2dc_fallback = true`. + - **Описание**: Режим для быстрого перехода между режимами ME->DC для новых сеансов. + - **Пример**: + + ```toml + [general] + use_middle_proxy = true + me2dc_fallback = true + me2dc_fast = false + ``` +## me_keepalive_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает периодическое добавление дополнительных кадров для ME keepalive-сообщений. + - **Пример**: + + ```toml + [general] + me_keepalive_enabled = true + ``` +## me_keepalive_interval_secs + - **Ограничения / валидация**: `u64` (секунд). + - **Описание**: Базовый интервал ME keepalive-сообщений в секундах. + - **Пример**: + + ```toml + [general] + me_keepalive_interval_secs = 8 + ``` +## me_keepalive_jitter_secs + - **Ограничения / валидация**: `u64` (секунд). + - **Описание**: Случайная задержка (джиттер) keepalive-сообщений в секундах, которая используется для уменьшения синхронных "всплесков" нагрузки. + - **Пример**: + + ```toml + [general] + me_keepalive_jitter_secs = 2 + ``` +## me_keepalive_payload_random + - **Ограничения / валидация**: `bool`. + - **Описание**: Заполняет данные (payload) keepalive-пакетов случайными байтами вместо фиксированных нулей. + - **Пример**: + + ```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`. + - **Описание**: Емкость очереди команд для каждого клиента (client reader -> ME sender). + - **Пример**: + + ```toml + [general] + me_c2me_channel_capacity = 1024 + ``` +## me_c2me_send_timeout_ms + - **Ограничения / валидация**: `0..=60000` (миллисекунд). + - **Описание**: Максимальное ожидание постановки в очередь команд client->ME, если очередь для каждого клиента заполнена (`0` сохраняет устаревшее неограниченное ожидание). + - **Пример**: + + ```toml + [general] + me_c2me_send_timeout_ms = 4000 + ``` +## me_reader_route_data_wait_ms + - **Ограничения / валидация**: `0..=20` (миллисекунд). + - **Описание**: Ограничение времени ожидания при маршрутизации данных ME в очереди конкретного соединения (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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Сбрасывать буфер записи клиента сразу после быстрой отправки подтверждения (quick-ack). + - **Пример**: + + ```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>client уменьшаются (сжимаются) после отправки. + - **Пример**: + + ```toml + [general] + me_d2c_frame_buf_shrink_threshold_bytes = 262144 + ``` +## direct_relay_copy_buf_c2s_bytes + - **Ограничения / валидация**: Должно быть в пределах `4096..=1048576` (байт). + - **Описание**: Размер буфера копирования для направления client > DC в режиме прямой пересылки (direct relay). + - **Пример**: + + ```toml + [general] + direct_relay_copy_buf_c2s_bytes = 65536 + ``` +## direct_relay_copy_buf_s2c_bytes + - **Ограничения / валидация**: Должно быть в пределах `8192..=2097152` (байт). + - **Описание**: CoРазмер буфера копирования для направления DC > клиент в режиме прямой пересылки (direct relay). + - **Пример**: + + ```toml + [general] + direct_relay_copy_buf_s2c_bytes = 262144 + ``` +## crypto_pending_buffer + - **Ограничения / валидация**: `usize` (байт). + - **Описание**:Максимальный объём ожидающих (неотправленных) зашифрованных данных в буфере client writer (в байтах). + - **Пример**: + + ```toml + [general] + crypto_pending_buffer = 262144 + ``` +## max_client_frame + - **Ограничения / валидация**: `usize` (байт). + - **Описание**: Максимально допустимый размер кадра MTProto клиента (в байтах). + - **Пример**: + + ```toml + [general] + max_client_frame = 16777216 + ``` +## desync_all_full + - **Ограничения / валидация**: `bool`. + - **Описание**: Создавать полные журналы крипто-рассинхронизации для каждого события + - **Пример**: + + ```toml + [general] + desync_all_full = false + ``` +## beobachten + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает "криминалистическое" наблюдения для каждого IP-адреса. Анализирует поведение всех подключений и записывает возможные типы клиентов, которые посылают active-probing запросы. + - **Пример**: + + ```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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Включить стратегию ME-hardswap на основе генерации. + - **Пример**: + + ```toml + [general] + hardswap = true + ``` +## me_warmup_stagger_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Распределить во времени дополнительные стадии "прогрева" 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`. + - **Описание**: Ограничить количество одновременно работающих процессов переподключения (reconnect workers) к DC во время восстановления работоспособности. + - **Пример**: + + ```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`. + - **Описание**: Лимит немедленных повторных попыток подключения перед тем, как включается долгий backoff (увеличивающаяся задержка между попытками). + - **Пример**: + + ```toml + [general] + me_reconnect_fast_retry_count = 16 + ``` +## me_single_endpoint_shadow_writers + - **Ограничения / валидация**: Должно быть в пределах `0..=32`. + - **Описание**: Количество дополнительных резервных writer-процессов для групп DC, у которых есть только один конечный узел (endpoint). + - **Пример**: + + ```toml + [general] + me_single_endpoint_shadow_writers = 2 + ``` +## me_single_endpoint_outage_mode_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает агрессивный режим восстановления после сбоя для групп DC, когда доступен только один endpoint. + - **Пример**: + + ```toml + [general] + me_single_endpoint_outage_mode_enabled = true + ``` +## me_single_endpoint_outage_disable_quarantine + - **Ограничения / валидация**: `bool`. + - **Описание**: Игнорировать карантин endpoint’а в режиме сбоя, когда доступен только один endpoint. + - **Пример**: + + ```toml + [general] + me_single_endpoint_outage_disable_quarantine = true + ``` +## me_single_endpoint_outage_backoff_min_ms + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунд) и меньше или равно `me_single_endpoint_outage_backoff_max_ms`. + - **Описание**: Минимальная задержка между повторными попытками переподключения (reconnect backoff) в режиме сбоя с единственным endpoint’ом. + - **Пример**: + + ```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`. + - **Описание**: Максимальная задержка между попытками переподключения (reconnect backoff) в режиме сбоя с единственным endpoint’ом. + - **Пример**: + + ```toml + [general] + me_single_endpoint_outage_backoff_max_ms = 3000 + ``` +## me_single_endpoint_shadow_rotate_every_secs + - **Ограничения / валидация**: `u64` (секунды). `0` отключает периодическую ротацию. + - **Описание**: Интервал периодической ротации резервного (shadow) writer’а для DC-групп с единственным endpoint’ом + - **Пример**: + + ```toml + [general] + me_single_endpoint_shadow_rotate_every_secs = 900 + ``` +## me_floor_mode + - **Ограничения / валидация**: `"static"` или `"adaptive"`. + - **Описание**: Режим политики нижнего порога (минимального ограничения) для целевых узлов/получателей ME writer’а. + - **Пример**: + + ```toml + [general] + me_floor_mode = "adaptive" + ``` +## me_adaptive_floor_idle_secs + - **Ограничения / валидация**: `u64` (секунды). + - **Описание**: Время простоя, после которого адаптивный нижний порог (adaptive floor) может уменьшить целевой лимит writer’а для единственного endpoint’а. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_idle_secs = 90 + ``` +## me_adaptive_floor_min_writers_single_endpoint + - **Ограничения / валидация**: Должно быть в пределах `1..=32`. + - **Описание**: Минимально допустимое количество writer’ов в DC-группах с одним endpoint’ом в режиме адаптивного нижнего порога (adaptive floor). + - **Пример**: + + ```toml + [general] + me_adaptive_floor_min_writers_single_endpoint = 1 + ``` +## me_adaptive_floor_min_writers_multi_endpoint + - **Ограничения / валидация**: Должно быть в пределах `1..=32`. + - **Описание**: Минимально допустимое количество writer’ов в DC-группах с несколькими endpoint’ами в режиме адаптивного нижнего порога (adaptive floor). + - **Пример**: + + ```toml + [general] + me_adaptive_floor_min_writers_multi_endpoint = 1 + ``` +## me_adaptive_floor_recover_grace_secs + - **Ограничения / валидация**: `u64` (секунды). + - **Описание**: Период “льготного ожидания”, в течение которого сохраняется фиксированный (static) нижний порог после появления активности в адаптивном режиме + - **Пример**: + + ```toml + [general] + me_adaptive_floor_recover_grace_secs = 180 + ``` +## me_adaptive_floor_writers_per_core_total + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Глобальный лимит записи ME writer’а на каждое логическое CPU-ядро в адаптивном режиме. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_writers_per_core_total = 48 + ``` +## me_adaptive_floor_cpu_cores_override + - **Ограничения / валидация**: `u16`. `0` - использовать автоматическое обнаружение во время выполнения. + - **Описание**: Переопределить количество логических CPU-ядер, используемых при расчёте адаптивного нижнего порога (adaptive floor). + - **Пример**: + + ```toml + [general] + me_adaptive_floor_cpu_cores_override = 0 + ``` +## me_adaptive_floor_max_extra_writers_single_per_core + - **Ограничения / валидация**: `u16`. + - **Описание**: Максимальное количество дополнительных writer-процессов на одно CPU-ядро сверх базового требуемого уровня для DC-групп с единственным endpoint’ом. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_extra_writers_single_per_core = 1 + ``` +## me_adaptive_floor_max_extra_writers_multi_per_core + - **Ограничения / валидация**: `u16`. + - **Описание**: Максимальное количество дополнительных writer-процессов на одно CPU-ядро сверх базового требуемого уровня для DC-групп с несколькими endpoint’ами. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_extra_writers_multi_per_core = 2 + ``` +## me_adaptive_floor_max_active_writers_per_core + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Лимит количества ME writer-процессов на одно логическое CPU-ядро. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_active_writers_per_core = 64 + ``` +## me_adaptive_floor_max_warm_writers_per_core + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Лимит количества “разогретых” (warm) ME writer-процессов на одно логическое CPU-ядро. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_warm_writers_per_core = 64 + ``` +## me_adaptive_floor_max_active_writers_global + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Глобальный лимит количества ME writer-процессов. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_active_writers_global = 256 + ``` +## me_adaptive_floor_max_warm_writers_global + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Глобальный лимит количества “разогретых” (warm) ME writer-процессов. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_warm_writers_global = 256 + ``` +## upstream_connect_retry_attempts + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Количество попыток подключения к выбранному upstream'у перед тем, как вернуть ошибку или перейти к fallback. + - **Пример**: + + ```toml + [general] + upstream_connect_retry_attempts = 2 + ``` +## upstream_connect_retry_backoff_ms + - **Ограничения / валидация**: `u64` (миллисекунды). `0` - отключает задержку отсрочки (повторные попытки становятся немедленными). + - **Описание**: Задержка в миллисекундах между попытками подключения к upstream. + - **Пример**: + + ```toml + [general] + upstream_connect_retry_backoff_ms = 100 + ``` +## upstream_connect_budget_ms + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунд). + - **Описание**: Общий лимит времени (в миллисекундах), измеряемый по реальному времени (wall-clock), на одну попытку подключения к upstream с учётом всех повторных попыток. + - **Пример**: + + ```toml + [general] + upstream_connect_budget_ms = 3000 + ``` +## upstream_unhealthy_fail_threshold + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Количество неудачных запросов подряд, после которого upstream помечается, как неработоспособный. + - **Пример**: + + ```toml + [general] + upstream_unhealthy_fail_threshold = 5 + ``` +## upstream_connect_failfast_hard_errors + - **Ограничения / валидация**: `bool`. + - **Описание**: Если включено (true), telemt пропускает дополнительные повторные попытки для постоянных ошибок подключения к upstream. + - **Пример**: + + ```toml + [general] + upstream_connect_failfast_hard_errors = false + ``` +## stun_iface_mismatch_ignore + - **Ограничения / валидация**: `bool`. + - **Описание**: Флаг совместимости, зарезервированный для будущего использования. Сейчас этот параметр читается (парсится), но не используется средой выполнения. + - **Пример**: + + ```toml + [general] + stun_iface_mismatch_ignore = false + ``` +## unknown_dc_log_path + - **Ограничения / валидация**: `String` (необязательный параметр). Путь должен быть без `..` и с существующим родительским каталогом, иначе он будет отклонён во время выполнения. + - **Описание**: Путь к файлу логов для неизвестных (нестандартных) DC-запросов, который используется только если `unknown_dc_file_log_enabled = true`. Чтобы отключить файловое логирование, не указывйте этот параметр. + - **Пример**: + + ```toml + [general] + unknown_dc_log_path = "unknown-dc.txt" + ``` +## unknown_dc_file_log_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Включить файловое логирование неизвестных DC (записывает строки вида `dc_idx=`). Требует, чтобы был задан `unknown_dc_log_path`. На не-Unix платформах может не поддерживаться. Логирование очищается от дубликатов и имеет ограничения: записываются только первые ~1024 уникальных неизвестных DC-индексов. + - **Пример**: + + ```toml + [general] + unknown_dc_file_log_enabled = false + ``` +## log_level + - **Ограничения / валидация**: `"debug"`, `"verbose"`, `"normal"`, или `"silent"`. + - **Описание**: Уровень детализации логов во время работы системы, который используется только если переменная окружения `RUST_LOG` не задана. Если `RUST_LOG` задана, она имеет приоритет и переопределяет этот параметр. + - **Пример**: + + ```toml + [general] + log_level = "normal" + ``` +## disable_colors + - **Ограничения / валидация**: `bool`. + - **Описание**: Отключает ANSI-цвета в логах. Это влияет только на форматирование вывода и не меняет уровень логирования и фильтрацию сообщений.. + - **Пример**: + + ```toml + [general] + disable_colors = false + ``` +## me_socks_kdf_policy + - **Ограничения / валидация**: `"strict"` или `"compat"`. + - **Описание**: Политика fallback-поведения KDF, привязанная к SOCKS, для Middle-End-handshake. + - **Пример**: + + ```toml + [general] + me_socks_kdf_policy = "strict" + ``` +## me_route_backpressure_base_timeout_ms + - **Ограничения / валидация**: Должно быть в пределах `1..=5000` (миллисекунд). + - **Описание**: Базовый таймаут (в миллисекундах) ожидания при режиме **backpressure** (ситуация, при которой данные обрабатываются медленне, чем получаются) для отправки через ME route-channel. + - **Пример**: + + ```toml + [general] + me_route_backpressure_base_timeout_ms = 25 + ``` +## me_route_backpressure_high_timeout_ms + - **Ограничения / валидация**: Должно быть в пределах `1..=5000` (миллисекунд) и больше или равно `me_route_backpressure_base_timeout_ms`. + - **Описание**: Увеличенный таймаут ожидания (в миллисекундах) при режиме **backpressure**, когда заполненность очереди превышает порог. + - **Пример**: + + ```toml + [general] + me_route_backpressure_high_timeout_ms = 120 + ``` +## me_route_backpressure_high_watermark_pct + - **Ограничения / валидация**: Должно быть в пределах `1..=100` (процентов). + - **Описание**: Порог заполненности очереди (в процентах), при превышении которого система переключается на увеличенный таймаут **backpressure**. + - **Пример**: + + ```toml + [general] + me_route_backpressure_high_watermark_pct = 80 + ``` +## me_health_interval_ms_unhealthy + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунд). + - **Описание**: Интервал проверки состояния (health monitoring), который используется, когда покрытие ME-writer’ов ухудшено (деградировало). + - **Пример**: + + ```toml + [general] + me_health_interval_ms_unhealthy = 1000 + ``` +## me_health_interval_ms_healthy + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунд). + - **Описание**: Интервал проверки состояния (health monitoring), который используется, когда покрытие ME-writer’ов стабильно. + - **Пример**: + + ```toml + [general] + me_health_interval_ms_healthy = 3000 + ``` +## me_admission_poll_ms + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунд). + - **Описание**: Интервал опроса (polling interval) для проверки состояния приема при выполнении условий (conditional admission). + - **Пример**: + + ```toml + [general] + me_admission_poll_ms = 1000 + ``` +## me_warn_rate_limit_ms + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунд). + - **Описание**: Период "затухания" (cooldown) для повторяющихся предупреждающих логов ME, чтобы ограничить их частоту. + - **Пример**: + + ```toml + [general] + me_warn_rate_limit_ms = 5000 + ``` +## me_route_no_writer_mode + - **Ограничения / валидация**: `"async_recovery_failfast"`, `"inline_recovery_legacy"`, or `"hybrid_async_persistent"`. + - **Описание**: Поведение ME-маршрута, когда ни один writer не доступен. + - **Пример**: + + ```toml + [general] + me_route_no_writer_mode = "hybrid_async_persistent" + ``` +## me_route_no_writer_wait_ms + - **Ограничения / валидация**: Должно быть в пределах `10..=5000` (миллисекунды). + - **Описание**: Максимальное время ожидания, используемое в режиме **async-recovery failfast** перед переходом к fallback. + - **Пример**: + + ```toml + [general] + me_route_no_writer_wait_ms = 250 + ``` +## me_route_hybrid_max_wait_ms + - **Ограничения / валидация**: Должно быть в пределах `50..=60000` (миллисекунд). + - **Описание**: Максимальное суммарное время ожидания в гибридном режиме без writer’а перед failfast fallback. + - **Пример**: + + ```toml + [general] + me_route_hybrid_max_wait_ms = 3000 + ``` +## me_route_blocking_send_timeout_ms + - **Ограничения / валидация**: Должно быть в пределах `0..=5000` (миллисекунд). `0` - неограниченное время ожидания. + - **Описание**: Максимальное время ожидания для блокировки отправки через канал маршрутизации при fallback. + - **Пример**: + + ```toml + [general] + me_route_blocking_send_timeout_ms = 250 + ``` +## me_route_inline_recovery_attempts + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Количество попыток inline-восстановления в legacy-режиме + - **Пример**: + + ```toml + [general] + me_route_inline_recovery_attempts = 3 + ``` +## me_route_inline_recovery_wait_ms + - **Ограничения / валидация**: Должно быть в пределах `10..=30000` (миллисекунд). + - **Описание**: Максимальное время ожидания inline-восстановления в legacy-режиме. + - **Пример**: + + ```toml + [general] + me_route_inline_recovery_wait_ms = 3000 + ``` +## fast_mode_min_tls_record + - **Ограничения / валидация**: `usize` (bytes). `0` disables the limit. + - **Описание**: Минимальный размер TLS-записи при включённой агрегации fast-mode. + - **Пример**: + + ```toml + [general] + fast_mode_min_tls_record = 0 + ``` +## update_every + - **Ограничения / валидация**: `u64` (секунд). Должно быть `> 0`. Если этот ключ не задан явно, могут использоваться устаревшие параметры `proxy_secret_auto_reload_secs` и `proxy_config_auto_reload_secs` (их эффективное минимальное значение должно быть `> 0`). + - **Описание**: Унифицированный интервал обновления задач ME-updater’а (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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Требовать HTTP-ответы **2xx** для применения снимков конфигурации ME. Если `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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Отклоняет пустые snapshot-конфигурации ME (без endpoint’ов). Если установлено значение `false`, пустой snapshot может быть применён (при выполнении других условий), что может временно очистить или уменьшить карту 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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает ротацию proxy-secret на основе снапшотов, получаемых от обновляющего компонента. + - **Пример**: + + ```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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Сохраняет селекторные и секретные байты из одного и того же снимка атомарно. Если `general.use_middle_proxy = true`, автоматически включается при загрузке конфигурации для согласованности KDF-данных ME. + - **Пример**: + + ```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]`. + - **Описание**: Верхний предел длины (в байтах) принимаемого proxy-secret во время запуска и обновления. + - **Пример**: + + ```toml + [general] + # default: 256 (bytes) + proxy_secret_len_max = 256 + ``` +## me_pool_drain_ttl_secs + - **Ограничения / валидация**: `u64` (секунды). `0` - отключает период drain-TTL и подавляет предупреждения drain-TTL для ненулевых (непустых) writer’ов, находящихся в состоянии **draining**. + - **Описание**: Временной интервал Drain-TTL для устаревших ME writer’ов после изменения карты endpoint’ов. В течение TTL устаревшие writer’ы могут использоваться только как fallback для новых биндов (в зависимости от политики биндов). + - **Пример**: + + ```toml + [general] + # disable drain TTL (draining writers won't emit "past drain TTL" warnings) + me_pool_drain_ttl_secs = 0 + ``` +## me_instadrain + - **Ограничения / валидация**: `bool`. + - **Описание**: Принудительно удаляет устаревшие writer’ы на следующем цикле очистки, обходя TTL и таймаут ожидания. + - **Пример**: + + ```toml + [general] + # default: false + me_instadrain = false + ``` +## me_pool_drain_threshold + - **Ограничения / валидация**: `u64`. Установите значение `0`, чтобы отключить очистку на основе пороговых значений. + - **Описание**: Максимальное количество устаревших writer’ов, после которого самые старые принудительно закрываются в пакетном режиме. + - **Пример**: + + ```toml + [general] + # default: 32 + me_pool_drain_threshold = 32 + ``` +## me_pool_drain_soft_evict_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает постепенное удаление устаревших writer’ов во время очистки/повторной инициализации вместо их немедленного закрытия. + - **Пример**: + + ```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`. + - **Описание**: Максимальное количество устаревших маршрутов, вытесняемых за один проход мягкого удаления на один writer. + - **Пример**: + + ```toml + [general] + # default: 2 + me_pool_drain_soft_evict_per_writer = 2 + ``` +## me_pool_drain_soft_evict_budget_per_core + - **Ограничения / валидация**: `1..=64`. + - **Описание**: Лимиты работы мягкого удаления на одно CPU-ядро за один проход. + - **Пример**: + + ```toml + [general] + # default: 16 + me_pool_drain_soft_evict_budget_per_core = 16 + ``` +## me_pool_drain_soft_evict_cooldown_ms + - **Ограничения / валидация**: `u64` (миллисекунд). Должно быть `> 0`. + - **Описание**: Время восстановления между повторяющимися мягкими удалениями одного и того же writer’а. + - **Пример**: + + ```toml + [general] + # default: 1000 + me_pool_drain_soft_evict_cooldown_ms = 1000 + ``` +## me_bind_stale_mode + - **Ограничения / валидация**: `"never"`, `"ttl"` или `"always"`. + - **Описание**: Политика разрешения новых биндов к устаревшим writer’ам. + - **Пример**: + + ```toml + [general] + # allow stale binds only for a limited time window + me_bind_stale_mode = "ttl" + ``` +## me_bind_stale_ttl_secs + - **Ограничения / валидация**: `u64`. + - **Описание**: TTL для разрешения биндов к устаревшим writer’ам при режиме `ttl`. + - **Пример**: + + ```toml + [general] + me_bind_stale_mode = "ttl" + me_bind_stale_ttl_secs = 90 + ``` +## me_pool_min_fresh_ratio + - **Ограничения / валидация**: Должно быть в пределах `[0.0, 1.0]`. + - **Описание**: Минимальный коэффициент актуального (fresh) покрытия DC перед началом удаления устаревших writer’ов. + - **Пример**: + + ```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` - используется безопасный системный fallback. Если значение `> 0` и `< me_pool_drain_ttl_secs`, повышает его до значения TTL. + - **Описание**: Таймаут принудительного закрытия устаревших writer’ов при очистке/повторной инициализации. При `0` используется безопасный системный fallback (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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Упорядочивать циклы повторной инициализации 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`. + - **Описание**: Время объединения (coalescing) триггеров перед запуском переинициализации (в мс). + - **Пример**: + + ```toml + [general] + me_reinit_coalesce_window_ms = 200 + ``` +## me_deterministic_writer_sort + - **Ограничения / валидация**: `bool`. + - **Описание**: Включить детерминированную сортировку кандидатов при выборе writer’а. + - **Пример**: + + ```toml + [general] + me_deterministic_writer_sort = true + ``` +## me_writer_pick_mode + - **Ограничения / валидация**: `"sorted_rr"` or `"p2c"`. + - **Описание**: Режим выбора writer’а для бинда маршрута. + - **Пример**: + + ```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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Зарезервировано для будущего использования. Сейчас параметр читается, но не используется системой. + - **Пример**: + + ```toml + [general] + ntp_check = true + ``` +## ntp_servers + - **Ограничения / валидация**: `String[]`. + - **Описание**: Зарезервировано для будущего использования. Сейчас параметр читается, но не используется системой. + - **Пример**: + + ```toml + [general] + ntp_servers = ["pool.ntp.org"] + ``` +## auto_degradation_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Зарезервировано для будущего использования. Сейчас параметр читается, но не используется системой. + - **Пример**: + + ```toml + [general] + auto_degradation_enabled = true + ``` +## degradation_min_unavailable_dc_groups + - **Ограничения / валидация**: `u8`. + - **Описание**: Зарезервировано для будущего использования. Сейчас параметр читается, но не используется системой. + - **Пример**: + + ```toml + [general] + degradation_min_unavailable_dc_groups = 2 + ``` + +## rst_on_close + - **Ограничения / валидация**: `"off"`, `"errors"`, `"always"`. + - **Описание**: Управляет поведением `SO_LINGER(0)` на принятых клиентских TCP-сокетах. + На высоконагруженных прокси-серверах накапливаются `FIN-WAIT-1` и осиротевшие (orphan) сокеты от соединений, которые не завершают Telegram-рукопожатие (сканеры, DPI-зонды, боты). + Эта опция позволяет отправлять немедленный `RST` вместо корректного `FIN` для таких соединений, мгновенно освобождая ресурсы ядра. + - `"off"` — по умолчанию. Обычный `FIN` при закрытии всех соединений; поведение не меняется. + - `"errors"` — `SO_LINGER(0)` устанавливается при `accept()`. Если клиент успешно проходит аутентификацию, linger сбрасывается и relay-сессия закрывается корректно через `FIN`. Соединения, закрытые до завершения рукопожатия (таймауты, ошибки крипто, сканеры), отправляют `RST`. + - `"always"` — `SO_LINGER(0)` устанавливается при `accept()` и никогда не сбрасывается. Все закрытия отправляют `RST` независимо от результата рукопожатия. + - **Пример**: + + ```toml + [general] + rst_on_close = "errors" + ``` + + +# [general.modes] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`classic`](#classic) | `bool` | `false` | +| [`secure`](#secure) | `bool` | `false` | +| [`tls`](#tls) | `bool` | `true` | + +## classic + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает классический режим MTProxy. + - **Пример**: + + ```toml + [general.modes] + classic = true + ``` +## secure + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает защищённый режим (dd-ссылки). + - **Пример**: + + ```toml + [general.modes] + secure = true + ``` +## tls + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает режим TLS (ee-ссылки). + - **Пример**: + + ```toml + [general.modes] + tls = true + ``` + + +# [general.links] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`show`](#show) | `"*"` or `String[]` | `"*"` | +| [`public_host`](#public_host) | `String` | — | +| [`public_port`](#public_port) | `u16` | — | + +## show + - **Ограничения / валидация**: `"*"` или `String[]`. Пустое значение означает, что нельзя показывать никому. + - **Описание**: Определяет пользователей, для которых показываются proxy-ссылки tg:// при запуске. + - **Пример**: + + ```toml + [general.links] + show = "*" + # or: + # show = ["alice", "bob"] + ``` +## public_host + - **Ограничения / валидация**: `String` (необязательный параметр). + - **Описание**: Переопределение общедоступного имени хоста/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`](#core_enabled) | `bool` | `true` | +| [`user_enabled`](#user_enabled) | `bool` | `true` | +| [`me_level`](#me_level) | `"silent"`, `"normal"`, or `"debug"` | `"normal"` | + +## core_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает метрики ядра (hot-path telemetry counters). + - **Пример**: + + ```toml + [general.telemetry] + core_enabled = true + ``` +## user_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает счетчики телеметрии для каждого пользователя. + - **Пример**: + + ```toml + [general.telemetry] + user_enabled = true + ``` +## me_level + - **Ограничения / валидация**: `"silent"`, `"normal"`или `"debug"`. + - **Описание**: Уровень детализации телеметрии Middle-End. + - **Пример**: + + ```toml + [general.telemetry] + me_level = "normal" + ``` + + +# [network] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`ipv4`](#ipv4) | `bool` | `true` | +| [`ipv6`](#ipv6) | `bool` | `false` | +| [`prefer`](#prefer) | `u8` | `4` | +| [`multipath`](#multipath) | `bool` | `false` | +| [`stun_use`](#stun_use) | `bool` | `true` | +| [`stun_servers`](#stun_servers) | `String[]` | Встроенный STUN-лист (13 записей) | +| [`stun_tcp_fallback`](#stun_tcp_fallback) | `bool` | `true` | +| [`http_ip_detect_urls`](#http_ip_detect_urls) | `String[]` | `["https://ifconfig.me/ip", "https://api.ipify.org"]` | +| [`cache_public_ip_path`](#cache_public_ip_path) | `String` | `"cache/public_ip.txt"` | +| [`dns_overrides`](#dns_overrides) | `String[]` | `[]` | + +## ipv4 + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает возможность подключения по IPv4. + - **Пример**: + + ```toml + [network] + ipv4 = true + ``` +## ipv6 + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает возможность подключения по 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-протокол (IPv4 или IPv6) при выборе, если доступны оба. + - **Пример**: + + ```toml + [network] + prefer = 6 + ``` +## multipath + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает многопоточное (multipath) сетевое поведение, если оно поддерживается платформой и средой выполняния. + - **Пример**: + + ```toml + [network] + multipath = true + ``` +## stun_use + - **Ограничения / валидация**: `bool`. + - **Описание**: Глобальный переключатель STUN; если установлено значение «false», проверка STUN отключается и остается только обнаружение без STUN. + - **Пример**: + + ```toml + [network] + stun_use = false + ``` +## stun_servers + - **Ограничения / валидация**: `String[]`. Значения обрезаются; пустые значения удаляются; список очищается от дубликатов. Если этот ключ **не** задан явно, Telemt использует встроенный список STUN по умолчанию. + - **Описание**: Список STUN-серверов для определения публичного IP-адреса. + - **Пример**: + + ```toml + [network] + stun_servers = [ + "stun.l.google.com:19302", + "stun.stunprotocol.org:3478", + ] + ``` +## stun_tcp_fallback + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает резервный TCP для STUN в случае недоступности UDP-соединения. + - **Пример**: + + ```toml + [network] + stun_tcp_fallback = true + ``` +## http_ip_detect_urls + - **Ограничения / валидация**: `String[]`. + - **Описание**: HTTP-эндпоинты, используемые для определения публичного IP (резервный вариант после STUN). + - **Пример**: + + ```toml + [network] + http_ip_detect_urls = ["https://ifconfig.me/ip", "https://api.ipify.org"] + ``` +## cache_public_ip_path + - **Ограничения / валидация**: `String`. + - **Описание**: Путь к файлу, в котором кэшируется определённый публичный IP. + - **Пример**: + + ```toml + [network] + cache_public_ip_path = "cache/public_ip.txt" + ``` +## dns_overrides + - **Ограничения / валидация**: `String[]`. Каждая запись должна использовать формат `host:port:ip`. + - `host`: доменное имя (не должно быть пустым и не должно содержать `:`) + - `port`: `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`](#port) | `u16` | `443` | +| [`listen_addr_ipv4`](#listen_addr_ipv4) | `String` | `"0.0.0.0"` | +| [`listen_addr_ipv6`](#listen_addr_ipv6) | `String` | `"::"` | +| [`listen_unix_sock`](#listen_unix_sock) | `String` | — | +| [`listen_unix_sock_perm`](#listen_unix_sock_perm) | `String` | — | +| [`listen_tcp`](#listen_tcp) | `bool` | — (auto) | +| [`proxy_protocol`](#proxy_protocol) | `bool` | `false` | +| [`proxy_protocol_header_timeout_ms`](#proxy_protocol_header_timeout_ms) | `u64` | `500` | +| [`proxy_protocol_trusted_cidrs`](#proxy_protocol_trusted_cidrs) | `IpNetwork[]` | `[]` | +| [`metrics_port`](#metrics_port) | `u16` | — | +| [`metrics_listen`](#metrics_listen) | `String` | — | +| [`metrics_whitelist`](#metrics_whitelist) | `IpNetwork[]` | `["127.0.0.1/32", "::1/128"]` | +| [`max_connections`](#max_connections) | `u32` | `10000` | +| [`accept_permit_timeout_ms`](#accept_permit_timeout_ms) | `u64` | `250` | + +## port + - **Ограничения / валидация**: `u16`. + - **Описание**: Main proxy listen port (TCP). + - **Пример**: + + ```toml + [server] + port = 443 + ``` +## listen_addr_ipv4 + - **Ограничения / валидация**: `String` (необязательный параметр). Если задан, должен содержать валидный IPv4-адрес в формате строки. + - **Описание**: Прослушиваемый адрес в формате IPv4 (не задавайте этот параметр, если необходимо отключить прослушивание по IPv4). + - **Пример**: + + ```toml + [server] + listen_addr_ipv4 = "0.0.0.0" + ``` +## listen_addr_ipv6 + - **Ограничения / валидация**: `String` (необязательный параметр). Если задан, должен содержать валидный IPv6-адрес в формате строки. + - **Описание**: Прослушиваемый адрес в формате IPv6 (не задавайте этот параметр, если необходимо отключить прослушивание по IPv6). + - **Пример**: + + ```toml + [server] + listen_addr_ipv6 = "::" + ``` +## listen_unix_sock + - **Ограничения / валидация**: `String` (необязательный параметр). Не должен быть пустым, если задан. Unix only. + - **Описание**: Путь к Unix-сокету для прослушивания. Если этот параметр задан, `server.listen_tcp` по умолчанию устанавливается в `false` (если только не переопределён явно). + - **Пример**: + + ```toml + [server] + listen_unix_sock = "/run/telemt.sock" + ``` +## listen_unix_sock_perm + - **Ограничения / валидация**: `String` (необязательный параметр). Если задан, должен содержать восьмеричную строку со значением прав, например `"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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает поддержку разбора PROXY protocol от HAProxy (v1/v2) на входящих соединениях. При включении исходный IP клиента берётся из 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 protocol-заголовки (механизм безопасности). + - **Пример**: + + ```toml + [server] + proxy_protocol = true + proxy_protocol_trusted_cidrs = ["127.0.0.1/32", "10.0.0.0/8"] + ``` +## metrics_port + - **Ограничения / валидация**: `u16` (необязательный параметр). + - **Описание**: Порт для Prometheus-совместимого endpoint’а метрик. При задании включает прослушивание метрик (поведение прослушивания может быть переопределено через `metrics_listen`). + - **Пример**: + + ```toml + [server] + metrics_port = 9090 + ``` +## metrics_listen + - **Ограничения / валидация**: `String` (необязательный параметр). Если задан, значение должно быть в формате `IP:PORT`. + - **Описание**: Полный адрес привязки метрик (`IP:PORT`), переопределяет `metrics_port` и запускает прослушивание только на указанном адресе.. + - **Пример**: + + ```toml + [server] + metrics_listen = "127.0.0.1:9090" + ``` +## metrics_whitelist + - **Ограничения / валидация**: `IpNetwork[]`. + - **Описание**: Белый список CIDR для доступа к endpoint’у метрик. + - **Пример**: + + ```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` (milliseconds). `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`](#inline_conntrack_control) | `bool` | `true` | +| [`mode`](#mode) | `String` | `"tracked"` | +| [`backend`](#backend) | `String` | `"auto"` | +| [`profile`](#profile) | `String` | `"balanced"` | +| [`hybrid_listener_ips`](#hybrid_listener_ips) | `IpAddr[]` | `[]` | +| [`pressure_high_watermark_pct`](#pressure_high_watermark_pct) | `u8` | `85` | +| [`pressure_low_watermark_pct`](#pressure_low_watermark_pct) | `u8` | `70` | +| [`delete_budget_per_sec`](#delete_budget_per_sec) | `u64` | `4096` | + +## inline_conntrack_control + - **Ограничения / валидация**: `bool`. + - **Описание**: Главный переключатель для задачи conntrack-control: согласовывает правила сетевого фильтра **raw/notrack** для входяшего трафика (см. `mode`), раз в секунду измеряет нагрузку и при активном режиме нагрузки может выполнять удаления через **`conntrack -D`** для подходящих событий закрытия соединений (см. `delete_budget_per_sec`). Если отключён (`false`), notrack-правила удаляются, а удаление при нагрузке отключается. + - **Пример**: + + ```toml + [server.conntrack_control] + inline_conntrack_control = true + ``` +## mode + - **Ограничения / валидация**: `tracked`, `notrack` или `hybrid` (чувствителен к регистру, используется нижний регистр). + - **Описание**: + - **`tracked`**: не устанавливать notrack-правила, соединения полностью отслеживаются conntrack. + - **`notrack`**: помечает входящий TCP-трафик к server.port как notrack; цели берутся из `[server.listeners]`, либо из `server.listen_addr_ipv4 / server.listen_addr_ipv6` (неуказанные адреса означают «любой» для этого семейства). + - **`hybrid`**: notrack применяется только к адресам из `hybrid_listener_ips` (не должно быть пустым, проверяется при загрузке), остальные соединения отслеживаются обычным образом. + - **Пример**: + + ```toml + [server.conntrack_control] + mode = "notrack" + ``` +## backend + - **Ограничения / валидация**: `auto`, `nftables`или `iptables` (чувствителен к регистру, используется нижний регистр). + - **Описание**: Выбор набора инструментов для применения notrack-правил. + - **`auto`**: использует `nft`, если доступен, иначе - `iptables`/`ip6tables`. + - **`nftables / iptables`**: принудительно выбирает соответствующий backend; при отсутствии бинарника правила не применяются. В nft-режиме используется таблица `inet telemt_conntrack`, в `iptables` — цепочка TELEMT_NOTRACK в таблице raw. + - **Пример**: + + ```toml + [server.conntrack_control] + backend = "auto" + ``` +## profile + - **Ограничения / валидация**: `conservative`, `balanced`или `aggressive` (чувствителен к регистру, используется нижний регистр). + - **Описание**: При активном режиме **conntrack pressure mode** граничивает таймауты для снижения нагрузки: idle-время клиента, таймауты активности direct relay и политики idle middle relay. Более агрессивные профили используют более короткие ограничения. + - **Пример**: + + ```toml + [server.conntrack_control] + profile = "balanced" + ``` +## hybrid_listener_ips + - **Ограничения / валидация**: `IpAddr[]`. Значение не должно быть пустым, если `mode = "hybrid"`. Игнорируется для режимов `tracked` / `notrack`. + - **Описание**: Явный список прослушиваемых IP-адресов, к которым применяется notrack в hybrid-режиме (разделяется на IPv4 и IPv6 правила). + - **Пример**: + + ```toml + [server.conntrack_control] + mode = "hybrid" + hybrid_listener_ips = ["203.0.113.10", "2001:db8::1"] + ``` +## pressure_high_watermark_pct + - **Ограничения / валидация**: Должно быть в пределах `[1, 100]`. + - **Описание**: Порог входа в **conntrack pressure mode**. Переход происходит при любом из следующих условий: заполненность соединений относительно `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`. + - **Описание**: Режим **conntrack pressure mode** отключается только после **трех** последовательных односекундных выборок, когда все сигналы находятся на уровне этой нижней границы или ниже, а дельты времени ожидания приема/ME-очереди равны нулю (гистерезис). + - **Пример**: + + ```toml + [server.conntrack_control] + pressure_low_watermark_pct = 70 + ``` +## delete_budget_per_sec + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Максимальное количество попыток удаления через `conntrack -D` в секунду во время режима **conntrack pressure mode**. Ограничение реализовано через токен-бакет; применяется только к событиям закрытия с причинами **timeout**, **pressure** или **reset**. + - **Пример**: + + ```toml + [server.conntrack_control] + delete_budget_per_sec = 4096 + ``` + + +# [server.api] + +Примечание: В этом разделе также задается устаревший параметр `[server.admin_api]` (аналогично `[server.api]`). + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`enabled`](#enabled) | `bool` | `true` | +| [`listen`](#listen) | `String` | `"0.0.0.0:9091"` | +| [`whitelist`](#whitelist) | `IpNetwork[]` | `["127.0.0.0/8"]` | +| [`auth_header`](#auth_header) | `String` | `""` | +| [`request_body_limit_bytes`](#request_body_limit_bytes) | `usize` | `65536` | +| [`minimal_runtime_enabled`](#minimal_runtime_enabled) | `bool` | `true` | +| [`minimal_runtime_cache_ttl_ms`](#minimal_runtime_cache_ttl_ms) | `u64` | `1000` | +| [`runtime_edge_enabled`](#runtime_edge_enabled) | `bool` | `false` | +| [`runtime_edge_cache_ttl_ms`](#runtime_edge_cache_ttl_ms) | `u64` | `1000` | +| [`runtime_edge_top_n`](#runtime_edge_top_n) | `usize` | `10` | +| [`runtime_edge_events_capacity`](#runtime_edge_events_capacity) | `usize` | `256` | +| [`read_only`](#read_only) | `bool` | `false` | + +## enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает возможность управления через REST API. + - **Пример**: + + ```toml + [server.api] + enabled = true + ``` +## listen + - **Ограничения / валидация**: `String`. Должно быть в формате `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 + - **Ограничения / валидация**: `String`. Пустая строка отключает проверку заголовка аутентификации. + - **Описание**: Точное ожидаемое значение заголовка `Authorization` (static shared secret). + - **Пример**: + + ```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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает логику минимальных runtime-снимков endpoint’а. + - **Пример**: + + ```toml + [server.api] + minimal_runtime_enabled = true + ``` +## minimal_runtime_cache_ttl_ms + - **Ограничения / валидация**: `0..=60000` (миллисекунд). `0` - отключает кэширование. + - **Описание**: Время жизни минимальных runtime-снимков (в мс). + - **Пример**: + + ```toml + [server.api] + minimal_runtime_cache_ttl_ms = 1000 + ``` +## runtime_edge_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает runtime endpoint’ы для edge-данных (статистики/метрик). + - **Пример**: + + ```toml + [server.api] + runtime_edge_enabled = false + ``` +## runtime_edge_cache_ttl_ms + - **Ограничения / валидация**: `0..=60000` (миллисекунд). + - **Описание**: Время жизни кэша (в миллисекундах) для агрегированных данных (payload’ов) runtime edge. + - **Пример**: + + ```toml + [server.api] + runtime_edge_cache_ttl_ms = 1000 + ``` +## runtime_edge_top_n + - **Ограничения / валидация**: `1..=1000`. + - **Описание**: Размер выборки Top-N для рейтинга (leaderboard) edge-соединений. + - **Пример**: + + ```toml + [server.api] + runtime_edge_top_n = 10 + ``` +## runtime_edge_events_capacity + - **Ограничения / валидация**: `16..=4096`. + - **Описание**: Ёмкость кольцевого буфера для runtime edge-событий. + - **Пример**: + + ```toml + [server.api] + runtime_edge_events_capacity = 256 + ``` +## read_only + - **Ограничения / валидация**: `bool`. + - **Описание**: Переводит API в режим "только чтение". + - **Пример**: + + ```toml + [server.api] + read_only = false + ``` + + +# [[server.listeners]] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`ip`](#ip) | `IpAddr` | — | +| [`announce`](#announce) | `String` | — | +| [`announce_ip`](#announce_ip) | `IpAddr` | — | +| [`proxy_protocol`](#proxy_protocol) | `bool` | — | +| [`reuse_allow`](#reuse_allow) | `bool` | `false` | + +## ip + - **Ограничения / валидация**: Обязательный параметр. Значение должно содержать IP-адрес в формате строки. + - **Описание**: Адрес для listener’а. + - **Пример**: + + ```toml + [server.listeners] + ip = "0.0.0.0" + ``` +## announce + - **Ограничения / валидация**: `String` (необязательный параметр). Не должен быть пустым, если задан. + - **Описание**: Публичный IP-адрес или домен, объявляемый в proxy-ссылках для данного listener’а. Имеет приоритет над `announce_ip`. + - **Пример**: + + ```toml + [server.listeners] + ip = "0.0.0.0" + announce = "proxy.example.com" + ``` +## announce_ip + - **Ограничения / валидация**: `IpAddr` (необязательный параметр). Устарел. Используйте `announce`. + - **Описание**: Устаревший параметр для анонсирования IP. Во время загрузки конфигурации он переносится в `announce` если `announce` не задан. + - **Пример**: + + ```toml + [server.listeners] + ip = "0.0.0.0" + announce_ip = "203.0.113.10" + ``` +## proxy_protocol + - **Ограничения / валидация**: `bool` (необязательный параметр). Если задан, перезаписывает значение `server.proxy_protocol` для этого listener’а. + - **Описание**: Переопределение протокола PROXY для каждого listener’а. + - **Пример**: + + ```toml + [server] + proxy_protocol = false + + [server.listeners] + ip = "0.0.0.0" + proxy_protocol = true + ``` +## reuse_allow" +- `reuse_allow` + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает `SO_REUSEPORT` для совместного использования привязки нескольких экземпляров (позволяет нескольким экземплярам telemt прослушивать один и тот же `ip:port`). + - **Пример**: + + ```toml + [server.listeners] + ip = "0.0.0.0" + reuse_allow = false + ``` + + +# [timeouts] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`client_handshake`](#client_handshake) | `u64` | `30` | +| [`relay_idle_policy_v2_enabled`](#relay_idle_policy_v2_enabled) | `bool` | `true` | +| [`relay_client_idle_soft_secs`](#relay_client_idle_soft_secs) | `u64` | `120` | +| [`relay_client_idle_hard_secs`](#relay_client_idle_hard_secs) | `u64` | `360` | +| [`relay_idle_grace_after_downstream_activity_secs`](#relay_idle_grace_after_downstream_activity_secs) | `u64` | `30` | +| [`tg_connect`](#tg_connect) | `u64` | `10` | +| [`client_keepalive`](#client_keepalive) | `u64` | `15` | +| [`client_ack`](#client_ack) | `u64` | `90` | +| [`me_one_retry`](#me_one_retry) | `u8` | `12` | +| [`me_one_timeout_ms`](#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 + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает политику простоя клиента для промежуточного узла. + - **Пример**: + + ```toml + [timeouts] + relay_idle_policy_v2_enabled = true + ``` +## relay_client_idle_soft_secs + - **Ограничения / валидация**: Должно быть `> 0`; Должно быть меньше или равно `relay_client_idle_hard_secs`. + - **Описание**: Мягкий порог простоя (в секундах) для неактивности uplink клиента в промежуточном узле. При достижении этого порога сессия помечается как кандидат на простой и может быть удалена в зависимости от политики. + - **Пример**: + + ```toml + [timeouts] + relay_client_idle_soft_secs = 120 + ``` +## relay_client_idle_hard_secs + - **Ограничения / валидация**: Должно быть `> 0`; Должно быть больше или равно`relay_client_idle_soft_secs`. + - **Описание**: Жёсткий порог простоя (в секундах) для неактивности uplink клиента в промежуточном узле. При достижении этого порога сессия принудительно закрывается. + - **Пример**: + + ```toml + [timeouts] + relay_client_idle_hard_secs = 360 + ``` +## relay_idle_grace_after_downstream_activity_secs + - **Ограничения / валидация**: Должно быть `<= relay_client_idle_hard_secs`. + - **Описание**: Дополнительный период отсрочки жёсткого простоя (в секундах), добавляемый после недавней активности downstream. + - **Пример**: + + ```toml + [timeouts] + relay_idle_grace_after_downstream_activity_secs = 30 + ``` +## tg_connect + - **Ограничения / валидация**: `u64` (секунд). + - **Описание**: Таймаут подключения к upstream-серверу Telegram (в секундах). + - **Пример**: + + ```toml + [timeouts] + tg_connect = 10 + ``` +## client_keepalive + - **Ограничения / валидация**: `u64` (секунд). + - **Описание**: Таймаут keepalive для клиента.. + - **Пример**: + + ```toml + [timeouts] + client_keepalive = 15 + ``` +## client_ack + - **Ограничения / валидация**: `u64` (секунд). + - **Описание**: Таймаут подтверждения (ACK) от клиента в секундах. + - **Пример**: + + ```toml + [timeouts] + client_ack = 90 + ``` +## me_one_retry + - **Ограничения / валидация**: `u8`. + - **Описание**: Лимит быстрых попыток переподключения в сценариях DC с единственным endpoint'ом. + - **Пример**: + + ```toml + [timeouts] + me_one_retry = 12 + ``` +## me_one_timeout_ms + - **Ограничения / валидация**: `u64` (миллисекунд). + - **Описание**: Таймаут на одну быструю попытку переподключения (в миллисекундах) в логике reconnect для DC с единственным endpoint'ом. + - **Пример**: + + ```toml + [timeouts] + me_one_timeout_ms = 1200 + ``` + + +# [censorship] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`tls_domain`](#tls_domain) | `String` | `"petrovich.ru"` | +| [`tls_domains`](#tls_domains) | `String[]` | `[]` | +| [`unknown_sni_action`](#unknown_sni_action) | `"drop"`, `"mask"`, `"accept"` | `"drop"` | +| [`tls_fetch_scope`](#tls_fetch_scope) | `String` | `""` | +| [`tls_fetch`](#tls_fetch) | `Table` | built-in defaults | +| [`mask`](#mask) | `bool` | `true` | +| [`mask_host`](#mask_host) | `String` | — | +| [`mask_port`](#mask_port) | `u16` | `443` | +| [`mask_unix_sock`](#mask_unix_sock) | `String` | — | +| [`fake_cert_len`](#fake_cert_len) | `usize` | `2048` | +| [`tls_emulation`](#tls_emulation) | `bool` | `true` | +| [`tls_front_dir`](#tls_front_dir) | `String` | `"tlsfront"` | +| [`server_hello_delay_min_ms`](#server_hello_delay_min_ms) | `u64` | `0` | +| [`server_hello_delay_max_ms`](#server_hello_delay_max_ms) | `u64` | `0` | +| [`tls_new_session_tickets`](#tls_new_session_tickets) | `u8` | `0` | +| [`tls_full_cert_ttl_secs`](#tls_full_cert_ttl_secs) | `u64` | `90` | +| [`alpn_enforce`](#alpn_enforce) | `bool` | `true` | +| [`mask_proxy_protocol`](#mask_proxy_protocol) | `u8` | `0` | +| [`mask_shape_hardening`](#mask_shape_hardening) | `bool` | `true` | +| [`mask_shape_hardening_aggressive_mode`](#mask_shape_hardening_aggressive_mode) | `bool` | `false` | +| [`mask_shape_bucket_floor_bytes`](#mask_shape_bucket_floor_bytes) | `usize` | `512` | +| [`mask_shape_bucket_cap_bytes`](#mask_shape_bucket_cap_bytes) | `usize` | `4096` | +| [`mask_shape_above_cap_blur`](#mask_shape_above_cap_blur) | `bool` | `false` | +| [`mask_shape_above_cap_blur_max_bytes`](#mask_shape_above_cap_blur_max_bytes) | `usize` | `512` | +| [`mask_relay_max_bytes`](#mask_relay_max_bytes) | `usize` | `5242880` | +| [`mask_classifier_prefetch_timeout_ms`](#mask_classifier_prefetch_timeout_ms) | `u64` | `5` | +| [`mask_timing_normalization_enabled`](#mask_timing_normalization_enabled) | `bool` | `false` | +| [`mask_timing_normalization_floor_ms`](#mask_timing_normalization_floor_ms) | `u64` | `0` | +| [`mask_timing_normalization_ceiling_ms`](#mask_timing_normalization_ceiling_ms) | `u64` | `0` | + +## tls_domain + - **Ограничения / валидация**: Не должно быть пустым. Не должно содержать пробелы или `/`. + - **Описание**: Основной TLS-домен, используемый в профиле FakeTLS handshake и как домен SNI по умолчанию. + - **Пример**: + + ```toml + [censorship] + tls_domain = "example.com" + ``` +## tls_domains + - **Ограничения / валидация**: `String[]`. Когда задан, значение объединяется с `tls_domain` и очищается от дубликатов (первичный tls_domain всегда остается первым). + - **Описание**: Дополнительные домены TLS для создания нескольких прокси-ссылок. + - **Пример**: + + ```toml + [censorship] + tls_domain = "example.com" + tls_domains = ["example.net", "example.org"] + ``` +## unknown_sni_action + - **Ограничения / валидация**: `"drop"`, `"mask"` или `"accept"`. + - **Описание**: Действие для TLS ClientHello с неизвестным/ненастроенным SNI. + - **Пример**: + + ```toml + [censorship] + unknown_sni_action = "drop" + ``` +## tls_fetch_scope + - **Ограничения / валидация**: `String`. Значение обрезается во время загрузки; значение, состоящее только из пробелов, становится пустым. + - **Описание**: Тег области upstream, используемый для TLS-front метаданных при их получении. Пустое значение сохраняет стандартное поведение маршрутизации upstream. + - **Пример**: + + ```toml + [censorship] + tls_fetch_scope = "fetch" + ``` +# censorship.tls_fetch + - **Ограничения / валидация**: Таблица, см. секцию `[censorship.tls_fetch]` ниже. + - **Описание**: Настройки стратегии получения TLS-front метаданных (поведение загрузки и обновления bootstrap и данных эмуляции TLS).. + - **Пример**: + + ```toml + [censorship.tls_fetch] + strict_route = true + attempt_timeout_ms = 5000 + total_budget_ms = 15000 + ``` +## mask + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает режим маскировки/верхнего уровня. Принимаются все SNI, которые похожи на заданный в `tls_domain`. + - **Пример**: + + ```toml + [censorship] + mask = true + ``` +## mask_host + - **Ограничения / валидация**: `String` (необязательный параметр). + - Если задан параметр `mask_unix_sock`, `mask_host` не должен быть задан. + - Если не задан параметр `mask_host` и `mask_unix_sock` не задан, Telemt по умолчанию устанавливает для `mask_host` значение `tls_domain`. + - **Описание**: Хост, используемый для маскировки при TLS-fronting. + - **Пример**: + + ```toml + [censorship] + mask_host = "www.cloudflare.com" + ``` +## mask_port + - **Ограничения / валидация**: `u16`. + - **Описание**: Порт маскирующего upstream для TLS fronting. + - **Пример**: + + ```toml + [censorship] + mask_port = 443 + ``` +## mask_unix_sock + - **Ограничения / валидация**: `String` (optional). + - Значение не должно быть пустым, если задан. + - Unix only; + - На Unix системах, должно быть \(\le 107\) байт (ограничение длины пути). + - Взаимоисключающий с `mask_host`. + - **Описание**: Путь к Unix-сокету для mask-бэкенда вместо использования TCP `mask_host`/`mask_port`. + - **Пример**: + + ```toml + [censorship] + mask_unix_sock = "/run/telemt/mask.sock" + ``` +## fake_cert_len + - **Ограничения / валидация**: `usize`. Когда `tls_emulation = false` и используется значение по умолчанию, Telemt может рандомизировать его при запуске для обеспечения вариативности. + - **Описание**: Длина синтетического сертификатного payload’а, используемого при отсутствии данных для эмуляции. + - **Пример**: + + ```toml + [censorship] + fake_cert_len = 2048 + ``` +## tls_emulation + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает эмуляцию поведения сертификата/TLS из кэшированных реальных сайтов. + - **Пример**: + + ```toml + [censorship] + tls_emulation = true + ``` +## tls_front_dir + - **Ограничения / валидация**: `String`. + - **Описание**: Путь к директории для хранения кэша сайтов. + - **Пример**: + + ```toml + [censorship] + tls_front_dir = "tlsfront" + ``` +## server_hello_delay_min_ms + - **Ограничения / валидация**: `u64` (миллисекунд). + - **Описание**: Минимальная задержка `server_hello` (в миллисекундах) для защиты от идентификации по fingerprint'у. + - **Пример**: + + ```toml + [censorship] + server_hello_delay_min_ms = 0 + ``` +## server_hello_delay_max_ms + - **Ограничения / валидация**: `u64` (миллисекунд). Должно быть \(<\) `timeouts.client_handshake * 1000`. + - **Описание**: Максимальная задержка `server_hello` (в миллисекундах) для защиты от идентификации по fingerprint'у. + - **Пример**: + + ```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 для отправки полного сертификатного payload’а для каждой пары (домен, IP клиента). + - **Пример**: + + ```toml + [censorship] + tls_full_cert_ttl_secs = 90 + ``` +## alpn_enforce + - **Ограничения / валидация**: `bool`. + - **Описание**: Принудительно изменяет поведение возврата ALPN в соответствии с предпочтениями клиента. + - **Пример**: + + ```toml + [censorship] + alpn_enforce = true + ``` +## mask_proxy_protocol + - **Ограничения / валидация**: `u8`. `0` = выключен, `1` = v1 (текстовый), `2` = v2 (бинарный). + - **Описание**: Отправляет заголовок PROXY protocol при подключении к mask-бэкенду, позволяя бэкенду видеть реальный IP клиента. + - **Пример**: + + ```toml + [censorship] + mask_proxy_protocol = 0 + ``` +## mask_shape_hardening + - **Ограничения / валидация**: `bool`. + - **Описание**: Усиливает защиту канала формирования/маскировки (shape-channel) трафика client->mask за счёт контролируемого добавления хвостового padding'а к границам групп данных при завершении работы mask relay. + - **Пример**: + + ```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`. + - **Описание**: Минимальный размер группы данных, используемый при усилении канала формирования/маскировки трафика (shape-channel). + - **Пример**: + + ```toml + [censorship] + mask_shape_bucket_floor_bytes = 512 + ``` +## mask_shape_bucket_cap_bytes + - **Ограничения / валидация**: Должно быть `>= mask_shape_bucket_floor_bytes`. + - **Описание**: Максимальный размер группы данных, используемого для усиления канала формирования/маскировки трафика (shape-channel); трафик, превышающий этот лимит, больше не подвергается bucket-padding'у. + - **Пример**: + + ```toml + [censorship] + mask_shape_bucket_cap_bytes = 4096 + ``` +## mask_shape_above_cap_blur + - **Ограничения / валидация**: Требует, чтобы `mask_shape_hardening = true`. + - **Описание**: Добавляет ограниченное количество случайных байтов в конец данных (tail), даже если передаваемый размер уже превышает лимит. + - **Пример**: + + ```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`. + - **Описание**: Максимальное количество случайных дополнительных байтов, добавляемых сверх лимита, когда включено размытие данных(blur). + - **Пример**: + + ```toml + [censorship] + mask_shape_above_cap_blur = true + mask_shape_above_cap_blur_max_bytes = 64 + ``` +## mask_relay_max_bytes + - **Ограничения / валидация**: Должно быть `> 0`; Должно быть меньше или равно `67108864`. + - **Описание**: Максимальное количество байт, передаваемых в каждом направлении, на неаутентифицированной fallback маскировке. + - **Пример**: + + ```toml + [censorship] + mask_relay_max_bytes = 5242880 + ``` +## mask_classifier_prefetch_timeout_ms + - **Ограничения / валидация**: Должно быть в пределах `[5, 50]` (миллисекунд). + - **Описание**: Лимит времени ожидания (в миллисекундах) для расширения первых входящих данных в режиме fallback-маскировки. + - **Пример**: + + ```toml + [censorship] + mask_classifier_prefetch_timeout_ms = 5 + ``` +## mask_timing_normalization_enabled + - **Ограничения / валидация**: Когда `true`, требует, чтобы `mask_timing_normalization_floor_ms > 0` и `mask_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_enabled = true`; Должно быть меньше или равно `mask_timing_normalization_ceiling_ms`. + - **Описание**: Lower bound (ms) for masking outcome normalization target. + - **Пример**: + + ```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 + ``` + +## Примечания по усилению shape-channel (`[censorship]`) + +Эти параметры предназначены для снижения одного конкретного источника fingerprinting при маскировке: точного количества байт, отправляемых от прокси к `mask_host` при невалидном или зондирующем (probe) трафике. + +Без усиления защиты цензор часто может очень точно сопоставить длину входящего пробного запроса с длиной, наблюдаемой на стороне бэкенда (например, `5 + body_sent` на ранних этапах отклонения TLS). Это является сигналом для классификации на основе длины. + +Когда `mask_shape_hardening = true`, Telemt дополняет (padding) хвост потока **client → mask** до границы группы данных при завершении работы промежуточного звена: + +- Сначала измеряется общее количество байт, отправленных в mask. +- Затем выбирается bucket (группа данных), используя степени двойки, начиная с `mask_shape_bucket_floor_bytes`. +- Padding добавляется только если общее количество байт меньше`mask_shape_bucket_cap_bytes`. +- Если количество байт уже превышает cap, дополнительные данные не добавляются + +Это означает, что несколько близких по размеру пробных запросов (probe) объединяются в одну и ту же группу данных, наблюдаемых на стороне backend'а, что усложняет активную классификацию. + +Что каждый параметр меняет на практике: + +- `mask_shape_hardening` + Включает или отключает весь этап формирования (shaping) длины на fallback'е. +Если `false`, наблюдаемая на backend длина остаётся близкой к реальной длине переданного probe-запроса. +Если `true`, при быстром завершении соединения промежуточное звено может добавлять случайные padding-байты, чтобы итоговый размер попадал в заданную группу данных. +- `mask_shape_bucket_floor_bytes` +Устанавливает первую границу bucket’а, используемого для небольших probe-запросов. +Например: при значении 512 некорректный probe-запрос, который в обычном случае передал бы 37 байт, может быть дополнен до 512 байт при корректном завершении соединения (clean EOF). +Более высокие значения `mask_shape_bucket_floor_bytes` лучше скрывают очень маленькие probe-запросы, но увеличивают объём исходящего трафика. +- `mask_shape_bucket_cap_bytes` +Устанавливает наибольший bucket, до которого Telemt может выполнять padding по bucket-логике. +Например: при значении cap = `4096` итоговые `1800` байт могут быть дополнены до `2048` или `4096` в зависимости от "лестницы" bucket’ов, но если объём уже превышает `4096` байт, дальнейшее bucket-дополнение не выполняется. +Более высокие значения cap расширяют диапазон, в котором размеры объединяются в классы, но также увеличивают максимальные накладные расходы. +- Clean EOF имеет значение в conservative режиме +В профиле по умолчанию padding формы трафика намеренно реализован консервативно: он применяется только при корректном завершении соединения (clean relay shutdown), а не при каждом таймауте или "капельной" (drip) передаче. +Это позволяет избежать появления новых артефактов тайм-аута, которые некоторые серверные части или тесты интерпретируют как отдельные fingerprint'ы. + +Практические компромиссы: + +- Улучшенная защита от fingerprinting'a для канала формирования/маскировки трафика. +- Немного выше выходные накладные расходы для небольших зондов из-за padding'а. +- Система намеренно использует "консервативный" режим и это поведение включено по умолчанию. + +Рекомендуемые начальные настройки: + +- `mask_shape_hardening = true` (default) +- `mask_shape_bucket_floor_bytes = 512` +- `mask_shape_bucket_cap_bytes = 4096` + +## Уточнения по агрессивным режимам работы (`[censorship]`) + +`mask_shape_hardening_aggressive_mode` - это параметр, который включается вручную и предназначен для более сильного противодействия классификаторам. + +- Значение по умолчанию - `false`, чтобы сохранить консервативное поведение по тайм-ауту. +- Требует, чтобы `mask_shape_hardening = true`. +- Когда включено, не завершающиеся (non-EOF) запросы для маскировки, не передающие данные на backend, могут подвергаться shaping’у (формированию трафика). +- Когда включено вместе с "размытием" трафика выше порога cap, случайный дополнительный tail использует `[1, max]` instead of `[0, max]`. + +Что меняется при включении агрессивного режима: + +- Могут быть сформированы пути тайм-аута, не требующие бэкенда. +В режиме по умолчанию клиент, который держит сокет полуоткрытым и имеет тайм-аут, обычно не будет получать заполнение формы по этому пути. +В агрессивном режиме Telemt все равно может применять shaping к такому backend-silent соединению, если от backend не было получено ответа. +Это специально предназначено для активных зондов, которые пытаются избежать EOF, чтобы сохранить точную наблюдаемую длину. +- "Размытие" трафика выше порога cap всегда добавляет как минимум один байт. +В режиме по умолчанию для размытия трафика (blur) над максимальным пределом может быть выбрано значение «0», поэтому некоторые зонды слишком большого размера по-прежнему попадают на точную базовую длину пересылки. +В агрессивном режиме эта базовая выборка удаляется автоматически. +- Компромисс +Агрессивный режим повышает устойчивость к активным классификаторам на основе длины, но он более жесткие ограничения и менее консервативен. +Если вам важна строгая совместимость с логикой таймаутов и no-tail semantics, лучше оставить его выключенным. +Если же ваша модель угроз включает повторяющееся активное зондирование со стороны цензора, этот режим является более сильным вариантом защиты. + +Используйте этот режим только в том случае, если ваша модель угроз отдает приоритет устойчивости классификатора над строгой совместимостью с консервативной семантикой маскировки. + +## О "размытии" трафика (`[censorship]`) + +`mask_shape_above_cap_blur` Добавляет второй этап blur (размытия) для очень больших probe-запросов, которые уже превышают `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` в базовом режиме, чтобы избежать ненужного роста исходящего трафика + +Что это означает на практике: + +- Без above-cap blur + Probe-запрос, который пересылает `5005` байт, всё равно будет выглядеть для backend как `5005` байт, если он уже превышает cap. +- С включённым above-cap blur +Тот же самый probe-запрос может выглядеть как любое значение в ограниченном диапазоне выше его исходной длины. + Например, если `mask_shape_above_cap_blur_max_bytes = 64`: + Наблюдаемый на backend размер становится диапазоном `5005..5069` в режиме по умолчанию или `5006..5069` в агрессивном режиме. +- Выбор `mask_shape_above_cap_blur_max_bytes` +Малые значения уменьшают cost, но сохраняют большую различимость между сильно различающимися классами трафика, которые по размеру существенно больше обычного. +Большие значения сильнее размывают (blur) классы трафика, которые по размеру существенно больше обычного, но увеличивают исходящий трафик и вариативность выходных данных. + +## Примечания по нормализации таймингов (`[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` + +Если ваш backend или сеть сильно ограничены по пропускной способности, сначала уменьшите cap. Если в вашей среде пробные запросы (probes) всё ещё слишком легко различимы, постепенно увеличивайте нижнее значение. + + +# [censorship.tls_fetch] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`profiles`](#profiles) | `String[]` | `["modern_chrome_like", "modern_firefox_like", "compat_tls12", "legacy_minimal"]` | +| [`strict_route`](#strict_route) | `bool` | `true` | +| [`attempt_timeout_ms`](#attempt_timeout_ms) | `u64` | `5000` | +| [`total_budget_ms`](#total_budget_ms) | `u64` | `15000` | +| [`grease_enabled`](#grease_enabled) | `bool` | `false` | +| [`deterministic`](#deterministic) | `bool` | `false` | +| [`profile_cache_ttl_secs`](#profile_cache_ttl_secs) | `u64` | `600` | + +## profiles + - **Ограничения / валидация**: `String[]`. Пустой список возвращает значения по умолчанию; дубликаты удаляются с сохранением порядка. + - **Описание**: Упорядоченная цепочка fallback-профилей ClientHello для получения TLS-front метаданных. + - **Пример**: + + ```toml + [censorship.tls_fetch] + profiles = ["modern_chrome_like", "compat_tls12"] + ``` +## strict_route + - **Ограничения / валидация**: `bool`. + - **Описание**: Если значние `true` и настроен upstream-маршрут, то при ошибках подключения к upstream 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` (миллисекунд). + - **Описание**: Общий бюджет “реального времени” (wall-clock) на все попытки получения данных через TLS (в миллисекундах). + - **Пример**: + + ```toml + [censorship.tls_fetch] + total_budget_ms = 15000 + ``` +## grease_enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает случайные GREASE-style значения в выбранных расширениях ClientHello для получения трафика. + - **Пример**: + + ```toml + [censorship.tls_fetch] + grease_enabled = false + ``` +## deterministic + - **Ограничения / валидация**: `bool`. + - **Описание**: Включает детерминированную случайность ClientHello для отладки и тестов. Dместо настоящей случайности в TLS ClientHello используется фиксированная (повторяемая) “псевдослучайность”, чтобы поведение можно было воспроизводить. + - **Пример**: + + ```toml + [censorship.tls_fetch] + deterministic = false + ``` +## profile_cache_ttl_secs + - **Ограничения / валидация**: `u64` (секунд). `0` - отключает кэширование. + - **Описание**: Время жизни (TTL) записей кэша “победившего профиля” (winner-profile), используемых для получения данных через TLS. + - **Пример**: + + ```toml + [censorship.tls_fetch] + profile_cache_ttl_secs = 600 + ``` + +# [access] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`users`](#users) | `Map` | `{"default": "000…000"}` | +| [`user_ad_tags`](#user_ad_tags) | `Map` | `{}` | +| [`user_max_tcp_conns`](#user_max_tcp_conns) | `Map` | `{}` | +| [`user_max_tcp_conns_global_each`](#user_max_tcp_conns_global_each) | `usize` | `0` | +| [`user_expirations`](#user_expirations) | `Map>` | `{}` | +| [`user_data_quota`](#user_data_quota) | `Map` | `{}` | +| [`user_max_unique_ips`](#user_max_unique_ips) | `Map` | `{}` | +| [`user_max_unique_ips_global_each`](#user_max_unique_ips_global_each) | `usize` | `0` | +| [`user_max_unique_ips_mode`](#user_max_unique_ips_mode) | `"active_window"`, `"time_window"`, or `"combined"` | `"active_window"` | +| [`user_max_unique_ips_window_secs`](#user_max_unique_ips_window_secs) | `u64` | `30` | +| [`replay_check_len`](#replay_check_len) | `usize` | `65536` | +| [`replay_window_secs`](#replay_window_secs) | `u64` | `120` | +| [`ignore_time_skew`](#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 + - **Ограничения / валидация**: `Map`. + - **Описание**: Максимальное количество одновременных TCP-соединений для каждого пользователя. + - **Пример**: + + ```toml + [access.user_max_tcp_conns] + alice = 500 + ``` +## user_max_tcp_conns_global_each + - **Ограничения / валидация**: `usize`. `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 + - **Ограничения / валидация**: `Map>`. Каждое значение должно быть валидной датой и временем в формате RFC3339/ISO-8601. + - **Описание**: Временные метки истечения срока действия учетной записи пользователя (UTC). + - **Пример**: + + ```toml + [access.user_expirations] + alice = "2026-12-31T23:59:59Z" + ``` +## user_data_quota + - **Ограничения / валидация**: `Map`. + - **Описание**: Квота трафика на пользователя в байтах. + - **Пример**: + + ```toml + [access.user_data_quota] + alice = 1073741824 # 1 GiB + ``` +## user_max_unique_ips + - **Ограничения / валидация**: `Map`. + - **Описание**: Ограничение на количество уникальных IP-адресов, с которых выполняется подключение, для каждого пользователя. + - **Пример**: + + ```toml + [access.user_max_unique_ips] + alice = 16 + ``` +## user_max_unique_ips_global_each + - **Ограничения / валидация**: `usize`. `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"` и `"combined"`). + - **Пример**: + + ```toml + [access] + user_max_unique_ips_window_secs = 30 + ``` +## replay_check_len + - **Ограничения / валидация**: `usize`. + - **Описание**: Количество последних сообщений/запросов, которое система запоминает, чтобы не допустить их повторной отправки (replay). + - **Пример**: + + ```toml + [access] + replay_check_len = 65536 + ``` +## replay_window_secs + - **Ограничения / валидация**: `u64`. + - **Описание**: Как долго система "помнит" уже обработанные запросы, чтобы не принять их повторно (в секундах). + - **Пример**: + + ```toml + [access] + replay_window_secs = 120 + ``` +## ignore_time_skew + - **Ограничения / валидация**: `bool`. + - **Описание**: Отключает проверку расхождения (смещения) времени между клиентом и сервером в валидации защиты от повторной отправки (replay) + - **Пример**: + + ```toml + [access] + ignore_time_skew = false + ``` + + +# [upstreams] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`type`](#type) | `"direct"`, `"socks4"`, `"socks5"`, or `"shadowsocks"` | — | +| [`weight`](#weight) | `u16` | `1` | +| [`enabled`](#enabled) | `bool` | `true` | +| [`scopes`](#scopes) | `String` | `""` | +| [`interface`](#interface) | `String` | — | +| [`bind_addresses`](#bind_addresses) | `String[]` | — | +| [`url`](#url) | `String` | — | +| [`address`](#address) | `String` | — | +| [`user_id`](#user_id) | `String` | — | +| [`username`](#username) | `String` | — | +| [`password`](#password) | `String` | — | + +## type + - **Ограничения / валидация**: Обязательный параметр.`"direct"`, `"socks4"`, `"socks5"`, `"shadowsocks"`. + - **Описание**: Выбирает реализацию upstream-транспорта для этой записи в `[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). + - **Описание**: Приоритет, используемый при случайном выборе upstream-сервера (чем выше значение, тем чаще он выбирается). + - **Пример**: + + ```toml + [upstreams] + type = "direct" + weight = 10 + ``` +## enabled + - **Ограничения / валидация**: `bool`. + - **Описание**: Если установлено значение `false`, эта запись игнорируется и не используется при выборе upstream-сервера + - **Пример**: + + ```toml + [upstreams] + type = "socks5" + address = "127.0.0.1:9050" + enabled = false + ``` +## scopes + - **Ограничения / валидация**: `String`. CСписок, разделенный запятыми; пробелы обрезаются во время сопоставления + - **Описание**: Теги области (`scope`), используемые для фильтрации upstream-серверов на уровне запроса. Если в запросе указан `scope`, выбираются только те upstream’ы, у которых поле `scopes` содержит этот тег. Если scope в запросе не указан, допускаются только upstream’ы с пустым scopes. + - **Пример**: + + ```toml + [upstreams] + type = "socks4" + address = "10.0.0.10:1080" + scopes = "me, fetch, dc2" + ``` +## interface + - **Ограничения / валидация**: `String` (необязательный параметр). + - для `"direct"`: может быть IP-адресом (используется как явный local bind) или именем сетевого интерфейса ОС (резолвится в IP во время выполнения; только Unix). + - для `"socks4"`/`"socks5"`: поддерживает только, если `address` - это `IP:port`; если `address` - это имя хоста, interface binding игнорируется. + - для `"shadowsocks"`: passed to the shadowsocks connector as an optional outbound bind hint. + - **Описание**: Передаётся в коннектор Shadowsocks как необязательная подсказка для outbound bind. + - **Пример**: + + ```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», и ни один из них не соответствует целевому семейству, попытка подключения считается неудачной. + - **Описание**: Явно заданные локальные source адреса для исходящих прямых TCP-соединений. Если указано несколько адресов, они выбираются по алгоритму round-robin. + - **Пример**: + + ```toml + [upstreams] + type = "direct" + bind_addresses = ["192.0.2.10", "192.0.2.11"] + ``` +## url + - **Ограничения / валидация**: Применяется в случае, если `type = "shadowsocks"`. + - Должен быть действительный URL-адрес Shadowsocks, принятый `shadowsocks` контейнером. + - Плагины Shadowsocks не поддерживаются. + - Требует, чтобы `general.use_middle_proxy = false` ( Shadowsocks upstreams отклоняются в режиме ME (Middle-End)). + - **Описание**: 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`. + - **Описание**: Endpoint прокси-сервера SOCKS, используемый для upstream-подключений. + - **Пример**: + + ```toml + [upstreams] + type = "socks5" + address = "127.0.0.1:9050" + ``` +## user_id + - **Ограничения / валидация**: `String` (необязательный параметр). Используется только при `type = "socks4"`. + - **Описание**: User ID для команды CONNECT в SOCKS4. Примечание: если для запроса выбран scope, Telemt может переопределить это значение на выбранный scope. + - **Пример**: + + ```toml + [upstreams] + type = "socks4" + address = "127.0.0.1:1080" + user_id = "telemt" + ``` +## username + - **Ограничения / валидация**: `String` (необязательный параметр). Используется только при `type = "socks5"`. + - **Описание**: Имя пользователя SOCKS5 (для аутентификации по username/password). Примечание: если для запроса выбран scope, Telemt может переопределить это значение на выбранный scope. + - **Пример**: + + ```toml + [upstreams] + type = "socks5" + address = "127.0.0.1:9050" + username = "alice" + ``` +## password + - **Ограничения / валидация**: `String` (необязательный параметр). Используется только при `type = "socks5"`. + - **Описание**: Пароль SOCKS5 (для аутентификации по username/password). Примечание: если для запроса выбран scope, Telemt может переопределить это значение на выбранный scope. + - **Пример**: + + ```toml + [upstreams] + type = "socks5" + address = "127.0.0.1:9050" + username = "alice" + password = "secret" + ``` + +