Deployment modes
Control Core ships one universal Bouncer binary. Deployment mode is a topology choice — where you place the PEP on the traffic path — not a separate product SKU.
Recommended first posture: Deploy every new Bouncer in shadow mode first. Observe would-deny telemetry and compliance gaps, then switch to enforce with a single environment variable when ready.
Empty first boot: On a fresh Control Plane with no Bouncers yet, the Control Plane enables shadow posture feature flags automatically (
bouncer_flags.shadow_enforcement_mode,integrity_pilot_mode,compliance_dashboard). The Getting Started wizard Choose mode step confirms Shadow (default) or Full Intercept.
Mode comparison
| Mode | Placement | Best for | Day-1 posture |
|---|---|---|---|
| Shadow | Inline but non-blocking | Recommended starting posture — compliance discovery, risk-free observation | BOUNCER_ENFORCEMENT_MODE=shadow |
| Sidecar | Co-located container in the same pod as the workload | Kubernetes microservices, low-latency co-location | Shadow first, then enforce |
| Reverse proxy | Standalone hop in front of upstream (DNS/VIP/LB target) | Legacy on-prem, VM stacks, monoliths, shared edge | Shadow first, then enforce |
Troubleshooting: If audit shows zero decisions, traffic is bypassing the Bouncer. Confirm clients hit Bouncer
:8080, not the app port directly. See Bouncer placement.
Shadow mode
Shadow mode evaluates every request through the policy engine but always forwards traffic upstream unchanged. Decisions appear as SHADOW_WOULD_ALLOW / SHADOW_WOULD_DENY in audit — ideal for compliance packs and gap reports before enforce.
BOUNCER_ENFORCEMENT_MODE=shadow
BOUNCER_TYPE=reverse-proxy # or sidecar — shadow works with both
How to use
- Deploy Bouncer with shadow env vars (~10 min).
- Route representative traffic through the Bouncer for 24–72 hours.
- Open Compliance & Gaps → select compliance packs.
- Review gap report before upgrade to enforce.
How to review / audit
- Control Plane → Audit Logs — filter
event_typecontainingSHADOW_ - Grafana dashboard
cc-01-shadow-discovery— shadow event rate over time - Export compliance report for evidence packs
Troubleshooting: Shadow events missing? Confirm BOUNCER_ENFORCEMENT_MODE=shadow in running container: docker exec bouncer env | grep ENFORCEMENT. Restart after env change.
Sidecar mode
A sidecar Bouncer runs alongside your application container. Traffic from the app hits 127.0.0.1:8080 (or a shared network namespace) before leaving the pod.
BOUNCER_TYPE=sidecar
TARGET_HOST=127.0.0.1:3000 # your app listen port inside the pod
ENVIRONMENT=sandbox
How to use
- Add the Bouncer container to your pod spec (Helm subchart or manual sidecar).
- Point app egress (or ingress) at
localhost:8080. - Register resource name in Control Plane — Bouncer auto-registers within ~30s.
How to review / audit
- Settings → PEPs — heartbeat and Policy Bridge sync status per sidecar
- Grafana
cc-05-bouncer-fleet— fleet heartbeats and sync lag
Troubleshooting: Sidecar cannot reach Control Plane? Check network policy allows egress to PAP_API_URL. docker exec <sidecar> curl -s $PAP_API_URL/api/v1/health.
Reverse proxy mode
The Bouncer terminates client connections and proxies to TARGET_HOST. Clients swap DNS or load-balancer target to the Bouncer VIP — zero application code change.
BOUNCER_TYPE=reverse-proxy
TARGET_HOST=my-api.internal:8080
ORIGINAL_HOST_URL=https://api.yourcompany.com
How to use
- Deploy Bouncer with reverse-proxy type (~15 min).
- Update DNS or LB backend to Bouncer
:8080. - Verify upstream health:
curl -s http://localhost:8080/health | jq .status
How to review / audit
- Send test traffic — confirm decisions in Audit Logs
- Compare shadow vs enforce counts before cutover
Troubleshooting: 502 from Bouncer? Upstream unreachable — verify TARGET_HOST resolves inside Bouncer network namespace.
eBPF mode (roadmap — not shipped)
Kernel-level attachment via eBPF is on the product roadmap for high-throughput L4 observation. It is not available in current releases. Do not configure eBPF flags in production — use shadow, sidecar, or reverse proxy instead.
When eBPF ships, it will complement (not replace) Bouncer Bouncer intercept/Bouncer intercept for L7 control decisions. Track release notes for availability.
Auto-registration
Every mode registers the Bouncer with the Control Plane on startup:
- Bouncer POSTs to
/peps/registerwithBOUNCER_ID, environment, and resource metadata. - Control Plane creates or rebinds the Protected Resource row (~30s typical).
- Policy Bridge pushes the sandbox bundle to the new PEP.
Verify:
curl -s -H "Authorization: Bearer <token>" "$PAP_API_URL/health/bouncers" | jq '.bouncers[] | {id, status, last_heartbeat}'
Next steps: Quick deploy · Bouncer placement · Shadow discovery