The security boundary
Alginte ships with no authentication by default — reachability is the access control. Two defaults implement that boundary:server.address=localhost— a plainjava -jarserves only the local machine.- A trimmed actuator surface — only
/actuator/health,/actuator/info, and/actuator/metricsare exposed; heap dumps, env, loggers, and the rest are not.
--server.address=0.0.0.0, or the SERVER_ADDRESS env var) — or
publishing the container’s port, which is the same moment in Docker form — is when
you take ownership of the boundary: anyone who can reach the port has full control
of every connected Kafka cluster unless the login is enabled.
For network exposure, put a reverse proxy in front (TLS termination, network
allow-listing) and enable a login. If you use OIDC behind the proxy, forward the
standard X-Forwarded-* headers and set server.forward-headers-strategy=framework —
details in OIDC provider setup.
The Docker image bakes in
SERVER_ADDRESS=0.0.0.0 — a loopback-bound process inside
a container would be unreachable through published ports. The container network and
your proxy provide the boundary instead.Configuring a container
Three ways, in increasing order of ceremony:-
Plain environment variables (covers most cases) — Spring relaxed binding maps
env vars onto any property (naming rules in Configuration):
-
A Spring profile —
-e SPRING_PROFILES_ACTIVE=<name>activates a profile. Environment variables always win over profile values, so you can activate a profile for its bulk settings and still override individual hosts with env vars. -
Bring your own properties file — mount it into
/app/config/(Spring Boot’s default config location relative to the image’s workdir) and activate it:This is the recommended route for configuration too long for env vars — for example a full OIDC provider block.
JAVA_OPTS is the JVM tuning hook; the JDK’s container-aware memory ergonomics are
the default, so most deployments need nothing there.
What the image provides
- Non-root: runs as a dedicated system user (uid 1001).
- Health check built in: the container reports health via
/actuator/health(60-second start period) — orchestrators anddocker pssee it without extra config. - Layered image: dependencies and application code live in separate layers, so pulling an upgraded tag downloads only the small application layer.
- Fail-fast startup: an unreachable broker stops the container with a clear message rather than a half-alive UI (see Run with Docker for the networking pitfalls and the escape hatch).