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:
@@ -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;
|
||||
}
|
||||
}
|
||||
Executable
+29
@@ -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"
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user