apollo-router

📁 apollographql/skills 📅 1 day ago
109
总安装量
7
周安装量
#3974
全站排名
安装命令
npx skills add https://github.com/apollographql/skills --skill apollo-router

Agent 安装分布

opencode 7
github-copilot 7
codex 7
kimi-cli 7
gemini-cli 7
amp 7

Skill 文档

Apollo Router Config Generator

Apollo Router is a high-performance graph router written in Rust for running Apollo Federation 2 supergraphs. It sits in front of your subgraphs and handles query planning, execution, and response composition.

This skill generates version-correct configuration. Router v1 and v2 have incompatible config schemas in several critical sections (CORS, JWT auth, connectors). Always determine the target version before generating any config.

Step 1: Version Selection

Ask the user before generating any config:

Which Apollo Router version are you targeting?

  [1] Router v2.x (recommended — current LTS, required for Connectors)
  [2] Router v1.x (legacy — end-of-support announced, security patches only)
  [3] Not sure — help me decide

If the user picks [3], display:

Quick guide:

  • Pick v2 if: you're starting fresh, using Apollo Connectors for REST APIs,
    or want backpressure-based overload protection.
  • Pick v1 if: you have an existing deployment and haven't migrated yet.
    Note: Apollo ended active support for v1.x. The v2.10 LTS (Dec 2025)
    is the current baseline. Migration is strongly recommended.

  Tip: If you have an existing router.yaml, you can auto-migrate it:
    router config upgrade router.yaml

Store the selection as ROUTER_VERSION=v1|v2 to gate all subsequent template generation.

Step 2: Environment Selection

Ask: Production or Development?

  • Production: security-hardened defaults (introspection off, sandbox off, homepage off, subgraph errors hidden, auth required, health check on)
  • Development: open defaults (introspection on, sandbox on, errors exposed, text logging)

Load the appropriate base template from:

  • templates/{version}/production.yaml
  • templates/{version}/development.yaml

Step 3: Feature Selection

Ask which features to include:

  • JWT Authentication
  • CORS (almost always yes for browser clients)
  • Operation Limits
  • Traffic Shaping / Rate Limiting
  • Telemetry (Prometheus, OTLP tracing, JSON logging)
  • APQ (Automatic Persisted Queries)
  • Connectors (REST API integration — Router v2 only; GA key is connectors, early v2 preview key was preview_connectors)
  • Subscriptions
  • Header Propagation

Step 4: Gather Parameters

For each selected feature, collect required values.

  • Use section templates from templates/{version}/sections/ for auth, cors, headers, limits, telemetry, and traffic-shaping.
  • For Connectors in v2, use templates/v2/sections/connectors.yaml as the source.
  • For APQ and subscriptions, copy the snippet from the selected base template (templates/{version}/production.yaml or templates/{version}/development.yaml) or from references.
  • Only offer Connectors when ROUTER_VERSION=v2.

CORS

  • List of allowed origins (never use "*" for production)

JWT Authentication

  • JWKS URL
  • Issuer(s) — note: v1 uses singular issuer, v2 uses plural issuers array

Connectors (v2 only)

  • Subgraph name and source name (used as connectors.sources.<subgraph>.<source>)
  • Optional $config values for connector runtime configuration
  • If migrating old v2 preview config, rename preview_connectors to connectors

Operation Limits

Present the tuning guidance:

Operation depth limit controls how deeply nested a query can be.

  Router default: 100 (permissive — allows very deep queries)
  Recommended starting point: 50

  Lower values (15–25) are more secure but will reject legitimate queries
  in schemas with deep entity relationships or nested fragments.
  Higher values (75–100) are safer for compatibility but offer less
  protection against depth-based abuse.

  Tip: Run your router in warn_only mode first to see what depths your
  real traffic actually uses, then tighten:
    limits:
      warn_only: true

What max_depth would you like? [default: 50]

The same principle applies to max_height, max_aliases, and max_root_fields.

Telemetry

  • OTEL collector endpoint (default: http://otel-collector:4317)
  • Prometheus listen port (default: 9090)
  • Trace sampling rate (default: 0.1 = 10%)

Traffic Shaping

  • Client-facing rate limit capacity (default: 1000 req/s)
  • Router timeout (default: 60s)
  • Subgraph timeout (default: 30s)

Step 5: Generate Config

  1. Load the correct version template from templates/{version}/
  2. Assemble section templates for supported sectioned features, then merge base-template snippets for APQ/subscriptions as needed
  3. Inject user-provided parameters
  4. Add a comment block at the top stating the target version

Step 6: Validate

Run the post-generation checklist:

  • All env vars referenced in config are documented
  • CORS origins don’t include wildcards (production)
  • Rate limiting is on router: (client-facing), not only all: (subgraph)
  • JWT uses issuers (v2) not issuer (v1), or vice versa
  • If production: introspection=false, sandbox=false, subgraph_errors=false
  • Health check is enabled
  • Homepage is disabled (production)
  • Run: router config validate <file> if Router binary is available

Required Validation Gate (always run)

After generating or editing any router.yaml, you MUST:

  1. Run validation/checklist.md and report pass/fail for each checklist item.
  2. Run router config validate <path-to-router.yaml> if Router CLI is available.
  3. If Router CLI is unavailable, state that explicitly and still complete the checklist.
  4. Do not present the configuration as final until validation is completed.

Step 7: Conditional Next Steps Handoff

After answering any Apollo Router request (config generation, edits, validation, or general Router guidance), decide whether the user already has runnable prerequisites:

  • GraphOS-managed path: APOLLO_KEY + APOLLO_GRAPH_REF, or
  • Local path: a composed supergraph.graphql plus reachable subgraphs

If prerequisites are already present, do not add extra handoff text.

If prerequisites are missing or unknown, end with a concise Next steps handoff (1-3 lines max):

  1. Compose or fetch a supergraph (rover supergraph compose or rover supergraph fetch).
  2. Run Router with both supergraph and config (router --supergraph ... --config router.yaml).
  3. If subgraphs are missing, suggest using related skills (apollo-server, graphql-schema, rover, graphql-operations) to scaffold and test.

Quick Start (for reference)

Install

# macOS/Linux
curl -sSL https://router.apollo.dev/download/nix/latest | sh
sudo mv router /usr/local/bin/
router --version

# Docker
docker pull ghcr.io/apollographql/router:latest

Get a Supergraph Schema

# Compose from local files
rover supergraph compose --config supergraph.yaml > supergraph.graphql

# Or fetch from GraphOS
rover supergraph fetch my-graph@production > supergraph.graphql

Run the Router

# With local schema
router --supergraph supergraph.graphql

# With configuration file
router --supergraph supergraph.graphql --config router.yaml

# Development mode (relaxed security, better errors)
router --dev --supergraph supergraph.graphql

Default endpoint: http://localhost:4000

Running Modes

Mode Command Use Case
Local schema router --supergraph ./schema.graphql Development, CI/CD
GraphOS managed APOLLO_KEY=... APOLLO_GRAPH_REF=my-graph@prod router Production with auto-updates
Development router --dev --supergraph ./schema.graphql Local development
Hot reload router --hot-reload --supergraph ./schema.graphql Schema changes without restart

Environment Variables

Variable Description
APOLLO_KEY API key for GraphOS
APOLLO_GRAPH_REF Graph reference (graph-id@variant)
APOLLO_ROUTER_CONFIG_PATH Path to router.yaml
APOLLO_ROUTER_SUPERGRAPH_PATH Path to supergraph schema
APOLLO_ROUTER_LOG Log level (off, error, warn, info, debug, trace)
APOLLO_ROUTER_LISTEN_ADDRESS Override listen address

Reference Files

CLI Reference

router [OPTIONS]

Options:
  -s, --supergraph <PATH>    Path to supergraph schema file
  -c, --config <PATH>        Path to router.yaml configuration
      --dev                  Enable development mode
      --hot-reload           Watch for schema changes
      --log <LEVEL>          Log level (default: info)
      --listen <ADDRESS>     Override listen address
  -V, --version              Print version
  -h, --help                 Print help

Ground Rules

  • ALWAYS determine the target Router version (v1 or v2) before generating config
  • DEFAULT to v2 for new projects
  • ALWAYS include a comment block at top of generated config stating the target version
  • ALWAYS use --dev mode for local development (enables introspection and sandbox)
  • ALWAYS disable introspection, sandbox, and homepage in production
  • PREFER GraphOS managed mode for production (automatic updates, metrics)
  • USE --hot-reload for local development with file-based schemas
  • NEVER expose APOLLO_KEY in logs or version control
  • USE environment variables (${env.VAR}) for all secrets and sensitive config
  • PREFER YAML configuration over command-line arguments for complex setups
  • TEST configuration changes locally before deploying to production
  • WARN if user enables allow_any_origin or wildcard CORS in production
  • RECOMMEND router config upgrade router.yaml for v1 → v2 migration instead of regenerating from scratch
  • MUST run validation/checklist.md after every router config generation or edit
  • MUST run router config validate <file> when Router CLI is available
  • MUST report when CLI validation could not run (for example, Router binary missing)
  • MUST append a brief conditional handoff when runtime prerequisites are missing or unknown
  • USE max_depth: 50 as the default starting point, not 15 (too aggressive) or 100 (too permissive)
  • RECOMMEND warn_only: true for initial limits rollout to observe real traffic before enforcing