Antigravity Browser-use trên VPS có Chromium: tự động hoá web 24/7

Chia sẻ bài viết

Mục lục
TL;DR

Cài Chromium headless trên Cloud VPS, kết hợp Antigravity browser-use (qua Remote-SSH hoặc MCP playwright) để agent tự động click, fill form, scrape, screenshot 24/7. Use case: monitor giá sản phẩm, QA UI sau mỗi deploy, fill form định kỳ, scrape data hợp lệ. Setup 1 lần, chạy không cần laptop bật, log ra file để xem sau.

Antigravity có tính năng browser-use built-in: agent điều khiển trình duyệt thật để thao tác web. Trên laptop, tính năng này tốn RAM và yêu cầu display, không chạy được khi đóng nắp. Giải pháp chuyên nghiệp: chuyển toàn bộ flow browser-use lên Cloud VPS với Chromium headless, agent gọi qua MCP. Workflow chạy 24/7, không phụ thuộc laptop.

Bài viết này hướng dẫn cài Chromium headless trên Ubuntu/AlmaLinux, dùng Playwright hoặc browser-use Python framework, expose qua MCP server cho Antigravity. Sau đó thiết kế 3 use case thực tế: monitor giá đối thủ, QA UI sau deploy, fill form định kỳ. Bonus: cron schedule và alert qua Telegram khi flow fail.

Yêu cầu: VPS 2 vCPU 4GB tối thiểu (4GB vì Chromium ngốn RAM), Ubuntu 22/24 hoặc AlmaLinux 9. Network ổn định, không cần IP public nếu chỉ truy cập web bên ngoài (chỉ outbound). Quota Antigravity Pro hoặc gói khác cho phép browser-use tool.

Browser-use trên local vs trên VPS

Antigravity local browser-use: agent mở Chromium trên màn hình laptop, bạn nhìn thấy con trỏ tự click. Tốt cho demo, debug. Nhưng:

  • Chiếm display, không làm việc khác được trên cùng máy
  • Đóng laptop hoặc sleep -> agent dừng
  • RAM laptop hao nhanh
  • Khó schedule tự động (cron không có window)

VPS browser-use: Chromium headless (--headless=new), không có UI, chạy nền 24/7. Agent điều khiển qua Playwright API hoặc browser-use lib. Đổi lại không nhìn thấy realtime, phải xem screenshot/video sau.

Bước 1: cài Chromium headless và dependency

SSH vào VPS với user dev. Cài Chromium browser và Playwright (auto pull binary phù hợp):

sudo apt update
sudo apt install -y chromium-browser fonts-noto fonts-noto-cjk 
    libgbm1 libnss3 libxss1 libasound2t64
# Hoặc dùng Playwright managed Chromium
mkdir -p ~/browser-auto && cd ~/browser-auto
npm init -y
npm install playwright
npx playwright install chromium
npx playwright install-deps chromium

Trên AlmaLinux 9 thay apt -> dnf, package name chromium thay vì chromium-browser. Playwright tự handle dependency, ưu tiên dùng cách này thay vì system Chromium để version ổn định.

Bước 2: test Chromium chạy headless

Tạo file test-headless.js để kiểm tra Chromium hoạt động:

// test-headless.js
const { chromium } = require('playwright');
(async () => {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://example.com');
  console.log('Title:', await page.title());
  await page.screenshot({ path: 'shot.png', fullPage: true });
  await browser.close();
  console.log('Screenshot saved: shot.png');
})();

Chạy node test-headless.js. Nếu in "Title: Example Domain" và file shot.png xuất hiện thì OK. Lỗi thường gặp: libnss3 thiếu (apt install lại), DISPLAY env không có (headless mode đã bỏ qua, ignore).

Bước 3: cài MCP playwright server

Để Antigravity điều khiển Chromium qua agent prompt, dùng MCP playwright server:

npm install -g @modelcontextprotocol/server-playwright
# Hoặc browser-use-mcp variant
pip install browser-use-mcp

Khai báo trong mcp.json (Antigravity Remote workspace):

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@modelcontextprotocol/server-playwright", "--headless"],
      "env": {
        "PLAYWRIGHT_BROWSERS_PATH": "/home/dev/.cache/ms-playwright"
      }
    }
  }
}

Restart Antigravity. Test trong chat: @playwright mở https://example.com, screenshot rồi đọc title. Agent gọi tool launch_browser, navigate, screenshot, get_title.

Use case 1: monitor giá sản phẩm đối thủ

Script monitor giá 1 sản phẩm trên Shopee/Lazada/Tiki, lưu lịch sử vào CSV:

// monitor-price.js
const { chromium } = require('playwright');
const fs = require('fs');
const url = 'https://shop.example.com/product/xyz';

(async () => {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto(url, { waitUntil: 'domcontentloaded' });
  await page.waitForSelector('.product-price', { timeout: 10000 });
  const price = await page.textContent('.product-price');
  const ts = new Date().toISOString();
  fs.appendFileSync('prices.csv', ts + ',' + price.trim() + 'n');
  await browser.close();
})();

Schedule mỗi 2 tiếng bằng cron:

crontab -e
# Thêm dòng:
0 */2 * * * cd /home/dev/browser-auto && node monitor-price.js >> price.log 2>&1

Sau 1 tuần, file prices.csv có 84 dòng. Đẩy vào Antigravity chat: @playwright đọc file prices.csv, sinh chart giá theo ngày. Agent đọc CSV, tự viết script chart.js hoặc tạo ASCII chart, kết quả gọn.

Use case 2: QA UI sau mỗi deploy

Sau khi deploy production, agent tự mở web, screenshot từng page chính, so sánh với baseline:

// qa-deploy.js
const { chromium } = require('playwright');
const pages = ['/', '/products', '/about', '/checkout'];

(async () => {
  const browser = await chromium.launch({ headless: true });
  const ctx = await browser.newContext({ viewport: { width: 1366, height: 768 } });
  for (const path of pages) {
    const page = await ctx.newPage();
    await page.goto('https://app.example.com' + path);
    await page.waitForLoadState('networkidle');
    const safe = path.replace(///g, '_') || 'home';
    await page.screenshot({ path: 'qa/' + safe + '.png', fullPage: true });
    await page.close();
  }
  await browser.close();
})();

Trong Antigravity chat: @playwright chạy file qa-deploy.js, sau đó dùng tool xem từng screenshot trong folder qa/, mô tả page có gì lạ so với mô tả tôi sẽ paste sau. Agent dùng vision (Gemini 3 đọc ảnh) để verify UI.

Use case 3: fill form định kỳ

Fill form đăng ký webinar, báo cáo timesheet, check-in office portal... mỗi ngày 1 lần lúc 9 giờ sáng:

// checkin.js
const { chromium } = require('playwright');
(async () => {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://hr.example.com/login');
  await page.fill('#username', process.env.HR_USER);
  await page.fill('#password', process.env.HR_PASS);
  await page.click('button[type=submit]');
  await page.waitForURL('**/dashboard');
  await page.click('button:has-text("Check-in")');
  await page.waitForSelector('.toast-success');
  console.log('Check-in OK at', new Date().toISOString());
  await browser.close();
})();

Lưu credential trong file env riêng (~/.checkin.env, chmod 600), cron load qua source:

0 9 * * 1-5 cd /home/dev/browser-auto && 
  set -a && . ~/.checkin.env && set +a && 
  node checkin.js >> checkin.log 2>&1

Alert khi flow fail: Telegram bot

Cron silent có vấn đề: khi flow fail, bạn không biết. Tích hợp Telegram bot để gửi alert:

// notify.js
const https = require('https');
function notify(msg) {
  const token = process.env.TG_TOKEN;
  const chat = process.env.TG_CHAT;
  const url = 'https://api.telegram.org/bot' + token + '/sendMessage';
  const data = JSON.stringify({ chat_id: chat, text: msg });
  const req = https.request(url, {
    method: 'POST', headers: { 'Content-Type': 'application/json' }
  });
  req.write(data); req.end();
}
module.exports = { notify };

Wrap script chính trong try/catch, gọi notify khi fail:

const { notify } = require('./notify');
(async () => {
  try {
    // ... browser-use code
  } catch (e) {
    notify('checkin fail: ' + e.message);
    process.exit(1);
  }
})();

Chống bị detect là bot

Nhiều site (Cloudflare, hCaptcha, Datadome) detect headless browser. Vài tip:

  • Dùng playwright-extra với plugin stealth: npm install playwright-extra puppeteer-extra-plugin-stealth
  • Set user-agent thực: --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36..."
  • Set viewport thực tế (1366x768, 1920x1080), không default 800x600
  • Throttle action: thêm await page.waitForTimeout(500-2000) giữa các click, tránh quá nhanh giống bot
  • Dùng residential proxy nếu IP VPS bị blacklist
  • Persist cookie session qua context.storageState() để không phải login lại mỗi lần

Resource và limit: chạy bao nhiêu browser cùng lúc

Mỗi Chromium instance headless tốn 200-400MB RAM. VPS 4GB chạy 5-8 instance song song không vấn đề. VPS 2GB tối đa 3-4 instance. CPU spike khi page load nặng (1-2 giây 100% CPU), idle về 0 sau đó.

Tip tối ưu: dùng 1 browser, nhiều context (browser.newContext()), giảm overhead. Mỗi context như tab riêng, share browser process. Tiết kiệm 50-60% RAM so với spawn 10 browser.

Lưu trữ screenshot và video

Mỗi flow QA sinh 5-10 screenshot, mỗi ảnh 200-500KB. 1 tháng có thể tích luỹ 500MB+. Strategy:

  • Compress PNG bằng pngquant hoặc convert WebP (giảm 60-70% size)
  • Cron daily xoá file >30 ngày: find /home/dev/qa -mtime +30 -delete
  • Sync ra S3-compatible (Cloudflare R2, Backblaze B2) nếu cần lưu trữ lâu
  • Record video chỉ khi debug, dùng tham số recordVideo trong newContext

Khi nào cần GPU cho Chromium

99% use case browser-use không cần GPU. Chỉ cần khi:

  • Render WebGL canvas (game, 3D visualization)
  • Video playback liên tục (livestream, test player)
  • Visual regression với content GPU-accelerated

Lúc đó dùng VPS với GPU pass-through (đắt hơn nhiều) hoặc workflow đơn giản hoá: chỉ screenshot trạng thái static, bỏ qua animation.

FAQ

Browser-use Antigravity có khác Playwright trực tiếp không?

Browser-use Antigravity là layer cao hơn, agent prompt tự sinh action (click, fill). Playwright trực tiếp là code dev viết tay. Cả hai cùng dùng Chromium làm engine bên dưới, có thể kết hợp.

Có thể auto fill captcha bằng browser-use không?

ReCaptcha v2/v3, hCaptcha có anti-bot mạnh, browser-use không tự pass được. Có dịch vụ giải captcha thuê (2captcha, anti-captcha) nhưng đắt và không stable. Tốt nhất là tránh site có captcha hoặc dùng official API thay vì scrape UI.

Headless Chromium có chạy được Cloudflare-protected site không?

Cloudflare Bot Fight Mode chặn được headless. Workaround: dùng playwright-extra stealth plugin, hoặc dùng undetected-chromedriver fork. Tỉ lệ pass khoảng 60-80%, không 100%.

Có cách nào xem realtime browser-use trên VPS không?

Có. Dùng playwright trace viewer (npx playwright show-trace trace.zip) sau khi chạy, xem step-by-step. Hoặc dùng VNC server trên VPS + display ảo (Xvfb), kết nối VNC viewer từ laptop xem trực tiếp.

Script browser-use chạy chậm sau vài tuần, làm sao?

Thường do disk đầy log/screenshot. Chạy du -sh ~/browser-auto, xoá file cũ. Cũng có thể do Playwright cache binary cũ, npx playwright install --force update lại.

Mỗi tháng tốn bao nhiêu cho VPS browser-use?

VPS 2 vCPU 4GB từ 199k/tháng đã đủ cho 5-10 flow/ngày. Network outbound free trong tier (tuỳ provider). Tổng cost ~10k/ngày, thay thế đáng giá nhiều giờ thao tác thủ công.

Cloud VPS cho Gemini Antigravity

VPS cho browser automation 24/7

Cloud VPS TND sẵn AlmaLinux 9, Ubuntu 22/24, Debian 12/13. SSD CEPH, snapshot 1-click, backup hằng ngày, network 200Mbps trong nước. 2 vCPU 4GB từ 199k/tháng đủ chạy Chromium headless + 5-10 flow tự động hoá song song.

Xem 8 cấu hình Cloud VPS →