Архитектура¶
Платформа следует 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)