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.
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
- Telechargez BotBrowser depuis GitHub
- Construisez votre image Docker avec le Dockerfile ci-dessus
- Montez les profils et configurez les proxies par conteneur