DriversRecommendedOutdated drivers can make a good PC feel brokenScan driver issues before chasing fixes manually.Scan NowHalloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsWindows FixRecommendedWindows errors stealing your time? Find the fix fastScan stability, cleanup and performance issues.Fix Now×
Skip to content
VGSources
Blog

How to Build a Puppeteer Web Scraper With Docker on a VPS

A production-focused guide to running Puppeteer and headless Chrome in Docker on a VPS, including scraper code, image choices, deployment security, reliability controls, troubleshooting and Browserless trade-offs.
Length13 min Posted Quest giverVGSources Team
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The most reliable pattern is a small Node.js service inside a pinned Docker image, run with an init process, Chrome’s sandbox capability, enough writable temporary storage and shared memory, and a scheduler on your VPS. Start with one browser at a time, explicit navigation waits, bounded retries, structured output and logs. Add a health check, persistence and a queue before increasing concurrency.

What you are building

This guide produces a scraper that accepts a target URL, loads it in headless Chrome, extracts validated fields, writes a JSON result and exits cleanly. Docker supplies a repeatable browser environment; the VPS supplies persistent scheduling, networking and storage.

As an Amazon Associate I earn from qualifying purchases.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Application: Node.js and Puppeteer, with the Puppeteer release pinned in your lockfile.
  • Browser: Chrome for Testing supplied by the official Puppeteer image, or installed explicitly in a custom image.
  • Runtime: Docker with --init, the capability required by the image’s sandbox, writable temporary/profile paths and deliberately sized shared memory.
  • Operations: firewall rules, runtime-injected secrets, restart and log-rotation policies, a cron job or host-level timer, and a way to detect missed or failed runs.

Only collect data you are permitted to access. Document the target site’s terms, robots guidance, privacy obligations, copyright handling, request rate and retention period before production collection. A proxy can change routing or geography; it does not authorize bypassing authentication, paywalls, CAPTCHAs or other access controls.

Prerequisites and version decisions

Use a current 64-bit Debian or Ubuntu VPS with Docker, a non-root deployment account and enough RAM for the browser processes you intend to run. Puppeteer’s current system requirements specify Node 22.12 or newer. Chrome for Testing supports Debian/Ubuntu x64 and arm64 when the required distribution packages are present.

#1 Best Overall
Sale
Gaoye Blue Light Blocking Glasses
  • BLUE LIGHT BLOCKING GLASSES: Our blue light glasses for women boast UV400 protection, blocking harmful blue rays from computer screens. With these bluelight glasses women, you can enjoy gaming, reading, or watching TV with no worries of eye strain.
  • EYE RELIEF: Our blue light glasses are engineered to reduce blurry vision or strain caused by prolonged screen time. These womens blue light glasses aid in better sleep by preventing blue light from disrupting your natural sleep cycle, helping you fall asleep faster and enjoy a more restful night's sleep, making them the perfect christmas present.
  • COMFORTABLE: Crafted from durable material, our trendy blue light glasses for woman or blue light glasses men ensure long-lasting comfort. The high-transmittance lenses accessories, gamer gifts for men, help keep your eyes relaxed. Perfect stocking stuffers, gifts for gamers men, christmas gifts for men, halloween costumes.
  • LIGHTWEIGHT: These clear blue light glasses feature a lightweight frame, meaning they’ll stay comfy for long-term wear. Perfect as blue blockers glasses for women or mens blue light glasses, these non-prescription fake glasses for men can be worn throughout the day. The blue light blocking glasses women feature polycarbonate HD lenses, which are anti-reflective and restore true color.
  • WORRY-FREE PURCHASE: If you experience any issues, our support team is ready to assist you quickly. These are the perfect costume glasses for cosplay dressing up.
Item Decision or requirement Why it matters
Node.js 22.12+ Older runtimes may not satisfy the current Puppeteer release.
Puppeteer Select a release compatible with your Node version; install it with an exact version and commit package-lock.json. Browser and library drift is a common source of broken builds.
Linux Debian or Ubuntu x64/arm64 with Chrome’s required packages The browser needs system libraries that a minimal base image may omit.
Docker Recent engine and Compose plugin, if using Compose Needed for init handling, resource limits, health checks and restart policies.
VPS capacity Reserve memory for Chrome, Node, the OS and Docker; begin with one concurrent page. Concurrency multiplies browser memory, file descriptors and network load.

Record the exact Node image digest, Puppeteer version, browser revision and application commit used in each deployment. Upgrade them together in a test environment rather than allowing an unpinned latest image in production.

Create a scraper with waits, validation and graceful shutdown

Initialize and pin the project

  1. Install Node 22.12 or newer on your development machine and create a directory for the scraper.
  2. Run npm init -y.
  3. Install an exact Puppeteer release that you have verified with your selected Node runtime: npm install --save-exact puppeteer@<tested-puppeteer-version>. The angle-bracket value is a version you choose and record; do not leave a floating range in package.json.
  4. Commit package.json and package-lock.json. Keep the lockfile in the image build context.

Example scraper

The following program demonstrates the control flow. Replace the selectors with fields that are allowed and stable for your target. It uses an environment variable rather than embedding a URL or credential, waits for a meaningful selector, validates the extracted title, retries transient failures with backoff, captures a screenshot on the final failure and always closes the browser.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const http = require('http');
const fs = require('fs/promises');
const puppeteer = require('puppeteer');

const targetUrl = process.env.TARGET_URL;
const outputFile = process.env.OUTPUT_FILE || '/data/result.json';
const maxAttempts = Number(process.env.MAX_ATTEMPTS || 3);
const navigationTimeout = Number(process.env.NAVIGATION_TIMEOUT_MS || 30000);
const port = Number(process.env.PORT || 8080);
let lastRun = null;

if (!targetUrl) {
  throw new Error('TARGET_URL is required');
}

const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

async function scrape() {
  const browser = await puppeteer.launch({
    headless: true,
    args: []
  });

  try {
    const page = await browser.newPage();
    await page.setViewport({ width: 1280, height: 900 });
    page.setDefaultNavigationTimeout(navigationTimeout);
    page.setDefaultTimeout(navigationTimeout);

    await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
    await page.waitForSelector('main', { visible: true });
    await page.waitForNetworkIdle({ idleTime: 750, timeout: navigationTimeout });

    const data = await page.evaluate(() => ({
      title: document.querySelector('h1')?.textContent?.trim() || null,
      canonical: document.querySelector('link[rel="canonical"]')?.href || null,
      fetchedAt: new Date().toISOString()
    }));

    if (!data.title) {
      throw new Error('Required title field was empty');
    }

    await fs.mkdir('/data', { recursive: true });
    await fs.writeFile(outputFile, JSON.stringify(data, null, 2));
    return data;
  } finally {
    await browser.close();
  }
}

async function runWithRetries() {
  let lastError;
  for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
    try {
      const result = await scrape();
      lastRun = { ok: true, at: new Date().toISOString(), result };
      console.log(JSON.stringify({ event: 'scrape_ok', attempt, result }));
      return result;
    } catch (error) {
      lastError = error;
      console.error(JSON.stringify({ event: 'scrape_error', attempt, message: error.message }));
      if (attempt < maxAttempts) await sleep(1000 * 2 ** (attempt - 1));
    }
  }
  lastRun = { ok: false, at: new Date().toISOString(), message: lastError.message };
  throw lastError;
}

http.createServer((request, response) => {
  if (request.url === '/healthz') {
    const healthy = lastRun === null || lastRun.ok;
    response.writeHead(healthy ? 200 : 503, { 'content-type': 'application/json' });
    response.end(JSON.stringify({ healthy, lastRun }));
    return;
  }
  response.writeHead(404);
  response.end();
}).listen(port, () => console.log(JSON.stringify({ event: 'health_listening', port })));

runWithRetries().catch(() => process.exitCode = 1);

For a scheduled one-shot job, the health server is optional; a heartbeat file or a successful exit code may be simpler. For a long-running worker, keep the endpoint and have your monitor check both its HTTP status and the age of the last successful result.

Make extraction predictable

  • Wait for a selector that proves the required content exists, not merely for the initial HTML response.
  • Use a bounded network-idle wait; pages with analytics or advertisements may never become completely idle.
  • Normalize whitespace, parse dates and numbers explicitly, and reject records missing required fields.
  • Store the source URL, fetch time, parser version and a content hash with each result so a later correction is auditable.
  • Apply a per-target delay and a maximum page count. Do not let a retry loop become an unbounded crawl.

Choose and build the Docker image

Official Puppeteer image

The official image includes Chrome for Testing, its required dependencies and a pre-installed Puppeteer version. It is intended to run Chrome in sandbox mode, so the container needs the SYS_ADMIN capability. Puppeteer’s documented invocation is:

Rank #2
Windex Gaming Cleaning Wipes, Pre-Moistened Wipes to Instantly Clean all Gaming Gear and Electronics, Resealable Packaging for a Freshness Lock, 25 count (Pack of 1)
  • WINDEX GAMING WIPES: effortlessly clean all your gaming gear and gaming electronics in one easy step with our new Windex Gaming Wipes
  • AMMONIA FREE: our ammonia-free formula is safe to use on all of your favorite gaming equipment like consoles, headsets, controllers, screens, keyboards, and more
  • PRE-MOISTENED WIPES: each wipe instantly removes dust, dirt, and stubborn smudges and fingerprints leaving a streak-free shine
  • ANTI-STATIC: great for cleaning and wiping down your gaming gear and electronics leaving behind no visible residue
  • COMPACT RESEALABLE PACKAGE: store your pack of Windex Gaming Wipes anywhere in your home for whenever a quick and easy wipedown is needed
docker run -i --init --cap-add=SYS_ADMIN --rm ghcr.io/puppeteer/puppeteer:latest ...

Use that command as a compatibility reference, not as a production pin: replace latest with a tested image tag or digest, mount your application and data deliberately, and pass only the environment variables the process needs. The --init flag supplies an init process that reaps child processes; without it, repeated Chrome launches can leave zombies.

Custom Dockerfile

A custom image is useful when you need your own Node base, additional libraries, a private package registry or a smaller controlled attack surface. Start from a Debian or Ubuntu Node 22 image, install the distribution packages listed in Puppeteer’s current Linux requirements, install your exact lockfile with npm ci, and install the matching Chrome for Testing revision during the image build. Verify the browser launches in a clean container before deployment.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
FROM node:22-bookworm
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
# Install the Chrome for Testing revision and Linux packages required by your
# selected Puppeteer release here; keep these steps pinned and reproducible.
ENV NODE_ENV=production
USER node
CMD ["node", "scraper.js"]

The abbreviated custom image above is a build outline, not a complete browser installation: the required operating-system package list changes with the supported release and must be taken from Puppeteer’s current system-requirements documentation. Do not “fix” missing libraries by adding arbitrary packages until the image is unreviewed; record every dependency and rebuild from a clean base.

Writable paths and the sandbox

Chrome needs a writable temporary directory and profile location. A read-only root filesystem is compatible only when you provide writable mounts such as /tmp and an application data directory. Prefer the sandbox and the narrow capability required by the official image. Adding --no-sandbox removes an important isolation layer and should not be the default workaround.

Rank #3
Sale
LISEN Cell Phone Stand Phone Holder for Desk, Office Decor Gadgets for Men
  • Ergonomic & Adjustable Design: Fight "text neck" and improve your posture. Designed for comfort, it offers an adjustable height (7.1in-8.5in) (1.4in adjustable range) and angle (5°-85°) Please note: cell phone stand is only 9 inches tall—the length of a standard pencil
  • Without blocking subtitles Perfect for office desk Tiktok Face Time Zoom video—this is the ultimate kitchen desk essential for phones! Perfect viewing experience while reducing neck back strain, A must-have for gamers streamers desk, and anyone who values both style and support!
  • Sleek & Stable Design fits Otterbox Case: Say goodbye to bent cables, tangles, and tip-overs! LISEN’s stylish adjustable desk phone holder features a built-in charging hole and smart cable management, keeping your phone secure and your workspace clutter-free cool gadgets for men
  • ANTI-SLIP DESIGN free hands: The under 10.00 items easy gadgets back and the bottom of this kitchen essentials for women are fully covered by anti-skid silicone, which LISEN stand up desk decor can provide maximum protection device from any scratches and slides
  • Your Perfect Viewing Companion:If your product arrives damaged or breaks within 365 days, reach out to LISEN for a quick and hassle-free solution. Struggling with assembly, like tightening the screw? We’ve got your back! Your experience matters to us. (Product including: phone Holder stand*1, screw*1, hexagon screwdriver*1, specification*1)

Run locally before touching the VPS

  1. Build the image with docker build --tag scraper:test ..
  2. Provide a writable output directory and a test URL you are allowed to fetch.
  3. Run with an init process, the sandbox capability and a deliberate shared-memory size: docker run --rm --init --cap-add=SYS_ADMIN --shm-size=2g -e TARGET_URL='https://allowed.example/' -v "$PWD/data:/data" scraper:test.
  4. Check the JSON file, exit code and structured logs. Intentionally break a selector to verify retries, the failure screenshot and the non-zero exit.
  5. Run the same image with the VPS user and filesystem permissions you will use in production.

Docker’s default shared-memory mount is 64 MB. Browserless documents that this can crash Chrome under load and shows shm_size: "2g" (or --shm-size=2g) as its Compose example. Treat 2 GB as a starting configuration to measure, not a universal requirement: observe memory and /dev/shm usage, then size it for your pages and concurrency.

Deploy the scraper on a VPS

Protect the host first

  • Create a dedicated, non-root account for deployment and restrict SSH to keys.
  • Allow only required inbound ports in the VPS firewall. Do not expose the Docker socket or an internal health port to the public internet.
  • Put a reverse proxy or private network in front of any HTTP endpoint; terminate TLS there.
  • Inject API keys, cookies and database passwords at runtime through a secret manager or protected environment file. Never bake them into the image or log them.
  • Mount only the directories the process needs. Separate transient browser data from retained scrape results.

Compose service

services:
  scraper:
    image: registry.example/scraper:2026-10-15
    init: true
    cap_add:
      - SYS_ADMIN
    shm_size: '2g'
    read_only: true
    tmpfs:
      - /tmp:size=512m
    environment:
      TARGET_URL: ${TARGET_URL}
      OUTPUT_FILE: /data/result.json
      NAVIGATION_TIMEOUT_MS: '30000'
      MAX_ATTEMPTS: '3'
    volumes:
      - ./data:/data
    restart: unless-stopped
    ports:
      - '127.0.0.1:8080:8080'

The example keeps the health port on loopback, uses a read-only root with a writable temporary filesystem, mounts only the result directory and restarts the service after a crash. Adjust shared memory, temporary storage and restart behavior to the workload. A one-shot scheduled container may use restart: 'no' and let the scheduler report failures instead.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Schedule collection

For a simple periodic run, a host cron entry can call a wrapper that pulls the pinned image, starts the container, records the exit code and removes stopped containers. Use a lock so two runs cannot overlap:

flock -n /var/lock/scraper.lock docker compose run --rm scraper

Run the wrapper from cron or a systemd timer under the deployment account. Give the job a timeout at both levels: Puppeteer’s navigation timeout limits a page, while the scheduler’s timeout limits a hung process. Send failures to your monitoring system instead of silently discarding them.

Rank #4
Ledagic IC+RGBW USB Powered Led Light Bar with App & Remote Control, 2 Pack
  • Easy Installation: Our gaming lights have been designed to enhance your entertainment experience. Simply position the led light bar next to your TV or game console to create a game room environment with ease. They come with USB power and a 60 inch cord for direct mounting and mobility
  • Audio Syncing & Extensive Mode: The built-in high-sensitivity music sensor allows you to sync the TV led lights to your favorite music. Lights react and move to the beat of music, film and game audio, creating an incredible immersive sound and light experience – and all without the need for an additional hub. You can choose from 64+ patterns, including strobe, illusion, jump, energy, gradient, running, chasing, fluttering mode etc. Each mode can be applied to different scenes
  • 64+ Chasing IC+RGB & W Effect: The independent control design of IC+RGB and white all-in-one multifunctional rgbw led bar lights monitor backlight allows you to easily switch the led lights for desk between IC+RGB and white to enjoy a variety of lighting effects, you can choose white lighting mode with high brightness for better illumination when working, etc. Choose IC+RGB lighting mode when you need to create an entertaining atmosphere for the light show, 16 million colours of Color changing rgb light bar let you dance to the beat and create a dynamic party atmosphere
  • Dynamic and Dimmable Lights: 1%-full brightness free brightness adjustment gives you the flexibility to adjust dimmable led light bar for room decorations or a variety of occasions
  • USB Powered: USB light bars for room can be powered by powernank, usb charger, TV, Monitor, laptop PC mainframe, making behind TV led lighting bar easy to install in any location.TV led lights are powered by the TV usb interface / PC mainframe, can be turned on/off synchronously with TV / PC

Rotate and retain logs

Emit one JSON object per event with a timestamp, target identifier, attempt, duration, status and error class. Configure Docker’s log driver or a host-level rotation policy so repeated browser diagnostics cannot fill the VPS disk. Retain screenshots and HTML only for the period needed to debug or satisfy your audit policy; they may contain personal or copyrighted content.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Add reliability controls before increasing concurrency

Bound the work

  • Set a maximum number of pages per worker and a queue limit.
  • Use one browser context per job where isolation is required, and close pages promptly.
  • Limit simultaneous jobs according to CPU, RAM, shared memory, file descriptors and the target site’s rate policy.
  • Use exponential backoff for transient network errors, but do not retry deterministic selector or permission failures.

Persist and replay safely

Write results atomically: save to a temporary file, flush it, then rename it into place. Include a stable job ID and source timestamp so a retry cannot create an indistinguishable duplicate. For larger workloads, put URLs in a durable queue and acknowledge a message only after validation and persistence succeed.

Observe the right signals

Monitor successful jobs, failure rate by target, navigation latency, browser launch failures, CPU, resident memory, disk space, network errors and /dev/shm consumption. A green process-health check is not proof that scraping is working; alert when the last successful result is older than the permitted interval.

Handle shutdown

On SIGTERM, stop accepting new work, allow the current page a short grace period, close pages and call browser.close(). Let Docker’s stop timeout cover that cleanup. If a process is repeatedly killed before cleanup, reduce concurrency or page timeouts rather than disabling the sandbox.

Best Value
Sale
HUANUO FlowLift™ Dual Monitor Stand, Fully Adjustable Gaming Monitor Desk Mount for 13–32″ Computer Screens, Full Motion VESA 75x75/100x100 with C-Clamp & Grommet Base, Each Arm Holds 4.4 to 19.8 lbs
  • Compatible with Wide Screens - To ensure compatibility with the dual monitor mount, your each monitor must meet three conditions at the same time: First, computer screens size range: 13 to 32 inches. Second, screen weight range: 4.4 to 19.8 lbs. Third, the back of the monitor screen must have VESA mounting holes with a pitch of 75x75mm or 100x100mm.
  • Regarding the compatibility with desks - Your desk must meet three conditions at the same time: First, desk material: Only wooden desks are recommended, plastic or glass desks cannot be used. Second, desk thickness range: 0.59" - 3.54". Third, the bottom of the desk should not have any cross beams or panels, as this will interfere with installation. We recommend carefully checking that your desk and monitors meets all above conditions before purchasing.
  • Dual C-Clamp Hold - Worried your dual monitors might wobble or slip? Our upgraded base uses a larger platform plus a dual C-clamp structure to lock the dual monitor arm firmly to your desk. Each arm safely keeps your screens steady while you type, click and game—no shaking, no sliding, just a clean and secure setup you can trust every day. It also provides Grommet Mounting installation choice, both options ensure stable and secure fixation for your 0.59" - 3.54" desk.
  • Full-Motion Adjustment For Comfortable View - Pull the screen closer when you’re deep in a spreadsheet, push it back to watch videos, or rotate to portrait for coding — moving everything smoothly with just one hand. The monitor stand offers +85°/-50° tilt, ±90° swivel and 360° rotation. Raise your monitor up to 15.75″ to support a healthy sitting posture. Whether you’re working from home, gaming through the night, or switching between video calls and documents, getting the screens to your natural line of sight helps relieve neck, shoulder and back strain so you can stay focused longer with less fatigue.
  • Keep Your Desk Organized: By lifting both screens off the desktop, this dual monitor stand opens up valuable space for your keyboard, notebook, docking station or a simple, clutter-free work area. Built-in cable management guides wires along the arms, keeping cords out of sight and out of the way. Enjoy a tidy, modern workstation that looks as good as it feels to use.

Puppeteer in your container or a self-hosted Browserless service?

Embedding Puppeteer is usually best for one application with a small, known workload. A self-hosted Browserless deployment is useful when several applications need remote browser sessions, a WebSocket endpoint, REST APIs, queueing, health checks or a debugger. It adds a service boundary and another image to maintain.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Concern Embedded Puppeteer container Browserless self-hosting
Image and browser maintenance You own the Node image, Puppeteer lockfile and browser compatibility testing. The service image packages browser runtimes and exposes a standard endpoint; you still pin, update and secure that image.
Sandbox and privileges Configure --init, writable paths and the sandbox capability directly. Apply the service’s container security settings and protect its network endpoint.
Shared memory Measure your pages and set --shm-size or Compose shm_size. The documented Compose example uses shm_size: "2g" because Docker’s 64 MB default can crash Chrome under load.
Concurrency and queues Implement worker limits, a queue and timeouts in your application. Configuration includes CONCURRENT, QUEUED, TIMEOUT and a restart policy; tune them to VPS resources and target limits.
Authentication Protect your own API, scheduler and secret store. Set TOKEN before exposure. Without it, every endpoint, including /function that executes request-supplied Puppeteer code, is unauthenticated.
Observability Add your own health endpoint, logs, screenshots and metrics. Provides health checks, sessions and a debugger out of the box, reducing application code.
API surface Direct in-process control and fewer moving parts. Remote Puppeteer WebSocket connectivity and REST interfaces for multiple clients.
Proxy support Configure permitted proxies in your application and account for their cost and failure modes. Documentation describes residential routing at 6 units per MB and datacenter routing at 2 units per MB, plus country, city and sticky-session options. These are vendor pricing units and may change.
Feature boundary You implement only the browser features you need. The open-source image does not include stealth, CAPTCHA solving or advanced unblock routes; those are separate cloud or enterprise capabilities.
Operating cost Lower service complexity, but your team owns browser operations and scaling. More operational components, potentially offset by shared browser infrastructure and ready-made queue/API features.

Whichever model you choose, do not expose a browser endpoint directly to the internet. Place it on a private network or behind authenticated TLS, restrict outbound access where practical and rotate tokens. Remote browser execution is powerful enough that an unauthenticated endpoint becomes a code-execution service for anyone who can reach it.

Troubleshoot the failures that matter most

Chrome exits immediately or crashes under load

  • Confirm the image’s Node, Puppeteer and Chrome revisions are compatible.
  • Run with --init and the capability required by the official sandboxed image.
  • Inspect /dev/shm; increase --shm-size or Compose shm_size when it is exhausted.
  • Ensure /tmp and the profile directory are writable, especially with a read-only root filesystem.
  • Reduce concurrency and close every page and browser in a finally block.

Navigation times out

Distinguish DNS, TCP, TLS, server response and selector timeouts in logs. Verify the VPS can resolve and reach the target, then increase the timeout only when the site is legitimately slow. Use a selector or bounded network-idle wait after navigation; a longer timeout cannot fix a selector that never appears.

The container becomes slower after every run

Look for unreaped Chrome children, contexts or pages that were not closed, growing screenshots, and log or result directories without retention limits. The init process handles zombie reaping, but application cleanup and disk rotation are still required.

The VPS job overlaps itself

Use flock, a distributed queue lock or a single worker. If overlap is intentional, set explicit concurrency and queue bounds and monitor memory before adding more workers.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Cloud Run behaves differently

Google Cloud Run’s default Node runtime does not include the packages required by Headless Chrome. Use a custom Dockerfile that installs the supported Linux dependencies and browser revision; do not assume a standard runtime image is equivalent to your tested VPS image.

Production launch checklist

  • Target permission, privacy, copyright, robots guidance, request rate and retention are documented.
  • Node 22.12+, Puppeteer and the browser revision are pinned and reproducible.
  • Selectors, waits, validation rules, retries and per-target limits are tested against expected failures.
  • The image runs with --init, sandbox protection, writable temporary/profile paths and measured shared memory.
  • Secrets are injected at runtime; Docker’s API, health endpoint and browser endpoint are not publicly exposed.
  • Scheduler locking, process timeouts, restart behavior and log rotation are configured.
  • Results are persisted atomically with source URL, timestamp, job ID and parser version.
  • Health checks cover freshness of successful output, not merely whether a process is alive.
  • CPU, RAM, disk, network, file descriptors and /dev/shm are monitored before concurrency is raised.
  • If using a remote browser service, TOKEN is set and the open-source feature limits are understood.

The practical decision

Choose an embedded Puppeteer image when one application needs direct browser control and you are comfortable maintaining its image, scheduler and telemetry. Choose a self-hosted Browserless service when multiple clients need remote sessions, REST access, queue controls, health checks or a debugger and the additional security boundary is worthwhile. In both cases, stability comes from pinned versions, the Chrome sandbox, an init process, adequate shared memory, bounded work and explicit operational monitoring—not from adding retries or disabling security until the symptoms disappear.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More quests from Patch Notes

  1. How to Set Up a RedM (RDR2) Server in 2026: License Key, txAdmin and server.cfg, Step by StepBlog11min
  2. Best RedM (RDR2) Server Hosting in 2026: Comparing Four Hosts on Slots, Memory and PriceBlog10min
  3. How to Host a Mindustry Server in 2026: server-release.jar, Port 6567 and the Commands That MatterBlog7min
Recommended PC Tool
Recommended PC Tool
Crashes, No Sound, or Screen Glitches?Free driver scan
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.