Files
auth-portal/deploy/docker
Denozordec 8d8bddb454
quality / commitlint (push) Skipped
quality / changes (push) Failing after 8s
quality / web (push) Skipped
quality / api (push) Skipped
quality / docker-check (push) Skipped
CD / quality (push) Failing after 11s
CD / publish (push) Skipped
ci(cd): turbo-кэш, гейты typecheck/lint, таймауты, non-root образ
- .turbo в actions/cache (пересборки shared/db переиспользуются между прогонами)
- typecheck в web/api джобах, lint бэкенда в api-джобе
- убран пустой turbo test --filter=web (в web нет тестов)
- timeout-minutes на все джобы
- Dockerfile: USER node + --chown; прекомпрессия статики gzip+brotli на этапе
  сборки (Traefik не сжимает); compose: chown 1000:1000 data в инструкции
2026-09-23 14:51:38 +07:00
..

Docker-образы Auth Portal

CI (Gitea Actions)

Сборка образов — docker buildx bake (docker-bake.hcl), не отдельные docker build.

Publish: push в main после quality gates — workflow CD job publish: semantic-release + зеркало base-образов + bake с VERSION из релиза.

Bake читает переменные из окружения (REGISTRY, IMAGE_TAG, CACHE_REF_NODE, BASE_NODE).

BuildKit кэширует pnpm store через RUN --mount=type=cache. На CI mounts живут, пока named builder authportal не удаляют (cleanup: false).

Слои и runtime

Образ Runtime base Заметка
authportal, auth-portal node:22-alpine один процесс: API + SPA + SQLite; better-sqlite3 и @node-rs/argon2 собираются в alpine на stage deps/build

python3 / make / g++ только в deps/build. Context режется корневым .dockerignore.

Теги authportal и auth-portal — один и тот же образ (auth-portal — drop-in для текущего docker pull / Traefik compose).

Кэш registry

  • git.shx.one/<owner>/authportal-buildcache:node-buildcacheзапись только из node-build
  • git.shx.one/<owner>/authportal-buildcache:base-node-22-alpine — зеркало FROM с Docker Hub. Только linux/amd64; skip если тег уже в Gitea. Неуспешный copy не валит CD — bake берёт Docker Hub FROM.

pull = false в bake: не перекачивать FROM, если слой уже в builder. Не запускайте docker system prune -a на runner.

Параллельный cache-to в один ref ломает manifest (content descriptor … not found).

Если CI падает на «not found» после смены схемы кэша — один раз удалите теги authportal-buildcache:* в registry и пересоберите.

Локальная сборка

Из корня репозитория:

cd deploy/docker
export REGISTRY=git.shx.one/<owner>
export IMAGE_TAG=latest
export SHORT_SHA=$(git rev-parse --short HEAD)
export VERSION=dev
export BUILD_TIME=
docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl default

Проверка манифеста без сборки:

docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl --print default

В docker-bake.hcl: context = "../.." резолвится от cwd (каталог deploy/docker/). dockerfile — путь от этого context (корень репо). Из корня репо не вызывать bake с -f deploy/docker/docker-bake.hcl: получится lstat ../../deploy. Можно задать BUILDX_BAKE_FILE_RELATIVE_PATHS=1.