# syntax=docker/dockerfile:1.7 FROM node:20-alpine AS frontend-build WORKDIR /build/frontend COPY frontend/package*.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build FROM node:20-alpine AS backend-build RUN apk add --no-cache python3 make g++ WORKDIR /build/backend COPY backend/package*.json ./ RUN npm ci COPY backend/ ./ RUN npm run build && npm prune --omit=dev FROM node:20-alpine AS runtime ARG VERSION=development ARG REVISION=unknown ARG CREATED=unknown LABEL org.opencontainers.image.title="Conductor" \ org.opencontainers.image.description="Visual builder for REST-backed web applications" \ org.opencontainers.image.version="${VERSION}" \ org.opencontainers.image.revision="${REVISION}" \ org.opencontainers.image.created="${CREATED}" \ org.opencontainers.image.source="https://gitea.skeletonworks.online/vwiebe/conductor" ENV NODE_ENV=production \ PORT=8080 \ CONDUCTOR_DATA_DIR=/data \ CONDUCTOR_STATIC_DIR=/app/public \ CONDUCTOR_VERSION=${VERSION} RUN addgroup -S -g 10001 conductor && adduser -S -D -H -u 10001 -G conductor conductor \ && mkdir -p /app /data /shared/schemas \ && chown -R conductor:conductor /app /data WORKDIR /app COPY --from=backend-build --chown=conductor:conductor /build/backend/package*.json ./ COPY --from=backend-build --chown=conductor:conductor /build/backend/node_modules ./node_modules COPY --from=backend-build --chown=conductor:conductor /build/backend/dist ./dist COPY --from=frontend-build --chown=conductor:conductor /build/frontend/build ./public COPY --chown=conductor:conductor shared/schemas/conductor-project.schema.json /shared/schemas/conductor-project.schema.json USER conductor EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ CMD node -e "fetch('http://127.0.0.1:8080/api/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))" CMD ["node", "dist/index.js"]