Песочницы и тестовые окружения
TL;DR
Надежная песочница = полная изоляция, синтетические/обезличенные данные, реалистичные симуляторы внешних систем, предсказуемые сиды и time-travel, встроенная идемпотентность и вебхуки, прозрачные лимиты и метрики. Прод — недосягаем, ключи — ротуются, promotion — только по чек-листам.
1) Карта окружений и их роли
Правило: sandbox ≠ prod. Любая связь — через односторонние симуляторы без доступа к реальным средствам/играм/персональным данным.
2) Данные: синтетика, анонимизация, сидирование
Синтетика по умолчанию. Генераторы паспортных/карточных данных, валидные, но нефинансовые PAN (тестовые BIN), «живые» паттерны ставок и балансов.
Анонимизация для stage: токенизация идентификаторов, дифференцная приватность для агрегатов, удаление редких комбинаций.
Сиды и детерминизм: одна команда — одно состояние.
bash make db-reset && make db-seed ENV=sandbox SEED=2025_11_03
Time-travel: глобальный «час» окружения для тестов дедлайнов/экспираций.
3) Симуляторы и заглушки (stubs)
Платежи/банки/PSP
Auth/Capture/Refund/Payout со сценариями: `approved`, `declined_insufficient`, `3ds_required`, `timeout`, `duplicate`.
Вебхуки PSP: подписанные HMAC, ретраи, задержки и «грязный интернет».
KYC/AML/Sanctions
Ответы: `clear`, `pep_match`, `sanction_hit`, `doc_mismatch`, `manual_review`.
Поддержка идемпотентности и rate limits как в prod.
Игровые провайдеры/каталог
Лобби, фичи, RTP/раунды — псевдослучайная генерация, управляемые «выплаты/провалы» для UX-кейсов.
Опция: переключатель «строгости» симулятора (happy-path vs chaos).
4) Вебхуки в песочнице
Подписи HMAC (v1), заголовки `X-Event-Id`, `X-Timestamp`, окно ≤ 5 минут.
Ретраи с экспоненциальным backoff, DLQ и replay.
Консоль «переотправить» и логи попыток.
pseudo
POST /psp/webhooks
Headers: X-Signature, X-Timestamp, X-Event-Id
Body: { event_id, type, data, attempt }
5) Идемпотентность и детерминизм
Все мутации принимают `Idempotency-Key`.
Симуляторы хранят результат по ключу (TTL 24–72 ч).
«Seed-детерминизм»: при одном и том же входе — одинаковый исход (для повторяемых тестов).
6) Безопасность и доступ
Изоляция сетей/VPC, отдельные секреты и домены (`sandbox.example.com`).
RBAC/ABAC: роли «partner», «qa», «dev», скопы токенов минимальны.
Rate-limits и квоты: справедливая доля per-tenant/ключ, понятные `429`/`Retry-After`.
Секреты только в KMS/Vault; регулярная ротация.
Запрет реальных платежей на уровне кода/конфига (feature-flag hard block).
7) API Gateway и наблюдаемость в sandbox
Те же политики: OAuth2/OIDC/JWT, CORS, WAF, DDoS-профиль.
Метрики: p50/p95/p99, 4xx/5xx, hit-rate лимитов, latency webhooks, идемпотентные хиты.
Логи/трейсы: без PII; корелляция `trace_id`.
Дашборд «Здоровье песочницы»: аптайм, очереди вебхуков, ошибки симуляторов.
8) Фича-флаги, версии и совместимость
Включение фич в sandbox → stage → prod.
SemVer для API; баннер Deprecation/Sunset в Swagger/Redoc песочницы.
Persisted queries для GraphQL-витрин (если есть).
9) CI/CD и promotion
1. Build/Unit →
2. Contract/Mock tests (OpenAPI/Protobuf/GraphQL SDL) →
3. Интеграционные против симуляторов →
4. Stage регресс (анон. снапшоты) →
5. Canary в prod.
Gate-чек-лист promotion: ниже в §12.
10) UAT-сценарии для партнеров (в песочнице)
Платежи: auth/capture/refund/payout c вебхуками и ошибками PSP.
KYC/AML: все статусы + ручная эскалация.
Идемпотентность: повторный `Idempotency-Key` → тот же результат.
Rate-limit: корректная обработка `429`.
Временные окна: экспирация токенов, `Retry-After`, time-travel кейсы.
Webhooks: подписи/ретраи/DLQ, ручной replay и дедуп.
11) Политика данных и приватность
Никогда не хранить real PAN/KYC-доки в sandbox/stage.
Анонимизация: маскирование, удаление прямых идентификаторов, синтетическая корреляция.
TTL хранения логов и тел вебхуков ≤ регламентного.
12) Чек-листы
12.1 Запуск новой песочницы
- Изолированная сеть/база/кеш/объектное хранилище
- Секреты созданы в KMS/Vault, доступ по ролям
- Симуляторы PSP/KYC/игр задеплоены и версионированы
- Swagger/Redoc + Postman коллекция (sandbox endpoints)
- Вебхуки: HMAC, retry, DLQ, консоль replay
- Rate/Quota профили, баннеры Deprecation/Sunset (если есть)
- Дашборды и алерты (latency, 5xx, 429, DLQ)
12.2 Promotion release (stage→prod)
- Контрактные diff-проверки (без breaking)
- Нагрузочные p95/p99 в норме на stage
- Вебхуки прошли UAT, идемпотентность ок
- Фича-флаги подготовлены, план отката есть
- Changelog, миграционный гид и рассылка партнерам
13) Антипаттерны
Песочница, «тайно» трогающая prod-сервисы/базы.
Реальные карточные/паспортные данные в stage/sandbox.
Симуляторы без вэбхуков/ретраев — «счастливая тропа» только.
Отсутствие идемпотентности → дубликаты выплат/ставок.
Один общий HMAC-секрет для всех партнеров.
Нет лимитов и прозрачных 429/Retry-After.
14) Мини-сниппеты
.env.sandbox (пример)
dotenv
API_BASE=https://sandbox.api.example.com
OAUTH_ISS=https://sandbox.idp.example.com
PSP_SIM_URL=https://sandbox.psp-sim.example.com
KYC_SIM_URL=https://sandbox.kyc-sim.example.com
WEBHOOK_SECRET_ROTATION_DAYS=90
FEATURE_FORCE_SANDBOX_PAYMENTS=1
OpenAPI фрагмент (sandbox сервер)
yaml servers:
- url: https://sandbox.api.example.com/v1 description: Public Sandbox
Псевдокод идемпотентности
pseudo if store.exists(idem_key): return store.get(idem_key)
res = do_business()
store.set(idem_key, res, ttl=72h)
return res
Триггеры симулятора PSP
json
{ "scenario": "payout", "case": "declined_insufficient", "payout_id": "p_123" }
15) Наблюдаемость и SLO песочницы
Uptime sandbox API ≥ 99.5% (витрина интеграций не должна падать).
Webhooks p95 ≤ 3 с до 2xx при нормальной нагрузке.
Error budget 5xx шлюза ≤ 0.1%.
Док-портал доступен и синхронизирован с контрактом.
16) Governance
Владелец окружения (SRE/Platform) и стeward API (контракты).
RFC-процесс для breaking-изменений, календарь Deprecation/Sunset.
Отдельные лимиты/квоты и прайсинг «fair-use» для публичной песочницы.
Резюме
Песочница — это продукт для разработчиков, а не «копия базы». Дайте: строгую изоляцию, синтетические данные, полноценные симуляторы с вебхуками и ретраями, детерминизм через сиды и time-travel, фича-флаги и прозрачные лимиты. Обвяжите все контрактами, наблюдаемостью и governance — и ваши интеграции станут быстрыми, безопасными и предсказуемыми, а релизы — безболезненными.