food-market/deploy/Dockerfile.api
nns 0ff93b6daa
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
fix(hotfix): Claude CLI via ssh на dev-vm + не хранить фото накладных
Owner caught (повторно, после фикса 500): контейнер stage-api пытался
запустить "claude" в своём cwd (/app), а binary там нет —
"No such file or directory". Включаем RemoteHost SSH:

1. ClaudeCliInvoiceExtractor: передаёт в ssh/scp опции -i <SshKey>,
   -o StrictHostKeyChecking=accept-new, -o UserKnownHostsFile=<SshKnownHosts>,
   -o BatchMode=yes, -o ConnectTimeout=10. Конфиги Invoices:ClaudeCli:SshKey
   и Invoices:ClaudeCli:SshKnownHosts.
2. deploy/Dockerfile.api: + openssh-client в runtime.
3. (compose + ssh-ключ на prod-vm не в репо: deploy/secrets/invoice-ocr-key,
   authorized_keys на dev-vm с from="192.168.1.190",no-pty,no-forwarding;
   env RemoteHost=nns@192.168.1.192, Executable=/home/nns/.local/bin/claude.)

Owner-policy: фото/сканы накладных НЕ хранить на серверах. InvoiceProcessor
удаляет StoredPath сразу после распознавания — успех и неудача; remote
tmp копия на dev-vm подчищается в finally. InvoiceWorker больше не содержит
sweeper (периодическая очистка не нужна), конфиг Invoices:KeepFilesDays
игнорируется (оставлен в комментарии для backwards compat).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-05 00:51:12 +05:00

47 lines
2.3 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.

ARG LOCAL_REGISTRY=127.0.0.1:5001
FROM ${LOCAL_REGISTRY}/mirror/dotnet-sdk:8.0 AS build
WORKDIR /src
COPY food-market.sln global.json Directory.Build.props Directory.Packages.props ./
COPY src/food-market.domain/food-market.domain.csproj src/food-market.domain/
COPY src/food-market.shared/food-market.shared.csproj src/food-market.shared/
COPY src/food-market.application/food-market.application.csproj src/food-market.application/
COPY src/food-market.infrastructure/food-market.infrastructure.csproj src/food-market.infrastructure/
COPY src/food-market.api/food-market.api.csproj src/food-market.api/
COPY src/food-market.pos.core/food-market.pos.core.csproj src/food-market.pos.core/
COPY src/food-market.pos/food-market.pos.csproj src/food-market.pos/
COPY src/ src/
# Single-step restore + publish — раздельные шаги в multi-stage cache
# роняли publish с NETSDK1064 (Microsoft.CodeAnalysis.Analyzers 3.3.3 not
# found) когда в csproj добавлялись новые transitive analyzer-зависимости,
# а первый restore не покрывал их. Теперь restore выполняется внутри publish.
RUN dotnet publish src/food-market.api/food-market.api.csproj -c Release -o /app
FROM ${LOCAL_REGISTRY}/mirror/dotnet-aspnet:8.0 AS runtime
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends curl openssh-client \
&& rm -rf /var/lib/apt/lists/*
COPY --from=build /app .
# Sprint 17: CHANGELOG.md в content-root → WhatsNewController читает его на каждый /api/whats-new.
COPY CHANGELOG.md ./CHANGELOG.md
# VERSION файл создаётся deploy-скриптом (или CI) непосредственно перед docker
# build'ом — содержит короткий SHA коммита. Если отсутствует — fallback на
# AssemblyInformationalVersion. Поэтому COPY с || true (Dockerfile не имеет
# опц-COPY, делаем через RUN с проверкой).
ARG GIT_SHA=dev
RUN echo "$GIT_SHA" > VERSION
ENV ASPNETCORE_URLS=http://+:8080
ENV ASPNETCORE_ENVIRONMENT=Production
ENV DOTNET_NOLOGO=1
ENV DOTNET_CLI_TELEMETRY_OPTOUT=1
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s \
CMD curl -fsS http://localhost:8080/health/ready || exit 1
ENTRYPOINT ["dotnet", "foodmarket.Api.dll"]