# syntax=docker/dockerfile:1
# One Dockerfile for every JVM image of the network. Build a target with
#   docker build -f docker/Dockerfile --target paper -t arenanet/paper:1.0.0 .
# docker compose does this for you (docker compose build).

# ---------- compile all modules once, the targets below share this stage ----------
# prebuilt jars instead of a Gradle build (see the source zip for the sources)
FROM busybox:1.37 AS build
COPY jars/ /out/

# ---------- download Paper / Velocity with a pinned checksum ----------
FROM eclipse-temurin:21-jdk AS fetch
ARG PAPER_URL=https://fill-data.papermc.io/v1/objects/158703f75a26f842ea656b3dc6d75bf3d1ec176b97a2c36384d0b80b3871af53/paper-1.21.10-130.jar
ARG PAPER_SHA256=158703f75a26f842ea656b3dc6d75bf3d1ec176b97a2c36384d0b80b3871af53
ARG VELOCITY_URL=https://fill-data.papermc.io/v1/objects/b4e3164df5377346854dc6cb9e6a78022b1946ff69e89676313f5f6f1c6f0fb3/velocity-3.5.1-615.jar
ARG VELOCITY_SHA256=b4e3164df5377346854dc6cb9e6a78022b1946ff69e89676313f5f6f1c6f0fb3
RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /srv/server
RUN curl -fsSL -o paper.jar "$PAPER_URL" && echo "$PAPER_SHA256  paper.jar" | sha256sum -c - \
 && curl -fsSL -o /velocity.jar "$VELOCITY_URL" && echo "$VELOCITY_SHA256  /velocity.jar" | sha256sum -c -
# Download and patch the vanilla server now, so containers start in seconds and need no internet.
RUN java -Dpaperclip.patchonly=true -jar paper.jar || true; ls cache

# ---------- Velocity proxy ----------
FROM eclipse-temurin:21-jre AS velocity
RUN useradd -r -u 10001 -d /srv/proxy -m mc
WORKDIR /srv/proxy
COPY --from=fetch /velocity.jar /opt/velocity.jar
COPY --from=build /out/proxy/ /opt/arenanet/plugins/
COPY docker/velocity/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh && chown -R mc /srv/proxy
USER mc
EXPOSE 25565
ENTRYPOINT ["/entrypoint.sh"]

# ---------- Paper server for lobby and arenas (role chosen by ARENANET_ROLE) ----------
FROM eclipse-temurin:21-jre AS paper
RUN useradd -r -u 10001 -d /srv/server -m mc
WORKDIR /srv/server
COPY --from=fetch /srv/server/paper.jar /srv/server/paper.jar
COPY --from=fetch /srv/server/cache /srv/server/cache
COPY --from=build /out/lobby/ /opt/arenanet/plugins/lobby/
COPY --from=build /out/arena/ /opt/arenanet/plugins/arena/
COPY docker/paper/ /opt/arenanet/
COPY maps/ /opt/arenanet/maps/
# optional lobby plugins (scripts/fetch-optional-plugins.sh): StreakRewards and ServerBridge
COPY optional-plugins/ /opt/arenanet/optional/
RUN chmod +x /opt/arenanet/entrypoint.sh && chown -R mc /srv/server
USER mc
EXPOSE 25565
ENTRYPOINT ["/opt/arenanet/entrypoint.sh"]

# ---------- Orchestrator: scales arena containers through the Docker socket proxy ----------
# Runs as an unprivileged user; compose adds a read-only root file system and drops all capabilities.
FROM eclipse-temurin:21-jre AS orchestrator
RUN useradd -r -u 10001 -d /app -m svc
WORKDIR /app
COPY --from=build /out/orchestrator/orchestrator.jar /app/orchestrator.jar
USER svc
EXPOSE 9100
ENTRYPOINT ["sh", "-c", "exec java -Xms${ARENANET_MEMORY:-96M} -Xmx${ARENANET_MEMORY:-96M} -XX:+UseSerialGC -XX:MaxMetaspaceSize=96m -XX:+ExitOnOutOfMemoryError -jar /app/orchestrator.jar"]

# ---------- Stats service: stores match results and calculates Elo in MariaDB ----------
FROM eclipse-temurin:21-jre AS stats
RUN useradd -r -u 10001 -d /app -m svc
WORKDIR /app
COPY --from=build /out/stats/stats.jar /app/stats.jar
USER svc
EXPOSE 9100
ENTRYPOINT ["sh", "-c", "exec java -Xms${ARENANET_MEMORY:-96M} -Xmx${ARENANET_MEMORY:-96M} -XX:+UseSerialGC -XX:MaxMetaspaceSize=96m -XX:+ExitOnOutOfMemoryError -jar /app/stats.jar"]
