diff --git a/docs/INFRASTRUCTURE.md b/docs/INFRASTRUCTURE.md index 72bd7bd..2f3e3cf 100644 --- a/docs/INFRASTRUCTURE.md +++ b/docs/INFRASTRUCTURE.md @@ -98,6 +98,7 @@ RUN npm ci RUN npm run build:vendor FROM httpd:alpine3.23@sha256:4a15e9c... +RUN apk upgrade --no-cache COPY --from=frontend-assets /build/dist/vendor/ /usr/local/apache2/htdocs/vendor/ COPY security.conf /usr/local/apache2/conf/extra/magistr-security.conf COPY proxy.conf /usr/local/apache2/conf/extra/magistr-proxy.conf @@ -108,7 +109,8 @@ tag и manifest digest. Первый этап frontend собирает зафи OpenTelemetry bundle; второй раздаёт только runtime- файлы, без `node_modules`, тестов и build-исходников. Apache подключает `mod_headers`, `mod_proxy` и `mod_proxy_http`; proxy сохраняет исходный `Host`, чтобы `localhost` корректно -маршрутизировался в tenant `default`. Сервер +маршрутизировался в tenant `default`. Перед копированием runtime-файлов устанавливаются +доступные исправления Alpine через `apk upgrade --no-cache`. Сервер возвращает CSP с `script-src 'self'`, `script-src-attr 'none'`, `style-src 'self'` и точными SHA-256 для оставшихся статических style-атрибутов. `unsafe-inline` и `unsafe-eval` не используются. Дополнительно выставляются `nosniff`, `DENY`, строгий referrer policy и diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 52de24b..9e3d81c 100755 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -9,6 +9,9 @@ RUN npm run build:vendor FROM httpd:alpine3.23@sha256:4a15e9c73f25334bc03cfb3c692c9adfc103bb46ca89cee1f0b9a5fcbc7b21f6 +# Устанавливаем исправления безопасности, опубликованные после сборки базового образа. +RUN apk upgrade --no-cache + COPY admin/ /usr/local/apache2/htdocs/admin/ COPY department/ /usr/local/apache2/htdocs/department/ COPY edu-office/ /usr/local/apache2/htdocs/edu-office/ diff --git a/graphify-out/.graphify_learning.json b/graphify-out/.graphify_learning.json index 762d716..bfa022e 100644 --- a/graphify-out/.graphify_learning.json +++ b/graphify-out/.graphify_learning.json @@ -1,11 +1,16 @@ { - "generated_at": "2026-07-29T21:47:12.291616+00:00", + "generated_at": "2026-07-29T22:16:42.858165+00:00", "nodes": { "_gitea_workflows_docker_build_backend_image_pipeline": { - "code_fingerprint": "672f3effb2b85afa48bca601809662a5567dc0d57a24b224d4c7f1624899b222", + "code_fingerprint": "3b51aee192b5af2b63ee1b7f62beca1b4524fbbd2b143c9bd29eb039db90f7bd", "label": "Pipeline backend-образа", - "last": "2026-07-29T21:27:26.637336+00:00", + "last": "2026-07-29T21:50:22.465033+00:00", "provenance": [ + { + "date": "2026-07-29T21:50:22.465033+00:00", + "outcome": "useful", + "q": "Проверить backend на HIGH и CRITICAL уязвимости: context deadline exceeded после загрузки Trivy DB" + }, { "date": "2026-07-29T21:27:26.637336+00:00", "outcome": "useful", @@ -17,16 +22,21 @@ "q": "The goal you specified requires a project to execute but there is no POM in this directory (/workspace)." } ], - "score": 1.998587492, + "score": 2.997218887, "source_file": ".gitea/workflows/docker-build.yaml", "status": "preferred", - "uses": 2 + "uses": 3 }, "_gitea_workflows_docker_build_build_and_push_docker_images": { - "code_fingerprint": "672f3effb2b85afa48bca601809662a5567dc0d57a24b224d4c7f1624899b222", + "code_fingerprint": "3b51aee192b5af2b63ee1b7f62beca1b4524fbbd2b143c9bd29eb039db90f7bd", "label": "Workflow сборки и публикации Docker-образов", - "last": "2026-07-29T21:27:26.637336+00:00", + "last": "2026-07-29T21:50:22.465033+00:00", "provenance": [ + { + "date": "2026-07-29T21:50:22.465033+00:00", + "outcome": "useful", + "q": "Проверить backend на HIGH и CRITICAL уязвимости: context deadline exceeded после загрузки Trivy DB" + }, { "date": "2026-07-29T21:27:26.637336+00:00", "outcome": "useful", @@ -46,20 +56,15 @@ "date": "2026-07-29T19:59:04.551881+00:00", "outcome": "useful", "q": "новая схема на проде на удалённом сервере создана через CREATE SCHEMA public. я проверил, давай дальше" - }, - { - "date": "2026-07-29T19:26:44.188240+00:00", - "outcome": "useful", - "q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?" } ], - "score": 4.99308675, + "score": 5.990300641, "source_file": ".gitea/workflows/docker-build.yaml", "status": "preferred", - "uses": 5 + "uses": 6 }, "_gitea_workflows_docker_build_deploy_to_k8s": { - "code_fingerprint": "672f3effb2b85afa48bca601809662a5567dc0d57a24b224d4c7f1624899b222", + "code_fingerprint": "3b51aee192b5af2b63ee1b7f62beca1b4524fbbd2b143c9bd29eb039db90f7bd", "label": "Job деплоя в Kubernetes", "last": "2026-07-29T20:12:38.880629+00:00", "provenance": [ @@ -69,26 +74,31 @@ "q": "сам можешь выполнить эти действия?" } ], - "score": 0.998483979, + "score": 0.998011327, "source_file": ".gitea/workflows/docker-build.yaml", "status": "tentative", "uses": 1 }, "_gitea_workflows_docker_build_frontend_image_pipeline": { - "code_fingerprint": "672f3effb2b85afa48bca601809662a5567dc0d57a24b224d4c7f1624899b222", + "code_fingerprint": "3b51aee192b5af2b63ee1b7f62beca1b4524fbbd2b143c9bd29eb039db90f7bd", "label": "Pipeline frontend-образа", - "last": "2026-07-29T20:38:53.488440+00:00", + "last": "2026-07-29T21:50:22.465033+00:00", "provenance": [ + { + "date": "2026-07-29T21:50:22.465033+00:00", + "outcome": "useful", + "q": "Проверить backend на HIGH и CRITICAL уязвимости: context deadline exceeded после загрузки Trivy DB" + }, { "date": "2026-07-29T20:38:53.488440+00:00", "outcome": "useful", "q": "The goal you specified requires a project to execute but there is no POM in this directory (/workspace)." } ], - "score": 0.998904507, + "score": 1.998009121, "source_file": ".gitea/workflows/docker-build.yaml", - "status": "tentative", - "uses": 1 + "status": "preferred", + "uses": 2 }, "backend_src_main_java_com_magistr_app_config_auth_authorizationinterceptor_authorizationinterceptor": { "code_fingerprint": "70b01b3fa22e058ee997250c52cc0affee54ab37aa5f8cc7eb74411487f1bbbf", @@ -111,7 +121,7 @@ "q": "Почему RequireRoles связывает множество контроллеров, моделей и сервисов как cross-community bridge?" } ], - "score": 1.858025454, + "score": 1.857145922, "source_file": "backend/src/main/java/com/magistr/app/config/auth/AuthorizationInterceptor.java", "status": "preferred", "uses": 3 @@ -127,7 +137,7 @@ "q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?" } ], - "score": 0.660126499, + "score": 0.659814015, "source_file": "backend/src/main/java/com/magistr/app/config/auth/JwtTokenService.java", "status": "tentative", "uses": 1 @@ -143,7 +153,7 @@ "q": "Почему RequireRoles связывает множество контроллеров, моделей и сервисов как cross-community bridge?" } ], - "score": 0.555414877, + "score": 0.555151961, "source_file": "backend/src/main/java/com/magistr/app/config/auth/RequireRoles.java", "status": "tentative", "uses": 1 @@ -159,7 +169,7 @@ "q": "Как безопасно обновлять tenant DataSource без потери рабочего подключения?" } ], - "score": 0.675534207, + "score": 0.67521443, "source_file": "backend/src/main/java/com/magistr/app/config/DataInitializer.java", "status": "tentative", "uses": 1 @@ -175,7 +185,7 @@ "q": "проанализируй весь проект на баги и ошибки и дополни '/mnt/HDD/ProjectMagistr/magistr/BUG_REPORT.md'" } ], - "score": 0.642484079, + "score": 0.642179947, "source_file": "backend/src/main/java/com/magistr/app/config/tenant/ConfigMapUpdater.java", "status": "tentative", "uses": 1 @@ -191,7 +201,7 @@ "q": "Как безопасно заменить tenant DataSource без потери рабочего подключения?" } ], - "score": 0.675419668, + "score": 0.675099946, "source_file": "backend/src/main/java/com/magistr/app/config/tenant/TenantConfig.java", "status": "tentative", "uses": 1 @@ -217,7 +227,7 @@ "q": "проанализируй весь проект на баги и ошибки и дополни '/mnt/HDD/ProjectMagistr/magistr/BUG_REPORT.md'" } ], - "score": 1.993437954, + "score": 1.992494322, "source_file": "backend/src/main/java/com/magistr/app/config/tenant/TenantConfigWatcher.java", "status": "preferred", "uses": 3 @@ -243,7 +253,7 @@ "q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?" } ], - "score": 2.011080374, + "score": 2.01012839, "source_file": "backend/src/main/java/com/magistr/app/config/tenant/TenantRoutingDataSource.java", "status": "preferred", "uses": 3 @@ -259,7 +269,7 @@ "q": "Почему в выборе аудитории показаны корпус и этаж?" } ], - "score": 0.830472643, + "score": 0.830079523, "source_file": "backend/src/main/java/com/magistr/app/controller/ClassroomController.java", "status": "tentative", "uses": 1 @@ -275,7 +285,7 @@ "q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?" } ], - "score": 0.660126499, + "score": 0.659814015, "source_file": "backend/src/main/java/com/magistr/app/controller/DatabaseController.java", "status": "tentative", "uses": 1 @@ -296,7 +306,7 @@ "q": "Как безопасно заменить tenant DataSource без потери рабочего подключения?" } ], - "score": 1.350953875, + "score": 1.350314375, "source_file": "backend/src/main/java/com/magistr/app/controller/DatabaseController.java", "status": "preferred", "uses": 2 @@ -312,7 +322,7 @@ "q": "проанализируй весь проект на баги и ошибки и дополни '/mnt/HDD/ProjectMagistr/magistr/BUG_REPORT.md'" } ], - "score": 0.642484079, + "score": 0.642179947, "source_file": "backend/src/main/java/com/magistr/app/controller/GlobalExceptionHandler.java", "status": "tentative", "uses": 1 @@ -333,7 +343,7 @@ "q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?" } ], - "score": 1.48983232, + "score": 1.489127079, "source_file": "backend/src/main/java/com/magistr/app/controller/ScheduleController.java", "status": "preferred", "uses": 2 @@ -349,7 +359,7 @@ "q": "Как безопасно валидировать и сохранять точечные изменения расписания?" } ], - "score": 0.670693319, + "score": 0.670375833, "source_file": "backend/src/main/java/com/magistr/app/controller/ScheduleOverrideController.java", "status": "tentative", "uses": 1 @@ -370,7 +380,7 @@ "q": "проанализируй весь проект на баги и ошибки и дополни '/mnt/HDD/ProjectMagistr/magistr/BUG_REPORT.md'" } ], - "score": 1.317674538, + "score": 1.317050791, "source_file": "backend/src/main/java/com/magistr/app/controller/ScheduleRuleAdminController.java", "status": "preferred", "uses": 2 @@ -386,7 +396,7 @@ "q": "хотим поменять название сервиса, придумай что-то короткое одним словом подходящее по смыслу" } ], - "score": 0.850158824, + "score": 0.849756385, "source_file": "backend/src/main/java/com/magistr/app/model/AcademicCalendar.java", "status": "tentative", "uses": 1 @@ -402,7 +412,7 @@ "q": "Почему в выборе аудитории показаны корпус и этаж?" } ], - "score": 0.830472643, + "score": 0.830079523, "source_file": "backend/src/main/java/com/magistr/app/model/Classroom.java", "status": "tentative", "uses": 1 @@ -418,7 +428,7 @@ "q": "хотим поменять название сервиса, придумай что-то короткое одним словом подходящее по смыслу" } ], - "score": 0.850158824, + "score": 0.849756385, "source_file": "backend/src/main/java/com/magistr/app/model/Department.java", "status": "tentative", "uses": 1 @@ -439,7 +449,7 @@ "q": "Корректны ли inferred-связи вокруг ScheduleRule?" } ], - "score": 1.231225267, + "score": 1.230642443, "source_file": "backend/src/main/java/com/magistr/app/model/ScheduleRule.java", "status": "preferred", "uses": 2 @@ -455,7 +465,7 @@ "q": "Какие связи затрагивает полная валидация правил расписания в исправлении №7?" } ], - "score": 0.675190459, + "score": 0.674870845, "source_file": "backend/src/main/java/com/magistr/app/model/ScheduleRuleSlot.java", "status": "tentative", "uses": 1 @@ -476,7 +486,7 @@ "q": "в дополнительные фильры просмотра расписаний нужно добавить выбор семестра" } ], - "score": 1.679864645, + "score": 1.679069449, "source_file": "backend/src/main/java/com/magistr/app/model/Semester.java", "status": "preferred", "uses": 2 @@ -492,7 +502,7 @@ "q": "хотим поменять название сервиса, придумай что-то короткое одним словом подходящее по смыслу" } ], - "score": 0.850158824, + "score": 0.849756385, "source_file": "backend/src/main/java/com/magistr/app/model/StudentGroup.java", "status": "tentative", "uses": 1 @@ -508,7 +518,7 @@ "q": "Какие связи затрагивает полная валидация правил расписания в исправлении №7?" } ], - "score": 0.675190459, + "score": 0.674870845, "source_file": "backend/src/main/java/com/magistr/app/repository/SemesterRepository.java", "status": "tentative", "uses": 1 @@ -529,7 +539,7 @@ "q": "Как безопасно валидировать и сохранять точечные изменения расписания?" } ], - "score": 1.50039914, + "score": 1.499688898, "source_file": "backend/src/main/java/com/magistr/app/service/ScheduleQueryService.java", "status": "preferred", "uses": 2 @@ -545,7 +555,7 @@ "q": "Корректны ли inferred-связи вокруг ScheduleRule?" } ], - "score": 0.556034807, + "score": 0.555771598, "source_file": "backend/src/test/java/com/magistr/app/model/ScheduleRuleTest.java", "status": "tentative", "uses": 1 @@ -561,7 +571,7 @@ "q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?" } ], - "score": 0.660126499, + "score": 0.659814015, "source_file": "compose.yaml", "status": "tentative", "uses": 1 @@ -577,7 +587,7 @@ "q": "новая схема на проде на удалённом сервере создана через CREATE SCHEMA public. я проверил, давай дальше" } ], - "score": 0.998266566, + "score": 0.997794018, "source_file": "compose.yaml", "status": "tentative", "uses": 1 @@ -593,16 +603,21 @@ "q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?" } ], - "score": 0.997748712, + "score": 0.997276409, "source_file": "docs/DATABASE.md", "status": "tentative", "uses": 1 }, "docs_infrastructure_gitea_actions_cicd": { - "code_fingerprint": "710cfffbe78ceeac834c0ad6e1c2107b1c55772a142c461fd9ef3787e9f97ace", + "code_fingerprint": "038c159537c77b4bfe631532511e807aac2677f3a26d722cdc9048402cf58f4b", "label": "CI/CD Gitea Actions в инфраструктуре", - "last": "2026-07-29T21:27:26.637336+00:00", + "last": "2026-07-29T21:50:22.465033+00:00", "provenance": [ + { + "date": "2026-07-29T21:50:22.465033+00:00", + "outcome": "useful", + "q": "Проверить backend на HIGH и CRITICAL уязвимости: context deadline exceeded после загрузки Trivy DB" + }, { "date": "2026-07-29T21:27:26.637336+00:00", "outcome": "useful", @@ -614,13 +629,13 @@ "q": "The goal you specified requires a project to execute but there is no POM in this directory (/workspace)." } ], - "score": 1.998587492, + "score": 2.997218887, "source_file": "docs/INFRASTRUCTURE.md", "status": "preferred", - "uses": 2 + "uses": 3 }, "docs_infrastructure_jwt_secret_policy": { - "code_fingerprint": "710cfffbe78ceeac834c0ad6e1c2107b1c55772a142c461fd9ef3787e9f97ace", + "code_fingerprint": "038c159537c77b4bfe631532511e807aac2677f3a26d722cdc9048402cf58f4b", "label": "Политика JWT-секрета", "last": "2026-07-29T20:12:38.880629+00:00", "provenance": [ @@ -635,13 +650,13 @@ "q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?" } ], - "score": 1.996232691, + "score": 1.995287736, "source_file": "docs/INFRASTRUCTURE.md", "status": "preferred", "uses": 2 }, "docs_infrastructure_kubernetes_production": { - "code_fingerprint": "710cfffbe78ceeac834c0ad6e1c2107b1c55772a142c461fd9ef3787e9f97ace", + "code_fingerprint": "038c159537c77b4bfe631532511e807aac2677f3a26d722cdc9048402cf58f4b", "label": "Production-инфраструктура Kubernetes", "last": "2026-07-29T20:12:38.880629+00:00", "provenance": [ @@ -661,13 +676,13 @@ "q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?" } ], - "score": 2.994499257, + "score": 2.993081754, "source_file": "docs/INFRASTRUCTURE.md", "status": "preferred", "uses": 3 }, "docs_infrastructure_tenants_configmap": { - "code_fingerprint": "710cfffbe78ceeac834c0ad6e1c2107b1c55772a142c461fd9ef3787e9f97ace", + "code_fingerprint": "038c159537c77b4bfe631532511e807aac2677f3a26d722cdc9048402cf58f4b", "label": "Tenants ConfigMap", "last": "2026-07-29T19:26:44.188240+00:00", "provenance": [ @@ -677,7 +692,7 @@ "q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?" } ], - "score": 0.997748712, + "score": 0.997276409, "source_file": "docs/INFRASTRUCTURE.md", "status": "tentative", "uses": 1 @@ -693,7 +708,7 @@ "q": "Проверить опубликованные образы: backend Trivy HIGH/CRITICAL scan завершился exitcode 1" } ], - "score": 0.999682985, + "score": 0.999209766, "source_file": "", "status": "tentative", "uses": 1 diff --git a/graphify-out/memory/query_20260729_222222_проверить_frontend_на_high_и_critical_уязвимости.md b/graphify-out/memory/query_20260729_222222_проверить_frontend_на_high_и_critical_уязвимости.md new file mode 100644 index 0000000..7c6d6d2 --- /dev/null +++ b/graphify-out/memory/query_20260729_222222_проверить_frontend_на_high_и_critical_уязвимости.md @@ -0,0 +1,24 @@ +--- +type: "query" +date: "2026-07-29T22:22:22.155742+00:00" +question: "Проверить frontend на HIGH и CRITICAL уязвимости: 8 HIGH в Alpine runtime" +contributor: "graphify" +outcome: "useful" +source_nodes: ["Workflow сборки и публикации Docker-образов", "Pipeline frontend-образа", "CI/CD Gitea Actions в инфраструктуре"] +--- + +# Q: Проверить frontend на HIGH и CRITICAL уязвимости: 8 HIGH в Alpine runtime + +## Answer + +Expanded from original query via graph vocab: [build, container, docker, frontend, gitea, pipeline, registry, workflow]. Traversal вывел Workflow сборки и публикации Docker-образов и Pipeline frontend-образа; фактическая причина проверена по frontend/Dockerfile и Trivy-логу. В финальном httpd:alpine 3.23.4 найдены 8 исправимых HIGH: c-ares, libcrypto3/libssl3, libcurl и libexpat. В runtime-stage добавлен RUN apk upgrade --no-cache. Локальная Docker-сборка подтвердила обновление ровно до fixed versions из отчёта: c-ares 1.34.8-r0, OpenSSL 3.5.7-r0, libcurl 8.20.0-r0, libexpat 2.8.2-r0, Alpine 3.23.5. Supply-chain regression gates и frontend 11/11 прошли. Отдельный локальный Trivy-процесс не стартовал из-за таймаута механизма разрешений Docker socket; окончательный scan выполняет новый CI-run. + +## Outcome + +- Signal: useful + +## Source Nodes + +- Workflow сборки и публикации Docker-образов +- Pipeline frontend-образа +- CI/CD Gitea Actions в инфраструктуре \ No newline at end of file diff --git a/graphify-out/reflections/LESSONS.md b/graphify-out/reflections/LESSONS.md index e2ad9ae..05d1e56 100644 --- a/graphify-out/reflections/LESSONS.md +++ b/graphify-out/reflections/LESSONS.md @@ -1,21 +1,22 @@ # Lessons -_Auto-generated by `graphify reflect` from 17 session memories in graphify-out/memory/. Deterministic; no LLM. Use for orientation — verify before relying, and revisit dead ends if the code has changed since._ +_Auto-generated by `graphify reflect` from 18 session memories in graphify-out/memory/. Deterministic; no LLM. Use for orientation — verify before relying, and revisit dead ends if the code has changed since._ ## Summary -- 16 useful · 1 dead ends · 0 corrected · 0 unmarked +- 17 useful · 1 dead ends · 0 corrected · 0 unmarked ## Lessons **Preferred sources** — corroborated by ≥2 useful results; start here. -- `Workflow сборки и публикации Docker-образов` (5× useful) +- `Workflow сборки и публикации Docker-образов` (6× useful) +- `CI/CD Gitea Actions в инфраструктуре` (3× useful) +- `Pipeline backend-образа` (3× useful) - `Production-инфраструктура Kubernetes` (3× useful) - `ScheduleGeneratorService` (3× useful) - `TenantRoutingDataSource` (3× useful) -- `CI/CD Gitea Actions в инфраструктуре` (2× useful) -- `Pipeline backend-образа` (2× useful) +- `Pipeline frontend-образа` (2× useful) - `Политика JWT-секрета` (2× useful) - `TenantConfigWatcher` (3× useful) - `AuthorizationInterceptor` (3× useful) @@ -29,7 +30,6 @@ _Auto-generated by `graphify reflect` from 17 session memories in graphify-out/m **Tentative** — useful in fewer than 2 results; verify before relying. - `SpringBootApplication` (1× useful) -- `Pipeline frontend-образа` (1× useful) - `Job деплоя в Kubernetes` (1× useful) - `PostgreSQL-сервис Docker Compose` (1× useful) - `Flyway-миграции` (1× useful) diff --git a/scripts/check-artifact-pinning.sh b/scripts/check-artifact-pinning.sh index 7f2236e..0294fde 100755 --- a/scripts/check-artifact-pinning.sh +++ b/scripts/check-artifact-pinning.sh @@ -142,13 +142,17 @@ check_downloaded_backend_artifact() { fi } -check_backend_runtime_updates() { - local dockerfile="$PROJECT_ROOT/backend/Dockerfile" +check_runtime_updates() { + local component + local dockerfile - require_file "$dockerfile" || return - if ! grep -Fq 'RUN apk upgrade --no-cache' "$dockerfile"; then - fail "runtime-образ backend должен устанавливать доступные исправления Alpine" - fi + for component in backend frontend; do + dockerfile="$PROJECT_ROOT/$component/Dockerfile" + require_file "$dockerfile" || continue + if ! grep -Fq 'RUN apk upgrade --no-cache' "$dockerfile"; then + fail "runtime-образ $component должен устанавливать доступные исправления Alpine" + fi + done } check_testcontainer_images() { @@ -188,7 +192,7 @@ check_compose_images check_actions check_workflow_gates check_downloaded_backend_artifact -check_backend_runtime_updates +check_runtime_updates check_testcontainer_images check_optional_kubernetes_images diff --git a/scripts/test-artifact-pinning.sh b/scripts/test-artifact-pinning.sh index 59b13dc..6f6272c 100755 --- a/scripts/test-artifact-pinning.sh +++ b/scripts/test-artifact-pinning.sh @@ -42,11 +42,18 @@ cp "$ROOT_DIR/.gitea/workflows/docker-build.yaml" \ "$FIXTURE_DIR/.gitea/workflows/docker-build.yaml" sed -i '/RUN apk upgrade --no-cache/d' "$FIXTURE_DIR/backend/Dockerfile" if PROJECT_ROOT="$FIXTURE_DIR" bash "$CHECK_SCRIPT" >/dev/null 2>&1; then - printf 'Ошибка теста: отсутствие Alpine security updates не было отклонено\n' >&2 + printf 'Ошибка теста: отсутствие Alpine security updates в backend не было отклонено\n' >&2 exit 1 fi cp "$ROOT_DIR/backend/Dockerfile" "$FIXTURE_DIR/backend/Dockerfile" +sed -i '/RUN apk upgrade --no-cache/d' "$FIXTURE_DIR/frontend/Dockerfile" +if PROJECT_ROOT="$FIXTURE_DIR" bash "$CHECK_SCRIPT" >/dev/null 2>&1; then + printf 'Ошибка теста: отсутствие Alpine security updates во frontend не было отклонено\n' >&2 + exit 1 +fi + +cp "$ROOT_DIR/frontend/Dockerfile" "$FIXTURE_DIR/frontend/Dockerfile" cp "$ROOT_DIR/.gitea/workflows/docker-build.yaml" \ "$FIXTURE_DIR/.gitea/workflows/docker-build.yaml" sed -i '0,/image --timeout 15m --scanners vuln/{s/image --timeout 15m --scanners vuln/image --scanners vuln/;}' \