# Server F as an image: the Filius service and the editor's page in one.
#
# Built from the repository's root (the build needs every package and the
# corpus, whose FILIUS examples the editor carries):
#
#   docker compose -f deploy/docker-compose.yml --env-file deploy/test.env build
#
# Two stages. The first installs everything and builds: esbuild bundles the
# service into main.mjs and its room thread into simWorker.mjs, with every
# dependency inside; Vite builds the editor; precompressMain.mjs lays a .br
# and a .gz beside its files. The second stage takes only these files, so
# the image holds no node_modules, no sources and no compiler.
#
# Node 24 (active LTS) — and since 24.10.2026 the same major as the
# development machines, so the bundles are built for exactly the runtime that
# carries them. 20 has had no security fixes since April 2026, and a service
# facing the browsers of a whole school should not run on it. The image's run
# is checked before each release (see the README).

FROM node:24-alpine AS build
WORKDIR /src
COPY . .
RUN npm ci --no-audit --no-fund
RUN npm run build -w @mdg-filius/server \
 && npm run build -w @mdg-filius/editor \
 && node packages/server/dist/precompressMain.mjs packages/editor/dist

FROM node:24-alpine
LABEL org.opencontainers.image.title="mdg-filius" \
      org.opencontainers.image.description="Filius network simulation, shared editing (server F)" \
      org.opencontainers.image.licenses="GPL-3.0-only"
ENV NODE_ENV=production
WORKDIR /app
COPY --from=build /src/packages/server/dist/main.mjs /src/packages/server/dist/simWorker.mjs ./
COPY --from=build /src/packages/editor/dist ./editor
# FILIUS' examples, from which the dashboard makes projects (/svc/examples).
COPY corpus/java-examples ./examples
COPY LICENSE README.md CHANGES.md ./
# Not root: F needs no privilege, and a hole in it should not get one.
USER node
EXPOSE 8080
# The proxy keeps no watch of its own; this one shows in `docker compose ps`.
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
  CMD wget -q -O /dev/null http://127.0.0.1:8080/healthz || exit 1
CMD ["node", "main.mjs"]
