Operator guide

Run a VPN Node and Earn TON per GB

Anyone with a Linux VPS can run a ProofKit node. You set a price per GB, stake 1 TON per node, and claim your earnings in TON. On a direct session you receive 80% of what the user is charged.

Stake / node
1 TON
Direct share
80%
Server
x86-64
Paid in
TON
your VPS · install (Docker)
# as root; the dashboard fills in your token
$ bash <(curl -sSL https://proofkit.org/install.sh) \
    --mode=docker --type=origin --token=YOUR_TOKEN
# checks the kernel, installs Docker if it is missing,
# opens the firewall ports and starts the agent
# with an updater that checks every 6 hours

What you need

  • A Linux server with a public IPv4 address. x86-64 (amd64) only: the agent is not built for ARM servers today. Kernel 5.6 or newer, because WireGuard is built into the kernel from 5.6. At least 1 vCPU and 1 GB of RAM; 2 vCPU and 2 GB are recommended.
  • Root access and a free TCP port 443. No web server or other VPN may already listen on it.
  • Docker, or AlmaLinux / CentOS Stream 10+. The Docker mode runs on any distribution and installs Docker if it is missing. The systemd mode, without Docker, is for AlmaLinux and CentOS Stream 10 or newer.
  • A TON wallet that supports TonConnect, such as Tonkeeper. It deposits your stake and receives your payouts. A wallet can be linked to one ProofKit account only.
  • 1 TON per node in the escrow as stake, and about 0.1 TON left in the wallet to pay for claim transactions.

Exit node or entry node

Exit node (origin). Runs Xray and WireGuard. It decrypts the user's tunnel and sends their traffic to the internet from your IP address, so abuse and copyright complaints about that traffic reach you and your hosting provider. Two switches help: Torrent Guard blocks BitTorrent, and Cloudflare WARP sends traffic out through Cloudflare instead of your IP. An exit always serves VLESS Reality; Hysteria2, XHTTP and olcRTC are optional.

Entry node (edge). Runs nginx as a TCP pass-through plus WireGuard, and never decrypts anything. Place it where users can still reach it when routes abroad are throttled, then link it to exit nodes: your own, or any exit whose operator accepts outside entries. Each exit decides who may link to it: anyone, listed operators, or only its owner's entries. If WireGuard is blocked between the two servers, switch the tunnel to GRE or GRE+IPsec.

One server runs one node type.

Set up a node

01

Create an operator account

Sign up with your email, choose Run a node, and enter the 6-digit code we email you.

02

Connect a wallet and deposit

On the Wallet page, connect your TON wallet and deposit at least 1 TON for each node you plan to run. Deposits there start at 0.5 TON.

03

Register the node

Add Node asks for the node type, the server's public IPv4, its country, your price per GB, a limit on concurrent sessions, an optional Reality camouflage domain, and switches for WARP, Torrent Guard, the tunnel type, extra transports and private mode. 1 TON of your balance is then locked as the node's stake.

04

Run the install command

The dashboard shows the command with your node's token, for Docker or for systemd. Run it as root. In Docker mode it checks the kernel, installs Docker if needed, turns on BBR congestion control, opens the ports below in firewalld, ufw or iptables, and starts the agent with Watchtower, which checks for a new agent version every 6 hours. Everything lives in /opt/proofkit-dvpn.

05

Check that it goes live

The node turns active when the agent connects to the coordinator. A public node then appears in the marketplace; a private one appears only to the people you invite.

Ports to open

PortCarries
TCP 443VLESS Reality on exits; the pass-through on entries
UDP 443Hysteria2, if you switch it on
TCP 8444XHTTP, if you switch it on
UDP 51820WireGuard tunnel between an entry and an exit
UDP 500, 4500, ESP, GREGRE and GRE+IPsec tunnels, if you use them
UDP 30000-39999, TCP 40000-499992-hop relays for Hysteria2 and XHTTP on entry nodes

Prices and what you earn

You set a price per GB for each node, from 0.001 to 100 TON. An exit node always has one; an entry node may be set to 0, and a route through it then costs what its exit costs. Users see it with the 20% network fee added, and the price is fixed into each session when the user connects, so a change applies to new sessions only. You can change a price once every 24 hours, and an increase can be at most three times the current price. Lowering it has no limit.

On a direct session you receive 80% of what the user is charged, and the platform keeps 20%. The charge is your price plus the fee, so per GB you receive 0.96 times your price (olcRTC traffic from 20 November 2026 earns 80% of the olcRTC price instead):

Your priceUser pays / GBYou get / GBYou get / 100 GB
0.001 TON0.0012 TON0.00096 TON0.096 TON
0.01 TON0.012 TON0.0096 TON0.96 TON

On a 2-hop route both the entry and the exit operator are paid from the same session, and your dashboard shows what each session earned. Upload and download both count, and a GB is 1024³ bytes.

How much traffic a node gets depends on its country, price, uptime and demand, and the network is young. Compare the countries and prices already listed in the marketplace before you choose yours, and do not plan around a fixed income.

Getting paid

Earnings show as pending on your Wallet page as users' traffic is billed. Once at least 0.02 TON is pending, press Claim earnings: the coordinator signs a batch claim covering up to 50 users, your wallet sends it to the escrow contract, and the contract takes those users' charges from their deposits, pays you 80% and keeps 20% as the platform fee. That is the same split your pending balance already shows.

Each claim is a transaction from your wallet that attaches about 0.06 TON for gas; the escrow contract sends back what the claim does not use, so a claim costs a few thousandths of a TON. Payouts go to the wallet linked to your operator account.

Stake and slashing

Registering a node locks 1 TON of your escrow balance as its stake; registration fails if your available balance is lower. Deleting the node releases the stake back to your balance, which you can withdraw. Claim a node's unclaimed earnings first: a node that still has them cannot be deleted.

The network checks every node: it makes test connections through the node's tunnel, cross-checks the bytes reported by the entry and the exit with each other and with WireGuard's kernel counters, and looks for statistical anomalies. Three or more critical flags on a node within 24 hours cost 10% of its stake, at most once per 24 hours.

Private nodes

Mark a node private and it disappears from the marketplace. Only people you invite can connect: send a one-time code, or a link that is reusable, limited to a number of uses, or set to expire. You can revoke anyone later. Private nodes bill and pay like public ones, and a private exit node has a price too, at least 0.001 TON per GB. More on the private node page.

olcRTC on an exit node

olcRTC carries a user's traffic inside a video call on a public video-conferencing service, for networks where the other transports are blocked. It is optional and runs on exit nodes. Some of the services it can use need your own account there, which you connect in the dashboard; ProofKit keeps those credentials on a separate provisioning server and never shows them back. One service needs no account. Which services a node may use is set by the platform, node by node. olcRTC is metered like the other transports, carries UDP, and leaves from your server's own IP rather than through WARP. Until 20 November 2026 its traffic pays your price like any other; from then on it is charged at one network-wide olcRTC price per GB (a route priced at 0 stays free, olcRTC included), and you receive 80% of that price for the olcRTC traffic your node carries. Users need an olcRTC-capable client.

When something goes wrong

What you seeLikely cause
Sessions connect but move 0 bytesA port is closed, most often in the hosting panel's firewall
The installer stops at the kernel checkThe kernel is older than 5.6
The image pull failsAn ARM server (only x86-64 images exist), or the registry is blocked from the server's network
The container will not startAnother program holds TCP 443 or UDP 51820, or /dev/net/tun is missing (enable TUN in the VPS panel)
Your provider forwards abuse complaintsUsers' traffic leaves from your IP; consider Torrent Guard or WARP, and read the provider's policy

Day-to-day commands on a Docker-mode server:

your VPS · /opt/proofkit-dvpn
$ cd /opt/proofkit-dvpn
# follow the agent's log
$ docker compose logs -f dvpn-agent
# update now instead of waiting for the 6-hour check
$ docker compose pull && docker compose up -d
# remove the software, then delete the node in the dashboard to free its stake
$ bash <(curl -sSL https://proofkit.org/install.sh) --uninstall
// faq

Operator questions

What do I need to run a node?

An x86-64 Linux VPS with a public IPv4 address, kernel 5.6 or newer and root access; a TON wallet that supports TonConnect; and 1 TON per node deposited into the escrow as stake.

How much can I earn?

It depends on how much traffic users send through your node, and there is no guaranteed volume. On a direct session you receive 80% of what the user is charged, which is your price plus the 20% fee, so 0.96 times your price per GB (olcRTC traffic from 20 November 2026 earns 80% of the olcRTC price instead). At a price of 0.01 TON, 100 GB of direct traffic pays you 0.96 TON.

How do I get paid?

Earnings build up as pending on your Wallet page. From 0.02 TON you can claim: the coordinator signs a batch claim, your wallet sends it to the escrow contract, and the contract pays you in TON. Each claim attaches about 0.06 TON for gas and gets back what it does not use, so it costs a few thousandths of a TON.

Can I run only an entry node?

Yes. An entry node relays users to exit nodes over a WireGuard tunnel, or GRE / GRE+IPsec where WireGuard is blocked. Link it to your own exits or to any exit whose operator accepts outside entries.

Do I get my stake back?

Yes. Deleting a node returns its 1 TON stake to your escrow balance, minus any slash. Claim the node's earnings first, because a node with unclaimed earnings cannot be deleted.

Can I run a node only for myself and friends?

Yes. Make it private and invite people with codes or links. They pay your price per GB plus the 20% network fee from their own balance, at least 0.0012 TON per GB on an exit node, and you receive 80% of it. To use it yourself, sign in with a separate user account, because operator accounts manage nodes and do not connect.

// next step

Add your first node

Create an operator account, deposit 1 TON per node, register the node and run the command the dashboard prints. The setup guide explains every field of the form.