12-migrations

Міграції

src/migrations/ — перенесення legacy Golden у колекції платформи і первинне заповнення даних метрик у ClickHouse.

UI: вкладка «Migrations» технічного департаменту (stack-client, /technical_department/migrations) · Swagger: тег Migrations · План: Golden migration

Що робить модуль

  • Переносить legacy-колекції Golden у колекції платформи кроками; кожен крок ідемпотентний.
  • Віддає стан кроків: скільки записів у legacy-джерелах і в колекціях платформи, накочені міграції схеми ClickHouse.

Legacy-колекції не змінюються і не видаляються.

Кроки

№КрокЩо переноситьКлюч і повтор
1adminsgolden_admins → project_admins_id зберігається
2tusgolden_ladies → project_tus: профіль, статуси, призначення за змінами, зашифрований пароль, findNew, stop-час NAF_id зберігається; адмін панель — за партнерським ID
3tu-linksперебудова project_tu_links усіх TU з tu_logs і журналу топів (04-tu-links)пишеться лише різниця
4ru-profilesgolden_man_profiles → project_ru_profiles; ім’я, satellite і online доповнюються з golden_global_mans, ім’я — ще й з golden_favorites; RU лише з golden_global_mans теж переносятьсяproject + ruId; пишуться лише відсутні RU, свіжіші профілі не перезаписуються
5favoritesgolden_favorites + golden_block_lists → project_favorites; глобальні favorites перебудовуються з них_id favorites зберігається; глобальний favorite бере _id з golden_global_mans
6statisticsgolden_statistics → project_statistics; golden_other_bonuses — як зовнішня історія без адмін панелі, TU позначаються синхронізованими_id зберігається, повтор оновлює рядки; денна вигрузка продовжує з дня після останнього перенесеного
7statistics-relationsgolden_statistics_relations → project_statistics_relations як є_id зберігається; повтор добирає нові дні legacy
8partner-onlinegolden_weekly_online_users → тижні повністю; golden_online_users → знімки лише після останнього тижнятиждень — project + from, знімок — _id; повтор перезаписує
9online-sessionsonline оператора (golden_online_times.sessions до 2025-10-26, golden_operators_activities далі) і TU (golden_online_times.ladies[].sessions до 2025-10-31, golden_lady_online з 2025-11-01) → відрізкивласник + початок, $max на кінці; повтор добирає нові відрізки
10metrics-statisticsкопія project_statistics у ClickHouse (10-metrics)звірка днів; на порожній копії — уся історія
11metrics-tu-onlineonline TU за добу в ClickHouse з відрізківвід передостаннього скопійованого дня до вчора
12ru-onlinelegacy ClickHouse main.golden_ru_daily_activity → project_ru_online: хвилини RU за день стають знімками по 5 хв від початку доби Kyivлише дні до сьогодні; повтор видаляє дні Golden до сьогодні й переносить знову

Порядок обов’язковий: кожен крок резолвить посилання на попередні. Без адмін панелі TU падає; favorites і статистика без TU пропускають документ з лічильником. TU для favorites і статистики шукаються по проєкту; при кількох TU з одним партнерським ID перемагає невидалена.

Конвертація полів — у сутностях плану: ProjectTU, ProjectFavorite, ProjectGlobalFavorite.

Директор

Адмін панелі й TU мають поле директора, якого в legacy Golden немає. Якщо запускає директор — береться він; якщо технічний департамент — єдиний незаблокований директор Stack. Кілька директорів або жодного — 409.

Стан

POST /v2/migrations/status — кроки по порядку: ключ, роут запуску, кількість записів у legacy-джерелах і в колекціях платформи (Mongo і ClickHouse — за project) з міткою сховища, накочені міграції схеми ClickHouse. Ріст лічильників платформи під час кроку — це прогрес.

API для frontend

РоутЩо робитьРолі
POST /v2/migrations/statusстан кроківdirector, technical department
POST /v2/migrations/<крок>/applyзапуск кроку з таблиціdirector, technical department

Нюанси

  • Перед міграцією на свіжій базі потрібні індекси (npm run db:indexes:sync): без унікальних індексів повторний запуск пише дублікати, без індексів читання дашбордів і статистики скануватимуть колекції.
  • Довгі кроки (статистика, online-відрізки, копія статистики — хвилини) переживають обрив проксі: сервер продовжує, вкладка показує ріст лічильників.
  • Копії в ClickHouse під Redis-локом: повторний запуск під час роботи — 409.
  • Дати партнера конвертуються як локальний час Kyiv.

Борг

  • Крок виконується всередині HTTP-запиту: перезапуск API обриває його без повідомлення. Повтор ідемпотентний і добирає решту, але стан виконання ніде не зберігається.