ci: покрытие и пороги, тесты shared/api, smoke образа и бюджеты, документация
This commit is contained in:
1 parent
22dd6f9937
commit
5cbf4d29d7
15 files changed
+952
-11
No files matched your search
@@ -0,0 +1,35 @@
|
||||
# Производительность и ресурсы контейнера
|
||||
|
||||
Что сделано для быстродействия, стабильности и минимального потребления
|
||||
ресурсов, и как это проверять.
|
||||
|
||||
## Что включено
|
||||
|
||||
| Область | Решение |
|
||||
|---|---|
|
||||
| Остановка | SIGTERM/SIGINT → `app.close()` (дожидается запросов) → WAL checkpoint → `close`. Таймаут `SHUTDOWN_TIMEOUT_MS` (8 с), повторный сигнал — немедленный выход. В compose `init: true`, `stop_grace_period: 15s`. |
|
||||
| SQLite | `busy_timeout`, `cache_size`, `temp_store=MEMORY`, `mmap_size`, лимит WAL; транзакции для записи доступа/аудита; версия схемы в `user_version` (миграции не гоняются на каждом старте); индексы под очистку и фильтры; фильтры/сортировки в SQL. |
|
||||
| Очистка | Раз в час: истёкшие/отозванные сессии, коды авторизации, WebAuthn-челленджи (пачками по 1000, `SESSION_RETENTION_DAYS`). |
|
||||
| Горячий путь | Кэш профиля пользователя (инвалидируется любой записью в users/доступ — блокировка действует сразу), кэш App Switcher, мемоизация JWKS. Лимитер argon2 (`ARGON2_CONCURRENCY`). Секреты OIDC-клиентов — SHA-256 (старые argon2 мигрируют при первом обмене). |
|
||||
| HTTP | Hashed-ассеты `immutable` на год, `index.html` — `no-cache`; сжатие JSON на стороне Traefik; CORS по allowlist; `/health` (liveness, без БД) и `/ready` (БД + ключ OIDC); корректные 404 для `/oauth`, `/.well-known`, `/api`. |
|
||||
| Образ | API бандлится tsup в один файл, в образ ставятся только нативные модули; статика только `.br`; healthcheck через `wget`; `NODE_OPTIONS=--max-old-space-size=160`; лимиты compose: 256 МиБ, 1 CPU, `read_only`, `cap_drop: ALL`. |
|
||||
| Бэкап | `docker exec auth-portal node dist/server.js backup` или `BACKUP_INTERVAL_HOURS`; онлайн-копия, `integrity_check`, ротация. |
|
||||
|
||||
## Проверка
|
||||
|
||||
```bash
|
||||
pnpm turbo test:coverage --filter=@authportal/api --filter=@authportal/db --filter=@authportal/shared
|
||||
pnpm --filter web build && node scripts/ci/web-budget.mjs apps/web/dist/assets
|
||||
bash scripts/ci/smoke-image.sh <image> # размер, RSS, /ready, docker stop, данные после рестарта
|
||||
```
|
||||
|
||||
Бюджеты smoke-теста (env): `MAX_IMAGE_MB=250`, `MAX_RSS_MB=200`, `MAX_START_S=15`,
|
||||
`MAX_STOP_S=5`. Подтяните их после первого замера на CI.
|
||||
|
||||
## Эксплуатационные заметки
|
||||
|
||||
- В production `JWT_SECRET` должен быть уникальным (≥ 16 символов), а
|
||||
`ADMIN_PASSWORD` для первого запуска — не короче 8 символов и не `admin`.
|
||||
- Если нужен другой лимит памяти, меняйте `mem_limit` и `NODE_OPTIONS` вместе
|
||||
(куча ≈ 60–65 % лимита).
|
||||
- Одна реплика: SQLite не поддерживает несколько писателей.
|
||||
Reference in new issue
Block a user