rustbgpd
Cookbook

Cookbook — scenario-driven deployment recipes

Choose a complete rustbgpd deployment recipe.

Choose a complete rustbgpd deployment recipe.

Each recipe here is a complete deployment shape: a working config, the verification commands with the output shape to expect, the metrics to watch, and the failure modes with the explain commands that debug them. The configs are derived from the interop fixtures under tests/interop/configs/ that the M-series receipts run against real peer stacks — every recipe cites the receipts that prove its scenario (RECEIPTS.md).

Find the route-server path

I want to…Read this
Decide whether rustbgpd fits an IXP route-server deploymentIXP evaluation
Build a route server from hand-maintained member and policy configurationIXP route server
Keep an existing ARouteServer general.yml / clients.yml workflowIXP filter pipeline
Provision from an IXP Manager v7.4 databaseIXP Manager route server
Run a non-authoritative comparison beside the incumbent, without planning a cutover yetRoute-server shadow pilot
Replace an incumbent through a planned shadow trial and cutoverRoute-server migration
Verify or troubleshoot a hand-maintained route server after deploymentIXP route server

How the six route-server documents divide the work

DocumentScope it ownsScope it does not own
IXP evaluationFit assessment: capability, evidence, and product-boundary checks before choosing a deploymentConfiguration generation, a running pilot, or cutover procedure
IXP route serverHand-maintained member and policy configuration, validation, startup, and day-2 verificationARouteServer or IXP Manager generation, standing incumbent comparison, or migration planning
IXP filter pipelineARouteServer input, generated datasets and configuration, validated activation, and Alice-LG integrationHand-maintained inventories, IXP Manager lifecycle, or incumbent cutover
IXP Manager route serverIXP Manager export, render, receipt, activation, rollback, lock, fetch, and callback lifecycleARouteServer inputs or a generic incumbent-replacement plan
Route-server shadow pilotA standing, receive-only comparison beside production, including its mode-specific safety boundary, comparison loop, data return, and teardownAuthoritative service or a decision to cut over
Route-server migrationIncumbent concept mapping, a cutover-oriented shadow trial, readiness gates, cutover, and rollbackA long-running evaluation with no planned authority transfer

The only genuine overlap is the comparison interval shared by the shadow-pilot and migration guides. The shadow-pilot guide owns an ongoing non-authoritative evaluation; the migration guide repeats the comparison only as a gate on a planned cutover. The three provisioning guides can look similar because each produces a route-server configuration, but their input authority is mutually exclusive: hand-maintained files, ARouteServer, or IXP Manager.

IXP provisioning: three modes

An exchange provisions a rustbgpd route server in exactly one of three mutually exclusive shapes. Pick by what you already have; each row's recipe names the other two.

ModeYou have…The pipelineRecipeProven by
Hand-writtennothing external — you author members and policy yourselfexamples/route-server/config.toml → rustbgpd --check --strict → SIGHUPIXP route serverM83
ARouteServer-drivenarouteserver's general.yml / clients.yml and its refresh cadencearouteserver template-context → rs-config-render → --check --strict → swap + SIGHUP, fail-staleIXP filter pipelineM83, M90 (11/11 BIRD differential parity)
IXP Manager-drivenIXP Manager v7.4 as the member and router databaseFoil template → rs-config-render --input-format ixp-manager-v2 → --check --strict receipt → atomic activation with rollback → IXP Manager lock/fetch/callback lifecycle, rustbgpd@<handle>.service per handleIXP Manager route serverM96, M97 (local gates), pinned v7.4 contract oracle

The renderer owns the whole output directory in both automated modes, so you do not hand-edit their output, and IXP Manager mode activates only unmodified receipted candidates. Piloting any mode beside your incumbent with zero blast radius is the shadow pilot; two instances of any mode are paired route servers.

RecipeWhen this is youProven by
iBGP route reflector at scaleReplacing an iBGP full mesh; tens to 1,000 clientsM14, M76, M77, 1000-peer scale receipt
L3VPN route reflectorVPNv4/VPNv6 reflection for a PE fleet, RT-Constrain filteredM74, M75, M77, VPN scale receipt
IXP route serverTransparent redistribution among exchange members: RPKI, RFC 9234 roles, Add-Path + per-client best-pathM83
Route-server migrationMap FRR, BIRD, and ARouteServer concepts into rustbgpd and run a shadow-trial cutoverM83
Route-server shadow pilotRun rustbgpd for weeks as a receive-only, non-authoritative second route server beside production BIRD/OpenBGPD — the receive-only posture per provisioning mode (hand-written, arouteserver overlay, and what an IXP Manager site does instead), standing comparison loop, what a pilot cannot get yet, data-return contract, clean teardownM83, M90, IXP receipt matrix; M96/M97 referenced for the cutover-shaped stack
IXP filter pipelineKeep your arouteserver general.yml/clients.yml: render member filters with rs-config-render, reload fail-stale, serve Alice-LGM83, M90
IXP Manager route serverIXP Manager v7.4 provisions the route server: Foil export → render → --check --strict receipt → atomic activation → lock/fetch/callback lifecycle, paired handles, IXP Manager looking glass through the Birdwatcher surface — with the boundary statedM96, M97 (local), pinned v7.4 contract oracle
MANRS IXP Action 1Document your MANRS IXP Programme participation: Action 1 mapped requirement-by-requirement to validated config and member-verifiable surfacesM83, fragments pass rustbgpd --check --strict
Controller / monitoring feedStreaming BMP, durable events, and MRT into a controller or collector stackM24, M81
EVPN fabric route reflectorControl-plane-only RR for a VXLAN-EVPN leaf/spine fabricM29, M30, M82, M33
Policy quickstart (.rpol)First typed policy: tests, dry-run, hot swap, explainM80, M34

Operator runbooks — short, ordered checklists for a live daemon:

RunbookWhen to reach for it
Peer-flap triageA session keeps cycling: confirm, read events, match the teardown reason, contain
RR pair day-2Routine changes on a redundant RR pair: GR sanity, adding clients, hot vs session-reset edits, commit-confirm
Paired route serversTwo independent RS instances: staggered config rollout, inter-RS consistency via rbgp diff advertised, RFC 8326 maintenance drain
Activation manual recoveryThe activation or lifecycle helper returned exit 5 (ManualRecovery): confirm candidate health, keep or roll back, release the lifecycle lock, handle the receipt, resume automation
Shadow cutoverThe step-by-step shadow trial lives in route-server-migration.md; the comparison tool it gates on is rbgp diff advertised

Conventions:

  • Addresses are examples (RFC 5737 / private ranges) — substitute your own. No config here references a hostname.
  • Every config in this directory's recipes loads through the real config loader: validated with rustbgpd --check and a daemon startup on the same commit that shipped them.
  • gRPC in the recipes stays on the default local Unix socket with tier authorization (ADR-0064). For remote access, see the mTLS guidance in the security reference.
  • Start here if you haven't run the daemon at all yet: docs/tutorials/quickstart.md, then come back for your scenario.
  • Debugging why a route was (not) selected, advertised, or imported? The explain-surface catalog is docs/how-to/explain.md.
Source on GitHub

On this page