- Add passwordless sudo for sandbox user in playwright and desktop images - Configure Yao branding for Fluxbox (CUI dark theme, centered logo) - Configure Yao branding for XFCE (panel icons, wallpaper, workspace shortcut) - Add D-Bus support for XFCE desktop environment - Add dynamic wallpaper generation with configurable resolution and logo size - Hide Fluxbox toolbar for cleaner Playwright automation view - Create chromium wrapper script using Playwright's bundled browser - Add feh and imagemagick for wallpaper management in Fluxbox - Update .gitignore for config scripts and TODO file Co-authored-by: Cursor <cursoragent@cursor.com>
103 lines
3.3 KiB
Docker
103 lines
3.3 KiB
Docker
# Claude sandbox with Playwright browser automation + VNC preview
|
|
# Image: sandbox-claude-playwright
|
|
# Base: sandbox-claude (Ubuntu 24.04 + Node.js + Python + Claude CLI)
|
|
# Adds: Xvfb + x11vnc + noVNC + Fluxbox + Playwright browsers
|
|
#
|
|
# Supports both amd64 and arm64 architectures
|
|
|
|
ARG REGISTRY=yaoapp
|
|
FROM ${REGISTRY}/sandbox-claude:latest
|
|
|
|
USER root
|
|
|
|
# Use MIT mirror (USA) for ARM64
|
|
RUN sed -i 's|http://ports.ubuntu.com/ubuntu-ports|http://mirrors.mit.edu/ubuntu-ports|g' /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null || \
|
|
sed -i 's|http://ports.ubuntu.com/ubuntu-ports|http://mirrors.mit.edu/ubuntu-ports|g' /etc/apt/sources.list 2>/dev/null || true
|
|
|
|
# Install X11, VNC, and minimal window manager
|
|
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 (lightweight, perfect for Playwright)
|
|
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 in browsers, can be disabled)
|
|
pulseaudio \
|
|
&& 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
|
|
|
|
# Install Playwright system dependencies (requires root)
|
|
# This installs system libraries needed by Chromium/Firefox
|
|
RUN npx playwright install-deps chromium firefox || true
|
|
|
|
# Install Playwright and browsers as sandbox user
|
|
USER sandbox
|
|
|
|
# Install Playwright for Node.js (global) and Python
|
|
RUN npm install -g playwright && \
|
|
pip install --user --break-system-packages playwright && \
|
|
npx playwright install chromium firefox
|
|
|
|
USER root
|
|
|
|
# Create directories for branding assets
|
|
RUN mkdir -p /usr/local/share/yao
|
|
|
|
# Copy VNC startup scripts and branding assets
|
|
# Note: Build context should be sandbox/docker/, so paths are relative to that
|
|
COPY vnc/start-vnc.sh /usr/local/bin/start-vnc.sh
|
|
COPY vnc/entrypoint-vnc.sh /usr/local/bin/entrypoint.sh
|
|
COPY playwright/config/setup-fluxbox.sh /usr/local/bin/setup-fluxbox.sh
|
|
COPY playwright/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
|
|
|
|
# Environment variables for VNC
|
|
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 - ensure global modules are accessible
|
|
ENV NODE_PATH=/home/sandbox/.npm-global/lib/node_modules
|
|
|
|
# Expose VNC ports (internal use only, accessed via proxy)
|
|
EXPOSE 5900 6080
|
|
|
|
USER sandbox
|
|
WORKDIR /workspace
|
|
|
|
# Verify installations
|
|
RUN echo "=== Verifying installations ===" && \
|
|
node --version && \
|
|
npm --version && \
|
|
python3 --version && \
|
|
npx playwright --version && \
|
|
python3 -c "from playwright.sync_api import sync_playwright; print('Python Playwright: OK')" && \
|
|
which fluxbox && \
|
|
which x11vnc && \
|
|
which Xvfb && \
|
|
echo "=== All installations verified ==="
|
|
|
|
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
|
CMD ["sleep", "infinity"]
|