annonet/Dockerfile

50 lines
1.7 KiB
Docker

FROM alpine:3.22 AS source
RUN apk add --no-cache unzip
WORKDIR /src
COPY annonet-arrowstack-ready.zip /tmp/annonet.zip
RUN unzip -q /tmp/annonet.zip -d /src
COPY mcpAuthMiddleware.js /src/src/auth/mcpAuthMiddleware.js
COPY scopeProbe.js /src/scopeProbe.js
# Arrowstack's database-per-tenant runtime role intentionally cannot install
# extensions. PostgreSQL 13+ provides gen_random_uuid() in core, and annoNet
# does not use any other pgcrypto functions.
RUN sed -i '/^CREATE EXTENSION IF NOT EXISTS pgcrypto;$/d' /src/sql/001_init.sql
FROM node:22-alpine AS frontend-build
WORKDIR /build/frontend-astro
COPY --from=source /src/frontend-astro/package*.json ./
RUN npm ci
COPY --from=source /src/frontend-astro/ ./
RUN npm run build
FROM node:22-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production \
HOST=0.0.0.0 \
PORT=8787
RUN apk add --no-cache curl
COPY --from=source /src/package*.json ./
RUN npm ci --omit=dev && npm cache clean --force
COPY --from=source /src/src ./src
COPY --from=source /src/sql ./sql
COPY --from=source /src/scripts ./scripts
COPY --from=source /src/frontend ./frontend
COPY --from=source /src/scopeProbe.js ./scopeProbe.js
COPY --from=frontend-build /build/frontend-astro/dist ./public
RUN npm run check \
&& mkdir -p /app/uploads/images \
&& cp /app/frontend/annotation-overlay.js /app/public/annotation-overlay.js \
&& cp /app/frontend/*.html /app/public/
EXPOSE 8787
HEALTHCHECK --interval=10s --timeout=5s --start-period=20s --retries=6 \
CMD node -e "fetch('http://127.0.0.1:8787/api/health/ready').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
CMD ["sh", "-c", "npm run migrate && node scopeProbe.js && node src/server.js"]