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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dolonet ab39fbb441
Merge pull request #8 from dolonet/fix/toml-section-order
hace 1 mes
.github/workflows Increase timeout for CI artifacts build hace 1 mes
antireplay fix: change module path to github.com/dolonet/mtg-multi hace 1 mes
benchmarks Fix CI: benchmark lint exclusions and data race in doppel test hace 1 mes
essentials Add validation of telegram connectivity hace 1 mes
events fix: change module path to github.com/dolonet/mtg-multi hace 1 mes
internal Merge remote-tracking branch 'upstream/master' into fix/toml-section-order hace 1 mes
ipblocklist fix: change module path to github.com/dolonet/mtg-multi hace 1 mes
logger fix: change module path to github.com/dolonet/mtg-multi hace 1 mes
mtglib Merge remote-tracking branch 'origin/master' into fix/toml-section-order hace 1 mes
network fix: change module path to github.com/dolonet/mtg-multi hace 1 mes
stats fix: change module path to github.com/dolonet/mtg-multi hace 1 mes
.codecov.yml fix: change module path to github.com/dolonet/mtg-multi hace 1 mes
.dockerignore Update ignores hace 5 años
.gitattributes Add PGO hace 1 mes
.gitignore Update fork build config and add upstream sync hace 1 mes
.golangci.toml Fix golangci config: use v2 linters.exclusions.rules syntax hace 1 mes
.goreleaser.yml Update fork build config and add upstream sync hace 1 mes
.mise.toml Fix build with profiling hace 1 mes
BEST_PRACTICES.md Update docs hace 1 mes
Dockerfile Support fragmented TLS handshake records hace 1 mes
LICENSE Initial commit hace 8 años
README.md fix: move [secrets] after global keys in config examples hace 1 mes
SECURITY.md Create SECURITY.md hace 5 años
buildinfo.go Update dependencies hace 3 años
escapecheck Merge remote-tracking branch 'upstream/master' hace 1 mes
example.config.toml fix: move [secrets] after global keys in config examples hace 1 mes
go.mod fix: change module path to github.com/dolonet/mtg-multi hace 1 mes
go.sum Update depndencies hace 1 mes
main.go fix: change module path to github.com/dolonet/mtg-multi hace 1 mes
mise.lock Update linter hace 1 mes
run_profile.go Refactoring hace 1 mes
run_profile_tag_prof.go Fix build with profiling hace 1 mes

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"
    }
  }
}

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"

# [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"
    }
  }
}

Ручное указание публичного 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"

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

Запуск:

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

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