# Build context = repo root (see docker-compose.yml) — the npm workspace # lockfile lives there, not in server/. server/ now depends on the @impri/mcp # workspace package (shared MCP tool definitions/logic for the /mcp route — # see server/src/routes/mcp.ts), so both workspaces' manifests and sources # must be present before `npm ci`/build. FROM node:22-alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ COPY server/package.json server/package.json COPY mcp/package.json mcp/package.json RUN npm ci --ignore-scripts COPY mcp/tsconfig.json mcp/tsconfig.json COPY mcp/tsconfig.build.json mcp/tsconfig.build.json COPY mcp/src mcp/src RUN npm run build --workspace=@impri/mcp COPY server/tsconfig.json server/tsconfig.json COPY server/src server/src RUN npm run build --workspace=@impri/server # ---- runtime ---- FROM node:22-alpine WORKDIR /app # argon2 + better-sqlite3 are native; build tools cover cases where no # musl prebuilt binary exists for the current arch RUN apk add --no-cache python3 make g++ COPY package.json package-lock.json ./ COPY server/package.json server/package.json COPY mcp/package.json mcp/package.json RUN npm ci --omit=dev COPY --from=builder /app/mcp/dist ./mcp/dist COPY --from=builder /app/server/dist ./server/dist # Litestream: kontinuální SQLite replikace do S3 (aktivní jen s BUCKET_NAME, viz entrypoint) COPY --from=litestream/litestream:0.3.13 /usr/local/bin/litestream /usr/local/bin/litestream COPY docker/litestream.yml docker/litestream.yml COPY docker/entrypoint.sh docker/entrypoint.sh RUN chmod +x docker/entrypoint.sh EXPOSE 8484 ENV NODE_ENV=production \ HOST=0.0.0.0 \ PORT=8484 CMD ["/app/docker/entrypoint.sh"]