- Refactored the sandbox initialization process to resolve the connector before obtaining the Computer, allowing for the injection of OPENAI_PROXY_* environment variables. - Updated the GetComputer and BuildCreateOptions functions to accept an optional connector parameter for improved environment variable management. - Standardized the VNC configuration by replacing SANDBOX_VNC_ENABLED with VNC_ENABLED across Dockerfiles and related scripts for consistency. - Enhanced the VNC service startup script to check the new VNC_ENABLED variable, ensuring proper service initialization. Made-with: Cursor
166 lines
5.7 KiB
Docker
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 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"]
|