Документация Пробросс

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 поддерживает два типа токенов:

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

GET/api/v1/me

Информация о текущем пользователе.

{"userId":"uuid","email":"user@example.com","plan":"pro"}

Туннели

GET/api/v1/tunnels

Список туннелей аккаунта.

POST/api/v1/tunnels
{"clientId":"my-api","name":"My API"}

Создаёт туннель и возвращает сырой token только один раз.

GET/api/v1/tunnels/:clientId/status

Онлайн-статус туннеля.

{"clientId":"my-api","name":"My API","online":true,"lastSeenAt":"2026-05-17T..."}
GET/api/v1/tunnels/:clientId/usage
ПараметрТипОписание
fromISO datetimeНачало периода
toISO datetimeКонец периода
granularityhour | dayГранулярность
GET/api/v1/tunnels/:clientId/policy

Текущая policy туннеля: IP allowlist, Basic Auth и rate limit.

PUT/api/v1/tunnels/:clientId/policy
{"ipAllowlist":["203.0.113.0/24"],"basicAuthUser":"admin","basicAuthPassword":"secret","rateLimitRpm":600}
DELETE/api/v1/tunnels/:clientId/policy

Удаляет все ограничения доступа для туннеля.

DELETE/api/v1/tunnels/:clientId

Отозвать туннель по clientId. 204 No Content.

Домены

GET/api/v1/domains

Список пользовательских доменов аккаунта.

POST/api/v1/domains
{"domain":"api.example.com","clientId":"my-api"}

Возвращает TXT запись, которую нужно добавить у DNS-провайдера.

POST/api/v1/domains/:id/verify

Проверяет наличие TXT записи и подтверждает владение доменом.

DELETE/api/v1/domains/:id

Удаляет домен. 204 No Content.

Логи запросов

GET/api/v1/requests
ПараметрОписание
clientIdФильтр по туннелю
statusHTTP-статус
methodGET, POST, ...
pathЧастичное совпадение пути
from / toДиапазон времени (ISO)
limitЧисло записей (max 500)

Personal Access Tokens

GET/api/v1/pats

Список PAT аккаунта.

POST/api/v1/pats
{"name":"CI pipeline","scopes":["tokens:read","requests:read"],"expiresInDays":90}

Возвращает token — показывается только один раз.

DELETE/api/v1/pats/:id

Отозвать PAT. 204 No Content.

Вебхуки

POST/api/v1/webhooks
{"url":"https://example.com/hook","events":["tunnel.up","tunnel.down","limit.reached"]}

Запросы подписываются заголовком X-Probross-Signature: sha256=...

Аудит

GET/api/v1/audit?limit=50

Журнал событий аккаунта.

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"