An onion service advertises itself to the network by publishing a signed descriptor to a rotating set of hidden service directories (HSDirs). That descriptor lists the service's introduction points: a handful of relays that act as rendezvous brokers. A client that knows your address fetches the descriptor, picks an introduction point, and negotiates a rendezvous. The whole reachability of a .onion address therefore reduces to one question: is there a valid descriptor in the HSDir hash ring that lists working introduction points?
OnionBalance exploits exactly this. Instead of one server publishing its own descriptor, you run several independent backend onion services, each on its own VPS, each with its own keys and its own introduction points. A separate, lightweight management instance collects the introduction points from every backend, merges them into a single descriptor signed with the master identity key, and publishes that combined descriptor under your public address. A client connecting to your public .onion is transparently routed to whichever backend's introduction point it happened to select.
Two consequences follow, and it is important to be honest about both:
- It gives you redundancy. If one backend VPS dies, its introduction points stop responding, and (after the next descriptor refresh) clients land on the survivors. The address never changes.
- It gives you only coarse load spreading, not real load balancing. A descriptor can advertise at most around 10 to 20 introduction points total, and a client picks one at random. There is no health-aware routing, no session affinity, and no awareness of which backend is busy. Treat OnionBalance as availability insurance, not as a precise load balancer.
Critically, the management instance is not in the data path. Once a descriptor is published, clients talk directly to a backend; the management host can be offline for hours and existing descriptors keep working until they expire. That makes the management instance an attractive, low-exposure component to run on a small, separate VPS.