yao/sandbox/docker/chrome/Dockerfile
Max 95cdf7961c Add Chrome support to sandbox module and update documentation
- Introduce a new Chrome image for the sandbox, enabling VNC access with real Chrome and CDP support (amd64 only).
- Update README to reflect the addition of the Chrome image and its build instructions.
- Modify build script to include a dedicated build process for the Chrome image.
- Enhance .gitignore to exclude the new Chrome plan file.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 17:48:49 +08:00

166 lines
5.7 KiB
Docker

# Claude sandbox with real Google Chrome + anti-detection stealth
# Image: sandbox-claude-chrome
# Base: sandbox-claude (Ubuntu 24.04 + Node.js + Python + Claude CLI)
# Adds: Xvfb + x11vnc + noVNC + Fluxbox + Real Chrome + Patchright + PyAutoGUI
#
# Anti-bot detection browser environment for web research tasks
# amd64 architecture only (Google Chrome has no official arm64 Linux build)
ARG REGISTRY=yaoapp
FROM ${REGISTRY}/sandbox-claude:latest
USER root
# ============================================
# 1. VNC + Window Manager (same as browser image)
# ============================================
RUN apt-get update && apt-get install -y --no-install-recommends \
# Sudo for sandbox user
sudo \
# Virtual display
xvfb \
# VNC server
x11vnc \
# noVNC (HTML5 VNC client) and websockify
novnc \
python3-websockify \
# Minimal window manager
fluxbox \
# Background/wallpaper utilities
feh \
imagemagick \
# Fonts (required for proper browser rendering)
fonts-liberation \
fonts-noto-cjk \
fonts-noto-color-emoji \
# X11 utilities
x11-utils \
xdotool \
# Audio (for video playback)
pulseaudio \
# PyAutoGUI X11 dependencies
python3-tk \
python3-dev \
scrot \
# Misc
xterm \
&& rm -rf /var/lib/apt/lists/*
# Configure passwordless sudo for sandbox user
RUN echo "sandbox ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/sandbox && \
chmod 0440 /etc/sudoers.d/sandbox
# ============================================
# 2. Real Google Chrome (amd64 only)
# ============================================
RUN curl -fsSL https://dl.google.com/linux/linux_signing_key.pub \
| gpg --dearmor -o /usr/share/keyrings/google-chrome.gpg && \
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] \
http://dl.google.com/linux/chrome/deb/ stable main" \
> /etc/apt/sources.list.d/google-chrome.list && \
apt-get update && apt-get install -y google-chrome-stable && \
rm -rf /var/lib/apt/lists/*
# ============================================
# 3. Playwright system deps (for Patchright compatibility)
# ============================================
RUN npx playwright install-deps chromium || true
# ============================================
# 4. Python anti-detection libraries
# ============================================
USER sandbox
# Install Patchright (stealth Playwright fork) + PyAutoGUI + stealth libs
RUN pip install --user --break-system-packages \
patchright \
pyautogui \
playwright-stealth \
playwright && \
# Install Patchright browser deps (uses system Chrome, no Chromium download)
python3 -m patchright install chromium || true
# Install Node.js Playwright + stealth plugins
RUN npm install -g playwright playwright-extra puppeteer-extra-plugin-stealth
USER root
# ============================================
# 5. Copy config files
# ============================================
RUN mkdir -p /usr/local/share/yao
# VNC startup scripts (shared with browser/desktop)
COPY vnc/start-vnc.sh /usr/local/bin/start-vnc.sh
COPY vnc/entrypoint-vnc.sh /usr/local/bin/entrypoint.sh
# Chrome-specific config files
COPY chrome/config/setup-fluxbox.sh /usr/local/bin/setup-fluxbox.sh
COPY chrome/config/chrome-stealth.sh /usr/local/bin/chrome-stealth
COPY chrome/config/stealth-init.js /usr/local/share/yao/stealth-init.js
COPY chrome/config/chrome-preferences.json /usr/local/share/yao/chrome-preferences.json
# Reuse yao-logo from browser image
COPY browser/config/yao-logo.png /usr/local/share/yao/yao-logo.png
RUN chmod +x /usr/local/bin/start-vnc.sh \
/usr/local/bin/entrypoint.sh \
/usr/local/bin/setup-fluxbox.sh \
/usr/local/bin/chrome-stealth
# ============================================
# 6. Default Chrome profile + X11 auth
# ============================================
RUN mkdir -p /home/sandbox/.config/google-chrome/Default && \
cp /usr/local/share/yao/chrome-preferences.json \
/home/sandbox/.config/google-chrome/Default/Preferences && \
# Mark first run as done
touch /home/sandbox/.config/google-chrome/First\ Run && \
# Create .Xauthority for PyAutoGUI (Xvfb runs without auth)
touch /home/sandbox/.Xauthority && \
chown -R sandbox:sandbox /home/sandbox/.config/google-chrome /home/sandbox/.Xauthority
# ============================================
# 7. Environment variables
# ============================================
ENV DISPLAY=:99
ENV VNC_PORT=5900
ENV NOVNC_PORT=6080
ENV RESOLUTION=1920x1080x24
ENV SANDBOX_VNC_ENABLED=true
ENV SANDBOX_DESKTOP=fluxbox
# Node.js environment
ENV NODE_PATH=/home/sandbox/.npm-global/lib/node_modules
# Timezone
ENV TZ=America/New_York
# Expose VNC ports (internal use only, accessed via proxy)
EXPOSE 5900 6080
USER sandbox
WORKDIR /workspace
# ============================================
# 8. Verify installations
# ============================================
RUN echo "=== Verifying installations ===" && \
google-chrome-stable --version && \
node --version && \
npm --version && \
python3 --version && \
python3 -c "from patchright.sync_api import sync_playwright; print('Patchright: OK')" && \
python3 -c "from playwright.sync_api import sync_playwright; print('Playwright: OK')" && \
python3 -c "from playwright_stealth import Stealth; print('Playwright-Stealth: OK')" && \
pip3 show pyautogui | head -2 && echo "PyAutoGUI: OK" && \
which fluxbox && \
which x11vnc && \
which Xvfb && \
which chrome-stealth && \
test -f /usr/local/share/yao/stealth-init.js && \
test -f /home/sandbox/.config/google-chrome/Default/Preferences && \
echo "=== All installations verified ==="
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["sleep", "infinity"]