Перейти к содержанию

Одноразовый публичный стенд через SSH-туннель

Этот сценарий публикует loopback-only XFerry через временный reverse SSH tunnel. URL работает, пока включены компьютер, XFerry и SSH. При новом подключении адрес обычно меняется.

Пример использует сторонний Optimistix Tunnel. Провайдер управляет доступностью, terms, consent screen и hostname, завершает публичный TLS и технически может видеть Basic Auth и uploaded content.

Только тестовые данные

Для каждого запуска используйте уникальные file-backed credentials и конечные storage limits. Туннель не реализует полный public-direct baseline.

Почему нужен точный Origin

Браузер открывает https://*.otnl.link, а XFerry получает HTTP на 127.0.0.1:8080. Поэтому browser mutations — upload, delete, NOTE, SMUGGLE, Advanced Upload и WebSocket — требуют точного публичного URL в --cors-origin. Wildcard * разрешает только read-only CORS.

Поскольку URL заранее неизвестен, порядок такой: запустить XFerry, получить адрес от SSH и перезапустить только XFerry с точным origin.

1. Подготовить runtime

Из корня checkout:

RUN_DIR=/tmp/xferry-tunnel-demo
test ! -e "$RUN_DIR"
install -d -m 0700 "$RUN_DIR" "$RUN_DIR/data"

PASSWORD="$(
  ./.venv/bin/python -c \
    'import secrets; a="abcdefghjkmnpqrstuvwxyz23456789"; print("-".join("".join(secrets.choice(a) for _ in range(4)) for _ in range(4)))'
)"
umask 0077
printf 'xferry:%s\n' "$PASSWORD" > "$RUN_DIR/auth"
printf 'Username: xferry\nPassword: %s\n' "$PASSWORD"
unset PASSWORD
XFERRY_ARGS=(
  --preset local
  --host 127.0.0.1 --port 8080
  --dir "$RUN_DIR/data"
  --auth-file "$RUN_DIR/auth"
  --max-size 32
  --upload-storage-limit 256 --upload-file-limit 128
  --upload-reserve-free 512
  --note-storage-limit 64 --note-count-limit 256
  --smuggle-temp-file-limit 32 --smuggle-temp-storage-limit 64
  --workers 4 --max-websocket-connections 2 --body-memory-budget 64
)

./.venv/bin/python -m xferry "${XFERRY_ARGS[@]}"

Оставьте первый terminal открытым.

2. Запустить tunnel

Во втором terminal:

RUN_DIR=/tmp/xferry-tunnel-demo

ssh -F /dev/null -tt -p 1122 \
  -R 80:127.0.0.1:8080 \
  -o ExitOnForwardFailure=yes \
  -o ConnectTimeout=10 \
  -o ServerAliveInterval=15 \
  -o ServerAliveCountMax=3 \
  -o UserKnownHostsFile="$RUN_DIR/known_hosts" \
  -o GlobalKnownHostsFile=/dev/null \
  -o StrictHostKeyChecking=accept-new \
  user@ssh.optimistixtunnel.com

Сохраните выданный URL вида https://random-name.otnl.link и оставьте SSH работать. Если адрес не появился, публичной endpoint ещё нет.

3. Перезапустить XFerry с Origin

Остановите XFerry в первом terminal через Ctrl+C, не останавливая SSH:

PUBLIC_URL='https://random-name.otnl.link'

./.venv/bin/python -m xferry "${XFERRY_ARGS[@]}" \
  --cors-origin "$PUBLIC_URL"

Сохраните https://, не добавляйте trailing slash или path и обновляйте origin после каждого переподключения tunnel.

Проверить и удалить

  1. Откройте URL и подтвердите consent page провайдера.
  2. Введите username xferry и сгенерированный password.
  3. Загрузите небольшой тестовый файл.
  4. В Files создайте SMUGGLE artifact и скачайте его.

Ошибка Forbidden cross-origin browser mutation означает, что browser URL и --cors-origin не совпадают или port 8080 всё ещё занимает bootstrap process.

Сначала остановите SSH, затем XFerry через Ctrl+C. После сохранения нужных артефактов удалите runtime:

RUN_DIR=/tmp/xferry-tunnel-demo
test "$RUN_DIR" = /tmp/xferry-tunnel-demo
find "$RUN_DIR" -depth -delete

Команда необратимо удаляет credentials, uploads, notes и temporary artifacts. Не завершайте процессы по общему имени python, xferry или ssh.