Self-host

Run BrowseFleet on your own infrastructure

BrowseFleet is MIT licensed and runs as one Node process plus a Chrome child per session, backed by SQLite. No external services, no required SaaS dependencies. The full deployment reference lives in the server repo's docs/deployment.md. What follows is the short version.

Pick a recipe

$4/mo

Hetzner CX22 + docker-compose

~10 concurrent

Solo developers, hobby projects, single-tenant pilots.

Cheapest path. One small VPS, one docker-compose file, one Caddy line for TLS.

$15/mo

Fly.io

~20 concurrent

Small teams that want zero-ops TLS, restarts, and regional routing.

fly.toml + flyctl deploy. Persistent volume for the SQLite DB and profile dir.

$30/mo

AWS ECS Fargate

~25 concurrent

Existing AWS shops, VPC isolation requirements.

Standard task definition, EFS for state, ALB in front, IAM-bound secrets.

The 60-second path

Smallest possible self-host. Boots in one command, no TLS, no auth.

docker run -p 3000:3000 --shm-size=2g ghcr.io/therjmurray/browsefleet:latest

The container ships with Chromium baked in. The default config is authless and listens on 0.0.0.0:3000. Fine for localhost; never expose this directly to the internet. Add API_KEYS and a reverse proxy before going public.

Resource sizing

Concurrent sessionsRecommended RAMRecommended vCPU
52 GB1
104 GB2
3012 GB4
50+24 GB+8+

Chromium with stealth wants 200 to 500 MB of RAM per active session under load. The Node process itself is ~150 MB.

Production checklist

  • API_KEYS set to a non-empty comma-separated list
  • TLS terminated somewhere in front of port 3000
  • CDP_EXTERNAL_HOST and CDP_EXTERNAL_SCHEME=wss configured
  • LOG_LEVEL=info (not debug, not trace)
  • DATA_DIR on a persistent volume
  • --shm-size=2g or equivalent on the container
  • Backups: data/browsefleet.db and data/profiles/ are the only durable state

Need help?

Open a Discussion on the server repo. The maintainer reads every thread.

Open a Discussion