Retour au Blog
Déploiement

Guide de déploiement de BotBrowser avec Docker

Bonnes pratiques pour déployer BotBrowser dans des conteneurs Docker : Dockerfile, Compose, volumes et durcissement pour la production.

Introduction

Docker fournit la reproductibilité, l'isolation et l'évolutivité nécessaires pour déployer BotBrowser en production. Chaque conteneur démarre à partir d'un état connu, s'exécute de façon isolée et peut être répliqué sur toute infrastructure supportant Docker, évitant le classique « ça marche sur ma machine ».

Ce guide couvre le flux complet : construction d'images, gestion des configurations et scripts via des volumes, configuration de la mémoire partagée, utilisation de Docker Compose pour l'échelle et durcissement pour la production. Les modèles décrits conviennent aussi bien pour une instance locale que pour un cluster cloud.

Pourquoi Docker ?

BotBrowser dépend de bibliothèques système, d'un serveur d'affichage virtuel et de configurations fines. Sur une machine nue, chaque serveur nécessite l'installation manuelle de dépendances, la configuration d'Xvfb, la définition de variables d'environnement et la validation. Docker encapsule tout cela dans une image, garantissant la cohérence.

Docker isole également les processus : chaque conteneur exécute une instance indépendante de BotBrowser avec son propre système de fichiers, namespace réseau et limites de ressources. Une fuite mémoire dans un conteneur n'affecte pas les autres et Docker peut redémarrer automatiquement les processus défaillants via les politiques de redémarrage.

Pour des équipes nécessitant plusieurs instances avec des profils et proxys différents, Docker Compose ou des orchestrateurs permettent de définir, d'étendre et de gérer l'ensemble via un fichier unique.

Contexte technique

Chrome et /dev/shm

Chrome utilise intensivement /dev/shm (mémoire partagée) pour l'IPC entre processus du navigateur, GPU et rendu. Par défaut, Docker alloue 64 Mo, insuffisant pour Chrome. Il faut au minimum 1–2 Go de mémoire partagée.

Solution : ajouter --shm-size=2g à docker run ou shm_size: '2g' dans Docker Compose.

Serveur d'affichage en conteneur

Comme sur un hôte, BotBrowser a besoin de Xvfb dans le conteneur. Lancez Xvfb avant Chrome et réglez la variable d'environnement DISPLAY.

Répertoire de données utilisateur

Chaque instance nécessite son propre --user-data-dir. Dans un conteneur, ce répertoire est éphémère à moins d'être monté en volume. Montez un volume si vous souhaitez persister la session.

Taille de l'image

Une image Docker incluant toutes les dépendances BotBrowser pèse généralement entre 500 et 800 Mo. Utilisez des builds multi-étapes ou réduisez la liste de paquets pour diminuer la taille, mais attention aux bibliothèques manquantes en runtime.

Docker Container Xvfb :10 Virtual Display BotBrowser Chrome + Profile Node.js Automation Script /dev/shm 2 GB Shared Mem Volume: /opt/profiles (host mounted) Volume: /data/sessions (persistent)

Approches communes

Conteneur monolithique

Simple mais moins scalable : tout dans le même conteneur (Xvfb, navigateur, scripts). Un problème sur un composant arrête l'ensemble.

Un conteneur par navigateur

Meilleure isolation : chaque instance a son profil et son proxy. Coût par instance plus élevé, mais meilleure maintenabilité.

Mode sidecar

Un sidecar Xvfb partagé réduit l'utilisation, mais augmente la complexité réseau et crée un point de défaillance.

Construire sur l'image Chromium officielle

Peut réduire la charge initiale, mais l'image peut manquer de dépendances spécifiques à BotBrowser. Ubuntu donne un meilleur contrôle.

Méthode recommandée

Utiliser Ubuntu 22.04, installer dépendances, copier le binaire BotBrowser et les profils, démarrer Xvfb avant le script d'automatisation. Cette méthode est testée et fournit des résultats cohérents entre fournisseurs cloud.

Configuration et utilisation

Dockerfile minimal

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 et run

docker build -t botbrowser-worker .
docker run --rm --shm-size=2g botbrowser-worker

Script d'automatisation

// 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

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:

Vérification et bonnes pratiques

Vérifiez l'absence de "not found" avec ldd. Toujours utiliser --shm-size=2g. Montez les profils en lecture seule et étiquetez vos images avec des versions explicites.

FAQ

Questions courantes : problèmes /dev/shm, compatibilité Alpine, exposition du port de debugging.

Résumé

Docker est la manière la plus fiable pour déployer BotBrowser en production. Assurez-vous d'allouer suffisamment de /dev/shm et de monter des volumes pour la persistance. Consultez les autres guides du dépôt pour des détails complémentaires.

title: "Guide de deploiement Docker pour BotBrowser" description: "Deployez BotBrowser dans des conteneurs Docker pour une automatisation reproductible, isolee et a grande echelle." date: "2026-01-07" locale: fr category: deployment tags: ["docker", "deployment", "server", "automation", "devops"] published: true

Presentation

Docker fournit des environnements reproductibles, l'isolation des processus et une mise a l'echelle facile pour les deploiements BotBrowser. Chaque conteneur demarre avec un etat propre et s'execute independamment.

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

Construire et executer

docker build -t botbrowser-worker .
docker run --rm --shm-size=2g botbrowser-worker

Le flag --shm-size=2g est important. Chrome utilise /dev/shm pour la memoire partagee et l'allocation par defaut de Docker (64 Mo) est insuffisante.

Script d'automatisation

// /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();
})();

Mise a l'echelle avec 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

Bonnes pratiques de production

Limites de ressources. 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

Arret propre. Gerez SIGTERM :

process.on('SIGTERM', async () => {
  await browser.close();
  process.exit(0);
});

Depannage

Crash "out of memory" : Augmentez --shm-size a au moins 2g.

"Cannot open display" : Assurez-vous que Xvfb est en cours d'execution et que DISPLAY est defini.

"Permission denied" : Utilisez --disable-setuid-sandbox.

Pour commencer

  1. Telechargez BotBrowser depuis GitHub
  2. Construisez votre image Docker avec le Dockerfile ci-dessus
  3. Montez les profils et configurez les proxies par conteneur
#docker#deployment#server#automation#devops