spring: application: name: Familienarchiv datasource: url: ${SPRING_DATASOURCE_URL} username: ${SPRING_DATASOURCE_USERNAME} password: ${SPRING_DATASOURCE_PASSWORD} driver-class-name: org.postgresql.Driver flyway: enabled: false # Managed explicitly via FlywayConfig bean jpa: open-in-view: false # Prevents holding DB connections for the full HTTP request lifecycle hibernate: ddl-auto: none properties: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect show-sql: false servlet: multipart: max-file-size: 50MB max-request-size: 500MB # supports 10-file chunk at max per-file size; see #317 file-size-threshold: 2KB mail: host: ${MAIL_HOST:} port: ${MAIL_PORT:587} username: ${MAIL_USERNAME:} password: ${MAIL_PASSWORD:} properties: mail: smtp: auth: true starttls: enable: true server: # Behind Caddy/reverse proxy: trust X-Forwarded-{Proto,For,Host} so that # request.getScheme(), redirect URLs, and Spring Session "Secure" cookies # reflect the original https client request, not the http hop from Caddy. forward-headers-strategy: native management: server: # Management port is separate from the app port so that: # (a) Caddy never proxies /actuator/* (it only routes :8080 โ†’ the app port) # (b) Prometheus scrapes backend:8081 directly inside archiv-net, not via Caddy # (c) Spring Security's session-authenticated filter chain on :8080 never sees actuator requests port: 8081 endpoints: web: exposure: include: health,info,prometheus,metrics endpoint: prometheus: enabled: true health: mail: enabled: false tracing: sampling: probability: 1.0 # 100% in dev; override via MANAGEMENT_TRACING_SAMPLING_PROBABILITY in prod compose # OpenTelemetry trace export โ€” failures are non-fatal (app starts cleanly without Tempo running) # The default http://localhost:4317 ensures CI compatibility when no observability stack is present. otel: service: name: familienarchiv-backend exporter: otlp: endpoint: ${OTEL_EXPORTER_OTLP_ENDPOINT:http://localhost:4317} springdoc: api-docs: enabled: false swagger-ui: enabled: false app: s3: endpoint: ${S3_ENDPOINT} access-key: ${S3_ACCESS_KEY} secret-key: ${S3_SECRET_KEY} bucket: ${S3_BUCKET_NAME} region: ${S3_REGION} base-url: ${APP_BASE_URL:http://localhost:3000} mail: from: ${APP_MAIL_FROM:noreply@familienarchiv.local} admin: # Key must be `email`, not `username` โ€” UserDataInitializer reads # `${app.admin.email:...}`. The env-var name stays APP_ADMIN_USERNAME # to match the existing Gitea secrets and DEPLOYMENT.md ยง3.3. # See #513. email: ${APP_ADMIN_USERNAME:admin@familienarchiv.local} password: ${APP_ADMIN_PASSWORD:admin123} import: col: index: 0 box: 1 folder: 2 sender: 3 receivers: 5 date: 7 location: 9 tags: 10 summary: 11 transcription: 13 ocr: sender-model: activation-threshold: 100 retrain-delta: 50 sentry: dsn: ${SENTRY_DSN:} environment: ${SPRING_PROFILES_ACTIVE:dev} traces-sample-rate: ${SENTRY_TRACES_SAMPLE_RATE:1.0} send-default-pii: false enable-tracing: true ignored-exceptions-for-type: - org.raddatz.familienarchiv.exception.DomainException