Commit d91473d5 authored by Grant's avatar Grant
Browse files

chore: rewrite dockerfile

parent 9824a649
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -57,6 +57,8 @@ jest server:
  script:
    - apk update && apk add git
    - yarn workspaces focus --all
    - yarn build-api-schema
    - yarn workspace @sc07-canvas/lib build
    - yarn workspace @sc07-canvas/server prisma migrate reset --force
    - yarn workspace @sc07-canvas/server prisma generate
    - yarn workspace @sc07-canvas/server run test:ci
+112 −74
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@ FROM node:24-alpine AS base
# add openssl as root
RUN apk add --no-cache openssl 

ARG VERSION

WORKDIR /home/node/app
USER node

@@ -17,129 +19,165 @@ COPY packages/chat/package.json ./packages/chat/
USER root
RUN corepack enable yarn && corepack prepare --activate
RUN chown -R node:node /home/node/app
RUN ln -s /home/node/app /app
USER node

FROM base AS dev_dep
#
# Build library
#

FROM base AS lib-dev-deps

RUN yarn workspaces focus @sc07-canvas/lib

FROM base AS lib-prod-deps

# install all dependencies
RUN yarn workspaces focus --all
RUN yarn workspaces focus @sc07-canvas/lib --production

FROM base AS dep
FROM lib-dev-deps AS lib-build

# install only production dependencies
RUN yarn workspaces focus --all --production
COPY --chown=node:node packages/server/src/api/openapi.yml packages/lib/.openapi.yml
COPY --chown=node:node packages/lib/ ./packages/lib/
RUN npx openapi-typescript packages/lib/.openapi.yml -o packages/lib/src/api-schema.ts && rm packages/lib/.openapi.yml
RUN yarn workspace @sc07-canvas/lib run build
RUN ln -s /home/node/app/packages

FROM lib-prod-deps AS lib

COPY --from=lib-build /app/packages/lib/dist/ ./packages/lib/dist

#
# === BUILDER ===
# Build chat
#

FROM base AS build

# CLIENT_SENTRY_DSN will be baked into the client package
# SERVER_SENTRY_DSN is NOT baked in and must also be supplied to image on start
# SENTRY_{URL,ORG,PROJECT,AUTH_TOKEN} are used for sourcemap pushing
ARG CLIENT_SENTRY_DSN
ARG CLIENT_SENTRY_PROJECT
ARG SERVER_SENTRY_DSN
ARG SERVER_SENTRY_PROJECT
ARG SENTRY_URL
ARG SENTRY_ORG
ARG SENTRY_AUTH_TOKEN
ARG VERSION
FROM base AS chat-dev-deps

# copy all dev dependencies into stage
COPY --from=dev_dep --chown=node:node /home/node/app/ ./
# copy all source files
COPY --chown=node:node . .
RUN yarn workspaces focus @sc07-canvas/chat

# --- build lib ---
FROM base AS chat-prod-deps

RUN yarn run build-api-schema
RUN yarn workspace @sc07-canvas/lib run build
# janky? fix to keep imports in dev
# RUN sed -i -e 's/"main": ".*"/"main": ".\/dist\/index.js"/' packages/lib/package.json
RUN yarn workspaces focus @sc07-canvas/chat --production

# --- build chat ---
FROM chat-dev-deps AS chat-build

COPY --chown=node:node packages/chat/ ./packages/chat/
RUN yarn workspace @sc07-canvas/chat run build

# --- build main client ---
FROM chat-prod-deps AS chat

COPY --from=chat-build /app/packages/chat/dist/ ./packages/chat/dist

ARG VITE_INCLUDE_EVENT_INFO
ARG SENTRY_DSN=$CLIENT_SENTRY_DSN
ARG SENTRY_PROJECT=$CLIENT_SENTRY_PROJECT
#
# Build client
#

FROM base AS client-xdep

COPY --from=chat /app/packages/chat/dist/ ./packages/chat/dist
COPY --from=lib /app/packages/lib/dist/ ./packages/lib/dist

FROM client-xdep AS client-dev-deps

RUN yarn workspaces focus @sc07-canvas/client

FROM client-xdep AS client-prod-deps

RUN yarn workspaces focus @sc07-canvas/client --production

FROM client-dev-deps AS client-build

COPY --chown=node:node packages/client/ ./packages/client/
RUN yarn workspace @sc07-canvas/client run build

# --- build admin ---
FROM client-prod-deps AS client

COPY --from=client-build /app/packages/client/dist ./packages/client/dist

#
# Build admin
#

FROM base AS admin-dev-deps

RUN yarn workspaces focus @sc07-canvas/admin

FROM base AS admin-prod-deps

RUN yarn workspaces focus @sc07-canvas/admin --production

FROM admin-dev-deps AS admin-build

COPY --chown=node:node packages/admin ./packages/admin/
ENV APP_ROOT=/admin
RUN yarn workspace @sc07-canvas/admin run build

# --- build server ---
FROM admin-prod-deps AS admin

RUN sed -i -e 's/"main": ".*"/"main": ".\/dist\/index.js"/' packages/lib/package.json
ENV DATABASE_URL=postgres://invalid/not-needed-rn
RUN yarn workspace @sc07-canvas/server prisma generate
ARG SENTRY_DSN=$SERVER_SENTRY_DSN
ARG SENTRY_PROJECT=$SERVER_SENTRY_PROJECT
RUN yarn workspace @sc07-canvas/server run build
# Disabled (see #162)
# RUN if [ -n "$SENTRY_AUTH_TOKEN" ]; then npm -w packages/server run sentry; fi
COPY --from=admin-build /app/packages/admin/dist ./packages/admin/dist

#
# === RUNNER ===
# Build server
#

FROM base AS run
WORKDIR /home/node/app
COPY --from=dep /home/node/app/ ./
COPY docker-start*.sh ./
FROM base AS server-xdeps

# --- clear packages from base ---
# wipe these as the final running image is packaged differently
RUN rm -rf packages/{lib,client,admin,server}
COPY --from=lib /app/packages/lib/dist ./packages/lib/dist
COPY --chown=node:node packages/server/prisma.config.ts ./packages/server/

# --- prepare lib ---
FROM server-xdeps AS server-dev-deps

RUN mkdir -p packages/lib
COPY --from=build /home/node/app/packages/lib/package.json ./packages/lib
COPY --from=build /home/node/app/packages/lib/dist ./packages/lib/dist
RUN yarn workspaces focus @sc07-canvas/server

# --- prepare client ---
FROM server-xdeps AS server-prod-deps

RUN mkdir -p packages/client
COPY --from=build /home/node/app/packages/client/dist ./packages/client/
RUN yarn workspaces focus @sc07-canvas/server --production

# --- prepare admin ---
FROM server-dev-deps AS server-build

RUN mkdir -p packages/admin
COPY --from=build /home/node/app/packages/admin/dist ./packages/admin/
COPY --chown=node:node packages/server ./packages/server

# --- prepare server ---
ENV DATABASE_URL=postgres://invalid/not-needed-rn
RUN yarn workspace @sc07-canvas/server prisma generate
# TODO: add sentry
# ARG SENTRY_DSN=$SERVER_SENTRY_DSN
# ARG SENTRY_PROJECT=$SERVER_SENTRY_PROJECT
RUN yarn workspace @sc07-canvas/server run build
# Disabled (see #162)
# RUN if [ -n "$SENTRY_AUTH_TOKEN" ]; then npm -w packages/server run sentry; fi

RUN mkdir -p packages/server
FROM server-prod-deps AS server

ARG VERSION
ENV VERSION_PATH=/home/node/app/packages/server/.version
RUN echo "${VERSION}" > ./packages/server/.version

COPY packages/server/prisma.config.ts ./packages/server/
COPY --from=build /home/node/app/packages/server/package.json ./packages/server/
COPY --from=build /home/node/app/packages/server/prisma ./packages/server/prisma
COPY --from=build /home/node/app/packages/server/tool.sh ./packages/server/
COPY --from=build /home/node/app/packages/server/dist ./packages/server/dist
COPY --from=server-build /app/packages/server/package.json ./packages/server/
COPY --from=server-build /app/packages/server/prisma ./packages/server/prisma
COPY --from=server-build /app/packages/server/tool.sh ./packages/server/
COPY --from=server-build /app/packages/server/dist ./packages/server/dist
COPY --from=server-build /app/node_modules/@prisma/client node_modules/@prisma/client
COPY --from=server-build /app/node_modules/.prisma node_modules/.prisma

# --- finalize ---
#
# === RUNNER ===
#

ENV DATABASE_URL=postgres://invalid/not-needed-rn
RUN npx -w packages/server prisma generate
FROM base AS run
WORKDIR /home/node/app
COPY docker-start*.sh ./

COPY --from=lib /app/packages/lib ./packages/lib
COPY --from=client /app/packages/client ./packages/client
COPY --from=admin /app/packages/admin ./packages/admin
COPY --from=server /app/packages/server ./packages/server
COPY --from=server /app/node_modules ./node_modules

# set runtime env variables

ENV PORT=3000
ENV NODE_ENV=production
ENV SERVE_CLIENT=/home/node/app/packages/client
ENV SERVE_ADMIN=/home/node/app/packages/admin
ENV SERVE_CLIENT=/home/node/app/packages/client/dist
ENV SERVE_ADMIN=/home/node/app/packages/admin/dist

EXPOSE 3000
# profiler port, only used if profiler is explicity running
+12 −0
Original line number Diff line number Diff line
@@ -10,20 +10,32 @@
    "preview": "vite preview"
  },
  "dependencies": {
    "@fortawesome/fontawesome-svg-core": "^7.2.0",
    "@fortawesome/free-brands-svg-icons": "^7.2.0",
    "@fortawesome/free-solid-svg-icons": "^7.2.0",
    "@fortawesome/react-fontawesome": "^3.3.1",
    "@nextui-org/react": "^2.6.11",
    "apexcharts": "^5.5.0",
    "framer-motion": "^12.34.0",
    "localforage": "^1.10.0",
    "match-sorter": "^8.2.0",
    "next-themes": "^0.4.6",
    "react": "^19.2.5",
    "react-apexcharts": "^1.9.0",
    "react-dom": "^19.2.5",
    "react-router-dom": "^7.13.0",
    "react-toastify": "^11.1.0",
    "swr": "^2.4.0"
  },
  "devDependencies": {
    "@tailwindcss/vite": "^4.2.4",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "@vitejs/plugin-react": "^5.1.4",
    "eslint": "^9.39.2",
    "eslint-plugin-react-refresh": "^0.5.0",
    "postcss": "^8.5.6",
    "sass-embedded": "^1.99.0",
    "typescript": "^5.9.3",
    "vite": "^7.3.1"
  }
+11 −1
Original line number Diff line number Diff line
@@ -11,20 +11,27 @@
  "type": "module",
  "license": "MIT",
  "dependencies": {
    "@fortawesome/fontawesome-svg-core": "^7.2.0",
    "@fortawesome/free-brands-svg-icons": "^7.2.0",
    "@fortawesome/free-solid-svg-icons": "^7.2.0",
    "@fortawesome/react-fontawesome": "^3.3.1",
    "@heroui/react": "^2.8.9",
    "@icons-pack/react-simple-icons": "^13.11.2",
    "@sc07-canvas/chat": "workspace:^",
    "@sc07-canvas/lib": "^1.0.0",
    "@sc07-canvas/lib": "workspace:^",
    "@sentry/react": "^10.50.0",
    "altcha-lib": "^1.4.1",
    "date-fns": "^4.1.0",
    "eventemitter3": "^5.0.4",
    "framer-motion": "^12.34.0",
    "lodash.throttle": "^4.1.1",
    "openapi-fetch": "^0.17.0",
    "prop-types": "^15.8.1",
    "react-toastify": "^11.1.0",
    "react-zoom-pan-pinch": "^3.7.0",
    "socket.io-client": "^4.8.3",
    "swr": "^2.4.0",
    "swr-openapi": "^5.6.0",
    "use-sound": "^5.0.0",
    "vite-plugin-banner": "^0.8.1"
  },
@@ -32,12 +39,15 @@
    "@eslint/compat": "^2.0.2",
    "@eslint/eslintrc": "^3.3.3",
    "@eslint/js": "^10.0.1",
    "@sentry/vite-plugin": "^5.2.0",
    "@tailwindcss/vite": "^4.1.18",
    "@tsconfig/vite-react": "^7.0.2",
    "@types/lodash.throttle": "^4.1.9",
    "@types/socket.io-client": "^3.0.0",
    "eslint": "^9.39.2",
    "eslint-plugin-import": "^2.32.0",
    "eslint-plugin-react": "^7.37.5",
    "next-themes": "^0.4.6",
    "postcss": "^8.5.6",
    "sass": "^1.97.3",
    "typescript-eslint": "^8.56.0",
+2 −2
Original line number Diff line number Diff line
import { Debug } from "@sc07-canvas/lib/src/debug";
import { Debug } from "@sc07-canvas/lib/debug";
import {
  type ModClientToServerEvents,
  type ModServerToClientEvents,
} from "@sc07-canvas/lib/src/net";
} from "@sc07-canvas/lib/net";
import { io, Socket } from "socket.io-client";

export class ModeratorModule {
Loading