Перейти к содержанию

Архитектура

Платформа следует Clean Architecture: handler → usecase → repository → domain. Бизнес-ядро никогда не импортирует веб-фреймворк.

Компоненты

Internet ──► nginx (TLS)
   ├─ /oauth2/*, /.well-known/*, /userinfo ─► Go API — встроенный OIDC issuer
   ├─ /rp/sign/*   ─► ретранслятор подписи eID (бэкенд)
   ├─ /rp/eid/*     ─► прокси сервисов eID — личный (бэкенд)
   ├─ /rp/eid-org/* ─► прокси сервисов eID — организации (бэкенд)
   └─ всё остальное ─► Next.js BFF (web) ──► API бэкенда (:8080)
   внутренняя сеть:  db (PostgreSQL) · redis

Слои

Слой Технология Примечания
Бэкенд Go · chi (net/http) · pgx (без ORM) Clean Architecture, RLS, рукописный SQL
Фронтенд Next.js 15 (BFF) Браузер общается только со своим origin; токены не попадают в клиентский JS
Провайдер OIDC Встроенный (Go, usecases/oidc) платформа сама ведёт вход/согласие/выход
Идентификация e-ID Gerege RP проверка электронного удостоверения
Кэш/очередь Redis список отозванных сессий, временное состояние
AI Gemini (REST без SDK) чат, голос, перевод

Безопасность

  • Row-Level Security (RLS) — каждый пользователь видит только свои строки; проверка применимости при старте (в продакшене требуется роль без прав суперпользователя).
  • Модель BFF — токены живут в httpOnly-куках и никогда не попадают в JS браузера.
  • Двойная защита от CSRF — собственный заголовок + проверка origin.
  • Заголовки безопасности — CSP, HSTS, COOP/COEP/CORP; ограничение запросов по IP.
  • Аудит — журнал с хеш-цепочкой, только на добавление.

Структура бэкенда (обзор)

backend/
├── cmd/api/server/        # ручная сборка зависимостей (server.go)
├── internal/
│   ├── business/
│   │   ├── domain/         # чистый домен (без внутренних импортов)
│   │   └── usecases/       # бизнес-логика (зависит от интерфейсов)
│   ├── datasources/
│   │   ├── repositories/   # адаптеры pgx + интерфейсы
│   │   └── caches/         # redis
│   └── http/
│       ├── handlers/       # func(w,r) error, v1.Wrap
│       ├── middlewares/    # аутентификация, oauth-bearer, лимиты, …
│       └── routes/         # группировка маршрутов
├── pkg/                    # eid, oidc, secrethash, gemini, …
└── migrations/             # нумерованный SQL (N_name.up/down.sql)