diff --git a/deploy/caddy/Caddyfile.dev b/deploy/caddy/Caddyfile.dev new file mode 100644 index 0000000..ce945ff --- /dev/null +++ b/deploy/caddy/Caddyfile.dev @@ -0,0 +1,19 @@ +# Dev-edge «Дейла» (compose.dev.yml, сервис frontend): SPA + /api на core. +# Отличие от prod-Caddyfile: HTTP без TLS и без плейсхолдер-домена — для локального просмотра UI. +# Статика — собранный SPA (Vite) в /srv, неизвестные пути отдают index.html (история браузера). + +:80 { + # API core: /api/* уходит на core:5080 без перезаписи (контракт /api неизменен). + # SSE (/api/events), файлы и QR-SVG проходят reverse_proxy потоково. + handle /api/* { + reverse_proxy core:5080 + } + + handle { + # SPA/ассеты в dev не кэшируем: пересборка фронта должна подхватываться по F5. + header Cache-Control "no-cache" + root * /srv + try_files {path} /index.html + file_server + } +} diff --git a/deploy/compose.dev.yml b/deploy/compose.dev.yml index b4403eb..145c4e2 100644 --- a/deploy/compose.dev.yml +++ b/deploy/compose.dev.yml @@ -254,6 +254,18 @@ services: timeout: 3s retries: 10 + # Фронтенд (SPA) — сборка образа (Vite) и отдача через Caddy; /api → core:5080. UI — http://localhost:8080. + frontend: + build: + context: .. + dockerfile: src/frontend/Dockerfile + container_name: deal-frontend + ports: + - "8080:80" + depends_on: + core: + condition: service_healthy + # Prometheus (профиль observability, этап 12/пакет A) — сбор /metrics всех 4 процессов (:9464) # внутри dev-сети. Подъём: docker compose -f deploy/compose.dev.yml --profile observability up -d. # Конфиг — общий deploy/observability/prometheus.yml (те же имена сервисов и таргеты). UI — 9090. @@ -332,6 +344,56 @@ services: - /:/host/root:ro pid: host + # Loki — хранилище логов (профиль observability), UI/API — :3100. + loki: + image: grafana/loki:3.4.2 + container_name: deal-loki + profiles: ["observability"] + command: -config.file=/etc/loki/loki.yml + ports: + - "3100:3100" + volumes: + - ./observability/loki.yml:/etc/loki/loki.yml:ro + - deal_loki_data:/loki + + # Promtail — сбор docker-логов deal-процессов в Loki (docker.sock, профиль observability). + promtail: + image: grafana/promtail:3.4.2 + container_name: deal-promtail + profiles: ["observability"] + command: -config.file=/etc/promtail/promtail.yml + volumes: + - ./observability/promtail.yml:/etc/promtail/promtail.yml:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - deal_promtail_data:/var/lib/promtail + depends_on: + loki: + condition: service_started + + # Grafana — UI логов/метрик/трейсов (профиль observability), локальный вход admin/admin. + grafana: + image: grafana/grafana:11.5.2 + container_name: deal-grafana + profiles: ["observability"] + environment: + GF_SECURITY_ADMIN_USER: admin + GF_SECURITY_ADMIN_PASSWORD: admin + GF_USERS_ALLOW_SIGN_UP: "false" + GF_AUTH_ANONYMOUS_ENABLED: "false" + ports: + - "3001:3000" + volumes: + - ./observability/grafana/provisioning:/etc/grafana/provisioning:ro + - ./observability/grafana/dashboards:/var/lib/grafana/dashboards:ro + - deal_grafana_data:/var/lib/grafana + depends_on: + loki: + condition: service_started + prometheus: + condition: service_started + tempo: + condition: service_started + volumes: deal_pgdata: deal_minio_data: @@ -340,3 +402,6 @@ volumes: deal_api_data: deal_prometheus_data: deal_tempo_data: + deal_loki_data: + deal_promtail_data: + deal_grafana_data: diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile new file mode 100644 index 0000000..3802337 --- /dev/null +++ b/src/frontend/Dockerfile @@ -0,0 +1,14 @@ +# Фронтенд Deal: сборка SPA (Vite) и отдача статики через Caddy. +# Контекст сборки — корень репозитория (см. deploy/compose.dev.yml: build.context ..). +# /api/* проксируется на core:5080 (см. deploy/caddy/Caddyfile.dev). + +FROM node:24-alpine AS build +WORKDIR /app +COPY src/frontend/package.json src/frontend/package-lock.json ./ +RUN npm ci +COPY src/frontend/ ./ +RUN npm run build + +FROM caddy:2.9.1 +COPY --from=build /app/dist /srv +COPY deploy/caddy/Caddyfile.dev /etc/caddy/Caddyfile