Introducción
Disponer de un navegador web en un servidor Linux no significa necesariamente instalar un entorno gráfico completo ni abrir ventanas como en un ordenador de escritorio. En muchos casos, lo que se necesita es un navegador automatizable y capaz de ejecutar JavaScript, cargar aplicaciones web modernas, aceptar cookies, generar capturas de pantalla, guardar el HTML renderizado o recorrer una lista de URLs sin intervención manual.
Para conseguirlo de forma práctica en un servidor Ubuntu pueden combinarse tres componentes principales: Node.js y npm como entorno de ejecución, Playwright como biblioteca de automatización y Chromium como navegador controlado desde código. Esta combinación permite trabajar con páginas dinámicas que no pueden descargarse correctamente con herramientas como curl o wget, especialmente cuando el contenido se genera después de cargar JavaScript.
En este artículo se explica cómo revisar primero el estado real del servidor, comprobar si alguno de los componentes ya está instalado, instalar Node.js 24.18.0 junto con npm, preparar un proyecto Playwright, descargar Chromium y verificar el conjunto con un programa de prueba. También se incluyen precauciones específicas para servidores en producción y para versiones de Ubuntu fuera de soporte.
Índice
Qué componentes necesitamos y para qué sirve cada uno
La solución se apoya en varias capas. Cada componente resuelve una parte distinta del problema.
Node.js
Node.js permite ejecutar JavaScript fuera del navegador. En este escenario actúa como motor del programa que abrirá páginas, esperará a que carguen, interactuará con botones y guardará resultados.
npm
npm es el gestor de paquetes que acompaña habitualmente a Node.js. Se utiliza para crear el proyecto, registrar sus dependencias e instalar Playwright.
Playwright
Playwright es una biblioteca de automatización de navegadores. Permite controlar Chromium desde JavaScript, navegar por páginas dinámicas, esperar a que termine la actividad de red, pulsar botones, leer el contenido visible, guardar el HTML final y generar capturas completas.
Chromium
Chromium es el navegador real que ejecuta el JavaScript de las páginas. Playwright puede descargar una versión compatible y mantenerla separada del navegador del sistema. Esta separación evita muchos problemas de versiones y dependencias.
Por qué curl no siempre es suficiente
curl descarga la respuesta HTTP inicial, pero no ejecuta JavaScript. En una aplicación web tipo SPA, el HTML inicial puede contener únicamente el contenedor de la aplicación y referencias a ficheros JavaScript. Los datos reales llegan después mediante peticiones internas. Un navegador automatizado sí puede ejecutar ese proceso completo.
Comprobar la versión de Linux antes de instalar nada
Antes de modificar el servidor conviene identificar con precisión la distribución, la versión, la arquitectura y el kernel. No debe suponerse que un servidor es Ubuntu 22, Ubuntu 23 o Ubuntu 24 solo por su antigüedad.
cat /etc/os-release
lsb_release -a
uname -a
uname -m
hostnamectl
Los comandos aportan información complementaria:
cat /etc/os-releasemuestra la versión y el nombre en clave.lsb_release -apresenta la versión de forma legible.uname -amuestra kernel y arquitectura.uname -mconfirma si el sistema es, por ejemplo,x86_64.hostnamectlresume sistema operativo, kernel y virtualización.
En Ubuntu 23.04 aparecerá normalmente el nombre en clave lunar. Si el sistema está fuera de soporte, puede ser necesario corregir los repositorios antes de instalar cualquier componente nuevo.
Comprobar espacio disponible y memoria
df -h
free -h
du -sh /var/cache/apt 2>/dev/null
du -sh /root/.cache 2>/dev/null
La instalación de Node.js ocupa relativamente poco, pero Chromium y sus componentes pueden consumir varios cientos de megabytes. También hay que considerar el espacio que ocuparán las capturas, los HTML y los registros generados.
Comprobar si Node.js, npm, Playwright o Chromium ya están instalados
Antes de instalar hay que comprobar el estado real. Esto evita duplicar repositorios, mezclar versiones o instalar componentes que ya existen.
Comprobar Node.js y npm
node -v
npm -v
which node
which npm
command -v node
command -v npm
Si Node.js no está instalado, la terminal mostrará normalmente un mensaje como command not found. Si existe, conviene anotar la versión y su ruta.
Comprobar el origen de Node.js en APT
apt-cache policy nodejs
dpkg -l | grep -E '^ii[[:space:]]+nodejs'
dpkg -s nodejs 2>/dev/null
apt-cache policy nodejs permite saber qué versión está instalada, qué versión es candidata y desde qué repositorio se obtendría.
Comprobar Playwright
Playwright puede estar instalado de forma global o dentro de un proyecto concreto. La comprobación más útil debe hacerse desde el directorio del proyecto:
npx playwright --version
npm list playwright
npm list --depth=0
También puede comprobarse si existe un proyecto previo:
find /opt /srv /var/www -maxdepth 3 \
-name package.json -o -name package-lock.json 2>/dev/null
Comprobar Chromium del sistema
chromium --version
chromium-browser --version
google-chrome --version
which chromium
which chromium-browser
which google-chrome
Es posible que ninguno de esos comandos exista y, aun así, Playwright tenga su propio Chromium descargado.
Comprobar los navegadores descargados por Playwright
find /root/.cache/ms-playwright -maxdepth 2 -type d 2>/dev/null
du -sh /root/.cache/ms-playwright 2>/dev/null
Si el proceso se ejecutará con otro usuario, la caché puede encontrarse en el directorio personal de ese usuario en lugar de /root.
Revisar APT y los repositorios disponibles
Antes de instalar Node.js debe comprobarse que APT puede actualizar sus índices sin errores. En una versión Ubuntu 23 fuera de soporte, las entradas normales pueden devolver errores 404.
Listar repositorios activos
grep -R --line-number --no-messages \
-E '^[[:space:]]*(deb|deb-src)[[:space:]]' \
/etc/apt/sources.list \
/etc/apt/sources.list.d/
Crear copia de seguridad
cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
cp -a /etc/apt/sources.list.d /etc/apt/sources.list.d.bak
Actualizar los índices
apt update
Si Ubuntu está fuera de soporte, puede ser necesario utilizar old-releases.ubuntu.com. Este cambio permite acceder a los paquetes archivados, pero no devuelve soporte de seguridad al sistema.
Antes de seguir con Node.js, apt update debe terminar sin errores críticos. Para ampliar este punto conviene consultar el artículo sobre cómo gestionar las actualizaciones en un servidor Ubuntu 23 fuera de soporte.
Instalar Node.js 24.18.0 y npm
En el escenario utilizado como referencia se instaló Node.js 24.18.0 desde el repositorio de NodeSource. El paquete incluía también npm 11.16.0.
Comprobar si el repositorio NodeSource ya existe
grep -R --line-number --no-messages \
'deb.nodesource.com' \
/etc/apt/sources.list \
/etc/apt/sources.list.d/
Una entrada válida puede tener una forma parecida a esta:
deb [signed-by=/etc/apt/keyrings/nodesource.gpg] \
https://deb.nodesource.com/node_24.x nodistro main
Comprobar la versión candidata
apt update
apt-cache policy nodejs
Antes de instalar, es aconsejable simular la operación:
apt-get -s install nodejs
La simulación debe revisarse con atención. Si propone eliminar paquetes importantes o sustituir componentes críticos del servidor, hay que detenerse.
Instalar Node.js
apt install nodejs
Después se verifica:
node -v
npm -v
which node
which npm
En la instalación de referencia, la salida fue:
v24.18.0
11.16.0
/usr/bin/node
/usr/bin/npm
También se puede confirmar el origen del paquete:
apt-cache policy nodejs
dpkg -s nodejs | grep -E '^(Package|Version|Status):'
El sufijo nodesource en la versión del paquete indica que procede del repositorio de NodeSource y no del repositorio estándar de Ubuntu.
Crear un proyecto para Playwright
Es preferible instalar Playwright dentro de un proyecto propio en lugar de hacerlo globalmente. Así quedan registrados la versión, las dependencias y los ficheros asociados.
Crear el directorio
mkdir -p /opt/navegador-servidor
cd /opt/navegador-servidor
Inicializar el proyecto
npm init -y
Este comando crea package.json. Después de instalar dependencias aparecerá también package-lock.json.
Comprobar los ficheros
ls -lah
cat package.json
En un servidor con varios proyectos Node.js no conviene compartir indiscriminadamente una única carpeta. Cada automatización debería tener su directorio, su package.json y sus permisos definidos.
Instalar Playwright
Desde el directorio del proyecto:
cd /opt/navegador-servidor
npm install playwright
Después se comprueba la versión:
npx playwright --version
npm list playwright
npm audit
npx ejecuta el binario incluido en el proyecto. De esta forma se utiliza la versión local, no una instalación global desconocida.
Comprobar que Node.js puede cargar la biblioteca
node -e "const { chromium } = require('playwright'); console.log('Playwright cargado');"
Si aparece Playwright cargado, Node.js ha localizado correctamente el módulo.
Instalar Chromium y sus dependencias
Playwright necesita un navegador compatible. La forma más sencilla consiste en permitir que descargue su propia compilación de Chromium.
cd /opt/navegador-servidor
npx playwright install --with-deps chromium
Este comando realiza dos trabajos:
- Instala mediante APT las bibliotecas y fuentes que Chromium necesita.
- Descarga el navegador compatible con la versión de Playwright instalada.
En una versión Ubuntu no soportada oficialmente por Playwright puede aparecer un aviso indicando que se utilizará una compilación de respaldo para Ubuntu 22.04. El aviso no implica por sí solo un fallo, pero obliga a probar el navegador antes de utilizarlo en producción.
Comprobar dónde se ha descargado
find /root/.cache/ms-playwright -maxdepth 2 -type d
du -sh /root/.cache/ms-playwright
Comprobar el ejecutable desde Playwright
node -e "
const { chromium } = require('playwright');
console.log(chromium.executablePath());
"
Este método es más fiable que buscar chromium en /usr/bin, porque el navegador gestionado por Playwright puede estar únicamente dentro de su caché.
Diferencia entre Chromium del sistema y Chromium de Playwright
El Chromium del sistema se instala como paquete general y suele quedar disponible para todos los usuarios. El Chromium de Playwright se descarga para una versión concreta de la biblioteca y suele almacenarse en la caché del usuario que ejecutó la instalación.
Para automatización es habitual preferir el navegador gestionado por Playwright, porque reduce incompatibilidades entre la biblioteca y el navegador.
Crear un programa de prueba
Una vez instalados los componentes, hay que verificar el conjunto con una página sencilla. El siguiente programa abre una web, espera a que cargue, guarda el HTML renderizado y genera una captura de pantalla completa.
const fs = require('fs');
const { chromium } = require('playwright');
const URL = 'https://example.com';
const HTML = '/tmp/prueba_navegador.html';
const PNG = '/tmp/prueba_navegador.png';
(async () => {
let browser;
try {
browser = await chromium.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-dev-shm-usage'
]
});
const context = await browser.newContext({
viewport: {
width: 1600,
height: 1000
},
locale: 'es-ES'
});
const page = await context.newPage();
await page.goto(URL, {
waitUntil: 'domcontentloaded',
timeout: 120000
});
try {
await page.waitForLoadState('networkidle', {
timeout: 60000
});
} catch {
console.log('La página no alcanzó networkidle.');
}
await page.waitForTimeout(3000);
fs.writeFileSync(
HTML,
await page.content(),
'utf8'
);
await page.screenshot({
path: PNG,
fullPage: true
});
console.log(`HTML guardado en: ${HTML}`);
console.log(`PNG guardado en: ${PNG}`);
} catch (error) {
console.error(error);
process.exitCode = 1;
} finally {
if (browser) {
await browser.close();
}
}
})();
Guardar el programa
touch /opt/navegador-servidor/prueba.js
chmod 666 /opt/navegador-servidor/prueba.js
Después puede editarse con el cliente SFTP o el editor utilizado para administrar el servidor.
Ejecutar desde cualquier directorio
node /opt/navegador-servidor/prueba.js
No es necesario cambiar primero al directorio del proyecto si el programa utiliza rutas absolutas y Node.js puede encontrar el módulo. Sin embargo, cuando el script está fuera del directorio del proyecto, la resolución de módulos puede variar. La opción más clara es mantener el programa dentro del mismo proyecto donde está node_modules.
Comprobar los resultados
ls -lh /tmp/prueba_navegador.html
ls -lh /tmp/prueba_navegador.png
file /tmp/prueba_navegador.png
wc -c /tmp/prueba_navegador.html
Precauciones en un servidor Linux de producción
Instalar un navegador en un servidor de producción no debería hacerse como si fuera una máquina de pruebas. Hay que controlar el alcance del cambio.
No ejecutar autoremove sin revisar
apt-get -s autoremove
La simulación permite comprobar qué paquetes se eliminarían. En servidores antiguos pueden aparecer bibliotecas, herramientas o componentes gráficos utilizados por otras aplicaciones.
Comprobar servicios antes y después
systemctl --failed
systemctl is-active nginx
systemctl is-active apache2
systemctl is-active mariadb
systemctl is-active mysql
nginx -t
curl -I http://127.0.0.1
Solo deben ejecutarse las comprobaciones correspondientes a los servicios instalados.
Controlar el consumo de recursos
ps aux --sort=-%mem | head
free -h
df -h
du -sh /root/.cache/ms-playwright
Chromium puede consumir bastante memoria durante páginas complejas. Para procesar muchas URLs es preferible reutilizar un navegador y una sesión, pero procesar los expedientes secuencialmente en lugar de abrir decenas de pestañas simultáneas.
Usar un usuario específico
En una instalación inicial puede ejecutarse como root, pero para una automatización permanente es mejor crear un usuario de servicio con permisos limitados sobre sus directorios de entrada y salida.
Separar código y resultados
Una organización recomendable es:
/opt/navegador-servidor/ código y dependencias
/srv/exports/navegador/ HTML, PNG y registros
/var/log/navegador-servidor/ logs del servicio
Esta separación facilita copias, permisos, limpieza y supervisión.
Guardar registros
node /opt/navegador-servidor/prueba.js \
2>&1 | tee /srv/exports/navegador/salida_prueba.log
Para procesos largos conviene usar screen, tmux, systemd o nohup, evitando depender de que la sesión SSH permanezca abierta.
Errores frecuentes y diagnóstico
node: command not found
Node.js no está instalado o no está en el PATH. Hay que comprobar which node, apt-cache policy nodejs y el estado del paquete.
Cannot find module playwright
El programa se está ejecutando fuera del proyecto o Playwright no está instalado. Debe comprobarse:
cd /opt/navegador-servidor
npm list playwright
ls -lah node_modules/playwright
Executable does not exist
Playwright está instalado, pero no se ha descargado el navegador. La solución habitual es:
npx playwright install chromium
Si faltan dependencias del sistema:
npx playwright install --with-deps chromium
El sistema operativo no está soportado oficialmente
Playwright puede descargar una compilación de respaldo. Debe verificarse con un programa real. En una versión Ubuntu fuera de soporte, el objetivo debería seguir siendo migrar a una versión LTS.
La página se descarga, pero no aparecen los datos
Puede tratarse de una SPA que carga información mediante JavaScript. Hay que esperar a networkidle, añadir una espera adicional o esperar a un selector concreto.
La captura incluye el banner de cookies
Playwright puede localizar y pulsar el botón antes de realizar la captura:
const boton = page.getByRole('button', {
name: /only essential cookies|solo cookies esenciales|rechazar/i
});
if (await boton.isVisible({ timeout: 10000 })) {
await boton.click();
}
Error 401 en una petición secundaria
Algunas aplicaciones consultan si existe un usuario autenticado. Un 401 en esa petición puede ser normal si el contenido público sigue cargándose. Hay que identificar la URL exacta y comprobar si la petición principal devuelve correctamente los datos.
Chromium falla por sandbox
En algunos servidores se utiliza:
args: [
'--no-sandbox',
'--disable-dev-shm-usage'
]
--no-sandbox reduce aislamiento y debe utilizarse únicamente cuando el entorno lo exige y el riesgo está controlado. La alternativa más segura es ejecutar Chromium con un usuario adecuado y una configuración compatible.
Lista de comprobación final
- Confirmar la versión de Ubuntu y el nombre en clave.
- Comprobar arquitectura, kernel, memoria y espacio disponible.
- Revisar si Node.js y npm ya están instalados.
- Comprobar el origen y la versión candidata de Node.js.
- Revisar los repositorios APT y resolver errores antes de instalar.
- Simular la instalación de Node.js.
- Instalar Node.js 24.18.0 y comprobar npm 11.16.0.
- Crear un proyecto con
npm init -y. - Instalar Playwright localmente.
- Comprobar la versión con
npx playwright --version. - Instalar Chromium con sus dependencias.
- Comprobar la ruta del ejecutable gestionado por Playwright.
- Ejecutar una prueba que guarde HTML y PNG.
- Verificar servicios web y bases de datos después de la instalación.
- Controlar consumo de memoria, disco y caché.
- Documentar rutas, versiones, permisos y procedimiento de ejecución.
Preguntas frecuentes
¿Necesito instalar un escritorio gráfico en el servidor?
No. Playwright puede ejecutar Chromium en modo headless, sin mostrar ventanas y sin instalar un escritorio completo.
¿Node.js incluye npm?
En muchas distribuciones y paquetes de NodeSource, npm se instala junto con Node.js. Debe verificarse siempre con npm -v.
¿Qué versión de Node.js se utilizó en este procedimiento?
La instalación de referencia utilizó Node.js 24.18.0 y npm 11.16.0, suministrados por NodeSource.
¿Playwright instala Chromium automáticamente?
La instalación de la biblioteca mediante npm no siempre descarga todos los navegadores. Debe ejecutarse npx playwright install chromium o npx playwright install --with-deps chromium.
¿Puedo utilizar el Chromium instalado por Ubuntu?
Es posible configurar Playwright para utilizar un ejecutable concreto, pero la opción más compatible suele ser el navegador descargado por la propia versión de Playwright.
¿Dónde guarda Playwright Chromium?
Normalmente en la caché del usuario que ejecuta la instalación, por ejemplo /root/.cache/ms-playwright cuando se instala como root.
¿Puedo ejecutar el programa desde cualquier directorio?
Sí, si se utiliza la ruta absoluta del fichero y las dependencias pueden resolverse. Mantener el script dentro del proyecto simplifica la resolución de node_modules.
¿Es normal ver un aviso de sistema operativo no soportado?
Puede ocurrir en versiones Ubuntu intermedias o fuera de soporte. Playwright puede utilizar una compilación de respaldo. Debe probarse el navegador y planificar la migración a una versión compatible.
¿Por qué una página funciona con Playwright y no con curl?
Porque Playwright ejecuta JavaScript y procesa las peticiones dinámicas realizadas por la aplicación. curl descarga únicamente la respuesta HTTP inicial.
¿Conviene ejecutar muchas páginas en paralelo?
No siempre. En un servidor pequeño puede agotar memoria y CPU. Para cientos de URLs suele ser más seguro reutilizar un navegador y procesarlas secuencialmente o con una concurrencia muy limitada.
Conclusión
Instalar un navegador automatizable en un servidor Linux requiere algo más que añadir un paquete llamado Chromium. La solución completa combina Node.js, npm, Playwright, el navegador compatible y las bibliotecas del sistema necesarias.
El proceso debe empezar siempre por la verificación: versión de Linux, repositorios, componentes ya instalados, espacio disponible y estado de los servicios. Solo después conviene instalar Node.js, crear un proyecto aislado, añadir Playwright y descargar Chromium.
Una vez preparado el entorno, el servidor puede cargar aplicaciones web modernas, ejecutar JavaScript, aceptar cookies, guardar HTML renderizado y generar capturas de pantalla. En entornos de producción, la clave está en controlar dependencias, permisos, recursos y registros para que la nueva automatización no interfiera con los servicios existentes.