Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
9seconds 9d24f92a57 Propagate keep alive settings from the config 4週間前
.github/workflows Increase timeout for CI artifacts build 1ヶ月前
antireplay fix: change module path to github.com/dolonet/mtg-multi 1ヶ月前
benchmarks Fix CI: benchmark lint exclusions and data race in doppel test 1ヶ月前
essentials Add validation of telegram connectivity 1ヶ月前
events fix: change module path to github.com/dolonet/mtg-multi 1ヶ月前
internal Propagate keep alive settings from the config 4週間前
ipblocklist fix: change module path to github.com/dolonet/mtg-multi 1ヶ月前
logger fix: change module path to github.com/dolonet/mtg-multi 1ヶ月前
mtglib Merge upstream: handshake timeout, GREASE cipher fix, no-default-TLS-cipher 4週間前
network Propagate keep alive settings from the config 4週間前
stats fix: change module path to github.com/dolonet/mtg-multi 1ヶ月前
.codecov.yml fix: change module path to github.com/dolonet/mtg-multi 1ヶ月前
.dockerignore Update ignores 5年前
.gitattributes Add PGO 1ヶ月前
.gitignore Update fork build config and add upstream sync 1ヶ月前
.golangci.toml Fix golangci config: use v2 linters.exclusions.rules syntax 1ヶ月前
.goreleaser.yml Update fork build config and add upstream sync 1ヶ月前
.mise.toml Fix build with profiling 1ヶ月前
BEST_PRACTICES.md Update docs 1ヶ月前
Dockerfile Support fragmented TLS handshake records 1ヶ月前
LICENSE Initial commit 8年前
README.md Add throttling docs to README 1ヶ月前
SECURITY.md Create SECURITY.md 5年前
buildinfo.go Update dependencies 3年前
escapecheck Merge remote-tracking branch 'upstream/master' 1ヶ月前
example.config.toml Propagate keep alive settings from the config 4週間前
go.mod fix: change module path to github.com/dolonet/mtg-multi 1ヶ月前
go.sum Update depndencies 1ヶ月前
main.go fix: change module path to github.com/dolonet/mtg-multi 1ヶ月前
mise.lock Update goreleaser 1ヶ月前
run_profile.go Refactoring 1ヶ月前
run_profile_tag_prof.go Fix build with profiling 1ヶ月前

README.md

mtg-multi

Fork of 9seconds/mtg with multi-secret support and per-user stats.

English | Русский


What’s different

Multiple secrets. Upstream mtg allows only one secret per instance. mtg-multi lets you define named secrets in the config — one per user. All secrets must share the same hostname.

[secrets]
alice = "ee367a189aee18fa31c190054efd4a8e9573746f726167652e676f6f676c65617069732e636f6d"
bob   = "ee0123456789abcdef0123456789abcd9573746f726167652e676f6f676c65617069732e636f6d"

Stats API. A lightweight HTTP endpoint that shows live per-user traffic.

api-bind-to = "127.0.0.1:9090"
GET /stats
{
  "started_at": "2026-03-29T10:30:00Z",
  "uptime_seconds": 3600,
  "total_connections": 15,
  "users": {
    "alice": {
      "connections": 8,
      "bytes_in": 1048576,
      "bytes_out": 2097152,
      "last_seen": "2026-03-29T11:25:30Z"
    }
  }
}

Connection throttling. Automatic per-user connection limits to protect the server from overload. A background goroutine recomputes caps every few seconds using a fair-share algorithm: small users keep their connections, remaining budget is split equally among heavy consumers. New connections from over-cap users are rejected; existing connections are not killed.

[throttle]
max-connections = 5000
check-interval = "5s"

Example: limit = 100, users A=1, B=1, C=90, D=110. A and B stay at 1. Remaining budget 98 is split: C and D are capped at 49 each.

Throttle state is exposed via the Stats API:

{
  "throttle": {
    "active": true,
    "limit": 5000,
    "caps": { "heavy-user": 2450 }
  }
}

Public IP override. Useful when auto-detection via ifconfig.co is unavailable.

public-ipv4 = "1.2.3.4"
public-ipv6 = "2001:db8::1"

Everything else — domain fronting, doppelganger, proxy chaining, blocklists, metrics — works exactly as in upstream. See the upstream README for details.

Quick start

Download a binary from Releases or build from source:

git clone https://github.com/dolonet/mtg-multi.git
cd mtg-multi
mise install && mise tasks run build

Generate secrets:

mtg-multi generate-secret --hex storage.googleapis.com

Minimal config:

bind-to = "0.0.0.0:443"
api-bind-to = "127.0.0.1:9090"

[throttle]
max-connections = 5000

# [secrets] must be the last section in the global scope —
# in TOML, all keys after a [section] become part of that table.
[secrets]
alice = "ee..."
bob   = "ee..."

Run:

mtg-multi run /etc/mtg/config.toml

See example.config.toml for all available options.


Чем отличается

Несколько секретов. В оригинальном mtg — один секрет на инстанс. mtg-multi позволяет задать именованные секреты в конфиге, по одному на пользователя. Все секреты должны использовать один и тот же hostname.

[secrets]
alice = "ee367a189aee18fa31c190054efd4a8e9573746f726167652e676f6f676c65617069732e636f6d"
bob   = "ee0123456789abcdef0123456789abcd9573746f726167652e676f6f676c65617069732e636f6d"

Stats API. HTTP-эндпоинт с live-статистикой трафика по пользователям.

api-bind-to = "127.0.0.1:9090"
GET /stats
{
  "started_at": "2026-03-29T10:30:00Z",
  "uptime_seconds": 3600,
  "total_connections": 15,
  "users": {
    "alice": {
      "connections": 8,
      "bytes_in": 1048576,
      "bytes_out": 2097152,
      "last_seen": "2026-03-29T11:25:30Z"
    }
  }
}

Троттлинг подключений. Автоматические per-user лимиты для защиты сервера от перегрузки. Фоновая горутина каждые несколько секунд пересчитывает капы по алгоритму fair-share: маленькие пользователи сохраняют свои подключения, оставшийся бюджет делится поровну между крупными потребителями. Новые подключения сверх капа отклоняются; существующие не разрываются.

[throttle]
max-connections = 5000
check-interval = "5s"

Пример: лимит = 100, пользователи A=1, B=1, C=90, D=110. A и B остаются на 1. Оставшийся бюджет 98 делится: C и D получают кап 49.

Состояние троттлинга доступно через Stats API:

{
  "throttle": {
    "active": true,
    "limit": 5000,
    "caps": { "heavy-user": 2450 }
  }
}

Ручное указание публичного IP. Для случаев, когда ifconfig.co недоступен с сервера.

public-ipv4 = "1.2.3.4"
public-ipv6 = "2001:db8::1"

Всё остальное — domain fronting, doppelganger, цепочки прокси, блоклисты, метрики — работает как в оригинале. Подробности в README upstream.

Быстрый старт

Скачайте бинарник из Releases или соберите из исходников:

git clone https://github.com/dolonet/mtg-multi.git
cd mtg-multi
mise install && mise tasks run build

Генерация секрета:

mtg-multi generate-secret --hex storage.googleapis.com

Минимальный конфиг:

bind-to = "0.0.0.0:443"
api-bind-to = "127.0.0.1:9090"

[throttle]
max-connections = 5000

# [secrets] должен быть последней секцией в глобальном scope —
# в TOML все ключи после [section] становятся частью этой таблицы.
[secrets]
alice = "ee..."
bob   = "ee..."

Запуск:

mtg-multi run /etc/mtg/config.toml

Все доступные опции — в example.config.toml.