Barazo AppView backend barazo.forum
at main 99 lines 3.9 kB view raw
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"]