Files
telegram-web-proxy/references/tproxy-server-web-proxy.md
T
2026-09-06 13:51:09 +00:00

5.2 KiB
Raw Blame History

tproxy-server — детали установки 2026-08-31 (VPS03, Hostkey)

Полный опыт развёртывания telegramdesktop/tproxy-server на Debian 13 (77.67.89.154, vps03.nixg.ru). Резюме в SKILL.md; здесь — команды и транскрипты.

Установка

# 1. Clone upstream (локально, потом tar+ssh на сервер — rsync отсутствует)
git clone --depth 1 https://github.com/telegramdesktop/tproxy-server.git

# 2. Secret
openssl rand -hex 16 > /tmp/tproxy-secret.txt   # 32 hex, chmod 600

# 3. Сайт-маскировка — /tmp/tproxy-site/index.html
#    НЕЙТРАЛЬНАЯ страница ("личная страница"), без слова Telegram и сигнатур.

# 4. install.sh
./deploy/install.sh --hostname vps03.nixg.ru --email kpa39l@yandex.ru \
  --site-dir /tmp/tproxy-site --secret "$(cat /tmp/tproxy-secret.txt)"

install.sh (v.2026) ставит: ca-certificates, curl, nftables; Caddy 2.11.4 (бинарник с GitHub); Go 1.26.5 (/opt/go*); собирает tproxy-server → /usr/local/bin; MTProxy (pinned commit f36d8af) → /opt/MTProxy; systemd: tproxy-server, mtproxy, tproxy-firewall, caddy; таймер refresh-mtproxy-config (daily).

Схема сервисов

  • tproxy-server: ExecStart=/usr/local/bin/tproxy-server -config /etc/tproxy-server/config.json, LoadCredential=profiles.json:/etc/tproxy-server/profiles.json
  • listen 127.0.0.1:8080 (relay), admin 127.0.0.1:8081 (/readyz /healthz)
  • mtproxy: пользователь mtproxy, ExecStart=/opt/MTProxy/objs/bin/mtproto-proxy ...
  • firewall (nft): iifname != "lo" tcp dport {2398,8888} drop — бэкенд закрыт от внешнего мира, наружу только 80/443.

Диагностика «не открыты порты» (важно!)

Симптом: curl http://HOST/ и https://HOST/ снаружи не отвечают (fail), хотя локально порты слушаются (python3 http.server на :80 отвечает). Подозрение на firewall провайдера (Hostkey) — в панели настроек firewall НЕТ.

Правда: порты у Hostkey открыты по умолчанию, firewall нет. curl не отвечал, потому что на 80/443 НИЧЕГО не слушало (refused). Точная проверка — различить:

# снаружи (другая машина):
timeout 8 bash -c 'cat < /dev/null > /dev/tcp/HOST/80 && echo OPEN || echo "rc=$?"'
# refused → нет слушателя (нормально, лечится установкой)
# timeout → firewall/DPI режет

Грабли mtproxy 203/EXEC

После install.sh: systemctl status mtproxy → failed, status=203/EXEC; readyz 503, healthz 200, порт 2398 не слушается. Причина: umask даёт /opt/MTProxy/objs/bin и бинарю права 700 root:root; юнит с User=mtproxy + NoNewPrivileges + ProtectSystem=strict не может прочитать бинарь.

chmod 755 /opt/MTProxy /opt/MTProxy/objs /opt/MTProxy/objs/bin
chown root:mtproxy /opt/MTProxy/objs/bin/mtproto-proxy
chmod 750 /opt/MTProxy/objs/bin/mtproto-proxy
systemctl restart mtproxy   # active (running), readyz → 200

Флейк go test

Первый go test ./... (холодный кэш) упал: internal/config: TestLoadAcceptsSystemdCredentialReadPermissions: group/other-readable profiles file outside a credential directory was accepted. Повторный (тёплый кэш) — PASS. Это гонка холодного параллельного прогона. Перезапустить install.sh — идемпотентен.

Мульти-секреты

profiles.json (пример на проде):

{"profiles":[{"name":"default","secret":"<hex32>","backend":"127.0.0.1:2398"}]}

Добавить второй профиль → массив из двух объектов, systemctl restart tproxy-server. Лимит max_profiles 32 (config.json). Права profiles.json — 600 root; LoadCredential читается при старте.

Формат secret: 16 байт (32 hex) обычный, или 17 байт с префиксом dd (fake-TLS/DD). openssl rand -hex 16 → обычный 32-hex, для Telegram Desktop WEB Proxy это правильный формат.

Проверка после установки (полная)

systemctl status tproxy-server mtproxy tproxy-firewall caddy
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8081/readyz   # 200
curl -s -o /dev/null -w '%{http_code}' https://vps03.nixg.ru/          # 200
openssl s_client -connect vps03.nixg.ru:443 -servername vps03.nixg.ru  # LE cert
ss -tlnp | grep -E ':80 |:443|:2398|:8080|:8081'
nft list ruleset | grep -E '2398|8888'

Снаружи: 443 OPEN, 8080 refused (бэкенд скрыт), 2398 timeout (nft drop — не светится). Сайт отдаётся на /, HTTP → 308 → HTTPS.

Загрузка дерева без rsync

tar czf - tproxy-server/ | ssh root@HOST 'mkdir -p /tmp/tproxy-server && tar xzf - -C /tmp'