/ scripts / sandbox-browser-entrypoint.sh
sandbox-browser-entrypoint.sh
 1  #!/usr/bin/env bash
 2  set -euo pipefail
 3  
 4  export DISPLAY=:1
 5  export HOME=/tmp/swarmclaw-browser-home
 6  export XDG_CONFIG_HOME="${HOME}/.config"
 7  export XDG_CACHE_HOME="${HOME}/.cache"
 8  
 9  CDP_PORT="${SWARMCLAW_BROWSER_CDP_PORT:-9222}"
10  VNC_PORT="${SWARMCLAW_BROWSER_VNC_PORT:-5900}"
11  NOVNC_PORT="${SWARMCLAW_BROWSER_NOVNC_PORT:-6080}"
12  HEADLESS="${SWARMCLAW_BROWSER_HEADLESS:-1}"
13  ENABLE_NOVNC="${SWARMCLAW_BROWSER_ENABLE_NOVNC:-1}"
14  ALLOW_NO_SANDBOX="${SWARMCLAW_BROWSER_NO_SANDBOX:-1}"
15  NOVNC_PASSWORD="${SWARMCLAW_BROWSER_NOVNC_PASSWORD:-}"
16  
17  mkdir -p "${HOME}" "${HOME}/.chrome" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}"
18  
19  Xvfb :1 -screen 0 1280x800x24 -ac -nolisten tcp &
20  
21  CHROME_ARGS=(
22    "--remote-debugging-address=127.0.0.1"
23    "--user-data-dir=${HOME}/.chrome"
24    "--no-first-run"
25    "--no-default-browser-check"
26    "--disable-dev-shm-usage"
27    "--disable-background-networking"
28    "--disable-features=TranslateUI"
29    "--disable-breakpad"
30    "--disable-crash-reporter"
31    "--disable-extensions"
32    "--no-zygote"
33    "--metrics-recording-only"
34  )
35  
36  if [[ "${HEADLESS}" == "1" ]]; then
37    CHROME_ARGS+=("--headless=new")
38  fi
39  
40  if [[ "${ALLOW_NO_SANDBOX}" == "1" ]]; then
41    CHROME_ARGS+=(
42      "--no-sandbox"
43      "--disable-setuid-sandbox"
44    )
45  fi
46  
47  if [[ "${CDP_PORT}" -ge 65535 ]]; then
48    CHROME_CDP_PORT="$((CDP_PORT - 1))"
49  else
50    CHROME_CDP_PORT="$((CDP_PORT + 1))"
51  fi
52  
53  CHROME_ARGS+=("--remote-debugging-port=${CHROME_CDP_PORT}")
54  
55  chromium "${CHROME_ARGS[@]}" about:blank &
56  
57  for _ in $(seq 1 60); do
58    if curl -sS --max-time 1 "http://127.0.0.1:${CHROME_CDP_PORT}/json/version" >/dev/null; then
59      break
60    fi
61    sleep 0.1
62  done
63  
64  # Keep the public endpoint bound to all interfaces inside the container,
65  # while Docker publishes it to loopback on the host.
66  socat "TCP-LISTEN:${CDP_PORT},fork,reuseaddr,bind=0.0.0.0" "TCP:127.0.0.1:${CHROME_CDP_PORT}" &
67  
68  if [[ "${ENABLE_NOVNC}" == "1" && "${HEADLESS}" != "1" ]]; then
69    if [[ -z "${NOVNC_PASSWORD}" ]]; then
70      NOVNC_PASSWORD="$(< /proc/sys/kernel/random/uuid)"
71      NOVNC_PASSWORD="${NOVNC_PASSWORD//-/}"
72      NOVNC_PASSWORD="${NOVNC_PASSWORD:0:8}"
73    fi
74    NOVNC_PASSWD_FILE="${HOME}/.vnc/passwd"
75    mkdir -p "${HOME}/.vnc"
76    x11vnc -storepasswd "${NOVNC_PASSWORD}" "${NOVNC_PASSWD_FILE}" >/dev/null
77    chmod 600 "${NOVNC_PASSWD_FILE}"
78    x11vnc -display :1 -rfbport "${VNC_PORT}" -shared -forever -rfbauth "${NOVNC_PASSWD_FILE}" -localhost &
79    websockify --web /usr/share/novnc/ "${NOVNC_PORT}" "localhost:${VNC_PORT}" &
80  fi
81  
82  wait -n