-
-
Notifications
You must be signed in to change notification settings - Fork 250
Expand file tree
/
Copy pathDockerfile
More file actions
80 lines (62 loc) · 2.83 KB
/
Dockerfile
File metadata and controls
80 lines (62 loc) · 2.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# ============================================
# Stage 1: Build the web client
# ============================================
FROM node:24-alpine AS builder
RUN apk add --no-cache git python3 make g++
# Install pnpm
RUN corepack enable && corepack prepare pnpm@10.28.1 --activate
WORKDIR /build
# Copy workspace config files for dependency resolution
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml .npmrc ./
# Copy all package.json files for workspace packages
COPY packages/stoat.js/package.json packages/stoat.js/
COPY packages/solid-livekit-components/package.json packages/solid-livekit-components/
COPY packages/js-lingui-solid/packages/babel-plugin-lingui-macro/package.json packages/js-lingui-solid/packages/babel-plugin-lingui-macro/
COPY packages/js-lingui-solid/packages/babel-plugin-extract-messages/package.json packages/js-lingui-solid/packages/babel-plugin-extract-messages/
COPY packages/client/package.json packages/client/
# Copy panda config needed by client's "prepare" lifecycle script (panda codegen)
COPY packages/client/panda.config.ts packages/client/
# Install dependencies
RUN pnpm install --frozen-lockfile
# Submodules:
# In CI: actions/checkout@v4 with submodules: recursive handles this automatically.
# Locally: run `git submodule update --init --recursive` before `docker build`.
COPY packages/ packages/
# Build sub-dependencies (stoat.js, livekit-components, lingui plugins, panda css etc)
RUN pnpm --filter stoat.js build && \
pnpm --filter solid-livekit-components build && \
pnpm --filter @lingui-solid/babel-plugin-lingui-macro build && \
pnpm --filter @lingui-solid/babel-plugin-extract-messages build && \
pnpm --filter client exec lingui compile --typescript && \
pnpm --filter client exec node scripts/copyAssets.mjs && \
pnpm --filter client exec panda codegen
# Build the client with placeholder env vars for runtime injection
# these are replaced by inject.js at container run startup
ENV VITE_API_URL=__VITE_API_URL__
ENV VITE_WS_URL=__VITE_WS_URL__
ENV VITE_MEDIA_URL=__VITE_MEDIA_URL__
ENV VITE_PROXY_URL=__VITE_PROXY_URL__
ENV VITE_HCAPTCHA_SITEKEY=__VITE_HCAPTCHA_SITEKEY__
ENV VITE_CFG_ENABLE_VIDEO=__VITE_CFG_ENABLE_VIDEO__
ENV BASE_PATH=/
RUN pnpm --filter client exec vite build
# ============================================
# Stage 2: Minimal runtime image
# ============================================
FROM node:24-alpine
WORKDIR /app
# Copy the server package and install dependencies
COPY docker/package.json docker/inject.js ./
RUN npm install --omit=dev
# Copy built static assets stage 1
COPY --from=builder /build/packages/client/dist ./dist
EXPOSE 5000
# Runtime env vars (overridden by Helm chart / docker run)
ENV VITE_API_URL=""
ENV VITE_WS_URL=""
ENV VITE_MEDIA_URL=""
ENV VITE_PROXY_URL=""
ENV VITE_HCAPTCHA_SITEKEY=""
ENV VITE_CFG_ENABLE_VIDEO=""
ENV REVOLT_PUBLIC_URL=""
CMD ["npm", "start"]