# ============================================ # Empostor Server Docker Image # ============================================ # Multi-stage build: compiles from source, then produces a minimal runtime image. # # Build (local): # docker build -t empostor-server . # # Build (multi-arch): # docker buildx build --platform linux/amd64,linux/arm64 -t empostor-server . # # Run: # docker compose up -d # ============================================ # ── Build stage ──────────────────────────── FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG TARGETARCH ARG VERSIONSUFFIX=docker WORKDIR /source # Restore dependencies (layer caching) COPY src/Empostor.Server/Empostor.Server.csproj ./src/Empostor.Server/ COPY src/Empostor.Api/Empostor.Api.csproj ./src/Empostor.Api/ COPY src/Empostor.Api.Innersloth.Generator/Empostor.Api.Innersloth.Generator.csproj ./src/Empostor.Api.Innersloth.Generator/ COPY src/NextFast.Hazel-New/Next.Hazel/Next.Hazel.csproj ./src/NextFast.Hazel-New/Next.Hazel/ COPY src/NextFast.Hazel-New/Next.Hazel.Abstractions/Next.Hazel.Abstractions.csproj ./src/NextFast.Hazel-New/Next.Hazel.Abstractions/ COPY src/Directory.Build.props ./src/ RUN case "$TARGETARCH" in \ amd64) RID=linux-x64 ;; \ arm64) RID=linux-arm64 ;; \ arm) RID=linux-arm ;; \ *) echo "Unsupported arch: $TARGETARCH"; exit 1 ;; \ esac && \ dotnet restore -r "$RID" ./src/Empostor.Server/Empostor.Server.csproj # Copy sources and publish COPY src/. ./src/ RUN case "$TARGETARCH" in \ amd64) RID=linux-x64 ;; \ arm64) RID=linux-arm64 ;; \ arm) RID=linux-arm ;; \ *) echo "Unsupported arch: $TARGETARCH"; exit 1 ;; \ esac && \ [ "$VERSIONSUFFIX" = "none" ] && VERSIONSUFFIX="" ; \ dotnet publish ./src/Empostor.Server/Empostor.Server.csproj \ -c Release \ -r "$RID" \ --no-restore \ --self-contained false \ -p:PublishSingleFile=true \ -p:PublishTrimmed=false \ -p:VersionSuffix="$VERSIONSUFFIX" \ -o /app # Copy default config (must be overridden in production) RUN cp ./src/Empostor.Server/config.json /app/config.json 2>/dev/null || true # ── Runtime stage ────────────────────────── FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app # Copy published output from build stage COPY --from=build /app ./ # Create writable runtime directories RUN mkdir -p /app/plugins /app/libraries /app/Languages /app/Log /app/Data /app/marketplace \ && chmod 777 /app/plugins /app/libraries /app/Languages /app/Log /app/Data /app/marketplace # Environment ENV ASPNETCORE_URLS=http://0.0.0.0:80 ENV EMPOSTOR_Server__PublicIp=0.0.0.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 EXPOSE 80/tcp EXPOSE 22023/tcp # Delta UDP port pool (no static UDP port when delta mode is enabled). EXPOSE 22024-22099/udp VOLUME ["/app/config", "/app/plugins", "/app/libraries", "/app/Languages", "/app/Log", "/app/Data", "/app/marketplace"] ENTRYPOINT ["./Empostor.Server"]