FROM node:24-alpine AS build WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --no-audit --no-fund COPY index.html tsconfig.json vite.config.ts ./ COPY src ./src COPY shared ./shared COPY public ./public RUN npm run build FROM node:24-bookworm-slim AS runtime WORKDIR /app ENV NODE_ENV=production PORT=5188 HOST=0.0.0.0 STATUS_DB_PATH=/app/data/status.sqlite ENV PLAYWRIGHT_BROWSERS_PATH=/opt/playwright COPY package.json package-lock.json ./ RUN npm ci --omit=dev --no-audit --no-fund && npx playwright install --with-deps chromium && chmod -R a+rX /opt/playwright COPY --from=build /app/dist ./dist COPY server ./server COPY shared ./shared COPY config ./config COPY public/widget-client.js ./public/widget-client.js RUN mkdir -p /app/data && chown -R node:node /app/data USER node EXPOSE 5188 VOLUME /app/data HEALTHCHECK --interval=30s --timeout=3s --start-period=15s CMD node -e "fetch('http://127.0.0.1:'+process.env.PORT+'/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" CMD ["node", "server/index.mjs"]