Files
ss-tools/docker/frontend.entrypoint.sh
2026-05-20 09:59:03 +03:00

95 lines
4.8 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "$@"