yavsc/Dockerfile

140 lines
6.3 KiB
Text
Raw Normal View History

# =====================================================================
# 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.
# =====================================================================
2026-06-07 06:05:52 +01:00
# 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
2026-06-07 06:05:52 +01:00
# (1) Manifest + fichiers de projet pour le cache de restore
2026-06-07 06:05:52 +01:00
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/
2026-06-19 20:07:05 +01:00
COPY src/Yavsc.Org.Tests/*.csproj ./src/Yavsc.Org.Tests/
2026-06-07 06:05:52 +01:00
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
2026-06-07 07:35:42 +01:00
COPY . .
# (3) Source NuGet interne (Letsencrypt, certificat auto-signé côté
# serveur, justifié par build privé).
2026-07-06 03:26:57 +01:00
RUN dotnet nuget add source https://isn.pschneider.fr/api/v3/index.json --allow-insecure-connections
2026-06-07 06:05:52 +01:00
# (4) Restore
2026-06-07 07:20:47 +01:00
RUN dotnet restore
2026-06-07 06:05:52 +01:00
# (5) Build des trois services web principaux
2026-06-07 12:41:59 +01:00
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
2026-06-07 12:34:44 +01:00
# (6) Build APK Android (utilisé par le workflow docker-publish-android).
ARG ANDROID_TARGET_RID=android-arm64
2026-06-07 12:57:41 +01:00
RUN dotnet build src/PostIt/PostIt.Android/PostIt.Android.csproj -c Release --no-restore -clp:ErrorsOnly -r ${ANDROID_TARGET_RID}
2026-06-07 06:05:52 +01:00
# (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).
2026-06-07 06:05:52 +01:00
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"]