mirror of
https://gitverse.ru/kpa39l/tproxy-web.git
synced 2026-09-29 09:55:03 +00:00
Добавил опыт установки tproxy-server: заметки, сайт-маскировку и команду деплоя
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
public/
|
||||
*.tmp
|
||||
.secret*
|
||||
@@ -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).
|
||||
@@ -0,0 +1,51 @@
|
||||
# tproxy-web
|
||||
|
||||
Развёртывание WEB Proxy для Telegram Desktop на собственном сервере
|
||||
(telegramdesktop/tproxy-server) + заметки по установке и проблемам.
|
||||
|
||||
Схема:
|
||||
|
||||
```
|
||||
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)
|
||||
```
|
||||
|
||||
## Состав
|
||||
|
||||
- `INSTALL_NOTES.md` — полный опыт установки на Debian 13 (VPS03, Hostkey): шаги,
|
||||
проблемы и решения (права MTProxy, флейк go test, сетевая проверка).
|
||||
- `deploy/mask-site/index.html` — сайт-маскировка (нейтральная личная страница,
|
||||
отдаётся по HTTPS вместо прокси-ответов на обычные запросы).
|
||||
- `deploy/install-command.sh` — команда установки (install.sh от upstream).
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
```bash
|
||||
# 1. Клонировать upstream и этот репозиторий
|
||||
git clone https://github.com/telegramdesktop/tproxy-server.git /tmp/tproxy-server
|
||||
# 2. Подготовить secret и сайт-маскировку
|
||||
openssl rand -hex 16 > /tmp/tproxy-secret.txt # 32 hex
|
||||
cp -r deploy/mask-site /tmp/tproxy-site
|
||||
# 3. Загрузить на сервер и запустить установку
|
||||
cd /tmp/tproxy-server
|
||||
./deploy/install.sh --hostname YOUR.HOSTNAME --email you@example.com \
|
||||
--site-dir /tmp/tproxy-site --secret "$(cat /tmp/tproxy-secret.txt)"
|
||||
# 4. ПОСЛЕ установки — починить права MTProxy (см. INSTALL_NOTES.md, п.1):
|
||||
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
|
||||
# 5. Проверить
|
||||
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8081/readyz # 200
|
||||
```
|
||||
|
||||
## Клиент (Telegram Desktop)
|
||||
|
||||
Settings → Advanced → Connection Type → Use custom proxy → NEW PROXY → WEB Proxy:
|
||||
- hostname: ваш домен
|
||||
- secret: (из /tmp/tproxy-secret.txt)
|
||||
|
||||
## Ссылки
|
||||
|
||||
- Upstream: https://github.com/telegramdesktop/tproxy-server
|
||||
- Статья в блоге: https://dedinit.ru/ (2026-08-31, установка tproxy-server)
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Команда установки tproxy-server (обёртка над upstream install.sh)
|
||||
# Детали и проблемы: см. INSTALL_NOTES.md
|
||||
set -euo pipefail
|
||||
|
||||
HOSTNAME="${1:?usage: $0 HOSTNAME EMAIL}"
|
||||
EMAIL="${2:?usage: $0 HOSTNAME EMAIL}"
|
||||
SITE_DIR="${SITE_DIR:-$(dirname "$0")/mask-site}"
|
||||
SECRET_FILE="${SECRET_FILE:-/tmp/tproxy-secret.txt}"
|
||||
|
||||
if [ ! -f "$SECRET_FILE" ]; then
|
||||
echo "secret not found at $SECRET_FILE, generating..."
|
||||
openssl rand -hex 16 > "$SECRET_FILE"
|
||||
chmod 600 "$SECRET_FILE"
|
||||
fi
|
||||
|
||||
./deploy/install.sh --hostname "$HOSTNAME" --email "$EMAIL" \
|
||||
--site-dir "$SITE_DIR" --secret "$(cat "$SECRET_FILE")"
|
||||
@@ -0,0 +1,21 @@
|
||||
<!doctype html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Nixg — личная страница</title>
|
||||
<style>
|
||||
:root { color-scheme: light dark; }
|
||||
body { font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; max-width: 42em; margin: 3em auto; padding: 0 1em; line-height: 1.6; }
|
||||
h1 { font-weight: 600; }
|
||||
a { color: #2456a6; }
|
||||
footer { margin-top: 3em; color: #888; font-size: 0.85em; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Nixg</h1>
|
||||
<p>Личная страница. Здесь пока тихо — проект в работе.</p>
|
||||
<p>Контакты: <a href="mailto:kpa39l@yandex.ru">kpa39l@yandex.ru</a></p>
|
||||
<footer>© 2026 Nixg</footer>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user