Barazo AppView backend
barazo.forum
1# Multi-stage build for barazo-api
2# Build context: monorepo root (docker build -f barazo-api/Dockerfile .)
3
4# ---------------------------------------------------------------------------
5# Stage 1: Install dependencies
6# ---------------------------------------------------------------------------
7FROM node:24-alpine AS deps
8RUN apk add --no-cache libc6-compat
9WORKDIR /workspace
10
11# Enable pnpm via corepack
12RUN corepack enable && corepack prepare pnpm@10.29.2 --activate
13
14# Copy workspace root config (including .npmrc for inject-workspace-packages)
15COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
16
17# Copy all workspace package.json files (needed for pnpm install)
18COPY barazo-lexicons/package.json ./barazo-lexicons/
19COPY barazo-api/package.json ./barazo-api/
20COPY barazo-web/package.json ./barazo-web/
21COPY barazo-plugins/packages/plugin-signatures/package.json ./barazo-plugins/packages/plugin-signatures/
22
23# Install all dependencies (including devDeps for tsc build)
24RUN pnpm install --frozen-lockfile
25
26# ---------------------------------------------------------------------------
27# Stage 2: Build
28# ---------------------------------------------------------------------------
29FROM node:24-alpine AS builder
30WORKDIR /workspace
31
32RUN corepack enable && corepack prepare pnpm@10.29.2 --activate
33
34# Copy installed dependencies
35COPY --from=deps /workspace/ ./
36
37# Copy lexicons source (workspace dependency)
38COPY barazo-lexicons/ ./barazo-lexicons/
39
40# Copy plugin-signatures source (workspace dependency via link:)
41# Include tsconfig.base.json so the plugin's "extends": "../../tsconfig.base.json" resolves
42COPY barazo-plugins/tsconfig.base.json ./barazo-plugins/
43COPY barazo-plugins/packages/plugin-signatures/ ./barazo-plugins/packages/plugin-signatures/
44
45# Copy API source
46COPY barazo-api/ ./barazo-api/
47
48# Build workspace dependencies first, then API
49RUN pnpm --filter @singi-labs/lexicons build && \
50 pnpm --filter @barazo/plugin-signatures run build:backend && \
51 pnpm --filter barazo-api build
52
53# Create standalone production deployment with resolved dependencies.
54# pnpm deploy copies workspace + prod deps (requires inject-workspace-packages=true in .npmrc).
55RUN pnpm --filter barazo-api deploy /app/deploy --prod
56
57# pnpm deploy creates symlinks for workspace packages that point back to
58# /workspace/, which won't exist in the runner stage. Fix each:
59# - lexicons: use pnpm deploy to get package + resolved dependencies
60# - plugin-signatures: only has peerDeps (satisfied by API), copy source directly
61RUN pnpm --filter @singi-labs/lexicons deploy /tmp/lexicons-deploy --prod
62
63RUN rm -rf /app/deploy/node_modules/@singi-labs/lexicons \
64 && cp -r /tmp/lexicons-deploy /app/deploy/node_modules/@singi-labs/lexicons \
65 && rm -rf /app/deploy/node_modules/@barazo/plugin-signatures \
66 && cp -r /workspace/barazo-plugins/packages/plugin-signatures /app/deploy/node_modules/@barazo/plugin-signatures
67
68# ---------------------------------------------------------------------------
69# Stage 3: Production runner
70# ---------------------------------------------------------------------------
71FROM node:24-alpine AS runner
72WORKDIR /app
73
74ENV NODE_ENV=production
75
76# Create non-root user
77RUN addgroup --system --gid 1001 nodejs && \
78 adduser --system --uid 1001 barazo
79
80# Copy production deployment (node_modules + package.json)
81COPY --from=builder /app/deploy/ ./
82
83# Copy compiled output
84COPY --from=builder /workspace/barazo-api/dist/ ./dist/
85
86# Copy Drizzle migration files (applied on startup)
87COPY --from=builder /workspace/barazo-api/drizzle/ ./drizzle/
88
89# Create plugins directory for runtime plugin loading
90RUN mkdir -p /app/plugins && chown barazo:nodejs /app/plugins
91
92USER barazo
93
94EXPOSE 3000
95
96HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
97 CMD wget -qO- http://127.0.0.1:3000/api/health || exit 1
98
99CMD ["node", "dist/server.js"]