37 lines
1.6 KiB
Bash
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 (временный прод на ПК, где репозиторий есть на хосте).
|
|
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}"
|