FROM node:22-alpine AS builder WORKDIR /build # Download latest cursor2api from GitHub as zip (git clone is blocked on HF Spaces) # To update: Settings → Factory reboot ARG REPO=7836246/cursor2api ARG BRANCH=main RUN wget -qO repo.zip https://github.com/${REPO}/archive/refs/heads/${BRANCH}.zip \ && unzip -q repo.zip \ && cp -r cursor2api-${BRANCH}/. . \ && rm -rf cursor2api-${BRANCH} repo.zip # Install all deps and build TypeScript RUN npm ci RUN npm run build # ---- Runtime stage ---- FROM node:22-alpine AS runner WORKDIR /app ENV NODE_ENV=production ENV NODE_OPTIONS="--max-old-space-size=4096" # Install only prod deps COPY --from=builder /build/package.json /build/package-lock.json ./ RUN npm ci --omit=dev && npm cache clean --force # Copy built output and static assets COPY --from=builder --chown=node:node /build/dist ./dist COPY --from=builder --chown=node:node /build/public ./public # Copy config example COPY --from=builder --chown=node:node /build/config.yaml.example ./config.yaml.example # Entrypoint COPY --chown=node:node entrypoint.sh ./entrypoint.sh RUN chmod +x ./entrypoint.sh # Pre-create writable dirs as root, then hand to node user RUN mkdir -p /app/logs /app/config \ && chown -R node:node /app USER node # HF Spaces requires port 7860 EXPOSE 7860 ENTRYPOINT ["./entrypoint.sh"]