feat: ретранслятор Bot API на домашнем сервере и TELEGRAM_API_BASE

С VPS api.telegram.org недоступен. deploy/tg-relay: nginx на адресе
Tailscale домашнего сервера, пропускает только запросы нашего бота из
tailnet, без логов доступа (токен в URL). api: базовый URL Bot API из
TELEGRAM_API_BASE; сетевые сбои polling пишутся в лог раз в 10 минут.
This commit is contained in:
2026-10-17 16:56:52 +03:00
parent 55ecf7c9d8
commit 66d69c1245
9 changed files with 99 additions and 4 deletions
+2
View File
@@ -12,3 +12,5 @@ TELEGRAM_LEADS_THREAD_ID=
TELEGRAM_SYSTEM_THREAD_ID=
# Telegram user ID автора: только ему бот отвечает на команды администрирования
TELEGRAM_ADMIN_ID=
# Ретранслятор Bot API (deploy/tg-relay): с VPS api.telegram.org недоступен. Пусто — напрямую.
TELEGRAM_API_BASE=
+27
View File
@@ -0,0 +1,27 @@
# Ретранслятор Bot API для api на VPS: оттуда api.telegram.org недоступен.
# Пропускает только запросы нашего бота и только из tailnet. Токен идёт в URL — логов доступа нет.
server {
listen 8788;
access_log off;
error_log /dev/stderr crit;
location ~ ^/(file/)?bot${TELEGRAM_BOT_ID}: {
allow ${ALLOW_FROM};
deny all;
proxy_pass https://api.telegram.org;
proxy_ssl_server_name on;
proxy_set_header Host api.telegram.org;
proxy_http_version 1.1;
# long polling getUpdates держит запрос до 25 с
proxy_read_timeout 70s;
proxy_send_timeout 70s;
proxy_buffering off;
# бэкап базы уходит администратору через sendDocument
client_max_body_size 50m;
}
location / {
return 404;
}
}
+29
View File
@@ -0,0 +1,29 @@
#!/usr/bin/env bash
# Ставит ретранслятор Bot API на домашний сервер. Запускать локально из корня:
# TELEGRAM_BOT_ID=8959389487 deploy/tg-relay/deploy.sh
# RELAY_HOST (по умолчанию nick@192.168.100.50), RELAY_BIND — адрес Tailscale хоста (по умолчанию его tailscale ip -4).
# Токен бота сюда не нужен: ретранслятор только пересылает запросы.
set -euo pipefail
RELAY_HOST="${RELAY_HOST:-nick@192.168.100.50}"
RELAY_PATH="${RELAY_PATH:-/home/nick/home_server/kvarta_tg_relay}"
: "${TELEGRAM_BOT_ID:?задайте TELEGRAM_BOT_ID — числовая часть токена до двоеточия}"
[[ $TELEGRAM_BOT_ID =~ ^[0-9]+$ ]] || { echo "TELEGRAM_BOT_ID — только цифры" >&2; exit 1; }
cd "$(dirname "$0")"
SSH=(ssh -o BatchMode=yes -o ConnectTimeout=10 "$RELAY_HOST")
RELAY_BIND="${RELAY_BIND:-$("${SSH[@]}" 'tailscale ip -4 2>/dev/null | head -1')}"
[[ -n $RELAY_BIND ]] || { echo "у $RELAY_HOST нет адреса Tailscale: выполните там «sudo tailscale up» или задайте RELAY_BIND" >&2; exit 1; }
echo "[1] файлы → $RELAY_HOST:$RELAY_PATH"
"${SSH[@]}" "mkdir -p $RELAY_PATH"
scp -q -o BatchMode=yes docker-compose.yml default.conf.template "$RELAY_HOST:$RELAY_PATH/"
"${SSH[@]}" "printf 'TELEGRAM_BOT_ID=%s\nRELAY_BIND=%s\nALLOW_FROM=%s\n' '$TELEGRAM_BOT_ID' '$RELAY_BIND' '${ALLOW_FROM:-100.64.0.0/10}' > $RELAY_PATH/.env"
echo "[2] запуск на $RELAY_BIND:8788"
"${SSH[@]}" "cd $RELAY_PATH && docker compose up -d --force-recreate"
echo "[3] проверка: чужой путь → 404"
"${SSH[@]}" "curl -s -o /dev/null -w '%{http_code}\n' http://$RELAY_BIND:8788/"
echo "Готово. В api.env на VPS: TELEGRAM_API_BASE=http://$RELAY_BIND:8788"
+23
View File
@@ -0,0 +1,23 @@
# Домашний сервер (выход в интернет не из РФ): /home/nick/home_server/kvarta_tg_relay.
# Ставит deploy/tg-relay/deploy.sh; .env там же (TELEGRAM_BOT_ID, RELAY_BIND, ALLOW_FROM).
name: kvarta-tg-relay
services:
relay:
image: nginx:1.27-alpine
container_name: kvarta-tg-relay
restart: unless-stopped
ports:
# только на адресе Tailscale: из LAN и интернета ретранслятор не виден
- "${RELAY_BIND}:8788:8788"
environment:
TELEGRAM_BOT_ID: ${TELEGRAM_BOT_ID}
ALLOW_FROM: ${ALLOW_FROM:-100.64.0.0/10}
NGINX_ENVSUBST_FILTER: ^(TELEGRAM_BOT_ID|ALLOW_FROM)$
volumes:
- ./default.conf.template:/etc/nginx/templates/default.conf.template:ro
logging:
driver: json-file
options:
max-size: "1m"
max-file: "2"