perf: prepared statements, CSP, digest pin, вырезание design-preview, нагрузочные бюджеты, jsdom-тесты web, composite CI, SBOM/Trivy
This commit is contained in:
1 parent
08be310e6b
commit
1a68597d48
31 files changed
+1313
-158
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
}
|
||||
@@ -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 = выключен), число копий, каталог
|
||||
|
||||
Reference in new issue
Block a user