peeringdb-plus

module
v1.18.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 27, 2026 License: BSD-3-Clause

README

PeeringDB Plus

CI

A high-performance, globally distributed, read-only mirror of PeeringDB data. Syncs all PeeringDB objects on a configurable schedule, stores them in SQLite with edge replication via LiteFS on Fly.io, and serves the data through five API surfaces.

Live instance: peeringdb-plus.fly.dev

API Surfaces

Surface Path Description
Web UI /ui/ Search, detail pages, and multi-entity comparison
GraphQL /graphql Interactive GraphiQL playground + query endpoint
REST /rest/v1/ OpenAPI-compliant (spec)
PeeringDB Compat /api/ Drop-in replacement for the PeeringDB API
ConnectRPC /peeringdb.v1.*/ Get/List/Stream RPCs for all 13 entity types

The root endpoint (GET /) returns a JSON service discovery document. Terminal clients receive help text; browsers redirect to the Web UI.

Quick Start

Local (Go)
go build -o peeringdb-plus ./cmd/peeringdb-plus
./peeringdb-plus
# Listening on :8080, syncing from api.peeringdb.com every hour
Local (Docker)
docker build -t peeringdb-plus .
docker run -p 8080:8080 peeringdb-plus

The database is stored at /data/peeringdb-plus.db inside the container. Mount a volume to persist data across restarts:

docker run -p 8080:8080 -v pdbdata:/data peeringdb-plus
Prerequisites
  • Go 1.26+

All code generation tools (buf, templ, gqlgen) are Go tool dependencies declared in go.mod and require no separate installation.

Data Sync

PeeringDB data is synced automatically on a configurable interval (default: hourly). The sync runs on the primary node only; replicas receive updates via LiteFS replication.

  • Modes: full (complete re-fetch, default) or incremental (only modified objects since last sync).
  • On-demand trigger: POST /sync with X-Sync-Token header (requires PDBPLUS_SYNC_TOKEN to be set). Accepts ?mode=full|incremental.
  • Readiness: /readyz reports unhealthy until the first sync completes and degrades if sync data exceeds the staleness threshold (default: 24h).

Configuration

All configuration is via environment variables, validated at startup (fail-fast).

Variable Default Description
PDBPLUS_LISTEN_ADDR :8080 HTTP listen address (overridden by PDBPLUS_PORT)
PDBPLUS_DB_PATH ./peeringdb-plus.db SQLite database file path
PDBPLUS_PEERINGDB_URL https://api.peeringdb.com PeeringDB API base URL
PDBPLUS_PEERINGDB_API_KEY Optional API key for higher rate limits
PDBPLUS_SYNC_TOKEN Shared secret for POST /sync; empty = disabled
PDBPLUS_SYNC_INTERVAL 1h Duration between automatic syncs
PDBPLUS_SYNC_MODE full Sync strategy: full or incremental
PDBPLUS_SYNC_STALE_THRESHOLD 24h Max sync age before readiness degrades
PDBPLUS_CORS_ORIGINS * Comma-separated allowed CORS origins
PDBPLUS_DRAIN_TIMEOUT 10s Graceful shutdown drain timeout
PDBPLUS_OTEL_SAMPLE_RATE 1.0 Trace sampling ratio (0.0-1.0)
PDBPLUS_STREAM_TIMEOUT 60s Max duration for streaming RPCs
PDBPLUS_IS_PRIMARY true Fallback primary detection without LiteFS

Standard OTEL_* environment variables are also supported (autoexport).

ConnectRPC / gRPC

All 13 PeeringDB entity types are available via ConnectRPC with Get, List, and Stream RPCs. The server supports Connect, gRPC, and gRPC-Web protocols on the same endpoints.

Service Discovery
# List all services (requires grpcurl or buf curl)
grpcurl -plaintext localhost:8080 list

# Describe a service
grpcurl -plaintext localhost:8080 describe peeringdb.v1.NetworkService

gRPC reflection (v1 and v1alpha) and health checks are enabled.

Unary RPCs
# Get a single network by ID
buf curl --protocol grpc --http2-prior-knowledge \
  http://localhost:8080/peeringdb.v1.NetworkService/GetNetwork \
  -d '{"id": 42}'

# List networks with filters and pagination
buf curl --protocol grpc --http2-prior-knowledge \
  http://localhost:8080/peeringdb.v1.NetworkService/ListNetworks \
  -d '{"page_size": 10, "status": "ok"}'
Streaming RPCs

All entity types support server-streaming for bulk data retrieval, eliminating manual pagination. Streams accept the same filters as List RPCs.

Service Stream RPC
CampusService StreamCampuses
CarrierService StreamCarriers
CarrierFacilityService StreamCarrierFacilities
FacilityService StreamFacilities
InternetExchangeService StreamInternetExchanges
IxFacilityService StreamIxFacilities
IxLanService StreamIxLans
IxPrefixService StreamIxPrefixes
NetworkService StreamNetworks
NetworkFacilityService StreamNetworkFacilities
NetworkIxLanService StreamNetworkIxLans
OrganizationService StreamOrganizations
PocService StreamPocs
# Stream all networks
buf curl --protocol grpc --http2-prior-knowledge \
  http://localhost:8080/peeringdb.v1.NetworkService/StreamNetworks \
  -d '{}'

# Stream with filter
buf curl --protocol grpc --http2-prior-knowledge \
  http://localhost:8080/peeringdb.v1.NetworkService/StreamNetworks \
  -d '{"asn": 15169}'

The grpc-total-count response header contains the approximate total matching records. Streams have a server-side timeout (default 60s, configurable via PDBPLUS_STREAM_TIMEOUT) and can be cancelled by the client at any time.

Content Types
Content-Type Format Use case
application/proto Protocol Buffers Smallest wire size
application/json JSON Human-readable, debugging
application/grpc gRPC (proto) Standard gRPC clients
application/grpc+json gRPC (JSON) gRPC clients wanting JSON

PeeringDB Compat API

The /api/ endpoint is a drop-in replacement for the PeeringDB REST API:

# List networks
curl https://peeringdb-plus.fly.dev/api/net

# Get a specific network
curl https://peeringdb-plus.fly.dev/api/net/42

# Search with query parameters
curl 'https://peeringdb-plus.fly.dev/api/net?q=cloudflare&limit=5'

Supports depth, limit, skip, fields, since, and q query parameters.

Development

go build ./...                    # Build all packages
go test -race ./...               # Run tests with race detector
go generate ./...                 # Full codegen pipeline (ent, templ, proto)
go vet ./...                      # Vet
golangci-lint run                 # Lint
govulncheck ./...                 # Vulnerability check

Technology

  • Go 1.26+ with entgo ORM
  • SQLite via modernc.org/sqlite (pure Go, no CGO)
  • LiteFS for edge replication on Fly.io
  • ConnectRPC for gRPC/Connect/gRPC-Web on standard net/http
  • OpenTelemetry for tracing, metrics, and structured logging
  • templ + htmx + Tailwind CSS for the web UI
  • gqlgen via entgql for GraphQL
  • entrest for OpenAPI-compliant REST
  • Chainguard base images for minimal container footprint

License

BSD 3-Clause. See LICENSE.

Directories

Path Synopsis
cmd
pdb-compat-allowlist command
Command pdb-compat-allowlist reads the ent schema graph and emits internal/pdbcompat/allowlist_gen.go with:
Command pdb-compat-allowlist reads the ent schema graph and emits internal/pdbcompat/allowlist_gen.go with:
pdb-fixture-port command
Command pdb-fixture-port ports Django fixture blocks from peeringdb/peeringdb's src/peeringdb_server/management/commands/ pdb_api_test.py into Go struct literals committed to internal/testutil/parity/fixtures.go.
Command pdb-fixture-port ports Django fixture blocks from peeringdb/peeringdb's src/peeringdb_server/management/commands/ pdb_api_test.py into Go struct literals committed to internal/testutil/parity/fixtures.go.
pdb-schema-extract command
pdb-schema-extract parses PeeringDB Django serializer and model Python source to produce an intermediate JSON schema representation.
pdb-schema-extract parses PeeringDB Django serializer and model Python source to produce an intermediate JSON schema representation.
pdb-schema-generate command
pdb-schema-generate reads an intermediate JSON schema produced by pdb-schema-extract and generates entgo schema Go files.
pdb-schema-generate reads an intermediate JSON schema produced by pdb-schema-extract and generates entgo schema Go files.
pdbcompat-check command
Command pdbcompat-check fetches responses from the PeeringDB API and compares their structure against local golden files to detect drift.
Command pdbcompat-check fetches responses from the PeeringDB API and compares their structure against local golden files to detect drift.
peeringdb-plus command
Package main is the entry point for the peeringdb-plus application.
Package main is the entry point for the peeringdb-plus application.
ent
poc
schema
Package schema defines the entgo schema types for PeeringDB objects.
Package schema defines the entgo schema types for PeeringDB objects.
schematypes
Package schematypes hosts Go value types referenced by ent schemas via field.JSON.
Package schematypes hosts Go value types referenced by ent schemas via field.JSON.
gen
Package graph provides the GraphQL resolver layer for the PeeringDB Plus API.
Package graph provides the GraphQL resolver layer for the PeeringDB Plus API.
model
Package model defines custom GraphQL model types that are not generated by ent.
Package model defines custom GraphQL model types that are not generated by ent.
internal
buildinfo
Package buildinfo exposes the build-time version string used by both the PeeringDB User-Agent and the OTel resource so they stay in lockstep.
Package buildinfo exposes the build-time version string used by both the PeeringDB User-Agent and the OTel resource so they stay in lockstep.
config
Package config loads application configuration from environment variables.
Package config loads application configuration from environment variables.
conformance
Package conformance provides structural comparison of JSON API responses for validating PeeringDB compatibility layer output against the real PeeringDB API.
Package conformance provides structural comparison of JSON API responses for validating PeeringDB compatibility layer output against the real PeeringDB API.
database
Package database provides SQLite database setup for the ent ORM client.
Package database provides SQLite database setup for the ent ORM client.
graphql
Package graphql provides the HTTP handler factory for the PeeringDB Plus GraphQL API.
Package graphql provides the HTTP handler factory for the PeeringDB Plus GraphQL API.
grpcserver
Package grpcserver provides ConnectRPC service handlers for the PeeringDB gRPC API.
Package grpcserver provides ConnectRPC service handlers for the PeeringDB gRPC API.
health
Package health provides HTTP handlers for liveness and readiness checks.
Package health provides HTTP handlers for liveness and readiness checks.
httperr
Package httperr provides RFC 9457 Problem Details for HTTP API error responses.
Package httperr provides RFC 9457 Problem Details for HTTP API error responses.
litefs
Package litefs provides utilities for detecting the role of the current node in a LiteFS cluster (primary vs replica).
Package litefs provides utilities for detecting the role of the current node in a LiteFS cluster (primary vs replica).
middleware
Package middleware provides HTTP middleware for the PeeringDB Plus server.
Package middleware provides HTTP middleware for the PeeringDB Plus server.
otel
Package otel initializes the OpenTelemetry trace, metric, and log pipelines.
Package otel initializes the OpenTelemetry trace, metric, and log pipelines.
pdbcompat
Package pdbcompat provides a PeeringDB-compatible REST API layer that translates Django-style query parameters to ent predicates and serializes ent entities to PeeringDB's exact JSON response format.
Package pdbcompat provides a PeeringDB-compatible REST API layer that translates Django-style query parameters to ent predicates and serializes ent entities to PeeringDB's exact JSON response format.
pdbcompat/parity
Package parity holds regression tests that lock v1.16 pdbcompat semantics against future drift.
Package parity holds regression tests that lock v1.16 pdbcompat semantics against future drift.
pdbcompat/schemaannot
Package schemaannot exposes ent schema annotation types consumed by ent/schema/*.go to describe pdbcompat's Path A allowlist (Phase 70 D-01) and per-edge FILTER_EXCLUDE (D-03).
Package schemaannot exposes ent schema annotation types consumed by ent/schema/*.go to describe pdbcompat's Path A allowlist (Phase 70 D-01) and per-edge FILTER_EXCLUDE (D-03).
peeringdb
Package peeringdb provides a client for the PeeringDB API with rate limiting, pagination, retry logic, and response types for all 13 PeeringDB object types.
Package peeringdb provides a client for the PeeringDB API with rate limiting, pagination, retry logic, and response types for all 13 PeeringDB object types.
privctx
Package privctx propagates the visibility tier of the caller through a Go context.
Package privctx propagates the visibility tier of the caller through a Go context.
privfield
This file exists so future exported symbols in the package can accrete documentation here without crowding the Redact contract in privfield.go.
This file exists so future exported symbols in the package can accrete documentation here without crowding the Redact contract in privfield.go.
sync
Package sync orchestrates data synchronization from PeeringDB into the local SQLite database using the ent ORM.
Package sync orchestrates data synchronization from PeeringDB into the local SQLite database using the ent ORM.
testutil
Package testutil provides shared test helpers for ent client setup.
Package testutil provides shared test helpers for ent client setup.
testutil/parity
Package parity holds upstream-ported fixture data for the Phase 72 parity regression test suite.
Package parity holds upstream-ported fixture data for the Phase 72 parity regression test suite.
testutil/seed
Package seed provides deterministic test data seeding for PeeringDB entity types.
Package seed provides deterministic test data seeding for PeeringDB entity types.
unifold
Package unifold folds Unicode strings into a normalised ASCII-lowercase form suitable for diacritic-insensitive equality and substring matching.
Package unifold folds Unicode strings into a normalised ASCII-lowercase form suitable for diacritic-insensitive equality and substring matching.
visbaseline
Package visbaseline captures and diffs unauthenticated vs authenticated PeeringDB API responses for all 13 object types, with a strict no-PII-in-repo guarantee enforced by the Redact function in this package.
Package visbaseline captures and diffs unauthenticated vs authenticated PeeringDB API responses for all 13 object types, with a strict no-PII-in-repo guarantee enforced by the Redact function in this package.
web
web/templates
templ: version: v0.3.1001
templ: version: v0.3.1001
web/termrender
Package termrender provides terminal client detection and ANSI text rendering for serving styled text responses to CLI clients like curl, wget, and HTTPie.
Package termrender provides terminal client detection and ANSI text rendering for serving styled text responses to CLI clients like curl, wget, and HTTPie.
Package schema contains the intermediate PeeringDB JSON schema and generate directives for the schema extraction pipeline.
Package schema contains the intermediate PeeringDB JSON schema and generate directives for the schema extraction pipeline.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL