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
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>
47 lines
2.3 KiB
Docker
47 lines
2.3 KiB
Docker
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"]
|