#!/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}" # Ключ должен быть смонтирован файлом. Если тут пусто/папка — Docker создал каталог, # потому что файла deploy/tunnel/id_tunnel на хосте нет. if [ ! -f /key/id_tunnel ]; then echo "[tunnel] ERROR: /key/id_tunnel is not a regular file." echo "[tunnel] Put your private key at deploy/tunnel/id_tunnel on the host (its pubkey must be in authorized_keys of tunnel@VPS)." exit 1 fi # Копируем ключ и выставляем строгие права (с хоста права могут не годиться, особенно с Windows). mkdir -p /root/.ssh cp /key/id_tunnel /root/.ssh/id_tunnel chmod 600 /root/.ssh/id_tunnel 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}"