Одноразовый публичный стенд через 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.
Проверить и удалить¶
- Откройте URL и подтвердите consent page провайдера.
- Введите username
xferryи сгенерированный password. - Загрузите небольшой тестовый файл.
- В 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.