Files
vidconf/deploy/nginx/docker-entrypoint-certs.sh
Max Ronzhin 79003eb56c deploy: harden nginx/coturn/livekit configs (TLS on 443, templates, required secrets)
Переносит рабочие правки продакшен-сервера в репозиторий воспроизводимо:

- nginx: HTTPS-блок на 443 (TLS1.2/1.3, http->https redirect, ACME
  webroot, X-Forwarded-Proto) добавлен в nginx.conf.template. Список
  доменов и имя каталога сертификата — параметры (NGINX_SERVER_NAMES,
  NGINX_CERT_NAME), не хардкод. Рендерится штатным entrypoint'ом образа
  nginx (envsubst-on-templates).
- Самоподписанный dev-сертификат генерируется на старте контейнера
  (docker-entrypoint-certs.sh), если реальный Let's Encrypt не смонтирован
  — иначе `docker compose up` без профиля ломался бы локально без
  реальных сертификатов.
- healthcheck nginx переключён на /healthz (без TLS-редиректа), иначе
  http://127.0.0.1:80/ после добавления 443-редиректа всегда unhealthy.
- coturn/turnserver.conf и livekit/livekit.yaml переведены в *.template —
  оба образа не читают env для статических полей (static-auth-secret,
  use_external_ip/node_ip, webhook.api_key), поэтому реальные файлы
  генерируются перед стартом стека скриптом deploy/render-templates.sh
  (вызывается install.sh). Секреты/IP — только в .env, не в git.
- docker-compose.yml: LIVEKIT_API_KEY/SECRET везде (backend, livekit,
  egress) через ${VAR:?} без небезопасных дефолтов; порт 443 + монтирование
  /etc/letsencrypt (ro) и certbot-webroot у nginx; build-args
  VITE_LIVEKIT_URL/NEXT_PUBLIC_LIVEKIT_URL для frontend (сейчас не
  используются кодом, оставлены про запас).
2026-07-25 21:57:46 +03:00

36 lines
2.1 KiB
Bash
Executable File
Raw 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
# Готовит /etc/nginx/certs/{fullchain,privkey}.pem ДО того, как штатный
# entrypoint официального образа nginx (20-envsubst-on-templates.sh, потом
# сам nginx) прочитает конфиг с `ssl_certificate` (см.
# deploy/nginx/nginx.conf.template). Монтируется томом в docker-compose.yml
# в /docker-entrypoint.d/ (рядом с nginx.conf.template — конфиг и
# entrypoint-скрипты nginx монтируются, а не запекаются в образ, чтобы правки
# не требовали пересборки фронта), где нативный entrypoint nginx исполняет
# все *.sh по алфавиту до старта самого nginx.
#
# Прод: реальный сертификат смонтирован с хоста в /etc/letsencrypt (ro,
# см. docker-compose.yml) — копируем его.
# Dev (docs/deploy/dev-setup.md, `docker compose up` без реальных сертификатов
# Let's Encrypt): каталог пуст/отсутствует — генерируем самоподписанный
# сертификат, чтобы локальный стек стартовал без ручной настройки TLS.
set -e
CERT_NAME="${NGINX_CERT_NAME:-localhost}"
SRC="/etc/letsencrypt/live/${CERT_NAME}"
DEST=/etc/nginx/certs
mkdir -p "$DEST"
if [ -f "$SRC/fullchain.pem" ] && [ -f "$SRC/privkey.pem" ]; then
echo "[nginx-certs] Использую боевой сертификат из $SRC"
cp "$SRC/fullchain.pem" "$DEST/fullchain.pem"
cp "$SRC/privkey.pem" "$DEST/privkey.pem"
else
echo "[nginx-certs] $SRC не найден — генерирую самоподписанный сертификат (ТОЛЬКО для локальной разработки, в проде смонтируйте /etc/letsencrypt)"
openssl req -x509 -nodes -newkey rsa:2048 -days 365 \
-keyout "$DEST/privkey.pem" -out "$DEST/fullchain.pem" \
-subj "/CN=${CERT_NAME}" 2>/dev/null
fi
chmod 644 "$DEST/fullchain.pem" "$DEST/privkey.pem"