# pcp-tgu-ui-service

Фронтенд «ТГУ — Операции». Сервис собран **с нуля** на чистой базе исходного
`pcp-tgu-ops-ui` (React + Vite, своя тёмная тема), в которую добавлены только две
вещи с платформы NStart:

1. **Авторизация** — headless-ядро `@nstart/auth` (New Start ID / Keycloak): токен,
   login, logout, refresh. **Без `@nstart/ui`** — UI-компоненты библиотеки
   (ProfilePage/UserPanel) намеренно не подключены, экраны ТГУ остаются на своём UI.
2. **Сборка и деплой** — платформенный контракт: hardened `Dockerfile` (non-root,
   healthcheck), runtime-config (`config.js` из `APP_*`), `docker-bake.hcl`,
   `.gitlab-ci.yml` (build → trivy/semgrep → push в registry), `nginx.conf`.

В отличие от `pcp-tgu-ops-ui-template`, здесь нет демо-страниц шаблона, `@nstart/ui`,
Tailwind, i18n и борьбы тем — только рабочий ТГУ + auth + контур сборки/деплоя.

## Авторизация (headless)

- Режим выбирается переменной `authMode` (`anonymous` | `new-start-id`).
- `anonymous` (дефолт): приложение открывается сразу, токена нет, заголовок
  `Authorization` не добавляется — поведение как у исходного сервиса.
- `new-start-id`: вход редиректом на New Start ID; токен подставляется в каждый
  запрос `src/api/*` через мост [`apiFetch`](src/api/apiFetch.ts) +
  [`AuthTokenBridge`](src/auth/appAuth.tsx). В шапке появляется кнопка «Выйти».
- Конфиг входа берётся из [`src/config/env.ts`](src/config/env.ts) (runtime `APP_*`
  имеют приоритет над build `VITE_*`).

## Конфигурация окружения

| Назначение | DEV (`npm run dev`) | PROD (Docker) |
|---|---|---|
| источник | `.env` (`VITE_*`) | `APP_*` контейнера → `config.js` |
| api | `VITE_API_URL` | `APP_API_URL` |
| режим auth | `VITE_AUTH_MODE` | `APP_AUTH_MODE` |
| New Start ID | `VITE_NEW_START_ID_*` | `APP_NEW_START_ID_*` |

Доступ к приватному реестру `@nstart/*`: scope `@nstart:registry=...` должен быть в
`~/.npmrc` (или в конфиге CI-раннера). Проектный `.npmrc` задаёт только
`min-release-age=7`.

## Запуск

```bash
cp .env.example .env     # режим anonymous, открывается сразу
npm install              # нужен доступ к repo.nstart.cloud (scope @nstart)
npm run dev              # http://localhost:5174
npm run build            # tsc -b + vite build
npm run test             # vitest
```

## Прод-прокси (осталось настроить)

В [`nginx.conf`](nginx.conf) активный `/api/` — заглушка (`127.0.0.1:8000`), а
блоки `pcp-*` закомментированы (зеркало `server.proxy` из `vite.config.ts`).
Подставьте реальные `UPSTREAM_*` кластера и раскомментируйте, либо вынесите
маршрутизацию на gateway/ingress.
