# syntax=docker/dockerfile:1 # ============================================================================== # EpicNext-CMS — Docker image (Node 26.8.1, multi-package-manager, Next.js standalone) # ============================================================================== # --- Builder stage --- FROM node:26.8.1-bookworm-slim AS builder RUN apt-get update && apt-get install -y --no-install-recommends git ca-certificates \ && rm -rf /var/lib/apt/lists/* RUN npm install -g pnpm@11.25.0 yarn WORKDIR /app COPY package.json *lock* pnpm-workspace.yaml .npmrc ./ ARG PACKAGE_MANAGER= RUN --mount=type=cache,id=epicnext-pnpm,target=/pnpm/store,sharing=locked \ if [ "$PACKAGE_MANAGER" = "pnpm" ] || { [ -z "$PACKAGE_MANAGER" ] && [ -f pnpm-lock.yaml ]; }; then \ echo ">> Using pnpm" && \ pnpm install --frozen-lockfile --ignore-scripts --store-dir=/pnpm/store; \ elif [ "$PACKAGE_MANAGER" = "yarn" ] || { [ -z "$PACKAGE_MANAGER" ] && [ -f yarn.lock ]; }; then \ echo ">> Using yarn" && \ yarn install --frozen-lockfile --ignore-scripts; \ elif [ "$PACKAGE_MANAGER" = "npm" ] || { [ -z "$PACKAGE_MANAGER" ] && [ -f package-lock.json ]; }; then \ echo ">> Using npm" && \ npm ci --ignore-scripts; \ else \ echo "!! No lockfile found — falling back to npm install" && \ npm install --ignore-scripts; \ fi COPY . . ENV NODE_ENV=production RUN --mount=type=cache,id=epicnext-next,target=/app/.next/cache,sharing=locked \ if [ -f .env ]; then set -a && . ./.env && set +a; fi && \ if [ "$PACKAGE_MANAGER" = "yarn" ] || { [ -z "$PACKAGE_MANAGER" ] && [ -f yarn.lock ]; }; then \ yarn build; \ elif [ "$PACKAGE_MANAGER" = "npm" ] || { [ -z "$PACKAGE_MANAGER" ] && [ -f package-lock.json ]; }; then \ npm run build; \ else \ pnpm build; \ fi # --- Runtime stage --- FROM node:26.8.1-bookworm-slim AS runner RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates \ && rm -rf /var/lib/apt/lists/* ARG RUN_USER=www-data ENV NODE_ENV=production ENV PORT=3002 ENV HOSTNAME=0.0.0.0 EXPOSE 3002 WORKDIR /app RUN mkdir -p /app/storage \ /app/public/nitro-assets \ /app/public/swf \ /var/www/Gamedata \ && chown -R ${RUN_USER} /app /var/www/Gamedata COPY --from=builder --chown=${RUN_USER} /app/.next/standalone ./ COPY --from=builder --chown=${RUN_USER} /app/public ./public COPY --from=builder --chown=${RUN_USER} /app/.next/static ./.next/static VOLUME ["/app/public/nitro-assets", "/app/public/swf", "/app/storage"] USER ${RUN_USER} CMD ["node", "server.js"]