feat: Maven multimodule scaffolding for Ordinis MDM service

- 10 модулей (domain, validation, events-api, outbox, rest-api, app, read-api, projection-writer, cuod-bundle, migrations)
- Parent pom + BOM с Spring Boot 3.4.2, Spring Cloud 2024.0.0, Vault Config 4.2.0
- ordinis-app: Spring Boot main с Actuator/Prometheus/Logstash JSON encoder/OpenTelemetry/Cloud Config/Vault skeleton
- ordinis-migrations: Liquibase changelogs (dictionary_definitions/records, audit_log, outbox_events, idempotency_keys, EXCLUSION CONSTRAINT через btree_gist)
- Multi-stage Dockerfiles для app и migrations
This commit is contained in:
Zimin A.N.
2026-05-03 00:41:53 +03:00
commit a28fd0b352
26 changed files with 1130 additions and 0 deletions
@@ -0,0 +1,14 @@
package cloud.nstart.terravault.ordinis.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(scanBasePackages = "cloud.nstart.terravault.ordinis")
@EnableScheduling
public class OrdinisApplication {
public static void main(String[] args) {
SpringApplication.run(OrdinisApplication.class, args);
}
}
@@ -0,0 +1,26 @@
package cloud.nstart.terravault.ordinis.app.web;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class HealthController {
@Value("${spring.application.name:ordinis-app}")
private String appName;
@Value("${ENVIRONMENT:dev}")
private String environment;
@GetMapping("/")
public Map<String, String> root() {
return Map.of(
"service", appName,
"environment", environment,
"status", "ok"
);
}
}
@@ -0,0 +1,70 @@
spring:
application:
name: ordinis-app
config:
import:
- "optional:configserver:${SPRING_CLOUD_CONFIG_URI:http://localhost:8888}"
- "optional:vault://"
cloud:
vault:
enabled: ${VAULT_ENABLED:false}
uri: ${VAULT_URI:http://vault.config:8200}
authentication: KUBERNETES
kubernetes:
role: ordinis-app
service-account-token-file: /var/run/secrets/kubernetes.io/serviceaccount/token
kv:
enabled: true
backend: secret
application-name: ordinis/cuod
config:
enabled: ${CONFIG_SERVER_ENABLED:false}
server:
port: 8080
shutdown: graceful
management:
endpoints:
web:
exposure:
include: health,info,prometheus,refresh,metrics,env
base-path: /actuator
endpoint:
health:
probes:
enabled: true
show-details: when-authorized
group:
liveness:
include: livenessState
readiness:
include: readinessState,db,kafka
prometheus:
metrics:
export:
enabled: true
metrics:
tags:
application: ${spring.application.name}
environment: ${ENVIRONMENT:dev}
# Defaults; реальные значения подъедутся из Spring Cloud Config + Vault
otel:
exporter:
otlp:
endpoint: ${OTEL_EXPORTER_OTLP_ENDPOINT:http://tempo.monitoring:4317}
protocol: grpc
resource:
attributes:
service.name: ${spring.application.name}
service.namespace: ordinis
deployment.environment: ${ENVIRONMENT:dev}
traces:
sampler: parentbased_traceidratio
sampler.arg: ${ORDINIS_TRACING_SAMPLING:0.1}
logging:
level:
root: INFO
cloud.nstart.terravault.ordinis: DEBUG
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty scope="context" name="appName" source="spring.application.name" defaultValue="ordinis-app"/>
<springProperty scope="context" name="environment" source="ENVIRONMENT" defaultValue="dev"/>
<appender name="STDOUT_JSON" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeMdcKeyName>trace_id</includeMdcKeyName>
<includeMdcKeyName>span_id</includeMdcKeyName>
<includeMdcKeyName>scope</includeMdcKeyName>
<includeMdcKeyName>dictionary</includeMdcKeyName>
<includeMdcKeyName>request_id</includeMdcKeyName>
<includeMdcKeyName>user_id</includeMdcKeyName>
<customFields>{"service":"${appName}","environment":"${environment}"}</customFields>
</encoder>
</appender>
<appender name="STDOUT_HUMAN" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- DEV: human-readable; PROD/STAGING: JSON для Loki -->
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="STDOUT_HUMAN"/>
</root>
<logger name="cloud.nstart.terravault.ordinis" level="DEBUG"/>
</springProfile>
<springProfile name="!dev">
<root level="INFO">
<appender-ref ref="STDOUT_JSON"/>
</root>
<logger name="cloud.nstart.terravault.ordinis" level="DEBUG"/>
</springProfile>
</configuration>