Files
ForbiddenStarsApp/deploy/tunnel/tunnel.sh
T
NotBigGhostandClaude Opus 4.8 029a043bfc Прод на Pi: деплой из 2 файлов (compose + .env), ключ туннеля из .env
Теперь на Pi нужны только docker-compose.yml и .env — без репозитория, сборки и файла ключа.

- docker-compose.yml: pull_policy: always (образы тянутся из реестра, сборка не запускается);
  ключ туннеля больше не монтируется томом — берётся из .env (TUNNEL_KEY_B64, base64);
  у VPS_TUNNEL_HOST убран :? (ломал бы buildx bake на ПК, где переменная не задана) — проверка
  обязательности перенесена в tunnel.sh (рантайм).
- deploy/tunnel/tunnel.sh: приватный ключ из TUNNEL_KEY_B64 (base64) с фолбэком на смонтированный
  /key/id_tunnel (для dev/test, где репозиторий на хосте).
- .env.example: TUNNEL_KEY_B64 + как сгенерировать base64 (Git Bash / PowerShell).
- deploy/pi/README: полный поток «голый Pi → 2 файла»: Docker, curl compose+.env из Gitea, up;
  обновление, автозапуск, бэкап как опция.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:48:40 +03:00

37 lines
1.6 KiB
Bash

#!/bin/sh
# SSH reverse-туннель из контейнера на VPS:
# VPS:127.0.0.1:$VPS_TUNNEL_PORT -> $UPSTREAM (сервис app по сети compose)
# Ключ монтируется снаружи в /key/id_tunnel (см. docker-compose*.yml).
set -eu
: "${VPS_TUNNEL_HOST:?VPS_TUNNEL_HOST is required}"
VPS_TUNNEL_USER="${VPS_TUNNEL_USER:-tunnel}"
: "${VPS_TUNNEL_PORT:?VPS_TUNNEL_PORT is required}"
UPSTREAM="${UPSTREAM:-app:8000}"
# Источник приватного ключа: либо TUNNEL_KEY_B64 (base64 в .env — прод: только compose+env),
# либо смонтированный файл /key/id_tunnel (dev/test, где репозиторий есть на хосте).
mkdir -p /root/.ssh
KEY=/root/.ssh/id_tunnel
if [ -n "${TUNNEL_KEY_B64:-}" ]; then
echo "$TUNNEL_KEY_B64" | base64 -d > "$KEY"
elif [ -f /key/id_tunnel ]; then
cp /key/id_tunnel "$KEY"
else
echo "[tunnel] ERROR: нет ключа — задай TUNNEL_KEY_B64 в .env (base64) или примонтируй /key/id_tunnel."
echo "[tunnel] base64 ключа без переносов: base64 -w0 deploy/tunnel/id_tunnel"
exit 1
fi
chmod 600 "$KEY"
echo "[tunnel] -R ${VPS_TUNNEL_PORT}:${UPSTREAM} -> ${VPS_TUNNEL_USER}@${VPS_TUNNEL_HOST}"
exec ssh -N \
-o BatchMode=yes \
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
-o ExitOnForwardFailure=yes \
-o StrictHostKeyChecking=accept-new \
-o UserKnownHostsFile=/root/.ssh/known_hosts \
-i /root/.ssh/id_tunnel \
-R "${VPS_TUNNEL_PORT}:${UPSTREAM}" \
"${VPS_TUNNEL_USER}@${VPS_TUNNEL_HOST}"