zuplo 6.67.32 → 6.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/docs/_index.md +44 -0
- package/docs/ai-gateway/apps.mdx +28 -0
- package/docs/ai-gateway/custom-providers.mdx +54 -0
- package/docs/ai-gateway/getting-started.mdx +224 -0
- package/docs/ai-gateway/guardrails.mdx +65 -0
- package/docs/ai-gateway/integrations/ai-sdk.mdx +109 -0
- package/docs/ai-gateway/integrations/claude-code.mdx +49 -0
- package/docs/ai-gateway/integrations/codex.mdx +78 -0
- package/docs/ai-gateway/integrations/goose.mdx +104 -0
- package/docs/ai-gateway/integrations/langchain.mdx +66 -0
- package/docs/ai-gateway/integrations/openai.mdx +99 -0
- package/docs/ai-gateway/introduction.mdx +85 -0
- package/docs/ai-gateway/managing-apps.mdx +46 -0
- package/docs/ai-gateway/managing-providers.mdx +66 -0
- package/docs/ai-gateway/managing-teams.mdx +63 -0
- package/docs/ai-gateway/policies/akamai-ai-firewall.mdx +125 -0
- package/docs/ai-gateway/policies/comet-opik-tracing.mdx +139 -0
- package/docs/ai-gateway/policies/galileo-tracing.mdx +147 -0
- package/docs/ai-gateway/providers.mdx +32 -0
- package/docs/ai-gateway/teams.mdx +38 -0
- package/docs/ai-gateway/universal-api.mdx +43 -0
- package/docs/ai-gateway/usage-limits.mdx +89 -0
- package/docs/api-management/introduction.md +127 -0
- package/docs/articles/accounts/audit-logs.mdx +227 -0
- package/docs/articles/accounts/billing.mdx +25 -0
- package/docs/articles/accounts/default-api-key.mdx +30 -0
- package/docs/articles/accounts/delete-account.mdx +36 -0
- package/docs/articles/accounts/enterprise-sso.mdx +116 -0
- package/docs/articles/accounts/managing-account-members.mdx +45 -0
- package/docs/articles/accounts/managing-project-members.mdx +37 -0
- package/docs/articles/accounts/members-and-roles.mdx +21 -0
- package/docs/articles/accounts/roles-and-permissions.mdx +115 -0
- package/docs/articles/accounts/zuplo-api-keys.mdx +94 -0
- package/docs/articles/add-api-to-backstage.mdx +216 -0
- package/docs/articles/advanced-path-matching.mdx +139 -0
- package/docs/articles/api-key-administration.mdx +47 -0
- package/docs/articles/api-key-api.mdx +220 -0
- package/docs/articles/api-key-authentication.mdx +195 -0
- package/docs/articles/api-key-buckets.mdx +61 -0
- package/docs/articles/api-key-end-users.mdx +52 -0
- package/docs/articles/api-key-leak-detection.mdx +75 -0
- package/docs/articles/api-key-management.mdx +100 -0
- package/docs/articles/api-key-react-component.mdx +90 -0
- package/docs/articles/api-key-service-limits.mdx +14 -0
- package/docs/articles/archiving-requests-to-storage.mdx +119 -0
- package/docs/articles/branch-based-deployments.mdx +184 -0
- package/docs/articles/bypass-policy-for-testing.mdx +117 -0
- package/docs/articles/check-ip-address.mdx +17 -0
- package/docs/articles/ci-cd-azure/basic-deployment.mdx +49 -0
- package/docs/articles/ci-cd-azure/deploy-and-test.mdx +47 -0
- package/docs/articles/ci-cd-azure/local-testing.mdx +59 -0
- package/docs/articles/ci-cd-azure/multi-stage-deployment.mdx +88 -0
- package/docs/articles/ci-cd-azure/pr-preview-environments.mdx +50 -0
- package/docs/articles/ci-cd-azure/tag-based-releases.mdx +37 -0
- package/docs/articles/ci-cd-bitbucket/basic-deployment.mdx +27 -0
- package/docs/articles/ci-cd-bitbucket/deploy-and-test.mdx +41 -0
- package/docs/articles/ci-cd-bitbucket/local-testing.mdx +34 -0
- package/docs/articles/ci-cd-bitbucket/multi-stage-deployment.mdx +52 -0
- package/docs/articles/ci-cd-bitbucket/pr-preview-environments.mdx +46 -0
- package/docs/articles/ci-cd-bitbucket/tag-based-releases.mdx +27 -0
- package/docs/articles/ci-cd-circleci/basic-deployment.mdx +34 -0
- package/docs/articles/ci-cd-circleci/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-circleci/local-testing.mdx +50 -0
- package/docs/articles/ci-cd-circleci/multi-stage-deployment.mdx +82 -0
- package/docs/articles/ci-cd-circleci/pr-preview-environments.mdx +47 -0
- package/docs/articles/ci-cd-circleci/tag-based-releases.mdx +38 -0
- package/docs/articles/ci-cd-github/basic-deployment.mdx +48 -0
- package/docs/articles/ci-cd-github/cleanup-on-branch-delete.mdx +123 -0
- package/docs/articles/ci-cd-github/deploy-and-test.mdx +82 -0
- package/docs/articles/ci-cd-github/local-testing.mdx +102 -0
- package/docs/articles/ci-cd-github/multi-stage-deployment.mdx +136 -0
- package/docs/articles/ci-cd-github/pr-preview-environments.mdx +106 -0
- package/docs/articles/ci-cd-github/tag-based-releases.mdx +99 -0
- package/docs/articles/ci-cd-gitlab/basic-deployment.mdx +28 -0
- package/docs/articles/ci-cd-gitlab/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-gitlab/local-testing.mdx +39 -0
- package/docs/articles/ci-cd-gitlab/mr-preview-environments.mdx +52 -0
- package/docs/articles/ci-cd-gitlab/multi-stage-deployment.mdx +64 -0
- package/docs/articles/ci-cd-gitlab/tag-based-releases.mdx +28 -0
- package/docs/articles/composite-policy-reference.mdx +284 -0
- package/docs/articles/configuring-auth0-for-mcp-auth.mdx +186 -0
- package/docs/articles/configuring-okta-for-mcp-auth.mdx +208 -0
- package/docs/articles/convert-urls-to-openapi.mdx +62 -0
- package/docs/articles/cors.mdx +447 -0
- package/docs/articles/custom-audit-log-policy.mdx +95 -0
- package/docs/articles/custom-ci-cd-azure.mdx +81 -0
- package/docs/articles/custom-ci-cd-bitbucket.mdx +80 -0
- package/docs/articles/custom-ci-cd-circleci.mdx +78 -0
- package/docs/articles/custom-ci-cd-github.mdx +99 -0
- package/docs/articles/custom-ci-cd-gitlab.mdx +79 -0
- package/docs/articles/custom-ci-cd.mdx +82 -0
- package/docs/articles/custom-code-patterns.md +418 -0
- package/docs/articles/custom-domains.mdx +258 -0
- package/docs/articles/custom-logging-example.mdx +139 -0
- package/docs/articles/ddos-protection.mdx +138 -0
- package/docs/articles/development-options.mdx +49 -0
- package/docs/articles/environment-variables.mdx +134 -0
- package/docs/articles/environments.mdx +143 -0
- package/docs/articles/fastly-zuplo-host-setup.mdx +41 -0
- package/docs/articles/github-deployment-testing.mdx +101 -0
- package/docs/articles/gke-with-upstream-auth-policy.mdx +192 -0
- package/docs/articles/graphql-security.mdx +180 -0
- package/docs/articles/handling-form-data.mdx +61 -0
- package/docs/articles/health-checks.mdx +109 -0
- package/docs/articles/hosting-options.mdx +70 -0
- package/docs/articles/lazy-load-configuration-into-cache.mdx +92 -0
- package/docs/articles/limits.mdx +98 -0
- package/docs/articles/local-development-debugging.mdx +44 -0
- package/docs/articles/local-development-env-variables.mdx +23 -0
- package/docs/articles/local-development-installing-packages.mdx +23 -0
- package/docs/articles/local-development-routes-designer.mdx +27 -0
- package/docs/articles/local-development-services.mdx +40 -0
- package/docs/articles/local-development-troubleshooting.mdx +56 -0
- package/docs/articles/local-development.mdx +81 -0
- package/docs/articles/log-plugin-aws-cloudwatch.mdx +83 -0
- package/docs/articles/log-plugin-datadog.mdx +84 -0
- package/docs/articles/log-plugin-dynatrace.mdx +75 -0
- package/docs/articles/log-plugin-gcp.mdx +75 -0
- package/docs/articles/log-plugin-loki.mdx +136 -0
- package/docs/articles/log-plugin-new-relic.mdx +84 -0
- package/docs/articles/log-plugin-splunk.mdx +104 -0
- package/docs/articles/log-plugin-sumo.mdx +73 -0
- package/docs/articles/log-plugin-vmware-log-insight.mdx +154 -0
- package/docs/articles/log-request-response-data.mdx +398 -0
- package/docs/articles/logging.mdx +115 -0
- package/docs/articles/manual-mcp-oauth-testing.mdx +193 -0
- package/docs/articles/mcp-quickstart.mdx +135 -0
- package/docs/articles/metrics-plugins.mdx +371 -0
- package/docs/articles/migrate-from-apigee.md +408 -0
- package/docs/articles/migrate-from-aws-api-gateway.md +248 -0
- package/docs/articles/migrate-from-azure-apim.md +292 -0
- package/docs/articles/migrate-from-kong.md +300 -0
- package/docs/articles/migration-overview.md +81 -0
- package/docs/articles/monetization/api-access.mdx +69 -0
- package/docs/articles/monetization/billing-models.md +520 -0
- package/docs/articles/monetization/developer-portal.md +167 -0
- package/docs/articles/monetization/features.mdx +98 -0
- package/docs/articles/monetization/index.mdx +113 -0
- package/docs/articles/monetization/meters.mdx +135 -0
- package/docs/articles/monetization/monetization-policy.md +314 -0
- package/docs/articles/monetization/plan-examples.mdx +366 -0
- package/docs/articles/monetization/plans.mdx +266 -0
- package/docs/articles/monetization/pricing-models.mdx +225 -0
- package/docs/articles/monetization/private-plans.md +154 -0
- package/docs/articles/monetization/quickstart.md +355 -0
- package/docs/articles/monetization/rate-cards.mdx +171 -0
- package/docs/articles/monetization/stripe-integration.md +195 -0
- package/docs/articles/monetization/subscription-lifecycle.md +298 -0
- package/docs/articles/monetization/tax-collection.md +166 -0
- package/docs/articles/monetization/troubleshooting.md +272 -0
- package/docs/articles/monetization-custom.mdx +71 -0
- package/docs/articles/monetization-integrations.mdx +104 -0
- package/docs/articles/monitoring-your-gateway.mdx +53 -0
- package/docs/articles/monorepo-deployment.mdx +350 -0
- package/docs/articles/multiple-auth-policies.mdx +81 -0
- package/docs/articles/non-standard-ports.mdx +30 -0
- package/docs/articles/oauth-authentication.mdx +54 -0
- package/docs/articles/openapi-server-urls.mdx +60 -0
- package/docs/articles/openapi.mdx +130 -0
- package/docs/articles/opentelemetry.mdx +250 -0
- package/docs/articles/per-user-rate-limits-using-db.mdx +112 -0
- package/docs/articles/performance-testing.mdx +304 -0
- package/docs/articles/plugin-akamai-api-security.mdx +76 -0
- package/docs/articles/plugin-azure-blob.mdx +73 -0
- package/docs/articles/plugin-azure-event-hubs.mdx +64 -0
- package/docs/articles/plugin-hydrolix-traffic-peak.mdx +147 -0
- package/docs/articles/policies.mdx +33 -0
- package/docs/articles/rename-or-move-project.mdx +39 -0
- package/docs/articles/rick-and-morty-api-developer-portal-example.mdx +23 -0
- package/docs/articles/routing.mdx +193 -0
- package/docs/articles/s3-signed-url-uploads.mdx +521 -0
- package/docs/articles/secure-tunnel.mdx +84 -0
- package/docs/articles/securing-backend-mtls.mdx +268 -0
- package/docs/articles/securing-your-backend.mdx +148 -0
- package/docs/articles/security.mdx +105 -0
- package/docs/articles/sharing-code-across-projects.mdx +412 -0
- package/docs/articles/source-control-setup-azure.mdx +13 -0
- package/docs/articles/source-control-setup-bitbucket.mdx +43 -0
- package/docs/articles/source-control-setup-github.mdx +172 -0
- package/docs/articles/source-control-setup-gitlab.mdx +12 -0
- package/docs/articles/source-control.mdx +80 -0
- package/docs/articles/step-1-setup-basic-gateway-local.mdx +136 -0
- package/docs/articles/step-1-setup-basic-gateway.mdx +118 -0
- package/docs/articles/step-2-add-rate-limiting-local.mdx +126 -0
- package/docs/articles/step-2-add-rate-limiting.mdx +82 -0
- package/docs/articles/step-3-add-api-key-auth-local.mdx +199 -0
- package/docs/articles/step-3-add-api-key-auth.mdx +166 -0
- package/docs/articles/step-4-deploying-to-the-edge.mdx +220 -0
- package/docs/articles/step-5-dynamic-rate-limiting.mdx +167 -0
- package/docs/articles/support.mdx +144 -0
- package/docs/articles/terraform.mdx +114 -0
- package/docs/articles/testing-graphql.mdx +34 -0
- package/docs/articles/testing.mdx +522 -0
- package/docs/articles/troubleshooting-slow-responses.mdx +301 -0
- package/docs/articles/troubleshooting.md +302 -0
- package/docs/articles/tsconfig.mdx +105 -0
- package/docs/articles/tunnel-setup.mdx +195 -0
- package/docs/articles/tunnel-troubleshooting.mdx +50 -0
- package/docs/articles/update-zup-in-github-action.mdx +110 -0
- package/docs/articles/use-openapi-extension-data.mdx +79 -0
- package/docs/articles/users/multifactor-authentication.mdx +64 -0
- package/docs/articles/users/profile.mdx +13 -0
- package/docs/articles/versioning-on-zuplo.mdx +89 -0
- package/docs/articles/waf-ddos-akamai.md +133 -0
- package/docs/articles/waf-ddos-aws-waf-shield.mdx +85 -0
- package/docs/articles/waf-ddos-fastly.mdx +251 -0
- package/docs/articles/waf-ddos.mdx +140 -0
- package/docs/articles/zuplo-waf.mdx +156 -0
- package/docs/ask.mdx +3 -0
- package/docs/cli/authentication.mdx +56 -0
- package/docs/cli/connectivity.mdx +38 -0
- package/docs/cli/create-zuplo-api.mdx +80 -0
- package/docs/cli/delete.mdx +79 -0
- package/docs/cli/deploy.mdx +156 -0
- package/docs/cli/deploy.partial.mdx +46 -0
- package/docs/cli/dev.mdx +115 -0
- package/docs/cli/docs.mdx +66 -0
- package/docs/cli/editor.mdx +50 -0
- package/docs/cli/global-options.mdx +19 -0
- package/docs/cli/init.mdx +74 -0
- package/docs/cli/link.mdx +74 -0
- package/docs/cli/list.mdx +55 -0
- package/docs/cli/mtls-certificate-create.mdx +94 -0
- package/docs/cli/mtls-certificate-delete.mdx +55 -0
- package/docs/cli/mtls-certificate-describe.mdx +55 -0
- package/docs/cli/mtls-certificate-disable.mdx +55 -0
- package/docs/cli/mtls-certificate-list.mdx +47 -0
- package/docs/cli/mtls-certificate-update.mdx +72 -0
- package/docs/cli/openapi-convert.mdx +111 -0
- package/docs/cli/openapi-merge.mdx +138 -0
- package/docs/cli/openapi-merge.partial.mdx +29 -0
- package/docs/cli/openapi-overlay.mdx +123 -0
- package/docs/cli/overview.mdx +78 -0
- package/docs/cli/project-create.mdx +43 -0
- package/docs/cli/source-migrate.mdx +18 -0
- package/docs/cli/source-upgrade.mdx +41 -0
- package/docs/cli/test.mdx +70 -0
- package/docs/cli/test.partial.mdx +7 -0
- package/docs/cli/tunnel-create.mdx +53 -0
- package/docs/cli/tunnel-create.partial.mdx +9 -0
- package/docs/cli/tunnel-delete.mdx +35 -0
- package/docs/cli/tunnel-delete.partial.mdx +9 -0
- package/docs/cli/tunnel-describe.mdx +45 -0
- package/docs/cli/tunnel-describe.partial.mdx +5 -0
- package/docs/cli/tunnel-list.mdx +35 -0
- package/docs/cli/tunnel-list.partial.mdx +9 -0
- package/docs/cli/tunnel-rate-token.partial.mdx +9 -0
- package/docs/cli/tunnel-rotate-token.mdx +39 -0
- package/docs/cli/tunnel-services-describe.mdx +45 -0
- package/docs/cli/tunnel-services-describe.partial.mdx +9 -0
- package/docs/cli/tunnel-services-update.mdx +48 -0
- package/docs/cli/variable-create.mdx +91 -0
- package/docs/cli/variable-create.partial.mdx +5 -0
- package/docs/cli/variable-update.mdx +75 -0
- package/docs/cli/variable-update.partial.mdx +5 -0
- package/docs/concepts/api-keys.md +146 -0
- package/docs/concepts/authentication.mdx +109 -0
- package/docs/concepts/how-zuplo-works.mdx +120 -0
- package/docs/concepts/project-structure.mdx +174 -0
- package/docs/concepts/rate-limiting.md +246 -0
- package/docs/concepts/request-lifecycle.mdx +56 -0
- package/docs/concepts/source-control-and-deployment.mdx +229 -0
- package/docs/conferences/conference-prize-terms.mdx +80 -0
- package/docs/dedicated/akamai/ai-powered-applications.mdx +223 -0
- package/docs/dedicated/akamai/architecture.mdx +280 -0
- package/docs/dedicated/akamai/caching.mdx +212 -0
- package/docs/dedicated/akamai/cdn.mdx +156 -0
- package/docs/dedicated/architecture.mdx +208 -0
- package/docs/dedicated/custom-domains.mdx +31 -0
- package/docs/dedicated/federated-gateways.mdx +80 -0
- package/docs/dedicated/networking.mdx +69 -0
- package/docs/dedicated/overview.mdx +80 -0
- package/docs/dedicated/source-control.mdx +63 -0
- package/docs/dev-portal/dev-portal-create-consumer-on-auth.mdx +134 -0
- package/docs/dev-portal/introduction.mdx +65 -0
- package/docs/dev-portal/local-development.mdx +72 -0
- package/docs/dev-portal/migration.mdx +526 -0
- package/docs/dev-portal/node-modules.mdx +45 -0
- package/docs/dev-portal/updating.mdx +28 -0
- package/docs/dev-portal/zudoku/components/alert.mdx +130 -0
- package/docs/dev-portal/zudoku/components/badge.mdx +70 -0
- package/docs/dev-portal/zudoku/components/button.mdx +132 -0
- package/docs/dev-portal/zudoku/components/callout.mdx +112 -0
- package/docs/dev-portal/zudoku/components/card.mdx +104 -0
- package/docs/dev-portal/zudoku/components/checkbox.mdx +72 -0
- package/docs/dev-portal/zudoku/components/client-only.mdx +79 -0
- package/docs/dev-portal/zudoku/components/code-tabs.mdx +179 -0
- package/docs/dev-portal/zudoku/components/dialog.mdx +167 -0
- package/docs/dev-portal/zudoku/components/head.mdx +199 -0
- package/docs/dev-portal/zudoku/components/icons.mdx +27 -0
- package/docs/dev-portal/zudoku/components/input.mdx +96 -0
- package/docs/dev-portal/zudoku/components/label.mdx +86 -0
- package/docs/dev-portal/zudoku/components/link.mdx +242 -0
- package/docs/dev-portal/zudoku/components/markdown.mdx +151 -0
- package/docs/dev-portal/zudoku/components/mermaid.mdx +81 -0
- package/docs/dev-portal/zudoku/components/playground.mdx +87 -0
- package/docs/dev-portal/zudoku/components/secret.mdx +78 -0
- package/docs/dev-portal/zudoku/components/select.mdx +176 -0
- package/docs/dev-portal/zudoku/components/shadcn.mdx +73 -0
- package/docs/dev-portal/zudoku/components/slider.mdx +108 -0
- package/docs/dev-portal/zudoku/components/slot.mdx +119 -0
- package/docs/dev-portal/zudoku/components/stepper.mdx +138 -0
- package/docs/dev-portal/zudoku/components/switch.mdx +96 -0
- package/docs/dev-portal/zudoku/components/syntax-highlight.mdx +602 -0
- package/docs/dev-portal/zudoku/components/textarea.mdx +78 -0
- package/docs/dev-portal/zudoku/components/tooltip.mdx +195 -0
- package/docs/dev-portal/zudoku/components/typography.mdx +61 -0
- package/docs/dev-portal/zudoku/configuration/ai-assistants.md +64 -0
- package/docs/dev-portal/zudoku/configuration/api-catalog.md +108 -0
- package/docs/dev-portal/zudoku/configuration/api-reference.md +397 -0
- package/docs/dev-portal/zudoku/configuration/authentication-auth0.md +173 -0
- package/docs/dev-portal/zudoku/configuration/authentication-azure-ad.md +238 -0
- package/docs/dev-portal/zudoku/configuration/authentication-clerk.md +110 -0
- package/docs/dev-portal/zudoku/configuration/authentication-firebase.md +61 -0
- package/docs/dev-portal/zudoku/configuration/authentication-pingfederate.md +136 -0
- package/docs/dev-portal/zudoku/configuration/authentication-supabase.md +225 -0
- package/docs/dev-portal/zudoku/configuration/authentication.md +199 -0
- package/docs/dev-portal/zudoku/configuration/build-configuration.mdx +147 -0
- package/docs/dev-portal/zudoku/configuration/docs.md +282 -0
- package/docs/dev-portal/zudoku/configuration/footer.mdx +214 -0
- package/docs/dev-portal/zudoku/configuration/llms.md +89 -0
- package/docs/dev-portal/zudoku/configuration/navigation.mdx +408 -0
- package/docs/dev-portal/zudoku/configuration/overview.md +380 -0
- package/docs/dev-portal/zudoku/configuration/protected-routes.md +149 -0
- package/docs/dev-portal/zudoku/configuration/search.md +169 -0
- package/docs/dev-portal/zudoku/configuration/sentry.mdx +44 -0
- package/docs/dev-portal/zudoku/configuration/site.md +124 -0
- package/docs/dev-portal/zudoku/configuration/slots.mdx +124 -0
- package/docs/dev-portal/zudoku/configuration/vite-config.md +18 -0
- package/docs/dev-portal/zudoku/custom-plugins.md +287 -0
- package/docs/dev-portal/zudoku/customization/colors-theme.mdx +275 -0
- package/docs/dev-portal/zudoku/customization/fonts.md +110 -0
- package/docs/dev-portal/zudoku/extending/events.md +124 -0
- package/docs/dev-portal/zudoku/guides/custom-pages.md +106 -0
- package/docs/dev-portal/zudoku/guides/environment-variables.md +99 -0
- package/docs/dev-portal/zudoku/guides/mermaid.mdx +70 -0
- package/docs/dev-portal/zudoku/guides/navigation-migration.md +87 -0
- package/docs/dev-portal/zudoku/guides/navigation-rules.mdx +197 -0
- package/docs/dev-portal/zudoku/guides/processors.mdx +234 -0
- package/docs/dev-portal/zudoku/guides/static-files.md +55 -0
- package/docs/dev-portal/zudoku/guides/transforming-examples.md +156 -0
- package/docs/dev-portal/zudoku/guides/using-multiple-apis.md +87 -0
- package/docs/dev-portal/zudoku/markdown/admonitions.md +128 -0
- package/docs/dev-portal/zudoku/markdown/code-blocks.md +196 -0
- package/docs/dev-portal/zudoku/markdown/frontmatter.md +172 -0
- package/docs/dev-portal/zudoku/markdown/mdx.md +68 -0
- package/docs/dev-portal/zudoku/markdown/overview.md +275 -0
- package/docs/dev-portal/zudoku/plugins.md +5 -0
- package/docs/dev-portal/zudoku/writing.mdx +72 -0
- package/docs/errors/bad-request.mdx +39 -0
- package/docs/errors/build-error.mdx +45 -0
- package/docs/errors/fatal-project-error.mdx +39 -0
- package/docs/errors/gateway-timeout.mdx +33 -0
- package/docs/errors/get-head-body-error.mdx +41 -0
- package/docs/errors/main-mod-error.mdx +40 -0
- package/docs/errors/no-project-set.mdx +41 -0
- package/docs/errors/not-found.mdx +43 -0
- package/docs/errors/rate-limit-exceeded.mdx +31 -0
- package/docs/errors/schema-validation-failed.mdx +51 -0
- package/docs/errors/system-configuration-error.mdx +44 -0
- package/docs/errors/unauthorized.mdx +50 -0
- package/docs/errors/unknown-error.mdx +42 -0
- package/docs/errors.mdx +14 -0
- package/docs/guides/canary-routing-for-employees.mdx +385 -0
- package/docs/guides/geolocation-backend-routing.mdx +404 -0
- package/docs/guides/modify-openapi-paths.mdx +371 -0
- package/docs/guides/openapi-overlays.mdx +492 -0
- package/docs/guides/overview.mdx +12 -0
- package/docs/guides/user-based-backend-routing.mdx +437 -0
- package/docs/handlers/aws-lambda.mdx +201 -0
- package/docs/handlers/custom-handler.mdx +112 -0
- package/docs/handlers/legacy-dev-portal-handler.mdx +135 -0
- package/docs/handlers/mcp-server.mdx +730 -0
- package/docs/handlers/openapi.mdx +78 -0
- package/docs/handlers/redirect.mdx +115 -0
- package/docs/handlers/system-handlers.mdx +41 -0
- package/docs/handlers/url-forward.mdx +204 -0
- package/docs/handlers/url-rewrite.mdx +224 -0
- package/docs/handlers/websocket-handler.mdx +154 -0
- package/docs/home.mdx +6 -0
- package/docs/managed-edge/overview.md +78 -0
- package/docs/mcp-server/configuration-migration-guide.mdx +344 -0
- package/docs/mcp-server/custom-tools.mdx +487 -0
- package/docs/mcp-server/graphql.mdx +241 -0
- package/docs/mcp-server/introduction.mdx +122 -0
- package/docs/mcp-server/openai-apps-sdk.mdx +160 -0
- package/docs/mcp-server/prompts.mdx +283 -0
- package/docs/mcp-server/resources.mdx +288 -0
- package/docs/mcp-server/testing.mdx +53 -0
- package/docs/mcp-server/tools.mdx +306 -0
- package/docs/policies/_index.md +92 -0
- package/docs/policies/ab-test-inbound/intro.md +8 -0
- package/docs/policies/ab-test-inbound/policy.ts +14 -0
- package/docs/policies/ab-test-inbound/schema.json +27 -0
- package/docs/policies/ab-test-outbound/intro.md +8 -0
- package/docs/policies/ab-test-outbound/policy.ts +26 -0
- package/docs/policies/ab-test-outbound/schema.json +27 -0
- package/docs/policies/acl-policy-inbound/intro.md +5 -0
- package/docs/policies/acl-policy-inbound/policy.ts +32 -0
- package/docs/policies/acl-policy-inbound/schema.json +52 -0
- package/docs/policies/akamai-ai-firewall/schema.json +98 -0
- package/docs/policies/amberflo-metering-inbound/doc.md +183 -0
- package/docs/policies/amberflo-metering-inbound/intro.md +20 -0
- package/docs/policies/amberflo-metering-inbound/schema.json +108 -0
- package/docs/policies/api-key-inbound/doc.md +77 -0
- package/docs/policies/api-key-inbound/intro.md +30 -0
- package/docs/policies/api-key-inbound/schema.json +84 -0
- package/docs/policies/archive-request-aws-s3-inbound/intro.md +4 -0
- package/docs/policies/archive-request-aws-s3-inbound/policy.ts +58 -0
- package/docs/policies/archive-request-aws-s3-inbound/schema.json +68 -0
- package/docs/policies/archive-request-azure-storage-inbound/doc.md +31 -0
- package/docs/policies/archive-request-azure-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-azure-storage-inbound/policy.ts +54 -0
- package/docs/policies/archive-request-azure-storage-inbound/schema.json +53 -0
- package/docs/policies/archive-request-gcp-storage-inbound/doc.md +63 -0
- package/docs/policies/archive-request-gcp-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-gcp-storage-inbound/policy.ts +68 -0
- package/docs/policies/archive-request-gcp-storage-inbound/schema.json +47 -0
- package/docs/policies/archive-response-aws-s3-outbound/intro.md +2 -0
- package/docs/policies/archive-response-aws-s3-outbound/policy.ts +59 -0
- package/docs/policies/archive-response-aws-s3-outbound/schema.json +68 -0
- package/docs/policies/archive-response-azure-storage-outbound/doc.md +31 -0
- package/docs/policies/archive-response-azure-storage-outbound/intro.md +3 -0
- package/docs/policies/archive-response-azure-storage-outbound/policy.ts +54 -0
- package/docs/policies/archive-response-azure-storage-outbound/schema.json +53 -0
- package/docs/policies/audit-log-inbound/doc.md +78 -0
- package/docs/policies/audit-log-inbound/intro.md +10 -0
- package/docs/policies/audit-log-inbound/schema.json +81 -0
- package/docs/policies/auth0-jwt-auth-inbound/doc.md +125 -0
- package/docs/policies/auth0-jwt-auth-inbound/intro.md +17 -0
- package/docs/policies/auth0-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/authzen-inbound/doc.md +24 -0
- package/docs/policies/authzen-inbound/intro.md +31 -0
- package/docs/policies/authzen-inbound/schema.json +126 -0
- package/docs/policies/axiomatics-authz-inbound/doc.md +144 -0
- package/docs/policies/axiomatics-authz-inbound/intro.md +11 -0
- package/docs/policies/axiomatics-authz-inbound/schema.json +161 -0
- package/docs/policies/basic-auth-inbound/intro.md +9 -0
- package/docs/policies/basic-auth-inbound/schema.json +99 -0
- package/docs/policies/bot-detection-inbound/intro.md +4 -0
- package/docs/policies/bot-detection-inbound/schema.json +56 -0
- package/docs/policies/brownout-inbound/doc.md +55 -0
- package/docs/policies/brownout-inbound/intro.md +12 -0
- package/docs/policies/brownout-inbound/schema.json +115 -0
- package/docs/policies/caching-inbound/doc.md +209 -0
- package/docs/policies/caching-inbound/intro.md +23 -0
- package/docs/policies/caching-inbound/schema.json +98 -0
- package/docs/policies/change-method-inbound/schema.json +56 -0
- package/docs/policies/clear-headers-inbound/schema.json +59 -0
- package/docs/policies/clear-headers-outbound/schema.json +59 -0
- package/docs/policies/clerk-jwt-auth-inbound/doc.md +85 -0
- package/docs/policies/clerk-jwt-auth-inbound/intro.md +4 -0
- package/docs/policies/clerk-jwt-auth-inbound/schema.json +68 -0
- package/docs/policies/cognito-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/cognito-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/comet-opik-tracing-inbound/schema.json +65 -0
- package/docs/policies/complex-rate-limit-inbound/doc.md +20 -0
- package/docs/policies/complex-rate-limit-inbound/intro.md +23 -0
- package/docs/policies/complex-rate-limit-inbound/schema.json +142 -0
- package/docs/policies/composite-inbound/doc.md +69 -0
- package/docs/policies/composite-inbound/intro.md +15 -0
- package/docs/policies/composite-inbound/schema.json +59 -0
- package/docs/policies/composite-outbound/intro.md +6 -0
- package/docs/policies/composite-outbound/schema.json +59 -0
- package/docs/policies/curity-phantom-token-inbound/doc.md +109 -0
- package/docs/policies/curity-phantom-token-inbound/intro.md +3 -0
- package/docs/policies/curity-phantom-token-inbound/schema.json +68 -0
- package/docs/policies/custom-code-inbound/doc.md +267 -0
- package/docs/policies/custom-code-inbound/intro.md +2 -0
- package/docs/policies/custom-code-inbound/schema.json +48 -0
- package/docs/policies/custom-code-outbound/doc.md +235 -0
- package/docs/policies/custom-code-outbound/intro.md +2 -0
- package/docs/policies/custom-code-outbound/schema.json +43 -0
- package/docs/policies/firebase-jwt-inbound/intro.md +6 -0
- package/docs/policies/firebase-jwt-inbound/schema.json +68 -0
- package/docs/policies/formdata-to-json-inbound/schema.json +60 -0
- package/docs/policies/galileo-tracing-inbound/schema.json +65 -0
- package/docs/policies/geo-filter-inbound/doc.md +33 -0
- package/docs/policies/geo-filter-inbound/schema.json +108 -0
- package/docs/policies/graphql-complexity-limit-inbound/doc.md +48 -0
- package/docs/policies/graphql-complexity-limit-inbound/intro.md +2 -0
- package/docs/policies/graphql-complexity-limit-inbound/schema.json +90 -0
- package/docs/policies/graphql-disable-introspection-inbound/doc.md +66 -0
- package/docs/policies/graphql-disable-introspection-inbound/intro.md +15 -0
- package/docs/policies/graphql-disable-introspection-inbound/schema.json +48 -0
- package/docs/policies/graphql-introspection-filter-outbound/doc.md +148 -0
- package/docs/policies/graphql-introspection-filter-outbound/schema.json +79 -0
- package/docs/policies/hmac-auth-inbound/doc.md +30 -0
- package/docs/policies/hmac-auth-inbound/intro.md +10 -0
- package/docs/policies/hmac-auth-inbound/policy.ts +70 -0
- package/docs/policies/hmac-auth-inbound/schema.json +53 -0
- package/docs/policies/http-deprecation-outbound/doc.md +73 -0
- package/docs/policies/http-deprecation-outbound/schema.json +83 -0
- package/docs/policies/ip-restriction-inbound/intro.md +8 -0
- package/docs/policies/ip-restriction-inbound/policy.ts +40 -0
- package/docs/policies/ip-restriction-inbound/schema.json +58 -0
- package/docs/policies/jwt-scopes-inbound/schema.json +59 -0
- package/docs/policies/ldap-auth-inbound/schema.json +56 -0
- package/docs/policies/mock-api-inbound/schema.json +72 -0
- package/docs/policies/moesif-inbound/doc.md +44 -0
- package/docs/policies/moesif-inbound/intro.md +6 -0
- package/docs/policies/moesif-inbound/schema.json +68 -0
- package/docs/policies/monetization-inbound/doc.md +87 -0
- package/docs/policies/monetization-inbound/intro.md +6 -0
- package/docs/policies/monetization-inbound/schema.json +102 -0
- package/docs/policies/mtls-auth-inbound/intro.md +6 -0
- package/docs/policies/mtls-auth-inbound/schema.json +68 -0
- package/docs/policies/okta-fga-authz-inbound/doc.md +181 -0
- package/docs/policies/okta-fga-authz-inbound/intro.md +20 -0
- package/docs/policies/okta-fga-authz-inbound/schema.json +104 -0
- package/docs/policies/okta-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/okta-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/open-id-jwt-auth-inbound/doc.md +58 -0
- package/docs/policies/open-id-jwt-auth-inbound/intro.md +30 -0
- package/docs/policies/open-id-jwt-auth-inbound/schema.json +128 -0
- package/docs/policies/openfga-authz-inbound/doc.md +207 -0
- package/docs/policies/openfga-authz-inbound/intro.md +17 -0
- package/docs/policies/openfga-authz-inbound/schema.json +191 -0
- package/docs/policies/openmeter-inbound/doc.md +163 -0
- package/docs/policies/openmeter-inbound/intro.md +18 -0
- package/docs/policies/openmeter-inbound/schema.json +183 -0
- package/docs/policies/prompt-injection-outbound/doc.md +106 -0
- package/docs/policies/prompt-injection-outbound/intro.md +4 -0
- package/docs/policies/prompt-injection-outbound/schema.json +74 -0
- package/docs/policies/propel-auth-jwt-inbound/doc.md +88 -0
- package/docs/policies/propel-auth-jwt-inbound/intro.md +4 -0
- package/docs/policies/propel-auth-jwt-inbound/schema.json +74 -0
- package/docs/policies/query-param-to-header-inbound/doc.md +70 -0
- package/docs/policies/query-param-to-header-inbound/intro.md +5 -0
- package/docs/policies/query-param-to-header-inbound/schema.json +74 -0
- package/docs/policies/quota-inbound/doc.md +235 -0
- package/docs/policies/quota-inbound/intro.md +7 -0
- package/docs/policies/quota-inbound/schema.json +133 -0
- package/docs/policies/rate-limit-inbound/doc.md +78 -0
- package/docs/policies/rate-limit-inbound/intro.md +30 -0
- package/docs/policies/rate-limit-inbound/schema.json +134 -0
- package/docs/policies/rbac-policy-inbound/intro.md +3 -0
- package/docs/policies/rbac-policy-inbound/policy.ts +42 -0
- package/docs/policies/rbac-policy-inbound/schema.json +52 -0
- package/docs/policies/readme-metrics-inbound/doc.md +1 -0
- package/docs/policies/readme-metrics-inbound/intro.md +3 -0
- package/docs/policies/readme-metrics-inbound/schema.json +84 -0
- package/docs/policies/remove-headers-inbound/schema.json +59 -0
- package/docs/policies/remove-headers-outbound/schema.json +59 -0
- package/docs/policies/remove-query-params-inbound/schema.json +59 -0
- package/docs/policies/replace-string-outbound/schema.json +69 -0
- package/docs/policies/request-size-limit-inbound/schema.json +60 -0
- package/docs/policies/request-validation-inbound/doc.md +72 -0
- package/docs/policies/request-validation-inbound/intro.md +24 -0
- package/docs/policies/request-validation-inbound/schema.json +98 -0
- package/docs/policies/require-origin-inbound/intro.md +12 -0
- package/docs/policies/require-origin-inbound/schema.json +65 -0
- package/docs/policies/secret-masking-outbound/doc.md +41 -0
- package/docs/policies/secret-masking-outbound/intro.md +13 -0
- package/docs/policies/secret-masking-outbound/schema.json +65 -0
- package/docs/policies/semantic-cache-inbound/doc.md +63 -0
- package/docs/policies/semantic-cache-inbound/intro.md +4 -0
- package/docs/policies/semantic-cache-inbound/schema.json +179 -0
- package/docs/policies/set-body-inbound/intro.md +7 -0
- package/docs/policies/set-body-inbound/schema.json +56 -0
- package/docs/policies/set-headers-inbound/doc.md +41 -0
- package/docs/policies/set-headers-inbound/intro.md +2 -0
- package/docs/policies/set-headers-inbound/schema.json +83 -0
- package/docs/policies/set-headers-outbound/schema.json +83 -0
- package/docs/policies/set-query-params-inbound/schema.json +83 -0
- package/docs/policies/set-status-outbound/schema.json +62 -0
- package/docs/policies/sleep-inbound/schema.json +56 -0
- package/docs/policies/stripe-webhook-verification-inbound/intro.md +2 -0
- package/docs/policies/stripe-webhook-verification-inbound/schema.json +60 -0
- package/docs/policies/supabase-jwt-auth-inbound/doc.md +29 -0
- package/docs/policies/supabase-jwt-auth-inbound/intro.md +12 -0
- package/docs/policies/supabase-jwt-auth-inbound/schema.json +86 -0
- package/docs/policies/transform-body-inbound/intro.md +8 -0
- package/docs/policies/transform-body-inbound/policy.ts +16 -0
- package/docs/policies/transform-body-inbound/schema.json +27 -0
- package/docs/policies/transform-body-outbound/intro.md +8 -0
- package/docs/policies/transform-body-outbound/policy.ts +19 -0
- package/docs/policies/transform-body-outbound/schema.json +27 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/doc.md +82 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/intro.md +20 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +84 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/intro.md +10 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +68 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/intro.md +2 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +113 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/doc.md +139 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/intro.md +21 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +96 -0
- package/docs/policies/upstream-gcp-jwt-inbound/intro.md +10 -0
- package/docs/policies/upstream-gcp-jwt-inbound/schema.json +62 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/doc.md +132 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/intro.md +25 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +95 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/doc.md +213 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/intro.md +16 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +101 -0
- package/docs/policies/validate-json-schema-inbound/doc.md +129 -0
- package/docs/policies/validate-json-schema-inbound/intro.md +7 -0
- package/docs/policies/validate-json-schema-inbound/schema.json +56 -0
- package/docs/policies/web-bot-auth-inbound/doc.md +104 -0
- package/docs/policies/web-bot-auth-inbound/intro.md +16 -0
- package/docs/policies/web-bot-auth-inbound/schema.json +76 -0
- package/docs/policies/xml-to-json-outbound/doc.md +71 -0
- package/docs/policies/xml-to-json-outbound/intro.md +4 -0
- package/docs/policies/xml-to-json-outbound/schema.json +117 -0
- package/docs/programmable-api/audit-log.mdx +74 -0
- package/docs/programmable-api/background-dispatcher.mdx +124 -0
- package/docs/programmable-api/background-loader.mdx +104 -0
- package/docs/programmable-api/cache.mdx +186 -0
- package/docs/programmable-api/compatibility-dates.mdx +201 -0
- package/docs/programmable-api/console-logging.mdx +48 -0
- package/docs/programmable-api/context-data.mdx +127 -0
- package/docs/programmable-api/custom-cors-policy.mdx +64 -0
- package/docs/programmable-api/environment.mdx +328 -0
- package/docs/programmable-api/hooks.mdx +569 -0
- package/docs/programmable-api/http-problems.mdx +385 -0
- package/docs/programmable-api/jwt-service-plugin.mdx +420 -0
- package/docs/programmable-api/logger.mdx +223 -0
- package/docs/programmable-api/memory-zone-read-through-cache.mdx +96 -0
- package/docs/programmable-api/node-modules.mdx +67 -0
- package/docs/programmable-api/not-found-handler.mdx +47 -0
- package/docs/programmable-api/oauth-protected-resource-plugin.mdx +46 -0
- package/docs/programmable-api/overview.mdx +213 -0
- package/docs/programmable-api/problem-response-formatter.mdx +183 -0
- package/docs/programmable-api/request-user.mdx +289 -0
- package/docs/programmable-api/reusing-code.mdx +26 -0
- package/docs/programmable-api/route-raw.mdx +55 -0
- package/docs/programmable-api/runtime-behaviors.mdx +25 -0
- package/docs/programmable-api/runtime-errors.mdx +246 -0
- package/docs/programmable-api/runtime-extensions.mdx +340 -0
- package/docs/programmable-api/safely-clone-a-request-or-response.mdx +57 -0
- package/docs/programmable-api/streaming-zone-cache.mdx +155 -0
- package/docs/programmable-api/web-crypto-apis.mdx +219 -0
- package/docs/programmable-api/web-standard-apis.mdx +109 -0
- package/docs/programmable-api/zone-cache.mdx +131 -0
- package/docs/programmable-api/zp-body-removed.mdx +32 -0
- package/docs/programmable-api/zuplo-context.mdx +414 -0
- package/docs/programmable-api/zuplo-id-token.mdx +90 -0
- package/docs/programmable-api/zuplo-json.mdx +91 -0
- package/docs/programmable-api/zuplo-request.mdx +200 -0
- package/docs/sample-apis.mdx +78 -0
- package/docs/self-hosted/overview.md +60 -0
- package/package.json +6 -5
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Tunnel Setup & Use
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<EnterpriseFeature name="Secure tunneling" />
|
|
6
|
+
|
|
7
|
+
## Setting up Tunnels
|
|
8
|
+
|
|
9
|
+
A tunnel is a way to expose your _internal services_ to the Zuplo gateway
|
|
10
|
+
without exposing it to the public internet. Your Zuplo Gateway accesses those
|
|
11
|
+
services through the `service://` protocol.
|
|
12
|
+
|
|
13
|
+
The easiest way to deploy your tunnel is using a Docker container. The three
|
|
14
|
+
basic requirements for deploying a secure tunnel with Docker are:
|
|
15
|
+
|
|
16
|
+
1. A tunnel secret that's provided to the Docker container as an environment
|
|
17
|
+
variable named `TUNNEL_TOKEN` (the secret is provided by the Zuplo CLI when
|
|
18
|
+
you create the tunnel. See [creating a tunnel](../cli/tunnel-create.mdx))
|
|
19
|
+
1. The ability for the tunnel service to make an outbound connection to the
|
|
20
|
+
public internet to establish the secure tunnel.
|
|
21
|
+
1. The ability for the tunnel service to make a request to your internal API by
|
|
22
|
+
a DNS address. (for example `https://my-service.local/api`).
|
|
23
|
+
|
|
24
|
+
The tunnel can run anywhere you can deploy a Docker container. Where you deploy
|
|
25
|
+
depends on your specific setup. To run the Docker container on your own
|
|
26
|
+
infrastructure, refer to instructions from your cloud provider or contact
|
|
27
|
+
[Zuplo support](mailto:support@zuplo.com) for assistance.
|
|
28
|
+
|
|
29
|
+
Below are a few option for deploying the tunnel.
|
|
30
|
+
|
|
31
|
+
- [Deploying Docker containers on Azure](https://docs.microsoft.com/en-us/learn/modules/run-docker-with-azure-container-instances/)
|
|
32
|
+
- [Deploying Docker containers on AWS ECS](https://docs.aws.amazon.com/AmazonECS/latest/userguide/getting-started.html)
|
|
33
|
+
- [Deploying container images to GCP](https://cloud.google.com/compute/docs/containers/deploying-containers)
|
|
34
|
+
|
|
35
|
+
The docker container is `zuplo/tunnel` and is available on
|
|
36
|
+
[Docker Hub](https://hub.docker.com/r/zuplo/tunnel).
|
|
37
|
+
|
|
38
|
+
Your running container needs a single environment variable named `TUNNEL_TOKEN`.
|
|
39
|
+
You should store the value as a secret using the recommended means of secret
|
|
40
|
+
storage and environment variable injection for your platform.
|
|
41
|
+
|
|
42
|
+
## Configuring services
|
|
43
|
+
|
|
44
|
+
Once you have created a tunnel, you can
|
|
45
|
+
[configure which services](../cli/tunnel-services-update.mdx) it should expose
|
|
46
|
+
using a configuration file. Below is a sample configuration file. The properties
|
|
47
|
+
in the `services` objects are explained below.
|
|
48
|
+
|
|
49
|
+
- `name` - This is the name of the service that you will use from your Zuplo
|
|
50
|
+
project
|
|
51
|
+
- `endpoint` - This is the local endpoint of your service that you tunnel can
|
|
52
|
+
connect to
|
|
53
|
+
- `configurations` - This object specifies which projects and which environments
|
|
54
|
+
can access this service.
|
|
55
|
+
- `project` - The name of the Zuplo project
|
|
56
|
+
- `accessibleBy` - The environments which can use the tunnel. Valid values are
|
|
57
|
+
`production`, `preview`, and `working-copy`.
|
|
58
|
+
|
|
59
|
+
```json title="tunnel-config.json"
|
|
60
|
+
{
|
|
61
|
+
"version": 1,
|
|
62
|
+
"services": [
|
|
63
|
+
{
|
|
64
|
+
"name": "my-awesome-service-prod",
|
|
65
|
+
"endpoint": "http://localhost:8000",
|
|
66
|
+
"configurations": [
|
|
67
|
+
{
|
|
68
|
+
"project": "my-project",
|
|
69
|
+
"accessibleBy": ["production"]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"project": "my-other-project",
|
|
73
|
+
"accessibleBy": ["production"]
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"name": "my-awesome-service-staging",
|
|
79
|
+
"endpoint": "http://localhost:9000",
|
|
80
|
+
"configurations": [
|
|
81
|
+
{
|
|
82
|
+
"project": "my-project",
|
|
83
|
+
"accessibleBy": ["preview", "working-copy"]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"project": "my-other-project",
|
|
87
|
+
"accessibleBy": ["preview", "working-copy"]
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
zuplo tunnel services update \
|
|
97
|
+
--configuration-file <path-to-your-configuration-file> \
|
|
98
|
+
--tunnel-id <your-tunnel-id>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Using Services Exposed through Tunnels in Code
|
|
102
|
+
|
|
103
|
+
Once set up, the services in the tunnels can be treated like any API host that
|
|
104
|
+
you call from your Zuplo gateway. Each service exposed through tunnels is called
|
|
105
|
+
with the URL schema `service://`, so if your service is named
|
|
106
|
+
`my-awesome-service` you will call it using the URL
|
|
107
|
+
`service://my-awesome-service`.
|
|
108
|
+
|
|
109
|
+
This URL can be used in code as shown below.
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
import { ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
113
|
+
|
|
114
|
+
export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
115
|
+
const response = await fetch("service://my-awesome-service/hello-world");
|
|
116
|
+
if (response.status > 399) {
|
|
117
|
+
return "It didn't work. :(";
|
|
118
|
+
} else {
|
|
119
|
+
return response;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
It's common to have multiple services for each of your internal environments.
|
|
125
|
+
Each service can be restricted so that it's only accessible by specific Zuplo
|
|
126
|
+
environments. For example, you might have two services one for production and
|
|
127
|
+
one for staging.
|
|
128
|
+
|
|
129
|
+
- `service://my-awesome-service-prod` (Production)
|
|
130
|
+
- `service://my-awesome-service-staging` (Staging)
|
|
131
|
+
|
|
132
|
+
## Using Services Exposed through Tunnels in Configuration
|
|
133
|
+
|
|
134
|
+
Services can also be used in routes.oas.json file such as with the URL Rewrite
|
|
135
|
+
handler. To call a tunnel service simply use it as part of the rewrite URL as
|
|
136
|
+
shown in the image below.
|
|
137
|
+
|
|
138
|
+

|
|
139
|
+
|
|
140
|
+
## Service Environment Variables
|
|
141
|
+
|
|
142
|
+
When using these services in your code or configuration, it's often useful to
|
|
143
|
+
store the values as an environment variable. This way you can change which
|
|
144
|
+
environment calls which tunnel without changing code or configuration.
|
|
145
|
+
|
|
146
|
+
For the production environment you would set the `BASE_SERVICE_URL` to the
|
|
147
|
+
production service name. See
|
|
148
|
+
[this document](../articles/environment-variables.mdx) for more about
|
|
149
|
+
[Environment Variables](../articles/environment-variables.mdx)
|
|
150
|
+
|
|
151
|
+
```text
|
|
152
|
+
BASE_SERVICE_URL=service://my-awesome-service-prod
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
And for staging, you would use the staging service name.
|
|
156
|
+
|
|
157
|
+
```text
|
|
158
|
+
BASE_SERVICE_URL=service://my-awesome-service-staging
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
In your handler code or other configuration, the service can be accessed using
|
|
162
|
+
the environment variable.
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
import { ZuploContext, ZuploRequest, environment } from "@zuplo/runtime";
|
|
166
|
+
|
|
167
|
+
export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
168
|
+
const response = await fetch(`${environment.BASE_SERVICE_URL}/hello-world`);
|
|
169
|
+
if (response.status > 399) {
|
|
170
|
+
return "It didn't work. :(";
|
|
171
|
+
} else {
|
|
172
|
+
return response;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Environment variables can also be used in configuration, such as the URL Rewrite
|
|
178
|
+
handler as shown below.
|
|
179
|
+
|
|
180
|
+

|
|
181
|
+
|
|
182
|
+
## Tunnel Upgrades
|
|
183
|
+
|
|
184
|
+
Zuplo publishes a new release of the tunnel Docker image about once per month or
|
|
185
|
+
whenever Cloudflare ships a release to their underlying tunnel tools. The most
|
|
186
|
+
recent version of the Docker Image is always tagged with the `latest` tag. We
|
|
187
|
+
recommend periodically checking and upgrading the tunnel to the latest release
|
|
188
|
+
to ensure you have the latest security and performance updates.
|
|
189
|
+
|
|
190
|
+
We recommend testing each release of the tunnel in a staging environment before
|
|
191
|
+
rolling out to production.
|
|
192
|
+
|
|
193
|
+
## Troubleshooting
|
|
194
|
+
|
|
195
|
+
For troubleshooting see [this document](./tunnel-troubleshooting.mdx).
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Tunnel Troubleshooting
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Setting up a secure tunnel involves configuring several different networks to
|
|
6
|
+
work together. When setting up your tunnel it's common for traffic to initially
|
|
7
|
+
not reach your destination initially. This is almost always caused by
|
|
8
|
+
configurations (firewalls, VPCs, IAM rules, etc.) in your internal network.
|
|
9
|
+
|
|
10
|
+
## Tunnel status
|
|
11
|
+
|
|
12
|
+
As a first step, check if the tunnel is up and running. You can use the
|
|
13
|
+
following CLI command to check the status of the tunnel:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# For brevity, the commands assume that you have exported your API key as an environment variable,
|
|
17
|
+
# export ZUPLO_API_KEY=zpka_d67b7e241bb948758f415b79aa8exxxx_2efbxxxx
|
|
18
|
+
|
|
19
|
+
zuplo tunnel list # Get the list of tunnels
|
|
20
|
+
zuplo tunnel describe --tunnel-id tnl_xxxxxxxxxxx # Narrow it down to the problematic tunnel
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Check the `status` field from the output of `zuplo tunnel describe`. If it's
|
|
24
|
+
"down" that means that your tunnel isn't up. If you are using a Docker
|
|
25
|
+
container, check the container for errors. It takes a few seconds for new
|
|
26
|
+
tunnels to register with the Cloudflare network for the first time.
|
|
27
|
+
|
|
28
|
+
## Tunnel Logging
|
|
29
|
+
|
|
30
|
+
If the tunnel is up (as verified in the previous step) but you aren't seeing any
|
|
31
|
+
traffic, you can inspect the logs to see if there are any network or IAM issues
|
|
32
|
+
that might be blocking a connection.
|
|
33
|
+
|
|
34
|
+
The tunnel by default logs only errors. For the purposes of debugging, it's
|
|
35
|
+
useful to set a more verbose log level. To set logging to a different level,
|
|
36
|
+
simply set the environment variable `TUNNEL_LOGLEVEL` on your Zuplo tunnel
|
|
37
|
+
instance to `debug`. Other log levels available are `info`, `warn`, `error`, and
|
|
38
|
+
`fatal`, but `debug` is recommended for troubleshooting.
|
|
39
|
+
|
|
40
|
+
The way you set an environment variable will vary depending on where you
|
|
41
|
+
deployed the tunnel. If you are using a Docker container, you can set it as the
|
|
42
|
+
environment variables for the container. See your cloud provider's documentation
|
|
43
|
+
for more details.
|
|
44
|
+
|
|
45
|
+
```txt
|
|
46
|
+
TUNNEL_LOGLEVEL=debug
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Once you are done debugging, we recommend resetting the log level to something
|
|
50
|
+
less verbose since the `debug` level can generate a lot of logs.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Automate Zuplo API Updates with GitHub Actions
|
|
3
|
+
sidebar_label: GitHub Action Automation
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- vale Vale.Spelling["Huma"] = NO -->
|
|
7
|
+
|
|
8
|
+
Because Zuplo is OpenAPI native, you can automate the process of updating your
|
|
9
|
+
Zuplo API when a downstream OpenAPI file changes. For example, if you have an
|
|
10
|
+
API built in Go that uses [Huma](https://github.com/danielgtaylor/huma) you can
|
|
11
|
+
easily generate an OpenAPI file for your API. Then using that generated OpenAPI
|
|
12
|
+
file, you can write a script that updates your Zuplo API based on changes in
|
|
13
|
+
your generated file.
|
|
14
|
+
|
|
15
|
+
This example shows a GitHub Action that updates a Zuplo API from an OpenAPI file
|
|
16
|
+
that's generated in your API.
|
|
17
|
+
|
|
18
|
+
You would run this GitHub Action in the repository that contains your downstream
|
|
19
|
+
API. When you push changes to your API, the action will run, generate the
|
|
20
|
+
OpenAPI file. Then it will clone the Zuplo API repository, update the Zuplo
|
|
21
|
+
OpenAPI file, commit and push the changes to a new branch, and open a pull
|
|
22
|
+
request. It will also generate an
|
|
23
|
+
[Action Summary](https://github.blog/2022-05-09-supercharging-github-actions-with-job-summaries/)
|
|
24
|
+
that links to the Pull Request.
|
|
25
|
+
|
|
26
|
+
```yaml
|
|
27
|
+
name: Update Zuplo API
|
|
28
|
+
on:
|
|
29
|
+
push:
|
|
30
|
+
branches:
|
|
31
|
+
- main
|
|
32
|
+
|
|
33
|
+
jobs:
|
|
34
|
+
release:
|
|
35
|
+
name: Update Zuplo from OpenAPI
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
|
|
38
|
+
env:
|
|
39
|
+
REPO_OWNER: my-org
|
|
40
|
+
# the repository with your Zuplo API
|
|
41
|
+
REPO_NAME: my-zuplo-api
|
|
42
|
+
# the branch you want to update
|
|
43
|
+
REPO_BRANCH: main
|
|
44
|
+
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@v4
|
|
47
|
+
with:
|
|
48
|
+
# Override the default token because the built
|
|
49
|
+
# in token can't trigger other workflows
|
|
50
|
+
# https://github.community/t/github-actions-workflow-not-triggering-with-tag-push/17053/2
|
|
51
|
+
token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
|
|
52
|
+
|
|
53
|
+
- uses: actions/checkout@v4
|
|
54
|
+
with:
|
|
55
|
+
repository: ${{ env.REPO_OWNER }}/${{ env.REPO_NAME }}
|
|
56
|
+
path: temp
|
|
57
|
+
ref: ${{ env.REPO_BRANCH }}
|
|
58
|
+
token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
|
|
59
|
+
|
|
60
|
+
- name: Use Node.js
|
|
61
|
+
uses: actions/setup-node@v4
|
|
62
|
+
with:
|
|
63
|
+
node-version: 20.x
|
|
64
|
+
cache: "npm"
|
|
65
|
+
|
|
66
|
+
# Run your build/generate scripts here to generate the OpenAPI file
|
|
67
|
+
- run: GENERATE OPEN API FILE HERE
|
|
68
|
+
|
|
69
|
+
# Run your script to update the Zuplo API from the OpenAPI file
|
|
70
|
+
# NOTE: This script is something you write based on your requirements
|
|
71
|
+
- name: Update the OpenAPI File
|
|
72
|
+
run: node ./scripts/update-zup-from-openapi.mjs
|
|
73
|
+
|
|
74
|
+
- run: git config --global user.email "bot@example.com"
|
|
75
|
+
- run: git config --global user.name "Updater Bot"
|
|
76
|
+
|
|
77
|
+
- name: Commit Changes
|
|
78
|
+
run: |
|
|
79
|
+
git checkout -b "zup_${{ github.action_ref}}"
|
|
80
|
+
git add -A
|
|
81
|
+
git commit -m "Update OpenAPI File From ${{ github.repository }}"
|
|
82
|
+
git push origin head
|
|
83
|
+
|
|
84
|
+
- name: Open a Pull Request
|
|
85
|
+
uses: actions/github-script@v7
|
|
86
|
+
with:
|
|
87
|
+
github-token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
|
|
88
|
+
script: |
|
|
89
|
+
const result = await github.rest.pulls.create({
|
|
90
|
+
title: "Update OpenAPI File From ${{ github.repository }}",
|
|
91
|
+
owner: "${{ env.REPO_OWNER }}",
|
|
92
|
+
repo: "${{ env.REPO_NAME }}",
|
|
93
|
+
head: "zup_${{ github.action_ref}}",
|
|
94
|
+
base: "${{ env.REPO_BRANCH }}",
|
|
95
|
+
body: [
|
|
96
|
+
'This PR is auto-generated by a GitHub Action.',
|
|
97
|
+
'Add more information here.'
|
|
98
|
+
].join('\n')
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Update the Summary
|
|
102
|
+
// You can do a lot more with this, see the core toolkit documentation
|
|
103
|
+
// SEE: https://github.com/actions/toolkit/tree/main/packages/core#populating-job-summary
|
|
104
|
+
await core.summary.addRaw(`GitHub Pull Request Opened. [Pull Request](${result.data.html_url})`, true)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
This script is a starting point. You will need to modify it to fit your needs.
|
|
108
|
+
You might want to add more checks, tests, or other steps to ensure the update is
|
|
109
|
+
correct. You can also add more information to the pull request body to help your
|
|
110
|
+
team understand the changes.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Using the OpenAPI Extension Data in Code
|
|
3
|
+
sidebar_label: "OpenAPI Extension Data"
|
|
4
|
+
description:
|
|
5
|
+
Learn how to add custom vendor-specific extensions to OpenAPI files and access
|
|
6
|
+
that data in your Zuplo API Gateway code.
|
|
7
|
+
tags:
|
|
8
|
+
- openapi
|
|
9
|
+
- custom-code
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
The OpenAPI specification allows for the use of vendor-specific extensions to
|
|
13
|
+
add custom configuration to the API definition. An example of this is the
|
|
14
|
+
`x-internal` extension, which can be used to mark an API as internal and not
|
|
15
|
+
intended for public use.
|
|
16
|
+
|
|
17
|
+
This same type of extensibility can be used to add custom data to the OpenAPI
|
|
18
|
+
file which can then be used inside of your Zuplo API Gateway. This data can be
|
|
19
|
+
used to configure the behavior of the API Gateway, such as setting up rate
|
|
20
|
+
limiting, authentication, or other custom behavior.
|
|
21
|
+
|
|
22
|
+
In this article, we will show you how to use the OpenAPI extension data in your
|
|
23
|
+
code.
|
|
24
|
+
|
|
25
|
+
## Custom Data in the OpenAPI File
|
|
26
|
+
|
|
27
|
+
To add custom data to your OpenAPI file, you can use the `x-` prefix followed by
|
|
28
|
+
the name of the extension. Add this extension to the operation (for example the
|
|
29
|
+
`get`, `post`, etc. section). For example, to add a custom field called
|
|
30
|
+
`my-custom-config` to the OpenAPI file, you would use the following syntax:
|
|
31
|
+
|
|
32
|
+
```json title="config/routes.oas.json"
|
|
33
|
+
{
|
|
34
|
+
"paths": {
|
|
35
|
+
"/hello": {
|
|
36
|
+
"x-zuplo-path": {
|
|
37
|
+
"pathMode": "open-api"
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
"get": {
|
|
41
|
+
"summary": "Hello World",
|
|
42
|
+
"x-my-custom-config": 10,
|
|
43
|
+
"x-zuplo-route": {
|
|
44
|
+
"corsPolicy": "none",
|
|
45
|
+
"handler": {
|
|
46
|
+
"export": "default",
|
|
47
|
+
"module": "$import(./modules/route-data)",
|
|
48
|
+
"options": {}
|
|
49
|
+
},
|
|
50
|
+
"policies": {
|
|
51
|
+
"inbound": []
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"operationId": "8914135b-d7b5-49fc-9e41-a8256a0dcf93"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Using the Custom Data in Code
|
|
62
|
+
|
|
63
|
+
To use the custom data in your code, you can access it through the
|
|
64
|
+
`ZuploContext` object via the `route.raw` method. The `route.raw` method returns
|
|
65
|
+
an object that contains all of the values in the operation.
|
|
66
|
+
|
|
67
|
+
```ts title="modules/route-data.ts"
|
|
68
|
+
import { ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
69
|
+
|
|
70
|
+
export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
71
|
+
const routeData = context.route.raw();
|
|
72
|
+
const myCustomConfig = routeData["x-my-custom-config"];
|
|
73
|
+
|
|
74
|
+
// Logs "Customer config, 10"
|
|
75
|
+
context.log.debug("Custom config", myCustomConfig);
|
|
76
|
+
|
|
77
|
+
return "Hello";
|
|
78
|
+
}
|
|
79
|
+
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Multifactor Authentication
|
|
3
|
+
sidebar_label: Multifactor Auth
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Zuplo supports multifactor authentication (MFA) to help keep your account
|
|
7
|
+
secure. MFA adds an extra layer of security by requiring a second form of
|
|
8
|
+
verification in addition to your password. This can be done using an
|
|
9
|
+
authenticator app or security keys.
|
|
10
|
+
|
|
11
|
+
## Enabling Multifactor Authentication
|
|
12
|
+
|
|
13
|
+
To enable multifactor authentication for your account, follow these steps:
|
|
14
|
+
|
|
15
|
+
<Stepper>
|
|
16
|
+
|
|
17
|
+
1. Go to your user profile by clicking on your avatar in the top right corner of
|
|
18
|
+
the Zuplo Portal and selecting **Profile**.
|
|
19
|
+
1. Find the **Multifactor Authentication** section and click **Enroll** on the
|
|
20
|
+
type of multifactor authentication you want to use.
|
|
21
|
+
1. Follow the instructions to set up your chosen method of multifactor
|
|
22
|
+
authentication.
|
|
23
|
+
1. The next time you log in, you will be prompted to enter your second form of
|
|
24
|
+
verification in addition.
|
|
25
|
+
|
|
26
|
+
</Stepper>
|
|
27
|
+
|
|
28
|
+
## Disabling Multifactor Authentication
|
|
29
|
+
|
|
30
|
+
To disable multifactor authentication for your account, simply navigate to the
|
|
31
|
+
**Multifactor Authentication** section of your user profile and click
|
|
32
|
+
**Disable** next to the multifactor authentication method you want to remove.
|
|
33
|
+
|
|
34
|
+
## Enforcing Multifactor Authentication for Tenant Members
|
|
35
|
+
|
|
36
|
+
If you have MFA enabled and you are an admin of a tenant account, you can
|
|
37
|
+
enforce all members of that account to use multifactor authentication. This adds
|
|
38
|
+
an additional layer of security for your entire organization.
|
|
39
|
+
|
|
40
|
+
### Enabling MFA Enforcement
|
|
41
|
+
|
|
42
|
+
To enforce multifactor authentication for all tenant members:
|
|
43
|
+
|
|
44
|
+
<Stepper>
|
|
45
|
+
|
|
46
|
+
1. Navigate to **Settings** → **Members** in the Zuplo Portal.
|
|
47
|
+
1. Find the **Multi-Factor Authentication** section.
|
|
48
|
+
1. Toggle the enforcement setting to **On**.
|
|
49
|
+
|
|
50
|
+
</Stepper>
|
|
51
|
+
|
|
52
|
+
### What Happens When MFA is Enforced
|
|
53
|
+
|
|
54
|
+
When MFA enforcement is enabled:
|
|
55
|
+
|
|
56
|
+
- All existing tenant members who don't have MFA set up will be redirected to
|
|
57
|
+
the MFA enrollment page when they next log in
|
|
58
|
+
- New members joining the tenant will be required to set up MFA before they can
|
|
59
|
+
access the portal
|
|
60
|
+
- Members can't bypass or skip the MFA setup process
|
|
61
|
+
|
|
62
|
+
Members will need to complete the MFA enrollment process using either an
|
|
63
|
+
authenticator app or security keys before they can continue using the Zuplo
|
|
64
|
+
Portal.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: User Profile
|
|
3
|
+
sidebar_label: Profile
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Your user profile is set automatically by your identity provider when you sign
|
|
7
|
+
in to your Zuplo account. To set your profile picture, name, and email address,
|
|
8
|
+
you must update your profile in your identity provider. Zuplo doesn't control
|
|
9
|
+
this information, and it's not stored in Zuplo.
|
|
10
|
+
|
|
11
|
+
If you are authenticating with a username and password, you won't have a profile
|
|
12
|
+
picture or name. Currently, Zuplo doesn't support setting a profile picture or
|
|
13
|
+
name for accounts that authenticate with a username and password.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Versioning on Zuplo
|
|
3
|
+
sidebar_label: "API Versioning"
|
|
4
|
+
description: >-
|
|
5
|
+
Learn how to version your APIs using URL-based versioning with separate
|
|
6
|
+
OpenAPI files and custom policies on Zuplo.
|
|
7
|
+
tags:
|
|
8
|
+
- openapi
|
|
9
|
+
- custom-code
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
This guide explains how to approach versioning APIs on Zuplo.
|
|
13
|
+
|
|
14
|
+
The recommended versioning approach uses URL-based versioning. Read more at
|
|
15
|
+
[How to version an API](https://zuplo.com/blog/2022/05/17/how-to-version-an-api).
|
|
16
|
+
|
|
17
|
+
## Separate OpenAPI files
|
|
18
|
+
|
|
19
|
+
A best practice is to have separate OpenAPI files for different major versions
|
|
20
|
+
of an API. A single Zuplo project can have as many OpenAPI routing files as
|
|
21
|
+
needed. The default `routes.oas.json` file can be renamed, as shown here:
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
|
|
25
|
+
Note you can create a new OpenAPI file by clicking the '+' icon shown.
|
|
26
|
+
|
|
27
|
+
Each routing file would now have its own routes, each prefixed by `/v1` and
|
|
28
|
+
`/v2`.
|
|
29
|
+
|
|
30
|
+
Also update the `info` properties in the OpenAPI file to include the version.
|
|
31
|
+
This helps users disambiguate versions in the developer portal:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"openapi": "3.1.0",
|
|
36
|
+
"info": {
|
|
37
|
+
"title": "My Api (v2)",
|
|
38
|
+
"version": "2.0.0"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
When Zuplo generates the developer portal, each OpenAPI version appears in its
|
|
44
|
+
own document, allowing users to select the version. This is presented as a
|
|
45
|
+
dropdown:
|
|
46
|
+
|
|
47
|
+

|
|
48
|
+
|
|
49
|
+
## Using Zuplo as a versioning layer
|
|
50
|
+
|
|
51
|
+
Because Zuplo is a programmable gateway it's a powerful tool in your versioning
|
|
52
|
+
arsenal. For example, let's imagine you want to make a breaking change between
|
|
53
|
+
v1 and v2 of your `todos` API where the `todoItems` in v2 won't include a piece
|
|
54
|
+
of information in the previous version.
|
|
55
|
+
|
|
56
|
+
This can be entirely achieved in Zuplo by adding a v2 OpenAPI file and adding an
|
|
57
|
+
identical route from v1 but changing the path:
|
|
58
|
+
|
|
59
|
+
`/v1/todos` ==> `/v2/todos`
|
|
60
|
+
|
|
61
|
+
The only other change you'd need to make to this new version is to add an
|
|
62
|
+
outbound custom policy that removes the property, e.g.
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
export default async function policy(
|
|
66
|
+
response: Response,
|
|
67
|
+
request: ZuploRequest,
|
|
68
|
+
context: ZuploContext,
|
|
69
|
+
options: never,
|
|
70
|
+
policyName: string,
|
|
71
|
+
) {
|
|
72
|
+
if (response.status === 200) {
|
|
73
|
+
const json = await response.json();
|
|
74
|
+
json.forEach((item) => {
|
|
75
|
+
delete item.userId;
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
return new Response(JSON.stringify(json), response);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return response;
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
And QED - your Zuplo gateway is being used to update your old API and make it
|
|
86
|
+
shiny and new.
|
|
87
|
+
|
|
88
|
+
There's a video accompaniment for this document on YouTube here:
|
|
89
|
+
[Versioning an API on Zuplo](https://youtu.be/U0_sfNf5x18)
|