HowTo дополняет loopback и ssh -R, JumpHost и digest проб, Cloudflare Tunnel и Tailscale MagicDNS: там иные плоскости доверия; здесь — цепочка gateway и doctor через один frps. Имена и маршрут — в матрице глобального входа. Ниже роли, порты, шаги и разборка сбоев.
Три боли, которые снимает схема: (1) публичный HTTP к шлюзу на билдере; (2) двойные алерты, когда упал только doctor, а трафик ещё жив; (3) утечка секретов STCP из‑за одинакового secretKey между регионами. Держите ключи раздельными и логируйте region в каждом событии синтетики.
| Роль frp | Где живёт | Зона ответственности |
|---|---|---|
| frps (сервер) | Linux-бастион в доверенной подсети; bindPort обычно 7000 |
Глобальный auth.token, firewall только на CI и операторов; единственная TCP-точка входа для всех STCP |
| frpc (клиент) | Каждый региональный билдер на vpshalo рядом с удалённым Mac | Два STCP-прокси: на 127.0.0.1:18080 (gateway) и 127.0.0.1:18081 (doctor), каждый со своим secretKey |
| visitor | Рабочая станция дежурного или воркер merge JSON | Локальные bindAddr 127.0.0.1 и порты визитора, например 28080 и 28081; наружу не публикует порты |
Таблица — контракт для IaC: имя прокси вида openclaw-REGION-gw и openclaw-REGION-doctor должно совпадать с инвентарём DNS и метками в логах OpenClaw.
Цепочка OpenClaw: gateway, doctor и где вклиниться frp
Зафиксируйте gateway на loopback — основной HTTP для инструментов. doctor — отдельный loopback-порт для диагностики; не смешивайте с пользовательскими маршрутами. openclaw doctor из вашей сборки должен проходить тем же путём, что curl к /healthz, после подъёма visitor — так ловите расхождение конфигов до выката.
- Локальная проверка. На билдере без frp:
curl -fsS http://127.0.0.1:18080/healthzи отдельно эндпоинты doctor по документации вашей версии OpenClaw. - Через frp. После visitor на операторе те же URL, но на
127.0.0.1:28080и127.0.0.1:28081; заголовки авторизации должны совпасть с политикой шлюза. - Мультирегион. Не reuse один frpc.ini между континентами: разные
serverAddrили один frps, но разные имена STCP и ключи, иначе при аварии вы потеряете изоляцию картины инцидента. - Наблюдаемость. Прокидывайте в метки те же
regionиpop, что в сводке проб за прокси, чтобы merge-алерт коррелировал с digest L7.
Порты, токены frps и граница доверия
frps слушает контрольный канал на 7000/tcp (или вашем pin из политики сети). Включите auth.method = token и длинный случайный auth.token; на уровне ОС разрешите этот порт только с подсетей билдеров и jump-хостов. frpc на каждом узле vpshalo подключается к frps и регистрирует два STCP без локального remote_port на публичном интерфейсе билдера — это суть низкой экспозиции. Visitor на стороне оператора держит два локальных порта и матчится по server_name и secretKey к соответствующему STCP.
- Шлюз OpenClaw. Пример привязки:
--gateway-bind 127.0.0.1:18080; никаких0.0.0.0в unit systemd или launchd. - Doctor.
--doctor-bind 127.0.0.1:18081или флаги вашей сборки; проверьте, что health-скрипты бьют именно в doctor для тяжёлых проверок. - Ротация. Меняйте
auth.tokenfrps иsecretKeySTCP в одном окне изменений; иначе frpc останется на старом ключе и даст ложный «регион мёртв». - Аудит. Логируйте успешные handshakes frp с привязкой к hostname билдера, не только отказы.
# Пример: быстрая проверка цепочки с операторской машины (после visitor)
curl -fsS --max-time 3 http://127.0.0.1:28080/healthz
curl -fsS --max-time 5 http://127.0.0.1:28081/<doctor-health-path>
Пять шагов и merge алерт gateway плюс doctor
Выполняйте строго по порядку: сначала loopback, затем frps, затем frpc, затем visitor, затем merge. Пропуск шага приводит к «зелёному» curl на билдере и «красному» через frp из‑за рассинхрона токенов.
- Шаг 1. Поднять OpenClaw на loopback с портами
18080и18081; зафиксировать флаги в IaC. - Шаг 2. Развернуть frps с токеном и firewall; убедиться
nc -vz bastion 7000только с разрешённых сетей. - Шаг 3. На каждом регионе frpc: два блока
[[proxies]]типаstcpк локальным портам шлюза и doctor. - Шаг 4. Visitor: два
[[visitors]]сbindPort28080и28081на127.0.0.1. - Шаг 5. Воркер каждые 30–60 с пишет JSON-событие; если в одном окне 3–5 минут оба порта визитора дали
timeoutили5xxдля одногоregion, отправить один алерт, иначе только запись в лог.
Разборка: типичные симптомы и что мерить первым
login to server failed: token — несовпадение auth.token frpc и frps или устаревший unit после ротации; сверьте systemd drop-in. visitor не подключается — проверьте server_name и secretKey пары STCP, а также что frpc в этом регионе реально online в логах frps. curl к 28080 зависает — сначала ICMP и TCP до 7000 с билдера, затем статус frpc; не начинайте с правок OpenClaw. Только doctor красный — сузьте до зависимостей doctor (GPU, ключи облака), не эскалируйте как полный региональный отказ.
- Золотые числа для стейджинга: контрольный
7000, loopback шлюза18080, doctor18081, визиторы28080и28081— зафиксируйте в runbook как дефолт приёмки. - Окно merge: 180–300 секунд при интервале пробы 30–60 с снижает дребезг при кратковременных рестартах frpc.
- Корреляция с SSH: если одновременно падает SSH к удалённому Mac, смотрите сеть PoP, а не frp; смежный материал про ssh -R поможет отличить классы инцидентов.
Итог. Паттерн даёт мультирегион без публичного слушателя на билдере: только frp-клиент наружу к бастиону и локальные порты у оператора. Подберите регион узла под вашу команду на публичных страницах ниже — тарифы, помощь и покупка доступны без обязательного входа в личный кабинет.