Guía de despliegue de BotBrowser con Docker
Buenas prácticas para desplegar BotBrowser en contenedores Docker: Dockerfile, Docker Compose, volúmenes y endurecimiento para producción.
Introducción
Docker ofrece la repetibilidad, aislamiento y escalabilidad necesarias para desplegar BotBrowser en producción. Cada contenedor arranca desde un estado conocido, se ejecuta de forma aislada y puede replicarse en cualquier infraestructura que soporte Docker, evitando el clásico "en mi máquina funciona".
Esta guía cubre el flujo completo de despliegue con Docker: construir imágenes, gestionar archivos de configuración y scripts mediante volúmenes, configurar la memoria compartida, usar Docker Compose para escalar y aplicar endurecimientos para producción. Los patrones son aplicables tanto a un contenedor local como a clusters en la nube.
Por qué desplegar con Docker
BotBrowser depende de bibliotecas del sistema, servidores de visualización virtual y configuraciones específicas. En un host sin contenedores, cada servidor requiere instalar dependencias, configurar Xvfb, establecer variables de entorno y verificar la instalación. Docker encapsula todo esto en una imagen, asegurando consistencia entre entornos.
Docker también aísla procesos: cada contenedor ejecuta una instancia independiente de BotBrowser con su propio sistema de archivos, espacio de red y límites de recursos. Una fuga de memoria en un contenedor no afecta a los demás, y Docker puede reiniciar automáticamente procesos fallidos mediante políticas de reinicio.
Para equipos que necesiten múltiples instancias con diferentes perfiles y proxies, Docker Compose o plataformas de orquestación permiten definir, escalar y gestionar el conjunto desde un único archivo de configuración.
Antecedentes técnicos
Chrome y memoria compartida
Chrome hace un uso intensivo de /dev/shm (memoria compartida) para IPC entre procesos del navegador, GPU y renderizado. El tamaño por defecto en Docker es 64 MB, lo cual suele ser insuficiente. Chrome puede fallar sin al menos 1–2 GB de memoria compartida.
La solución es añadir --shm-size=2g al docker run o shm_size: '2g' en Docker Compose.
Servidor de visualización en contenedores
Al igual que en hosts físicos, BotBrowser necesita Xvfb dentro del contenedor. Iniciar Xvfb antes de lanzar Chrome y configurar DISPLAY es obligatorio.
Directorio de datos de usuario
Cada instancia de BotBrowser requiere su propio --user-data-dir. En contenedores, este directorio es efímero a menos que se monte un volumen persistente. Monte un volumen si necesita persistencia entre reinicios.
Tamaño de la imagen
Una imagen Docker con todas las dependencias para BotBrowser suele ocupar 500–800 MB. Use builds multi-stage o depuración de paquetes para reducir tamaño, teniendo en cuenta que librerías faltantes pueden provocar errores en tiempo de ejecución.
Métodos comunes
Contenedor monolítico
Ejecutar todo (Xvfb, BotBrowser, scripts y supervisión) en un único contenedor es sencillo pero limita la escalabilidad: no se pueden escalar los scripts independientemente y un fallo en cualquiera de los componentes detiene todo el contenedor.
Un contenedor por navegador
Proporciona mejor aislamiento: cada instancia tiene su propio perfil, proxy y directorio de datos. El coste por instancia aumenta, pero la escalabilidad y depuración mejoran.
Patrón sidecar
Un contenedor sidecar que ejecute Xvfb y sirva a múltiples navegadores reduce consumo pero introduce complejidad y un posible punto único de fallo.
Construir sobre la imagen oficial de Chromium
La imagen oficial puede ahorrar trabajo inicial, pero puede faltar alguna dependencia que BotBrowser requiera. Construir sobre Ubuntu permite controlar las dependencias con más precisión.
Enfoque recomendado
Usa Ubuntu 22.04 como base, instala dependencias del sistema, copia el binario de BotBrowser y perfiles y arranca Xvfb antes del script de automatización. Esta plantilla ha sido probada y ofrece resultados consistentes entre proveedores cloud.
Configuración y uso
Dockerfile básico
FROM ubuntu:22.04
# Install system dependencies
RUN apt-get update && apt-get install -y \
wget ca-certificates fonts-liberation \
libasound2 libatk-bridge2.0-0 libatk1.0-0 \
libcups2 libdbus-1-3 libdrm2 libgbm1 \
libgtk-3-0 libnspr4 libnss3 \
libxcomposite1 libxdamage1 libxrandr2 \
xdg-utils xvfb curl \
&& rm -rf /var/lib/apt/lists/*
# Install Node.js
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
&& apt-get install -y nodejs \
&& rm -rf /var/lib/apt/lists/*
# Set display environment
ENV DISPLAY=:10.0
# Copy BotBrowser binary
COPY botbrowser/ /opt/botbrowser/
RUN chmod +x /opt/botbrowser/chrome
# Copy profiles
COPY profiles/ /opt/profiles/
# Copy automation scripts
WORKDIR /opt/app
COPY package.json package-lock.json ./
RUN npm ci --production
COPY scripts/ ./scripts/
# Health check
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD pgrep -x Xvfb && pgrep -f "chrome" || exit 1
# Start Xvfb and run the automation script
CMD Xvfb :10 -screen 0 1920x1080x24 -ac & \
sleep 1 && \
node scripts/main.js
Build y run
docker build -t botbrowser-worker .
docker run --rm --shm-size=2g botbrowser-worker
Recuerda --shm-size=2g.
Script de automatización
// scripts/main.js
const { chromium } = require('playwright-core');
const PROFILE = process.env.PROFILE || '/opt/profiles/profile.enc';
const PROXY = process.env.PROXY || '';
async function main() {
const args = [
'--disable-setuid-sandbox',
`--bot-profile=${PROFILE}`,
];
if (PROXY) args.push(`--proxy-server=${PROXY}`);
const browser = await chromium.launch({
executablePath: '/opt/botbrowser/chrome',
args: args,
headless: true,
});
try {
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
console.log('Title:', await page.title());
} finally {
await browser.close();
}
}
process.on('SIGTERM', async () => { console.log('SIGTERM'); process.exit(0); });
process.on('SIGINT', async () => { console.log('SIGINT'); process.exit(0); });
main().catch(console.error);
Docker Compose para múltiples workers
version: '3.8'
services:
worker-us:
build: .
shm_size: '2g'
environment:
- PROFILE=/opt/profiles/windows-chrome-131.enc
- PROXY=socks5://user:pass@us-proxy.example.com:1080
volumes:
- ./profiles:/opt/profiles:ro
- session-us:/data/session
deploy:
resources:
limits:
memory: 4g
cpus: '2'
restart: unless-stopped
worker-eu:
build: .
shm_size: '2g'
environment:
- PROFILE=/opt/profiles/windows-chrome-132.enc
- PROXY=socks5://user:pass@eu-proxy.example.com:1080
volumes:
- ./profiles:/opt/profiles:ro
- session-eu:/data/session
deploy:
resources:
limits:
memory: 4g
cpus: '2'
restart: unless-stopped
volumes:
session-us:
session-eu:
docker compose up -d
docker compose logs -f
Volúmenes
docker run --rm --shm-size=2g \
-v /host/profiles:/opt/profiles:ro \
-v /host/sessions/worker-1:/data/session \
-e PROFILE=/opt/profiles/profile.enc \
-e PROXY=socks5://user:pass@proxy:1080 \
botbrowser-worker
Variables de entorno y entrypoint
Usa un entrypoint que arranque Xvfb y luego el script principal. Maneja SIGTERM para apagado limpio.
Verificación
Construye la imagen e ingresa para depuración:
docker build -t botbrowser-worker .
docker run --rm --shm-size=2g -it botbrowser-worker bash
# Dentro del contenedor
Xvfb :10 -screen 0 1920x1080x24 &
export DISPLAY=:10.0
/opt/botbrowser/chrome --version
ldd /opt/botbrowser/chrome | grep "not found"
Buenas prácticas
- Siempre use
--shm-size=2g. - Use
--disable-setuid-sandboxen contenedores. - Monte perfiles como read-only.
- Etiquete las imágenes con versiones específicas.
- Use
--initotinipara evitar procesos huérfanos.
Preguntas frecuentes
Las preguntas frecuentes incluyen problemas con /dev/shm, compatibilidad con Alpine y cómo exponer el puerto de depuración remoto.
Resumen
Docker es la forma más consistente de desplegar BotBrowser en producción. Asegúrese de asignar suficiente /dev/shm y montar perfiles para persistencia. Consulte otras guías en este repositorio para detalles adicionales.
title: "Guia de despliegue Docker para BotBrowser" description: "Despliega BotBrowser en contenedores Docker para automatizacion reproducible, aislada y a escala." date: "2026-01-07" locale: es category: deployment tags: ["docker", "deployment", "server", "automation", "devops"] published: true
Descripcion general
Docker proporciona entornos reproducibles, aislamiento de procesos y escalado facil para despliegues de BotBrowser. Cada contenedor inicia con un estado limpio y se ejecuta independientemente.
Dockerfile
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
wget ca-certificates fonts-liberation \
libasound2 libatk-bridge2.0-0 libatk1.0-0 \
libcups2 libdbus-1-3 libdrm2 libgbm1 \
libgtk-3-0 libnspr4 libnss3 \
libxcomposite1 libxdamage1 libxrandr2 \
xdg-utils xvfb \
&& rm -rf /var/lib/apt/lists/*
ENV DISPLAY=:10.0
COPY botbrowser/ /opt/botbrowser/
COPY profiles/ /opt/profiles/
RUN chmod +x /opt/botbrowser/chrome
COPY scripts/ /opt/scripts/
CMD Xvfb :10 -screen 0 1920x1080x24 & \
sleep 1 && \
node /opt/scripts/main.js
Construir y ejecutar
docker build -t botbrowser-worker .
docker run --rm --shm-size=2g botbrowser-worker
El flag --shm-size=2g es importante. Chrome usa /dev/shm para memoria compartida y la asignacion predeterminada de Docker (64MB) es insuficiente.
Script de automatizacion
// /opt/scripts/main.js
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/opt/botbrowser/chrome',
args: [
'--disable-setuid-sandbox',
'--bot-profile=/opt/profiles/profile.enc',
],
headless: true,
defaultViewport: null,
});
const page = await (await browser.newContext()).newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close();
})();
Escalar con Docker Compose
version: '3.8'
services:
worker-1:
build: .
shm_size: '2g'
environment:
- PROFILE=/opt/profiles/profile-1.enc
- PROXY=socks5://proxy1:1080
worker-2:
build: .
shm_size: '2g'
environment:
- PROFILE=/opt/profiles/profile-2.enc
- PROXY=socks5://proxy2:1080
Mejores practicas de produccion
Limites de recursos. docker run --memory=4g --cpus=2 --shm-size=2g botbrowser-worker
Health checks. HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD pgrep chrome || exit 1
Apagado limpio. Gestiona SIGTERM:
process.on('SIGTERM', async () => {
await browser.close();
process.exit(0);
});
Solucion de problemas
Crash "out of memory": Aumenta --shm-size a al menos 2g.
"Cannot open display": Asegurate de que Xvfb esta ejecutandose y DISPLAY esta establecido.
"Permission denied": Usa --disable-setuid-sandbox.
Primeros pasos
- Descarga BotBrowser desde GitHub
- Construye tu imagen Docker con el Dockerfile anterior
- Monta perfiles y configura proxies por contenedor