fix: QA findings — Dockerfile #endregion dedup, @RATIONALE, grep -qF

- Removed duplicate #endregion in backend.Dockerfile (P6 critical)
- Added @RATIONALE and @REJECTED to install_ca_to_nss and install_llm_ca_certs
- Changed grep -q to grep -qF in install_llm_ca_certs validation
This commit is contained in:
2026-05-27 16:12:37 +03:00
parent ce49760e5a
commit 040d333d7d
2 changed files with 21 additions and 2 deletions

View File

@@ -5,7 +5,6 @@
# @RELATION DEPENDS_ON -> [EXT:path:backend/requirements.txt] # @RELATION DEPENDS_ON -> [EXT:path:backend/requirements.txt]
# @PRE Docker builder context — корень проекта. backend/ и docker/ доступны. # @PRE Docker builder context — корень проекта. backend/ и docker/ доступны.
# @POST Образ с backend API, Playwright, entrypoint для bootstrap admin и установки сертификатов. # @POST Образ с backend API, Playwright, entrypoint для bootstrap admin и установки сертификатов.
# #endregion docker.backend.Dockerfile
FROM python:3.11-slim FROM python:3.11-slim

View File

@@ -82,6 +82,16 @@ install_certificates() {
# @BRIEF Скачивает PEM/DER-сертификаты из LLM_CA_CERT_URLS, конвертирует DER→PEM, # @BRIEF Скачивает PEM/DER-сертификаты из LLM_CA_CERT_URLS, конвертирует DER→PEM,
# устанавливает в системное хранилище, создаёт хеш-симлинки и при необходимости # устанавливает в системное хранилище, создаёт хеш-симлинки и при необходимости
# добавляет в ca-certificates.crt напрямую (fallback для OpenSSL 3-совместимости). # добавляет в ca-certificates.crt напрямую (fallback для OpenSSL 3-совместимости).
# @RATIONALE DER→PEM конвертация необходима, т.к. update-ca-certificates ожидает
# PEM-формат (-----BEGIN CERTIFICATE-----). Корпоративные PKI часто отдают
# сертификаты в DER (бинарном) формате через HTTP.
# @RATIONALE Хеш-симлинки (hash.0) создаются вручную, т.к. update-ca-certificates
# в Debian Bookworm (python:3.11-slim) иногда пропускает создание ссылок для
# сертификатов из поддиректорий. Fallback cat в ca-certificates.crt гарантирует
# что OpenSSL 3.x увидит сертификаты даже если update-ca-certificates их пропустит.
# @REJECTED Вариант "только контейнерный volume с .crt файлами" отвергнут —
# требует ручного копирования сертификатов на хост перед запуском.
# URL-based подход позволяет централизованно управлять сертификатами через PKI.
# @PRE LLM_CA_CERT_URLS — строка с URL через пробел; curl и openssl установлены. # @PRE LLM_CA_CERT_URLS — строка с URL через пробел; curl и openssl установлены.
# @POST Сертификаты доступны в /etc/ssl/certs/ca-certificates.crt. # @POST Сертификаты доступны в /etc/ssl/certs/ca-certificates.crt.
# Хеш-симлинки созданы для каждого сертификата. # Хеш-симлинки созданы для каждого сертификата.
@@ -180,7 +190,7 @@ install_llm_ca_certs() {
cert_subject="$(openssl x509 -in "$pem" -noout -subject 2>/dev/null | head -1 || echo "unknown")" cert_subject="$(openssl x509 -in "$pem" -noout -subject 2>/dev/null | head -1 || echo "unknown")"
# Проверяем есть ли в ca-certificates.crt # Проверяем есть ли в ca-certificates.crt
if grep -q "$cert_name" /etc/ssl/certs/ca-certificates.crt 2>/dev/null || \ if grep -qF "$cert_name" /etc/ssl/certs/ca-certificates.crt 2>/dev/null || \
grep -qF "$(openssl x509 -in "$pem" -noout -serial 2>/dev/null)" /etc/ssl/certs/ca-certificates.crt 2>/dev/null; then grep -qF "$(openssl x509 -in "$pem" -noout -serial 2>/dev/null)" /etc/ssl/certs/ca-certificates.crt 2>/dev/null; then
echo "[entrypoint] ✅ ${cert_name} — в ca-certificates.crt (${cert_subject})" echo "[entrypoint] ✅ ${cert_name} — в ca-certificates.crt (${cert_subject})"
else else
@@ -288,6 +298,16 @@ install_playwright() {
# @BRIEF Импортирует PEM-сертификаты из /usr/local/share/ca-certificates/ # @BRIEF Импортирует PEM-сертификаты из /usr/local/share/ca-certificates/
# в NSS Shared DB (~/.pki/nssdb), чтобы Chromium (Playwright) доверял # в NSS Shared DB (~/.pki/nssdb), чтобы Chromium (Playwright) доверял
# корпоративным CA (исправляет ERR_CERT_AUTHORITY_INVALID). # корпоративным CA (исправляет ERR_CERT_AUTHORITY_INVALID).
# @RATIONALE Playwright's Chromium использует NSS Shared DB (~/.pki/nssdb)
# для CA trust, отдельно от системного OpenSSL bundle. update-ca-certificates
# добавляет сертификаты в /etc/ssl/certs/, но Chromium их не видит.
# certutil -A -t "C,," импортирует PEM как доверенный CA для TLS.
# @RATIONALE NSS импорт выполняется после install_llm_ca_certs (скачивает .pem)
# и update-ca-certificates (устанавливает в систему), но перед
# install_playwright (который может запустить Chromium). Этот порядок
# гарантирует, что PEM-файлы уже есть на диске до создания NSS DB.
# @REJECTED Использование Playwright --ignore-certificate-errors отвергнуто —
# отключает ВСЕ SSL проверки глобально, а не только для корп. CA.
# @PRE certutil (libnss3-tools) установлен. PEM-файлы есть в target_dirs. # @PRE certutil (libnss3-tools) установлен. PEM-файлы есть в target_dirs.
# @POST Сертификаты добавлены в NSS базу Chromium с trust-атрибутами "C,,". # @POST Сертификаты добавлены в NSS базу Chromium с trust-атрибутами "C,,".
# @SIDE_EFFECT Создаёт ~/.pki/nssdb/ если не существовал. # @SIDE_EFFECT Создаёт ~/.pki/nssdb/ если не существовал.