# Ubuntu with Firefox that, seen from a web page, looks like an ordinary Ubuntu desktop: a screen with a top
# bar and a maximized window, a sound device, Ubuntu's fonts, video codecs and WebGL. For running
# barebidi (and its tests) on servers.
#
#   docker build -t barebidi .
#   docker run --rm --shm-size=2g barebidi                                   # the test suite
#   docker run --rm --shm-size=2g -e TZ=America/New_York barebidi python your_script.py
#
# Firefox needs more shared memory than Docker's default 64 MB, hence --shm-size. Set TZ (and the browser's
# locale) to match where your IP or proxy is. Use Browser(headless=False): on Linux, headless Firefox has no
# WebGL at all and detectors find it less like a desktop.
FROM ubuntu:24.04 AS system
ENV DEBIAN_FRONTEND=noninteractive
# Firefox from Mozilla's own repository: Ubuntu's package is only a wrapper around the snap.
RUN apt-get update \
 && apt-get install -y --no-install-recommends ca-certificates curl \
 && install -d -m 0755 /etc/apt/keyrings \
 && curl -fsSL https://packages.mozilla.org/apt/repo-signing-key.gpg -o /etc/apt/keyrings/packages.mozilla.org.asc \
 && echo "deb [signed-by=/etc/apt/keyrings/packages.mozilla.org.asc] https://packages.mozilla.org/apt mozilla main" > /etc/apt/sources.list.d/mozilla.list \
 && printf 'Package: *\nPin: origin packages.mozilla.org\nPin-Priority: 1000\n' > /etc/apt/preferences.d/mozilla \
 && apt-get update \
 && apt-get install -y --no-install-recommends \
      firefox python3 tini tzdata \
      xvfb xauth jwm pulseaudio \
      libgl1-mesa-dri libegl1 libgl1 libavcodec60 \
      fonts-ubuntu fonts-dejavu-core fonts-liberation2 fonts-noto-color-emoji \
 && apt-get purge -y curl && apt-get autoremove -y \
 && rm -rf /var/lib/apt/lists/*

FROM system AS build
COPY --from=ghcr.io/astral-sh/uv:0.9.27 /uv /usr/local/bin/uv
ENV UV_PYTHON=/usr/bin/python3 UV_PYTHON_DOWNLOADS=never
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-install-project
COPY . .
RUN uv sync --frozen
RUN uv run --with camoufox python -m camoufox fetch

FROM system
COPY docker/desktop /usr/local/bin/desktop
COPY --from=ghcr.io/astral-sh/uv:0.9.27 /uv /usr/local/bin/uv
RUN useradd --create-home scraper
COPY --chown=scraper docker/jwmrc /home/scraper/.jwmrc
COPY --from=build --chown=scraper /app /app
COPY --from=build --chown=scraper /root/.cache/camoufox /home/scraper/.cache/camoufox
USER scraper
WORKDIR /app
ENV PATH=/app/.venv/bin:$PATH UV_PYTHON=/usr/bin/python3 UV_PYTHON_DOWNLOADS=never
ENTRYPOINT ["tini", "--", "desktop"]
CMD ["python", "-m", "pytest", "-q", "-p", "no:cacheprovider"]
