---
name: ops-dashboard-card
description: Завести или обновить карточку сервиса в ops_dashboard (реестр всех ботов/сайтов на mac mini). Брать ВСЕГДА когда новый бот/сайт/сервис задеплоен под launchd на mini, при ренейме/смене порта/путей/лейбла существующего сервиса, или при выводе сервиса из эксплуатации. Также при проверке после правки конфига — дождаться цикла и убедиться что тайл зелёный.
---

# ops_dashboard card

Конфиг: `~/Services/ops_dashboard/dashboard_config.json` на mini (`ssh -p 2222 cebers_mini@100.84.177.25`).
Конфиг **hot-reload** — сервер перечитывает каждый тик, рестарт не нужен. Новые карточки не спамят Telegram (первый статус просто запоминается).

## Протокол

1. **Новый сервис под launchd** → добавить карточку: `id`, `name` (по-русски, как продукт называется), `description`, `launchd_label`, `process_match` (проверь `pgrep -f "<match>"` — должен находить ровно этот процесс), `working_dir`, `env_file`, `log_paths`, `db_paths`; если есть HTTP-эндпоинт — `health_check` (`{"type":"http","url":"http://127.0.0.1:<port>/healthz",...}`).
2. **Ренейм/смена порта/путей/лейбла** → обновить существующую карточку в той же сессии.
3. **Вывод из эксплуатации** → карточку удалить (не оставлять вечно-красный/жёлтый мусор).
4. **Проверка обязательна** — после правки конфига дождаться цикла (~60с) и убедиться, что тайл зелёный: пробой `/api/status` с cookie (формат `ops_dashboard_session=user:issued:hmac`, secret в `_state/session_secret.key`; готовый скрипт — `/tmp/dash_status.py` на mini или пересоздать по Obsidian `Projects/ops_dashboard/Scenarios.md`).

## Грабли

- Тайл без `process_match` и без `health_file_path` вечно висит «degraded» (логика требует живой PID).
- Для cron/sentinel-джоб — либо `health_file_path` с `last_success_ts`, либо не заводить тайл (зонтик `ha_cron_jobs` уже мониторит exit-коды `local.zemlya-*`).
- Бэкапы конфига — в `_config_backups/` (их читает UI восстановления), не в корень.
