# Блок безопасности: добавляем HTTP-заголовки защиты
header {
# HSTS: заставляем браузер всегда использовать HTTPS (на 2 года)
Strict-Transport-Security "max-age=63072000"
# Запрет на "угадывание" MIME-типа (защита от XSS)
X-Content-Type-Options "nosniff"
# Защита от кликджекинга (запрет встраивания сайта во фреймы)
X-Frame-Options "DENY"
# Защита от старых типов XSS-атак
X-XSS-Protection "1; mode=block"
}
}
```
Шаг 2. Многоступенчатая сборка Docker
Главная цель Dockerfile в этом сценарии — создать минимальный по размеру образ. Мы разделим процесс на два этапа:Builder(где крутится Node.js и собирается сайт) иRuntime(где работает только легкий Alpine Linux и Caddy).
Создайте файл Dockerfile:
```
# ==========================================
# ЭТАП 1: Сборка (Builder)
# ==========================================
FROM node:24-slim AS builder
WORKDIR /app
# Копируем только манифесты зависимостей.
# Это позволяет кэшировать слой npm ci в Docker.
COPY package*.json ./
# Используем npm ci вместо install для строгого соответствия package-lock
RUN npm ci
# Копируем исходники (в примере VitePress, папка docs) и запускаем билд
COPY docs ./docs
RUN npm run docs:build
# Результат сборки появится в /app/docs/.vitepress/dist
# ==========================================
# ЭТАП 2: Продакшен (Runtime)
# ==========================================
FROM alpine:3.23.5
# Устанавливаем Caddy. Флаг --no-cache экономит место на диске.
RUN apk add --no-cache caddy
# Копируем ТОЛЬКО собранные статические файлы из этапа builder
# Исходники, node_modules и исходный код проекта остаются за бортом!
COPY --from=builder /app/docs/.vitepress/dist /usr/share/caddy
# Копируем конфигурационный файл сервера
COPY Caddyfile /etc/caddy/Caddyfile
# Открываем стандартные порты для веба
EXPOSE 80 443
# Запускаем Caddy с указанием конфига и адаптера
CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
```
Шаг 3. Оркестрация через Docker Compose
Для удобного управления контейнером, сетями и томами (volumes) используем docker-compose. Это позволит легко запускать и останавливать сервис одной командой.
Создайте файл docker-compose.yml:
```
version: "3.8"
services:
caddy: