FROM node:20-bookworm-slim ENV DEBIAN_FRONTEND=noninteractive # Chromium + Python RUN apt-get update && apt-get install -y --no-install-recommends \ chromium \ python3 python3-venv python3-pip \ ca-certificates \ libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 \ libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 \ libasound2 libpangocairo-1.0-0 libpango-1.0-0 libgtk-3-0 libxss1 \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Copy just manifests first for cache-friendly install COPY package.json /app # Puppeteer uses system Chromium ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium # Install Node deps (if lock is missing, fall back to npm install) RUN if [ -f package-lock.json ]; then \ npm ci --omit=dev --no-audit --no-fund ; \ else \ npm install --omit=dev --no-audit --no-fund ; \ fi # Python venv to avoid PEP 668 RUN python3 -m venv /opt/venv ENV PATH="/opt/venv/bin:${PATH}" # install gunicorn as well as flask/requests RUN pip install --no-cache-dir gunicorn flask requests # Copy the rest of the app COPY . /app # Copy entrypoint script COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh EXPOSE 80 ENV ADMIN_BOT_ENABLED=1 ENV ADMIN_BOT_INTERVAL=15 ENV BASE_URL=http://127.0.0.1:80 ENTRYPOINT ["/entrypoint.sh"]