diff --git a/crowdsec-docs/sidebarsUnversioned.ts b/crowdsec-docs/sidebarsUnversioned.ts
index a5bc414c5..dda1bad55 100644
--- a/crowdsec-docs/sidebarsUnversioned.ts
+++ b/crowdsec-docs/sidebarsUnversioned.ts
@@ -637,13 +637,13 @@ const sidebarsUnversionedConfig: SidebarConfig = {
},
{
type: "doc",
- label: "AWS WAF",
- id: "bouncers/aws_waf",
+ label: "Apache",
+ id: "bouncers/apache_bouncer",
},
{
type: "doc",
- label: "Apache",
- id: "bouncers/apache_bouncer",
+ label: "AWS WAF",
+ id: "bouncers/aws_waf",
},
{
type: "doc",
@@ -675,21 +675,11 @@ const sidebarsUnversionedConfig: SidebarConfig = {
label: "Firewall",
id: "bouncers/firewall",
},
- {
- type: "doc",
- label: "HAProxy",
- id: "bouncers/haproxy",
- },
{
type: "doc",
label: "HAProxy SPOA",
id: "bouncers/haproxy_spoa",
},
- {
- type: "doc",
- label: "Ingress Nginx",
- id: "bouncers/ingress-nginx",
- },
{
type: "doc",
label: "Magento 2",
@@ -720,6 +710,11 @@ const sidebarsUnversionedConfig: SidebarConfig = {
label: "PHP Library",
id: "bouncers/php-lib",
},
+ {
+ type: "doc",
+ label: "Traefik (Kubernetes)",
+ id: "bouncers/traefik",
+ },
{
type: "doc",
label: "Windows Firewall",
@@ -731,20 +726,47 @@ const sidebarsUnversionedConfig: SidebarConfig = {
id: "bouncers/wordpress",
},
{
- type: "doc",
- label: "Traefik (Kubernetes)",
- id: "bouncers/traefik",
+ type: "html",
+ value: "
",
+ defaultStyle: false,
+ },
+ // ── More ──────────────────────────────────────────────────────────
+ {
+ type: "html",
+ value: "More",
+ defaultStyle: false,
},
{
type: "link",
label: "Third Party",
- href: "https://hub.crowdsec.net/browse/#bouncers",
+ href: "https://app.crowdsec.net/hub/remediation-components",
+ },
+ {
+ type: "link",
+ label: "Contributing",
+ href: "/docs/next/contributing/contributing_bouncers",
+ },
+ {
+ type: "html",
+ value: "
",
+ defaultStyle: false,
+ },
+ // ── Deprecated ──────────────────────────────────────────────────────────
+ {
+ type: "html",
+ value: "Deprecated",
+ defaultStyle: false,
+ },
+ {
+ type: "doc",
+ label: "HAProxy",
+ id: "bouncers/haproxy",
+ },
+ {
+ type: "doc",
+ label: "Ingress Nginx",
+ id: "bouncers/ingress-nginx",
},
- // {
- // "type": "doc",
- // "label": "Contributing",
- // "id": "bouncers/contributing/contributing_bouncers"
- // },
],
blocklistsSideBar: [
{
diff --git a/crowdsec-docs/src/components/bouncer-header.tsx b/crowdsec-docs/src/components/bouncer-header.tsx
new file mode 100644
index 000000000..0a9757e4d
--- /dev/null
+++ b/crowdsec-docs/src/components/bouncer-header.tsx
@@ -0,0 +1,288 @@
+import useBaseUrl from "@docusaurus/useBaseUrl";
+import React from "react";
+
+type FeatureKey = "waf" | "challenge" | "mtls" | "metrics" | "prometheus" | "livemode" | "streammode";
+type BadgeKey = "waf" | "mtls" | "metrics" | "prometheus" | "updatemode" | "challenge";
+
+type BouncerHeaderProps = {
+ title: string;
+ imgSrc: string;
+ description: string;
+ /**
+ * Comma-separated list of supported features (case-insensitive).
+ * Known keys: waf, challenge, mtls, metrics, prometheus, livemode, streammode
+ * Features absent from this string are shown as unsupported.
+ * livemode / streammode are merged into a single "Update Mode" chip.
+ * Example: featuresSupport="waf, mtls, livemode, streammode"
+ */
+ featuresSupport?: string;
+ /** GitHub repository URL. */
+ githubUrl?: string;
+ /** CrowdSec Hub page URL. */
+ hubUrl?: string;
+ /** Muted label shown next to the title. Defaults to "". */
+ typeLabel?: string;
+};
+
+// ---------------------------------------------------------------------------
+// Feature catalogue
+// ---------------------------------------------------------------------------
+
+const BADGE_ORDER: BadgeKey[] = ["updatemode", "waf", "challenge", "metrics", "mtls", "prometheus"];
+
+const BADGE_LABELS: Record = {
+ updatemode: "Update Mode",
+ waf: "WAF",
+ challenge: "Challenge",
+ metrics: "Remediation Metrics",
+ mtls: "mTLS",
+ prometheus: "Prometheus",
+};
+
+const BADGE_TOOLTIPS: Record = {
+ updatemode: "Decision polling mode(s) supported by this bouncer",
+ waf: "Has WAF capabilities",
+ challenge: "Can present challenges to users as an alternative to blocking",
+ metrics: "Send detailed metrics about remediations. Visible in cscli and CrowdSec Console",
+ mtls: "Can do mutual TLS authentication to LAPI",
+ prometheus: "Can expose metrics to Prometheus",
+};
+
+// ---------------------------------------------------------------------------
+// Parsing
+// ---------------------------------------------------------------------------
+
+function parseFeatures(featuresSupport: string | undefined): Set {
+ const set = new Set();
+ if (!featuresSupport) return set;
+ const valid = new Set(["waf", "challenge", "mtls", "metrics", "prometheus", "livemode", "streammode"]);
+ for (const token of featuresSupport.split(",")) {
+ const key = token.trim().toLowerCase() as FeatureKey;
+ if (valid.has(key)) set.add(key);
+ }
+ return set;
+}
+
+function updateModeLabel(features: Set): string | null {
+ const parts: string[] = [];
+ if (features.has("livemode")) parts.push("Live");
+ if (features.has("streammode")) parts.push("Stream");
+ return parts.length ? parts.join(" | ") : null;
+}
+
+// ---------------------------------------------------------------------------
+// Styles
+// ---------------------------------------------------------------------------
+
+const styles = {
+ root: {
+ display: "flex",
+ alignItems: "flex-start",
+ gap: "14px",
+ padding: "14px 0",
+ borderBottom: "1px solid var(--ifm-color-emphasis-200)",
+ marginBottom: "1.5rem",
+ },
+ logo: {
+ flexShrink: 0,
+ width: 90,
+ height: 90,
+ borderRadius: 8,
+ border: "1px solid var(--ifm-color-emphasis-200)",
+ background: "var(--ifm-background-surface-color)",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ overflow: "hidden",
+ },
+ logoImg: {
+ width: 90,
+ height: 90,
+ objectFit: "contain" as const,
+ },
+ body: {
+ display: "flex",
+ flexDirection: "column" as const,
+ gap: 5,
+ minWidth: 0,
+ flex: 1,
+ },
+ titleRow: {
+ display: "flex",
+ alignItems: "baseline",
+ gap: 8,
+ flexWrap: "wrap" as const,
+ },
+ title: {
+ fontSize: "2.25rem",
+ fontWeight: 600,
+ lineHeight: 1.2,
+ margin: 0,
+ },
+ typeLabel: {
+ fontSize: "0.72rem",
+ fontWeight: 500,
+ color: "var(--ifm-color-emphasis-600)",
+ letterSpacing: "0.02em",
+ whiteSpace: "nowrap" as const,
+ },
+ description: {
+ fontSize: "0.84rem",
+ color: "var(--ifm-color-emphasis-700)",
+ lineHeight: 1.5,
+ margin: 0,
+ },
+ strip: {
+ display: "flex",
+ flexWrap: "wrap" as const,
+ alignItems: "center",
+ gap: "0 16px",
+ rowGap: 6,
+ fontSize: "0.78rem",
+ lineHeight: 1,
+ margin: 0,
+ padding: 0,
+ listStyle: "none",
+ },
+ divider: {
+ display: "inline-block",
+ width: 1,
+ height: 12,
+ background: "var(--ifm-color-emphasis-300)",
+ verticalAlign: "middle",
+ flexShrink: 0,
+ },
+ link: {
+ color: "var(--ifm-color-emphasis-600)",
+ textDecoration: "none",
+ fontWeight: 500,
+ },
+} satisfies Record;
+
+// ---------------------------------------------------------------------------
+// Chip
+// ---------------------------------------------------------------------------
+
+type ChipVariant = "supported" | "unsupported" | "mode";
+
+const GLYPH: Record = {
+ supported: "✓",
+ unsupported: "×",
+ mode: "●",
+};
+
+const GLYPH_COLOR: Record = {
+ supported: "var(--ifm-color-success)",
+ unsupported: "var(--ifm-color-emphasis-300)",
+ mode: "var(--ifm-color-info)",
+};
+
+const LABEL_COLOR: Record = {
+ supported: "var(--ifm-font-color-base)",
+ unsupported: "var(--ifm-color-emphasis-300)",
+ mode: "var(--ifm-font-color-base)",
+};
+
+function Chip({ variant, label, title }: { variant: ChipVariant; label: string; title: string }) {
+ return (
+
+
+ {GLYPH[variant]}
+
+ {label}
+
+ );
+}
+
+// ---------------------------------------------------------------------------
+// Main component
+// ---------------------------------------------------------------------------
+
+const PLACEHOLDER_GITHUB = "https://github.com/orgs/crowdsecurity/repositories";
+
+export default function BouncerHeader({
+ title,
+ imgSrc,
+ description,
+ featuresSupport,
+ githubUrl,
+ hubUrl,
+ typeLabel = "",
+}: Readonly): React.JSX.Element {
+ const resolvedImg = useBaseUrl(imgSrc);
+ const features = parseFeatures(featuresSupport);
+ const modeLabel = updateModeLabel(features);
+
+ return (
+
+ {/* Logo */}
+
+

+
+
+
+ {/* Title row */}
+
+ {title}
+ {typeLabel}
+
+
+ {/* Description */}
+
{description}
+
+ {/* Badges */}
+
+ {BADGE_ORDER.map((badge) => {
+ if (badge === "updatemode") {
+ return (
+
+
+ -
+
+
+
+ );
+ }
+ return (
+
+ );
+ })}
+ {/* Divider + links */}
+ -
+
+
+ -
+
+ GitHub
+
+ {hubUrl && (
+ <>
+ ·
+
+ Hub
+
+ >
+ )}
+
+
+
+
+ );
+}
diff --git a/crowdsec-docs/src/components/remediation-support-badge.tsx b/crowdsec-docs/src/components/remediation-support-badge.tsx
deleted file mode 100644
index e3f122615..000000000
--- a/crowdsec-docs/src/components/remediation-support-badge.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import { ToolTipArrow, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@site/src/ui/tooltip";
-import { clsx } from "clsx";
-import React from "react";
-
-type RemediationSupportBadgesProps = {
- Prometheus: boolean; // Prometheus is a boolean that controls the color of the Prometheus bubble
- MTLS: boolean; // MTLS is a boolean that controls the color of the MTLS bubble
- Mode: boolean; // Mode is a boolean that controls the color of the Mode bubble
- Metrics: boolean; // Metrics is a boolean that controls the color of the Metrics bubble
- Appsec?: boolean; // Appsec is a boolean that controls the color of the AppSec bubble
-};
-
-const RemediationSupportBadge = ({ title, description, support }: { title: string; description: string; support: string }) => {
- const isSupported = support !== "Unsupported";
- const statusClasses = isSupported ? "bg-emerald-700 dark:bg-emerald-600 text-white" : "bg-red-700 dark:bg-red-500 text-white";
-
- return (
-
-
-
-
- {title}
- {support}
-
-
-
- {description}
-
-
-
-
- );
-};
-
-export default function RemediationSupportBadges({
- MTLS,
- Metrics,
- Prometheus,
- Mode,
- Appsec,
-}: Readonly): React.JSX.Element {
- const mtlsSupport = MTLS ? "Supported" : "Unsupported";
- const metricsSupport = Metrics ? "Supported" : "Unsupported";
- const prometheusSupport = Prometheus ? "Supported" : "Unsupported";
- const modeSupport = Mode ? "Live & Stream" : "Stream only";
- const appsecSupport = Appsec !== undefined && Appsec ? "Supported" : "Unsupported";
-
- return (
-
- {Appsec !== undefined && (
-
- )}
-
-
-
-
-
- );
-}
diff --git a/crowdsec-docs/static/img/bouncer/magento/crowdsec_magento_bouncer.png b/crowdsec-docs/static/img/bouncer/magento/crowdsec_magento_bouncer.png
index 31d2f4ba4..0dc719f2e 100644
Binary files a/crowdsec-docs/static/img/bouncer/magento/crowdsec_magento_bouncer.png and b/crowdsec-docs/static/img/bouncer/magento/crowdsec_magento_bouncer.png differ
diff --git a/crowdsec-docs/static/img/crowdsec_cloudfare.svg b/crowdsec-docs/static/img/crowdsec_cloudflare.svg
similarity index 100%
rename from crowdsec-docs/static/img/crowdsec_cloudfare.svg
rename to crowdsec-docs/static/img/crowdsec_cloudflare.svg
diff --git a/crowdsec-docs/static/img/crowdsec_wp.png b/crowdsec-docs/static/img/crowdsec_wp.png
index 40700a263..48e0f447d 100644
Binary files a/crowdsec-docs/static/img/crowdsec_wp.png and b/crowdsec-docs/static/img/crowdsec_wp.png differ
diff --git a/crowdsec-docs/unversioned/bouncers/apache.mdx b/crowdsec-docs/unversioned/bouncers/apache.mdx
index 00df4e136..bbcd6e91e 100644
--- a/crowdsec-docs/unversioned/bouncers/apache.mdx
+++ b/crowdsec-docs/unversioned/bouncers/apache.mdx
@@ -1,33 +1,23 @@
---
id: apache_bouncer
-title: Apache
+title: "Apache IP Blocking with CrowdSec"
sidebar_position: 2
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-import useBaseUrl from "@docusaurus/useBaseUrl";
-
-
-
-
-
-
-
-
-
- 📚 Documentation
- 💠 Hub
- 💬 Discourse
-
-
-A Remediation Component for Apache.
+import BouncerHeader from "@site/src/components/bouncer-header";
+
+
+
+# Protect Apache with CrowdSec IP Blocking
:::warning
diff --git a/crowdsec-docs/unversioned/bouncers/aws-waf.mdx b/crowdsec-docs/unversioned/bouncers/aws-waf.mdx
index 7c981c931..448998783 100644
--- a/crowdsec-docs/unversioned/bouncers/aws-waf.mdx
+++ b/crowdsec-docs/unversioned/bouncers/aws-waf.mdx
@@ -1,32 +1,22 @@
---
id: aws_waf
-title: AWS WAF
+title: "AWS WAF IP Blocking with CrowdSec"
sidebar_position: 1
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-import useBaseUrl from "@docusaurus/useBaseUrl";
-import RemediationSupportBadges from "@site/src/components/remediation-support-badge";
-
-
-
-
-
-
- 📚 Documentation
- 💠 Hub
- 💬 Discourse
-
-
-
-
+import BouncerHeader from "@site/src/components/bouncer-header";
+
+
+# Block Malicious IPs on AWS WAF with CrowdSec
## Overview
The `crowdsec-awf-waf-bouncer` automatically adds rules to an AWS WAF ACL and manages IPSets content to apply decisions taken by crowdsec.
diff --git a/crowdsec-docs/unversioned/bouncers/blocklist-mirror.mdx b/crowdsec-docs/unversioned/bouncers/blocklist-mirror.mdx
index 400026f60..666a0bc26 100644
--- a/crowdsec-docs/unversioned/bouncers/blocklist-mirror.mdx
+++ b/crowdsec-docs/unversioned/bouncers/blocklist-mirror.mdx
@@ -1,38 +1,27 @@
---
id: blocklist-mirror
-title: Blocklist mirror
+title: "CrowdSec Blocklist Mirror — HTTP Blocklist Endpoint"
sidebar_position: 7
---
+import useBaseUrl from "@docusaurus/useBaseUrl"
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
-
-
})
-
-
-
-

-

-
-
-
-
-
+# Expose CrowdSec Decisions as an HTTP Blocklist
This Remediation Component exposes CrowdSec's active decisions via provided HTTP(S) endpoints in pre-defined formats. It can be used by network appliances which support consumption of blocklists via HTTP.
-
## Installation from repositories
[Setup crowdsec repositories](/u/getting_started/installation/linux#repository-installation).
diff --git a/crowdsec-docs/unversioned/bouncers/cloudflare-deprecated.mdx b/crowdsec-docs/unversioned/bouncers/cloudflare-deprecated.mdx
index 01ceb7129..9fe10f25d 100644
--- a/crowdsec-docs/unversioned/bouncers/cloudflare-deprecated.mdx
+++ b/crowdsec-docs/unversioned/bouncers/cloudflare-deprecated.mdx
@@ -6,8 +6,7 @@ title: Cloudflare DEPRECATED BOUNCER
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
+import BouncerHeader from "@site/src/components/bouncer-header";
@@ -18,15 +17,12 @@ import RemediationSupportBadges from '@site/src/components/remediation-support-b
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
-
-
:::danger
diff --git a/crowdsec-docs/unversioned/bouncers/cloudflare.mdx b/crowdsec-docs/unversioned/bouncers/cloudflare.mdx
index 3c788044a..3947ba902 100644
--- a/crowdsec-docs/unversioned/bouncers/cloudflare.mdx
+++ b/crowdsec-docs/unversioned/bouncers/cloudflare.mdx
@@ -1,28 +1,24 @@
---
id: cloudflare
-title: CrowdSec Cloudflare Worker Bouncer
+title: "Cloudflare IP Blocking with CrowdSec"
toc_max_heading_level: 3
---
+import useBaseUrl from "@docusaurus/useBaseUrl"
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
+import BouncerHeader from "@site/src/components/bouncer-header";
-
-
-
+
-
-
-
-
-
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
+# Block Malicious IPs on Cloudflare with CrowdSec
:::tip
We recommend using the **Self-Hosted Installer** setup method for most users who want to connect a CrowdSec [Blocklist Integration Endpoint](/u/integrations/remediationcomponent) to Cloudflare without installing anything on their infrastructure. It is simpler to install and maintain.
@@ -125,7 +121,7 @@ Each configured zone must have at least one `A` or `AAAA` DNS record. Zones with
---
-## Self-Hosted Setup
+## 🔌 Self-Hosted Setup
The self-hosted setup uses a Cloudflare github integration to deploy a worker acting as the central install and configuration GUI for the Cloudflare bouncer elements.
@@ -256,7 +252,7 @@ git push --force origin main
---
-## CLI Bouncer Setup
+## 🔧 CLI Bouncer Setup
The CLI bouncer is a Go binary (`crowdsec-cloudflare-worker-bouncer`) that manages Cloudflare infrastructure from the command line using a YAML configuration file.
@@ -511,7 +507,7 @@ sudo crowdsec-cloudflare-worker-bouncer -d
---
-## Setting Up the Worker Route Fail Mode
+## ⚙️ Setting Up the Worker Route Fail Mode
Worker routes are created with **Fail Closed** mode by default. In this mode, any worker error results in a Cloudflare 1027 error page shown to visitors — including errors caused by plan quota overruns.
diff --git a/crowdsec-docs/unversioned/bouncers/custom.mdx b/crowdsec-docs/unversioned/bouncers/custom.mdx
index fe4ccbacc..f2a41937b 100644
--- a/crowdsec-docs/unversioned/bouncers/custom.mdx
+++ b/crowdsec-docs/unversioned/bouncers/custom.mdx
@@ -1,32 +1,24 @@
---
id: custom
-title: Custom
+title: "CrowdSec Custom Remediation — Run Your Own Scripts"
sidebar_position: 5
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
-
-
-
-
-
-
-
-
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
-
-
+# Feed CrowdSec Decisions to Custom Scripts
+
CrowdSec Remediation Component written to invoke custom scripts.
The crowdsec-custom-bouncer will periodically fetch new, expired and removed decisions from the CrowdSec Local API and will pass them as arguments to a custom user script.
diff --git a/crowdsec-docs/unversioned/bouncers/envoy.mdx b/crowdsec-docs/unversioned/bouncers/envoy.mdx
index 4b82e6a6f..37c199dc7 100644
--- a/crowdsec-docs/unversioned/bouncers/envoy.mdx
+++ b/crowdsec-docs/unversioned/bouncers/envoy.mdx
@@ -1,22 +1,22 @@
---
id: envoy
-title: QuickStart - Envoy Gateway (Kubernetes)
+title: "Envoy Gateway IP Blocking & WAF with CrowdSec"
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-import RemediationSupportBadges from "@site/src/components/remediation-support-badge";
+import BouncerHeader from "@site/src/components/bouncer-header";
-
- 📚 Documentation
- 💠{" "}
- Source
- 💬 Discourse
-
+
-
-
-# CrowdSec Remediation QuickStart for Envoy Gateway
+# Protect Envoy Gateway with CrowdSec IP Blocking & WAF
## Objectives
@@ -31,8 +31,8 @@ At the end, you will have:
- `SecurityPolicy` resources attached to your `HTTPRoute` objects
- CrowdSec remediation decisions enforced before traffic reaches your backends
-:::tip AppSec Support
-This bouncer supports the [AppSec Component](/docs/next/appsec/intro) for
+:::tip WAF Support
+This bouncer supports [WAF capabilities](/docs/next/appsec/intro) for
real-time WAF protection.
This page focuses on remediation-only deployment. If you want Envoy Gateway
@@ -449,4 +449,4 @@ your platform is not supported, you will need a custom build.
- Review the upstream configuration guide:
[docs/CONFIGURATION.md](https://github.com/kdwils/envoy-proxy-crowdsec-bouncer/blob/main/docs/CONFIGURATION.md)
- If you want WAF and virtual patching instead of remediation only, follow the
- [AppSec QuickStart for Envoy Gateway](/docs/next/appsec/quickstart/envoy-gateway)
+ [WAF QuickStart for Envoy Gateway](/docs/next/appsec/quickstart/envoy-gateway)
diff --git a/crowdsec-docs/unversioned/bouncers/fastly.mdx b/crowdsec-docs/unversioned/bouncers/fastly.mdx
index 4d95eeb63..bac1f2a06 100644
--- a/crowdsec-docs/unversioned/bouncers/fastly.mdx
+++ b/crowdsec-docs/unversioned/bouncers/fastly.mdx
@@ -1,35 +1,24 @@
---
id: fastly
-title: Fastly
+title: "Fastly IP Blocking with CrowdSec"
---
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
+import BouncerHeader from "@site/src/components/bouncer-header";
-
-
-
-
-
-
-
-
-
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
-
-
-# Fastly bouncer
+# Block Malicious IPs on Fastly with CrowdSec
A Remediation Component that syncs the decisions made by CrowdSec with Fastly's VCL. Manages multi account, multi service setup. Supports IP, Range, Country and AS scoped decisions.
To learn how to set up crowdsec to consume Fastly logs see [this](/u/user_guides/consuming_fastly_logs)
-
## Installation
### Using pip
diff --git a/crowdsec-docs/unversioned/bouncers/firewall.mdx b/crowdsec-docs/unversioned/bouncers/firewall.mdx
index 20cdbaced..5393c3c62 100644
--- a/crowdsec-docs/unversioned/bouncers/firewall.mdx
+++ b/crowdsec-docs/unversioned/bouncers/firewall.mdx
@@ -1,38 +1,28 @@
---
id: firewall
-title: Firewall
+title: "Linux Firewall IP Blocking with CrowdSec"
sidebar_position: 1
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
-
-
-
-
-
-
-
-
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
-
-
+# Block Malicious IPs with CrowdSec at the Firewall Level
+
CrowdSec Remediation Component written in golang for firewalls.
:::info When to Choose a Different Bouncer
-The firewall bouncer is ideal for protecting **infrastructure services** like SSH, databases, and SMTP. If you are protecting a **web application**, consider using an WAF-capable bouncer instead: [Nginx](/bouncers/nginx.mdx), [OpenResty](/bouncers/openresty.mdx), [Traefik](/bouncers/traefik.mdx), or [HAProxy SPOA](/bouncers/haproxy_spoa.mdx). These provide real-time HTTP inspection, virtual patching, and WAF capabilities that a firewall bouncer cannot offer. [Learn more about AppSec](/docs/next/appsec/intro).
+The firewall bouncer is ideal for protecting **infrastructure services** like SSH, databases, and SMTP. If you are protecting a **web application**, consider using an WAF-capable bouncer instead: [Nginx](/bouncers/nginx.mdx), [OpenResty](/bouncers/openresty.mdx), [Traefik](/bouncers/traefik.mdx), or [HAProxy SPOA](/bouncers/haproxy_spoa.mdx). These provide real-time HTTP inspection, virtual patching, and WAF capabilities that a firewall bouncer cannot offer. [Learn more about WAF](/docs/next/appsec/intro).
For maximum protection on web-facing servers, you can run **both** a firewall bouncer (for IP-level blocking) and an WAF-capable bouncer (for HTTP-level inspection) side by side.
:::
diff --git a/crowdsec-docs/unversioned/bouncers/haproxy.mdx b/crowdsec-docs/unversioned/bouncers/haproxy.mdx
index 010fce011..c703878f1 100644
--- a/crowdsec-docs/unversioned/bouncers/haproxy.mdx
+++ b/crowdsec-docs/unversioned/bouncers/haproxy.mdx
@@ -1,31 +1,20 @@
---
id: haproxy
-title: HAProxy
+title: "HAProxy IP Blocking with CrowdSec"
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
-
-
-
-
-
-
-
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
-
-
-
+# Protect HAProxy with CrowdSec IP Blocking
:::danger
This bouncer isn't actively supported anymore.
diff --git a/crowdsec-docs/unversioned/bouncers/haproxy_spoa.mdx b/crowdsec-docs/unversioned/bouncers/haproxy_spoa.mdx
index 584c9f474..08fe92be6 100644
--- a/crowdsec-docs/unversioned/bouncers/haproxy_spoa.mdx
+++ b/crowdsec-docs/unversioned/bouncers/haproxy_spoa.mdx
@@ -1,35 +1,22 @@
---
id: haproxy_spoa
-title: HAProxy SPOA
+title: "HAProxy IP Blocking & WAF with CrowdSec"
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-import useBaseUrl from "@docusaurus/useBaseUrl";
-import RemediationSupportBadges from "@site/src/components/remediation-support-badge";
-
-
-
-
-
-
-
-
-
- 📚 Documentation
- 💠 Hub
- 💬 Discourse
-
-
-
-
-# A remediation component for HAProxy
+import BouncerHeader from "@site/src/components/bouncer-header";
+
+
+
+# Protect HAProxy with IP Blocking & WAF
:::warning
@@ -38,9 +25,9 @@ Beta Remediation Component, please report any issues on GitHub
:::
:::tip Enable the WAF for optimal protection
-This is the **only HAProxy bouncer with AppSec support**. After installing the bouncer, enable the [AppSec (WAF) Component](/docs/next/appsec/intro) for real-time WAF protection, virtual patching, and defense against known CVEs.
+This is the **only HAProxy bouncer with WAF (AppSec) support**. After installing the bouncer, enable the [WAF (AppSec) Component](/docs/next/appsec/intro) for real-time WAF protection, virtual patching, and defense against known CVEs.
-Follow the dedicated [AppSec Quickstart for HAProxy](/docs/next/appsec/quickstart/haproxy_spoa) — it picks up right where this page ends.
+Follow the dedicated [WAF Quickstart for HAProxy](/docs/next/appsec/quickstart/haproxy_spoa) — it picks up right where this page ends.
:::
## What it does
@@ -62,7 +49,7 @@ Supported features:
- Ban remediation (custom HTML / redirects)
- CAPTCHA remediation (hCaptcha / reCAPTCHA / Turnstile)
- GeoIP headers (ASN / Country)
-- AppSec (WAF evaluation via CrowdSec AppSec)
+- WAF (WAF evaluation via CrowdSec AppSec)
- Prometheus metrics
## Installation
diff --git a/crowdsec-docs/unversioned/bouncers/ingress-nginx.mdx b/crowdsec-docs/unversioned/bouncers/ingress-nginx.mdx
index ee1e953ce..4dea21f1d 100644
--- a/crowdsec-docs/unversioned/bouncers/ingress-nginx.mdx
+++ b/crowdsec-docs/unversioned/bouncers/ingress-nginx.mdx
@@ -1,34 +1,23 @@
---
id: ingress-nginx
-title: Ingress Nginx
+title: "Ingress Nginx (Deprecated)"
sidebar_position: 1
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-import useBaseUrl from "@docusaurus/useBaseUrl";
-import RemediationSupportBadges from "@site/src/components/remediation-support-badge";
-
-
-
-
-
-
-
-
-
- 📚 Documentation
- 💠 Hub
- 💬 Discourse
-
-
-
+import BouncerHeader from "@site/src/components/bouncer-header";
+
+
+
+# CrowdSec Integration for Ingress NGINX (Deprecated)
:::danger Deprecated and not recommended
This CrowdSec integration for `ingress-nginx` is being deprecated. `ingress-nginx`
diff --git a/crowdsec-docs/unversioned/bouncers/intro.md b/crowdsec-docs/unversioned/bouncers/intro.md
index 2d2876dad..eed667230 100644
--- a/crowdsec-docs/unversioned/bouncers/intro.md
+++ b/crowdsec-docs/unversioned/bouncers/intro.md
@@ -1,10 +1,11 @@
---
id: intro
-title: Introduction
+title: CrowdSec Remediation Components (aka Bouncers)
+sidebar_label: Presentation
sidebar_position: 1
---
-# Remediation Components
+# Remediation Components - aka Bouncers
:::info
You may see Remediation Components referred to as "bouncers" in the documentation and/or within cscli commands.
diff --git a/crowdsec-docs/unversioned/bouncers/magento.mdx b/crowdsec-docs/unversioned/bouncers/magento.mdx
index 2db828b77..756e3cbef 100644
--- a/crowdsec-docs/unversioned/bouncers/magento.mdx
+++ b/crowdsec-docs/unversioned/bouncers/magento.mdx
@@ -1,28 +1,23 @@
---
id: magento
-title: Magento 2
+title: "Magento 2 IP Blocking & CAPTCHA with CrowdSec"
sidebar_position: 1
---
+import useBaseUrl from "@docusaurus/useBaseUrl"
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
-
-
-
-
-
-💠 Hub
-💬 Discourse
-
-
-
-
+# Protect Magento 2 Stores with CrowdSec IP Blocking & CAPTCHA
## Introduction
The `CrowdSec Bouncer` extension for Magento 2 has been designed to protect Magento 2 websites from all kinds of attacks by using [CrowdSec](https://www.crowdsec.net/) technology.
diff --git a/crowdsec-docs/unversioned/bouncers/misp-feed-generator.mdx b/crowdsec-docs/unversioned/bouncers/misp-feed-generator.mdx
index ae58bc5c9..84337d819 100644
--- a/crowdsec-docs/unversioned/bouncers/misp-feed-generator.mdx
+++ b/crowdsec-docs/unversioned/bouncers/misp-feed-generator.mdx
@@ -1,34 +1,24 @@
---
id: misp-feed-generator
-title: MISP Feed Generator
+title: "CrowdSec MISP Feed Generator"
sidebar_position: 7
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
-
-
-
-
-
-
-
-
-
-
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
-
-
-
+# Generate a MISP Feed from CrowdSec Decisions
+
This Remediation Component generates MISP Feed from CrowdSec decisions. It exposes this Feed over HTTP/S.
This can be used to feed CrowdSec decisions to MISP using the "Feeds" functionality of MISP.
diff --git a/crowdsec-docs/unversioned/bouncers/nginx.mdx b/crowdsec-docs/unversioned/bouncers/nginx.mdx
index b2db62174..746cd98a2 100644
--- a/crowdsec-docs/unversioned/bouncers/nginx.mdx
+++ b/crowdsec-docs/unversioned/bouncers/nginx.mdx
@@ -1,34 +1,23 @@
---
id: nginx
-title: Nginx
+title: "NGINX IP Blocking, CAPTCHA & WAF with CrowdSec"
sidebar_position: 1
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-import useBaseUrl from "@docusaurus/useBaseUrl";
-import RemediationSupportBadges from "@site/src/components/remediation-support-badge";
-
-
-
-
-
-
-
-
-
- 📚 Documentation
- 💠 Hub
- 💬 Discourse
-
-
-
+import BouncerHeader from "@site/src/components/bouncer-header";
+
+
+
+# Protect NGINX with IP Blocking, CAPTCHA & WAF
A lua Remediation Component for nginx.
diff --git a/crowdsec-docs/unversioned/bouncers/openresty.mdx b/crowdsec-docs/unversioned/bouncers/openresty.mdx
index 97f36481f..af34e29cd 100644
--- a/crowdsec-docs/unversioned/bouncers/openresty.mdx
+++ b/crowdsec-docs/unversioned/bouncers/openresty.mdx
@@ -1,34 +1,23 @@
---
id: openresty
-title: OpenResty
+title: "OpenResty IP Blocking, CAPTCHA & WAF with CrowdSec"
sidebar_position: 1
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-import useBaseUrl from "@docusaurus/useBaseUrl";
-import RemediationSupportBadges from "@site/src/components/remediation-support-badge";
-
-
-
-
-
-
-
-
-
- 📚 Documentation
- 💠 Hub
- 💬 Discourse
-
-
-
+import BouncerHeader from "@site/src/components/bouncer-header";
+
+
+
+# Protect OpenResty with IP Blocking, CAPTCHA & WAF
A lua Remediation Component for OpenResty.
diff --git a/crowdsec-docs/unversioned/bouncers/php-lib.mdx b/crowdsec-docs/unversioned/bouncers/php-lib.mdx
index aa9d2440f..0f3158318 100644
--- a/crowdsec-docs/unversioned/bouncers/php-lib.mdx
+++ b/crowdsec-docs/unversioned/bouncers/php-lib.mdx
@@ -1,31 +1,23 @@
---
id: php-lib
-title: PHP Remediation Library
+title: "PHP Remediation Library — Build CrowdSec Bouncers"
sidebar_position: 1
---
+import useBaseUrl from "@docusaurus/useBaseUrl"
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
-
-
-
-
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
-
-
+# Build PHP Applications Protected by CrowdSec
## Overview
This library allows you to create CrowdSec bouncers for PHP applications or frameworks like e-commerce, blog or other exposed applications.
diff --git a/crowdsec-docs/unversioned/bouncers/php.mdx b/crowdsec-docs/unversioned/bouncers/php.mdx
index 288d75721..7d5d7a57a 100644
--- a/crowdsec-docs/unversioned/bouncers/php.mdx
+++ b/crowdsec-docs/unversioned/bouncers/php.mdx
@@ -1,31 +1,24 @@
---
id: php
-title: PHP Standalone
+title: "PHP IP Blocking, CAPTCHA & WAF with CrowdSec"
sidebar_position: 1
---
+import useBaseUrl from "@docusaurus/useBaseUrl"
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
-
-
-
-
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
-
-
+# Protect PHP Applications with IP Blocking, CAPTCHA & WAF
## Overview
This Remediation Component allows you to protect your PHP application from IPs that have been detected by CrowdSec. Depending on
diff --git a/crowdsec-docs/unversioned/bouncers/stormshield.mdx b/crowdsec-docs/unversioned/bouncers/stormshield.mdx
index e4b843f69..ff5644400 100644
--- a/crowdsec-docs/unversioned/bouncers/stormshield.mdx
+++ b/crowdsec-docs/unversioned/bouncers/stormshield.mdx
@@ -1,22 +1,22 @@
---
id: stormshield
-title: Stormshield
+title: "Stormshield IP Blocking with CrowdSec"
---
+import useBaseUrl from "@docusaurus/useBaseUrl"
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
+import BouncerHeader from "@site/src/components/bouncer-header";
-
-
-
-
-
-📚 Documentation
-💠 Hub
-💬 Discourse
-
+
+# Sync CrowdSec IP Bans to Stormshield Appliances
## Overview
The Stormshield Remediation syncs IP bans from Crowdsec with Stormshield appliances.
diff --git a/crowdsec-docs/unversioned/bouncers/traefik.mdx b/crowdsec-docs/unversioned/bouncers/traefik.mdx
index 2df926624..c87ff33b9 100644
--- a/crowdsec-docs/unversioned/bouncers/traefik.mdx
+++ b/crowdsec-docs/unversioned/bouncers/traefik.mdx
@@ -1,37 +1,24 @@
---
id: traefik
-title: Traefik (Kubernetes)
+title: "Traefik IP Blocking & WAF with CrowdSec"
sidebar_position: 5
---
+import useBaseUrl from "@docusaurus/useBaseUrl"
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-import useBaseUrl from "@docusaurus/useBaseUrl";
-import RemediationSupportBadges from "@site/src/components/remediation-support-badge";
-
-
-
-
-
-
-
-
-
- 📚 Documentation
- 💠{" "}
-
- Source
-
- 💬 Discourse
-
-
-
+import BouncerHeader from "@site/src/components/bouncer-header";
+
+
+
+# Protect Traefik with CrowdSec IP Blocking & WAF
:::tip AppSec Support
This bouncer supports the [AppSec Component](/docs/next/appsec/intro) for
diff --git a/crowdsec-docs/unversioned/bouncers/windows-firewall.mdx b/crowdsec-docs/unversioned/bouncers/windows-firewall.mdx
index 87990c98d..7b4d5fd02 100644
--- a/crowdsec-docs/unversioned/bouncers/windows-firewall.mdx
+++ b/crowdsec-docs/unversioned/bouncers/windows-firewall.mdx
@@ -1,30 +1,23 @@
---
id: windows_firewall
-title: Windows Firewall
+title: "Windows Firewall IP Blocking with CrowdSec"
---
+import useBaseUrl from "@docusaurus/useBaseUrl"
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-import useBaseUrl from "@docusaurus/useBaseUrl";
-import RemediationSupportBadges from "@site/src/components/remediation-support-badge";
-
-
-
-
-
-
- 📚 Documentation
- 💠 Hub
- 💬 Discourse
-
-
-
+import BouncerHeader from "@site/src/components/bouncer-header";
+
+
+
+# Block Malicious IPs on Windows Firewall with CrowdSec
## Overview
diff --git a/crowdsec-docs/unversioned/bouncers/wordpress.mdx b/crowdsec-docs/unversioned/bouncers/wordpress.mdx
index c973961cb..af876d465 100644
--- a/crowdsec-docs/unversioned/bouncers/wordpress.mdx
+++ b/crowdsec-docs/unversioned/bouncers/wordpress.mdx
@@ -1,24 +1,24 @@
---
id: wordpress
-title: WordPress Plugin
+title: "WordPress IP Blocking, CAPTCHA & WAF with CrowdSec"
---
+import useBaseUrl from "@docusaurus/useBaseUrl"
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import RemediationSupportBadges from '@site/src/components/remediation-support-badge';
-
-
-
-
-
-
+# Protect WordPress with IP Blocking, CAPTCHA & WAF
+
## What can you do with this plugin?
The CrowdSec WordPress plugin enables you to protect your WordPress site against malicious traffic using CrowdSec's advanced threat detection and blocklist capabilities.
In this documentation, you'll find detailed instructions for these main use cases: