Files
infra/stacks/tproxy/setup-ru1.sh
T
gilfanovrandClaude Opus 5.5 2ab38bc1f8 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>
2026-10-09 17:16:12 +03:00

87 lines
3.9 KiB
Bash

#!/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"