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

109 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# tproxy-server — детали установки 2026-08-31 (VPS03, Hostkey)
Полный опыт развёртывания telegramdesktop/tproxy-server на Debian 13
(77.67.89.154, vps03.nixg.ru). Резюме в SKILL.md; здесь — команды и транскрипты.
## Установка
```bash
# 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). Точная проверка — различить:
```bash
# снаружи (другая машина):
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 не может прочитать бинарь.
```bash
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 (пример на проде):
```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 это правильный формат.
## Проверка после установки (полная)
```bash
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
```bash
tar czf - tproxy-server/ | ssh root@HOST 'mkdir -p /tmp/tproxy-server && tar xzf - -C /tmp'
```