Skip to content

Server Configuration

Gabor Galazzo edited this page Jul 25, 2026 · 1 revision

Server Configuration

Everything below is real configuration from evento-server/src/main/resources/application.properties and BusProperties. Spring's relaxed binding applies, so evento.server.bus.port can equally be set as the environment variable evento_server_bus_port.


1. Ports

Port Property Purpose
3000 server.port HTTP — GUI and REST API
3030 evento.server.bus.port Netty message bus — where bundles connect

2. Message bus — evento.server.bus.*

Bound by the BusProperties record (@ConfigurationProperties(prefix = "evento.server.bus")). The bus is opt-in: evento.server.bus.enabled=true (the shipped application.properties sets it).

Property Default Notes
enabled (set to true in the shipped config) Master switch
port 3030 Bus listen port
server-instance-id server-<random UUID> Blank/absent generates one
correlation-check-interval 1s Expiry sweep for pending correlations
shutdown-deadline 30s Bounded graceful stop
heartbeat-write-idle 15s Send a Ping after this much write idle
heartbeat-read-idle 45s Close the channel after this much read idle
connect-timeout 5s
max-frame-length 16 MB Per-chunk memory, not a message size limit — see Wire Protocol § 3
write-buffer-high-water-mark 1 MB Channel transitions to DEGRADED above this
write-buffer-low-water-mark 256 KB Must be strictly less than the high mark, or startup throws
business-executor-core-size max(8, cores × 2)
business-executor-max-size cores × 8 Clamped up to at least the core size
business-executor-queue-capacity 256 Do not enlarge to absorb load — see Throughput and Capacity
business-executor-keep-alive 90s
business-executor-saturation-warn-interval 10s Rate-limits the saturation WARN line
auth-token (empty) Empty accepts all bundles; set a shared secret to require it

3. Event store — evento.es.*

Property Default Purpose
evento.es.mode APES in code, CPES in the shipped properties Event store mode
evento.es.fetch.concurrency 4 Fair semaphore in EventStoreRequestHandlerBridge
evento.es.fetch.delay 69 ms between fetch cycles
evento.es.aggregate.state.cache.size 1024 Snapshot cache entries
evento.es.aggregate.state.cache.expiry 150000 ms
evento.es.aggregate.events.cache.size 1024 Event cache entries
evento.es.aggregate.events.cache.expiry 150000 ms

evento.es.fetch.concurrency is very likely the binding constraint on a consumer-heavy cluster. It is a fair semaphore, so no amount of bus threads raises it. It is deliberately left at 4: it guards heap against concurrent EventFetchRequest result sets, and the OOM it was added for is real. Raise it against measured headroom, not on principle.


4. Database

spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/evento}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME:postgres}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:secret}
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.sql.init.mode=always

Hikari keepalive/timeout settings ship as spring.datasource.hikari.data-source-properties.{tcpKeepAlive,loginTimeout,connectTimeout,socketTimeout}.


5. Authentication

Two independent surfaces:

# GUI + REST (HTTP Basic)
spring.security.user.name=${SPRING_SECURITY_USER_NAME:evento}
spring.security.user.password=${SPRING_SECURITY_USER_PASSWORD:secret}
spring.security.user.roles=WEB,ADMIN

# Wire-level bundle auth — blank accepts all bundles (dev only)
evento.server.bus.auth-token=${EVENTO_SERVER_BUS_AUTH_TOKEN:}

Both default to development-grade values. secret as a password and a blank bundle auth token are fine on a laptop and unacceptable anywhere else. See Security Model.


6. Telemetry and other settings

Property Shipped value Purpose
evento.cluster.name evento-server Cluster display name
evento.performance.capture.rate 1 (compose file uses 0.1) Fraction of invocations sampled
evento.telemetry.ttl 365 Retention, days
spring.servlet.multipart.max-file-size 200MB
spring.mvc.async.request-timeout 3000000

Actuator exposure:

management.endpoints.web.exposure.include=health,info,prometheus,metrics
management.endpoint.health.probes.enabled=true
management.endpoint.health.show-details=when_authorized
management.health.livenessstate.enabled=true
management.health.readinessstate.enabled=true

7. Docker image

Published as eventoframework/evento-server on Docker Hub. The image is a two-stage build on digest-pinned eclipse-temurin:25 (JDK to build, JRE to run), exposing 3000 and 3030:

FROM eclipse-temurin:25-jdk-noble@sha256:29d2d8af… AS build
WORKDIR /evento
COPY . .
RUN chmod +x gradlew && ./gradlew :evento-server:bootJar --no-daemon

FROM eclipse-temurin:25-jre-noble@sha256:b27ca476…
EXPOSE 3000
EXPOSE 3030
RUN mkdir /app
COPY --from=build /evento/evento-server/build/libs/*.jar /app/spring-boot-application.jar
ENTRYPOINT ["java","-jar","/app/spring-boot-application.jar"]

Compose files in the repository:

Path What it runs
docker/evento-docker-compose/docker-compose.yaml Server + Postgres — the normal way to run Evento
docker/evento-local/docker-compose.yaml Postgres only, for running the server from an IDE

8. Deployment shape

The framework does not manage instance lifecycle. There is no deploy-by-upload, no /spawn or /kill, and no autoscaling protocol — all of that was removed in 2.0. The server emits performance metrics; your orchestrator (k8s, Nomad) owns scaling and restarts. See Migrating from v1.


See also

Clone this wiki locally