Kubernetes-платформа для покерного игрового продукта: с нуля и в проде

Строим и поддерживаем инфраструктуру покерной игровой платформы на Unity WebGL и Android — с нуля, включая доставку игры внутри стороннего iframe и все production-сервисы вокруг неё.

Обсудить похожую задачу

Playnetica — игровая студия, чья покерная платформа на Unity доступна как WebGL-версия и как Android-приложение. WebGL-версия дополнительно встраивается в сторонние игровые площадки через iframe — это добавляет к обычным задачам инфраструктуры отдельный пласт проблем с доставкой веб-контента внутри чужого окружения. До нашего подключения у продукта не было ни инфраструктуры, ни процессов вокруг неё — мы строили всё с нуля.

Стек и инфраструктура

Kubernetes

  • Отдельные production и staging окружения
  • Ingress и роутинг трафика на сервисы
  • Health checks и репликация для каждого сервиса

GitOps и CI/CD

  • GitOps-деплой через ArgoCD
  • GitLab CI/CD и собственный GitLab Runner
  • Container registry для образов сервисов

Observability

  • Grafana для дашбордов и алертинга
  • Loki и Promtail для логов
  • node-exporter для метрик узлов кластера

Данные

  • PostgreSQL
  • MongoDB
  • Redis

Масштаб платформы

  • 10+ backend-сервисов: identity, gateway, user management, remote config, economy, progression, matchmaker, inventory, lootbox, shop, интеграция с внешней игровой площадкой
  • Отдельные Java-сервисы: balance, lootbox, statistic, quest
  • Health checks и репликация на каждом сервисе
  • Раздельные production и staging окружения для всей платформы

Доставка Unity WebGL внутри стороннего iframe

Абсолютные URL для WebGL-ассетов

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

Запуск внутри стороннего iframe

WebGL-версия встраивается в сторонние игровые площадки через iframe — это отдельная среда выполнения со своими ограничениями по хранилищу, кукам и коммуникации с родительским окном. Настроили CORS так, чтобы ассеты и API загружались из iframe без ошибок браузера, оставаясь безопасными для остального трафика.

Доставка ассетов через CDN/S3-совместимое хранилище

Игровые ассеты (сцены, текстуры, аудио) отдаются через статику и CDN на S3-совместимом хранилище — так игра грузится быстро независимо от того, где физически находится игрок.

Unity Addressables и CRC mismatch

Часть ассетов загружается через систему Unity Addressables по требованию, а не единым билдом. При проблемах с кешированием на CDN или в браузере возникает CRC mismatch — Unity считает загруженный bundle повреждённым и отказывается его использовать. Разобрали механику кеширования Addressables и настроили доставку так, чтобы это переставало происходить в проде.

Что это дало на практике

Кластер
Production-кластер Kubernetes на 4 нодах в облаке
Релизы
2 релиза в неделю
Простои
2 инцидента с февраля 2026, оба — из-за проблем на стороне внешнего CDN
Подключение к базе данных
Когда часть запросов к базе стала выполняться заметно медленнее, разобрались, что дело не в самой базе, а в накладных расходах на установление соединений. Ввели PgBouncer как пул соединений — это снизило разброс задержки и сделало время ответа предсказуемым, вместо разбора отдельных медленных случаев постфактум.

Что решали в проде

  • Диагностировали проблему на уровне ноды — диск и I/O — на production-кластере
  • Настроили доставку Unity WebGL внутри стороннего iframe: абсолютные URL, CORS, кеширование
  • Разобрали цепочку CORS/кеш/Addressables, приводившую к CRC mismatch при загрузке bundle-файлов
  • Поддерживаем CI/CD pipeline для WebGL- и Android-билдов
  • Нашли и исправили баг с потерей реального IP клиента на балансировщике: облачный контроллер не подхватывал PROXY protocol из-за особенностей аннотации, из-за чего в логах и метриках все запросы выглядели так, будто идут с одного адреса
  • Разобрали 404 на видео при раздаче через CDN: origin отдавал редирект с HTTP на HTTPS, который CDN не проходил, — видео теряло Content-Type и переставало отдаваться. Настроили раздачу с корректными заголовками и без лишних редиректов
  • Построили систему параллельного тестового восстановления бэкапов баз данных с защитой от повреждённых архивов и отчётом в Telegram — тот же принцип, что лёг в основу нашего собственного инструмента проверки бэкапов

Обсудим вашу задачу

Напишите напрямую в Telegram или оставьте заявку — ответим в ближайшее время.

+7 (995) 158-12-85