Device guide · Docker · Node.js client 1.6.0
Run a bandwidth-sharing peer in Docker
There is no prebuilt PROXIES.SX image. The documented way to run the peer in Docker is the official Node.js reference client inside the public node:20-alpine image, with your SDK / device key in an environment variable and a named volume that keeps the device identity across restarts. It suits a home server, NAS or Unraid box on a residential connection.
Registration does not guarantee traffic or earnings. Earnings depend on eligible traffic your devices actually serve and on your active partner terms.
Checked on against our published supplier terms
What runs in the container
- Base image
- node:20-alpine, as in the official guide. Node 20 is end-of-life and no longer among Docker Hub's supported tags
- Client
- reference-sdk.js 1.6.0, 40,839 bytes, from agents.proxies.sx
- SHA-256 on 27 Sep 2026
- a4541cf44b129822cdb431eb8df16b1b30023c1bcc9db8cdab1db20d7828df9f
- Dependency
- ws (WebSocket library), installed by npm on first start
- Environment
- API_KEY (required), PEER_STATE_FILE, optional WALLET, RELAY_URL, CONNECTION_METHOD
- Relay sockets
- WS_CONNECTIONS, default 4, clamped to 5 (the relay accepts at most 6 per device)
- Network
- Outbound only; no published ports
Run it
Get a key and declare your supply
Create a farmer account, sign the agreement, complete the supply-source declaration and create an SDK / device key. Use only a connection whose owner has given informed consent.Start the container
This is the one-liner from the official peer guide with-w /appadded: without a working directory,npm i wsfails in/on current node:20-alpine images and the container restarts in a loop. The volume persists the identity, so a restart reuses the same device;AGENT_NAMEis left unset on purpose so each container uses its own hostname.Shell docker run -d --name proxies-peer \ -e API_KEY=psx_your_key \ -e PEER_STATE_FILE=/state/id.json \ -v proxies-peer-state:/state \ --restart unless-stopped \ -w /app \ node:20-alpine sh -c "[ -e node_modules/ws ] || npm i ws; [ -f reference-sdk.js ] || wget -qO reference-sdk.js https://agents.proxies.sx/peer/reference-sdk.js; node reference-sdk.js"Watch it register
Look forREGISTERED,CONNECTEDandACK. A device then needs at least an hour online and a quality score of 50 or more before auto-approval.Shell docker logs -f proxies-peer
Pin the client you reviewed
mkdir proxies-peer && cd proxies-peer
curl -fLO https://agents.proxies.sx/peer/reference-sdk.js
shasum -a 256 reference-sdk.js # compare with the published client you reviewed
docker run -d --name proxies-peer \
-e API_KEY=psx_your_key \
-e PEER_STATE_FILE=/state/id.json \
-v proxies-peer-state:/state \
-v "$PWD/reference-sdk.js:/app/reference-sdk.js:ro" \
-w /app --restart unless-stopped \
node:20-alpine sh -c "[ -e node_modules/ws ] || npm i ws; node reference-sdk.js"services:
proxies-peer:
image: node:20-alpine
container_name: proxies-peer
restart: unless-stopped
working_dir: /app
environment:
API_KEY: psx_your_key
PEER_STATE_FILE: /state/id.json
volumes:
- proxies-peer-state:/state
- ./reference-sdk.js:/app/reference-sdk.js:ro
command: sh -c "[ -e node_modules/ws ] || npm i ws; node reference-sdk.js"
volumes:
proxies-peer-state:What we checked on 27 September 2026
$ docker run --rm -v "$PWD":/app -w /app node:20-alpine sh -c \
'node --version; npm i ws@8; SELFTEST=1 node reference-sdk.js'
v20.20.2
added 1 package in 2s
[CONNECTED] slot=0 deviceId=dev1 relay=wss://relay.proxies.sx
[CLOSED] slot=0 code=4008 reason=pool cap exceeded
[SLOT 0] relay throttled us (4008); backing off 0s
[TOKEN] refreshed; next refresh in 60m
[REDIRECT] switching relay wss://relay.proxies.sx -> wss://relay-us.proxies.sx (geo)
[RELAY_FAILOVER] wss://relay-us.proxies.sx unreachable x2 -> failing over to wss://relay.proxies.sx
[SELFTEST] PASS
$ node reference-sdk.js # without API_KEY
API_KEY env requiredHome servers, NAS and Unraid
| Host | Notes |
|---|---|
| Unraid, TrueNAS SCALE, Synology Container Manager | Use the compose file above, or the same image, environment and volume in the web UI. Keep the state volume on persistent storage. |
| Proxmox | Run Docker inside a VM or LXC container that has outbound internet access. |
| A VPS or cloud VM | Runs, but datacenter IPs are rejected for listing, so it will not carry customer traffic. |
| Many containers on one connection | They share one exit IP; duplicates are not extra exits. Run one per real connection. |
Stop and remove
docker rm -f proxies-peer
docker volume rm proxies-peer-state # deletes the device identityRemove the device in the farmer dashboard as well. You can leave at any time; earnings already recorded stay on your account.
Questions
- Is there an official Docker image for the PROXIES.SX peer?
- No prebuilt image is published. The documented method runs the official Node.js reference client inside the public node:20-alpine image, downloading reference-sdk.js and its one dependency, ws, on first start.
- Can I run several containers on one machine?
- Each container gets its own identity from its hostname, but containers behind the same connection share one exit IP, and duplicates on one IP are not extra distinct exits. Run one container per real connection.
- Will it earn on a VPS or cloud server?
- The container runs anywhere Docker does, but datacenter IPs are rejected for customer listing. It needs a residential or mobile connection, such as a home server, NAS or mini PC.
- Does it work on a Raspberry Pi or Apple Silicon?
- node:20-alpine is published for arm64 as well as amd64, and the reference client is plain JavaScript. We ran our test on linux/amd64 only, so we have not verified arm64.
- Why does the volume matter?
- The state file keeps the device identity. With the volume, a restart reuses the same device and refreshes its token; without it, every re-created container (for example after an image update) registers a new device, which also makes registration rate limits (HTTP 429) more likely.
- Should I set AGENT_NAME?
- Not in the one-liner. The client defaults to the container hostname, so each container is its own device. Giving many containers the same name collapses them into one device.
Run one container on a home connection
Sources
The one-liner is quoted from the peer guide as published on 27 September 2026.