#!/usr/bin/env bash # Ставит ретранслятор Bot API на домашний сервер. Запускать локально из корня: # deploy/tg-relay/deploy.sh (TELEGRAM_BOT_ID и RELAY_HOST — в deploy/.env.local) # RELAY_HOST — ssh-адрес домашнего сервера, RELAY_BIND — адрес Tailscale хоста (по умолчанию его tailscale ip -4). # Токен бота сюда не нужен: ретранслятор только пересылает запросы. set -euo pipefail # адреса серверов в репо не храним: deploy/.env.local (образец — deploy/.env.local.example) # shellcheck source=/dev/null [[ -f "$(dirname "$0")/../.env.local" ]] && source "$(dirname "$0")/../.env.local" RELAY_HOST="${RELAY_HOST:?задайте RELAY_HOST в deploy/.env.local (см. deploy/.env.local.example)}" 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"