Files
vidconf/frontend/Dockerfile
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

48 lines
3.1 KiB
Docker
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.
# syntax=docker/dockerfile:1
# ---------------------------------------------------------------------------
# Образ раздачи фронтенда VidConf: SPA (React + Vite) собирается в статику и
# вкомпилируется в nginx. Конфиг реверс-прокси (проксирование /api, /livekit,
# /media и т.п.) НЕ хранится в образе — он монтируется томом (шаблоном) в
# docker-compose (`./nginx/nginx.conf.template` → entrypoint nginx
# генерирует /etc/nginx/conf.d/default.conf), чтобы правки прокси не требовали
# пересборки фронта. Здесь только статика.
#
# Фронт обращается к API по ОТНОСИТЕЛЬНЫМ путям (`/api/v1`, `/api/health` —
# см. frontend/src/api/client.ts), поэтому build-time переменные окружения
# (VITE_*) не нужны: собранная статика ходит на /api своего origin, который
# nginx проксирует на backend. LiveKit URL фронт тоже получает в рантайме от
# backend (join.livekit_url ← LIVEKIT_PUBLIC_URL), а не из build-time env —
# ARG/ENV ниже сейчас ни на что не влияют (в исходниках frontend/src нет ни
# одной ссылки на import.meta.env.VITE_LIVEKIT_URL), приняты для совместимости
# на случай, если фронтенд когда-нибудь начнёт их читать на build-time.
# ---------------------------------------------------------------------------
# --- Стадия сборки: Vite/React/TS → статика в /app/dist ---
FROM node:22-alpine AS build
WORKDIR /app
# Сначала манифесты зависимостей — отдельным слоем ради кэша: пересборка src
# не инвалидирует установленные node_modules, пока package*.json не менялись.
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
# `npm run build` = `tsc -b && vite build` (см. package.json) → /app/dist
ARG VITE_LIVEKIT_URL
ENV VITE_LIVEKIT_URL=${VITE_LIVEKIT_URL}
ARG NEXT_PUBLIC_LIVEKIT_URL
ENV NEXT_PUBLIC_LIVEKIT_URL=${NEXT_PUBLIC_LIVEKIT_URL}
RUN npm run build
# --- Стадия раздачи: nginx со статикой SPA внутри образа ---
FROM nginx:1.27-alpine
COPY --from=build /app/dist /usr/share/nginx/html
# openssl — для генерации самоподписанного dev-сертификата, если реальный
# Let's Encrypt не смонтирован (см. deploy/nginx/docker-entrypoint-certs.sh,
# который docker-compose.yml монтирует в /docker-entrypoint.d/ — рядом с
# nginx.conf.template: конфиг/скрипты entrypoint'а nginx монтируются томом,
# а не запекаются в образ, чтобы правки не требовали пересборки фронта).
RUN apk add --no-cache openssl