Зачем это нужно

Когда нужно получить доступ к серверу, запущенному в Colab, стандартное решение — внешние туннели. Но у популярных инструментов есть проблемы:

ngrok — TCP-эндпоинты теперь требуют привязки банковской карты. Формально бесплатно, но карту давай.

cloudflared — периодические таймауты при работе с Colab, плюс каждый перезапуск ноутбука генерирует новый случайный субдомен.

При этом в Colab есть встроенный механизм для проксирования портов, который большинство игнорирует.


Как работает proxyPort

Colab предоставляет функцию google.colab.output.eval_js, которая позволяет получить публичный URL для любого локального порта:

from google.colab.output import eval_js
url = eval_js("google.colab.kernel.proxyPort(8000)")
print(url)

На выходе — URL вида https://{port}-{instance-id}.{region}.prod.colab.dev. Это не туннель, а встроенный прокси самого Colab.


Проблема: просто так не достучаться

Если попробовать сделать запрос по этому URL через requests — ничего не выйдет. Colab защищает доступ к порту через аутентификацию на основе куки.

Нужный куки называется colab-runtime-proxy-token . Получить его можно только из браузерной сессии с активным Colab:

  1. Открыть URL в браузере

  2. Открыть DevTools → Application → Cookies

  3. Найти colab-runtime-proxy-token


Решение: передаём токен в запросах

Имея токен, можно обращаться к серверу программно из любого места:

import requests

url = "https://{port}-{instance-id}.{region}.prod.colab.dev/endpoint"
cookies = {"colab-runtime-proxy-token": "ВАШ_ТОКЕН"}

response = requests.get(url, cookies=cookies)

Полный пример

В Colab — запускаем сервер:

from fastapi import FastAPI
import uvicorn
from google.colab.output import eval_js
import threading

app = FastAPI()

@app.get("/ping")
def ping():
    return {"status": "ok"}

url = eval_js("google.colab.kernel.proxyPort(8000)")
print(f"URL: {url}")

threading.Thread(target=lambda: uvicorn.run(app, host="0.0.0.0", port=8000)).start()

Или

url = eval_js("google.colab.kernel.proxyPort(8000)")
print(f"URL: {url}")

from fastapi import FastAPI
import uvicorn
from google.colab.output import eval_js
import threading

app = FastAPI()

@app.get("/ping")
def ping():
    return {"status": "ok"}

uvicorn.run(app, host="0.0.0.0", port=8000)

Снаружи — делаем запрос:

import requests

url = "https://{port}-{instance-id}.{region}.prod.colab.dev/ping"
cookies = {"colab-runtime-proxy-token": "ВАШ_ТОКЕН"}

print(requests.get(url, cookies=cookies).json())
# {'status': 'ok'}

Ограничения

  • Сервер живёт пока Colab не отключит runtime (до 12 часов на бесплатном плане)

  • URL меняется при каждом перезапуске ноутбука

Комментарии (2)


  1. 0ka
    01.05.2026 01:56

    У меня нету такой куки ;(


    1. Ferraro Автор
      01.05.2026 01:56

      Попробуй через Network:

      1. Получи URL через eval_js и открой его в браузере (вкладку с Colab не закрывай)

      2. Открой DevTools (F12) -> вкладка Network

      3. Обнови страницу (F5) - появятся запросы

      4. Кликни на последний запрос к твоему домену (prod.colab.dev)

      5. Вкладка Headers -> раздел Request Headers -> найди поле cookie, или вкладка Cookies -> там будет colab-runtime-proxy-token отдельной строкой

      6. Там будет colab-runtime-proxy-token=... - это и есть нужный токен