# Anhang A · Testumgebung für Computer Use
#
# Diese Umgebung ist eine LEHRUMGEBUNG. Sie ist von Ihrem Rechner getrennt,
# aber sie ist nicht gehärtet. Nutzen Sie sie mit Testkonten und Testdaten.
#
# Bauen:   docker build -t astra-sandbox .
# Starten: docker run --rm -p 127.0.0.1:8000:8000 \
#            --memory=2g --cpus=2 --pids-limit=256 \
#            --security-opt no-new-privileges \
#            -e SANDBOX_TOKEN="$(openssl rand -hex 16)" \
#            astra-sandbox
#
# Kein --network=host, keine Volumes aus Ihrem Dateisystem, kein --privileged.
# Der Port ist absichtlich an 127.0.0.1 gebunden: von außen nicht erreichbar.

FROM python:3.12-slim

# X11 mit virtuellem Bildschirm, Fenstermanager, Screenshot-Werkzeug, Browser.
# scrot ist Pflicht: ohne es liefert PyAutoGUI unter Linux keine Screenshots.
RUN apt-get update && apt-get install -y --no-install-recommends \
      xvfb x11-utils openbox scrot \
      python3-tk python3-dev \
      chromium \
      fonts-dejavu-core \
      xdotool \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir \
      flask==3.1.3 \
      gunicorn==23.0.0 \
      pyautogui==0.9.54 \
      pillow==11.3.0 \
      pdfplumber==0.11.7

WORKDIR /app
COPY sandbox_server.py helfer.py ./

# Ein Nutzer ohne Rechte. Der vom Modell erzeugte Code läuft mit DIESEN
# Rechten — nicht mit Ihren (Kapitel 2.3).
RUN useradd --create-home --shell /usr/sbin/nologin astra \
    && chown -R astra:astra /app
USER astra

ENV DISPLAY=:99 \
    SANDBOX_TIMEOUT=60 \
    SANDBOX_MAX_CHARS=20000 \
    PYTHONUNBUFFERED=1

EXPOSE 8000

# Xvfb und Fenstermanager starten, dann den Dienst. Browser und PyAutoGUI
# benutzen damit dasselbe Display — sonst klickt der Agent ins Leere.
CMD ["/bin/sh", "-c", "\
    Xvfb :99 -screen 0 1440x900x24 -nolisten tcp & \
    sleep 1 && openbox & \
    exec gunicorn --bind 0.0.0.0:8000 --workers 1 --threads 8 \
                  --timeout 180 sandbox_server:app"]
