Документация Пробросс
REST API v1 · CLI · Node.js SDK · Python SDK · MCP
Быстрый старт
За 2 минуты выставить локальный сервис наружу:
# 1. Установить CLI
curl -fsSL https://probross.ru/install.sh | sh
# 2. Сохранить токен туннеля (получите на probross.ru/dashboard/tokens)
probross config set-token ВАШ_ТОКЕН_ТУННЕЛЯ
# 3. Запустить туннель
probross tunnel --local http://127.0.0.1:3000
# ✓ Соединение установлено
# Входящие запросы проксируются на http://127.0.0.1:3000
Для работы с REST API, SDK и MCP нужен отдельный Personal Access Token (PAT).
Аутентификация
API поддерживает два типа токенов:
- Туннельный токен — только для CLI (
probross tunnel) и WebSocket-клиента. Не принимается REST API. - Personal Access Token (PAT) (
probross_pat_…) — для REST API, SDK и CLI-команд (tokens,logs). Создаётся в кабинете → API-токены.
PAT передаётся в заголовке:
Authorization: Bearer probross_pat_abc123def456...
Создайте PAT в личном кабинете или через API:
curl -X POST https://probross.ru/api/v1/pats \
-H "Authorization: Bearer <session_token>" \
-H "Content-Type: application/json" \
-d '{"name":"CI","scopes":["tokens:read","requests:read"],"expiresInDays":90}'
Права (scopes)
| Scope | Что разрешает |
|---|---|
tokens:read | Чтение списка туннелей, статуса, usage и policy |
tokens:write | Создание/отзыв туннелей, создание PAT, изменение policy |
domains:read | Чтение доменов |
domains:write | Добавление, верификация и удаление доменов |
requests:read | Просмотр лога запросов через туннели |
billing:read | Чтение информации о подписке |
audit:read | Чтение журнала аудита |
webhooks:write | Управление вебхуками |
* | Все права (полный доступ) |
Установка CLI
# macOS / Linux (рекомендуется)
curl -fsSL https://probross.ru/install.sh | sh
# Или вручную:
# https://probross.ru/cli/{os}/{arch}/probross
probross tunnel
probross tunnel --local http://127.0.0.1:3000 [--token TOKEN] [--server wss://probross.ru]
Подключает локальный HTTP-сервис к туннелю. Поддерживает автоматическое переподключение.
probross tokens
probross tokens list # список туннелей
probross tokens status <id> # статус конкретного туннеля
probross logs
probross logs # последние 50 запросов
probross logs --client-id my-api -n 100 # последние 100 для конкретного туннеля
probross tcp
probross tcp --token TOKEN --port 2222:22 # пробросить порт 22 на публичный порт 2222
Проксирует произвольный TCP-трафик через WSS-туннель. Можно указать несколько --port.
probross ssh
probross ssh
probross ssh --local 127.0.0.1:2222 --public 13001
Удобная команда для публикации локального SSH через TCP-туннель. По умолчанию: 127.0.0.1:22 → публичный порт 13001.
probross rtsp
probross rtsp
probross rtsp --local 127.0.0.1:554 --public 18080
Публикует RTSP-камеру или медиасервер через TCP-туннель. Для камер рекомендуется включить RTSP over TCP / interleaved.
probross rdp / probross vnc
probross rdp --local 127.0.0.1:3389 --public 17001
probross vnc --local 127.0.0.1:5900 --public 18000
Публикует RDP или VNC через защищённый TCP-туннель. Для таких сервисов обязательно включайте IP allowlist в личном кабинете.
probross udp
probross udp --token TOKEN --port 5060:5060 # SIP/VoIP
probross udp --token TOKEN --port 7777:7777 # игровой сервер
Проксирует UDP-дейтаграммы через WSS-туннель. Предназначен для VoIP и онлайн-игр.
probross files
probross files --dir ./shared
probross files --dir ./shared --writable # разрешить запись через WebDAV
Публикует локальную папку как HTTPS file browser и WebDAV. По умолчанию доступ только на чтение: просмотр в браузере, скачивание файлов и WebDAV PROPFIND.
probross ping
probross ping # проверить доступность API и tunnel endpoint
probross gui
probross gui
probross gui --addr 127.0.0.1:7770
Запускает локальную web-панель с быстрыми командами, ссылками на кабинет и документацию. Работает без облачной синхронизации и не открывает внешние порты.
probross whoami
probross whoami # показать аккаунт, привязанный к текущему токену
GET /api/v1/me
Информация о текущем пользователе.
{"userId":"uuid","email":"user@example.com","plan":"pro"}
Туннели
Список туннелей аккаунта.
{"clientId":"my-api","name":"My API"}
Создаёт туннель и возвращает сырой token только один раз.
Онлайн-статус туннеля.
{"clientId":"my-api","name":"My API","online":true,"lastSeenAt":"2026-05-17T..."}
| Параметр | Тип | Описание |
|---|---|---|
from | ISO datetime | Начало периода |
to | ISO datetime | Конец периода |
granularity | hour | day | Гранулярность |
Текущая policy туннеля: IP allowlist, Basic Auth и rate limit.
{"ipAllowlist":["203.0.113.0/24"],"basicAuthUser":"admin","basicAuthPassword":"secret","rateLimitRpm":600}
Удаляет все ограничения доступа для туннеля.
Отозвать туннель по clientId. 204 No Content.
Домены
Список пользовательских доменов аккаунта.
{"domain":"api.example.com","clientId":"my-api"}
Возвращает TXT запись, которую нужно добавить у DNS-провайдера.
Проверяет наличие TXT записи и подтверждает владение доменом.
Удаляет домен. 204 No Content.
Логи запросов
| Параметр | Описание |
|---|---|
clientId | Фильтр по туннелю |
status | HTTP-статус |
method | GET, POST, ... |
path | Частичное совпадение пути |
from / to | Диапазон времени (ISO) |
limit | Число записей (max 500) |
Personal Access Tokens
Список PAT аккаунта.
{"name":"CI pipeline","scopes":["tokens:read","requests:read"],"expiresInDays":90}
Возвращает token — показывается только один раз.
Отозвать PAT. 204 No Content.
Вебхуки
{"url":"https://example.com/hook","events":["tunnel.up","tunnel.down","limit.reached"]}
Запросы подписываются заголовком X-Probross-Signature: sha256=...
Аудит
Журнал событий аккаунта.
Node.js / TypeScript SDK
Работает в Node.js 18+, Deno и Bun (использует стандартный fetch). Полные типы TypeScript из коробки.
npm install https://probross.ru/sdk/probross-nodejs-0.1.0.tgz
import { ProbrossClient } from "probross";
const client = new ProbrossClient({ token: "probross_pat_..." });
// или через PROBROSS_TOKEN env var
// Создать туннель
const created = await client.tunnels.create({
clientId: "my-api",
name: "My API",
});
console.log("Tunnel token:", created.token);
// Информация об аккаунте
const me = await client.me();
// Список туннелей
const tunnels = await client.tunnels.list();
for (const t of tunnels) {
console.log(t.client_id, t.last_seen_at ? "online" : "offline");
}
// Статус туннеля
const status = await client.tunnels.status("my-api");
console.log("Online:", status.online);
// Политика туннеля
const policy = await client.tunnels.getPolicy("my-api");
await client.tunnels.setPolicy("my-api", { rateLimitRpm: 300 });
// Домены
const domains = await client.domains.list();
const dns = await client.domains.add({ domain: "api.example.com", clientId: "my-api" });
console.log(dns.txtRecord, dns.txtValue);
// Последние запросы
const logs = await client.requests.list({ clientId: "my-api", limit: 20 });
// Создать PAT
const pat = await client.pats.create({
name: "CI",
scopes: ["tokens:read", "requests:read"],
expiresInDays: 90,
});
console.log("Token:", pat.token); // сохраните — показывается только раз!
// Вебхук
const hook = await client.webhooks.create({
url: "https://my-server.com/webhook",
events: ["tunnel.up", "tunnel.down"],
});
console.log("Secret:", hook.secret);
Обработка ошибок
import { ProbrossClient, ProbrossError } from "probross";
try {
await client.tunnels.status("non-existent");
} catch (err) {
if (err instanceof ProbrossError) {
console.error(err.status, err.message); // 404 Not Found
}
}
Python SDK
pip install https://probross.ru/sdk/probross-0.1.0.tar.gz
from probross import ProbrossClient
client = ProbrossClient(token="probross_pat_...")
# Список туннелей
for t in client.tunnels.list():
print(t["client_id"], "—", "online" if t.get("last_seen_at") else "offline")
# Статус конкретного туннеля
status = client.tunnels.status("my-api")
print("Online:", status["online"])
# Последние запросы
for entry in client.requests.list(client_id="my-api", limit=20):
print(entry["method"], entry["path"], entry.get("status"))
# Создать PAT
pat = client.pats.create("automation", scopes=["tokens:read", "requests:read"], expires_in_days=30)
print("Token:", pat["token"]) # сохраните сразу!
# Вебхук
hook = client.webhooks.create(
url="https://my-server.com/webhook",
events=["tunnel.up", "tunnel.down"],
)
print("Secret:", hook["secret"])
MCP: Cursor / Claude Code / Qwen Code
Пробросс можно подключать к MCP-клиентам через локальный stdio-сервер. Он использует тот же PAT и работает поверх REST API v1.
# Сборка локального MCP server
cd /path/to/TunnelService/sdk/mcp-server
npm install
npm run build
Cursor
{
"mcpServers": {
"probross": {
"command": "node",
"args": ["/absolute/path/to/TunnelService/sdk/mcp-server/dist/index.js"],
"env": {
"PROBROSS_TOKEN": "probross_pat_xxx",
"PROBROSS_BASE_URL": "https://probross.ru"
}
}
}
}
Claude Code
claude mcp add --transport stdio \
--env PROBROSS_TOKEN=probross_pat_xxx \
--env PROBROSS_BASE_URL=https://probross.ru \
probross -- \
node /absolute/path/to/TunnelService/sdk/mcp-server/dist/index.js
Qwen Code
{
"mcpServers": {
"probross": {
"command": "node",
"args": ["/absolute/path/to/TunnelService/sdk/mcp-server/dist/index.js"],
"env": {
"PROBROSS_TOKEN": "probross_pat_xxx",
"PROBROSS_BASE_URL": "https://probross.ru"
}
}
}
}
Доступные MCP tools: аккаунт, туннели, policy, домены, request logs, webhooks и audit. Для AI-агентов рекомендуется отдельный PAT с минимально необходимыми scopes.
События вебхуков
| Событие | Описание |
|---|---|
tunnel.up | Туннель подключился |
tunnel.down | Туннель отключился |
limit.reached | Достигнут лимит трафика |
request.failed | Запрос вернул 5xx |
audit.event | Любое событие аудита (для SIEM) |
Проверка подписи:
import hmac, hashlib
def verify_signature(payload: bytes, secret: str, signature: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
Примеры
Webhook-приёмник на Flask
from flask import Flask, request, abort
import hmac, hashlib
app = Flask(__name__)
PROBROSS_SECRET = "your_webhook_secret"
@app.route("/webhook", methods=["POST"])
def webhook():
sig = request.headers.get("X-Probross-Signature", "")
expected = "sha256=" + hmac.new(
PROBROSS_SECRET.encode(), request.data, hashlib.sha256
).hexdigest()
if not hmac.compare_digest(sig, expected):
abort(403)
event = request.json
print(f"Event: {event['event']}, tunnel: {event.get('clientId')}")
return "ok"