Why: many services (Google sign-in, LinkedIn, Zomato, Instagram) flag or block data-center IPs. Routing agent traffic through a residential IP makes you look like a normal user.
server/docker/compose.yaml includes an optional proxy service (tinyproxy,
built locally from server/docker/proxy/) under the proxy profile. It:
- reads
PROXY_URLfrom.env - exposes an HTTP forward proxy on
127.0.0.1:8118(loopback only) - forwards all requests through your residential endpoint via tinyproxy's
upstream http|https|socks5 …directive, generated at container start byserver/docker/proxy/entrypoint.sh
Other containers (runtime-api, dev-sandbox, optionally
authenticated-chrome) set HTTP_PROXY=http://moto-proxy:8118 so every
outbound request is rewritten. Chrome uses its own --proxy-server=$PROXY_URL
flag and bypasses this sidecar — see the Chrome-specific note below.
No SOCKS5 listener in v0.1. Tinyproxy only offers HTTP/HTTPS on the
inbound side (it does accept a SOCKS5 upstream). Most agent clients speak
HTTP proxy anyway; run a separate gost / microsocks container if you
genuinely need a local SOCKS5 listener.
# .env:
PROXY_URL=http://USER:[email protected]:7000
PROXY_APPLIES_TO=authenticated-chrome,runtime-apiThen:
ssh ax41 'cd /opt/moto/server/docker && docker compose --profile proxy up -d'Verify:
ssh ax41 'curl -x http://127.0.0.1:8118 https://ifconfig.me'
# → prints a residential IP, not the server IP| Provider | Strength | Format |
|---|---|---|
| Bright Data | Largest pool, strict KYC | http://brd-customer-hl_XXX-zone-residential:[email protected]:22225 |
| Smartproxy | Good value, easy signup | http://spXXXXX:[email protected]:7000 |
| Oxylabs | Solid scraping-focused | http://customer-USER-cc-us:[email protected]:7777 |
| IPRoyal | Cheap, good for experiments | http://USER:[email protected]:12321 |
| SOAX | Flexible country/ASN targeting | http://package-XXX-country-us:[email protected]:9000 |
Chrome's --proxy-server= flag is set by chrome-launcher.sh when both
PROXY_URL is non-empty and authenticated-chrome is in
PROXY_APPLIES_TO. After enabling/disabling, systemctl restart authenticated-chrome for it to take effect.
Set PROXY_URL= (empty) in .env and:
ssh ax41 'cd /opt/moto/server/docker && docker compose stop proxy && systemctl restart authenticated-chrome'Traffic will return to using the server's native IP.
The cloudflared service in compose.yaml is under the tunnel profile and
is not started by default. To use it:
# 1. set CLOUDFLARE_TUNNEL_TOKEN in .env (non-empty!)
# 2. activate the profile:
cd /opt/moto/server/docker
docker compose --profile tunnel up -d cloudflaredIf CLOUDFLARE_TUNNEL_TOKEN is empty when the profile is activated, the
container crash-loops — leave the profile off unless you've set the token.