mirror of
https://github.com/MetaFam/TheGame.git
synced 2026-01-13 00:28:15 -05:00
147 lines
5.0 KiB
Docker
147 lines
5.0 KiB
Docker
# syntax=docker/dockerfile:1
|
|
|
|
# This is not intended to be used for local development!
|
|
|
|
# For this file to build, it needs to have a `$TARGET` specified.
|
|
# Either `production` or `development` to run either the built
|
|
# site or dev environment respectively.
|
|
ARG TARGET=production
|
|
|
|
FROM node:20-slim AS base
|
|
WORKDIR /usr/src/app
|
|
|
|
# Install dependencies not included in the slim image
|
|
RUN apt update && apt install -y --no-install-recommends g++ make python3 git ca-certificates
|
|
|
|
# Install dependencies for dev and prod
|
|
COPY package.json ./
|
|
COPY lerna.json ./
|
|
COPY yarn.lock ./
|
|
COPY schema.graphql ./
|
|
COPY tsconfig.*json ./
|
|
COPY packages/web/*.json ./packages/web/
|
|
COPY packages/web/codegen.ts ./packages/web/
|
|
COPY packages/utils/*.json ./packages/utils/
|
|
COPY packages/design-system/*.json ./packages/design-system/
|
|
# Needed for an immutable `yarn install`
|
|
COPY packages/discord-bot/*.json ./packages/discord-bot/
|
|
COPY packages/backend/*.json ./packages/backend/
|
|
|
|
RUN corepack enable
|
|
RUN yarn config set nodeLinker node-modules
|
|
RUN yarn install --immutable
|
|
|
|
FROM base AS build
|
|
|
|
# Copy source files
|
|
COPY packages/web/ packages/web/
|
|
COPY packages/utils/ packages/utils/
|
|
COPY packages/design-system/ packages/design-system/
|
|
COPY packages/@types/ packages/@types/
|
|
|
|
# Build
|
|
FROM build AS build-production
|
|
|
|
# Each ENV below must have an ARG as well to be available at runtime
|
|
ARG APP_ENV
|
|
ARG GRAPHQL_URL=https://api.metagame.wtf/v1/graphql
|
|
ARG FRONTEND_URL=https://metagame.wtf
|
|
ARG IMGIX_TOKEN
|
|
ARG YOUTUBE_API_KEY
|
|
ARG HONEYBADGER_API_KEY
|
|
ARG GOOGLE_ANALYTICS_ID
|
|
ARG USERBACK_TOKEN
|
|
ARG CERAMIC_URL=https://ceramic.metagame.wtf
|
|
ARG WEB3_STORAGE_TOKEN
|
|
ARG OPENSEA_API_KEY
|
|
ARG GCAL_CALENDAR_ID
|
|
ARG GCAL_PRIVATE_KEY
|
|
ARG GCAL_CLIENT_EMAIL
|
|
ARG GCAL_PROJECT_NUMBER
|
|
ARG ALCHEMY_API_KEY
|
|
ARG WEB3_STORAGE_DID
|
|
ARG WEB3_STORAGE_KEY
|
|
ARG WEB3_STORAGE_PROOF
|
|
|
|
# ARGs are not available at runtime, so define ENV variables
|
|
# These ENVs should match the --set-env-vars in `.github/workflows/gcp-deploy.yaml`
|
|
# see https://www.saltycrane.com/blog/2021/04/buildtime-vs-runtime-environment-variables-nextjs-docker/
|
|
ENV NEXT_PUBLIC_APP_EN=$APP_ENV
|
|
ENV NEXT_PUBLIC_GRAPHQL_URL=$GRAPHQL_URL
|
|
ENV NEXT_PUBLIC_FRONTEND_URL=$FRONTEND_URL
|
|
ENV NEXT_PUBLIC_IMGIX_TOKEN=$IMGIX_TOKEN
|
|
ENV NEXT_PUBLIC_YOUTUBE_API_KEY=$YOUTUBE_API_KEY
|
|
ENV NEXT_PUBLIC_HONEYBADGER_API_KEY=$HONEYBADGER_API_KEY
|
|
ENV NEXT_PUBLIC_GOOGLE_ANALYTICS_ID=$GOOGLE_ANALYTICS_ID
|
|
ENV NEXT_PUBLIC_USERBACK_TOKEN=$USERBACK_TOKEN
|
|
ENV NEXT_PUBLIC_CERAMIC_URL=$CERAMIC_URL
|
|
ENV NEXT_PUBLIC_GCAL_CALENDAR_ID=$GCAL_CALENDAR_ID
|
|
ENV NEXT_PUBLIC_ALCHEMY_API_KEY=$ALCHEMY_API_KEY
|
|
ENV NEXT_PUBLIC_WEB3_STORAGE_DID=$WEB3_STORAGE_DID
|
|
ENV NEXT_PUBLIC_WEB3_STORAGE_KEY=$WEB3_STORAGE_KEY
|
|
ENV NEXT_PUBLIC_WEB3_STORAGE_PROOF=$WEB3_STORAGE_PROOF
|
|
# These are not exposed to the browser
|
|
ENV WEB3_STORAGE_TOKEN=$WEB3_STORAGE_TOKEN
|
|
ENV OPENSEA_API_KEY=$OPENSEA_API_KEY
|
|
ENV GCAL_PRIVATE_KEY=$GCAL_PRIVATE_KEY
|
|
ENV GCAL_CLIENT_EMAIL=$GCAL_CLIENT_EMAIL
|
|
ENV GCAL_PROJECT_NUMBER=$GCAL_PROJECT_NUMBER
|
|
|
|
ONBUILD RUN yarn web:build
|
|
|
|
FROM build AS build-development
|
|
ONBUILD RUN yarn web:deps:build
|
|
|
|
FROM "build-$TARGET" AS built
|
|
|
|
# New stage including only necessary files
|
|
FROM node:20-slim AS app
|
|
WORKDIR /app
|
|
|
|
# Copy necessary files into the stage
|
|
COPY --from=built /usr/src/app/package.json ./
|
|
# COPY --from=built /usr/src/app/node_modules/ ./
|
|
|
|
# Copy the built web app
|
|
FROM app AS copy-production
|
|
|
|
# ARG CACHEBUST
|
|
|
|
ONBUILD COPY --from=built /usr/src/app/packages/utils/package.json packages/utils/
|
|
ONBUILD COPY --from=built /usr/src/app/packages/utils/dist/ packages/utils/dist/
|
|
ONBUILD COPY --from=built /usr/src/app/packages/design-system/package.json packages/design-system/
|
|
ONBUILD COPY --from=built /usr/src/app/packages/design-system/dist/ packages/design-system/dist/
|
|
ONBUILD COPY --from=built /usr/src/app/packages/web/package.json packages/web/
|
|
# ONBUILD COPY --from=built /usr/src/app/packages/web/node_modules packages/web/
|
|
ONBUILD COPY --from=built /usr/src/app/packages/web/public/ packages/web/public/
|
|
ONBUILD COPY --from=built /usr/src/app/packages/web/.next/ packages/web/.next/
|
|
|
|
ONBUILD RUN apt update && apt install -y --no-install-recommends git ca-certificates
|
|
|
|
ONBUILD RUN corepack enable
|
|
ONBUILD RUN yarn config set nodeLinker node-modules
|
|
ONBUILD RUN yarn workspaces focus @metafam/web --production # --immutable
|
|
# ONBUILD RUN yarn install --pure-lockfile --production --ignore-scripts --prefer-offline
|
|
|
|
ONBUILD RUN ls -la packages/*/
|
|
|
|
ONBUILD CMD ["yarn", "web", "start"]
|
|
|
|
# Copy the sources
|
|
FROM app AS copy-development
|
|
ONBUILD COPY --from=built /usr/src/app/schema.graphql ./
|
|
ONBUILD COPY --from=built /usr/src/app/tsconfig*.json ./
|
|
ONBUILD COPY --from=built /usr/src/app/lerna.json ./
|
|
ONBUILD COPY --from=built /usr/src/app/packages/design-system/ packages/design-system/
|
|
ONBUILD COPY --from=built /usr/src/app/packages/utils/ packages/utils/
|
|
ONBUILD COPY --from=built /usr/src/app/packages/web/ packages/web/
|
|
|
|
ONBUILD RUN rm -rf packages/design-system/dist/
|
|
ONBUILD RUN rm -rf packages/web/.next/
|
|
|
|
ONBUILD CMD ["yarn", "web:dev"]
|
|
|
|
FROM "copy-$TARGET" AS final
|
|
|
|
RUN echo "Generated $TARGET image for frontend."
|