Files
tproxy-web/INSTALL_NOTES.md
T

113 lines
6.2 KiB
Markdown
Raw 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 на VPS03 (Hostkey) — опыт 2026-08-31
Репозиторий: https://github.com/telegramdesktop/tproxy-server
Сервер: VPS03, 77.67.89.154 (Hostkey, Debian 13), hostname vps03.nixg.ru
Назначение: WEB Proxy для Telegram Desktop (Telegram Desktop → HTTPS:443 → Caddy → tproxy-server:8080 → MTProxy:2398 → Telegram)
## Схема
```
Telegram Desktop → HTTPS 443 → Caddy → tproxy-server (127.0.0.1:8080) → MTProxy (0.0.0.0:2398) → Telegram
└ admin 127.0.0.1:8081 (/readyz, /healthz)
```
Снаружи всё выглядит как обычный HTTPS-сайт на 443 — Caddy проксирует ВЕСЬ трафик на
tproxy-server, который сам различает: обычные запросы отдаёт сайт-маскировку
(public_dir), запросы WEB Proxy — гонит в MTProxy.
## Установка (кратко)
1. Склонировать репозиторий, загрузить на сервер (tar+ssh; rsync на сервере не обязателен).
2. Подготовить статический сайт-маскировку (нейтральный `index.html`, НЕ сигнатурный,
без упоминаний Telegram) и secret (32 hex-символа, `openssl rand -hex 16`).
3. Запустить:
```bash
./deploy/install.sh --hostname vps03.nixg.ru \
--email kpa39l@yandex.ru --site-dir /tmp/tproxy-site \
--secret "$(cat /tmp/tproxy-secret.txt)"
```
install.sh ставит: ca-certificates curl nftables, Caddy 2.11.4, Go 1.26.5,
собирает tproxy-server, MTProxy (pinned commit f36d8af), создаёт systemd-сервисы:
`tproxy-server`, `mtproxy`, `tproxy-firewall`, `caddy`, таймер `refresh-mtproxy-config`.
## Проблемы и решения
### 1. `mtproxy.service` падает: status=203/EXEC (readyz 503)
**Симптом:** после install.sh `tproxy-server` активен, но `mtproxy.service` —
`Active: failed (Result: exit-code), status=203/EXEC`, readyz → 503, порт 2398 не слушается.
**Причина:** install.sh собирает MTProxy в `/opt/MTProxy/objs/bin/mtproto-proxy`,
но из-за umask бинарь и каталоги получают права `700 root:root`. Юнит
`mtproxy.service` запускается от пользователя `mtproxy` (NoNewPrivileges=true,
ProtectSystem=strict) — процесс не может прочитать бинарь/войти в каталог → 203/EXEC.
**Решение:**
```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: active (running), слушает 0.0.0.0:2398, readyz → 200
```
### 2. Флейк `go test ./...` в install.sh: TestLoadAcceptsSystemdCredentialReadPermissions
**Симптом:** первый прогон install.sh (холодный кэш Go, сборка всех пакетов параллельно)
падает: `internal/config` — тест принимает group/other-readable profiles вне
credential dir. Повторный `go test ./...` (тёплый кэш) — PASS.
**Вывод:** это гонка/флейк при холодном параллельном прогоне тестов, не баг кода.
Просто перезапустить install.sh — дальше идёт нормально.
### 3. «tproxy-server did not become ready», install.sh exit 1
**Симптом:** install.sh в конце не дождался readyz (потому что MTProxy упал — см. п.1).
**Решение:** починить mtproxy (п.1) — readyz сам станет 200. Повторный запуск
install.sh безопасен (идемпотентен).
### 4. Не открывались порты 80/443 «снаружи» — ложная тревога
**Симптом:** curl снаружи на 80/443 не отвечал → подозрение на firewall провайдера
(Hostkey). В панели Hostkey НЕТ настроек firewall/прокси — искать не нужно.
**Правда:** порты открыты по умолчанию. curl не отвечал, потому что на 80/443
просто НИЧЕГО не слушало (connection refused). Проверка: поднять временный
`python3 -m http.server 80` → TCP connect снаружи OK. Вывод: firewall провайдера
порты не режет; после установки Caddy слушает 80/443.
### 5. rsync отсутствует на сервере
**Симптом:** в README рекомендуется rsync для загрузки дерева. На Debian 13 minimal
rsync не установлен.
**Решение:** загрузка tar-архивом через ssh:
```bash
tar czf - tproxy-server/ | ssh root@host 'mkdir -p /tmp/tproxy-server && tar xzf - -C /tmp'
```
## Проверка после установки
```bash
systemctl status tproxy-server mtproxy tproxy-firewall caddy # все active
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-серт
ss -tlnp | grep -E ':80 |:443 |:2398|:8080|:8081'
nft list ruleset | grep -E '2398|8888' # iifname != "lo" tcp dport {2398,8888} drop
```
Безопасность: tproxy-firewall (nft) закрывает бэкенд MTProxy 2398/8888 от внешнего
мира (drop для не-loopback) — наружу видны только 80/443.
## Настройка клиента (Telegram Desktop)
Settings → Advanced → Connection Type → Use custom proxy → NEW PROXY → WEB Proxy:
- hostname: vps03.nixg.ru
- secret: (32 hex из шага 2)
## Ссылки
- Официальный README: https://github.com/telegramdesktop/tproxy-server
- Свежие целевые серверы MTProxy обновляются таймером refresh-mtproxy-config (daily).