yavsc/Dockerfile
Paul Schneider abc507c0f3
dockerfile: drop inline 'dotnet nuget add source isn.pschneider.fr'
The project-level NuGet.config (added in 94012c51) lists the isn feed
so 'dotnet restore' picks it up without an inline 'dotnet nuget add
source' step.

The inline add source was duplicating NuGet.config and causing build
failures in GitHub Actions:
  - The --allow-insecure-connections flag did not match the actual
    HTTPS deployment of isn.pschneider.fr (Letsencrypt-issued cert,
    not self-signed), making the step fail with 'exit code 1'.
  - docker build --target build-env (used by
    .github/workflows/docker-publish-android.yml) hit this on every
    run.

Both Dockerfile and Dockerfile.backend had the same redundant step;
both removed. 'dotnet restore' still finds the feed via NuGet.config
at /src/NuGet.config (copied in by 'COPY . .').
2026-08-16 14:09:11 +01:00

136 lines
6.1 KiB
Docker

# =====================================================================
# Dockerfile multi-stage pour Yavsc
# =====================================================================
#
# Image de base : pazof/yavsc-build-env:<tag>, construite depuis le repo
# sibling dotnet-android-build-image (Debian 12 + .NET 10 + Android SDK 36
# + workload .NET Android). Le tag est bumpé en lockstep ici, dans
# Dockerfile.backend, et dans docker-compose.yaml.
#
# Stages :
# build-env (par défaut) — restore + build + publish, sert aussi
# pour extraire l'APK Android via
# .github/workflows/docker-publish-android.yml
# publish-org — copie minimale du publish Yavsc.Org
# publish-api — copie minimale du publish Yavsc.Api
# publish-blogs — copie minimale du publish Yavsc.Blogs
# web-runtime — image ASP.NET pour le front web (port 5000)
# api-runtime — image ASP.NET pour l'API REST (port 5002)
# blogs-runtime — image ASP.NET pour le backend blogs (port 5004)
#
# docker-compose.yaml cible les stages web-runtime / api-runtime /
# blogs-runtime via `target:`. Le stage par défaut reste build-env
# pour la compat avec le workflow APK.
# =====================================================================
# syntax=docker/dockerfile:1.7
ARG BUILD_ENV_TAG=debian12-dotnet10-android36-v1
FROM pazof/yavsc-build-env:${BUILD_ENV_TAG} AS build-env
WORKDIR /src
# (1) Manifest + fichiers de projet pour le cache de restore
COPY *.sln ./
COPY Directory.*.props ./
COPY src/Yavsc.Org/*.csproj ./src/Yavsc.Org/
COPY src/Yavsc.Abstract/*.csproj ./src/Yavsc.Abstract/
COPY src/Yavsc.Server/*.csproj ./src/Yavsc.Server/
COPY src/Yavsc.Api/*.csproj ./src/Yavsc.Api/
COPY src/Yavsc.Blogs/*.csproj ./src/Yavsc.Blogs/
COPY src/cli/*.csproj ./src/cli/
COPY src/Yavsc.Org.Tests/*.csproj ./src/Yavsc.Org.Tests/
COPY src/PostIt/PostIt/*.csproj ./src/PostIt/PostIt/
COPY src/PostIt/PostIt.Android/*.csproj ./src/PostIt/PostIt.Android/
COPY src/PostIt/PostIt.Browser/*.csproj ./src/PostIt/PostIt.Browser/
COPY src/PostIt/PostIt.Desktop/*.csproj ./src/PostIt/PostIt.Desktop/
# (2) Tout le code source
COPY . .
# (4) Restore
RUN dotnet restore
# (5) Build des trois services web principaux
RUN dotnet build src/Yavsc.Org/Yavsc.Org.csproj -c Release --no-restore -clp:ErrorsOnly
RUN dotnet build src/Yavsc.Api/Yavsc.Api.csproj -c Release --no-restore -clp:ErrorsOnly
RUN dotnet build src/Yavsc.Blogs/Yavsc.Blogs.csproj -c Release --no-restore -clp:ErrorsOnly
# (6) Build APK Android (utilisé par le workflow docker-publish-android).
ARG ANDROID_TARGET_RID=android-arm64
RUN dotnet build src/PostIt/PostIt.Android/PostIt.Android.csproj -c Release --no-restore -clp:ErrorsOnly -r ${ANDROID_TARGET_RID}
# (7) Publish des trois services web (les artifacts sont consommés par
# les stages publish-org / publish-api / publish-blogs ci-dessous).
RUN mkdir -p /app/publish
RUN dotnet publish src/Yavsc.Org/Yavsc.Org.csproj -c Release --no-build -o /app/publish/Yavsc.Org
RUN dotnet publish src/Yavsc.Api/Yavsc.Api.csproj -c Release --no-build -o /app/publish/Yavsc.Api
RUN dotnet publish src/Yavsc.Blogs/Yavsc.Blogs.csproj -c Release --no-build -o /app/publish/Yavsc.Blogs
# Stage par défaut : on laisse l'image utilisable comme build-env
# (utilisé par docker-publish-android.yml qui extrait l'APK).
CMD ["bash"]
# ---------------------------------------------------------------------
# Stages publish-<service> : isole la copie du publish pour ne pas
# embarquer tout le code source dans l'image runtime.
# ---------------------------------------------------------------------
FROM build-env AS publish-org
COPY --from=build-env /app/publish/Yavsc.Org/ /publish/
FROM build-env AS publish-api
COPY --from=build-env /app/publish/Yavsc.Api/ /publish/
FROM build-env AS publish-blogs
COPY --from=build-env /app/publish/Yavsc.Blogs/ /publish/
# ---------------------------------------------------------------------
# Stages runtime : images ASP.NET minimales.
#
# appsettings-org.json est injecté via BuildKit secret mount
# (`docker build --secret id=yavsc_appsettings`). En production le
# secret est fourni par le store CI ; en dev local c'est le fichier
# src/Yavsc.Org/appsettings-org.json passé via docker-compose.yaml.
#
# Pour activer HTTPS en prod : monter /etc/letsencrypt en volume et
# renseigner Kestrel:Certificates dans appsettings-org.json. Voir
# CONTRIBUTING.md.
# ---------------------------------------------------------------------
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS web-runtime
WORKDIR /app
COPY --from=publish-org /publish/ ./
RUN --mount=type=secret,id=yavsc_appsettings,dst=/run/secrets/yavsc_appsettings \
cp /run/secrets/yavsc_appsettings /app/appsettings-org.json \
&& chmod 0644 /app/appsettings-org.json
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_URLS=http://+:5000
EXPOSE 5000
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD wget --quiet --spider http://localhost:5000/ || exit 1
ENTRYPOINT ["dotnet", "Yavsc.Org.dll"]
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS api-runtime
WORKDIR /app
COPY --from=publish-api /publish/ ./
RUN --mount=type=secret,id=yavsc_appsettings,dst=/run/secrets/yavsc_appsettings \
cp /run/secrets/yavsc_appsettings /app/appsettings-org.json \
&& chmod 0644 /app/appsettings-org.json
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_URLS=http://+:5002
EXPOSE 5002
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD wget --quiet --spider http://localhost:5002/ || exit 1
ENTRYPOINT ["dotnet", "Yavsc.Api.dll"]
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS blogs-runtime
WORKDIR /app
COPY --from=publish-blogs /publish/ ./
RUN --mount=type=secret,id=yavsc_appsettings,dst=/run/secrets/yavsc_appsettings \
cp /run/secrets/yavsc_appsettings /app/appsettings-org.json \
&& chmod 0644 /app/appsettings-org.json
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_URLS=http://+:5004
EXPOSE 5004
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD wget --quiet --spider http://localhost:5004/ || exit 1
ENTRYPOINT ["dotnet", "Yavsc.Blogs.dll"]