Failed to start Chrome CDP on port 18800
Por qué Chromium en snap rompe el control del navegador de OpenClaw en Linux
Le pides al agente que abra una página y la llamada a la herramienta vuelve con una sola línea de JSON: Failed to start Chrome CDP on port 18800 for profile openclaw. Nada en ese mensaje dice qué parte falló, y en una máquina Linux sin interfaz gráfica el navegador ni siquiera llega a aparecer. La causa habitual no es OpenClaw, sino el navegador que apt instaló por ti.
Cuatro mensajes de error, cuatro causas distintas
- Failed to start Chrome CDP on port 18800 for profile openclaw significa que el perfil gestionado no consigue arrancar en su puerto de depuración. En Ubuntu, el motivo habitual es que el Chromium de la máquina es un envoltorio snap y no un binario de navegador real.
- The profile appears to be in use by another Chromium process apunta a archivos de bloqueo Singleton obsoletos en el directorio del perfil gestionado. OpenClaw elimina esos bloqueos y reintenta una vez cuando el bloqueo nombra un proceso muerto en el host actual, pero los bloqueos que nombran otro nombre de host se conservan hasta que confirmes que el perfil ya no está en uso, también después de cambiar el nombre de la máquina.
- Missing X server or $DISPLAY significa que se pidió explícitamente un navegador visible en un host sin sesión de escritorio. Los perfiles gestionados locales ya pasan a modo headless en Linux cuando DISPLAY y WAYLAND_DISPLAY no están definidas, así que ver este error significa que algo forzó un navegador con interfaz gráfica: OPENCLAW_BROWSER_HEADLESS=0, browser.headless en false o la misma clave en un solo perfil.
- El error Port N is in use for profile NAME but not by openclaw aparece cuando ya hay configurado un servicio CDP externo en loopback y attachOnly sigue en false. La solución es dejar de pedirle a OpenClaw que lance su propio navegador, que es la vía attach-only que se describe más abajo.
El confinamiento AppArmor de snap interfiere con la forma en que OpenClaw lanza y supervisa el proceso del navegador.
Por qué apt install chromium es la causa raíz
En Ubuntu y en la mayoría de las distribuciones Linux, apt install chromium no te da un navegador. El paquete se resuelve como chromium-browser, apt muestra una nota indicando que seleccionó chromium-browser en lugar de chromium, y lo que llega al disco es un envoltorio snap. Eso importa, porque cuando OpenClaw lanza un navegador en local toma el primero que encuentra en el orden Chrome, Brave, Edge, Chromium, Chrome Canary, y su ruta de búsqueda en Linux abarca /usr/bin, /snap/bin, /opt/google, /opt/brave.com, /usr/lib/chromium y /usr/lib/chromium-browser, además del Chromium gestionado por Playwright en PLAYWRIGHT_BROWSERS_PATH o ~/.cache/ms-playwright. En un servidor recién instalado donde el snap es el único binario de la familia Chromium presente, la detección lo encuentra y cada lanzamiento gestionado muere en él. Ninguna combinación de opciones lo arregla, y por eso la respuesta documentada es un binario distinto y no un ajuste distinto.
Tres pasos que lo solucionan
- Instala Google Chrome de verdad, que es la solución recomendada. Descarga google-chrome-stable_current_amd64.deb desde dl.google.com, instálalo con dpkg -i y ejecuta sudo apt --fix-broken install -y si hay quejas de dependencias. Después establece browser.executablePath en /usr/bin/google-chrome-stable en ~/.openclaw/openclaw.json, con enabled, headless y noSandbox en true.
- Si el Chromium de snap tiene que quedarse, usa el modo attach-only. Establece browser.attachOnly en true para que OpenClaw nunca lance nada, e inicia el navegador tú mismo con chromium-browser --headless --no-sandbox --disable-gpu --remote-debugging-port=18800 --user-data-dir=$HOME/.openclaw/browser/openclaw/user-data about:blank.
- Haz que ese navegador manual sobreviva a tu shell con un servicio de usuario de systemd. Una unidad en ~/.config/systemd/user/openclaw-browser.service que ejecute /snap/bin/chromium con las mismas opciones, más Restart=on-failure y RestartSec=5, habilitada con systemctl --user enable --now openclaw-browser.service, deja el puerto CDP escuchando antes de que OpenClaw lo pida.
La superficie de configuración son seis ajustes, y los valores predeterminados están pensados para un portátil, no para un servidor. browser.enabled activa el control del navegador y ya está en true. browser.executablePath es la ruta a un binario basado en Chromium (Chrome, Brave, Edge o Chromium), que se detecta automáticamente si lo omites, con preferencia por el navegador predeterminado del sistema cuando ese navegador está basado en Chromium. browser.headless ejecuta el navegador sin interfaz gráfica y por defecto es false, así que un servidor tiene que establecerlo explícitamente, con OPENCLAW_BROWSER_HEADLESS disponible como sobrescritura por proceso, sin definir por defecto. browser.noSandbox añade la opción --no-sandbox que necesitan algunas instalaciones de Linux, false por defecto, y browser.attachOnly impide que OpenClaw lance ningún navegador, false por defecto. El modo attach-only también es la respuesta documentada en una Raspberry Pi, un host VPS antiguo o un almacenamiento lento, donde Chrome necesita más tiempo para exponer su endpoint HTTP de CDP del que permite el plazo del navegador gestionado. OpenClaw en Linux cubre la instalación en Linux en general, y OpenClaw en un VPS es la lista de comprobación para un servidor sin nadie delante.
Fallo de arranque de CDP o bloqueo de navegación
Con el navegador configurado, verifícalo antes de buscar en otro sitio. Estas comprobaciones van al servicio de control del navegador de OpenClaw, no al puerto CDP de Chrome que se usa al lanzarlo, y su puerto se deriva de gateway.port: 18791 por defecto, el puerto del Gateway más dos, así que ajústalo si moviste el Gateway. Pide la ruta raíz con curl y obtendrás running, pid y chosenBrowser; haz un POST a /start; luego un GET a /tabs. Ahora recorre la escalera que separa las dos clases de fallo: openclaw browser --browser-profile openclaw start, luego tabs, luego open https://example.com. Si start falla con not reachable after start, el plano de control no está sano y lo que hay que perseguir es la disponibilidad de CDP. Si start funciona y tabs falla, sigue siendo un problema de conectividad, no un problema de la página. Si start y tabs pasan y solo falla open o navigate, el navegador está sano y lo que tienes delante es la política de navegación o la propia página, que es otra ruta de código: la configuración del navegador usa por defecto un objeto de política SSRF que cierra ante la duda (fail-closed) incluso si nunca escribiste browser.ssrfPolicy, y un start o un tabs correcto no concede nada a la siguiente dirección. Cuando hace falta una excepción, una entrada acotada con el nombre de host exacto en allowedHostnames es mejor que abrir la red privada, y dangerouslyAllowPrivateNetwork solo tiene cabida en un entorno que hayas revisado a conciencia. La herramienta de navegador de OpenClaw es la que el agente llama realmente, y la API de control del navegador es la referencia completa de la API de control y de la línea de comandos.
En Diali
Diali aloja OpenClaw, así que no tendrás que pasar una noche así. Cada cliente ejecuta su propio asistente en lugar de una parte de uno compartido, y la configuración de ejecución se genera a partir de lo que ajustas en el panel y se vuelve a escribir en cada versión, así que no hay ningún openclaw.json en un servidor que reparar después de una actualización ni ninguna decisión entre snap y deb que tomar. Todo lo que el asistente conserva vive en un volumen persistente, con instantáneas diarias y restauración en un clic disponibles a través del complemento Copias de seguridad (incluido en Max). OpenClaw alojado en Diali describe la configuración alojada y la página de precios de Diali indica lo que cuesta.
- apt install chromium te da un envoltorio snap, no un navegador.
- Primero, Chrome de verdad; después, attach-only más una unidad systemd.
- start y tabs pasan pero open falla: es la política, no CDP.
Deja de leer sobre ello y crea el tuyo
Configura un agente, elige un canal y ponlo a trabajar dentro de la aplicación que ya tienes abierta.
