docker/server.Dockerfile
Rama main · réplica de lectura del repositorio original.
# 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"]