Files
Encelado/Encelado/Dockerfile
T
Alby96andClaude Fable 5.1 d7559d36a5 5.0 Fase 8: immagine Docker come pacchetto, template Unraid, catena senza Inno Setup
Il container è la sola forma di esecuzione (ADR-0008): Dockerfile multi-stage con i
test dentro la build, entrypoint con TZ e PUID/PGID, compose per le prove locali,
healthcheck via --health. Il template Unraid installa dall'immagine sul registro di
Gitea con l'icona servita dal repository (D-29). La catena di rilascio pubblica la
cartella portabile, costruisce l'immagine, tagga a pacchetto pronto e spinge
l'immagine sul registro con lo stesso token della release; l'installatore Windows
non ha più senso e viene tolto.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-23 13:26:12 +02:00

91 lines
3.9 KiB
Docker

# syntax=docker/dockerfile:1.7
#
# Encelado — immagine del bot (motore + interfaccia web su Kestrel).
#
# Tre stadi: build (restore + compilazione), test (la suite xunit gira dentro la
# build: un'immagine con i test rossi non esiste), publish (framework-dependent,
# non trimmed: il server ospita ASP.NET Core minimal e non è AOT). Il runtime è
# l'immagine ufficiale aspnet, con gosu per scendere ai PUID/PGID di Unraid.
#
# docker build -t 192.168.30.23:3000/alby96/encelado:5.0.0 --build-arg GIT_COMMIT=$(git rev-parse --short=12 HEAD) .
# docker run -p 8080:8080 -v ./config:/config -v ./data:/data -e TZ=Europe/Rome 192.168.30.23:3000/alby96/encelado:5.0.0
#
# Vedi docs/DOCKER.md per volumi, variabili, healthcheck e aggiornamento.
ARG DOTNET_VERSION=10.0
# ---------------------------------------------------------------- build
FROM mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} AS build
ARG GIT_COMMIT=n/d
WORKDIR /src
# Prima i file di progetto, così il restore resta in cache finché non cambiano.
COPY Directory.Build.props Encelado.slnx ./
COPY src/Encelado.Core/Encelado.Core.csproj src/Encelado.Core/
COPY src/Encelado.Etoro/Encelado.Etoro.csproj src/Encelado.Etoro/
COPY src/Encelado.Engine/Encelado.Engine.csproj src/Encelado.Engine/
COPY src/Encelado.Server/Encelado.Server.csproj src/Encelado.Server/
COPY tools/Encelado.Backtest/Encelado.Backtest.csproj tools/Encelado.Backtest/
COPY tests/Encelado.Tests/Encelado.Tests.csproj tests/Encelado.Tests/
RUN dotnet restore Encelado.slnx
COPY . .
RUN dotnet build Encelado.slnx -c Release --no-restore -p:GitCommit=${GIT_COMMIT}
# ---------------------------------------------------------------- test
FROM build AS test
RUN dotnet test tests/Encelado.Tests -c Release --no-build --nologo -v q
# ---------------------------------------------------------------- publish
FROM build AS publish
ARG GIT_COMMIT=n/d
# Dipende dallo stadio test solo per ordine: la publish parte se i test sono verdi.
COPY --from=test /src/tests/Encelado.Tests/bin/Release/net10.0/Encelado.Tests.dll /tmp/tests-ok
RUN dotnet publish src/Encelado.Server/Encelado.Server.csproj -c Release --no-build --no-restore -p:GitCommit=${GIT_COMMIT} -o /app
# ---------------------------------------------------------------- runtime
FROM mcr.microsoft.com/dotnet/aspnet:${DOTNET_VERSION} AS runtime
ARG VERSION=dev
ARG GIT_COMMIT=n/d
LABEL org.opencontainers.image.title="Encelado" \
org.opencontainers.image.description="Correlation Baskets su eToro: motore, ledger e interfaccia web" \
org.opencontainers.image.version="${VERSION}" \
org.opencontainers.image.revision="${GIT_COMMIT}" \
org.opencontainers.image.authors="Alberto Balbo" \
org.opencontainers.image.source="http://192.168.30.23:3000/Alby96/Encelado"
# gosu per cambiare utente dopo aver sistemato i permessi; tzdata per TZ; curl
# non serve: il healthcheck è il server stesso con --health.
RUN apt-get update \
&& apt-get install -y --no-install-recommends gosu tzdata ca-certificates \
&& rm -rf /var/lib/apt/lists/*
ENV ENCELADO_IN_CONTAINER=1 \
ENCELADO_WEB_PORT=8080 \
ENCELADO_AUTOSTART=1 \
DOTNET_gcServer=1 \
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 \
ASPNETCORE_URLS= \
ASPNETCORE_HTTP_PORTS= \
TZ=UTC \
PUID=99 \
PGID=100
WORKDIR /app
COPY --from=publish /app ./
COPY deploy/docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh && mkdir -p /config /data
VOLUME ["/config", "/data"]
EXPOSE 8080
# Il server risponde da solo alla sonda: GET /api/health sulla porta configurata.
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD ["dotnet", "/app/Encelado.Server.dll", "--health"]
# SIGTERM arriva al processo dotnet (exec nell'entrypoint): stop pulito, ledger
# chiuso, posizioni lasciate sul conto con gli stop nativi (closeOnShutdown).
STOPSIGNAL SIGTERM
ENTRYPOINT ["/entrypoint.sh"]
CMD ["dotnet", "/app/Encelado.Server.dll"]