#!/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}"