ru1: WEB-прокси Telegram вместо telemt
На ru.ruzzy.dev:443 поднят официальный tproxy-server (relay, carrier websocket) перед официальным MTProxy на loopback. Фронт — nginx в ~/gost, сертификат только на ru.ruzzy.dev. - MTProxy: --nat-info 10.8.1.4:161.97.93.252 вручную — трафик к Telegram выходит через wg0 с IP fr1, автоопределение install.sh ошиблось бы и прокси молча не отвечал бы. - relay на 8090/8091: 8080 занят cadvisor. - telemt удалён окончательно (контейнер, образ, конфиг, том). - certbot до этого не работал вовсе: сертификат был просрочен с 2026-07-01, продлён и запущен. stacks/tproxy/: compose и nginx.conf стека ~/gost, setup-ru1.sh — однократная root-установка relay и MTProxy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
123cdaa19b
commit
2ab38bc1f8
@@ -0,0 +1,25 @@
|
||||
# ru1: ~/gost/docker-compose.yml (каталог и имя проекта `gost` — исторические).
|
||||
# Фронт WEB-прокси Telegram. Сам relay и MTProxy — systemd на хосте
|
||||
# (setup-ru1.sh), nginx в host-network проксирует на 127.0.0.1:8090.
|
||||
services:
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
container_name: nginx
|
||||
network_mode: host
|
||||
restart: unless-stopped
|
||||
# certbot живёт в отдельном контейнере и не может дёрнуть nginx —
|
||||
# перечитываем сертификаты раз в 6 часов сами.
|
||||
command: ["/bin/sh", "-c", "while :; do sleep 6h; nginx -s reload; done & exec nginx -g 'daemon off;'"]
|
||||
volumes:
|
||||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
- ./certbot/conf:/etc/letsencrypt:ro
|
||||
- ./certbot/www:/var/www/certbot:ro
|
||||
|
||||
certbot:
|
||||
image: certbot/certbot
|
||||
container_name: certbot
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./certbot/conf:/etc/letsencrypt
|
||||
- ./certbot/www:/var/www/certbot
|
||||
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --quiet; sleep 12h & wait $${!}; done;'"
|
||||
@@ -0,0 +1,67 @@
|
||||
events {}
|
||||
|
||||
http {
|
||||
server_tokens off;
|
||||
|
||||
# Ничего не логируем по ru.ruzzy.dev: в URI bridge-страницы — capability,
|
||||
# в Sec-WebSocket-Protocol — токен сессии (требование tproxy-server).
|
||||
access_log off;
|
||||
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' "";
|
||||
}
|
||||
|
||||
upstream tproxy_relay {
|
||||
server 127.0.0.1:8090; # tproxy-server (systemd), 8080 занят cadvisor
|
||||
keepalive 32;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name ru.ruzzy.dev;
|
||||
|
||||
location /.well-known/acme-challenge/ {
|
||||
root /var/www/certbot;
|
||||
}
|
||||
|
||||
location / {
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
# Mode A из tproxy-server: relay — единственный шлюз хоста, он же отдаёт
|
||||
# публичный сайт (/srv/tproxy-site). Никаких отдельных location под сайт,
|
||||
# иначе ответы сайта и транспорта станут различимы для зондирования.
|
||||
server {
|
||||
listen 443 ssl;
|
||||
http2 on;
|
||||
server_name ru.ruzzy.dev;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/ru.ruzzy.dev/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/ru.ruzzy.dev/privkey.pem;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||
gzip on;
|
||||
|
||||
# Пачки uplink до 2 MiB; дефолтный 1 MiB ломает транспорт с 413.
|
||||
client_max_body_size 4m;
|
||||
|
||||
location / {
|
||||
proxy_pass http://tproxy_relay;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
# Ровно один адрес: список relay отвергает.
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
|
||||
# long poll relay — 25 с; не резать и не буферизовать.
|
||||
proxy_read_timeout 90s;
|
||||
proxy_send_timeout 90s;
|
||||
proxy_buffering off;
|
||||
proxy_request_buffering off;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env bash
|
||||
# Однократная установка WEB-прокси Telegram (tproxy-server + официальный MTProxy)
|
||||
# на ru1. Запускать от root из каталога с исходниками tproxy-server:
|
||||
# sudo bash /tmp/tproxy-server/setup-ru1.sh
|
||||
# Повторный запуск безопасен: секрет и token.key не перегенерируются.
|
||||
#
|
||||
# Отличия от deploy/install.sh апстрима:
|
||||
# - без Caddy: 80/443 держит nginx в docker (~/gost), он проксирует всё в relay;
|
||||
# - relay на 127.0.0.1:8090/8091 — 8080 занят cadvisor (*:8080);
|
||||
# - NAT задан вручную: трафик к Telegram идёт через wg0 и выходит с IP fr1,
|
||||
# а автоопределение install.sh спросило бы ifconfig-сервис через ens3
|
||||
# и получило 85.198.109.86 — MTProxy молча перестал бы отвечать клиентам;
|
||||
# - без base path: его пока понимает только Desktop.
|
||||
set -euo pipefail
|
||||
umask 077
|
||||
|
||||
repo="$(cd "$(dirname "$0")" && pwd)"
|
||||
hostname=ru.ruzzy.dev
|
||||
nat_args="--nat-info 10.8.1.4:161.97.93.252"
|
||||
|
||||
[[ "${EUID}" -eq 0 ]] || { echo "run as root" >&2; exit 1; }
|
||||
cd "$repo"
|
||||
|
||||
# 1. Официальный MTProxy (закреплённый коммит, sha256) + конфиг Telegram.
|
||||
bash deploy/install-mtproxy.sh
|
||||
|
||||
# 2. Relay.
|
||||
id tproxy >/dev/null 2>&1 || useradd --system --home /nonexistent --shell /usr/sbin/nologin tproxy
|
||||
install -o root -g root -m 0755 tproxy-server.bin /usr/local/bin/tproxy-server
|
||||
|
||||
install -d -o root -g root -m 0755 /srv/tproxy-site
|
||||
install -o root -g root -m 0644 /home/mik/gost/nginx/html/index.html /srv/tproxy-site/index.html
|
||||
|
||||
install -d -o root -g tproxy -m 0750 /etc/tproxy-server
|
||||
bash deploy/ensure-token-key.sh
|
||||
|
||||
if [[ ! -f /etc/tproxy-server/profiles.json ]]; then
|
||||
secret="$(openssl rand -hex 16)"
|
||||
printf '{"profiles":[{"name":"default","secret":"%s","backend":"127.0.0.1:2398"}]}\n' \
|
||||
"$secret" > /etc/tproxy-server/profiles.json
|
||||
printf 'MTPROXY_SECRET=%s\nMTPROXY_NAT_ARGS=%s\n' "$secret" "$nat_args" > /etc/mtproxy/mtproxy.env
|
||||
unset secret
|
||||
fi
|
||||
|
||||
cat > /etc/tproxy-server/config.json <<EOF
|
||||
{
|
||||
"public_hostname": "$hostname",
|
||||
"base_path": "",
|
||||
"listen": "127.0.0.1:8090",
|
||||
"admin_listen": "127.0.0.1:8091",
|
||||
"public_dir": "/srv/tproxy-site",
|
||||
"static_routes": "exact",
|
||||
"profiles_file": "/run/credentials/tproxy-server.service/profiles.json"
|
||||
}
|
||||
EOF
|
||||
chown root:tproxy /etc/tproxy-server/config.json /etc/tproxy-server/profiles.json
|
||||
chmod 0640 /etc/tproxy-server/config.json
|
||||
chmod 0400 /etc/tproxy-server/profiles.json
|
||||
chown root:mtproxy /etc/mtproxy/mtproxy.env
|
||||
chmod 0640 /etc/mtproxy/mtproxy.env
|
||||
|
||||
# 3. Юниты, firewall (2398/8888 только с lo), ежедневное обновление конфига Telegram.
|
||||
for unit in tproxy-server.service mtproxy.service tproxy-firewall.service \
|
||||
refresh-mtproxy-config.service refresh-mtproxy-config.timer; do
|
||||
install -o root -g root -m 0644 "deploy/$unit" "/etc/systemd/system/$unit"
|
||||
done
|
||||
install -o root -g root -m 0644 deploy/firewall.nft /etc/tproxy-server/firewall.nft
|
||||
install -o root -g root -m 0755 deploy/refresh-mtproxy-config.sh /usr/local/sbin/refresh-mtproxy-config
|
||||
|
||||
/usr/local/bin/tproxy-server -config /etc/tproxy-server/config.json \
|
||||
-profiles-file /etc/tproxy-server/profiles.json -check
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now tproxy-firewall.service
|
||||
systemctl enable --now mtproxy.service
|
||||
systemctl restart mtproxy.service
|
||||
systemctl enable --now tproxy-server.service
|
||||
systemctl enable --now refresh-mtproxy-config.timer
|
||||
|
||||
for _ in $(seq 20); do
|
||||
curl -fs -o /dev/null http://127.0.0.1:8091/readyz && break
|
||||
sleep 1
|
||||
done
|
||||
curl -fsS http://127.0.0.1:8091/readyz >/dev/null && echo "relay: ready"
|
||||
|
||||
echo "Ссылка для клиента: sudo sed -n 's/.*\"secret\":\"\\([0-9a-f]*\\)\".*/https:\\/\\/t.me\\/webproxy?server=$hostname\\&secret=\\1/p' /etc/tproxy-server/profiles.json"
|
||||
Reference in New Issue
Block a user