---
name: ops_dashboard_tailscale_funnel
description: ops_dashboard на mini в Telegram отдаётся через Tailscale Funnel; tailscaled теперь под launchd com.cebers.tailscaled-ops
metadata: 
  node_type: memory
  type: project
  originSessionId: 646602a9-df0f-4c7a-b65a-c194c9cbfed9
---

ops_dashboard (mini, `~/Services/ops_dashboard/server.py`, порт **8787**, launchd `com.cebers.ops-dashboard`) открывается как **Telegram Web App** (кнопка меню бота → `/tg`) ТОЛЬКО через **Tailscale Funnel**: публичный URL `https://cebers-mini.tail2f8be2.ts.net` (на 443 → 8787 дашборд, на 8443 → robokassa). Funnel живёт лишь пока жив `tailscaled`.

`tailscaled` тут — **userspace-режим со своим сокетом/state**, НЕ системный Tailscale.app:
`/opt/homebrew/bin/tailscaled --tun=userspace-networking --socket=~/Services/ops_dashboard/tailscale/tailscaled.sock --state=…/tailscaled.state --statedir=…/tailscale --port=41641`.
**Обязательно через HTTP-прокси xray :2081** (`HTTPS_PROXY=HTTP_PROXY=http://127.0.0.1:2081`) — controlplane.tailscale.com блокируется с RU-IP. CLI: `tailscale --socket=…/tailscaled.sock status|funnel status`. Restore-funnel: `~/Services/ops_dashboard/tailscale/restore_funnel.sh`.

**Инцидент 2026-06-18:** дашборд перестал открываться в TG. Причина — `tailscaled` умер ещё 15 мая (`got signal terminated`, ребут) и **не было автозапуска вообще**. Funnel восстанавливается из state сам, как только демон поднят. Фикс: создан LaunchAgent **`com.cebers.tailscaled-ops`** (`~/Library/LaunchAgents/`, RunAtLoad+KeepAlive, env с прокси :2081, лог `…/tailscale/tailscaled.log`) → переживает ребут. Проверено: публичный `/tg` → 303, `/static/telegram-web-app.js` → 200.

**Вторая причина того же инцидента (2026-06-18):** Web App давал `ERR_NAME_NOT_RESOLVED` — кнопка меню бота `@Cebers_Dev_Logs_bot` (`setChatMenuButton`) смотрела на `mac-mini.tail2f8be2.ts.net` (прежнее имя ноды, мёртвое), а живой хост — `cebers-mini.tail2f8be2.ts.net`. Т.е. «мёртвый узел mac-mini» = старое имя той же машины. Фикс — переставил кнопку на cebers-mini/tg. Грабли: `getChatMenuButton` — **eventual-consistency, read лагает до ~минуты** (не прокси-кэш: HTTPS через xML только туннелируется); ASCII/кириллица в `text` бьётся при передаче по SSH → звать Bot API python-скриптом, переданным по `scp` (байт-безопасно), и перечитывать с паузой ≥30–60с. Итог: кнопка = text «Дашборд», url чистый `…/tg` (DBG/`?v=DEBUG123` убраны, подтверждено 4 чтениями за 60с).

**Ребрендинг + вёрстка (2026-06-18 ч.3):** панель «CebersPulse» актуализирована под Делор (name/launchd_label `com.cebers.delor`/process `delor.main`/пути `~/Services/delor/data`/env `DELOR_TELEGRAM_PROXY`); внутренний `id="cebers_pulse"` и роуты `/api/cebers-pulse/*` НЕ трогали (служебные). Адаптив починен: убран гориз. overflow на мобилке (Делор 459→390, История 790→390) через `minmax(0,1fr)`+`min-width:0`+`overflow-wrap`, скоуп ≤980/≤720/`tg-mini` (десктоп не тронут). Проверка вёрстки — headless-Playwright на mini: cookie минтится из `_state/session_secret.key` (user `cebers`), `bypass_csp=True`, мобила = inject `tg-mini`+`window.Telegram`; критерий = `scrollWidth==innerWidth==390`. Скрипты: `/tmp/ops_{shots,detail,diag}.py` на mini.

**Актуализация 2026-07-02:** конфиг приведён к полному реестру (40 карточек): добавлены ТБР (бот/API :20152/фронт :20151), CryptoPilot, FreeTierRadar, CebersPost, КодоЦех-студия (:8210/healthz), VakHunter web (:20452/api/health), CebersResearch (:20130/healthz), zemlya frontend #2 (:20142), инфра (tailscaled-ops, gaechkin-pg, kodoceh-rathole) и 4 ha_storage_* чека (писались, но не отображались). Удалён вечно-degraded тайл rosreestr_sanity_cron (без process_match/health_file тайл не может стать зелёным; его мониторит зонтик ha_cron_jobs). Легаси-бэкапы из корня перенесены в `_config_backups/` (его читает UI восстановления). Конфиг hot-reload, первый статус новой карточки не шлёт уведомление. **Правило 8 в ~/.claude/CLAUDE.md:** новый бот/сайт = карточка в дашборде, ренейм = обновить, вывод = удалить, после правки — проверка тайла через /api/status.

Obsidian: `Projects/ops_dashboard/` (5 файлов, заведён 2026-06-18) — подробности там. Связано: [[cebers_pulse_v080_state]] (ops_dashboard 8787), [[mac_mini_upterm_access]], [[obsidian_documentation_rule]].
