Ready-to-adapt deployment examples and operational guidance for Schema Registry Proxy (SRP). For the full list of configuration options, see the Schema Registry Proxy environment variables reference.
All deployments require a Conduktor Scale or Gateway license in CDK_LICENSE and an explicit AUTH_PROVIDER — SRP refuses to start without either.
Production deployment with full security
Reactive authorization (permissions managed in Console), JWT client authentication, HTTPS to clients, SASL/SSL to Kafka and mTLS to the backend registry. For the Self-service resources that authorize subjects for a service account, see grant schema permissions with an ApplicationInstance.
Standalone deployment with topic ACL authorization
No Console and no Conduktor-specific Kafka topics: SRP authorizes against the topic ACLs already defined in your Kafka cluster, through the same Kafka connection settings. The authenticated identity (here, the JWT claim) has to match the Kafka ACL principal name.
In this mode Read requires a READ ACL on the subject’s topic and Write requires WRITE (ALL matches either). Write does not imply Read: a producer principal that also fetches schemas needs READ or ALL.
Grant access with regular Kafka ACLs — nothing Conduktor-specific is involved. For example, to let the orders-app service account register and fetch schemas for every subject whose topic starts with orders:
Both LITERAL and PREFIXED patterns apply, and a matching DENY always wins. The grant takes effect within the ACL cache TTL (500ms by default) — a producer that was getting 403 switches to successful schema registrations without a proxy restart.
Standalone read-only deployment with Basic authentication
The smallest possible deployment: just the proxy, a mounted credentials file and the backend registry. Every authenticated read passes through; every write is rejected with 403. No Kafka connection and no OAuth provider are needed.
The credentials file holds bcrypt-hashed passwords and is hot-reloaded on change, so you can rotate credentials without a restart:
Mount choice decides whether live reload survives your editor. Bind-mounting the single file (as above) binds the container to that file’s inode: only in-place writes (cat > file, tee, Ansible copy and most CD tooling) are seen. Editors like vim, VS Code and IntelliJ, plus sed -i, mv and git checkout, replace the file with a new inode — the container keeps reading the copy it started with, and nothing after that reaches the proxy until a restart rebinds it. Mounting the parent directory instead (- ./conf:/etc/srp:ro) re-resolves the filename on every read and survives any editor, at the cost of exposing everything else in that directory to the proxy.
Generate a hash with htpasswd (from Apache httpd, also available as a container image):
Verify the behavior split: a super user may register a schema, while every other authenticated user can read but not write:
Multi-node deployment
For high availability deployments with multiple SRP instances:
Security configurations
Example: Confluent Cloud integration
Example: Keycloak integration
Monitoring and operations
Health checks
- Health check:
GET http://host:${PORT}/health, on the API port (PORT, default 8080; SSL_SECURE_PORT when HTTPS is enabled)
- Prometheus metrics:
GET http://host:${OTEL_PROMETHEUS_PORT}/metrics
Logging
Structured JSON logging with configurable levels:
Distributed tracing
When configured with OpenTelemetry, the service automatically creates spans for:
- HTTP requests (parent spans)
- Backend Schema Registry calls (child spans)
- Kafka operations (consuming permissions, publishing heartbeats)
- Authentication/authorization operations
Useful links