spb/datacenterindex
Public
HTML 53.9%
TypeScript 44.5%
JavaScript 0.6%
SQL 0.5%
1# syntax=docker/dockerfile:1.72# DataCenterIndex — Next 16 web image (apps/web). No `output: "standalone"` in next.config.ts → `next start`3# with a pruned production node_modules.4# Build context = repo root:5# docker build -f deploy/docker/Dockerfile.web --build-arg NEXT_PUBLIC_API_URL=https://www.datacenterindex.io .6ARG NODE_IMAGE=node:22-bookworm-slim7ARG PNPM_VERSION=11.1.289FROM ${NODE_IMAGE} AS base10ARG PNPM_VERSION11ENV PNPM_HOME=/pnpm \12 PATH=/pnpm:$PATH \13 npm_config_store_dir=/pnpm/store \14 NEXT_TELEMETRY_DISABLED=115RUN (corepack enable && corepack prepare "pnpm@${PNPM_VERSION}" --activate) \16 || npm install -g "pnpm@${PNPM_VERSION}" --no-fund --no-audit1718# Dev deps are needed for `next build` (tailwind, typescript) → full fetch.19FROM base AS fetch20WORKDIR /app21COPY pnpm-lock.yaml pnpm-workspace.yaml ./22RUN --mount=type=cache,id=dci-pnpm-store,target=/pnpm/store pnpm fetch && rm -rf node_modules2324# ---------------------------------------------------------------- build25FROM fetch AS build26ARG NEXT_PUBLIC_API_URL=https://www.datacenterindex.io27ARG NEXT_PUBLIC_SITE_URL=https://www.datacenterindex.io28ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} \29 NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL} \30 NODE_ENV=production31COPY . .32RUN --mount=type=cache,id=dci-pnpm-store,target=/pnpm/store \33 pnpm install --offline --frozen-lockfile --config.dangerously-allow-all-builds=true --config.confirm-modules-purge=false --filter "@dci/web..."34RUN --mount=type=cache,id=dci-next-cache,target=/app/apps/web/.next/cache \35 pnpm --filter @dci/web run build3637# ---------------------------------------------------------------- prod-deps: runtime node_modules only38FROM fetch AS prod-deps39COPY . .40RUN --mount=type=cache,id=dci-pnpm-store,target=/pnpm/store \41 pnpm install --offline --frozen-lockfile --config.dangerously-allow-all-builds=true --config.confirm-modules-purge=false --prod --filter "@dci/web..."4243# ---------------------------------------------------------------- runtime44FROM ${NODE_IMAGE} AS runtime45ENV NODE_ENV=production \46 NEXT_TELEMETRY_DISABLED=1 \47 PORT=8310 \48 HOSTNAME=0.0.0.049RUN apt-get update \50 && apt-get install -y --no-install-recommends tini ca-certificates \51 && rm -rf /var/lib/apt/lists/*52WORKDIR /app53COPY --from=prod-deps --chown=node:node /app/package.json /app/pnpm-workspace.yaml /app/tsconfig.base.json ./54COPY --from=prod-deps --chown=node:node /app/node_modules ./node_modules55COPY --from=prod-deps --chown=node:node /app/packages/core ./packages/core56COPY --from=prod-deps --chown=node:node /app/apps/web/node_modules ./apps/web/node_modules57COPY --from=prod-deps --chown=node:node /app/apps/web/package.json /app/apps/web/next.config.ts /app/apps/web/tsconfig.json ./apps/web/58COPY --from=build --chown=node:node /app/apps/web/public ./apps/web/public59COPY --from=build --chown=node:node /app/apps/web/.next ./apps/web/.next60USER node61WORKDIR /app/apps/web62EXPOSE 831063HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \64 CMD ["node", "-e", "fetch('http://127.0.0.1:'+(process.env.PORT||8310)+'/').then(r=>process.exit(r.status<500?0:1),()=>process.exit(1))"]65ENTRYPOINT ["/usr/bin/tini", "--"]66# package.json `start` binds 127.0.0.1 (laptop); inside the container Caddy must reach it → 0.0.0.0.67CMD ["node", "node_modules/next/dist/bin/next", "start", "-p", "8310", "-H", "0.0.0.0"]68