← ПроектыInternal Platform · 2025–2026
HanDev Internal Platform
Внутренняя инженерная платформа HanDevelopment на домене *.handev.org. 4 связанных репозитория и 4 сервиса с единым SSO, общей дизайн-системой и общей PostgreSQL: Identity (auth), UpTime (мониторинг), QA Orchestrator (автотесты), PlatformShared (npm-пакеты). Покрывает повседневные нужды студии: централизованный вход, мониторинг клиентских продуктов, оркестрацию Playwright-тестов и единый UI-стек.
- 4 сервиса под одним зонтиком *.handev.org с единым SSO через HttpOnly cookie
- RS256 JWT + JWKS: 15-мин access + 30-дневный refresh с тройным обновлением
- Service-access gate: JWT отклоняется, если payload.services не содержит ключ сервиса
- Деплой GitLab CI → Docker → Portainer + Traefik с авто-SSL
Node 22Fastify 5React 18TailwindPostgreSQL 18

Задача
У студии 20+ продакшен-сервисов в разных проектах. Без единой платформы это означает: на каждый сервис — отдельная аутентификация, разрозненные дашборды мониторинга, тесты, рассованные по CI разных репозиториев, у каждого сервиса своя навигация и заголовок. Решили вложиться в платформу, которая закроет это «раз и навсегда» — для собственной команды и для будущих клиентских продуктов.
Что сделали
- 4 независимых сервиса под одним зонтиком *.handev.org с единым SSO через HttpOnly cookie (Domain=.handev.org).
- Cookie-SSO + JWT с публичным JWKS: Identity подписывает RS256, остальные сервисы верифицируют через JWKS. 15-минутный access + 30-дневный refresh с тройным обновлением: /auth/refresh retry на 401, тик каждые 12 минут, refresh при возврате вкладки из background.
- Service-access gate: даже валидный JWT отклоняется, если payload.services не содержит ключ текущего сервиса. Это разделяет «токен валиден» и «у пользователя есть доступ к этому сервису».
- Global roles (admin / devops / qa / developer / customer / manager / marketing) хранятся в Identity и мапятся на внутренние роли каждого сервиса.
- Общий PostgreSQL 18 на DigitalOcean: отдельная база на сервис. UpTime использует PostgREST + Supabase Edge Functions.
- Shared npm-пакеты @handev/platform-ui, @handev/platform-auth, @handev/tailwind-preset — публикуются в GitLab Group Package Registry с авто-версионированием (MAJOR.MINOR.PIPELINE_IID).
- Унифицированный layout: PlatformProvider + PlatformLayout с общим header, service-switcher, user-menu и сайдбаром. Все SPA выглядят и работают одинаково.
- Деплой через GitLab CI → Docker registry → Portainer webhook. Traefik как reverse-proxy с автоматическими SSL-сертификатами.
Результат
- Единый вход во все внутренние инструменты: один логин — доступ к Identity / UpTime / QA Orchestrator из одного service-switcher.
- 4 продакшен-сервиса с единой UI/UX, общим стеком и общей PostgreSQL.
- Платформа используется для тестирования и мониторинга всех клиентских продуктов.