79 lines
2.6 KiB
Docker
79 lines
2.6 KiB
Docker
# 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 [email protected] 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"]
|