diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..addfcea --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +**/__pycache__ +**/*.pyc +**/*.egg-info +.venv +backend/.venv +frontend/node_modules +frontend/dist +artifacts +.git +.gitea +.pytest_cache +.ruff_cache +tests +*.swp diff --git a/Dockerfile b/Dockerfile index eb3fcad..1655cd8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,15 @@ FROM python:3.13-slim -# Install system dependencies +# ── System dependencies ──────────────────────────────────────────────────────── +# Includes Xvfb/VNC stack, git (needed for pip's git+https installs), +# and Chromium runtime libs (for the playwright-managed Chromium binary). RUN apt-get update && apt-get install -y --no-install-recommends \ xvfb \ x11vnc \ websockify \ novnc \ curl \ + git \ libnss3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ @@ -25,40 +28,57 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ fonts-liberation \ && rm -rf /var/lib/apt/lists/* -# Install Node.js 22.x from nodesource.com +# ── Node.js 22.x ────────────────────────────────────────────────────────────── RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* -# Install uv via pip -RUN pip install uv +# ── npm global tools: @playwright/cli + Chromium browser ────────────────────── +# @playwright/cli — token-efficient browser CLI used by research agents +# (playwright-cli -s=research open/snapshot/click/type …) +# playwright — provides `playwright install` to download managed Chromium +# Chromium is installed to /root/.cache/ms-playwright/ (default for root user) +RUN npm install -g @playwright/cli playwright \ + && playwright install chromium -# Disable reflinks — overlayfs doesn't support them (EAGAIN inside Docker builds) +# ── Python tooling ──────────────────────────────────────────────────────────── +RUN pip install uv +# overlayfs inside Docker doesn't support reflinks → use copy mode to avoid EAGAIN ENV UV_LINK_MODE=copy -# Copy backend dependency files and install Python dependencies +# ── amplifierd: Amplifier session daemon ────────────────────────────────────── +# Not on PyPI — source is github.com/microsoft/amplifierd. +# uv pip --system installs to /usr/local/bin/amplifierd (on PATH by default). +# +# amplifier-foundation is also not on PyPI (it's a pure git package that +# amplifierd depends on), so we install it explicitly in the same step. +# amplifier-core IS on PyPI and will be resolved automatically. +RUN uv pip install --system \ + "amplifier-foundation @ git+https://github.com/microsoft/amplifier-foundation@main" \ + "amplifierd @ git+https://github.com/microsoft/amplifierd" + +# ── Frontend: install deps and build ────────────────────────────────────────── +# Copy package manifests first so npm ci is cached independently of source changes. +COPY frontend/package.json frontend/package-lock.json /app/frontend/ +WORKDIR /app/frontend +RUN npm ci +COPY frontend/ /app/frontend/ +RUN npm run build + +# ── Backend: install Python deps ────────────────────────────────────────────── COPY backend/pyproject.toml backend/uv.lock /app/backend/ WORKDIR /app/backend RUN uv sync --frozen -# Install Playwright chromium -RUN uv run playwright install chromium - -# Install amplifierd -RUN uv pip install amplifierd - -# Copy application files +# ── Application files ───────────────────────────────────────────────────────── COPY backend/*.py /app/backend/ COPY bundle/ /app/bundle/ -COPY frontend/dist/ /app/frontend/dist/ COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh -# Create artifacts directory RUN mkdir -p /app/artifacts WORKDIR /app - EXPOSE 8080 6080 ENV DISPLAY=:99 diff --git a/entrypoint.sh b/entrypoint.sh index 2baba65..f48b61e 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -21,8 +21,11 @@ sleep 1 echo "[OK] noVNC on :6080" # (4) Start amplifierd and wait for it to be healthy +# amplifierd uses a 'serve' subcommand; --bundle requires NAME=URI format cd /app -amplifierd --port 8410 --bundle /app/bundle/bundle.md & +amplifierd serve --port 8410 \ + --bundle "research-workbench=/app/bundle/bundle.md" \ + --default-bundle research-workbench & AMPLIFIERD_PID=$! echo "Waiting for amplifierd..."