Арендованный GPU-сервер может иметь публичный IP-адрес, нестандартный SSH-порт и несколько внутренних веб-сервисов. Из-за этого легко перепутать адрес подключения с адресом самого приложения. Разберём схему для личного доступа к Jupyter через SSH-туннель: она позволяет работать из браузера, не публикуя порт блокнота для всего интернета.
Какие реквизиты нужны

Возьмите из панели управления имя пользователя, адрес сервера, внешний SSH-порт и способ аутентификации. Внешний порт не обязательно равен 22: провайдер может перенаправлять другой порт на SSH внутри окружения.
Например, в CloudCompute.ru готовую SSH-команду можно скопировать из карточки инстанса. Это помогает избежать догадок о пользователе и порте. На любом сервисе сначала проверьте обычный вход, а уже затем добавляйте проброс.
Общая форма команды:
ssh -p SSH_PORT USER@SERVER_HOST
Замените SSH_PORT, USER и SERVER_HOST своими реквизитами. Если используется ключ, добавьте параметр -i с путём к закрытому ключу на вашем компьютере. В панель провайдера добавляют публичную часть ключа; закрытая часть должна оставаться у владельца.
Где должен работать Jupyter

Для этой схемы предполагается, что Jupyter установлен в том же сетевом окружении, куда вы входите по SSH, и доступен там по адресу 127.0.0.1:8888. Проверка этого условия особенно важна при использовании контейнеров: localhost в одном контейнере не является localhost другого.
Если готовый шаблон уже запустил Jupyter, сначала проверьте его адрес, порт и параметры доступа. Второй экземпляр без необходимости запускать не нужно. Для самостоятельного запуска установленного JupyterLab под обычным пользователем можно использовать:
jupyter lab --no-browser --ip=127.0.0.1 --port=8888
Оставьте включённой аутентификацию по токену или паролю. Если приложение сообщает другой порт, например из-за занятого 8888, используйте фактически выбранный порт в следующем шаге. Эта команда запускается на сервере.
Создайте туннель с рабочего компьютера

В отдельном локальном терминале выполните:
ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:8889:127.0.0.1:8888 -p SSH_PORT USER@SERVER_HOST
Здесь 8889 — порт на вашем компьютере, а 8888 — порт приложения со стороны сервера. Первое 127.0.0.1 ограничивает доступ к локальному концу туннеля вашим компьютером. Параметр -N оставляет SSH-соединение для пересылки трафика без запуска удалённой команды.
Пока терминал открыт, перейдите в браузере на http://127.0.0.1:8889 и войдите с токеном или паролем Jupyter. Если используете адрес с токеном из серверного вывода, замените в нём адрес и порт на локальные, сохранив сам токен. Не публикуйте такую ссылку в переписке или скриншотах.
Как найти причину ошибки

- SSH не соединяется. Проверьте состояние инстанса, адрес, внешний порт и сетевые ограничения. Работающий ping не подтверждает доступность нужного TCP-порта.
- Permission denied. Проверьте пользователя и выбранный ключ. Исправление номера порта Jupyter не решит ошибку SSH-аутентификации.
- Address already in use. Локальный порт 8889 занят. Выберите другой свободный порт слева в параметре -L и откройте его в браузере.
- Туннель создан, но приложение недоступно. Проверьте, запущен ли Jupyter и доступен ли его порт из SSH-окружения. ExitOnForwardFailure не гарантирует работоспособность самого веб-сервиса.
Что делать после работы
Закрытие SSH-туннеля прерывает этот путь доступа из браузера, но не завершает аренду. Сохраните результаты и проверьте состояние серверных процессов. Если сервер больше не нужен, остановите или удалите его через панель согласно условиям сервиса, предварительно выгрузив важные данные.
Для совместной работы команды понадобится отдельная настройка пользователей и прав доступа. Личный туннель удобен для одного разработчика, которому нужно безопасно открыть конкретный сервис на удалённой машине.
