50 lines
1.6 KiB
Docker
50 lines
1.6 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 oauthProbe.js /src/oauthProbe.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/oauthProbe.js ./oauthProbe.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 ["npm", "start"]
|