OPS · обновлено 2026-05-04

RE:CORE Operations

Куда смотреть и что нажимать когда что-то происходит. Для команды и AI-агентов которые помогают команде.

Дашборды и алерты

ЧтоURLКогда смотреть
Ошибки приложений (GlitchTip) errors.recore.su Когда что-то падает на ПК клуба, в panel-api, или billing
Доступность сервисов (Uptime Kuma) status.recore.su Узнать что лежит сейчас
Метрики и графики (Grafana) reborndev.ru/grafana CPU/RAM/диск/DORA
GitLab reborndev.ru/git Код, MR, pipelines
Telegram алерты @Pom0gi_bot в личке владельца Все critical/warning из системы (приходят сами)
DORA метрики через GET /api/dora/metrics?days=30 на panel-api:
  • cycle_time — медиана от MR opened до MR merged
  • deploy_freq — успешных деплоев в main / день
  • change_fail_rate — hotfix MR в main < 24h после деплоя / total deploys
Заполняется через GitLab webhook (System + Group Hooks → POST /api/dora/event).

Server-flow (panel, billing-backend, rebornapi, recore-team-assistant-new)

  1. Ветка от test: git checkout -b feature/x test
  2. Push → MR в test → CI зелёный → Maintainer мержит
  3. В test минимум 2 часа, потом MR test → beta
  4. В beta минимум 48 часов, без падений и алертов → MR beta → main
  5. mainauto-deploy panel.recore.su в течение ≤5 мин
  6. БД миграции — ручная кнопка deploy:panel:migrate в pipeline UI

Мерджить в main и beta могут только Maintainer'ы конкретного репо. Кнопка Merge серая — попроси Maintainer'а.

Desktop-flow (desktop-client, admin-panel-wpf, club-client-pc-image)

Артефакты идут в Backblaze B2 + manifest регистрируется в panel.recore.su. Auto-deploy НЕТ — после merge в main нужно вручную обновить клуб через panel UI или endpoint.

Mobile-flow (mobile-client-{ios,android}, admin-mobile-{ios,android})

48-часовой cooldown НЕ применяется — App Store и Play review сами по себе занимают 1-7 дней. Gate в CI проверяет что storeReviewStatus=approved для main.

Static-flow (investor-dashboard, reborn-admin-frontend, support-crm)

Trunk-based. Любой merge в main → smoke-test через Playwright/lighthouse → auto-deploy в nginx. Без 48ч cooldown.

Ручное обновление клуба

В panel.recore.su → карточка клуба → блок «Версии API» → кнопка «Обновить весь клуб».

NATS-команда (recore.cmd.<clubId>.<pcId>.RecheckUpdates) уходит на ПК в течение секунд. Каждый ПК проверяет /api/clients/latest?clubSlug=&pcId=, видит новую версию, скачивает payload, ставит, перезапускается.

# API-эндпоинты для скриптов:
POST /api/clubs/:id/recheck-updates       body: {pcIds?: number[]}
POST /api/clubs/:id/apply-client-version  body: {versionId} (закрепить и обновить)
DELETE /api/clubs/:id/apply-client-version (отвязать pin клуба)

Auto-update (opt-in)

В карточке клуба чекбокс «Авто-обновление». По умолчанию OFF.

Заблокирован для:
  • production-клубов (платят, не должны получать обновления без явного согласия)
  • канала stable (там промоут уже сам по себе осторожный, без auto-update)

Включить можно только на test или beta клубах. Endpoint:

PUT /api/clubs/:id/auto-update body: {enabled: true|false, windowStart?, windowEnd?}

Закрепить версию на конкретном ПК

Если нужно протестировать новую версию только на одном ПК клуба перед раскатом всем (smoke на 1 машине):

POST /api/computers/:id/version-override body: {versionId}
DELETE /api/computers/:id/version-override (снять закрепление)

Resolution приоритет в /api/clients/latest: pc-override → club-target → channel-latest. Закреплённый ПК не подхватит ни обновление клуба, ни смену канала.

Откат версии

  1. В UI клуба — кнопка Rollback в блоке «История применений» (откат к предыдущей записи в version_history)
  2. Если нет истории — переключить канал клуба обратно: например со stable на beta в карточке клуба
  3. Если совсем плохо — закрепить конкретную (заведомо рабочую) версию через per-PC override на каждом ПК клуба

Деплой panel.recore.su

Auto-deploy при push в main репозитория root/recore-platform:

  1. CI job deploy:panel подключается к 176.114.85.85:2222 по SSH-ключу RECORE_DEPLOY_KEY
  2. git pull origin main && docker compose pull panel-api panel-web && docker compose up -d panel-api panel-web
  3. Smoke-check curl /api/health
  4. Job deploy:panel:migrate (manual gate) — для запуска БД миграций после очередного push

Деплой rebornapi (per-club)

CI публикует Docker image в GitLab Container Registry → panel сама пуллит на нужный клубный контейнер при POST /api/clubs/:id/apply-version.

Деплой мобильных приложений

CI собирает .aab (Android, signed production keystore) → upload в B2 + manifest в panel. Дальше — вручную через Google Play Console / App Store Connect.

Роли и права в GitLab

РольЧто можетКто
OwnerВсё (включая удаление проекта)nik45114, root
MaintainerМерджить в protected ветки своего проекта, менять CI varsКаждый разраб в своём репо
DeveloperПушить в feature/*, создавать MRВсе остальные

Backstop'ы (кто принимает MR за кого)

За когоПринимает MR (кроме самого автора)
Денис Скоков (admin-mobile-*)Дима Гвоздев или Артём Корешов
Влад Теплов (mobile-client-*)Дима Гвоздев или Артём Корешов

Incident flow

  1. Алерт пришёл в Telegram
  2. Открыть errors.recore.su и status.recore.su
  3. Если panel.recore.su → git revert последний коммит в main, push, ждать deploy:panel
  4. Если desktop-client клуба → переключить канал клуба обратно или закрепить ПК на старую версию
  5. Если GitLab → ssh root@82.27.2.250, docker logs agentforge-gitlab
  6. Зафиксировать в POST /api/dora/event как incident_opened и incident_resolved (для MTTR метрики)

Runbook'и

panel.recore.su отдаёт 502

ssh -i ~/.ssh/id_ed25519 -p 2222 root@176.114.85.85
docker compose -f /opt/recore-platform/docker-compose.yml ps | grep panel
docker logs recore-panel-api --tail 50
# Если БД недоступна:
docker compose restart recore-postgres

desktop-client не обновляется при нажатии «Обновить весь клуб»

  1. Проверь что NATS жив: curl https://panel.recore.su/api/health → должно содержать nats: ok
  2. Проверь что у клуба есть активная версия в нужном канале: GET /api/clients/latest?clubSlug=X → 200 с manifest
  3. SSH на ПК клуба → проверь что desktop-client процесс работает + смотрит на нужный updateUrl

GitLab медленно отвечает

Уже должен прийти алерт GitLabSlow. Проверь:

ssh -i ~/.ssh/freakhosting root@82.27.2.250
docker stats --no-stream agentforge-gitlab
# Если RAM > 90% или CPU стабильно > 80% — рестарт:
docker compose -f /opt/recore-platform/docker-compose.yml restart agentforge-gitlab

Pipelines красные на main

  1. Открой failed pipeline → посмотри какой job упал
  2. Если sync:metadata — известный alpine-mirror баг, allow_failure:true в шаблоне (не блокер)
  3. Если build:rebornapi — проверь Linux runner: ssh root@82.27.2.250 'docker ps | grep runner'
  4. Если validate:rebornapi testdb missing — это инфра-проблема runner'а, см. issue в recore-platform

Что обновляется здесь

Эта страница — snapshot текущего состояния OPS-стека. Обновляется когда меняется архитектура. Source of truth: D:/2/REBORN_client/docs/superpowers/specs/2026-05-03-recore-platform-ops-design.md и actual-config'и на серверах. Если читаешь это и видишь несоответствие реальности — пиши в Telegram @nik45114.