perf: prepared statements, CSP, digest pin, вырезание design-preview, нагрузочные бюджеты, jsdom-тесты web, composite CI, SBOM/Trivy

This commit is contained in:
Denozordec committed 2026-10-23 17:22:23 +07:00
1 parent 08be310e6b
commit 1a68597d48
31 files changed
+1313 -158

No files matched your search

+9 -1
View File
@@ -29,6 +29,7 @@ services:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=auth-portal
- --ping=true
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --entrypoints.web.http.redirections.entrypoint.to=websecure
@@ -43,6 +44,12 @@ services:
- traefik_letsencrypt:/letsencrypt
networks:
- auth-portal
healthcheck:
test: ["CMD", "traefik", "healthcheck", "--ping"]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
logging:
driver: json-file
options:
@@ -69,7 +76,8 @@ services:
security_opt:
- no-new-privileges:true
depends_on:
- traefik
traefik:
condition: service_healthy
# No host ports — only Traefik publishes 80/443.
env_file:
- .env
+6 -1
View File
@@ -1,6 +1,8 @@
# syntax=docker/dockerfile:1.7
# All-in-one Auth Portal (Fastify + SPA + SQLite). Analog cfdm / evofw.
ARG BASE_NODE=docker.io/library/node:22-alpine
# Закреплён по digest (воспроизводимая сборка); обновляйте вместе с node:22-alpine
# (digest: docker buildx imagetools inspect node:22-alpine).
ARG BASE_NODE=docker.io/library/node:22-alpine@sha256:fe4f6d74e20370acb04ad889077d14d0f64a9c8ea6a42bc60cddf1e844699914
FROM ${BASE_NODE} AS deps
WORKDIR /repo
@@ -22,6 +24,9 @@ COPY apps/api apps/api
COPY packages/ui packages/ui
COPY packages/shared packages/shared
COPY packages/db packages/db
# Preview-маршруты дизайна (mock-данные) не нужны в проде: вырезаем до генерации routeTree
# (-45% файлов и ~-10% gzip в бандле). Общие компоненты из src/design-preview остаются.
RUN rm -f apps/web/src/routes/design-preview*.tsx
# API собирается tsup в один файл (все зависимости внутри, кроме нативных).
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
pnpm turbo build --filter=web --filter=@authportal/api
+7 -1
View File
@@ -30,8 +30,13 @@ variable "CACHE_REF_NODE" {
default = ""
}
# provenance + SBOM; включается только при --push (docker exporter attestations не поддерживает).
variable "ATTEST" {
default = "false"
}
variable "BASE_NODE" {
default = "docker.io/library/node:22-alpine"
default = "docker.io/library/node:22-alpine@sha256:fe4f6d74e20370acb04ad889077d14d0f64a9c8ea6a42bc60cddf1e844699914"
}
function "node-cache-from" {
@@ -113,5 +118,6 @@ target "authportal" {
build = "target:node-build"
}
cache-from = node-cache-from()
attest = equal(ATTEST, "true") ? ["type=provenance,mode=min", "type=sbom"] : []
tags = concat(image-tags("authportal"), image-tags("auth-portal"))
}
+4
View File
@@ -44,6 +44,10 @@ NODE_ENV=production
# SESSION_RETENTION_DAYS=7
# Доверенные прокси для X-Forwarded-For (IP/CIDR через запятую, true/false)
# TRUST_PROXY=127.0.0.1/8,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,fc00::/7
# Сжатие ответов в Node (нужно только без Traefik compress)
# ENABLE_COMPRESS=false
# Глобальный лимит запросов на IP в минуту
# RATE_LIMIT_MAX=200
# Доп. origins для CORS (по умолчанию: issuer, RETURN_TO_ALLOWLIST, приложения App Switcher)
# CORS_ORIGINS=
# Бэкап SQLite: период в часах (0 = выключен), число копий, каталог