База для наших сервисов

Тесты на реальных данных, а не на выдуманных

Dolt — MySQL-совместимая база, в которой тестовый прогон снимает копию продакшен-данных за миллисекунды. Без дампов, без «песочницы на сутки», без риска задеть продакшен: тесты физически не могут писать в прод.

подключение dolt.aipika.tech:3306

MySQL-протокол: mysql2, ORM и обычный mysql-клиент подходят без правок.

≈ 15 мсснапшот любого размера: данные не копируются
0 рискатесты не могут писать в прод-ветку
3 наборадоступов: прод, чувствительные данные, тесты
Вся историякаждая транзакция — версия, есть откат
Зачем это нужно

Проблема не в тестах, а в данных

Тесты на пустой базе проходят там, где прод падает: реальные данные — это пропущенные поля, дубли, странные кодировки и десять лет истории. Достать их в тесты обычно дороже, чем написать сами тесты.

Как обычно

  • дамп прода на 200 ГБ и ночной рестор в песочницу
  • данные устарели ещё до первого теста
  • песочница одна на всех: прогоны мешают друг другу
  • копия уезжает на тестовый стенд вместе с персональными данными
  • миграции проверяются на пустой базе — в проде падает

С Dolt

  • снапшот снимается мгновенно и стоит ноль байт копирования
  • данные ровно те, что в проде в момент запуска
  • у каждого прогона свой снапшот: параллельные прогоны изолированы
  • чувствительные данные живут в отдельной базе и в тесты не попадают
  • миграции проверяются на живой схеме и живых данных
⟳

Мгновенные снапшоты

Снапшот — это ветка с copy-on-write: новый указатель на те же данные. Не важно, 10 МБ в базе или 200 ГБ — копия появляется сразу.

⛨

Прод под защитой

Ветка привязана к сессии, поэтому тесты работают в своей копии, а продакшен продолжает писать в основную ветку и снапшота не замечает. Запись в прод для тестов запрещена.

◧

Чувствительные данные отдельно

У сервиса две рабочие базы: общая и чувствительная. Снапшоты снимаются только с общей, поэтому персональные и платёжные данные в тесты не попадают по построению.

↺

История и откат

Каждое изменение фиксируется автоматически. Можно посмотреть состояние таблицы на любой прошлый момент и понять, что было в базе, когда тест упал.

⧉

Параллельные прогоны

У каждого прогона свой идентификатор и своя ветка: CI-матрица, ретраи и локальные запуски не толкаются в одной базе.

⇄

Ничего не надо переписывать

Сервер говорит на MySQL: привычные драйверы, миграции и ORM работают как есть. Версионирование — сверху, а не вместо.

Как это работает

Три шага в тестовом сетапе

  1. Подключаетесь к общей базе тестовыми доступами

    Тестовая учётка умеет читать прод-данные и писать только внутри снапшота — прод-ветка для неё закрыта на запись.

  2. Снимаете снапшот одной командой

    USE `<сервис>`;
    CALL DOLT_BRANCH('test-<run-id>');      -- копия продакшен-данных на этот момент
    CALL DOLT_CHECKOUT('test-<run-id>');    -- переключается только ваша сессия
  3. Гоняете тесты и убираете за собой

    -- миграции, фикстуры, проверки — всё внутри снапшота
    CALL DOLT_CHECKOUT('main');
    CALL DOLT_BRANCH('-D', 'test-<run-id>');

    Снапшот живёт столько, сколько нужно прогону; после него ветка удаляется, и ничего не накапливается.

Доступы

Три набора — под три роли в сервисе

Пароли выдаются вместе с адресом сервиса. Каждый набор видит ровно то, что нужно его роли, и ничего больше.

prod

Рабочий бэкенд

Основной сервис: читает и пишет общие данные

  • полный доступ к общей базе
  • полный доступ к базе чувствительных данных
  • джойны между базами одним запросом

mysql://<сервис>:…@dolt.aipika.tech:3306/<сервис>

prod-secure

Только чувствительные данные

Код, который не должен видеть ничего лишнего

  • полный доступ к базе чувствительных данных
  • общую базу не видит

mysql://<сервис>_secure:…@dolt.aipika.tech:3306/<сервис>_secure

test

Прогоны тестов

CI, локальные запуски, ретраи

  • своя тестовая база целиком
  • снапшот общей базы и работа в нём
  • чувствительные данные недоступны
  • запись в прод-ветку запрещена

mysql://<сервис>_test:…@dolt.aipika.tech:3306/<сервис>_test

Чувствительные данные никогда не попадают в тесты. Если что-то не должно оказаться в тестовом снапшоте — это кладётся в базу чувствительных данных: тестовые доступы её не видят даже по имени.

Частые вопросы

Снапшот заденет продакшен?

Нет. Ветка привязана к сессии: тесты видят копию данных, продакшен продолжает писать в основную ветку. Запись в прод-ветку для тестовых доступов запрещена, поэтому «случайно записали в прод» не бывает.

Насколько быстро снимается снапшот?

Мгновенно. Данные не копируются: снапшот — это второй указатель на те же блоки (copy-on-write). Время не зависит от размера базы.

Можно ли писать в снапшоте?

Да, иначе тесты бесполезны: внутри снапшота разрешены миграции, фикстуры, CREATE/DROP TABLE, любые изменения. Всё это остаётся в копии и исчезает вместе с ней.

Что с персональными и платёжными данными?

Они лежат в отдельной базе чувствительных данных. Снапшоты снимаются только с общей базы, а тестовые доступы не имеют прав на чувствительную — она в тестовые прогоны не попадает вообще.

Сколько живёт снапшот и не накопится ли мусор?

Столько, сколько нужно прогону. После тестов ветка удаляется одной командой; параллельные прогоны друг другу не мешают, потому что у каждого своя ветка.

Нужна ещё база — для нового сервиса или под параллельные прогоны?

Базы и доступы создаёт оператор сервиса: напишите, какую базу и зачем нужно. Тестовые базы под отдельные прогоны тоже выписываются по запросу.

Придётся переписывать код под новую базу?

Нет. Это MySQL-совместимый сервер: драйверы, ORM, миграции и клиенты работают как обычно. Версионирование и снапшоты — дополнительный слой, а не замена привычного SQL.

Подключите сервис и снимите первый снапшот

Напишите оператору — он выдаст адрес, три набора доступов и подскажет, как развести их по окружениям.

Технические детали

Всё, что нужно, чтобы подключиться и настроить тесты. Для агентов есть машиночитаемая версия: /AGENTS.md.

Строки подключения

prod:        mysql://<сервис>:<пароль>@dolt.aipika.tech:3306/<сервис>
prod-secure: mysql://<сервис>_secure:<пароль>@dolt.aipika.tech:3306/<сервис>_secure
test:        mysql://<сервис>_test:<пароль>@dolt.aipika.tech:3306/<сервис>_test
снапшот:     mysql://<сервис>_test:<пароль>@dolt.aipika.tech:3306/<сервис>

Что может тестовая учётка на общей базе

ДействиеРазрешено
читать продакшен-данныеда
создать и удалить ветку-снапшот, переключиться в неёда
писать внутри снапшота: миграции, фикстуры, CREATE/DROP TABLEда
писать в прод-ветку (main)нет
откатывать, сливать и коммитить прод-веткунет
удалять или переименовывать прод-веткунет

Правила и ограничения

Если что-то не так