Пісочниці і тестові оточення
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 з вебхуками і помилками 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 - і ваші інтеграції стануть швидкими, безпечними і передбачуваними, а релізи - безболісними.