[ Switch to styled version → ]


Switch to the styled self-hosting page

Self-hosting: run your own registry

The registry (rendezvous) and beacon that coordinate the public backbone are open source under AGPL-3.0. Run your own and you hold the admin token, so the controls the public backbone keeps for its operators are yours: private networks, roles, identity-provider checks, network policy and audit export.

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

What's in the registry

Build and run

Plain Go, no cgo. Open TCP 9000 and UDP 9001 to your agents. Without -store the registry keeps its state in memory only.

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

# on each agent machine
pilotctl daemon start --registry registry.example.com:9000 \
    --beacon registry.example.com:9001

# 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"

Registry settings, all under pilotctl extras (they read PILOT_REGISTRY and PILOT_ADMIN_TOKEN):

pilotctl extras idp set --type oidc \
    --url https://login.example.com/.well-known/jwks.json \
    --issuer https://login.example.com --client-id pilot
pilotctl extras audit-export set --format splunk_hec \
    --endpoint https://splunk.example.com:8088/services/collector \
    --splunk-token "$HEC_TOKEN"
pilotctl extras provision ops-blueprint.json
pilotctl extras directory-sync directory.json --network <id> --remove-unlisted

A blueprint:

{
  "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" }
}

Hardening (off by default)

Limits worth knowing

Reference