Добавил опыт установки tproxy-server: заметки, сайт-маскировку и команду деплоя

This commit is contained in:
2026-08-31 00:51:35 +00:00
commit d02124712d
5 changed files with 206 additions and 0 deletions
+113
View File
@@ -0,0 +1,113 @@
# Установка 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).