95 lines
4.8 KiB
Bash
95 lines
4.8 KiB
Bash
#!/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 "$@"
|