Главное в одной фразе: теперь ты узнаешь о падениях из Telegram, а не от звонка клуба, и панель деплоится сама на push в main.
1. Появились публичные страницы для команды
- errors.recore.su — все ошибки из panel-api / desktop-client / billing / rebornapi (GlitchTip — open-source Sentry).
- status.recore.su — живой мониторинг 6 ключевых URL'ов (GitLab, panel, billing, CRM). Обновляется каждую минуту (Uptime Kuma).
- reborndev.ru/ops — runbook: куда смотреть и что нажимать когда что-то происходит.
2. Алерты в Telegram
Когда любой из мониторов падает (URL не отвечает > 2 минут, panel-api ловит exception, GitLab отдаёт > 5s) — приходит сообщение в Telegram. Делать ничего не надо, оно уже работает.
3. Авто-деплой panel.recore.su
Раньше после merge в main кто-то заходил по SSH и руками делал git pull + docker compose up. Теперь — CI делает это сам за ≤5 минут. Миграции БД остались с ручным подтверждением (кнопка deploy:panel:migrate в pipeline UI) — чтобы сломать ничего нельзя случайно.
4. Manual update flow для desktop-client
- В карточке клуба в panel.recore.su появилась кнопка «Обновить весь клуб» — даёт NATS-команду на все ПК клуба.
- Чекбокс «Авто-обновление» — opt-in. По умолчанию выключен. Заблокирован для production-клубов и канала stable.
- Можно закрепить версию на конкретном ПК для smoke-теста —
POST /api/computers/:id/version-override.
5. DORA метрики
GitLab пушит события (MR opened/merged, pipeline succeeded/failed) на panel — будут считаться cycle_time, deploy_freq, change_fail_rate за последние 30 дней. Открой GET /api/dora/metrics?days=30 или дашборд в Grafana. Пока данные накапливаются.
6. Ветка develop теперь read-only
Все 5 репо: recore-team-assistant-new, billing, club-client-pc-image, desktop-client, recore-team-assistant. Push и merge в develop запрещены. Через ~7 дней (~10.05) ветку удалю окончательно. Делай feature от test:
git fetch && git checkout test && git pull git checkout -b feature/your-thing
7. Что от тебя сейчас требуется
- Если есть открытые MR в
develop— переориентируй их наtest(в UI MR'а: Edit → Target branch). - В IDE:
git fetch && git checkout test && git pull. - Если знаешь что в твоём приложении надо ловить ошибки — попроси чтобы добавили Sentry SDK (DSN'ы лежат в
.envpanel-сервера, именаGLITCHTIP_DSN_*).
Главное в одной фразе: ветка develop теперь называется test, и для попадания в прод (main) обязательны 48 часов в beta.
1. Новый процесс веток
- Было:
develop → beta → main - Стало:
test → beta → main - Свои feature-ветки делаешь от
testи MR-ишь вtest. Дальшеtest → betaи через 48 часовbeta → main. - Если CI ругается «Merge в main допустим только из ветки beta» — значит ты пытаешься перепрыгнуть стадию. Сначала в beta.
- В
mainиbetaмержить могут только Maintainer'ы. Если у тебя кнопка Merge в MR серая — попроси Maintainer'а нажать.
2. Канал релизов dev переименован в test
- Было три канала:
stable/beta/dev - Стало:
stable/beta/test - Если в твоём коде или скрипте захардкожена строка
"dev"— пока работает (API временно принимает оба), но лучше поменяй на"test".
3. Канал клуба теперь выбирается в panel.recore.su
- В карточке клуба три кнопки:
stable,beta,test. Что выбрано — то и катится на ПК клуба автоматически при следующем апдейте. - Раньше канал передавался самим клиентом (
?channel=...) и его было легко перепутать. Теперь источник правды один — БД панели. - Флаг «production-клуб» жёстко фиксирует канал
stableи блокирует переключение на test/beta пока флаг включён. Снимай флаг только осознанно.
4. 48 часов в beta — теперь реальное правило, а не текст
- Версия не уйдёт в
stable, пока не пролежала вbetaминимум 48 часов и не отработала на тестовых клубах без падений. - Проверка работает в двух местах: в CI (
gate:check-beta) и на стороне панели при кнопке «Promote → stable». - Раньше можно было гнать в main мимо beta — теперь нет.
5. Что от тебя сейчас требуется
- В рабочих копиях своих репо:
git fetch && git checkout test && git pull(если у тебя был чекаут наdevelop). - В CI-шаблонах своих репо: проверь не осталось ли
$CI_COMMIT_BRANCH == "develop"— если есть, замени на"test". - Если что-то твоё (скрипт, конфиг, шпаргалка) ссылается на канал
dev— переименуй вtest.
- Ветки переименованы:
develop→testв репоrecore-team-assistant-new,billing,club-client-pc-image,desktop-client,recore-team-assistant. Стараяdevelopещё существует как backward-compat — будет удалена через неделю когда все переключатся. - Канал релизов
dev→test. Везде в коде, в БД (миграция 014), в CI шаблонах, в этом документе. API временно принимает оба значения и переписываетdevвtest. - Новый flow:
test → beta → main. Текстовое описание в разделе про ветки. - 48ч cooldown beta → stable — теперь реально работает (не только описано). Проверка в:
- CI (
gate:check-betaв pipeline на MR в main) - Panel API: новый
POST /api/clients/promoteприменяет правилоpromotion_rules.min_hours_in_from
- CI (
- Per-club канал из панели.
GET /api/clients/latest?clubSlug=Xтеперь читает канал изclubs.release_channelпо slug, а не из query-параметра. Клуб переключаешь в panel.recore.su (кнопки stable/beta/test в карточке клуба). Если slug не найден — 404 (раньше был fallback на query, маскировал тайпы). - Production-флаг у клуба теперь принудительно ставит канал
stableи блокирует переключение на test/beta пока флаг включён. - Защита веток ужесточена в
recore/recore-team-assistant(старый billing): merge вmainиbetaтеперь только Maintainer (раньше Developer мог). - В группу
recoreдобавлены: Чернорай Владислав (Developer), Названцев Андрей (Maintainer). - Maintainer-список (могут мержить в protected-ветки): Гвоздев Дмитрий, Корешов Артём, Названцев Андрей.
- Токен
GITLAB_TOKENротирован — личный PATnik45114в.env.productionна CRM- и panel-серверах. CI пуши в GitLab, как и раньше, идут через CI runners (отдельные runner-токены).
Что ещё нужно знать: если CI ругается «Merge в main допустим только из ветки beta» — это новый gate:check-beta, выполняй test → beta → main через MR.
Если desktop-client (sever/rio) пишет «Update check failed» — подожди или дёрни panel-разработчика, идёт деплой.
RE:CORE — как устроена наша разработка
Подробный справочник по системе RE:CORE для людей которые пишут код через AI-чаты (Claude Code, Codex CLI). Читай сверху вниз — к концу документа ты сможешь сам принять свою первую фичу, понять почему упал CI и настроить рабочее место за один промпт.
0Кому этот документ
Если тебе приходится гуглить слова вроде «git merge» или «docker compose» — ты по адресу. Этот документ специально написан так, чтобы каждый термин объяснялся простым языком прямо в тексте. Ничего специально не пропускаем.
Человек, который пишет код не руками, а диктует нейросети что сделать. Вы говорите Claude Code «почини этот баг», он правит файлы и коммитит. Ваша задача — понимать что хорошо а что плохо, читать ошибки, принимать решения. Код можно не уметь писать — это делает AI.
- Открывать терминал (консоль)
- Копипастить команды
- Читать сообщения об ошибках (хоть ты и не программист — красный текст не значит катастрофа)
- Описывать задачу нейросети по-человечески
- Писать и править код
- Запускать тесты
- Коммитить и пушить в Git
- Объяснять что она сделала и почему
1Основы за 10 минут
Если ты никогда не работал с кодом — прочти этот раздел. Без него дальше будет непонятно.
1.1 Git — «машина времени для файлов»
Git — программа, которая запоминает каждое изменение в проекте. Если что-то сломалось, ты возвращаешься к предыдущей версии за 2 секунды.
Папка проекта под надзором Git. У каждого нашего продукта есть свой репо — например, recore/rebornapi-backend. Лежит на нашем сервере reborndev.ru/git.
Одно сохранение в машине времени. Содержит: какие файлы изменились, кто изменил, когда, и подпись: «что именно тут сделано». Пример: fix: починил кнопку логина.
Параллельная вселенная проекта. Основная ветка — main (то что у клиентов). Ты делаешь свою — feature/fix-login — работаешь там, а когда готово, вливаешь в main. Тогда клиенты видят твой фикс.
push — отправить свои коммиты на сервер. pull — забрать чужие коммиты себе. Работает как облако для файлов.
1.2 CI/CD — «робот-проверяльщик»
CI/CD (Continuous Integration / Continuous Deployment) — автоматический робот, который просыпается каждый раз, когда ты что-то запушил. Он:
- Берёт твой код
- Собирает из него программу (билдит)
- Запускает тесты (проверяет что ничего не сломано)
- Если всё ок — отправляет результат на сервер / в магазин приложений / в панель
- Если плохо — пишет тебе «всё, дальше не пущу, смотри ошибку»
У нас CI называется GitLab CI. Он настроен в файле .gitlab-ci.yml в корне каждого репо. Тебе редактировать его обычно не надо — Никита уже всё настроил.
1.3 Pipeline, Job, Stage, Artifact
Это термины которые ты увидишь в логах и в GitLab-интерфейсе.
Весь процесс «собрать и проверить» от начала до конца. Один pipeline = один ваш пуш в ветку.
Группа работ. Пример: build, validate, publish. Следующий этап не начнётся, пока не закончится предыдущий.
Конкретное действие внутри этапа. Например, build:docker собирает Docker-образ, validate:rebornapi проверяет endpoint /health.
Файл, который job оставил после себя (например, manifest.json, image.tar). Следующий job может его взять и использовать.
1.4 Docker — «виртуалка для программы»
Docker упаковывает программу вместе со всем, что ей нужно для работы (Node.js, Python, библиотеки, env-переменные) в один контейнер. Получается коробка которую можно запустить где угодно и она будет работать одинаково — на ноуте разработчика, на сервере, в CI.
Рецепт / архив программы. Пример: reborndev.ru:5050/recore/rebornapi:v1.2.3 (когда GitLab Container Registry будет подключён; сейчас образы живут локально на сервере). Сам по себе не работает — это заготовка.
Запущенный экземпляр образа. Как процесс Word когда ты открыл документ. Контейнеров из одного образа можно запустить хоть 100.
Текстовый файл-рецепт: «возьми Node.js, скопируй мой код, запусти npm install, стартуй на порту 3000». Из него CI собирает image.
Хранилище образов. GitLab Container Registry пока не включён глобально — образы собираются в CI и лежат на сервере как файлы; в будущем подключим через reborndev.ru:5050 с авторизацией по GitLab-токену.
1.5 Manifest — «паспорт программы»
Каждая наша сборка отдаёт JSON-файл со своей «биографией»: какая версия, какой коммит, какие endpoint-ы она открывает, какая версия базы данных нужна. Это и есть manifest.
{
"version": "1.2.3",
"channel": "stable",
"gitCommit": "abc1234",
"builtAt": "2026-04-22T10:00:00Z",
"compatibility": {
"dbSchemaVersion": 42,
"breakingChanges": false,
"minPanelVersion": "1.0.0"
},
"endpoints": {
"health": "/health",
"manifest": "/api/manifest"
},
"required": {
"env": ["DATABASE_URL", "JWT_KEY"],
"ports": [5000]
},
"migrations": ["001_InitialCreate.sql", "002_AddUsers.sql"]
}
1.6 Merge Request (MR) — «заявка на слияние веток»
Когда ты закончил работу в своей ветке, ты хочешь её содержимое влить в test или main. Для этого в GitLab создаётся Merge Request (в GitHub это называется Pull Request, но суть та же).
- MR — это страница в GitLab где видны все твои изменения построчно
- Там же проходит CI — если упал, кнопка «merge» неактивна
- Другой член команды делает code review — читает диффы и оставляет комментарии
- Когда все довольны — нажимается кнопка «Merge», и твой код попадает в целевую ветку
1.7 Зачем всё это
Потому что мы работаем в команде и с нейросетями. Нейросеть может что-то сломать в тихаря: починить одно, сломать другое. Без CI мы этого не заметим до жалобы клуба. С CI — машина проверит за нас: код не попадёт в прод, пока не пройдёт все проверки.
2Глоссарий терминов
Если встретишь в тексте или в логах непонятное слово — ищи тут.
- Api (API)
- Программный интерфейс. У нас чаще всего — HTTP endpoint на бэке, к которому стучатся мобилки, админка и клиенты. Пример:
POST /api/auth/login. - Artifact (артефакт)
- Файл, который один CI-job передаёт следующему. Обычно лежит 30 дней в GitLab и его можно скачать.
- Backend / Frontend
- Backend — программа на сервере (API, обработка данных). Frontend — то что пользователь видит (сайт, мобилка, десктоп).
- Branch (ветка)
- Параллельная версия репозитория. У нас используются:
test(самое свежее),beta(проверка),main(то что у клиентов),feature/*(твоё рабочее). - Build (сборка)
- Процесс превращения исходного кода в запускаемую программу. Для Docker —
docker build, для Android — сборка APK, для сайта —npm run build. - CI/CD
- Continuous Integration / Continuous Deployment. Робот-автоматизатор проверок и выкладок.
- Channel (канал)
- Уровень «зрелости» версии. У нас три:
test(экспериментальное),beta(проверяется 2-3 клубами),stable(идёт всем). - Commit (коммит)
- Сохранение изменений в Git. Имеет уникальный id (SHA) и подпись.
- Container (контейнер)
- Запущенная программа внутри Docker. Изолирована от системы как песочница.
- Dockerfile
- Рецепт сборки Docker-образа.
- Endpoint
- Конкретный адрес у API. Пример:
GET /health,POST /api/clubs/new. - Env (environment variable)
-
Переменная окружения — настройка программы, которую задают снаружи, а не хардкодят в коде. Нужна чтобы одна и та же программа на ноуте разработчика, в CI и в проде подключалась к разным БД/серверам/ключам без правки исходников.
Что там обычно лежит:
DATABASE_URL— строка подключения к БД:postgres://user:password@host:5432/dbnameJWT_SECRET,JWT_KEY— секретный ключ для подписи токенов авторизацииREDIS_URL— адрес кэшаTELEGRAM_BOT_TOKEN,GITLAB_TOKEN,OPENAI_API_KEY— токены внешних APIAPP_VERSION,APP_CHANNEL,APP_GIT_COMMIT— CI прокидывает сюда версию и SHA коммита, программа печатает их в/api/manifestNODE_ENV,ASPNETCORE_ENVIRONMENT—development/production, меняет логирование и оптимизацииPORT— на каком порту слушать
Где хранятся: локально в файле
.env(который никогда не коммитится в git — он в.gitignore). В проде — вdocker-compose.ymlчерезenv_file, в CI — в Settings → CI/CD → Variables. Правило: если ты видишь токен или пароль в коде напрямую — это баг, переноси в env.В коде читаются так:
process.env.DATABASE_URL(Node.js),os.environ["DATABASE_URL"](Python),Environment.GetEnvironmentVariable("DATABASE_URL")(.NET). - Health (health-check)
- Специальный endpoint (обычно
/health) который возвращает 200 OK если программа жива. - Image (Docker image)
- Сохранённый образ программы в Docker. Из него создают контейнеры.
- Job / Stage / Pipeline
- Pipeline — один запуск CI целиком. Stage — этап внутри pipeline (
build,validate,publish). Job — конкретная команда в этапе. Подробно: раздел 1.3. - Manifest
- Паспорт версии в JSON: какая версия, какой коммит, какие endpoints открывает, какая схема БД нужна. Панель читает его перед применением. Подробно: раздел 1.5, рантайм-вариант: раздел 19.
- Merge (слияние)
- Объединение веток. «Merge ветки feature/X в test» = взять все коммиты из feature/X и применить к test.
- Merge Request (MR)
- Заявка на merge в GitLab. В GitHub это Pull Request (PR).
- Migration (миграция БД)
- Скрипт для изменения структуры базы данных (добавить колонку, таблицу). Применяется автоматически при деплое.
- Pipeline
- Один запуск CI (весь набор jobs). Зелёный = всё ок, красный = что-то упало.
- Protected branch
- Ветка которую нельзя случайно сломать. В main/beta нельзя пушить напрямую — только через MR.
- Pull / Push
- Pull = забрать свежее с сервера, push = отправить своё на сервер.
- Registry
- Хранилище Docker-образов. У нас пока локально на сервере; планируется GitLab Container Registry на
reborndev.ru:5050. - Regression test
- Тест который проверяет что старая починенная функциональность не сломалась снова. У нас хранятся в panel.recore.su.
- Rollback (откат)
- Возврат к предыдущей версии программы. Панель делает авто-rollback если новая версия падает 5 минут подряд.
- Runner (GitLab runner)
- Исполнитель CI-задач. Отдельный компьютер на котором крутится твой pipeline.
- SHA (commit hash)
- Уникальный id коммита. Длинный — 40 символов, короткий — 7. Пример:
a1b2c3d. - SSH
- Протокол удалённого доступа.
ssh root@46.37.123.214= «зайти в чужой компьютер через терминал». - Tag
- Метка на коммите. У нас версии помечаются тегами:
v1.2.3. - Webview
- Встроенный браузер внутри нативного приложения. В десктоп-клиенте у Андрея так показывается веб-контент.
3Как общаться с AI-чатом
Главный инструмент вайбкодера — Claude Code (основной) или Codex CLI (для оркестратора). Оба работают в терминале в папке проекта: видят файлы, правят код, запускают команды, коммитят. От того насколько точно ты формулируешь задачу зависит качество результата.
3.1 Как дать AI контекст проекта
Первое что обеспечит хороший результат — правильный контекст. Три вещи которые надо сказать AI в начале сессии:
- Путь к проекту — в какой папке ты работаешь.
- Краткое описание — что это за продукт и кто с ним работает.
- Текущая задача — что именно сейчас надо сделать.
Я работаю в проекте recore-team-assistant-new, репо лежит по пути
d:\2\REBORN_client\codexrebornhub.
Это CRM + AI-агент платформа для команды. Backend — Fastify
на TypeScript, frontend — Next.js. Я пишу код только через тебя,
я не программист.
Сейчас нужно: починить баг что на странице /projects не
открывается модалка «Новый проект» — нажимаю кнопку, ничего
не происходит.
Сначала изучи репо, потом предложи план, потом реализуй.
CLAUDE.md в корне — туда ИИ смотрит автоматически. Там уже описан стек, команды сборки, конвенции. Тебе не надо каждый раз объяснять «что у нас Fastify + TypeScript» — это уже в CLAUDE.md.
3.2 Хорошие принципы запросов
- Конкретно: «кнопка «Сохранить» на странице /settings»
- Одна задача — один запрос (не мешай всё в кучу)
- Говори что должно получиться, не как реализовать
- Прилагай скриншот если описать сложно
- Проси план до кода: «сначала расскажи план, потом начнём»
- Проси тест: «напиши тест который проверит что фикс работает»
- «Почини всё» — AI не знает что именно
- «Сделай лучше» — без критерия «лучше» ничего не выйдет
- «Добавь фичу X и заодно перепиши auth» — две задачи
- «Сделай как у Apple» — нейронка не знает как у Apple
- «Не делай ничего странного» — да, такие отрицания хуже работают
3.3 Режим планирования (Plan Mode) и суперсилы
Claude Code — не просто автодополнение. В нём есть режимы и встроенные «скиллы» (суперсилы), которые радикально меняют поведение AI. Пользуйся ими — это разница между «генерит первый попавшийся код» и «сначала думает, потом делает».
Plan Mode (режим планирования)
Нажми Shift+Tab дважды в Claude Code — попадёшь в Plan Mode. В этом режиме AI не трогает файлы, только исследует код и пишет пошаговый план. Ты читаешь план, одобряешь его кнопкой «Accept» — и только тогда он начинает править.
- Большая фича с неочевидной архитектурой
- Рефакторинг в нескольких файлах
- Когда сам плохо понимаешь что надо — пусть AI сначала разберётся
- Перед любой правкой в деньгах/авторизации/миграциях
- Опечатка в тексте, маленький фикс в одном файле
- Добавить простой endpoint по образцу существующих
- Когда уже третий раз просишь одно и то же
Суперсилы (superpowers)
У Claude Code есть набор встроенных «скиллов» — это заготовленные процедуры которые AI знает как выполнять идеально. Они активируются когда AI видит что задача подходит, либо когда ты напрямую просишь.
| Суперсила | Когда срабатывает | Что делает |
|---|---|---|
brainstorming |
«давай подумаем», «какие варианты», «как лучше» | Задаёт уточняющие вопросы по одному, не кодит пока не ясен дизайн |
systematic-debugging |
«починить баг», «тест упал», «непонятно что не так» | Ищет корневую причину, не маскирует ошибку, воспроизводит баг локально |
test-driven-development |
«напиши фичу», «реализуй логику» | Сначала пишет падающий тест, потом код, потом проверяет что тест зелёный |
writing-plans |
«план», «как будем делать», «разбей на задачи» | Создаёт пошаговый план с чекпоинтами и точками проверки |
verification-before-completion |
перед тем как сказать «готово» | Запускает тесты/сборку/линт и показывает реальный вывод — не объявляет победу без доказательств |
code-review |
«проверь мой код», «сделай ревью» | Прицельно ищет баги, security-дыры, нарушения конвенций проекта |
/brainstorming, /debug, /review или скажи прямо: «используй навык test-driven-development». Claude Code прочитает нужный скилл и пойдёт по нему шаг за шагом.
Полезные режимы и команды
/clear— очистить контекст если AI «залип» или пошёл не туда/compact— сжать историю разговора, освободить контекст, не теряя сути/review— попросить ревью текущих изменений перед коммитом/fast— переключиться на Opus 4.6 с ускоренным выводом (меньше задержка, та же модель)/help— список всех команд- Ctrl+C — прервать текущее действие (если AI начал делать не то)
- Shift+Tab (дважды) — в Plan Mode, (ещё раз) — обратно
4Примеры запросов к AI
Эти примеры можно копировать прямо в Claude Code или Codex CLI. Замени {переменные} на свои.
4.1 Старт работы над задачей
Склонируй https://reborndev.ru/git/recore/rebornapi-backend.git в папку
d:\2\REBORN_client\rebornapi-backend, создай новую ветку
feature/fix-login-button от ветки test, и покажи что внутри проекта.
Мне нужно понять структуру.
В проекте rebornapi-backend добавь endpoint POST /api/clubs/new,
который принимает JSON { "name": "строка", "city": "строка" },
валидирует что оба поля непустые и длиной от 2 до 120 символов,
и возвращает 201 с id созданного клуба или 400 с текстом ошибки.
Используй стиль который уже есть в других контроллерах проекта.
Не забудь обновить .recore-project.yml если добавляется endpoint.
Напиши регрессионный тест который проверяет что
POST /api/auth/login с body {"login":"admin","password":"test"}
возвращает 200 и в ответе есть поле "token".
Тест добавь в формате который панель RE:CORE принимает
через /api/regression-tests. Покажи итоговый JSON который
я могу вставить в панель руками.
4.2 Разбор ошибки
У меня упал pipeline в GitLab CI, job называется validate:rebornapi.
Вот последние строки лога (прикрепляю). Объясни простыми словами
что пошло не так, и предложи что сделать. Не правь код пока я не
одобрю план.
Один из регрессионных тестов упал: имя "Логин админа клуба работает".
Ошибка: ожидали 200, получили 500.
Изучи последние изменения в ветке test, найди что именно могло
сломать логин, покажи мне предполагаемую причину и план починки.
4.3 Локальная проверка
Установи gitlab-runner локально и покажи как запустить наш
.gitlab-ci.yml на моём ноуте. Я хочу проверить pipeline
не пушая пока в GitLab.
Сервер у меня Windows, WSL есть. Пиши команды по шагам, я буду
запускать и показывать вывод.
Я склонировал recore/rebornapi-backend. Помоги запустить проект
локально: что установить, какие env-переменные задать, какие порты
откроются. После запуска мы должны увидеть ответ 200 от /health.
У меня Windows 11, Docker Desktop установлен.
4.4 Создание MR
Сделай коммит всех текущих изменений с понятным сообщением,
запушь ветку в origin, и создай Merge Request в GitLab
(reborndev.ru/git) с целевой веткой test.
В описании MR напиши:
- что именно было сделано (bullet list)
- что нужно проверить ревьюверу
- ссылка на задачу (если есть номер — спроси у меня)
В конце дай мне ссылку на созданный MR.
4.5 Просьба объяснить код
Объясни мне файл src/routes/auth.ts простыми словами. Я не
программист. Для каждой функции — что она делает и когда вызывается.
Если что-то кажется странным или потенциально багованным — тоже
подсвети.
5Чего НЕ делать с AI
Эти ветки защищены. Даже если скажешь «запушь в main» — CI не пустит. Ты получишь красную ошибку и потратишь время. Правильно: пуш в feature/* → создать MR в test → через 48 часов MR в main.
Никогда не пиши в чат пароли от серверов, API-ключи, приватные JSON-ключи Firebase. Если нужен доступ — дай AI название переменной (CI_PANEL_TOKEN), а значение возьмут из GitLab Variables. В коде — только process.env.ИМЯ, никогда не хардкодь.
Такие неконкретные просьбы опасны. AI может удалить нужное. Правильно: «удали файл X», «удали неиспользуемые импорты в src/routes/auth.ts».
Если AI уже 5 раз подряд правил код, а коммита не было — останови и сделай коммит. Иначе при ошибке придётся откатывать всё разом.
AI склонен к оптимизму. После «готово!» — всегда запусти тесты или попроси запустить: «прогони npm test и покажи вывод». Слова «должно работать» ничего не значат, пока тест не зелёный.
git reset --hard не подумавЭта команда безвозвратно удаляет твои локальные изменения. Если попросил AI откатиться — убедись что всё что нужно закоммичено или запушено. Без этого работа пропадёт.
6Как читать ошибки CI
Когда в GitLab pipeline загорелся красным — не паникуй. Вот как смотреть что случилось.
6.1 Где смотреть
- Открой
https://reborndev.ru/git→ свой репо → вкладка CI/CD → Pipelines - Найди красный pipeline (недавний, твоё имя в авторе)
- Кликни на красный кружок — увидишь список jobs
- Клик по красному job → откроется лог выполнения
- В логе ищи строки со словами
ERROR,FAILED,Error:
6.2 Типовые ошибки и что они значат
ERROR: Merge в main допустим только из ветки beta.Ты сделал MR не из beta в main. Правильно:
test → beta → main. Вернись на шаг назад и мержи в beta сначала.
ERROR: Не заданы переменные CI_PANEL_URL или CI_PANEL_TOKENВ GitLab не настроены переменные. Попроси Никиту зайти в
Settings → CI/CD → Variables и добавить. Ты сам их трогать не должен.
/health не отвечает 200 (job: validate)Твоё приложение упало при запуске. Частые причины: не хватает env-переменной, упал migrate БД, порт занят. В логе выше будет
docker logs с настоящей ошибкой.
В канале beta не найдено passed-версии с коммитом XТы пытаешься мержить beta → main, но версия в beta ещё не прошла validate, или pipeline в beta упал. Сначала почини beta, дождись зелёного, потом мержи.
Версия должна пробыть в beta минимум 48ч (сейчас Xч)Это не ошибка, это правило безопасности. Подожди. Если срочный hotfix — отдельный процесс с двумя апрувами, попроси Никиту.
6.3 Как скормить ошибку AI
Не копируй весь лог — копируй последние 50-100 строк, там самое важное. В Claude Code просто скажи: «прочти лог последнего pipeline и объясни что не так».
Pipeline упал на этапе {build|validate|publish|regression}.
Последние 100 строк лога:
---
[сюда вставь лог]
---
Объясни простыми словами что произошло, есть ли решение,
и если да — какие файлы тебе нужно поправить. План покажи
до того как править.
7Первый день: общая подготовка
Это надо сделать всем, вне зависимости от роли. Дальше — индивидуальные инструкции по проектам.
7.1 Программы которые надо установить
- Git —
https://git-scm.com/download/win(Windows) илиbrew install git(Mac) - Node.js 20 LTS —
https://nodejs.org(нужен почти везде) - Docker Desktop —
https://www.docker.com/products/docker-desktop - IDE — VS Code (
https://code.visualstudio.com) - Claude Code (основной) —
npm install -g @anthropic-ai/claude-code - Codex CLI (для оркестратора/параллельной работы) —
npm install -g @openai/codex
- .NET 8 SDK — если ты работаешь с ReBornAPI (Гвоздев Дмитрий)
- Android Studio — Теплов Влад, Скоков Денис
- Xcode (только на Mac) — Теплов Влад для iOS
- Python 3.11+ — Радаев Влад для видеоаналитики
- WSL2 — Windows-разработчикам полезно для bash-скриптов
7.2 Ссылки — сохрани в закладки
| Сервис | URL | Логин |
|---|---|---|
| GitLab | https://reborndev.ru/git | свой логин, выдаст Никита |
| CRM | https://reborndev.ru | свой email, выдаст Никита |
| Панель клубов | https://panel.recore.su | админский логин |
| Documentation | https://reborndev.ru/info/ | этот документ |
7.3 Настройка рабочего места — одним промптом
Не настраивай Git/GitLab руками — запусти Claude Code в папке где будут проекты, и вставь этот промпт. ИИ сам проверит что стоит, что не стоит, установит недостающее, поставит git config, подскажет где брать токен GitLab и склонирует первый репо.
Настрой мне рабочее место разработчика RE:CORE с нуля. Я вайбкодер,
я не программист — делай сам, не проси меня копировать команды.
МОИ ДАННЫЕ:
- Имя: {Моё Имя}
- GitLab email: {my@email.com}
- GitLab логин: {выданный Никитой}
- Рабочая папка: d:\2\REBORN_client (Windows) или ~/recore (macOS/Linux)
- Моя роль: {мобилка / админка / бэкенд / CRM / биллинг / CCTV / техпанель / десктоп}
ЧТО ПРОВЕРИТЬ И ПОСТАВИТЬ (в этом порядке, пропускай если уже стоит):
1. Git — git --version
Windows: winget install Git.Git --silent --accept-package-agreements --accept-source-agreements
macOS: xcode-select --install
Linux: sudo apt-get install -y git
2. Node.js 20 LTS — node --version
Windows: winget install OpenJS.NodeJS.LTS --accept-source-agreements
macOS: brew install node@20
Linux: curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash && sudo apt install -y nodejs
3. Docker Desktop — docker --version
Windows: winget install Docker.DockerDesktop
macOS: brew install --cask docker
Linux: curl -fsSL https://get.docker.com | sh
4. Claude Code — claude --version
Если нет: npm install -g @anthropic-ai/claude-code
5. Codex CLI (для AI-оркестратора) — codex --version
Если нет: npm install -g @openai/codex
6. Git config (если ещё не задан):
git config --global user.name "{Моё Имя}"
git config --global user.email "{my@email.com}"
git config --global core.autocrlf true # только Windows
git config --global init.defaultBranch main
ЛОГИН В GITLAB:
7. Открой в браузере https://reborndev.ru/git, залогинься.
8. Настрой 2FA (Settings → Account → Enable 2FA) — обязательно.
9. Создай Personal Access Token: User Settings → Access Tokens
scope: api, read_repository, write_repository.
Скопируй токен (показывается только один раз).
10. Сохрани токен в gh-кеш чтобы git не спрашивал пароль:
echo "https://{gitlab-login}:{token}@reborndev.ru" >> ~/.git-credentials
git config --global credential.helper store
КЛОНИРУЙ МОИ РЕПО ПО МОЕЙ РОЛИ:
11. На основе поля «роль» выше выбери нужные репо из раздела
«Первый день» документа https://reborndev.ru/info/ и склонируй.
Для каждого: cd папка → git checkout test.
ПОСЛЕ УСТАНОВКИ:
12. Покажи мне список что установил, что уже стояло, что пропустил.
13. Проверь что в каждом склонированном репо git remote -v
указывает на reborndev.ru/git.
14. В конце выведи единую короткую инструкцию «что делать дальше»
(открой такой-то репо, прочитай CLAUDE.md, следующий шаг — прочитать
раздел про твою роль в https://reborndev.ru/info/).
Если какой-то шаг требует моего ввода (пароль, 2FA код, токен) —
остановись и напиши чего тебе не хватает. Всё остальное делай сам.
7.4 Первый тестовый коммит
После настройки открой любой из склонированных репо, запусти Claude Code и попроси:
Создай новую ветку feature/{моё-имя}-hello от test, сделай
в README.md пометку «{Моё Имя} подключился {сегодняшняя дата}»,
закоммить, запушь в origin и создай MR в test через GitLab API
(reborndev.ru/git). В описании MR — одна строка «первый коммит
нового участника команды».
Через 2-3 минуты CI прогонится, MR появится на https://reborndev.ru/git → твой репо → Merge Requests. Никита увидит, одобрит, смерджит. Это подтверждение что связка ноут → git → GitLab → CI → панель работает у тебя end-to-end.
8Первый день — Гвоздев Дмитрий
Ты отвечаешь за бэкенд на .NET 8 и админ-панель клуба (веб-фронт). Это центральные продукты — от тебя зависит больше всего.
8.1 Твои репозитории
https://reborndev.ru/git/recore/rebornapi-backend.git— основной APIhttps://reborndev.ru/git/recore/reborn-admin-frontend.git— админ-панель клуба
8.2 Пошаговая подготовка
https://dotnet.microsoft.com/download).git clone https://reborndev.ru/git/recore/rebornapi-backend.git и git clone https://reborndev.ru/git/recore/reborn-admin-frontend.git. Оба в d:\2\REBORN_client\.git checkout test && git pull.http://localhost:5000/health.git checkout -b feature/dima-first-commit testОткрой
README.md, добавь строку «Гвоздев Дмитрий был тут, 2026-04-22», сохрани.Закоммить:
git add README.md && git commit -m "chore: test commit to verify CI"Пушни:
git push origin feature/dima-first-commitСоздай MR в test через GitLab UI. CI должен стать passed через 5-10 минут.
https://panel.recore.su/versions, найди новую dev-версию с твоим коммитом. Если не видно — значит CI не долетел до publish. См. раздел «Частые проблемы».ci-templates/README.md в этом репо.8.3 Типичные задачи Димы
- Новый endpoint в API → ветка
feature/api-{short-name}→ MR в test - Изменение схемы БД → обязательно миграция + бамп
dbSchemaVersionв .recore-project.yml - Баг в админке → ветка
fix/admin-{short-name}→ MR с регрессионным тестом - Hotfix в проде → отдельный процесс: ветка
hotfix/*→ MR в main с меткой «hotfix» + два апрува
8.4 Что тебе важно помнить
/api/manifest — обязательный. Если его нет или он возвращает неправильную структуру — validate:rebornapi в CI упадёт.
9Первый день — Теплов Влад
Ты делаешь мобилку, в которой клиент клуба бронирует ПК, видит баланс, читает уведомления.
9.1 Твои репозитории
recore/mobile-client-android(PID=63) — Android (native Kotlin + Jetpack Compose, в папкеnative-android/)recore/mobile-client-ios(PID=64) — iOS (Swift)
Обе ветки test → beta → main уже настроены. main и beta protected (Maintainer-only merge), test доступен для пуша всем разработчикам репо.
9.2 Как собрать AAB через GitLab CI (рекомендуется)
Pipeline сам подписывает релизный AAB production-ключом (без debug-key). Триггерится на каждый push в test, beta, main.
test и закодьgit checkout test && git pull
git checkout -b feature/my-thing
# правки в native-android/
git push origin feature/my-thing
https://reborndev.ru/git/recore/mobile-client-android/-/merge_requests/new. Pipeline автоматом запустит build_android.output/app-release.aab. Прямая ссылка вида: https://reborndev.ru/git/recore/mobile-client-android/-/jobs/<JOB_ID>/artifacts/file/output/app-release.aab9.3 Как собрать AAB локально (если CI лежит или нужно отладить)
Понадобится JDK 17 + Android SDK (через Android Studio).
# 1. Клон репо
git clone https://reborndev.ru/git/recore/mobile-client-android.git
cd mobile-client-android
# 2. Переключись на нужную ветку
git checkout test # или beta / main / feature/your-branch
# 3. Получи production keystore у Никиты (.jks файл) и пароли
# Положи keystore в безопасное место, например ~/.keystores/recore-upload-key.jks
# 4. Экспортируй переменные окружения (под Linux/Mac)
export ANDROID_KEYSTORE=$HOME/.keystores/recore-upload-key.jks
export ANDROID_KEYSTORE_PASS='ПАРОЛЬ_KEYSTORE'
export ANDROID_KEY_ALIAS='reborngg-recore-upload'
export ANDROID_KEY_PASS='ПАРОЛЬ_КЛЮЧА'
# (Windows PowerShell)
# $env:ANDROID_KEYSTORE = "$HOME\.keystores
ecore-upload-key.jks"
# $env:ANDROID_KEYSTORE_PASS = 'ПАРОЛЬ'
# $env:ANDROID_KEY_ALIAS = 'reborngg-recore-upload'
# $env:ANDROID_KEY_PASS = 'ПАРОЛЬ'
# 5. Собрать AAB
cd native-android
./gradlew :app:bundleRelease
# 6. Файл будет здесь:
# native-android/app/build/outputs/bundle/release/app-release.aab
ANDROID_KEYSTORE переменных :app:bundleRelease подпишет debug-ключом — Play Store такой AAB отклонит. Это норм для локальной отладки, не норм для публикации.
9.4 Как залить AAB в Google Play
- Internal testing — для своих тестеров (до 100 человек), доступно через час после загрузки
- Closed testing — beta-тестеры по списку email/группам
- Production — все пользователи в Play Store
test → Internal, beta → Closed, main → Production.
app-release.aab → впиши release notes (changelog) → «Save» → «Review release» → «Start rollout».storeReviewStatus = approved.
Без этого gate-mobile-promotion.yml не пропустит MR в main.
9.5 Как залить AAB в RuStore
./gradlew :app:assembleRelease
# Файл: native-android/app/build/outputs/apk/release/app-release.apk
В CI шаблон уже встроен и AAB и APK сборки — спроси Никиту если нужен отдельный pipeline-job для APK.
9.6 Что важно знать
- Каждый push в
test/beta/main→ CI собирает signed AAB → артефакт лежит в pipeline 1 неделю versionCodeвnative-android/app/build.gradle.ktsувеличивай вручную перед каждым релизом — Play не примет AAB с тем же versionCode что предыдущий- На production-сборке ProGuard выключен (
isMinifyEnabled = false). Если будут жалобы на размер AAB — включай R8/ProGuard, но тестируй прежде чем релизить - iOS отдельный репо
recore/mobile-client-ios— там нужен ApplicationVerifier через Apple Developer + сертификаты подписи. Подключение Codemagic для CI обсуждай с Никитой
10Первый день — Скоков Денис
Ты делаешь админскую мобилку — администратор клуба видит статус ПК, брони, заявки в бар, выручку. Один логин = список всех клубов где админ работает.
10.1 Твой репозиторий
recore/admin-mobile(PID=69) — Capacitor 6 monorepo: один репо собирает и Android (.aab), и iOS (.ipa) из общего React/TypeScript кода.
recore/admin-mobile-android и recore/admin-mobile-ios архивированы — не используй, работа только в monorepo.
Структура репо:
admin-mobile/
├── src/ ← React + TypeScript + Radix UI
├── android/ ← Capacitor-сгенерированный Android-проект (трогать редко)
├── ios/ ← Capacitor iOS
├── ios-native/ ← переход на native iOS (в процессе)
├── public/ ← статика
├── scripts/ ← билд-скрипты
├── deploy-configs/ ← per-club appsettings
├── capacitor.config.ts ← главный конфиг Capacitor
├── package.json
└── .gitlab-ci.yml ← CI
Ветки test → beta → main уже настроены, main/beta protected (Maintainer-only).
10.2 Как собрать AAB локально (главный способ пока)
Понадобится: Node.js 20+, JDK 17, Android SDK через Android Studio.
# 1. Клон
git clone https://reborndev.ru/git/recore/admin-mobile.git
cd admin-mobile
git checkout test
# 2. Установить зависимости
npm install
# 3. Собрать Web (Vite билд React/TS в dist/)
npm run build
# 4. Синхронизировать собранный web в Android-проект
npx cap sync android
# 5. Получи у Никиты production keystore (.jks) и пароли.
# Положи безопасно, например ~/.keystores/admin-mobile-key.jks
export ANDROID_KEYSTORE=$HOME/.keystores/admin-mobile-key.jks
export ANDROID_KEYSTORE_PASS='ПАРОЛЬ_KEYSTORE'
export ANDROID_KEY_ALIAS='alias-name'
export ANDROID_KEY_PASS='ПАРОЛЬ_КЛЮЧА'
# 6. Собрать AAB через Gradle
cd android
./gradlew :app:bundleRelease
# 7. Готовый файл:
# android/app/build/outputs/bundle/release/app-release.aab
Если в android/app/build.gradle ещё нет signingConfigs.release читающий env-переменные — спроси Никиту, добавит по образцу mobile-client-android (см. раздел 9.3).
10.3 Как собрать IPA для iOS
Понадобится macOS, Xcode 15+, Apple Developer аккаунт.
# 1-3 как для Android (npm install, npm run build)
npx cap sync ios
# 4. Открыть в Xcode
npx cap open ios
# или: open ios/App/App.xcworkspace
# 5. В Xcode: Product → Archive → Distribute App → App Store Connect → Upload
# Подписи и provisioning profiles настраивает Никита через Apple Developer аккаунт
ios-native/ идёт миграция на native iOS — там может появиться отдельный Xcode-проект. Спроси у Никиты что собирать прямо сейчас (Capacitor ios/ или ios-native/).
10.4 Как залить AAB в Google Play
- Internal testing — для своих тестеров (до 100 человек), доступно через час
- Closed testing — beta-тестеры по списку
- Production — публикация всем
test → Internal, beta → Closed, main → Production.
app-release.aab, описываешь changelog, отправляешь на ревью.admin-mobile → storeReviewStatus = approved. Без этого gate-mobile-promotion не пропустит MR в main.
10.5 Как залить APK в RuStore
cd android
./gradlew :app:assembleRelease
# Файл: android/app/build/outputs/apk/release/app-release.apk
10.6 Что важно знать
- Web-only HMR в разработке:
npm run devзапускает Vite на http://localhost:5173 для быстрой итерации UI без пересборки нативного слоя - Изменил web-код → нужен
npx cap syncперед сборкой Android/iOS, иначе native-приложение увидит старую версию - Изменил
capacitor.config.tsили плагины (npm install @capacitor/...) → обязательноnpx cap sync+ проверка native-проектов versionCodeвandroid/app/build.gradleувеличивай вручную перед каждым релизом — Play не примет AAB с тем же versionCode- Push-уведомления: используется
@capacitor/push-notifications. APNs-ключ для iOS лежит на panel-сервере (не в репо) - SignalR: подключение к real-time через
@microsoft/signalr— если падает, проверь сертификаты SSL для конкретного клуба - Центральный логин: один админ → много клубов. Аутентификация через
https://panel.recore.su/api/auth/admin, потом выбирается клуб из списка - Не храни токены в коде. На Capacitor:
@capacitor/preferencesс шифрованием, либо нативные SharedPreferences/Keychain через bridge
11Первый день — Чернорай Влад
Ты отвечаешь за логику денег: как рассчитывается стоимость сеанса, как списываются средства, как работают скидки и бонусы. Критически важная зона — ошибка в расчёте = потеря денег или жалоба клиента.
11.1 Твой репозиторий
recore/billing ещё не создан. Обсуди с Никитой будет ли это отдельный микросервис или модуль внутри ReBornAPI.
11.2 Шаги подготовки
feature/chernoray-first, простая функция расчёта стоимости часа, 3-5 тестов, MR в test. CI должен прогнать тесты зелёными.11.3 Особые требования к твоей зоне
- Юнит-тесты (минимум 10 кейсов, включая пограничные)
- Регрессионный тест в panel.recore.su
- Ручной QA-чеклист перед promote в main
- Флаг
breakingChanges: trueв манифесте если меняется порядок расчётов
12Первый день — Радаев Влад
Ты отвечаешь за видеоаналитику (распознавание лиц, подсчёт людей, детекция событий) и за модуль заявок в CRM (где команда ведёт тикеты от клубов).
12.1 Твои репозитории
https://reborndev.ru/git/recore/cctv-analytics.git— видеоаналитика (Python, Docker)https://reborndev.ru/git/recore/recore-crm.git— CRM модуль заявок (часть большой CRM)
12.2 Пошаговая подготовка
pip install uv для быстрого менеджера пакетов.git clone https://reborndev.ru/git/recore/cctv-analytics.git. Там уже есть Dockerfile и .gitlab-ci.yml из шаблона docker-image.gitlab-ci.yml.docker build -t cctv-local . → docker run --rm -p 8080:8080 cctv-local. Проверь http://localhost:8080/health.feature/radaev-first, небольшая правка в README, MR в test. После pipeline версия с тегом cctv-analytics должна появиться в панели.recore-crm, склонируй codexrebornhub локально (или работай в основной CRM-ветке). Свои изменения — в feature/radaev-tickets-*.12.3 Чек-поинты
- CCTV — тяжёлые модели, собирай в Docker с GPU-runtime где нужно (обсуди с Никитой)
- Заявки CRM — обязательно миграция БД + регрессионный тест на создание тикета
- Видеоаналитика имеет feature flags на клуб (не все клубы хотят распознавание лиц — комплаенс)
13Первый день — Корешов Артём
Ты отвечаешь за техпанель на роутерах клубов (статический сайт с мониторингом железа) и за TrueNAS (файловое хранилище клуба). Работа больше с инфраструктурой чем с кодом.
13.1 Твои репозитории
https://reborndev.ru/git/recore/tech-panel.git— статический сайт для роутера клубаhttps://reborndev.ru/git/recore/truenas-config.git— Ansible playbook для TrueNAS
13.2 Пошаговая подготовка
pip install ansible) для работы с TrueNAS.static-site.gitlab-ci.yml. После пуша версия публикуется как архив, админ клуба заливает на роутер.npm install && npm run dev. Открой http://localhost:5173. Увидишь техпанель.truenas-config лежит playbook. Применяется панелью по SSH с автоматическим откатом если что-то сломалось. Твоя задача — редактировать playbook.yml и добавлять новые роли.feature/artem-first, правка шапки, MR в test. Версия должна появиться как tech-panel в panel.recore.su.13.3 Особенности зоны
- Роутеры клубов отрезаны от интернета — TechPanel заливается локально. Панель это учитывает и отдаёт zip-архив
- TrueNAS — playbook с auto-rollback: если что-то сломалось, откатывается за 5 минут на прошлый снапшот
- Для TechPanel нет E2E-тестов в обычном смысле (нет сервера), только visual-regression через Playwright screenshot compare
14Первый день — Названцев Андрей
Ты поддерживаешь десктоп-клиент — windows-приложение которое запускается на каждом игровом ПК. Внутри — Electron/WPF с webview, который показывает меню клуба, авторизацию клиента, запуск игр.
14.1 Твой репозиторий
https://reborndev.ru/git/recore/desktop-client.git
14.2 Пошаговая подготовка
git clone https://reborndev.ru/git/recore/desktop-client.git → git checkout test.npm install && npm run electron:dev (Electron) или dotnet build && dotnet run (WPF). Должно открыться окно клиента.win-installer.gitlab-ci.yml. Собирает .exe-установщик, подписывает (Authenticode), публикует в панель.feature/nazvantsev-first, мелкая правка версии в about-окне, MR в test. В панели должен появиться desktop-client версия dev-{sha}.14.3 Баг правой кнопки мыши (история)
В webview десктоп-клиента правый клик открывает родное меню браузера.
Это баг, так было уже — нашли и пофиксили, но могло вернуться.
Найди в коде место где инициализируется webview (Electron BrowserWindow
или WebView2 control). Отключи контекстное меню. Добавь unit-тест
который проверяет что right-click не вызывает menu.
Перед правкой — покажи план и текущее место в коде.
14.4 Специфика зоны
- Подпись
.exeобязательна — иначе Windows SmartScreen блокирует запуск. CI переменные:WIN_PFX_BASE64,WIN_PFX_PASS - Деплой на ПК клуба — через автообновление: клиент сам скачивает новую версию из панели
- Клиент всегда работает с API своего клуба (
panel.recore.su/club/{id}/api), никогда не напрямую с облаком
14.5Первый день — Плужникова Катя
Ты делаешь отдельный продукт — investor-dashboard: закрытая страница для инвесторов с метриками компании (DAU, MRR, churn, roadmap). Это не клиентский продукт, а внутренний инструмент для инвесторов и учредителей.
14.5.1 Твой репозиторий
https://reborndev.ru/git/recore/investor-dashboard.git— отдельный repo, твой личный «песочник»- Stack на твой выбор (обсуди с Никитой). Типичный — Next.js + Tailwind, или чистый статический сайт
productType: static-siteв манифесте
14.5.2 Шаги подготовки
git clone https://reborndev.ru/git/recore/investor-dashboard.git. Там уже есть .recore-project.yml и .gitlab-ci.yml из шаблона static-site.gitlab-ci.yml.test.14.5.3 Откуда брать данные
- Метрики из CRM — через API
reborndev.ru/api/metrics/investor(Никита подготовит отдельный endpoint с агрегатами) - Метрики клубов — через
panel.recore.su/api/public-status(публичные статусы без персональных данных) - Roadmap — можно вручную в коде или из CRM (обсуди с Никитой что проще)
15Инфраструктура
15.1 Главные адреса
| Адрес | Что там живёт | Доступ |
|---|---|---|
reborndev.ru | CRM (команда, задачи, чаты) | логин от Никиты |
reborndev.ru/git | GitLab — все репозитории | GitLab аккаунт |
reborndev.ru/info/ | Этот документ | публичный |
panel.recore.su | Панель клубов — версии, тесты, деплой | админский логин |
panel.recore.su/club/{id}/api | API каждого клуба (роутинг по пути, не по субдомену) | ключи админа клуба |
reborndev.ru:5050 план | Docker Registry (GitLab Container Registry — пока не включён) | GitLab токен |
15.2 Как устроены клубы
Одно API = экономия ресурсов. Отдельные БД = юридическая изоляция данных (каждый клуб — свой контур персональных данных).
15.5Справочник системы — общие endpoints и адреса
Совместная «база знаний»: куда ходят программы, какие endpoints у каждого сервиса, с чем совместимо. Если пишешь новый клиент (мобилку, десктоп, интеграцию) — сначала посмотри сюда, потом иди кодить. Эта таблица — единая правда на всю команду. Если у тебя другие адреса — значит таблица устарела, поправь.
15.5.1 Адреса — откуда что взять
| Сервис | Базовый URL | Что отдаёт | Авторизация |
|---|---|---|---|
| CRM команды | https://reborndev.ru | задачи, проекты, зоны ответственности, чаты | cookie (login), Bearer-token для API |
| CRM API | https://reborndev.ru/api | бэк CRM (Fastify) | Authorization: Bearer <токен> из логина |
| MCP Server | https://reborndev.ru/mcp | инструменты для AI (список задач, проектов, чатов) | RECORE_MCP_ACCESS_TOKEN |
| GitLab | https://reborndev.ru/git | все репо команды | Personal Access Token (scope: api, write_repository) |
| GitLab API | https://reborndev.ru/git/api/v4 | программный доступ к GitLab (MR, issues, CI) | PRIVATE-TOKEN: <glpat-...> |
| Панель клубов | https://panel.recore.su | версии, промоушены, регрессионные тесты, статус клубов | админский логин |
| Панель API | https://panel.recore.su/api | бэк панели (Fastify + Drizzle) | Authorization: Bearer <panel-jwt> |
| API клуба | https://panel.recore.su/club/{id}/api | ReBornAPI, роутинг по пути /club/{id}/ | токен админа клуба |
| Info-документ | https://reborndev.ru/info/ | этот документ | публично |
15.5.2 Эндпоинты которые должны быть у каждого сервиса
Если пишешь новый бэкенд — добавь эти три endpoint сразу. Без них CI не пустит, а панель клубов не покажет версию.
| Endpoint | Метод | Что должен вернуть | Зачем |
|---|---|---|---|
/health | GET | 200 OK с телом {"ok": true} | Мониторинг проверяет что жив. Если висит > 5 мин — авто-rollback. |
/api/manifest | GET | JSON с version, gitCommit, builtAt, compatibility, endpoints (см. раздел 19) | Панель читает перед apply — проверяет совместимость схемы БД. |
/api/regression/{testId} | POST | 200 если тест прошёл, иначе 4xx с текстом | CI job regression дёргает это для прогона регрессионных тестов. |
15.5.3 Общие контракты данных
Каждая сборка регистрируется в panel.recore.su таблицей api_versions. Поля: version, channel (dev/beta/stable), gitCommitSha, manifest, breakingChanges, validationStatus.
Таблица клубов в reborn_platform. Ключевые поля: id, name, subdomain (для пути), dbName (reborn_club_{id}), channel, isProduction, features (JSON с feature-flags).
Все внешние токены — только в env. Формат: GITLAB_TOKEN=glpat-xxxxxx, PANEL_JWT_SECRET=..., RECORE_MCP_ACCESS_TOKEN=.... Никогда не коммить токены.
Файлы в packages/core/migrations/ (CRM) или panel/api/migrations/ (панель). Нумерация 001_, 002_... После добавления — бампни compatibility.dbSchemaVersion в манифесте.
recore-platform/docs/INFO.html и дай знать команде. Другие способы «совместной базы знаний» мы обсуждаем — пока это место.
16Три канала релизов
| Канал | Откуда берётся | Кто его получает | Как попасть |
|---|---|---|---|
| dev | ветка test |
клубы-тестеры, внутренние энвы | любой git push в test |
| beta | ветка beta |
2-3 клуба-канарейки | MR из test в beta (через 2ч обкатки в test) |
| stable | ветка main + git tag |
все production клубы | MR из beta в main (через 48ч в beta) |
isProduction, панель вернёт 400 Bad Request. Это защита.
16.1 Что такое «обкатка в beta 48 часов»
Версия, которая только-только опубликовалась в beta, не может прыгнуть в main. Нужно подождать — за 48 часов бета-клубы успеют обнаружить баги. Если что-то найдено — ты откатываешь, а не распространяешь дальше.
Это правило зашито в CI — job gate:check-beta. Обойти нельзя.
17Ветки и Merge Request
17.1 Структура веток
main— protected — что сейчас у клиентов. Пушить напрямую нельзя.beta— protected — версии в обкатке. Пушить напрямую нельзя.test— свободная — самое свежее. Сюда сначала попадает весь код.feature/*,fix/*,hotfix/*— твои рабочие ветки. Живут пока не мерж, потом удаляются.
17.2 Формат имён веток
# Новая фича
feature/billing-hourly-rate
feature/add-club-dashboard
# Багфикс
fix/login-button-does-not-respond
# Срочный фикс в проде
hotfix/payment-double-charge
# Твой эксперимент / pet-project
experiment/try-new-ui-library
17.3 Формат коммитов
feat: добавил endpoint POST /api/clubs/new
fix: починил логин в админке клуба
chore: обновил зависимости
docs: дописал README для модуля biller
refactor: разбил auth.ts на части
test: добавил юнит-тесты для calculate-session-cost
[breaking] feat: изменил формат ответа /api/sessions
Префикс [breaking] обязателен если твой коммит ломает совместимость — например, удалил endpoint или поменял структуру JSON.
17.4 Жизненный цикл фичи
17.5GitLab — приёмы на каждый день
Практические трюки которые решают частые вопросы: «как прогнать CI но не мержить», «как не спамить код-ревьюерам пока сам не уверен», «как посмотреть что будет если смержим».
17.5.1 Прогнать проверки без пуша в main — Draft MR
Проблема: ты сделал изменения, хочешь убедиться что CI проходит и посмотреть «как эти правки сольются с main» — но пушать в main ещё рано, ревью не было, да и сам не уверен.
Решение — Draft Merge Request: MR у которого в названии префикс Draft: (или нажата галочка «Mark as draft»). Всё как у обычного MR — CI гоняется, ты видишь диффы, можешь смотреть conflicts, — но кнопка Merge отключена. Никакие случайные клики не вольют код.
Draft: — GitLab автоматически распознает и включит защиту. Пример: Draft: feat: новая админка для зон.[skip ci] или [ci skip]. Тогда этот конкретный pipeline не запустится.Draft: из названия). С этого момента кнопка Merge активируется, ревьюверы получают уведомление.17.5.2 Прогнать CI без create MR — Merge Results Pipeline
GitLab умеет запускать pipeline на временном слиянии твоей ветки с target branch (test/main) — это показывает, что будет после merge, а не что в твоей ветке сейчас.
Как включить: это настройка проекта (Settings → Merge requests → «Pipelines for merge results»). Никита включает её на ключевых репо. Тогда в каждом MR появляется дополнительный pipeline с тегом detached или merge request — это и есть прогон на «условном merge».
17.5.3 Merge train — очередь мержей
Проблема: Петя смержил свою фичу, через 2 минуты ты хочешь смержить свою. У тебя CI был зелёный, но он гнался против старого main, а теперь main изменился — и твой код уже ломается.
Решение — Merge train: ты жмёшь «Add to merge train» вместо «Merge». GitLab становит тебя в очередь: ждёт пока Петя смержится, перезапускает твой CI на обновлённом main, и только если снова зелёный — мержит. Если упал — не мержит и говорит «твой код конфликтует с недавними изменениями».
Когда нужен: если в проекте часто параллельные MR от нескольких человек (CRM, ReBornAPI). Для единоличных репо — не обязательно.
17.5.4 Pipeline против произвольной пары веток — /compare
Если хочется просто посмотреть «что будет если влить ветку X в ветку Y», не создавая MR — открой https://reborndev.ru/git/recore/{repo}/-/compare и задай from/to. Покажет дифф без создания MR и без запуска CI.
Покажи через GitLab API (reborndev.ru/git, проект {id}), что изменится
если смерджить ветку test в main. Нужен summary по файлам —
сколько строк добавилось/удалилось, какие файлы затронуты, есть ли
конфликты. Используй endpoint /repository/compare?from=main&to=test.
17.7Вкладки проекта в CRM
В разделе «Проекты» каждого проекта — 8 вкладок. Это витрина над GitLab для не-девов: Никита, менеджеры и ответственные видят состояние продукта на одном экране, не блуждая по репам. Ниже — что за каждой вкладкой стоит.
reborndev.ru/git) — для инженеров: технические названия репо (mobile-client-android), английский интерфейс, всё подряд. Раздел «Проекты» в CRM — для owner/admin/менеджеров: человеческие названия (Mobile Client (Android)), только то что важно (сколько MR висит, зелёный ли CI), кнопка «продвинуть в beta» в один клик, привязка к задачам и зонам ответственности.
17.7.1 Что делает каждая вкладка
| Вкладка | Что показывает | Откуда данные |
|---|---|---|
| Обзор | Сводка: открытые MR, коммитов за 7 дней, последние события, статус последнего пайплайна | GET /api/gitlab/projects/:id/summary |
| Версии | Ветки test → beta → main со статусом + кнопка «Продвинуть» (создаёт MR между ветками) | GET /api/projects/:id/branches + POST /api/projects/:id/promote |
| MR (Запросы на слияние) | Открытые и недавно смерженные MR, можно создать и смержить прямо из CRM | GET/POST /api/gitlab/projects/:id/merge-requests |
| Пайплайны | История CI-запусков (зелёные/красные), клик → лог в GitLab | GET /api/gitlab/projects/:id/pipelines |
| Коммиты | Последние коммиты по веткам, автор, время, сообщение | GET /api/gitlab/projects/:id/commits |
| Участники в работе | Кто имеет доступ к репо и с какой ролью (Guest/Reporter/Developer/Maintainer/Owner) | GET /api/gitlab/projects/:id/members — backend не реализован |
| Журнал в работе | Аудит действий: кто когда кого добавил, убрал, дал доступ | GET /api/gitlab/audit — backend не реализован |
| Настройка в работе | Protected branches (main/beta только через MR, кто может мержить) | GET /api/gitlab/projects/:id/protected-branches — backend не реализован |
17.7.2 Форма «Новый проект»
Кнопка «Создать проект» в списке проектов открывает форму, которая за один запрос делает:
- Создаёт GitLab-репо под
reborndev.ru/git/recore/{path} - Пишет базовый
.recore-project.yml(раздел 18) - Пишет
.gitlab-ci.ymlиз шаблона поproductType - Создаёт ветки
testиbeta - Ставит protected branches на
mainиbeta(push=0, merge=Maintainers) - Добавляет owner-а как Maintainer
- Регистрирует проект в CRM с человеческим именем
Поля формы: path, name (в GitLab), displayName (в CRM), description, category, platform, productType, owner, tags, qaChecklist. После создания — сразу можно клонировать и начинать работу.
18Файл .recore-project.yml
«Паспорт проекта» — один YAML-файл в корне репо, описывающий что это за продукт, кому он принадлежит, какие у него требования. Панель читает его каждый раз при релизе.
18.1 Минимальный пример
# .recore-project.yml — паспорт проекта
displayName: "ReBorn API"
description: "Бэкенд клубов (.NET 8)"
category: "club-service"
platform: "backend"
productType: "docker-image"
owner: "dima"
18.2 Все поля подробно
| Поле | Зачем | Пример |
|---|---|---|
displayNameобяз. | Как продукт называется в панели | "ReBorn API" |
description | Что он делает. Человеческим языком. | "API для клубов, .NET 8" |
categoryобяз. | Группировка в панели. Значения: crm, panel, club-service, club-static, mobile, desktop, tool, game, site, core, other | club-service |
platformобяз. | Тип runtime. Значения: backend, web, android, ios, desktop, config | backend |
productTypeобяз. | Какой артефакт билдим. Значения: docker-image, static-site, mobile-android, mobile-ios, win-installer, ansible-config | docker-image |
ownerобяз. | GitLab логин ответственного | dima |
tags | Метки для фильтра | [api, dotnet, docker] |
compatibility.dbSchemaVersion | Версия схемы БД. Каждый раз как добавляешь миграцию — увеличиваешь на 1 | 42 |
compatibility.breakingChanges | true если эта версия ломает совместимость и требует ручного апдейта | false |
compatibility.minPanelVersion | Минимальная версия panel.recore.su которая понимает этот манифест | "1.0.0" |
compatibility.minSupportedApiVersion | Мобилка/клиент: минимальная версия API с которой работает | "2.1.0" |
required.env | Обязательные env-переменные. Без них CI не пустит | [DATABASE_URL, JWT_KEY] |
required.ports | Порты которые открывает сервис | [5000] |
required.features | Фиче-флаги которые должны быть включены в клубе | [cctv, pos-integration] |
endpoints | Именованные URL. CI проверяет каждый в validate | { health: /health, manifest: /api/manifest } |
migrations | Список SQL-скриптов в релизе | ["001_init.sql", "007_add_zones.sql"] |
qaChecklist | Ручные QA-шаги перед promote в stable | ["логин админа работает", "бронь создаётся"] |
uiContracts | Контракты UI (экраны с обязательными/запрещёнными элементами) | см. 18.4 |
18.3 Примеры по типам продукта
Docker image (ReBornAPI)
displayName: "ReBorn API"
description: "Бэкенд-сервер каждого клуба (.NET 8)"
category: "club-service"
platform: "backend"
productType: "docker-image"
owner: "dima"
tags: ["api", "dotnet", "docker"]
compatibility:
dbSchemaVersion: 42
breakingChanges: false
minPanelVersion: "1.0.0"
required:
env: ["DATABASE_URL", "JWT_KEY", "REDIS_URL"]
ports: [5000]
endpoints:
health: "/health"
manifest: "/api/manifest"
auth: "/api/auth"
migrations:
- "001_InitialCreate.sql"
- "042_AddLoginField.sql"
qaChecklist:
- "логин админа возвращает 200 и токен"
- "клуб 42 открывается на /api/clubs/42"
Static site (TechPanel)
displayName: "Tech Panel"
description: "Техпанель для роутера клуба"
category: "club-static"
platform: "web"
productType: "static-site"
owner: "artem"
tags: ["static", "router"]
qaChecklist:
- "главная страница открывается"
- "мониторинг показывает статус всех ПК"
Mobile Android (клиентская мобилка)
displayName: "Reborn Client (Android)"
description: "Мобилка для клиентов клуба"
category: "mobile"
platform: "android"
productType: "mobile-android"
owner: "vladteplov"
tags: ["mobile", "android", "client"]
compatibility:
minSupportedApiVersion: "2.1.0"
targetReBornApiVersion: "2.5.0"
qaChecklist:
- "логин по коду из SMS работает"
- "бронь на завтра создаётся"
- "оплата успешно проходит"
Desktop (Windows клиент)
displayName: "Reborn Desktop Client"
description: "Клиентское ПО для игровых ПК"
category: "desktop"
platform: "desktop"
productType: "win-installer"
owner: "nazvantsev"
tags: ["desktop", "windows", "webview"]
required:
features: ["auto-update"]
qaChecklist:
- "правый клик в webview НЕ открывает меню браузера"
- "автообновление подхватывает новую версию"
- "запуск игры работает"
Ansible config (TrueNAS)
displayName: "TrueNAS Config"
description: "Ansible playbook для файлового хранилища клубов"
category: "tool"
platform: "config"
productType: "ansible-config"
owner: "artem"
tags: ["ansible", "truenas", "infrastructure"]
18.4 uiContracts — защита UI от регрессий
uiContracts:
- screen: "LoginScreen"
url: "/login"
mustHave:
- "input[name=login]"
- "input[name=password]"
- "button[type=submit]"
mustNotHave:
- "text:error" # не должно быть ошибки по дефолту
interactions:
- action: "input login=admin, password=test"
expect: "redirect to /dashboard"
18.5 Что править руками, а что отдать AI
- Генерацию начального
.recore-project.ymlпо типу продукта - Список endpoints — AI прочитает твои контроллеры и заполнит сам
- Список миграций — AI глянет папку
migrations/и перечислит - Бамп
dbSchemaVersionпосле добавления миграции
owner— критично, кто отвечаетbreakingChanges: true— последствия серьёзныеminPanelVersion— согласуй с НикитойqaChecklist— знание домена, AI часто пропускает важные пункты
Сгенерируй .recore-project.yml для моего проекта.
Путь к репо: {путь}
Тип: {docker-image | static-site | mobile-android | ...}
Кто я: {owner}
Изучи структуру проекта, найди endpoint-ы, миграции, env-переменные.
Составь полный файл. Поле breakingChanges оставь false, если не уверен.
Поле qaChecklist — предложи 3-5 пунктов, а я добавлю ещё.
18.6 Когда и как обновлять .recore-project.yml
Это не файл «написал и забыл». Манифест обязан отражать реальное состояние проекта — иначе панель примет несовместимую версию и клуб сломается.
.recore-project.yml. Если забыл — CI в идеале должен это поймать (job validate:manifest), но не всегда.
Триггеры — когда точно обновлять
| Что ты сделал в коде | Что надо поправить в манифесте | Почему |
|---|---|---|
| Добавил миграцию БД (новая колонка, таблица) | compatibility.dbSchemaVersion += 1 · добавь файл в migrations |
Панель поймёт что требуется миграция перед apply |
| Удалил или переименовал endpoint, поменял формат ответа | compatibility.breakingChanges = true · префикс коммита [breaking] |
Старые клиенты упадут — rollback должен быть осознанным |
| Добавил новый endpoint | Впиши в endpoints: под именем |
CI job validate проверит что endpoint реально отвечает 200 |
| Добавил обязательную env-переменную | Добавь в required.env: [...] |
Без неё панель не применит версию и сразу покажет ошибку |
| Открыл новый порт | required.ports: [...] |
Оркестратор клуба пробросит порт при деплое |
| Сменился ответственный | owner: "new-gitlab-login" |
CRM покажет правильного ответственного, нотификации пойдут куда надо |
| Добавил новую фичу требующую feature-flag | required.features: [...] |
Панель применит версию только к клубам где фича включена |
| Повысил минимальную версию мобилки/клиента | compatibility.minSupportedApiVersion |
Старые клиенты получат «обнови приложение» вместо 500 ошибки |
| Хочешь добавить QA-шаг в чеклист | Добавь пункт в qaChecklist: [...] |
Тестер увидит пункт в панели перед promote в stable |
Рабочий цикл — что идёт вместе в один MR
.recore-project.yml в одном MR. Если ревьюер видит «новый endpoint без обновления endpoints:» — это тоже красный флаг.dbSchemaVersion. Иначе старая версия приложения попадёт на новую БД — будут странные ошибки.breakingChanges: true — сообщение коммита начинай с [breaking]. Промоушен такой версии в stable требует двух апрувов, это правило зашито.qaChecklist. Даже если «всё протестил». Следующему релизу поможет не забыть.Я внёс изменения в ветку {branch}. Проанализируй diff (git diff
test..{branch}) и скажи что из .recore-project.yml нуждается
в обновлении. Предложи патч. Следуй таблице из
https://reborndev.ru/info/#project-yml раздел 18.6.
Особо внимательно посмотри: миграции, новые/изменённые endpoints,
новые env-переменные, breaking changes в API.
19manifest.json в рантайме
Помимо .recore-project.yml (который лежит в репо), твой работающий продукт должен отдавать свой manifest в рантайме на endpoint /api/manifest. Это то, что панель дёргает когда проверяет конкретный запущенный контейнер.
19.1 Пример ответа
{
"version": "1.2.3",
"channel": "stable",
"gitCommit": "abc1234",
"builtAt": "2026-04-22T10:00:00Z",
"compatibility": { "dbSchemaVersion": 42, "breakingChanges": false },
"endpoints": { "health": "/health", "manifest": "/api/manifest" }
}
19.2 Где брать значения
CI прокидывает их через build-args в Dockerfile, ты читаешь из env:
// .NET пример
app.MapGet("/api/manifest", () => new {
version = Environment.GetEnvironmentVariable("APP_VERSION"),
channel = Environment.GetEnvironmentVariable("APP_CHANNEL"),
gitCommit = Environment.GetEnvironmentVariable("APP_GIT_COMMIT"),
builtAt = Environment.GetEnvironmentVariable("APP_BUILT_AT"),
compatibility = new { dbSchemaVersion = 42, breakingChanges = false },
endpoints = new Dictionary<string,string> {
{ "health", "/health" },
{ "manifest", "/api/manifest" }
}
});
/api/manifest в ReBornAPI по шаблону из recore-platform/ci-templates/README.md».
206 слоёв защиты от поломок
Чтобы нейросеть (или уставший человек) не сломал прод. Каждый слой ловит свой класс багов.
20.1 Слой 1: Protected branches
Что делает: запрещает пуш в main и beta напрямую.
Пример реального бага: AI-агент по привычке делает git push origin main с исправленным кодом. Без защиты — код попал бы клиентам без ревью. С защитой — GitLab отвергает push, ты получаешь ошибку: «main is protected».
20.2 Слой 2: Manifest-валидация (CI)
Что делает: CI перед публикацией проверяет что манифест корректный (схема, dbSchemaVersion, endpoints).
Пример реального бага: Нейросеть добавила миграцию 043_add_zones.sql, но забыла обновить dbSchemaVersion: 42 → 43. Validate ловит: «в папке migrations есть 043, а в manifest sdbSchemaVersion всё ещё 42». Блок.
20.3 Слой 3: Health + endpoints probe (CI)
Что делает: CI поднимает контейнер в песочнице и пробует обратиться к каждому endpoint из манифеста.
Пример реального бага: Нейросеть переименовала endpoint /api/auth/login в /api/login, а в манифесте оставила старое имя. Probe: «в manifest указан /api/auth/login, но он отвечает 404». Блок.
20.4 Слой 4: Regression tests
Что делает: прогон реестра регрессионных тестов (хранятся в panel.recore.su) против только что собранного контейнера.
Пример реального бага: Нейросеть рефакторила auth, случайно сломала логин админа. Регресс-тест «Логин админа клуба работает» падает. Версия помечается как failed, кнопка «применить» в панели неактивна. См. раздел 21.
20.5 Слой 5: E2E Playwright
Что делает: эмулирует реального пользователя в браузере. Заходит на страницу, жмёт кнопки, проверяет результат.
Пример реального бага: В админке кнопка «Сохранить» вроде бы есть, API вроде отвечает 200, но onClick не подключён. Unit-тесты зелёные. E2E — ловит: «кликнул "Сохранить", не видел "Успешно"». См. раздел 22.
20.6 Слой 6: QA чеклист + ручной review
Что делает: перед promote в stable человек глазами проходит чеклист из .recore-project.yml.
Пример реального бага: Визуально в админке всплывающее окно открывается за кнопкой «Отмена», не увидеть. Автотесты не ловят (DOM-элементы на месте, CSS z-index). Ручной review: «ой, модалка за кнопкой». См. раздел 23.
20.7 Что если все 6 прошли, но всё равно упало
/health падает или error rate вырастает — автоматически откатывается на предыдущую. Downtime — 0.
21Регрессионные тесты
Реестр коротких API-тестов, хранящийся в panel.recore.su. Прогоняются CI против каждой сборки.
21.1 Правило
21.2 Как добавить тест через UI
- Открой
https://panel.recore.su/regression-tests - Жми + Добавить
- Заполни поля:
- Имя: «Логин админа клуба работает»
- HTTP метод + endpoint:
POST /api/auth/login - Body:
{"login":"admin","password":"test"} - Ожидаемый статус:
200 - Ожидаемые поля:
{"success": true} - Severity: critical / error / warning
- isRequired: если включено — failed тест блокирует publish
- Сохрани. С этого момента каждый новый pipeline прогоняет его.
21.3 Промпт для AI: сгенерировать тест
Я только что починил баг: при пустом пароле API возвращал 500
вместо 400 "invalid credentials".
Сформируй регрессионный тест для этого бага в формате который
принимает panel.recore.su. Я скопирую JSON в форму добавления.
Формат как в этом примере:
{
"name": "...",
"method": "POST",
"endpoint": "...",
"body": {...},
"expectedStatus": 400,
"expectedFields": {...},
"severity": "critical",
"isRequired": true
}
22E2E Playwright — тесты как пользователь
E2E = End-to-End. Тесты которые эмулируют реального человека в браузере. Отличаются от unit-тестов тем что проверяют всю цепочку: клик → API → ответ → отображение.
22.1 Что такое Playwright простыми словами
Это как робот который сидит за компьютером, открывает ваш сайт и пытается им пользоваться. Если не получилось (кнопка не нажалась, страница не загрузилась, текст не появился) — тест красный.
22.2 Пример простого теста
import { test, expect } from '@playwright/test';
test('админ может войти в панель', async ({ page }) => {
// 1. Открываем логин
await page.goto('https://panel.recore.su/club/42/admin/login');
// 2. Вводим данные
await page.fill('input[name=login]', 'admin');
await page.fill('input[name=password]', 'test');
// 3. Жмём "Войти"
await page.click('button[type=submit]');
// 4. Ждём что окажемся на дашборде
await expect(page).toHaveURL(/\/admin\/dashboard/);
// 5. Проверяем что видно приветствие
await expect(page.locator('h1')).toContainText('Добро пожаловать');
});
22.3 Как написать свой тест через AI
Напиши E2E-тест на Playwright который проверяет сценарий:
1. Админ открывает https://panel.recore.su/club/42/admin/login
2. Вводит login=admin, password=test
3. Жмёт "Войти"
4. Должен попасть на /admin/dashboard
5. На дашборде должна быть кнопка "Новая бронь"
6. Клик по ней открывает модалку с заголовком "Новая бронь"
7. В модалке есть поле "Имя клиента" и кнопка "Сохранить"
Используй стиль и хелперы которые уже есть в моём репо
(посмотри существующие тесты в папке tests/).
Если хелпера на логин ещё нет — создай его в tests/helpers/auth.ts.
22.4 Как запустить локально
# Установить Playwright (один раз)
npm install -D @playwright/test
npx playwright install
# Запустить все тесты
npx playwright test
# Запустить один файл
npx playwright test tests/admin-login.spec.ts
# С браузером вживую (чтобы посмотреть глазами)
npx playwright test --headed
# Открыть HTML-отчёт после запуска
npx playwright show-report
test-results/имя-теста/. Скачай артефакты и посмотри глазами.
23QA-чеклист
Ручные проверки которые делает человек перед promote в stable. Хранятся в .recore-project.yml в поле qaChecklist, отображаются в панели.
23.1 Пример хорошего пункта
- «Логин админа клуба возвращает редирект на /dashboard»
- «В разделе "Брони" кнопка "+ Новая" открывает модалку»
- «Оплата картой 4242... через Stripe sandbox → 200 и чек в email»
- «Всё работает» ← непроверяемо
- «UI красивый» ← субъективно
- «Нет багов» ← не чеклист, а мечта
23.2 Как добавить пункт в CRM
- Открой репо, отредактируй
.recore-project.yml:qaChecklist: - "логин админа: admin/test → /dashboard" - "бронь завтра на 2 часа создаётся" - "КАССА → Z-отчёт скачивается PDF" # <-- добавь новый пункт сюда - Закоммить + пуш
- CI-job
sync-metadataсинхронизирует в панель автоматически - Проверь:
https://panel.recore.su/products/{твой-ключ}— в блоке «QA Checklist» пункт появился
23.3 Промпт для AI: предложить чеклист
Посмотри мой продукт {название}, изучи его функционал
(основные страницы / endpoints / фичи) и предложи 10 пунктов
для qaChecklist в .recore-project.yml.
Каждый пункт — конкретное проверяемое действие с ожидаемым
результатом. Избегай абстракций вроде "всё работает".
24Частые проблемы
24.1 «CI красный, что делать»
build, validate, regression)ERROR или FAILEDgate:check-beta24.2 «Не могу запушить в main»
remote: GitLab: You are not allowed to push code to protected branches on this project.
Это не баг, это защита. В main пушить напрямую нельзя. Правильная последовательность:
# Создай ветку от test
git checkout test && git pull
git checkout -b feature/my-change
# Работай
git add . && git commit -m "feat: описание"
git push origin feature/my-change
# В GitLab UI создай MR в test. Через CI и review оно смержится.
24.3 «Мой MR не мержится — there is a conflict»
Это значит что между твоей веткой и целевой (test) кто-то уже изменил те же строки в том же файле. Нужно разрулить.
# У себя локально:
git checkout feature/my-change
git pull origin test # или git merge origin/test
# Git отметит конфликты <<< >>> в файлах
# Проще всего — позови Claude Code:
# "у меня git merge conflict в файлах X, Y. Разреши их сохранив смысл
# обеих версий, объясни каждое решение."
# После разрешения:
git add .
git commit -m "chore: resolve conflicts with test"
git push
<<<<<<< в коде. После разрешения всегда запускай сборку локально — если собирается, значит конфликт разрулен правильно.
24.4 «Новая версия не появилась в панели»
publish:version зелёныйPublished version id=XXX to panelCI_PANEL_TOKEN401 Unauthorized — токен протух. Попроси Никиту обновить в GitLab Variables.recore-project.ymlcategory или platform — продукт не зарегистрируется, версия "повиснет". Добавь поля, пушни.24.5 «Потерял работу локально после git reset»
Не всё потеряно. Git хранит все коммиты ещё 30+ дней, даже если они вроде бы удалены.
# Покажи все движения HEAD за последние дни
git reflog
# Увидишь список, например:
# a1b2c3d HEAD@{0}: reset: moving to HEAD~3
# e4f5g6h HEAD@{1}: commit: фикс логина
# i7j8k9l HEAD@{2}: commit: добавил endpoint
# Возвращаемся на нужный коммит (берём SHA)
git checkout e4f5g6h
# Если хочешь вернуть как ветку
git checkout -b recovery-branch e4f5g6h
# Всё, работа вернулась
git checkout . — эта работа потеряна безвозвратно. Коммить часто, даже мусорные коммиты потом почистишь через rebase.
24.6 «Docker падает: "no space left on device"»
# Почисти старые образы и контейнеры
docker system prune -a -f --volumes
# Если мало помогло — рестарт Docker Desktop (Windows/Mac)
# На Linux: sudo systemctl restart docker
24.7 «Не могу склонировать репо — permission denied»
- Убедись что ты залогинен в GitLab (открой
https://reborndev.ru/git) - Создай Personal Access Token (Settings → Access Tokens → scope
read_repository,write_repository) - Используй токен как пароль при клонировании:
git clone https://username:TOKEN@reborndev.ru/git/recore/repo.git
25Шпаргалка команд
Минимум который реально пригодится. Распечатай или сохрани в закладки.
25.1 Git — базовые
git statusчто сейчас изменено, на какой веткеgit branch --show-currentв какой ветке тыgit checkout -b feature/X testсоздать новую ветку от testgit add .добавить все изменения к коммитуgit commit -m "feat: описание"зафиксировать коммит с сообщениемgit push origin feature/Xотправить ветку на серверgit pullзабрать свежее с сервераgit log --oneline -10последние 10 коммитов в компактном видеgit diffчто именно изменил но не закоммитилgit reflogистория всех перемещений, чтобы восстановить потерянное25.2 Docker — базовые
docker psкакие контейнеры запущеныdocker ps -aвсе контейнеры, включая остановленныеdocker logs -f container_nameлоги контейнера в реальном времениdocker stop container_nameостановитьdocker rm container_nameудалитьdocker build -t image-name .собрать образ из текущего Dockerfiledocker run --rm -p 5000:5000 image-nameзапустить образ, пробросить портdocker system prune -aпочистить мусор (осторожно, удаляет неиспользуемые образы)docker compose up -dподнять стек из docker-compose.yml в фонеdocker compose downостановить весь стек25.3 curl — проверить API
curl https://panel.recore.su/club/42/healthпростой GET, проверить жив ли сервисcurl -s https://panel.recore.su/club/42/api/manifest | jqполучить JSON и отформатироватьcurl -X POST -H "Content-Type: application/json" -d '{"login":"a","password":"b"}' URLPOST с JSONcurl -H "Authorization: Bearer TOKEN" URLзапрос с токеномcurl -v URLverbose — видно заголовки и коды25.4 Что чаще нужно Гвоздеву Дмитрию
dotnet buildсобрать .NET проектdotnet testпрогнать тестыdotnet ef migrations add ИмяМиграциисоздать новую миграцию БДdotnet ef database updateприменить миграции к локальной БДdocker compose up postgres -dподнять только Postgres локально25.5 Что чаще нужно Теплову Владу / Скокову Денису (мобильные)
./gradlew assembleDebugсобрать debug APK (Android)./gradlew assembleReleaserelease APK (Android)adb devicesкакие устройства подключеныadb install -r app-debug.apkпоставить APK на устройствоadb logcat | grep ReCoreлоги приложения по тегуxcodebuild -scheme App -configuration Releaseсборка iOS25.6 Что чаще нужно Радаеву Владу / Корешову Артёму
python -m venv .venv && .venv\Scripts\activateсоздать виртуальное окружение (Windows)pip install -r requirements.txtпоставить зависимостиpytestпрогнать тестыansible-playbook playbook.yml -i inventoryприменить Ansible playbookansible-playbook playbook.yml --checkdry-run, не применять25.7 Claude Code (всем)
claudeзапустить Claude Code в текущей папке/helpсписок встроенных команд/clearочистить контекст беседы/reviewпопросить ревью текущих изменений/compactсжать историю диалога, освободить контекст26FAQ
git reset --soft HEAD~1 — сохранит изменения, но уберёт коммит) или попроси AI откатиться. Если уже запушил — создай новый коммит-revert: git revert HEAD && git push.hotfix/* → MR в main с меткой hotfix + два апрува (Никита + любой из команды). Обходит правило 48ч, но требует двух пар глаз.beta, применяется новая версия. Если нужно, чтобы у разных клубов были разные фичи — это feature flags: включаются/выключаются в таблице clubs. Обсуди с Никитой.feature/* ветку. На новом ноуте склонируй и продолжай. Никогда не передавай токены/ключи — пусть коллега сделает свои.27Обновление софта на ПК клубов (v9+)
После MR #28 (май 2026) появилась полноценная система управления версиями десктоп-клиента и rebornapi. Эта секция — для вайбкодеров: что делать, как работает, куда смотреть когда что-то идёт не так.
Главное в трёх абзацах
1. Каналы. Любая собранная версия попадает на канал, привязанный к git-ветке: test → beta → main (=stable). Production-клубы видят только stable. Promote из канала в канал — кнопка [Promote → beta] в панели, между beta и stable обязательны 48 часов обкатки.
2. Где решается какую версию ставить. Каждый ПК клуба периодически дёргает GET /api/clients/latest?clubSlug=…&pcId=… — сервер возвращает целевую версию по приоритету: (1) pin на ПК → (2) target на клуб → (3) последняя в канале клуба. Клиент ставит то что вернулось — даже если это даунгрейд.
3. Push «обновись сейчас». Кнопка [Перепроверить обновления] в карточке клуба публикует NATS-команду recore.cmd.<club>.<pc>.RecheckUpdates — десктоп-клиент v9.2.4+ сразу опрашивает /latest и обновляется. Без push'а — обновляется при следующем плановом poll'е.
Как делать обычные операции
panel.recore.su/clubs/<id> → секция «Клиент ПО (ReBornClient)» → [Применить версию] → выбери версию из списка → [Применить]. Если хочешь чтобы ПК обновились прямо сейчас (а не через ~10 минут polling) — отметь «push RecheckUpdates сейчас». Backend проверит производственный флаг — на production-клубе можно ставить только версии канала stable.[Pin ▾] → выбираешь любую активную версию из списка → [Pin & Push]. ПК сразу получит NATS-команду и переустановит указанную версию. Чтобы снять pin — кнопка [Очистить] в той же строке.stable, изменить нельзя пока не снять флаг is_production.last_reported_version от heartbeat'а. Если стоит --- — клиент старый и не шлёт installedClientVersion в heartbeat'е (нужен v9.2.4+). Альтернатива: GET /api/computers/<pcId>/effective-version — diagnostic endpoint показывает что должно стоять и что фактически прилетало./versions в панели → найти строку с версией → кнопка [Promote → beta] или [Promote → stable]. Backend проверит min_hours_in_from (для beta→stable это 48 часов). Если кнопка серая или возвращает 409 — значит cooldown ещё не прошёл, посмотри в audit_log когда версия попала в текущий канал.Инструкция для CI продукта (если делаешь новый репозиторий)
Чтобы новый продукт публиковал версии в панель, в .gitlab-ci.yml подключи стандартный шаблон:
include:
- project: 'root/recore-platform'
file: '/ci-templates/standard-version-manifest.gitlab-ci.yml'
ref: main
variables:
PRODUCT_KEY: "my-product"
ARTIFACT_TYPE: "docker-image" # или win-installer, static-site, mobile-android, mobile-ios, ansible-config
stages:
- build
- publish
В job-е сборки положи в $CI_PROJECT_DIR/manifest.json type-specific блок (для docker-image — imageRegistryUrl, для win-installer — объект installer.{url,sha256,sizeBytes}). Шаблон сам добавит tag, channel, gitCommitSha, publishedAt и POST в панель. Нужны переменные окружения CI_PANEL_URL + CI_PANEL_TOKEN — берутся из Group-level CI/CD variables в GitLab.
Эндпоинты, которые ты можешь дёргать руками
| Метод | Путь | Зачем |
|---|---|---|
GET | /api/clients/latest?clubSlug=&pcId=&productKey= | То же что и десктоп-клиент. Без auth. Полезно отладить: «что моему ПК должны прислать» |
POST | /api/clubs/:id/apply-client-version | Бамп target-версии всего клуба + push RecheckUpdates |
DELETE | /api/clubs/:id/apply-client-version | Сбросить target — клуб вернётся на channel-latest |
POST | /api/computers/:id/version-override | Pin ПК на конкретную версию |
DELETE | /api/computers/:id/version-override | Снять pin |
POST | /api/clubs/:id/recheck-updates | Только pushнуть RecheckUpdates без смены target. Body {"pcIds":[...]} — фильтр |
GET | /api/computers/:id/effective-version | Diagnostic: что target / что installed |
GET | /api/clients/versions?productKey=… | Список версий с counters клубов/ПК |
Все mutating endpoints требуют JWT (получи через POST /api/auth/login).
Что лежит в БД (для дебага)
База reborn_platform на panel-сервере (176.114.85.85:5432 через docker exec):
clubs— добавилисьrelease_channel,client_target_version_id,is_production.computers— отдельная таблица в platform-DB (синкается из клубныхreborn_club_*.Computers). Поля:club_id,pc_number,client_version_override,last_reported_version,last_reported_at.client_versions— версии десктоп-клиента, выпущенные через CI. Колонкаclub_slug='*'— глобальная версия для всех клубов; конкретный slug — переопределение для одного клуба.api_versions— то же самое для rebornapi (docker-image).audit_log— все админские действия с версиями. Если кто-то жалуется «сама обновилась» — смотри сюда.
NATS subjects (полезно знать)
| Subject | Кто публикует | Что внутри |
|---|---|---|
recore.cmd.<club>.<pc>.RecheckUpdates | panel-api | Команда «опроси /latest сейчас» |
recore.status.<club>.<pc> | desktop-client | Heartbeat с installedClientVersion |
recore.ack.<club>.<pc>.<commandId> | desktop-client | Ack на cmd |
Тестовый листенер прямо на сервере:
docker logs recore-transport-nats --tail 50 | grep "RecheckUpdates"
Если что-то сломалось
client_versions нет ряда matching productKey + channel + (slug OR '*'). Либо версии ещё не опубликованы для этого канала, либо slug клуба написан неправильно. Проверь: SELECT slug, release_channel FROM clubs; + SELECT product_key, channel, club_slug FROM client_versions WHERE is_active=true;.?channel=, который маскировал тайпы. Это правильное поведение.docker logs --since 5m recore-transport-nats | grep recore.status.<club>.<pc>, должны быть heartbeat'ы. (2) ПК на NATS-транспорте? — если в логах нет heartbeat'ов от этого ПК, значит он ещё на legacy SignalR; RecheckUpdates его не достанет, нужен polling /latest. (3) ПК на v9.2.4+? — handler для RecheckUpdates появился только в этой версии (companion MR #20 в recore/desktop-client). Старые клиенты не падают, просто игнорируют.apply-client-version и ни один ПК не запинен. Counters считают прямые ссылки (clubs.client_target_version_id + computers.client_version_override), не «эффективные» через channel-latest.is_active=false. UI показывает ⚠ предупреждение. Если версия действительно битая — сними pin и клуб вернётся на channel-latest. В будущем планируем возвращать 410 Gone на deactivated версии — клиент будет фоллбечиться сам.docker compose exec -e DATABASE_URL=postgresql://${PG_USER}:${PG_PASSWORD}@postgres:5432/reborn_platform panel-api npm run db:migrateСвязанные документы
- Полный runbook в репозитории:
recore-platform/docs/UPDATE-SYSTEM.md - Спека дизайна:
docs/superpowers/specs/2026-05-03-update-system-design.md - Implementation plan:
docs/superpowers/plans/2026-05-03-update-system-mr28.md - MR #28 — recore-platform, добавил всё что выше
- MR #20 в
recore/desktop-client— companion с RecheckUpdates handler в .NET клиенте