Configuring the Editor service
Editor is a component of seatmap.pro.
It is an application built with Spring Boot.
The Editor configuration consists of two files:
- application.yaml - general system settings
- application-seatmap.yaml - application-specific settings
Runtime and upgrades from 1.74
The editor frontend image runs Node and serves the editor core next to the static files. Use the image entrypoint in custom installations and /healthz for frontend readiness and liveness. The core service answers at /core on the frontend web port (PORT, default 8081) and requires a valid editor token from every caller. Editor-service signs each of its calls with a short-lived token from its private key and reaches the core at seatmap.services.core.url. The default, http://127.0.0.1:8081/, is the frontend container of the same Helm pod; when they run outside one pod, for example as separate Docker Compose services, set it to the frontend’s address, and on different hosts keep their clocks synchronized. Keep the metrics listener (CORE_METRICS_PORT, default 9091) internal. Static file hosting alone does not supply the core service.
Keep the configured RSA signing keys consistent between backend and frontend. The Helm chart uses the existing <release>-rsa Secret with private-key and public-key entries and mounts the frontend public key read-only at /keys/public-key. Custom frontend installations mount the matching public key there, or point CORE_PUBLIC_KEY_FILE at it. Without it, the frontend logs an error at startup and /core refuses every call; a file that does not hold a readable public key stops the frontend at startup.
From 1.75.0, editor-service validates the configured RSA pair at startup and logs the public-key SHA-256 fingerprint. Supply both settings below and give the frontend the matching public key. Helm and the Docker Compose bundle already supply the pair. Replacing it signs every user out once. External keys of at least 2048 bits are required from 1.76.0.
| Helm value | Default | Purpose |
|---|---|---|
editor.frontend.coreWorkers |
1 |
Number of core workers. Increase frontend CPU and memory when raising it. |
editor.frontend.jobTimeoutMs |
20000 |
Core job deadline in milliseconds. |
editor.frontend.drainTimeoutMs |
15000 |
Shutdown drain deadline in milliseconds. |
editor.terminationGracePeriodSeconds |
30 |
Pod termination grace in seconds. |
These values accept positive whole numbers up to 2147483647. Omitted or null values use the defaults. The termination grace must exceed the drain deadline by at least five seconds. The chart derives the backend core read timeout from the job deadline plus five seconds, rounded down to whole seconds. Frontend resource limits use global.resources.frontend.
Outside Helm, set CORE_WORKERS, CORE_JOB_TIMEOUT_MS, and CORE_DRAIN_TIMEOUT_MS, and align the backend core read timeout. With no CORE_WORKERS, the runtime can choose the worker count automatically; Helm fixes the default to one.
On Docker Compose, the two editor containers run as ordinary services. Set editor-service’s SEATMAP_SERVICES_CORE_URL to the frontend service on the Compose network, such as http://editor-client:8081/. Mount the matching public key at /keys/public-key in the frontend container, and give both editor containers a stop grace period of 30 seconds, because the Compose default of 10 seconds is shorter than the 15-second drain deadline. The Docker Compose bundle for 1.74 sets this up, generates a signing key pair for each installation, and includes an upgrade guide for existing Compose installations.
For a 1.74 upgrade, move editor-service and the editor frontend to 1.74 together; editor-service applies migrations V121–V127 before the new booking-service starts. Upgrade booking-service as soon as the migrations complete, because the earlier version cannot read events once V121 has run. Review duplicate confirmed references per event before V122. Check the release deployment guide for the migration preflight, service order, and layout compatibility limits.
application.yaml
Delay settings
Delay before starting the jobs after the system is started.
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| initial | INITIAL_DELAY | Delay in milliseconds | 5000 (five seconds) |
Java Spring framework properties
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| spring.profiles.include | SPRING_PROFILES_INCLUDE | Whether to add the properties from another profile | seatmap |
| spring.jpa.generate-ddl | SPRING_JPA_GENERATE_DDL | Whether to enable DDL generation | true |
| spring.jpa.properties.hibernate.jdbc.batch_size | SPRING_JPA_PROPERTIES_HIBERNATE_JDBC_BATCH_SIZE | Number of INSERT, UPDATE, and DELETE statements to be set in a single database call | 50 |
| spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults | SPRING_JPA_PROPERTIES_HIBERNATE_TEMP_USE_JDBC_METADATA_DEFAULTS | Whether to consult the JDBC metadata to determine certain settings default values when the database may not be available | false |
| spring.jpa.properties.hibernate.order_inserts | SPRING_JPA_PROPERTIES_HIBERNATE_ORDER_INSERTS | Whether to order SQL inserts by the primary key value of the items being inserted | false |
| spring.jpa.properties.javax.persistence.schema-generation.create-source | SPRING_JPA_PROPERTIES_JAVAX_PERSISTENCE_SCHEMA_GENERATION_CREATE_SOURCE | Whether to generate the schema DDL commands | metadata |
| spring.jpa.properties.javax.persistence.schema-generation.scripts.action | SPRING_JPA_PROPERTIES_JAVAX_PERSISTENCE_SCHEMA_GENERATION_SCRIPTS_ACTION | Whether to create or update the database schema | update |
| spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target | SPRING_JPA_PROPERTIES_JAVAX_PERSISTENCE_SCHEMA_GENERATION_SCRIPTS_CREATE_TARGET | File name for script generation | ddl_jpa_creation.sql |
| spring.jpa.hibernate.ddl-auto | SPRING_JPA_HIBERNATE_DDL_AUTO | How to initialize the database | update |
| spring.jpa.hibernate.use-new-id-generator-mappings | SPRING_JPA_HIBERNATE_USE_NEW_ID_GENERATOR_MAPPINGS | Whether to generate identifier values based on an sequence-style database structure | true |
| spring.jpa.database-platform | SPRING_JPA_DATABASE_PLATFORM | Used database | org.hibernate.dialect.PostgreSQLDialect |
| spring.jpa.open-in-view | SPRING_JPA_OPEN_IN_VIEW | Whether to enable OSIV | false |
| spring.jackson.mapper.DEFAULT_VIEW_INCLUSION | SPRING_JACKSON_MAPPER_DEFAULT_VIEW_INCLUSION | Whether to include non-annotated properties in all views | true |
| spring.flyway.baseline-on-migrate | SPRING_FLYWAY_BASELINE_ON_MIGRATE | Whether to automatically call baseline when migrate is executed against a non-empty schema with no schema history table | ’true' |
| spring.flyway.user | SPRING_FLYWAY_USER | User that applies the database migrations at startup | Same as spring.datasource.username |
| spring.flyway.password | SPRING_FLYWAY_PASSWORD | Password of the migration user | Same as spring.datasource.password |
| spring.flyway.placeholders.approles | SPRING_FLYWAY_PLACEHOLDERS_APPROLES | Comma-separated roles the services connect as, if not the migration user. Each start grants them table access | (empty) |
| spring.datasource.hikari.data-source-properties.reWriteBatchedInserts | SPRING_DATASOURCE_HIKARI_DATA_SOURCE_PROPERTIES_REWRITEBATCHEDINSERTS | Whether to rewrite regular insert statements into multi-value ones for batched inserts | true |
| spring.datasource.hikari.maximum-pool-size | SPRING_DATASOURCE_HIKARI_MAXIMUM_POOL_SIZE | Maximum pool size | 20 |
| spring.datasource.hikari.connection-timeout | SPRING_DATASOURCE_HIKARI_CONNECTION_TIMEOUT | Connection timeout | 60000 |
| spring.datasource.driver-class-name | SPRING_DATASOURCE_DRIVER_CLASS_NAME | JDBC driver for communicating with the database | org.postgresql.Driver |
| spring.datasource.password | SPRING_DATASOURCE_PASSWORD | Password for connecting to the database | ${DB_PASSWORD:postgres} |
| spring.datasource.username | SPRING_DATASOURCE_USERNAME | Username for connecting to the database | ${DB_USERNAME:seatmap} |
| spring.datasource.url | SPRING_DATASOURCE_URL | Database location | ${DB_URL:jdbc:postgresql://localhost:15432/seatmap} |
| spring.servlet.multipart.enabled | SPRING_SERVLET_MULTIPART_ENABLED | Whether to enable support of multipart uploads | true |
| spring.servlet.multipart.max-file-size | SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE | Maximum size permitted for uploaded files | 200MB |
| spring.servlet.multipart.max-request-size | SPRING_SERVLET_MULTIPART_MAX_REQUEST_SIZE | Maximum size allowed for multipart/form-data requests | 215MB |
| spring.servlet.multipart.file-size-threshold | SPRING_SERVLET_MULTIPART_FILE_SIZE_THRESHOLD | Size threshold after which files will be written to disk | 2KB |
| spring.mvc.pathmatch.matching-strategy | SPRING_MVC_PATHMATCH_MATCHING_STRATEGY | Implementation strategy for matching request paths to Controller handlers | ant_path_matcher |
| spring.data.redis.port | SPRING_DATA_REDIS_PORT | Redis server port | 16379 |
| spring.data.redis.host | SPRING_DATA_REDIS_HOST | Redis server host | localhost |
Separate migration and application roles
Editor-service applies the database migrations at startup as the user in SPRING_FLYWAY_USER with SPRING_FLYWAY_PASSWORD, or as the datasource user when these are not set. When editor-service or booking-service connects as another, restricted role, set SPRING_FLYWAY_PLACEHOLDERS_APPROLES on editor-service to that role. When the services use different roles, list them separated by commas, such as editor_app,booking_app.
On every start, editor-service grants each listed role SELECT, INSERT, UPDATE, and DELETE on the tables and views in the schema, and USAGE, SELECT, and UPDATE on its sequences, but no access to the Flyway schema history table. Default privileges give the same access to tables and sequences that later migrations create. Each listed role must exist; otherwise editor-service stops at startup with an error that names the missing role.
Set the variable before upgrading, so that the first start also grants access to the tables of earlier releases. Leave it empty when every service connects as the migration user. Helm and Docker Compose installations connect this way and need no change.
Logging settings
Logging settings to apply to the classes in the pro.seatmap package.
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| logging.level.pro.seatmap | LOGGING_LEVEL_PRO_SEATMAP | Logging level | DEBUG |
Server settings
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| server.compression.min-response-size | SERVER_COMPRESSION_MIN_RESPONSE_SIZE | Minimum size of files to compress | 1024 |
| server.compression.enabled | SERVER_COMPRESSION_ENABLED | Whether to compress data | true |
| server.compression.mime-types | SERVER_COMPRESSION_MIME_TYPES | Mime types to compress | text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json |
| server.servlet.session.timeout | SERVER_SERVLET_SESSION_TIMEOUT | Servlet session lifetime | 2d |
| server.tomcat.max-http-form-post-size | SERVER_TOMCAT_MAX_HTTP_FORM_POST_SIZE | Maximum size of a POST request | 20MB |
Notification settings
Path for Image Ready notifications.
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| notify.path | NOTIFY_PATH | Notification path | /topic/venues/ |
application-seatmap.yaml
In the application-seatmap.yaml file, you can configure the parameters described below.
Security settings
The security block allows you to set the lifetime for the refresh and access tokens as well as to manage the keys.
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| seatmap.security.token.refresh.expire-duration | SEATMAP_SECURITY_TOKEN_REFRESH_EXPIRE_DURATION | Refresh token lifetime. Format: PTnHnMnS, where n is the relevant hours, minutes or seconds |
PT2H (two hours) |
| seatmap.security.token.access.expire-length | SEATMAP_SECURITY_TOKEN_ACCESS_EXPIRE_LENGTH | Access token lifetime in milliseconds | 300000 (five minutes) |
| seatmap.security.rsa.private-key | SEATMAP_SECURITY_RSA_PRIVATE_KEY | Required deployment-specific PKCS#8 RSA private-key PEM, inline or file: path; at least 2048 bits |
Deployment-specific resource |
| seatmap.security.rsa.public-key | SEATMAP_SECURITY_RSA_PUBLIC_KEY | Required deployment-specific SPKI RSA public-key PEM, inline or file: path; at least 2048 bits |
Deployment-specific resource |
| seatmap.security.sso.user-default-password | SEATMAP_SECURITY_SSO_USER_DEFAULT_PASSWORD | Default user password | PASSWORD |
Google API key
An API key is a unique identifier that authenticates requests associated with your project for usage and billing purposes.
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| google.api.key | GOOGLE_API_KEY | API key value | KEY_VALUE |
First run settings
These settings will apply when you run the system for the first time.
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| seatmap.first-run.organization | SEATMAP_FIRST_RUN_ORGANIZATION | Name of the first organization created | seatmap.pro |
| seatmap.first-run.email | SEATMAP_FIRST_RUN_EMAIL | Super admin’s email | admin@seatmap.pro |
| seatmap.first-run.password | SEATMAP_FIRST_RUN_PASSWORD | Super admin’s password | PASSWORD |
Password reset settings
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| seatmap.reset.fromMail | SEATMAP_RESET_FROMMAIL | Email address from which to send a message to the user with a password reset link | Not set |
| seatmap.reset.token.expire-duration | SEATMAP_RESET_TOKEN_EXPIRE_DURATION | Link lifetime. Format: PTnHnMnS, where n is the relevant hours, minutes or seconds |
PT30M (thirty minutes) |
Service settings
The URLs at which the services are located.
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| seatmap.services.booking.url | SEATMAP_SERVICES_BOOKING_URL | Address of the booking service | https://booking.seatmap.pro/ |
| seatmap.services.metrics.url | SEATMAP_SERVICES_METRICS_URL | Address of the service to send service metrics to | https://stat.seatmap.pro/editor-metrics |
| seatmap.services.editor.url | SEATMAP_SERVICES_EDITOR_URL | Address of the editor service | http://localhost:3000/ |
| seatmap.services.core.url | SEATMAP_SERVICES_CORE_URL | Address of the editor core on the frontend runtime. Editor-service signs each call with its private key | http://127.0.0.1:8081/ |
| seatmap.services.preview.url | SEATMAP_SERVICES_PREVIEW_URL | Address for the preview service | http://localhost:5000/ |
| seatmap.services.preview.api-key | SEATMAP_SERVICES_PREVIEW_API_KEY | Shared secret sent to the converter as a bearer token. The Helm chart generates and wires it | (empty) |
| seatmap.services.preview.jobs | SEATMAP_SERVICES_PREVIEW_JOBS | Path under the converter URL polled for a queued conversion | jobs/ |
| seatmap.services.preview.await-timeout | SEATMAP_SERVICES_PREVIEW_AWAIT_TIMEOUT | How long to wait for a queued conversion before reporting it failed | PT5M |
| seatmap.services.preview.poll-interval | SEATMAP_SERVICES_PREVIEW_POLL_INTERVAL | Interval between conversion status polls | PT2S |
Mail settings
Email service parameters for restoring passwords. Set the username and password of your mail server, or leave both empty when the server accepts mail without signing in. The strategy takes SMTPS for implicit TLS, SMTP_TLS for STARTTLS, or SMTP, which sends unencrypted when the server does not offer STARTTLS, so use it only on a trusted network. Left unset, the strategy is SMTPS on port 465 and SMTP_TLS on any other port.
When the host or the sender address (seatmap.reset.fromMail) is empty, or the password is set without a username, the editor logs a warning at startup, and a password reset request answers HTTP 503 without sending email. The password reset page then asks the user to contact their administrator.
| Parameter | Environment variable | Description | Default value |
|---|---|---|---|
| seatmap.mail.username | SEATMAP_MAIL_USERNAME | Username | Not set |
| seatmap.mail.password | SEATMAP_MAIL_PASSWORD | Password | Not set |
| seatmap.mail.host | SEATMAP_MAIL_HOST | Host | Not set |
| seatmap.mail.port | SEATMAP_MAIL_PORT | Port | 587 |
| seatmap.mail.strategy | SEATMAP_MAIL_STRATEGY | Connection security | Chosen by port |