blob: 4dc519115957bf4bd6059c9b07a5d07cd11131da [file]
import type { FC } from 'react';
import React from 'react';
import Head from '@docusaurus/Head';
import Link from '@docusaurus/Link';
import Translate from '@docusaurus/Translate';
import '../../css/landing-sections/integrations.scss';
interface Integration {
name: string;
/** Plugin name whose brand-colored icon lives in the shared plugin sprite. */
icon?: string;
/** Colored logo served from /img/integrations/ (for non-plugin ecosystem logos). */
logo?: string;
/** Doc link. Falls back to the plugin doc derived from `icon`. */
href?: string;
}
const GROUPS: { title: string; items: Integration[] }[] = [
{
title: 'Observability & tracing',
items: [
{ name: 'Prometheus', icon: 'prometheus' },
{ name: 'Grafana', logo: '/img/integrations/grafana.svg', href: '/docs/apisix/plugins/prometheus/' },
{ name: 'Datadog', icon: 'datadog' },
{ name: 'OpenTelemetry', logo: '/img/integrations/opentelemetry.svg', href: '/docs/apisix/plugins/opentelemetry/' },
{ name: 'Apache SkyWalking', icon: 'skywalking' },
{ name: 'Zipkin', icon: 'zipkin' },
],
},
{
title: 'Logging & data',
items: [
{ name: 'Elasticsearch', logo: '/img/integrations/elasticsearch.svg', href: '/docs/apisix/plugins/elasticsearch-logger/' },
{ name: 'ClickHouse', logo: '/img/integrations/clickhouse.svg', href: '/docs/apisix/plugins/clickhouse-logger/' },
{ name: 'Google Cloud', icon: 'google-cloud-logging' },
],
},
{
title: 'Streaming & protocols',
items: [
{ name: 'Apache Kafka', icon: 'kafka-logger' },
{ name: 'gRPC', icon: 'grpc-transcode' },
],
},
{
title: 'Service discovery & runtime',
items: [
{ name: 'Kubernetes', logo: '/img/integrations/kubernetes.svg', href: '/docs/apisix/discovery/kubernetes/' },
{ name: 'Consul', logo: '/img/integrations/consul.svg', href: '/docs/apisix/discovery/consul/' },
{ name: 'NGINX', logo: '/img/integrations/nginx.svg', href: '/docs/apisix/architecture-design/apisix/' },
{ name: 'Redis', logo: '/img/integrations/redis.svg', href: '/docs/apisix/plugins/limit-count/' },
],
},
{
title: 'Security & secrets',
items: [
{ name: 'OpenID Connect', icon: 'openid-connect' },
{ name: 'Keycloak', icon: 'authz-keycloak' },
{ name: 'Casbin', icon: 'authz-casbin' },
{ name: 'HashiCorp Vault', logo: '/img/integrations/vault.svg', href: '/docs/apisix/terminology/secret/' },
],
},
{
title: 'AI & LLM providers',
items: [
{ name: 'OpenAI', href: '/docs/apisix/plugins/ai-proxy/' },
{ name: 'Anthropic', href: '/docs/apisix/plugins/ai-proxy/' },
{ name: 'AWS Bedrock', href: '/docs/apisix/plugins/ai-proxy/' },
{ name: 'DeepSeek', href: '/docs/apisix/plugins/ai-proxy/' },
{ name: 'Ollama', href: '/docs/apisix/plugins/ai-proxy/' },
],
},
];
const IntegrationTile: FC<{ item: Integration }> = ({ item }) => {
const href = item.href ?? (item.icon ? `/docs/apisix/plugins/${item.icon}/` : undefined);
const inner = (
<>
{item.logo ? (
<img className="integrations__img" src={item.logo} alt={item.name} loading="lazy" width={30} height={30} />
) : item.icon ? (
<svg className="integrations__icon" aria-hidden="true">
<use xlinkHref={`#icon${item.icon}`} />
</svg>
) : null}
<span className="integrations__name">{item.name}</span>
</>
);
return href ? (
<Link className="integrations__tile" to={href} title={item.name}>
{inner}
</Link>
) : (
<div className="integrations__tile" title={item.name}>
{inner}
</div>
);
};
const Integrations: FC = () => (
<section className="integrations" aria-labelledby="integrations-heading">
<Head>
{/* Injects the shared plugin icon sprite used by #icon<name> references. */}
<script src="/js/plugin-icon.js" defer />
</Head>
<h2 id="integrations-heading" className="integrations__heading">
<Translate id="home.integrations.title">Integrates with your stack</Translate>
</h2>
<p className="integrations__subtitle">
<Translate id="home.integrations.subtitle">
Connect APISIX to your observability, security, service discovery, and AI tools through 100+ plugins.
</Translate>
</p>
<div className="integrations__groups">
{GROUPS.map((group) => (
<div className="integrations__group" key={group.title}>
<div className="integrations__group-title">{group.title}</div>
<div className="integrations__tiles">
{group.items.map((item) => (
<IntegrationTile item={item} key={item.name} />
))}
</div>
</div>
))}
</div>
<Link className="integrations__cta" to="/plugins/">
<Translate id="home.integrations.cta">Explore all 100+ plugins</Translate>
{' →'}
</Link>
</section>
);
export default Integrations;