FROM ubuntu:24.04 ARG TARGETARCH ARG FINGERPRINT_CHROMIUM_URL_AMD64="https://github.com/adryfish/fingerprint-chromium/releases/download/142.0.7444.175/ungoogled-chromium-142.0.7444.175-1-x86_64_linux.tar.xz" ARG FINGERPRINT_CHROMIUM_URL_ARM64_CHROMIUM_DEB="https://github.com/luispater/fingerprint-chromium-arm64/releases/download/135.0.7049.95-1/ungoogled-chromium_135.0.7049.95-1.deb12u1_arm64.deb" ARG FINGERPRINT_CHROMIUM_URL_ARM64_COMMON_DEB="https://github.com/luispater/fingerprint-chromium-arm64/releases/download/135.0.7049.95-1/ungoogled-chromium-common_135.0.7049.95-1.deb12u1_arm64.deb" ARG FINGERPRINT_CHROMIUM_URL_ARM64_SANDBOX_DEB="https://github.com/luispater/fingerprint-chromium-arm64/releases/download/135.0.7049.95-1/ungoogled-chromium-sandbox_135.0.7049.95-1.deb12u1_arm64.deb" ARG FINGERPRINT_CHROMIUM_URL_ARM64_L10N_DEB="https://github.com/luispater/fingerprint-chromium-arm64/releases/download/135.0.7049.95-1/ungoogled-chromium-l10n_135.0.7049.95-1.deb12u1_all.deb" ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ WEB2API_DATA_DIR=/data \ HOME=/data WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ xz-utils \ xvfb \ xauth \ python3 \ python3-pip \ python3-venv \ python-is-python3 \ software-properties-common \ fonts-liberation \ libasound2t64 \ libatk-bridge2.0-0t64 \ libatk1.0-0t64 \ libcairo2 \ libcups2t64 \ libdbus-1-3 \ libdrm2 \ libfontconfig1 \ libgbm1 \ libglib2.0-0t64 \ libgtk-3-0t64 \ libnspr4 \ libnss3 \ libpango-1.0-0 \ libu2f-udev \ libvulkan1 \ libx11-6 \ libx11-xcb1 \ libxcb1 \ libxcomposite1 \ libxdamage1 \ libxext6 \ libxfixes3 \ libxkbcommon0 \ libxrandr2 \ libxrender1 \ libxshmfence1 \ && add-apt-repository -y universe \ && add-apt-repository -y multiverse \ && rm -rf /var/lib/apt/lists/* ENV VIRTUAL_ENV=/opt/venv \ PATH="/opt/venv/bin:$PATH" RUN python -m venv "${VIRTUAL_ENV}" \ && pip install --no-cache-dir --upgrade pip RUN set -eux; \ arch="${TARGETARCH:-}"; \ if [ -z "${arch}" ]; then arch="$(dpkg --print-architecture)"; fi; \ mkdir -p /opt/fingerprint-chromium; \ case "${arch}" in \ amd64|x86_64) \ curl -L --fail --retry 5 --retry-delay 3 --retry-all-errors "${FINGERPRINT_CHROMIUM_URL_AMD64}" -o /tmp/fingerprint-chromium.tar.xz; \ tar -xf /tmp/fingerprint-chromium.tar.xz -C /opt/fingerprint-chromium --strip-components=1; \ rm -f /tmp/fingerprint-chromium.tar.xz; \ ;; \ arm64|aarch64) \ curl -L --fail --retry 5 --retry-delay 3 --retry-all-errors "${FINGERPRINT_CHROMIUM_URL_ARM64_CHROMIUM_DEB}" -o /tmp/ungoogled-chromium.deb; \ curl -L --fail --retry 5 --retry-delay 3 --retry-all-errors "${FINGERPRINT_CHROMIUM_URL_ARM64_COMMON_DEB}" -o /tmp/ungoogled-chromium-common.deb; \ curl -L --fail --retry 5 --retry-delay 3 --retry-all-errors "${FINGERPRINT_CHROMIUM_URL_ARM64_SANDBOX_DEB}" -o /tmp/ungoogled-chromium-sandbox.deb; \ curl -L --fail --retry 5 --retry-delay 3 --retry-all-errors "${FINGERPRINT_CHROMIUM_URL_ARM64_L10N_DEB}" -o /tmp/ungoogled-chromium-l10n.deb; \ apt-get update; \ apt-get install -y --no-install-recommends /tmp/ungoogled-chromium.deb /tmp/ungoogled-chromium-common.deb /tmp/ungoogled-chromium-sandbox.deb /tmp/ungoogled-chromium-l10n.deb; \ rm -rf /var/lib/apt/lists/* /tmp/ungoogled-chromium*.deb; \ for bin in /usr/bin/ungoogled-chromium /usr/bin/chromium /usr/bin/chromium-browser; do \ if [ -x "${bin}" ]; then ln -sf "${bin}" /opt/fingerprint-chromium/chrome; break; fi; \ done; \ test -x /opt/fingerprint-chromium/chrome; \ ;; \ *) \ echo "Unsupported architecture: ${arch}" >&2; \ exit 1; \ ;; \ esac COPY pyproject.toml /tmp/pyproject.toml RUN python - <<'PY' import subprocess import tomllib with open("/tmp/pyproject.toml", "rb") as f: project = tomllib.load(f)["project"] extra_deps = project.get("optional-dependencies", {}).get("postgres", []) deps = [*project["dependencies"], *extra_deps] subprocess.check_call(["pip", "install", "--no-cache-dir", *deps]) PY COPY . /app RUN chmod +x /app/docker/entrypoint.sh VOLUME ["/data"] EXPOSE 9000 ENTRYPOINT ["/app/docker/entrypoint.sh"]