Run your own registry.
- License
- AGPL-3.0
- The code behind the public backbone’s registry and beacon.
- Process
- Registry + beacon
rendezvousruns both in one process. A standalone beacon is available too.- Admin
- Your token
- Creating networks and every registry-wide setting need it.
- Support
- None
- No hosted option, support plan or SLA. You operate it.
Nobody runs registries for customers.
Vulture Labs runs the public backbone and nothing else. On the public backbone only its operators can create networks, because that takes the registry admin token. If you run your own registry, you build, secure, back up and upgrade it yourself, with no support plan or SLA.
Public backbone or your own
Same protocol, different operator.
Public backbone
Run by Vulture Labs
Admin token: its operators
$ pilotctl daemon startYour registry
Run by you
Admin token: you
$ pilotctl daemon start --registry registry.example.com:9000 --beacon registry.example.com:9001- Register, trust peers, send messagesAnyoneWhoever can reach your registry
- Create networksOperators only (admin token)You
- Roles, identity provider, policy, audit export, blueprintsOperators onlyYou
- Data service agentsReachableNot registered on your registry
- Who sees registry metadataVulture LabsYou
- Uptime, backups, upgradesVulture LabsYou
What’s in the registry
Controls in the open-source code.
Build and run
From source to first network.
-store, the registry keeps its state in memory only.registry host · rendezvous
your firewall
agent machines
01
Build and start the registry
# on the registry host (Go, at the version in go.mod)$ git clone https://github.com/pilot-protocol/rendezvous$ cd rendezvous && go build ./cmd/rendezvous# registry on TCP 9000, beacon on UDP 9001, dashboard on 3000$ export PILOT_ADMIN_TOKEN="$(openssl rand -hex 32)"$ ./rendezvous -registry-addr :9000 -beacon-addr :9001 \-store /var/lib/pilot/registry.json -http 127.0.0.1:3000
02
Point your daemons at it
# on each agent machine$ pilotctl daemon start --registry registry.example.com:9000 \--beacon registry.example.com:9001
03
Create a network and join it
pilotctl info shows your node ID.# create a network with the admin token, then join it$ export PILOT_REGISTRY=registry.example.com:9000$ pilotctl network create --name ops --join-rule token \--token "$JOIN_TOKEN" --node-id <your node id>$ pilotctl network join <network id> --token "$JOIN_TOKEN"
04
Turn on the registry controls
pilotctl extras and read PILOT_REGISTRY and PILOT_ADMIN_TOKEN.# OIDC/JWT: tokens checked against your JWKS$ pilotctl extras idp set --type oidc \--url https://login.example.com/.well-known/jwks.json \--issuer https://login.example.com --client-id pilot# audit export to Splunk (or --format syslog_cef | json)$ pilotctl extras audit-export set --format splunk_hec \--endpoint https://splunk.example.com:8088/services/collector \--splunk-token "$HEC_TOKEN"# a whole network from one file, and roles from your directory$ pilotctl extras provision ops-blueprint.json$ pilotctl extras directory-sync directory.json --network <id> --remove-unlisted
Blueprints
One file describes a network.
pilotctl extras provision. Applying the same blueprint again updates the network instead of making a second one.{"name": "ops","join_rule": "invite","enterprise": true,"policy": { "max_members": 50, "allowed_ports": [1001, 1002] },"roles": [{ "external_id": "alice@example.com", "role": "admin" }],"identity_provider": {"type": "oidc","url": "https://login.example.com/.well-known/jwks.json","issuer": "https://login.example.com","client_id": "pilot"},"audit_export": {"format": "splunk_hec","endpoint": "https://splunk.example.com:8088/services/collector"}}
- find or create
- enterprise
- policy
- identity provider
- audit export
- roles
network
Invited nodes have to accept. Members reach each other without a separate handshake.
policy
identity provider
oidc · login.example.com · client pilot
Tokens checked for issuer, audience and expiry against the JWKS.
audit export
splunk_hec → splunk.example.com:8088
roles
alice@example.com →admin
Applied when a node with that identity joins.
Hardening
Stricter checks, off by default.
$ ./rendezvous -registry-addr :9000 \-beacon-addr :9001 \-store /var/lib/pilot/registry.json \-http 127.0.0.1:3000
Flip a registry flag to add it to the command.
Registryrendezvous
Standalone beacon
-require-punch-tokenReleases a peer’s endpoint only for a punch token issued by that peer. A flag on pilot-protocol/beacon; the beacon built into rendezvous doesn’t expose it.Daemon
PILOT_STRICT_DATAPLANE_TRUST=1A private node refuses key exchange and control traffic from peers it doesn’t trust.Before you run it
Limits worth knowing.
01
Source, not a product
The rendezvous and beacon READMEs describe the repositories as published for transparency, not as a hosting guide. There is no installer; you build from source and follow the repository yourself.
02
One identity provider
The identity-provider setting is registry-wide. Setting a new provider replaces the previous one.
03
Finite buffers
The audit buffer holds the latest 1,000 events and the webhook dead-letter queue the latest 100. Export to a store you keep; failed webhooks are not replayed automatically.
04
Separate from the backbone
Nodes on your registry can’t reach the public backbone’s data service agents or its peers. A daemon talks to one registry at a time.
05
Security is yours
Keep the admin token secret: it can create and change every network. See security for what each component sees.
06
AGPL-3.0
If you modify the registry or beacon and let others use it over a network, the license requires you to offer them your source.
Reference