commit d02124712d390cb26a671b78264a4794af69ed4f Author: estorozhenko Date: Mon Aug 31 00:51:35 2026 +0000 Добавил опыт установки tproxy-server: заметки, сайт-маскировку и команду деплоя diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c649467 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +public/ +*.tmp +.secret* diff --git a/INSTALL_NOTES.md b/INSTALL_NOTES.md new file mode 100644 index 0000000..d900ddb --- /dev/null +++ b/INSTALL_NOTES.md @@ -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). \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d49ec04 --- /dev/null +++ b/README.md @@ -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) \ No newline at end of file diff --git a/deploy/install-command.sh b/deploy/install-command.sh new file mode 100755 index 0000000..e9af692 --- /dev/null +++ b/deploy/install-command.sh @@ -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")" \ No newline at end of file diff --git a/deploy/mask-site/index.html b/deploy/mask-site/index.html new file mode 100644 index 0000000..50add12 --- /dev/null +++ b/deploy/mask-site/index.html @@ -0,0 +1,21 @@ + + + + + +Nixg — личная страница + + + +

Nixg

+

Личная страница. Здесь пока тихо — проект в работе.

+

Контакты: kpa39l@yandex.ru

+ + + \ No newline at end of file