From brightdata-pack
Deploys Bright Data scraping apps to Vercel, Fly.io, and Cloud Run with secrets setup, proxy config, and platform-specific code examples.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin brightdata-packThis skill is limited to using the following tools:
Deploy Bright Data scraping applications to cloud platforms with proper secrets management. Key consideration: Bright Data proxy connections require outbound TCP to `brd.superproxy.io` on ports 33335 (proxy) and 9222 (Scraping Browser).
Executes Bright Data production deployment checklist for scraping integrations: verifies zones/credentials, checks code quality, sets up infrastructure health checks, configures monitoring and alerts.
Deploys Firecrawl apps to Vercel serverless, Cloud Run containers, and Docker self-hosted setups. Configures secrets and provides Next.js API route example.
Onboards coding agents to Bright Data for live web scraping, SERP results, structured data extraction, and API integration. Installs CLI, skills, and handles OAuth authentication with one command.
Share bugs, ideas, or general feedback.
Deploy Bright Data scraping applications to cloud platforms with proper secrets management. Key consideration: Bright Data proxy connections require outbound TCP to brd.superproxy.io on ports 33335 (proxy) and 9222 (Scraping Browser).
# Add secrets
vercel env add BRIGHTDATA_CUSTOMER_ID production
vercel env add BRIGHTDATA_ZONE production
vercel env add BRIGHTDATA_ZONE_PASSWORD production
vercel env add BRIGHTDATA_API_TOKEN production
// vercel.json
{
"functions": {
"api/scrape.ts": {
"maxDuration": 60
}
}
}
// api/scrape.ts — Vercel serverless function
import type { VercelRequest, VercelResponse } from '@vercel/node';
import axios from 'axios';
import https from 'https';
export default async function handler(req: VercelRequest, res: VercelResponse) {
const { url } = req.body;
if (!url) return res.status(400).json({ error: 'url required' });
const proxy = {
host: 'brd.superproxy.io',
port: 33335,
auth: {
username: `brd-customer-${process.env.BRIGHTDATA_CUSTOMER_ID}-zone-${process.env.BRIGHTDATA_ZONE}`,
password: process.env.BRIGHTDATA_ZONE_PASSWORD!,
},
};
try {
const response = await axios.get(url, {
proxy,
httpsAgent: new https.Agent({ rejectUnauthorized: false }),
timeout: 55000, // Leave 5s buffer for Vercel's 60s limit
});
res.json({ status: response.status, length: response.data.length });
} catch (error: any) {
res.status(502).json({ error: error.message });
}
}
# fly.toml — better for Scraping Browser (needs WebSocket)
app = "my-scraper"
primary_region = "iad"
[env]
NODE_ENV = "production"
[http_service]
internal_port = 3000
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
# Set secrets
fly secrets set BRIGHTDATA_CUSTOMER_ID=c_abc123
fly secrets set BRIGHTDATA_ZONE=web_unlocker_prod
fly secrets set BRIGHTDATA_ZONE_PASSWORD=z_prod_pass
fly secrets set BRIGHTDATA_API_TOKEN=prod_token
# Deploy
fly deploy
# Store secrets in Secret Manager
echo -n "c_abc123" | gcloud secrets create brightdata-customer-id --data-file=-
echo -n "web_unlocker_prod" | gcloud secrets create brightdata-zone --data-file=-
echo -n "z_prod_pass" | gcloud secrets create brightdata-zone-password --data-file=-
# Deploy with secret mounts
gcloud run deploy scraper \
--image gcr.io/$PROJECT_ID/scraper \
--region us-central1 \
--set-secrets=BRIGHTDATA_CUSTOMER_ID=brightdata-customer-id:latest \
--set-secrets=BRIGHTDATA_ZONE=brightdata-zone:latest \
--set-secrets=BRIGHTDATA_ZONE_PASSWORD=brightdata-zone-password:latest \
--timeout=120 \
--memory=512Mi
| Feature | Vercel | Fly.io | Cloud Run |
|---|---|---|---|
| Max timeout | 60s (Pro: 300s) | No limit | 3600s |
| WebSocket (Scraping Browser) | No | Yes | No |
| Outbound TCP | Yes | Yes | Yes |
| Best for | Web Unlocker API | Scraping Browser | Batch scraping |
| Cold start | Fast | Configurable | Medium |
// api/health.ts — works on all platforms
export async function GET() {
try {
const proxy = { host: 'brd.superproxy.io', port: 33335, auth: { username: `brd-customer-${process.env.BRIGHTDATA_CUSTOMER_ID}-zone-${process.env.BRIGHTDATA_ZONE}`, password: process.env.BRIGHTDATA_ZONE_PASSWORD! } };
const start = Date.now();
const res = await axios.get('https://lumtest.com/myip.json', { proxy, httpsAgent: new (await import('https')).Agent({ rejectUnauthorized: false }), timeout: 15000 });
return Response.json({ status: 'healthy', proxy_ip: res.data.ip, latency_ms: Date.now() - start });
} catch {
return Response.json({ status: 'degraded' }, { status: 503 });
}
}
| Issue | Cause | Solution |
|---|---|---|
| Vercel timeout | 60s limit too short | Upgrade to Pro (300s) or use Fly.io |
| WebSocket refused | Platform blocks WS | Use Fly.io for Scraping Browser |
| Cold start timeout | Proxy handshake slow | Configure min instances |
| Secrets not found | Wrong env name | Verify with platform CLI |
For webhook handling, see brightdata-webhooks-events.