Files
EvoFirewall/deploy/docker/README.md
T
Denozordec ce90fa9701
quality / changes (push) Successful in 7s
quality / commitlint (push) Skipped
quality / openapi (push) Successful in 27s
quality / web (push) Successful in 48s
quality / api (push) Successful in 1m13s
quality / linux-agent-smoke (push) Successful in 22s
quality / docker-check (push) Successful in 4m43s
CD / quality (push) Successful in 7m42s
CD / publish (push) Successful in 5m17s
fix(ci): restore backups through remote Docker API
2026-10-26 14:28:36 +07:00

4.4 KiB
Raw Blame History

Docker-образы EvoFirewall

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). Скрипт write-bake-override.sh — опциональный helper для локальной отладки.

BuildKit кэширует pnpm store через RUN --mount=type=cache. В CI каждый запуск использует отдельный builder с cleanup: true; долговременный кэш хранится в registry (mode=max). Общий постоянный builder evofw больше не используется.

Слои и runtime

Образ Runtime base Заметка
evofw, evofirewall node:22-alpine один процесс: API + SPA + SQLite; better-sqlite3 собирается в alpine в dependency stage

python3 / make / g++ только в build stages. Независимые api-build / web-build ветви используют общий deps; runtime получает только production API deploy и SPA dist. Context режется корневым .dockerignore.

Теги evofw и evofirewall — один и тот же образ (evofirewall — drop-in для старого compose).

Кэш registry

  • git.shx.one/<owner>/evofw-buildcache:node-buildcache — запись только из финального evofw target (mode=max включает обе build branches). PR импортирует cache без записи.
  • git.shx.one/<owner>/evofw-buildcache:base-node-22-alpine-<digest> — зеркало FROM с Docker Hub. Только linux/amd64; upstream digest проверяется перед выбором зеркала, bake получает mirror reference по digest. Ошибка resolution/copy блокирует CD.

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

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

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

Runtime smoke, backup/restore, baseline и оставшиеся release gates: runtime-validation.md.

Restore работает и с удалённым Docker daemon: локальная резервная копия передаётся через docker cp в остановленный одноразовый helper, без bind mount пути runner. Непосредственно перед запуском повторно проверяется, что целевой named volume не используется. Helper удаляется с его анонимными volumes; целевой named volume сохраняется. На всё время восстановления остальные writers и их автоматический перезапуск должны оставаться остановленными.

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

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

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.