Переносит рабочие правки продакшен-сервера в репозиторий воспроизводимо: - 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 (сейчас не используются кодом, оставлены про запас).
36 lines
2.1 KiB
Bash
Executable File
36 lines
2.1 KiB
Bash
Executable File
#!/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"
|