Skip to content

Configuration

All backend configuration lives in application.yml. Values can be overridden with environment variables using Spring Boot's relaxed binding (e.g., app.jwt.access-token-expiration becomes APP_JWT_ACCESS_TOKEN_EXPIRATION).

Server

yaml
server:
  port: 8090
  compression:
    enabled: true

Database

PostgreSQL connection via JDBC with HikariCP connection pooling.

yaml
spring:
  datasource:
    url: jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${POSTGRES_DB:opsdashboard}
    username: ${POSTGRES_USER:opsatlas}
    password: ${POSTGRES_PASSWORD}
    hikari:
      maximum-pool-size: 10
      minimum-idle: 2
      idle-timeout: 30000

TIP

For production workloads with many environments, increase maximum-pool-size to 15-20. Each environment connection uses a pool connection during monitoring refreshes.

JPA / Hibernate

yaml
spring:
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        jdbc:
          batch_size: 20

Schema changes are applied automatically on startup via ddl-auto: update. Batch size of 20 optimizes bulk inserts for audit log entries and metrics.

App Settings

JWT Tokens

yaml
app:
  jwt:
    secret: ${JWT_SECRET}
    access-token-expiration: 3600       # 1 hour
    refresh-token-expiration: 604800    # 7 days

License

yaml
app:
  license:
    editions:
      - community
      - pro
      - enterprise

The active edition is determined by the license key entered during setup. Without a key, Community edition is active.

Environments

Define your target environments. Each environment has one or more Docker hosts.

yaml
app:
  environments:
    - code: qa
      name: QA
      hosts:
        - qa-docker-01.internal
        - qa-docker-02.internal
      dockerPort: 2375
      sshUser: deploy
      composeDir: /opt/docker
    - code: stage
      name: Stage
      hosts:
        - stage-docker-01.internal
      dockerPort: 2375
      sshUser: deploy
      composeDir: /opt/docker
    - code: prod
      name: Production
      hosts:
        - prod-docker-01.internal
        - prod-docker-02.internal
      dockerPort: 2375
      sshUser: deploy
      composeDir: /opt/docker
FieldDefaultDescription
code--Short identifier (used in API paths and URLs)
name--Display name in the UI
hosts--Array of Docker host addresses
dockerPort2375Docker API port on each host
sshUser--SSH user for remote operations
composeDir--Directory containing docker-compose files on the host

WARNING

Port 2375 is the unencrypted Docker API. For production, consider using TLS on port 2376 or restricting access via firewall rules to only the Ops Atlas backend.

Container Discovery

Controls how the dashboard discovers and classifies containers.

yaml
app:
  discovery:
    auto-detect-enabled: true
    excluded-containers:
      - portainer
      - watchtower
      - traefik
      - nginx-proxy
      - letsencrypt
      - certbot
      - consul
      - vault
      - prometheus
      - grafana
      - loki
      - promtail
      - node-exporter
      - cadvisor
      - alertmanager
      - fluentd
      - logstash
      - filebeat
      - telegraf
      - influxdb
      - datadog
      - newrelic
      - redis-exporter
      - postgres-exporter
      - mysql-exporter
      - blackbox-exporter
      - pushgateway
      - jaeger
      - zipkin
      - otel-collector
      - tempo
      - mimir
      - thanos
      - cortex
      - victoria-metrics
      - seq
      - graylog
      - elasticsearch
      - kibana
      - apm-server
      - metricbeat
      - heartbeat
      # ... additional patterns
    health-endpoints:
      - /actuator/health
      - /health
      - /healthz
      - /api/health
      - /status
    port-detection-env-vars:
      - SERVER_PORT
      - PORT
      - APP_PORT

excluded-containers uses substring matching — any container whose name contains one of these strings is hidden from the dashboard. This keeps infrastructure containers out of the application view.

Monitoring

yaml
app:
  monitoring:
    refresh-interval: 30000      # 30 seconds
    connect-timeout: 5000        # 5 seconds
    read-timeout: 10000          # 10 seconds

The dashboard polls each environment at the refresh-interval. Lower values give faster updates but increase load on Docker hosts. For environments with 50+ containers, consider increasing to 60 seconds.

CORS

yaml
app:
  cors:
    allowed-origins:
      - http://localhost:3000
      - https://ops.yourcompany.com

Add every origin that will access the backend. In production this should be your actual domain, not localhost.

Docker Registry

yaml
app:
  registry:
    url: ${REGISTRY_URL:https://registry.hub.docker.com}
    username: ${REGISTRY_USERNAME:}
    password: ${REGISTRY_PASSWORD:}

Used for browsing images and tags, and for pulling images during deployments. Supports Docker Hub, GitLab Container Registry, AWS ECR, and any Docker Registry HTTP API V2 compatible registry.

Deployment

yaml
app:
  deployment:
    compose-file-pattern: "docker-compose.{service}.yml"
    env-file-pattern: ".env.{env}"
    health-check-timeout: 60000   # 60 seconds
SettingDescription
compose-file-patternNaming convention for per-service compose files on the host. {service} is replaced with the service name.
env-file-patternNaming convention for per-environment env files. {env} is replaced with the environment code.
health-check-timeoutHow long to wait for a container to pass health checks after deploy before marking it as failed.

Eureka

Per-environment Eureka service discovery configuration.

yaml
app:
  eureka:
    environments:
      qa:
        url: http://eureka-qa.internal:8761/eureka
        username: admin
        password: ${EUREKA_QA_PASSWORD}
        enabled: true
      stage:
        url: http://eureka-stage.internal:8761/eureka
        username: admin
        password: ${EUREKA_STAGE_PASSWORD}
        enabled: true
      prod:
        url: http://eureka-prod.internal:8761/eureka
        username: admin
        password: ${EUREKA_PROD_PASSWORD}
        enabled: true

Set enabled: false to disable Eureka for a specific environment.

Redis

Per-environment Redis configuration for the Redis management feature.

yaml
app:
  redis:
    environments:
      qa:
        host: redis-qa.internal
        port: 6379
        password: ${REDIS_QA_PASSWORD}
        database: 0
        timeout: 5000
      stage:
        host: redis-stage.internal
        port: 6379
        password: ${REDIS_STAGE_PASSWORD}
        database: 0
        timeout: 5000
      prod:
        host: redis-prod.internal
        port: 6379
        password: ${REDIS_PROD_PASSWORD}
        database: 0
        timeout: 5000

Redis is optional. If not configured for an environment, the Redis management tab will not appear for that environment.

Released under the MIT License.