#!/bin/sh set -euo pipefail # #region docker.frontend.entrypoint [C:3] [TYPE Module] [SEMANTICS docker,nginx,entrypoint,certs,ssl] # @BRIEF Entrypoint для nginx-контейнера — установка корп. CA-сертификатов в Alpine, # авто-выбор HTTP или SSL конфига в зависимости от наличия server.crt + server.key. # @PRE /opt/certs смонтирован (может быть пуст). Системные пакеты: ca-certificates, openssl. # @POST Если найдены server.crt + server.key — активирован SSL конфиг. # CA-сертификаты из /opt/certs установлены в системное хранилище Alpine. # @SIDE_EFFECT Модифицирует /usr/local/share/ca-certificates/; перезаписывает nginx конфиг. # @LAYER Infrastructure # @RELATION DEPENDS_ON -> [docker/nginx.conf] # @RELATION DEPENDS_ON -> [docker/nginx.ssl.conf] # @INVARIANT Порт 80 всегда активен (HTTP или редирект на HTTPS). # @INVARIANT Если нет server.crt — используется HTTP-only конфиг. # #endregion docker.frontend.entrypoint # ====================================================================== # install_ca_certificates — корпоративные CA в Alpine # ====================================================================== # #region docker.frontend.entrypoint.install_ca_certificates [C:2] [TYPE Function] # @BRIEF Устанавливает .crt файлы из /opt/certs в системное хранилище Alpine. # @PRE /opt/certs может быть пуст или не существовать. # @POST Сертификаты скопированы в /usr/local/share/ca-certificates/ и добавлены в trust. install_ca_certificates() { local certs_dir="${CERTS_PATH:-/opt/certs}" if [ ! -d "$certs_dir" ]; then echo "[entrypoint] CERTS_PATH=${certs_dir} не существует — пропускаем CA-сертификаты" return 0 fi local count=0 for cert in "$certs_dir"/*.crt "$certs_dir"/*.pem; do [ -f "$cert" ] || continue # Не копируем server.crt — он для nginx, не для CA case "$(basename "$cert")" in server.crt|server.key) continue ;; esac cp -v "$cert" /usr/local/share/ca-certificates/ 2>&1 | sed 's/^/[entrypoint] /' count=$((count + 1)) done if [ "$count" -gt 0 ]; then echo "[entrypoint] Обновляем CA-сертификаты Alpine..." update-ca-certificates 2>&1 | sed 's/^/[entrypoint] /' echo "[entrypoint] ✅ Установлено ${count} корпоративных CA-сертификатов" else echo "[entrypoint] Нет CA-сертификатов для установки" fi } # #endregion docker.frontend.entrypoint.install_ca_certificates # ====================================================================== # select_nginx_config — выбор HTTP vs SSL # ====================================================================== # #region docker.frontend.entrypoint.select_nginx_config [C:2] [TYPE Function] # @BRIEF Определяет, есть ли сертификаты для SSL, и копирует нужный nginx конфиг. # @PRE /opt/certs/server.crt и /opt/certs/server.key — опциональные SSL-сертификаты. # @POST Если есть оба файла — /etc/nginx/ssl/ создан, server.crt/key скопированы, # используется nginx.ssl.conf. Иначе — nginx.conf (HTTP-only). select_nginx_config() { local certs_dir="${CERTS_PATH:-/opt/certs}" local ssl_cert="${certs_dir}/server.crt" local ssl_key="${certs_dir}/server.key" local ssl_dir="/etc/nginx/ssl" if [ -f "$ssl_cert" ] && [ -f "$ssl_key" ]; then echo "[entrypoint] Найдены SSL-сертификаты — включаем HTTPS" mkdir -p "$ssl_dir" cp "$ssl_cert" "${ssl_dir}/server.crt" cp "$ssl_key" "${ssl_dir}/server.key" # Копируем SSL-конфиг nginx cp /docker/nginx.ssl.conf /etc/nginx/conf.d/default.conf echo "[entrypoint] ✅ SSL терминация активирована на порту 443" else echo "[entrypoint] SSL-сертификаты не найдены — используем HTTP-only режим" echo "[entrypoint] Чтобы включить HTTPS, положите в ${certs_dir}:" echo "[entrypoint] server.crt — SSL сертификат" echo "[entrypoint] server.key — приватный ключ" cp /docker/nginx.conf /etc/nginx/conf.d/default.conf fi } # #endregion docker.frontend.entrypoint.select_nginx_config install_ca_certificates select_nginx_config echo "[entrypoint] Starting nginx..." exec "$@"