FROM node:18-alpine AS frontend-builder WORKDIR /app/web/admin-spa COPY web/admin-spa/package*.json ./ RUN npm ci COPY web/admin-spa/ ./ RUN npm run build FROM node:18-alpine LABEL org.opencontainers.image.title="123" LABEL org.opencontainers.image.description="1234" LABEL org.opencontainers.image.version="1.0.0" LABEL maintainer="123@example.com" WORKDIR /app RUN apk add --no-cache redis curl dumb-init python3 py3-pip RUN python3 -m venv /opt/venv && \ . /opt/venv/bin/activate && \ pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir huggingface_hub ENV PATH="/opt/venv/bin:${PATH}" COPY package*.json ./ RUN npm ci --omit=dev && npm cache clean --force COPY . . COPY --from=frontend-builder /app/web/admin-spa/dist /app/web/admin-spa/dist # COPY tools/hf_backup.py /app/tools/hf_backup.py # COPY tools/hf-backup.sh /app/tools/hf-backup.sh RUN chmod +x /app/tools/hf-backup.sh || true COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh RUN chmod +x /usr/local/bin/docker-entrypoint.sh RUN mkdir -p /app/logs /app/data /app/temp RUN if [ ! -f "/app/config/config.js" ] && [ -f "/app/config/config.example.js" ]; then \ cp /app/config/config.example.js /app/config/config.js; \ fi ENV NODE_ENV=production ENV HOST=0.0.0.0 ENV PORT=7860 EXPOSE 7860 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD sh -c 'curl -fsS "http://127.0.0.1:${PORT:-7860}/health" || exit 1' ENTRYPOINT ["dumb-init", "--", "/usr/local/bin/docker-entrypoint.sh"] CMD ["node", "src/app.js"]