1# Base builder
2FROM golang:1.21-alpine AS base
3WORKDIR /app
4RUN apk add --no-cache gcc musl-dev
5COPY go.mod go.sum ./
6RUN go mod download
7COPY db/crsqlite.so ./db/
8
9# Frontend builder
10FROM node:18-alpine AS frontend-builder
11WORKDIR /app
12COPY ./mast-react-vite/package.json ./mast-react-vite/package-lock.json ./
13RUN npm install
14COPY ./mast-react-vite/src ./src
15COPY ./mast-react-vite/public ./public
16COPY ./mast-react-vite/index.html ./
17COPY ./mast-react-vite/*.config.js ./mast-react-vite/*.config.ts ./
18RUN npm run build
19
20# Server builder
21FROM base AS server-builder
22WORKDIR /app
23COPY server/main.go server/auth.go server/auth.db server/test.go ./server/
24RUN CGO_ENABLED=1 go build -o /app/bin/server ./server/main.go ./server/auth.go
25
26# Frontend stage
27FROM nginx:alpine AS frontend
28COPY --from=frontend-builder /app/dist /usr/share/nginx/html
29RUN mkdir -p /usr/share/nginx/html/db
30COPY --from=base /app/db/crsqlite.so /usr/share/nginx/html/db/crsqlite.so
31EXPOSE 80
32CMD ["nginx", "-g", "daemon off;"]
33
34# Server stage
35FROM alpine:latest AS server
36WORKDIR /app
37RUN apk upgrade --no-cache
38RUN apk add --no-cache ca-certificates
39RUN apk add --no-cache libgcc
40# We need ../db/crsqlite.so because of silly relative imports in this container...
41COPY --from=server-builder /app/bin/server /app/bin/server
42COPY --from=base /app/db/ /app/db/
43COPY --from=base /app/db/crsqlite.so /usr/share/nginx/html/db/crsqlite.so
44RUN mkdir -p /app/rooms
45EXPOSE 8080
46WORKDIR /app/bin/
47CMD ["/app/bin/server"]