deploy: use multi-stage build since we need ts and prisma stuff
Parents:
5a5529d2 file(s) changed
- api/Dockerfile.production +21 -8
- api/package.json +1 -1
api/Dockerfile.production
1 -
FROM node:24-alpine3.23 AS deps
1 +
# Build stage
2 +
FROM node:24-alpine3.23 AS builder
2 3
3 4
RUN apk add --no-cache build-base yaml-dev
4 5
5 6
ARG UID=1000
6 7
ARG GID=1000
7 8
8 9
USER ${UID}:${GID}
9 10
WORKDIR /app
10 11
12 +
# Install all deps (including dev, which is needed for tsc, tsc-alias, prisma)
11 13
COPY --chown=${UID}:${GID} package*.json ./
12 -
RUN npm ci --frozen-lockfile --omit=dev
14 +
RUN npm ci --frozen-lockfile
13 15
14 16
COPY --chown=${UID}:${GID} prisma ./prisma/
15 17
RUN npx prisma generate
16 18
17 -
# For runtime then:
19 +
COPY --chown=${UID}:${GID} . .
20 +
21 +
# Compile TS and spit on dist/
22 +
RUN npm run build
23 +
24 +
# Runtime stage
18 25
FROM node:24-alpine3.23
19 26
20 -
RUN apk add --no-cache bash postgresql17-client valkey-cli
27 +
RUN apk add --no-cache bash postgresql17-client valkey-cli yaml-dev
21 28
22 29
ARG UID=1000
23 30
ARG GID=1000
24 31
25 32
USER ${UID}:${GID}
26 33
WORKDIR /app
27 34
28 -
COPY --from=deps --chown=${UID}:${GID} /app/node_modules ./node_modules
29 -
COPY --from=deps --chown=${UID}:${GID} /app/node_modules/.prisma ./node_modules/.prisma
35 +
# Only prod deps
36 +
COPY --chown=${UID}:${GID} package*.json ./
37 +
RUN npm ci --frozen-lockfile --omit=dev
30 38
31 -
COPY --chown=${UID}:${GID} . .
39 +
# Prisma client generated in builder
40 +
COPY --from=builder --chown=${UID}:${GID} /app/node_modules/.prisma ./node_modules/.prisma
41 +
42 +
# Compiled output and prisma schema (needed for migrate deploy)
43 +
COPY --from=builder --chown=${UID}:${GID} /app/dist ./dist
44 +
COPY --chown=${UID}:${GID} prisma ./prisma/
32 45
33 46
EXPOSE 3000
34 47
35 -
# migrate then start — migrations are idempotent
48 +
# migrate then start
36 49
CMD ["sh", "-c", "npx prisma migrate deploy && npm run prod"]
api/package.json
1 1
{
2 2
"name": "orbit-api",
3 3
"version": "0.0.0",
4 4
"description": "",
5 5
"license": "ISC",
▸ 2 unchanged lines
8 8
"directories": {
9 9
"test": "tests"
10 10
},
11 11
"scripts": {
12 12
"build": "tsc && tsc-alias",
13 -
"prod": "node src/index.js",
13 +
"prod": "node dist/index.js",
14 14
"start": "nodemon src/index.ts",
15 15
"test": "npm run test:setup && dotenv -e .env.test -o -- npx ava",
16 16
"test:setup": "npm run test:setup:generate && npm run test:setup:migrate",
17 17
"test:setup:generate": "dotenv -e .env.test -o -- npx prisma generate",
18 18
"test:setup:migrate": "dotenv -e .env.test -o -- npx prisma db push",
▸ 45 unchanged lines
64 64
"tsconfig-paths": "^4.2.0",
65 65
"tsx": "^4.21.0",
66 66
"typescript": "^6.0.2"
67 67
}
68 68
}